diff --git a/.github/actions/restore_or_install_byond/action.yml b/.github/actions/restore_or_install_byond/action.yml index a4b9ce9da6d8b..4b07a612558d4 100644 --- a/.github/actions/restore_or_install_byond/action.yml +++ b/.github/actions/restore_or_install_byond/action.yml @@ -1,4 +1,4 @@ -# This is a reusable workflow to restore BYOND from a cache, or to install it otherwise. +# This action attempts to restore BYOND from a cache, or to install it otherwise. name: Restore or Install BYOND description: Attempts to restore a specified BYOND version from cache; if it can't, it installs it. diff --git a/.github/actions/setup_node/action.yml b/.github/actions/setup_node/action.yml new file mode 100644 index 0000000000000..120dbf4639ba7 --- /dev/null +++ b/.github/actions/setup_node/action.yml @@ -0,0 +1,26 @@ +# This action is a wrapper around `actions/setup-node`, to use the version specified in +# `dependencies.sh`. +name: Setup Node +description: Install Node using the version specified in `dependencies.sh`; additionally, restores the Yarn cache if one exists + +inputs: + restore-yarn-cache: + description: 'If `true`, restores the Yarn cache alongside installing node.' + required: false + type: boolean + default: false + +runs: + using: composite + steps: + - name: Configure Node version + shell: bash + run: | + source dependencies.sh + echo "NODE_VERSION_REQUIRED=$NODE_VERSION_LTS" >> $GITHUB_ENV + - name: Install Node + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION_REQUIRED }} + cache: ${{ fromJSON(inputs.restore-yarn-cache) && 'yarn' || '' }} + cache-dependency-path: ${{ fromJSON(inputs.restore-yarn-cache) && 'tgui/yarn.lock' || '' }} diff --git a/.github/alternate_byond_versions.txt b/.github/alternate_byond_versions.txt index abf48559d8f04..6f646a115f551 100644 --- a/.github/alternate_byond_versions.txt +++ b/.github/alternate_byond_versions.txt @@ -7,6 +7,6 @@ # 500.1337: runtimestation # 516.1638: runtimestation;516 # Lowest supported version -515.1627: runtimestation +515.1642: runtimestation # Beta version 516.1648: runtimestation;516 diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml index 2b643cd4cd35f..655837429b202 100644 --- a/.github/workflows/ci_suite.yml +++ b/.github/workflows/ci_suite.yml @@ -42,20 +42,10 @@ jobs: key: ${{ runner.os }}-spacemandmm-${{ hashFiles('dependencies.sh') }} restore-keys: | ${{ runner.os }}-spacemandmm- - - name: Restore Yarn cache - uses: actions/cache@v4 - with: - path: tgui/.yarn/cache - key: ${{ runner.os }}-yarn-${{ hashFiles('tgui/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - name: Restore Node cache - uses: actions/cache@v4 + - name: Setup Node + uses: ./.github/actions/setup_node with: - path: ~/.nvm - key: ${{ runner.os }}-node-${{ hashFiles('dependencies.sh') }} - restore-keys: | - ${{ runner.os }}-node- + restore-yarn-cache: true - name: Restore Bootstrap cache uses: actions/cache@v4 with: @@ -89,7 +79,6 @@ jobs: - name: Install Tools run: | pip3 install setuptools - bash tools/ci/install_node.sh bash tools/ci/install_spaceman_dmm.sh dreamchecker bash tools/ci/install_ripgrep.sh tools/bootstrap/python -c '' @@ -150,6 +139,8 @@ jobs: steps: - uses: actions/checkout@v4 + - name: Setup Node + uses: ./.github/actions/setup_node - name: Restore BYOND from Cache uses: ./.github/actions/restore_or_install_byond - name: Compile All Maps @@ -198,31 +189,20 @@ jobs: name: Integration Tests needs: collect_data - strategy: - fail-fast: false - matrix: - map: ${{ fromJSON(needs.collect_data.outputs.maps).paths }} - - uses: ./.github/workflows/run_integration_tests.yml + uses: ./.github/workflows/perform_regular_version_tests.yml with: - map: ${{ matrix.map }} + maps: ${{ needs.collect_data.outputs.maps }} max_required_byond_client: ${{needs.collect_data.outputs.max_required_byond_client}} run_alternate_tests: if: needs.collect_data.outputs.alternate_tests != '[]' name: Alternate Tests needs: collect_data - strategy: - fail-fast: false - matrix: - setup: ${{ fromJSON(needs.collect_data.outputs.alternate_tests) }} - uses: ./.github/workflows/run_integration_tests.yml + uses: ./.github/workflows/perform_alternate_version_tests.yml with: - map: ${{ matrix.setup.map }} - major: ${{ matrix.setup.major }} - minor: ${{ matrix.setup.minor }} - max_required_byond_client: ${{ matrix.setup.max_client_version || needs.collect_data.outputs.max_required_byond_client }} + alternate_tests: ${{ needs.collect_data.outputs.alternate_tests }} + default_max_required_byond_client: ${{ needs.collect_data.outputs.max_required_byond_client }} compare_screenshots: if: needs.collect_data.outputs.alternate_tests == '[]' || needs.run_alternate_tests.result == 'success' @@ -270,13 +250,10 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Restore Yarn cache - uses: actions/cache@v4 + - name: Setup Node + uses: ./.github/actions/setup_node with: - path: tgui/.yarn/cache - key: ${{ runner.os }}-yarn-${{ hashFiles('tgui/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- + restore-yarn-cache: true - name: Compile run: pwsh tools/ci/build.ps1 env: diff --git a/.github/workflows/gbp.yml b/.github/workflows/gbp.yml index 221d0462e257a..face7b8f3d0a6 100644 --- a/.github/workflows/gbp.yml +++ b/.github/workflows/gbp.yml @@ -1,10 +1,34 @@ -name: GBP +name: Label and GBP on: pull_request_target: - types: [closed, opened] + types: [closed, opened, synchronize] jobs: + # labeler must run before gbp because gbp calculates itself based on labels + labeler: + runs-on: ubuntu-latest + if: github.event.action == 'opened' || github.event.action == 'synchronize' + permissions: + pull-requests: write # to apply labels + issues: write # to apply labels + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Run Auto Labeler + uses: actions/github-script@v7 + with: + script: | + const { get_updated_label_set } = await import('${{ github.workspace }}/tools/pull_request_hooks/autoLabel.js'); + const new_labels = await get_updated_label_set({ github, context }); + github.rest.issues.setLabels({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + labels: new_labels, + }); + console.log(`Labels updated: ${new_labels}`); gbp: runs-on: ubuntu-latest + if: github.event.action == 'opened' || github.event.action == 'closed' steps: - name: "Check for ACTION_ENABLER secret and pass true to output if it exists to be checked by later steps" id: value_holder diff --git a/.github/workflows/perform_alternate_version_tests.yml b/.github/workflows/perform_alternate_version_tests.yml new file mode 100644 index 0000000000000..de2abfe3e81eb --- /dev/null +++ b/.github/workflows/perform_alternate_version_tests.yml @@ -0,0 +1,25 @@ +name: Run Alternate BYOND Version Tests +on: + workflow_call: + inputs: + alternate_tests: + required: true + type: string + default_max_required_byond_client: + required: true + type: string + +jobs: + run: + uses: ./.github/workflows/run_integration_tests.yml + + strategy: + fail-fast: false + matrix: + setup: ${{ fromJSON(inputs.alternate_tests) }} + + with: + map: ${{ matrix.setup.map }} + major: ${{ matrix.setup.major }} + minor: ${{ matrix.setup.minor }} + max_required_byond_client: ${{ matrix.setup.max_client_version || inputs.default_max_required_byond_client }} diff --git a/.github/workflows/perform_regular_version_tests.yml b/.github/workflows/perform_regular_version_tests.yml new file mode 100644 index 0000000000000..bc515d8500253 --- /dev/null +++ b/.github/workflows/perform_regular_version_tests.yml @@ -0,0 +1,23 @@ +name: Run Regular BYOND Version Tests +on: + workflow_call: + inputs: + maps: + required: true + type: string + max_required_byond_client: + required: true + type: string + +jobs: + run: + uses: ./.github/workflows/run_integration_tests.yml + + strategy: + fail-fast: false + matrix: + map: ${{ fromJSON(inputs.maps).paths }} + + with: + map: ${{ matrix.map }} + max_required_byond_client: ${{ inputs.max_required_byond_client }} diff --git a/.github/workflows/run_integration_tests.yml b/.github/workflows/run_integration_tests.yml index 73b263914c2ca..c2dcc421a91f9 100644 --- a/.github/workflows/run_integration_tests.yml +++ b/.github/workflows/run_integration_tests.yml @@ -19,6 +19,12 @@ on: jobs: run_integration_tests: + # If `inputs.major` is specified, this will output `Run Tests (major.minor; map; max)`. + # For example, `Run Tests (515.1627; runtimestation; 515)`. + # + # Otherwise, it will output `Run Tests (map; max)`. + # For example, `Run Tests (runtimestation; 515)`. + name: Run Tests (${{ inputs.major && format('{0}.{1}; ', inputs.major, inputs.minor) || '' }}${{ inputs.map }}; ${{ inputs.max_required_byond_client }}) runs-on: ubuntu-latest timeout-minutes: 15 services: @@ -38,6 +44,8 @@ jobs: mysql -u root -proot tg_ci < SQL/tgstation_schema.sql mysql -u root -proot -e 'CREATE DATABASE tg_ci_prefixed;' mysql -u root -proot tg_ci_prefixed < SQL/tgstation_schema_prefixed.sql + - name: Setup Node + uses: ./.github/actions/setup_node - name: Install rust-g run: | bash tools/ci/install_rust_g.sh @@ -55,6 +63,7 @@ jobs: source $HOME/BYOND/byond/bin/byondsetup tools/build/build --ci dm -DCIBUILDING -DANSICOLORS -Werror -ITG0001 -I"loop_checks" - name: Run Tests + id: run_tests run: | source $HOME/BYOND/byond/bin/byondsetup bash tools/ci/run_server.sh ${{ inputs.map }} @@ -65,6 +74,29 @@ jobs: name: test_artifacts_${{ inputs.map }}_${{ inputs.major }}_${{ inputs.minor }} path: data/screenshots_new/ retention-days: 1 + - name: On test fail, write a step summary + if: always() && steps.run_tests.outcome == 'failure' + run: | + # Get a JSON array of failed unit tests + FAILED_UNIT_TESTS=$(jq 'to_entries | map(.value | select(.status == 1))' data/unit_tests.json) + + FAIL_COUNT=$(echo $FAILED_UNIT_TESTS | jq 'length') + + echo "# Test failures" >> $GITHUB_STEP_SUMMARY + echo "$FAIL_COUNT tests failed." >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + for i in $( seq $FAIL_COUNT ); do + CURRENT_FAIL=$(echo $FAILED_UNIT_TESTS | jq --arg i $i '.[($i | tonumber) - 1]') + + TEST=$(echo $CURRENT_FAIL | jq --raw-output '.name') + + echo "### $TEST" >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + echo $CURRENT_FAIL | jq --raw-output '.message' >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + done - name: Check client Compatibility if: always() && steps.compile_tests.outcome == 'success' uses: tgstation/byond-client-compatibility-check@v3 diff --git a/.tgs.yml b/.tgs.yml index dd18c3b8a2577..8aedea02b4e8f 100644 --- a/.tgs.yml +++ b/.tgs.yml @@ -3,7 +3,7 @@ version: 1 # The BYOND version to use (kept in sync with dependencies.sh by the "TGS Test Suite" CI job) # Must be interpreted as a string, keep quoted -byond: "515.1637" +byond: "515.1647" # Folders to create in "/Configuration/GameStaticFiles/" static_files: # Config directory should be static diff --git a/SQL/database_changelog.md b/SQL/database_changelog.md index f8770e2868dbb..373d97bdf6c7b 100644 --- a/SQL/database_changelog.md +++ b/SQL/database_changelog.md @@ -5,15 +5,25 @@ Make sure to also update `DB_MAJOR_VERSION` and `DB_MINOR_VERSION`, which can be The latest database version is 5.28; The query to update the schema revision table is: ```sql -INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 28); +INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 29); ``` or ```sql -INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 28); +INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 29); ``` In any query remember to add a prefix to the table names if you use one. ----------------------------------------------------- +Version 5.29, 4 February 2024, by Tiviplus +Fixed admin rank table flags being capped at 16 in the DB instead of 24 (byond max) + +```sql +ALTER TABLE `admin_ranks` + MODIFY COLUMN `flags` mediumint(5) unsigned NOT NULL, + MODIFY COLUMN `exclude_flags` mediumint(5) unsigned NOT NULL, + MODIFY COLUMN `can_edit_flags` mediumint(5) unsigned NOT NULL; +``` +----------------------------------------------------- Version 5.28, 1 November 2024, by Ghommie Added `fish_progress` as the first 'progress' subtype of 'datum/award/scores' diff --git a/SQL/tgstation_schema.sql b/SQL/tgstation_schema.sql index ba3ff538f1c82..96933aa14e189 100644 --- a/SQL/tgstation_schema.sql +++ b/SQL/tgstation_schema.sql @@ -53,9 +53,9 @@ DROP TABLE IF EXISTS `admin_ranks`; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `admin_ranks` ( `rank` varchar(32) NOT NULL, - `flags` smallint(5) unsigned NOT NULL, - `exclude_flags` smallint(5) unsigned NOT NULL, - `can_edit_flags` smallint(5) unsigned NOT NULL, + `flags` mediumint(5) unsigned NOT NULL, + `exclude_flags` mediumint(5) unsigned NOT NULL, + `can_edit_flags` mediumint(5) unsigned NOT NULL, PRIMARY KEY (`rank`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; diff --git a/SQL/tgstation_schema_prefixed.sql b/SQL/tgstation_schema_prefixed.sql index 525b1b0aa33e6..7b322d5a65275 100644 --- a/SQL/tgstation_schema_prefixed.sql +++ b/SQL/tgstation_schema_prefixed.sql @@ -53,9 +53,9 @@ DROP TABLE IF EXISTS `SS13_admin_ranks`; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `SS13_admin_ranks` ( `rank` varchar(32) NOT NULL, - `flags` smallint(5) unsigned NOT NULL, - `exclude_flags` smallint(5) unsigned NOT NULL, - `can_edit_flags` smallint(5) unsigned NOT NULL, + `flags` mediumint(5) unsigned NOT NULL, + `exclude_flags` mediumint(5) unsigned NOT NULL, + `can_edit_flags` mediumint(5) unsigned NOT NULL, PRIMARY KEY (`rank`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm index 3553672b1080c..24e409e0f7ca1 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm @@ -31,12 +31,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/ruin/comms_agent) -"ce" = ( -/obj/machinery/modular_computer/preset{ - dir = 1 - }, -/turf/open/floor/wood/tile, -/area/ruin/comms_agent) "cI" = ( /obj/structure/water_source/puddle, /obj/item/reagent_containers/cup/glass/waterbottle/large/empty{ @@ -163,12 +157,7 @@ /turf/open/misc/asteroid/snow/standard_air, /area/ruin/comms_agent) "kp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/wood/tile, +/turf/open/space/basic, /area/ruin/comms_agent) "kA" = ( /obj/effect/turf_decal/siding/wood, @@ -274,17 +263,6 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"pl" = ( -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, -/obj/machinery/door/airlock/centcom{ - name = "Syndicate Secure Airlock System"; - desc = "Truly, a marvel of modern engineering." - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, -/area/ruin/comms_agent) "pV" = ( /obj/machinery/light/small/directional/south, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -300,29 +278,11 @@ /obj/item/tank/internals/emergency_oxygen, /turf/open/floor/wood/parquet, /area/ruin/comms_agent) -"rh" = ( -/obj/structure/chair/office/tactical{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, -/area/ruin/comms_agent) "rA" = ( /obj/machinery/atmospherics/components/tank/air, /obj/machinery/light/dim/directional/north, /turf/open/floor/plating, /area/ruin/comms_agent/maint) -"rW" = ( -/obj/structure/filingcabinet, -/obj/item/paperwork, -/obj/item/paper/monitorkey, -/obj/item/paper/fluff/ruins/listeningstation/briefing{ - pixel_x = -2 - }, -/turf/open/floor/wood/tile, -/area/ruin/comms_agent) "sc" = ( /obj/effect/decal/cleanable/blood/splatter/over_window{ pixel_y = 32 @@ -334,13 +294,6 @@ /obj/structure/flora/rock/pile/icy/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"sJ" = ( -/obj/structure/sign/poster/contraband/random/directional/west, -/obj/machinery/computer/camera_advanced/syndie{ - dir = 4 - }, -/turf/open/floor/wood/tile, -/area/ruin/comms_agent) "tb" = ( /obj/machinery/power/port_gen/pacman, /obj/structure/cable, @@ -400,20 +353,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/tile, /area/ruin/comms_agent) -"vB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/item/pen/survival{ - pixel_x = 8; - pixel_y = 8 - }, -/obj/machinery/button/door{ - id = "syndie_lpost_icemoon_windows"; - name = "Window Shutters"; - req_access = list("syndicate") - }, -/turf/open/floor/wood/tile, -/area/ruin/comms_agent) "vK" = ( /obj/effect/turf_decal/siding/wideplating/light, /obj/machinery/computer/arcade/orion_trail, @@ -449,21 +388,6 @@ /obj/machinery/hydroponics/soil, /turf/open/misc/asteroid/snow/standard_air, /area/ruin/comms_agent) -"xq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/syndicate/freerange{ - pixel_x = 31 - }, -/obj/structure/table/reinforced, -/obj/machinery/fax{ - syndicate_network = 1; - allow_exotic_faxes = 1; - fax_name = "Listening Post"; - desc = "Bluespace technologies on the application of bureaucracy. This one is send-only"; - pixel_y = 5 - }, -/turf/open/floor/wood/tile, -/area/ruin/comms_agent) "xs" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/table, @@ -491,12 +415,6 @@ /obj/structure/fans/tiny, /turf/open/floor/iron, /area/ruin/comms_agent) -"yG" = ( -/obj/machinery/computer/message_monitor{ - dir = 4 - }, -/turf/open/floor/wood/tile, -/area/ruin/comms_agent) "yR" = ( /obj/structure/table, /obj/item/taperecorder/empty, @@ -537,13 +455,6 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"BQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/chair/office/tactical, -/turf/open/floor/wood/tile, -/area/ruin/comms_agent) "BZ" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/light/directional/north, @@ -954,17 +865,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/ruin/comms_agent) -"Tn" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin/carbon{ - pixel_x = -2; - pixel_y = 5 - }, -/obj/machinery/newscaster/directional/south, -/obj/item/pen/edagger, -/obj/machinery/light/small/directional/south, -/turf/open/floor/wood/tile, -/area/ruin/comms_agent) "Tp" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/cable, @@ -991,14 +891,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/ruin/comms_agent) -"UI" = ( -/obj/structure/table/reinforced, -/obj/item/paper/monitorkey{ - pixel_x = -15; - pixel_y = 7 - }, -/turf/open/floor/wood/tile, -/area/ruin/comms_agent) "Vo" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -1029,15 +921,6 @@ "WR" = ( /turf/closed/wall, /area/ruin/comms_agent) -"WU" = ( -/obj/structure/sign/warning/explosives/alt/directional/north, -/obj/machinery/syndicatebomb/self_destruct{ - anchored = 1 - }, -/obj/machinery/light/small/red/directional/north, -/obj/machinery/door/window/brigdoor/left/directional/south, -/turf/open/floor/circuit/red, -/area/ruin/comms_agent) "Xk" = ( /obj/effect/mapping_helpers/airlock/access/any/syndicate, /obj/machinery/door/airlock/glass, @@ -1047,20 +930,11 @@ /turf/open/floor/plating, /area/ruin/comms_agent) "XU" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "syndie_lpost_icemoon_windows" +/obj/modular_map_root/syndicatebase{ + key = "commsoffice"; + config_file = "strings/modular_maps/syndicatebaseice.toml" }, -/turf/open/floor/plating, -/area/ruin/comms_agent) -"Yz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/wood/tile, +/turf/open/space/basic, /area/ruin/comms_agent) "YA" = ( /turf/open/floor/wood/parquet, @@ -2431,11 +2305,11 @@ QT jB Sc Jh -WR -yG -sJ -Tn -nP +XU +kp +kp +kp +kp MH MH MH @@ -2488,11 +2362,11 @@ kL Sc Tp Gq -pl -HX -rh -UI -XU +kp +kp +kp +kp +kp MH MH MH @@ -2545,11 +2419,11 @@ FZ zi in bt -WR -xq -Yz -ce -XU +kp +kp +kp +kp +kp MH MH sB @@ -2602,11 +2476,11 @@ Qn up in ag -WR -WR -BQ -vB -XU +kp +kp +kp +kp +kp MH MH OM @@ -2659,11 +2533,11 @@ nP dP tu kL -WR -WU kp -rW -XU +kp +kp +kp +kp MH MH OM @@ -2716,11 +2590,11 @@ nP nP nP Xk -WR -WR -WR -nP -nP +kp +kp +kp +kp +kp MH MH OM diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent/commsoffice_cheap.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent/commsoffice_cheap.dmm new file mode 100644 index 0000000000000..c43f60ec550f4 --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent/commsoffice_cheap.dmm @@ -0,0 +1,169 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/filingcabinet, +/obj/item/paper/fluff/ruins/listeningstation/briefing{ + pixel_x = -2 + }, +/obj/item/paper/monitorkey, +/obj/item/paperwork, +/turf/open/floor/plating, +/area/ruin/comms_agent) +"b" = ( +/turf/closed/wall/r_wall, +/area/ruin/comms_agent) +"c" = ( +/turf/closed/wall, +/area/ruin/comms_agent) +"h" = ( +/obj/modular_map_connector, +/turf/closed/wall/rust, +/area/ruin/comms_agent) +"l" = ( +/obj/machinery/computer/camera_advanced/syndie{ + dir = 1 + }, +/obj/item/paper/monitorkey, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/plating, +/area/ruin/comms_agent) +"n" = ( +/obj/structure/chair/office/tactical, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/comms_agent) +"q" = ( +/obj/item/radio/intercom/syndicate/freerange{ + pixel_x = -31 + }, +/obj/machinery/modular_computer/preset{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/comms_agent) +"s" = ( +/turf/closed/wall/rust, +/area/ruin/comms_agent) +"v" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/ruin/comms_agent) +"w" = ( +/obj/item/kirbyplants/random/fullysynthetic, +/turf/open/floor/plating, +/area/ruin/comms_agent) +"y" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/ruin/comms_agent) +"z" = ( +/obj/structure/table, +/obj/machinery/fax{ + syndicate_network = 1; + allow_exotic_faxes = 1; + fax_name = "Listening Post"; + desc = "Bluespace technologies on the application of bureaucracy. This one is send-only"; + pixel_y = 6 + }, +/turf/open/floor/plating, +/area/ruin/comms_agent) +"B" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/door/airlock/centcom{ + name = "Syndicate Secure Airlock System"; + desc = "Truly, a marvel of modern engineering." + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"I" = ( +/obj/structure/closet/crate/secure/syndicate, +/obj/item/storage/backpack/duffelbag/syndie/x4, +/obj/item/storage/backpack/duffelbag/syndie/x4, +/obj/item/assembly/signaler, +/obj/structure/sign/poster/contraband/random/directional/east, +/turf/open/floor/plating, +/area/ruin/comms_agent) +"P" = ( +/obj/effect/spawner/random/trash/moisture_trap, +/turf/open/floor/plating, +/area/ruin/comms_agent) +"Q" = ( +/obj/machinery/computer/message_monitor{ + dir = 1 + }, +/obj/structure/sign/poster/contraband/random/directional/south, +/turf/open/floor/plating, +/area/ruin/comms_agent) +"T" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/light/small/red/directional/east, +/turf/open/floor/plating, +/area/ruin/comms_agent) +"U" = ( +/obj/structure/closet/crate, +/mob/living/basic/cockroach, +/obj/effect/spawner/random/engineering/tool, +/obj/effect/spawner/random/engineering/tool, +/obj/effect/spawner/random/engineering/tool, +/obj/effect/spawner/random/engineering/tool, +/obj/effect/spawner/random/clothing/syndie, +/obj/effect/spawner/random/contraband/armory, +/obj/effect/spawner/random/maintenance/three, +/obj/item/pen, +/obj/item/paper_bin, +/turf/open/floor/plating, +/area/ruin/comms_agent) + +(1,1,1) = {" +h +w +q +P +c +"} +(2,1,1) = {" +B +v +v +Q +s +"} +(3,1,1) = {" +c +a +n +l +s +"} +(4,1,1) = {" +s +s +y +z +c +"} +(5,1,1) = {" +s +I +T +U +s +"} +(6,1,1) = {" +c +s +c +s +b +"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent/commsoffice_luxury.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent/commsoffice_luxury.dmm new file mode 100644 index 0000000000000..a7b2d4dea8be1 --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent/commsoffice_luxury.dmm @@ -0,0 +1,215 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/wall/r_wall, +/area/ruin/comms_agent) +"f" = ( +/obj/machinery/door/window/brigdoor/left/directional/south, +/obj/machinery/syndicatebomb/self_destruct{ + anchored = 1 + }, +/obj/structure/window/reinforced/plasma/spawner/directional/west, +/obj/structure/sign/warning/explosives/alt/directional/north, +/turf/open/floor/mineral/gold, +/area/ruin/comms_agent) +"j" = ( +/obj/machinery/computer/message_monitor{ + dir = 4 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/carpet/donk, +/area/ruin/comms_agent) +"k" = ( +/obj/structure/table/reinforced/plasmarglass, +/obj/machinery/light_switch/directional/south, +/obj/item/paper_bin/carbon{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/item/pen/fountain{ + pixel_y = 6; + pixel_x = -2 + }, +/obj/item/paper{ + pixel_y = 6; + default_raw_text = "Your office has been sponsored by yours truly, Donk Corporation!"; + pixel_x = 15 + }, +/obj/item/paper/monitorkey{ + pixel_y = 1; + pixel_x = 15 + }, +/turf/open/floor/carpet/donk, +/area/ruin/comms_agent) +"m" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/sign/poster/contraband/donk_co/directional/east, +/turf/open/floor/wood/large, +/area/ruin/comms_agent) +"n" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/carpet/donk, +/area/ruin/comms_agent) +"o" = ( +/obj/structure/table/reinforced/plasmarglass, +/obj/machinery/button/door{ + id = "syndie_lpost_icemoon_windows"; + name = "Window Shutters"; + req_access = list("syndicate"); + pixel_y = 9; + pixel_x = -2 + }, +/obj/effect/spawner/random/food_or_drink/donkpockets, +/turf/open/floor/carpet/donk, +/area/ruin/comms_agent) +"r" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/carpet/donk, +/area/ruin/comms_agent) +"u" = ( +/obj/structure/table/reinforced/plasmarglass, +/obj/machinery/fax{ + syndicate_network = 1; + allow_exotic_faxes = 1; + fax_name = "Listening Post"; + desc = "Bluespace technologies on the application of bureaucracy. This one is send-only" + }, +/turf/open/floor/carpet/donk, +/area/ruin/comms_agent) +"v" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/ruin/comms_agent) +"w" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/modular_computer/preset, +/turf/open/floor/wood/large, +/area/ruin/comms_agent) +"x" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/centcom{ + name = "Syndicate Secure Airlock System"; + desc = "Truly, a marvel of modern engineering." + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/structure/cable, +/turf/open/floor/wood/large, +/area/ruin/comms_agent) +"C" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/comfy/shuttle/tactical{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/carpet/donk, +/area/ruin/comms_agent) +"D" = ( +/obj/structure/fireplace, +/obj/structure/railing{ + dir = 1; + pixel_y = -10 + }, +/obj/item/stack/sheet/mineral/wood/fifty, +/turf/open/floor/carpet/donk, +/area/ruin/comms_agent) +"J" = ( +/obj/machinery/computer/camera_advanced/syndie{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_x = 8; + pixel_y = 11 + }, +/obj/item/radio/intercom/syndicate/freerange{ + pixel_x = -31 + }, +/turf/open/floor/carpet/donk, +/area/ruin/comms_agent) +"M" = ( +/obj/structure/filingcabinet, +/obj/item/paperwork, +/obj/item/paper/monitorkey, +/obj/item/paper/fluff/ruins/listeningstation/briefing{ + pixel_x = -2 + }, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"N" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/wood/large, +/area/ruin/comms_agent) +"W" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "syndie_lpost_icemoon_windows" + }, +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/floor/plating, +/area/ruin/comms_agent) +"X" = ( +/obj/modular_map_connector, +/turf/closed/wall/r_wall, +/area/ruin/comms_agent) + +(1,1,1) = {" +X +j +J +k +a +"} +(2,1,1) = {" +x +n +C +o +W +"} +(3,1,1) = {" +a +D +r +u +W +"} +(4,1,1) = {" +a +w +N +v +W +"} +(5,1,1) = {" +a +f +m +M +W +"} +(6,1,1) = {" +a +a +a +a +a +"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent/commsoffice_standard.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent/commsoffice_standard.dmm new file mode 100644 index 0000000000000..b1edb418dfb34 --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent/commsoffice_standard.dmm @@ -0,0 +1,196 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/wall, +/area/ruin/comms_agent) +"b" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/radio/intercom/syndicate/freerange{ + pixel_x = 31 + }, +/obj/structure/table/reinforced, +/obj/machinery/fax{ + syndicate_network = 1; + allow_exotic_faxes = 1; + fax_name = "Listening Post"; + desc = "Bluespace technologies on the application of bureaucracy. This one is send-only"; + pixel_y = 5 + }, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"f" = ( +/obj/machinery/modular_computer/preset{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"g" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin/carbon{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/machinery/newscaster/directional/south, +/obj/item/pen/edagger, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"k" = ( +/obj/modular_map_connector, +/turf/closed/wall, +/area/ruin/comms_agent) +"q" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"u" = ( +/obj/structure/filingcabinet, +/obj/item/paperwork, +/obj/item/paper/monitorkey, +/obj/item/paper/fluff/ruins/listeningstation/briefing{ + pixel_x = -2 + }, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"v" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced, +/obj/item/pen/survival{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/machinery/button/door{ + id = "syndie_lpost_icemoon_windows"; + name = "Window Shutters"; + req_access = list("syndicate") + }, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"w" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"y" = ( +/obj/structure/sign/poster/contraband/random/directional/west, +/obj/machinery/computer/camera_advanced/syndie{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"z" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "syndie_lpost_icemoon_windows" + }, +/turf/open/floor/plating, +/area/ruin/comms_agent) +"C" = ( +/obj/structure/chair/office/tactical{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"G" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/door/airlock/centcom{ + name = "Syndicate Secure Airlock System"; + desc = "Truly, a marvel of modern engineering." + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"J" = ( +/obj/structure/sign/warning/explosives/alt/directional/north, +/obj/machinery/syndicatebomb/self_destruct{ + anchored = 1 + }, +/obj/machinery/light/small/red/directional/north, +/obj/machinery/door/window/brigdoor/left/directional/south, +/turf/open/floor/circuit/red, +/area/ruin/comms_agent) +"L" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"M" = ( +/obj/structure/table/reinforced, +/obj/item/paper/monitorkey{ + pixel_x = -15; + pixel_y = 7 + }, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"Q" = ( +/obj/machinery/computer/message_monitor{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"R" = ( +/turf/closed/wall/r_wall, +/area/ruin/comms_agent) +"X" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/chair/office/tactical, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) + +(1,1,1) = {" +k +Q +y +g +R +"} +(2,1,1) = {" +G +L +C +M +z +"} +(3,1,1) = {" +a +b +q +f +z +"} +(4,1,1) = {" +a +a +X +v +z +"} +(5,1,1) = {" +a +J +w +u +z +"} +(6,1,1) = {" +a +a +a +R +R +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index b73cf11fda63e..6bdb976de4bbc 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -667,6 +667,9 @@ /area/ruin/syndicate_lava_base/chemistry) "fx" = ( /obj/structure/sign/warning/secure_area, +/obj/machinery/porta_turret/syndicate{ + dir = 9 + }, /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/syndicate_lava_base/cargo) "fA" = ( @@ -1593,6 +1596,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/east, /obj/effect/mapping_helpers/airalarm/syndicate_access, +/obj/item/defibrillator/loaded, /turf/open/floor/iron/white/side{ dir = 4 }, @@ -1866,6 +1870,9 @@ /area/ruin/syndicate_lava_base/arrivals) "oF" = ( /obj/structure/sign/warning/secure_area, +/obj/machinery/porta_turret/syndicate{ + dir = 9 + }, /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/syndicate_lava_base/arrivals) "oH" = ( @@ -2163,6 +2170,10 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/cargo) +"sB" = ( +/obj/structure/sign/warning/secure_area, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/syndicate_lava_base/cargo) "sH" = ( /obj/machinery/door/airlock/virology/glass{ name = "Monkey Pen" @@ -3316,7 +3327,6 @@ /obj/structure/table/wood, /obj/item/ammo_box/magazine/m9mm, /obj/machinery/airalarm/directional/north, -/obj/item/crowbar/red, /obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/carpet/red, /area/ruin/syndicate_lava_base/dormitories) @@ -3648,6 +3658,10 @@ }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) +"Oj" = ( +/obj/structure/sign/warning/secure_area, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/syndicate_lava_base/arrivals) "Oq" = ( /obj/effect/spawner/random/vending/colavend{ hacked = 1 @@ -4127,7 +4141,6 @@ /obj/item/ammo_box/magazine/m9mm, /obj/item/ammo_box/magazine/sniper_rounds, /obj/machinery/airalarm/directional/north, -/obj/item/crowbar/red, /obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/carpet/red, /area/ruin/syndicate_lava_base/dormitories) @@ -4506,7 +4519,6 @@ /obj/structure/table/wood, /obj/item/ammo_box/magazine/m9mm, /obj/item/ammo_box/magazine/sniper_rounds, -/obj/item/crowbar/red, /turf/open/floor/carpet/red, /area/ruin/syndicate_lava_base/dormitories) "Zw" = ( @@ -5325,7 +5337,7 @@ Vb mT mT mT -oF +Oj ab ab ab @@ -6648,7 +6660,7 @@ ab ab ab ab -fx +sB gh fx si diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_1.dmm index 92338633ecfb3..8ca5c0cd2b50e 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_1.dmm @@ -135,6 +135,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/telecomms) +"R" = ( +/obj/structure/filingcabinet/medical, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/telecomms) "U" = ( /obj/machinery/light/small/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -216,7 +220,7 @@ f (6,1,1) = {" a e -c +R Z m C diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_3.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_3.dmm index dd00fa974852e..cd6670dfb21f1 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_3.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_3.dmm @@ -41,6 +41,10 @@ /obj/item/paper_bin, /obj/item/pen, /obj/structure/closet/cardboard, +/obj/item/modular_computer/pda/chameleon/broken{ + pixel_x = 5; + pixel_y = 4 + }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/telecomms) "m" = ( @@ -63,7 +67,7 @@ /turf/open/floor/iron, /area/ruin/syndicate_lava_base/telecomms) "q" = ( -/obj/structure/girder, +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /turf/open/floor/plating/lavaland_atmos, /area/ruin/syndicate_lava_base/telecomms) "r" = ( @@ -75,16 +79,12 @@ /area/ruin/syndicate_lava_base/telecomms) "t" = ( /obj/structure/sign/poster/contraband/syndiemoth/directional/west, -/obj/item/radio/intercom{ - freerange = 1; - name = "Syndicate Radio Intercom"; - pixel_y = 5 - }, -/obj/structure/table/reinforced, /obj/effect/decal/cleanable/cobweb, -/obj/item/phone{ - pixel_x = -4; - pixel_y = -4 +/obj/machinery/computer/message_monitor{ + dir = 4 + }, +/obj/item/paper/monitorkey{ + pixel_x = 5 }, /turf/open/floor/iron/grimy, /area/ruin/syndicate_lava_base/telecomms) @@ -99,6 +99,7 @@ /obj/machinery/door/poddoor{ id = "lavalandsyndi_fredrickleft" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/telecomms) "y" = ( @@ -112,16 +113,21 @@ /turf/open/floor/iron/grimy, /area/ruin/syndicate_lava_base/telecomms) "z" = ( -/obj/item/modular_computer/pda/chameleon/broken{ - pixel_x = 5; - pixel_y = 4 - }, /obj/structure/table/reinforced, /obj/item/food/cherrycupcake{ pixel_x = -7; pixel_y = 13 }, +/obj/item/radio/intercom{ + freerange = 1; + name = "Syndicate Radio Intercom"; + pixel_y = 5 + }, /obj/effect/decal/cleanable/dirt, +/obj/item/phone{ + pixel_x = -4; + pixel_y = -4 + }, /turf/open/floor/iron/grimy, /area/ruin/syndicate_lava_base/telecomms) "A" = ( @@ -189,6 +195,7 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/structure/filingcabinet/security, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/telecomms) "K" = ( @@ -199,6 +206,7 @@ "O" = ( /obj/effect/mapping_helpers/airalarm/syndicate_access, /obj/machinery/airalarm/directional/north, +/obj/structure/filingcabinet/medical, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/telecomms) "P" = ( diff --git a/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm b/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm index ccbe450085dc9..b2bdd4cac3b25 100644 --- a/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm +++ b/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm @@ -71,7 +71,7 @@ /turf/open/floor/grass, /area/misc/anomaly_research) "dr" = ( -/obj/effect/spawner/random/environmentally_safe_anomaly, +/obj/effect/spawner/random/environmentally_safe_anomaly/bioscramblerless, /turf/open/lava/plasma/ice_moon, /area/misc/anomaly_research) "ds" = ( @@ -90,7 +90,7 @@ /area/misc/anomaly_research) "dD" = ( /obj/structure/lattice/catwalk, -/obj/effect/spawner/random/environmentally_safe_anomaly, +/obj/effect/spawner/random/environmentally_safe_anomaly/bioscramblerless, /turf/open/lava/plasma/ice_moon, /area/misc/anomaly_research) "eq" = ( @@ -602,7 +602,7 @@ /turf/open/floor/iron/white, /area/misc/anomaly_research) "qM" = ( -/obj/effect/spawner/random/environmentally_safe_anomaly, +/obj/effect/spawner/random/environmentally_safe_anomaly/bioscramblerless, /obj/effect/turf_decal/trimline/purple, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -683,7 +683,7 @@ /area/misc/anomaly_research) "sX" = ( /obj/machinery/light/small/built/directional/north, -/obj/effect/spawner/random/environmentally_safe_anomaly, +/obj/effect/spawner/random/environmentally_safe_anomaly/bioscramblerless, /obj/item/reagent_containers/cup/bottle/wittel, /obj/effect/spawner/random/trash/grime, /obj/effect/decal/cleanable/dirt, @@ -1855,7 +1855,7 @@ /turf/open/misc/asteroid/snow/icemoon, /area/misc/anomaly_research) "ZL" = ( -/obj/effect/spawner/random/environmentally_safe_anomaly, +/obj/effect/spawner/random/environmentally_safe_anomaly/bioscramblerless, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, diff --git a/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm b/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm index c925d017ad3a3..aa130e8ddcd1e 100644 --- a/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm +++ b/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm @@ -1044,8 +1044,8 @@ pixel_x = 28 }, /obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/maint_kit, -/obj/item/storage/toolbox/maint_kit, +/obj/item/gun_maintenance_supplies, +/obj/item/gun_maintenance_supplies, /obj/item/storage/toolbox/electrical, /obj/item/storage/box/lights/bulbs, /obj/item/stack/sheet/glass{ diff --git a/_maps/map_files/Basketball/greytide_worldwide.dmm b/_maps/map_files/Basketball/greytide_worldwide.dmm index 77c5f30af4c78..6711c66743dfe 100644 --- a/_maps/map_files/Basketball/greytide_worldwide.dmm +++ b/_maps/map_files/Basketball/greytide_worldwide.dmm @@ -704,7 +704,7 @@ /obj/effect/turf_decal/box/red/corners{ dir = 1 }, -/mob/living/simple_animal/hostile/retaliate/goose/vomit, +/mob/living/basic/goose/vomit, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/basketball) diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index 758a5c877925e..1940705b466f4 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -533,14 +533,16 @@ "amK" = ( /obj/effect/turf_decal/weather/snow, /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/weather/snow/corner{ dir = 9 }, /obj/structure/cable, /obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/freezer, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/binary/pump/on, +/obj/effect/mapping_helpers/airalarm/tlv_cold_room, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "amX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3895,14 +3897,14 @@ /turf/open/floor/iron/white/small, /area/station/security/warden) "bvP" = ( -/obj/machinery/door/airlock{ - name = "Kitchen" - }, /obj/effect/mapping_helpers/airlock/access/all/service/kitchen, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, +/obj/machinery/door/airlock{ + name = "Maintenance" + }, /turf/open/floor/plating, /area/station/maintenance/central/greater) "bwz" = ( @@ -3949,9 +3951,8 @@ /obj/effect/turf_decal/weather/snow/corner{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/food_cart, -/turf/open/floor/iron/freezer, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "bxI" = ( /obj/structure/cable, @@ -4719,10 +4720,10 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 4 }, -/turf/open/floor/iron/freezer, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "bMt" = ( /obj/structure/cable, @@ -7465,11 +7466,11 @@ id = "kitchenshutters"; name = "Kitchen Shutter Control" }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 +/obj/machinery/smartfridge/drying, +/obj/effect/turf_decal/siding/end{ + dir = 4 }, -/turf/open/floor/iron/kitchen/small, +/turf/open/floor/iron/dark/textured_large, /area/station/service/kitchen) "cMG" = ( /obj/machinery/door/poddoor/incinerator_atmos_aux, @@ -8506,7 +8507,8 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/turf/open/floor/iron/freezer, +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "ddK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9402,9 +9404,8 @@ /turf/open/floor/iron/white, /area/station/science/robotics/augments) "duj" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /turf/open/floor/iron/kitchen/small, /area/station/service/kitchen) "dun" = ( @@ -23047,7 +23048,10 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, -/turf/open/floor/iron/freezer, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "hWU" = ( /obj/machinery/door/airlock{ @@ -26234,7 +26238,10 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/freezer, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "iSb" = ( /obj/structure/frame/computer{ @@ -30565,7 +30572,11 @@ }, /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, -/turf/open/floor/iron/freezer, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "kjO" = ( /obj/machinery/portable_atmospherics/canister/air, @@ -33549,7 +33560,10 @@ /obj/machinery/light/small/directional/north, /obj/machinery/icecream_vat, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/freezer, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "lji" = ( /obj/structure/flora/tree/jungle/style_2, @@ -36987,6 +37001,7 @@ /obj/effect/turf_decal/siding/end{ dir = 8 }, +/obj/effect/mapping_helpers/airalarm/tlv_kitchen, /turf/open/floor/iron/dark/textured_large, /area/station/service/kitchen) "moj" = ( @@ -44319,6 +44334,11 @@ /obj/effect/turf_decal/siding{ dir = 8 }, +/obj/item/book/manual/chef_recipes, +/obj/item/stack/package_wrap{ + pixel_y = 2 + }, +/obj/item/holosign_creator/robot_seat/restaurant, /turf/open/floor/iron/dark/textured_large, /area/station/service/kitchen) "oTN" = ( @@ -46399,6 +46419,9 @@ name = "Freezer" }, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 1 + }, /turf/open/floor/iron/freezer, /area/station/service/kitchen) "pFk" = ( @@ -52236,15 +52259,13 @@ /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) "rxZ" = ( -/obj/item/book/manual/chef_recipes, -/obj/item/stack/package_wrap{ - pixel_y = 2 - }, -/obj/item/holosign_creator/robot_seat/restaurant, /obj/effect/turf_decal/siding{ dir = 9 }, -/obj/structure/table, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, /turf/open/floor/iron/dark/textured_large, /area/station/service/kitchen) "rya" = ( @@ -54932,7 +54953,10 @@ dir = 5 }, /obj/effect/turf_decal/weather/snow, -/turf/open/floor/iron/freezer, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "sta" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -63679,11 +63703,12 @@ /area/station/science/robotics/mechbay) "vfI" = ( /obj/machinery/light_switch/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/turf_decal/siding/end{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/coldroom{ + dir = 8 }, -/obj/effect/turf_decal/siding/end, -/obj/machinery/smartfridge/drying, /turf/open/floor/iron/dark/textured_large, /area/station/service/kitchen) "vfK" = ( @@ -65364,6 +65389,10 @@ }, /turf/open/floor/iron/dark, /area/station/science/xenobiology) +"vCu" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) "vCO" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, @@ -67010,7 +67039,10 @@ /obj/effect/turf_decal/weather/snow/corner{ dir = 6 }, -/turf/open/floor/iron/freezer, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "wbd" = ( /obj/structure/cable, @@ -100294,7 +100326,7 @@ ljg ddF pEU duj -aTg +vCu rxZ fhp oTM diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index c1e1b7aaf486b..afeceb69f4760 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -3158,7 +3158,7 @@ }, /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/delivery, -/turf/open/floor/iron/freezer, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "aMK" = ( /obj/structure/chair/pew/left, @@ -8221,7 +8221,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/iron/freezer, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "bWZ" = ( /obj/effect/landmark/start/hangover, @@ -18636,7 +18636,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/duct, /mob/living/basic/goat/pete, -/turf/open/floor/iron/freezer, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "eFj" = ( /obj/structure/window/reinforced/spawner/directional/west, @@ -23442,7 +23442,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/tlv_cold_room, -/turf/open/floor/iron/freezer, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "fOz" = ( /obj/structure/disposalpipe/segment{ @@ -27339,7 +27339,7 @@ /area/station/science/xenobiology) "gIJ" = ( /obj/machinery/gibber, -/turf/open/floor/iron/dark/textured, +/turf/open/floor/iron/kitchen_coldroom/dark/textured, /area/station/service/kitchen/coldroom) "gIM" = ( /obj/machinery/atmospherics/components/unary/passive_vent{ @@ -27801,7 +27801,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/iron/freezer, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "gPt" = ( /obj/effect/landmark/event_spawn, @@ -30515,7 +30515,7 @@ "hBF" = ( /obj/structure/kitchenspike, /obj/effect/turf_decal/bot/left, -/turf/open/floor/iron/dark, +/turf/open/floor/iron/kitchen_coldroom/dark, /area/station/service/kitchen/coldroom) "hBL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32126,6 +32126,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/west, /obj/machinery/duct, +/obj/effect/mapping_helpers/airalarm/tlv_kitchen, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) "hXx" = ( @@ -32726,7 +32727,7 @@ "idQ" = ( /obj/structure/kitchenspike, /obj/effect/turf_decal/bot/right, -/turf/open/floor/iron/dark, +/turf/open/floor/iron/kitchen_coldroom/dark, /area/station/service/kitchen/coldroom) "idT" = ( /turf/closed/wall/r_wall, @@ -36288,7 +36289,7 @@ dir = 8 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/mob/living/simple_animal/hostile/retaliate/goose/vomit, +/mob/living/basic/goose/vomit, /turf/open/floor/iron/dark, /area/station/service/abandoned_gambling_den) "jap" = ( @@ -36643,7 +36644,7 @@ dir = 1 }, /obj/effect/turf_decal/siding/white, -/turf/open/floor/iron/freezer, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "jeo" = ( /turf/open/floor/plating, @@ -40161,7 +40162,7 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "jUV" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -56826,7 +56827,7 @@ pixel_x = -3; pixel_y = -3 }, -/turf/open/floor/iron/dark, +/turf/open/floor/iron/kitchen_coldroom/dark, /area/station/service/kitchen/coldroom) "okJ" = ( /obj/effect/turf_decal/bot, @@ -58680,7 +58681,7 @@ dir = 4 }, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/freezer, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "oLV" = ( /obj/effect/landmark/start/hangover, @@ -59332,7 +59333,7 @@ }, /obj/machinery/light/small/directional/east, /obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/freezer, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "oTC" = ( /obj/effect/decal/cleanable/dirt, @@ -71398,7 +71399,7 @@ dir = 4 }, /obj/effect/turf_decal/siding/white/corner, -/turf/open/floor/iron/freezer, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "rQZ" = ( /obj/machinery/modular_computer/preset/id{ @@ -73380,7 +73381,7 @@ /obj/effect/turf_decal/bot, /obj/item/food/meat/slab/monkey, /obj/item/food/meat/slab/monkey, -/turf/open/floor/iron/dark, +/turf/open/floor/iron/kitchen_coldroom/dark, /area/station/service/kitchen/coldroom) "sqT" = ( /obj/structure/cable, @@ -76683,7 +76684,7 @@ dir = 8 }, /obj/effect/landmark/event_spawn, -/turf/open/floor/iron/freezer, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "thB" = ( /obj/structure/window/reinforced/spawner/directional/west, @@ -89432,7 +89433,7 @@ /obj/effect/turf_decal/bot, /obj/structure/closet/secure_closet/freezer/kitchen, /obj/item/reagent_containers/condiment/flour, -/turf/open/floor/iron/dark, +/turf/open/floor/iron/kitchen_coldroom/dark, /area/station/service/kitchen/coldroom) "wqn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -89585,7 +89586,7 @@ "wrP" = ( /obj/structure/reagent_dispensers/cooking_oil, /obj/effect/turf_decal/delivery, -/turf/open/floor/iron/dark, +/turf/open/floor/iron/kitchen_coldroom/dark, /area/station/service/kitchen/coldroom) "wrZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -92228,7 +92229,7 @@ /obj/item/reagent_containers/condiment/milk, /obj/item/reagent_containers/condiment/milk, /obj/item/reagent_containers/condiment/soymilk, -/turf/open/floor/iron/dark, +/turf/open/floor/iron/kitchen_coldroom/dark, /area/station/service/kitchen/coldroom) "xcd" = ( /obj/item/stack/cable_coil, @@ -94250,7 +94251,7 @@ }, /obj/structure/disposalpipe/segment, /obj/machinery/duct, -/turf/open/floor/iron/freezer, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "xAu" = ( /obj/effect/turf_decal/trimline/neutral/warning{ @@ -95267,7 +95268,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/iron/freezer, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "xNv" = ( /obj/item/kirbyplants/random, @@ -95380,7 +95381,7 @@ dir = 10; name = "service camera" }, -/turf/open/floor/iron/freezer, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "xOP" = ( /obj/structure/cable, @@ -96035,7 +96036,7 @@ /obj/machinery/light/small/directional/west, /obj/machinery/firealarm/directional/west, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/freezer, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "xYW" = ( /obj/effect/decal/cleanable/dirt, @@ -96333,7 +96334,7 @@ dir = 8 }, /obj/effect/decal/cleanable/food/flour, -/turf/open/floor/iron/freezer, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "ydp" = ( /obj/structure/table, diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index ecda43c755673..7e0d66282425c 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -833,6 +833,12 @@ /obj/structure/window/reinforced/tinted/spawner/directional/north, /turf/open/floor/plating, /area/station/security/prison/safe) +"anW" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "anZ" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 4 @@ -1156,6 +1162,12 @@ }, /turf/open/floor/iron, /area/station/command/bridge) +"aqH" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "aqQ" = ( /obj/structure/table, /obj/item/stack/package_wrap, @@ -1271,6 +1283,12 @@ /obj/item/storage/crayons, /turf/open/floor/iron, /area/station/commons/dorms) +"asf" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8 + }, +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "asg" = ( /obj/structure/closet, /obj/effect/spawner/random/maintenance/two, @@ -4318,11 +4336,9 @@ name = "The Ice Box"; req_access = list("kitchen") }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, /obj/effect/turf_decal/siding/white, /obj/item/radio/intercom/directional/east, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) "biE" = ( @@ -5195,6 +5211,7 @@ /obj/structure/railing{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) "bts" = ( @@ -5503,6 +5520,12 @@ }, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"bxb" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/underground/unexplored/rivers/deep/shoreline) "bxe" = ( /turf/closed/wall/r_wall, /area/station/maintenance/solars/starboard/fore) @@ -7976,11 +7999,9 @@ /turf/open/floor/iron/dark, /area/station/service/chapel/office) "ceQ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/structure/cable, /obj/structure/minecart_rail/railbreak, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, /turf/open/floor/plating/snowed/coldroom, /area/station/service/kitchen/coldroom) "ceS" = ( @@ -9550,6 +9571,9 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) +"cBY" = ( +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/unexplored/rivers/deep/shoreline) "cCb" = ( /obj/structure/flora/tree/pine/style_random, /turf/open/misc/asteroid/snow/icemoon, @@ -12616,6 +12640,12 @@ /obj/effect/turf_decal/siding/thinplating, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) +"dvk" = ( +/obj/structure/fence/corner{ + dir = 9 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/underground/unexplored/rivers/deep/shoreline) "dvl" = ( /obj/machinery/camera/motion/directional/north{ c_tag = "Armory - External" @@ -13202,6 +13232,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/security/prison/rec) +"dED" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold, +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "dEI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -14813,6 +14850,9 @@ "ees" = ( /obj/structure/kitchenspike, /obj/machinery/status_display/evac/directional/west, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, /turf/open/floor/plating/snowed/coldroom, /area/station/service/kitchen/coldroom) "eeD" = ( @@ -15797,6 +15837,14 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/security/processing) +"esY" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "eta" = ( /obj/machinery/camera/directional/west{ c_tag = "Central Hallway East" @@ -16103,6 +16151,7 @@ dir = 4 }, /obj/effect/spawner/structure/window/reinforced/tinted, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "eyb" = ( @@ -18581,8 +18630,9 @@ /turf/open/floor/circuit/telecomms/mainframe, /area/station/tcommsat/server) "fja" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/light/cold/directional/east, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 }, /turf/open/floor/plating/snowed/coldroom, /area/station/service/kitchen/coldroom) @@ -19116,6 +19166,7 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/starboard/lesser) "frN" = ( @@ -20584,6 +20635,7 @@ dir = 6 }, /obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "fOU" = ( @@ -20685,6 +20737,7 @@ /obj/machinery/camera/directional/south{ c_tag = "Service - Electrical Maintenace Lower" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/starboard/lesser) "fQk" = ( @@ -24539,15 +24592,7 @@ /turf/open/floor/plating, /area/station/maintenance/aft/greater) "gWi" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/freezer{ - desc = "The freezer where the chef keeps all the stuff that needs to be kept cold. Ice cold."; - name = "The Ice Box" - }, -/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, -/turf/open/floor/plating, +/turf/closed/wall, /area/station/service/kitchen/coldroom) "gWn" = ( /obj/machinery/atmospherics/components/trinary/filter/flipped{ @@ -28600,6 +28645,12 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/morgue, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"ieb" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/underground/explored) "iem" = ( /obj/structure/railing{ dir = 8 @@ -29998,15 +30049,15 @@ /turf/open/floor/iron/white, /area/station/maintenance/port/fore) "iBi" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/structure/table, /obj/item/food/grown/carrot, /obj/item/food/grown/carrot{ pixel_x = -2; pixel_y = 4 }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, /turf/open/floor/plating/snowed/coldroom, /area/station/service/kitchen/coldroom) "iBl" = ( @@ -33367,6 +33418,9 @@ /area/station/security/warden) "jBB" = ( /obj/structure/kitchenspike, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 8 + }, /turf/open/floor/plating/snowed/coldroom, /area/station/service/kitchen/coldroom) "jBR" = ( @@ -33480,6 +33534,10 @@ /obj/structure/flora/bush/flowers_br/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) +"jDF" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold, +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "jDG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -34686,14 +34744,14 @@ /turf/open/floor/iron/dark, /area/station/science/server) "jUb" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/structure/table, /obj/item/stack/sheet/mineral/coal{ pixel_x = 6; pixel_y = 3 }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, /turf/open/floor/plating/snowed/coldroom, /area/station/service/kitchen/coldroom) "jUi" = ( @@ -38588,7 +38646,7 @@ /area/mine/laborcamp) "kYF" = ( /obj/structure/light_construct/directional/west, -/mob/living/simple_animal/hostile/retaliate/goose/vomit, +/mob/living/basic/goose/vomit, /turf/open/floor/wood, /area/station/maintenance/port/aft) "kYI" = ( @@ -40173,6 +40231,7 @@ /obj/structure/disposalpipe/trunk/multiz{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "lvG" = ( @@ -41441,6 +41500,9 @@ frequency = 1453; name = "Kitchen Intercom" }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, /turf/open/floor/plating/snowed/coldroom, /area/station/service/kitchen/coldroom) "lOI" = ( @@ -42363,6 +42425,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth_large, /area/station/command/heads_quarters/hos) +"mcI" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/openspace/icemoon, +/area/icemoon/underground/explored) "mcW" = ( /turf/open/floor/iron/white, /area/station/medical/medbay/central) @@ -48930,10 +48999,10 @@ /turf/open/floor/iron/white, /area/station/science/robotics/lab) "nVJ" = ( +/obj/structure/cable, /obj/structure/disposalpipe/segment{ - dir = 4 + dir = 10 }, -/obj/structure/cable, /turf/open/floor/plating/snowed/coldroom, /area/station/service/kitchen/coldroom) "nVR" = ( @@ -49972,6 +50041,7 @@ dir = 4 }, /obj/effect/spawner/random/engineering/flashlight, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/lesser) "olV" = ( @@ -52511,6 +52581,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/starboard/lesser) "oTA" = ( @@ -53411,6 +53482,15 @@ /obj/effect/decal/cleanable/blood/splatter, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"pgR" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 8 + }, +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "pgY" = ( /obj/machinery/cryo_cell, /obj/effect/turf_decal/stripes/line{ @@ -54142,7 +54222,12 @@ /turf/open/floor/plating, /area/station/science/xenobiology) "prX" = ( -/obj/machinery/light/cold/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/valve/on{ + dir = 4 + }, /turf/open/floor/plating/snowed/coldroom, /area/station/service/kitchen/coldroom) "psb" = ( @@ -56227,9 +56312,8 @@ /turf/open/genturf, /area/icemoon/surface/outdoors/unexplored/rivers/no_monsters) "pWE" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "pWJ" = ( @@ -59166,6 +59250,12 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/plating, /area/station/engineering/storage_shared) +"qNe" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/underground/explored) "qNf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -60346,6 +60436,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/gateway) +"rcR" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/floor/plating/snowed/coldroom, +/area/station/service/kitchen/coldroom) "rcS" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 9 @@ -60371,6 +60470,13 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/captain) +"rdg" = ( +/obj/structure/fence/corner{ + dir = 5 + }, +/obj/structure/sign/warning/secure_area, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/underground/explored) "rdn" = ( /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, @@ -63028,6 +63134,12 @@ /obj/structure/minecart_rail{ dir = 1 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, /turf/open/floor/plating/snowed/coldroom, /area/station/service/kitchen/coldroom) "rSe" = ( @@ -63861,9 +63973,6 @@ /turf/open/floor/wood, /area/station/security/prison/rec) "sdF" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/structure/table, /obj/item/grown/log/tree, /obj/item/grown/log/tree{ @@ -64536,6 +64645,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"snJ" = ( +/obj/structure/fence/corner{ + dir = 2 + }, +/obj/structure/sign/warning/secure_area, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/underground/unexplored/rivers/deep/shoreline) "snL" = ( /obj/item/pickaxe{ desc = "Someone left their pickaxe out here, must not have known about the boulder processing machines inside."; @@ -67440,6 +67556,9 @@ /obj/structure/railing{ dir = 1 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) "tei" = ( @@ -68152,6 +68271,18 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/fore) +"tnR" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/freezer{ + desc = "The freezer where the chef keeps all the stuff that needs to be kept cold. Ice cold."; + name = "The Ice Box" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "tnY" = ( /obj/structure/sign/nanotrasen{ pixel_x = -32 @@ -74418,6 +74549,7 @@ /obj/machinery/processor{ pixel_y = 6 }, +/obj/effect/mapping_helpers/airalarm/tlv_kitchen, /turf/open/floor/iron/white/smooth_large, /area/station/service/kitchen) "vjJ" = ( @@ -77054,6 +77186,12 @@ }, /turf/open/floor/iron/large, /area/station/engineering/lobby) +"vYU" = ( +/obj/structure/fence{ + dir = 4 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/underground/unexplored/rivers/deep/shoreline) "vZa" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -78322,6 +78460,10 @@ }, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden) +"wtv" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/underground/explored) "wtM" = ( /obj/machinery/door/airlock/external{ dir = 4; @@ -80515,6 +80657,15 @@ /obj/item/toy/figure/botanist, /turf/open/floor/iron/dark, /area/station/service/hydroponics) +"wZZ" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "xad" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle, /obj/structure/cable, @@ -83396,6 +83547,9 @@ /area/mine/mechbay) "xOc" = ( /obj/machinery/light/cold/directional/west, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, /turf/open/floor/plating/snowed/coldroom, /area/station/service/kitchen/coldroom) "xOk" = ( @@ -84135,6 +84289,7 @@ /area/icemoon/surface/outdoors/nospawn) "xZv" = ( /obj/machinery/status_display/ai/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply, /turf/open/floor/plating/snowed/coldroom, /area/station/service/kitchen/coldroom) "xZy" = ( @@ -84265,6 +84420,12 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/showroomfloor, /area/station/security/prison/mess) +"yba" = ( +/obj/structure/fence/corner{ + dir = 2 + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/underground/unexplored/rivers/deep/shoreline) "ybb" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -104068,7 +104229,7 @@ thA iDt psb rxz -gFX +wDU wDU aNw qmt @@ -186552,7 +186713,7 @@ iDt iDt ppY iDt -gFX +btU btU vfZ btU @@ -189107,9 +189268,9 @@ tVF kUo iKd ees -mQk +jDF sdF -mQk +rcR fwB fwB fwB @@ -189364,9 +189525,9 @@ sRz tec vcD jBB -mQk +anW jUb -mQk +dED mQk fwB nNg @@ -189620,10 +189781,10 @@ jre tAT btq nRn -mQk -mQk +asf +anW iBi -mQk +pgR mbM oje gYq @@ -189878,7 +190039,7 @@ dLA pnw biu xZv -mQk +aqH fja prX eud @@ -190137,7 +190298,7 @@ jre jre jre gWi -jre +tnR jre jre jre @@ -190394,7 +190555,7 @@ wSs oXE fOS pWE -oXE +esY wSs tpc jre @@ -191675,9 +191836,9 @@ xMq jre jre jre +wZZ jre -jre -jre +wZZ jre aZj aCo @@ -191932,9 +192093,9 @@ iDt iDt xMq lvt +mcI lvt -xMq -xMq +mcI jre jre jre @@ -192187,13 +192348,13 @@ scw iDt iDt iDt -rcY +qau lvt +mcI lvt -xMq -thA -thA -thA +bxb +cBY +vYU thA thA thA @@ -192444,13 +192605,13 @@ scw scw iDt cCb -syw -pJm -pJm -pCG -iDt -thA -thA +gsd +xvp +qNe +wtv +ieb +dvk +yba thA thA thA @@ -192702,11 +192863,11 @@ iDt scw iDt iDt -iDt -iDt -iDt -iDt -thA +rdg +pJm +nvB +pJm +snJ thA thA thA @@ -267257,7 +267418,7 @@ ooL ooL ooL ooL -nXb +omh buU omh skW @@ -267514,7 +267675,7 @@ bln bln lSu lSu -nXb +omh omh omh xTy diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index c69694b8f483d..6d5d3a4400498 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -2179,6 +2179,7 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 }, +/obj/effect/mapping_helpers/airalarm/tlv_kitchen, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) "aNQ" = ( @@ -14361,7 +14362,7 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "fgn" = ( -/mob/living/simple_animal/hostile/retaliate/goose/vomit, +/mob/living/basic/goose/vomit, /turf/open/floor/wood, /area/station/maintenance/port/aft) "fgu" = ( @@ -31313,12 +31314,12 @@ /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, -/obj/machinery/door/airlock{ - name = "Kitchen Cold Room" - }, /obj/machinery/duct, /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/obj/machinery/door/airlock/freezer{ + name = "Freezer" + }, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen/coldroom) "lbh" = ( diff --git a/_maps/map_files/NebulaStation/NebulaStation.dmm b/_maps/map_files/NebulaStation/NebulaStation.dmm index a386fe33b1a97..d0497c1988f8e 100644 --- a/_maps/map_files/NebulaStation/NebulaStation.dmm +++ b/_maps/map_files/NebulaStation/NebulaStation.dmm @@ -9598,6 +9598,9 @@ dir = 4 }, /obj/machinery/duct, +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold{ + dir = 1 + }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "byG" = ( @@ -12914,6 +12917,9 @@ dir = 4 }, /obj/machinery/duct, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 8 + }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "bVR" = ( @@ -13265,10 +13271,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/service/kitchen) -"bYy" = ( -/obj/structure/disposalpipe/segment, -/turf/closed/wall, -/area/station/maintenance/fore/greater) "bYA" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 8 @@ -25169,9 +25171,6 @@ /turf/open/floor/iron/dark, /area/station/service/chapel) "dMb" = ( -/obj/machinery/door/airlock{ - name = "Kitchen Cold Room" - }, /obj/effect/mapping_helpers/airlock/access/all/service/kitchen, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25184,6 +25183,9 @@ dir = 4 }, /obj/machinery/duct, +/obj/machinery/door/airlock/freezer{ + name = "Freezer" + }, /turf/open/floor/iron/dark, /area/station/service/kitchen/coldroom) "dMg" = ( @@ -33526,6 +33528,7 @@ /obj/effect/turf_decal/trimline/brown/corner{ dir = 4 }, +/obj/effect/mapping_helpers/airalarm/tlv_kitchen, /turf/open/floor/iron/white/small, /area/station/service/kitchen) "eXC" = ( @@ -41346,8 +41349,10 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, /obj/machinery/duct, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "ggh" = ( @@ -57574,12 +57579,14 @@ /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/service/kitchen, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/machinery/duct, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/station/maintenance/port/fore) "iAX" = ( @@ -69075,14 +69082,14 @@ /turf/open/floor/iron/dark/textured_large, /area/station/cargo/lobby) "kla" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 9 - }, /obj/effect/turf_decal/weather/snow/corner, /obj/effect/turf_decal/weather/snow, /obj/effect/turf_decal/weather/snow/corner{ dir = 1 }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "kle" = ( @@ -105408,6 +105415,9 @@ dir = 4 }, /obj/machinery/duct, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8 + }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "pCo" = ( @@ -108939,6 +108949,10 @@ }, /turf/open/floor/iron/dark/textured, /area/station/commons/fitness/recreation/lasertag) +"qfe" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/station/maintenance/fore/greater) "qfk" = ( /obj/effect/turf_decal/siding{ dir = 10 @@ -141776,6 +141790,9 @@ /obj/structure/railing{ dir = 8 }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "vcM" = ( @@ -264684,7 +264701,7 @@ oDZ aHU rNJ eIp -bYy +qfe cDg vOl dAJ @@ -266232,7 +266249,7 @@ bzt jkE nLg cij -bYy +qfe loK kCi nKp @@ -266489,7 +266506,7 @@ giL pPi qIG jDn -ybp +qfe pKk wtb iWl @@ -266746,7 +266763,7 @@ tNK wNx nJU vBf -bYy +qfe rqn wik jyw diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index a245764783726..fb5deb9e15e91 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -2283,6 +2283,10 @@ /obj/item/disk/tech_disk/debug, /turf/open/floor/iron, /area/station/science) +"OZ" = ( +/obj/item/storage/bag/sheetsnatcher/debug, +/turf/open/floor/iron, +/area/station/science) "Pc" = ( /obj/effect/turf_decal/plaque{ icon_state = "L13" @@ -6441,7 +6445,7 @@ Pv Xp ah NZ -bD +OZ XC co bA diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 22a3adce038d4..ca9cc19b6e31d 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -1314,6 +1314,9 @@ /turf/open/floor/plating/airless, /area/station/asteroid) "aeo" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 1 + }, /turf/open/misc/asteroid/snow/coldroom, /area/station/service/kitchen/coldroom) "aeq" = ( @@ -1321,6 +1324,9 @@ /obj/effect/turf_decal/weather/snow/corner, /obj/effect/turf_decal/weather/snow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, /turf/open/floor/iron/kitchen_coldroom, /area/station/service/kitchen/coldroom) "aer" = ( @@ -1330,6 +1336,9 @@ /obj/effect/turf_decal/weather/snow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, /turf/open/floor/iron/kitchen_coldroom, /area/station/service/kitchen/coldroom) "aes" = ( @@ -1395,6 +1404,14 @@ "aeF" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, +/obj/effect/spawner/random/structure{ + name = "random snowman spawner"; + loot = list(/obj/structure/statue/snow/snowman); + spawn_loot_chance = 10 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, /turf/open/misc/asteroid/snow/coldroom, /area/station/service/kitchen/coldroom) "aeG" = ( @@ -1435,13 +1452,13 @@ /turf/open/floor/plating/airless, /area/station/asteroid) "aeN" = ( -/obj/machinery/door/airlock{ - name = "Kitchen Access" - }, /obj/effect/mapping_helpers/airlock/access/all/service/kitchen, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/freezer{ + name = "Freezer" + }, /turf/open/floor/catwalk_floor, /area/station/service/kitchen/coldroom) "aeO" = ( @@ -2931,7 +2948,9 @@ /obj/effect/turf_decal/weather/snow/corner{ dir = 4 }, -/obj/structure/kitchenspike, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/coldroom{ + dir = 4 + }, /turf/open/floor/iron/kitchen_coldroom, /area/station/service/kitchen/coldroom) "apr" = ( @@ -2940,6 +2959,12 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"apA" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/misc/asteroid/snow/coldroom, +/area/station/service/kitchen/coldroom) "apC" = ( /turf/closed/wall, /area/station/maintenance/department/crew_quarters/dorms) @@ -6514,12 +6539,10 @@ /turf/open/floor/iron/white, /area/station/security/medical) "bje" = ( -/obj/effect/spawner/random/structure{ - name = "random snowman spawner"; - loot = list(/obj/structure/statue/snow/snowman); - spawn_loot_chance = 10 - }, /obj/machinery/light_switch/directional/south, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8 + }, /turf/open/misc/asteroid/snow/coldroom, /area/station/service/kitchen/coldroom) "bjK" = ( @@ -6938,6 +6961,7 @@ "btg" = ( /obj/effect/mapping_helpers/airalarm/tlv_cold_room, /obj/machinery/airalarm/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /turf/open/misc/asteroid/snow/coldroom, /area/station/service/kitchen/coldroom) "btC" = ( @@ -8942,6 +8966,9 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, /turf/open/floor/iron/kitchen_coldroom, /area/station/service/kitchen/coldroom) "caN" = ( @@ -10558,6 +10585,9 @@ /obj/effect/turf_decal/weather/snow, /obj/effect/turf_decal/weather/snow/corner, /obj/machinery/icecream_vat, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, /turf/open/floor/iron/kitchen_coldroom, /area/station/service/kitchen/coldroom) "cDK" = ( @@ -11386,6 +11416,9 @@ /obj/machinery/camera/directional/north{ c_tag = "Civilian - Kitchen Freezer" }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, /turf/open/floor/iron/kitchen_coldroom, /area/station/service/kitchen/coldroom) "cRf" = ( @@ -11635,6 +11668,9 @@ /obj/effect/turf_decal/weather/snow/corner{ dir = 8 }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, /turf/open/floor/iron/kitchen_coldroom, /area/station/service/kitchen/coldroom) "cVw" = ( @@ -17591,6 +17627,9 @@ /obj/effect/turf_decal/weather/snow/corner, /obj/item/radio/intercom/directional/north, /obj/machinery/food_cart, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, /turf/open/floor/iron/kitchen_coldroom, /area/station/service/kitchen/coldroom) "fhc" = ( @@ -21140,6 +21179,9 @@ "gvC" = ( /obj/structure/closet/secure_closet/freezer/meat, /obj/effect/turf_decal/weather/snow, +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold{ + dir = 1 + }, /turf/open/floor/iron/kitchen_coldroom, /area/station/service/kitchen/coldroom) "gvI" = ( @@ -43818,6 +43860,7 @@ /obj/effect/turf_decal/weather/snow/corner{ dir = 8 }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, /turf/open/floor/iron/kitchen_coldroom, /area/station/service/kitchen/coldroom) "owm" = ( @@ -61540,6 +61583,7 @@ /obj/structure/closet/secure_closet/freezer/fridge, /obj/effect/turf_decal/bot_white, /obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/tlv_kitchen, /turf/open/floor/iron/white/side, /area/station/service/kitchen) "uEE" = ( @@ -64912,9 +64956,12 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/central) "vLB" = ( -/obj/structure/reagent_dispensers/cooking_oil, /obj/effect/turf_decal/weather/snow, /obj/machinery/light/cold/directional/north, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/structure/reagent_dispensers/cooking_oil, /turf/open/floor/iron/kitchen_coldroom, /area/station/service/kitchen/coldroom) "vLL" = ( @@ -67877,6 +67924,9 @@ "wQr" = ( /obj/effect/turf_decal/weather/snow, /obj/machinery/vending/wardrobe/chef_wardrobe, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, /turf/open/floor/iron/kitchen_coldroom, /area/station/service/kitchen/coldroom) "wQN" = ( @@ -69768,6 +69818,9 @@ "xCR" = ( /obj/structure/ladder, /obj/structure/extinguisher_cabinet/directional/south, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ + dir = 4 + }, /turf/open/misc/asteroid/snow/coldroom, /area/station/service/kitchen/coldroom) "xDJ" = ( @@ -104061,7 +104114,7 @@ voF jFC nUP cDD -aeo +apA aeF iRL quF diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index 64cad41bbebb1..a6812f5a3a0b8 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -1633,6 +1633,9 @@ "aAg" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 8 + }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "aAk" = ( @@ -2137,6 +2140,9 @@ "aJv" = ( /obj/structure/reagent_dispensers/cooking_oil, /obj/machinery/camera/autoname/directional/south, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "aJz" = ( @@ -4187,6 +4193,9 @@ /area/station/command/bridge) "byb" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold{ + dir = 1 + }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "byf" = ( @@ -8231,6 +8240,7 @@ /obj/machinery/airalarm/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airalarm/tlv_kitchen, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) "cXP" = ( @@ -8285,6 +8295,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /mob/living/basic/goat/pete, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "cYP" = ( @@ -10063,6 +10076,9 @@ /area/station/engineering/main) "dCh" = ( /obj/machinery/gibber, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "dCi" = ( @@ -11612,9 +11628,13 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "edv" = ( -/obj/machinery/computer/order_console/cook, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8 + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "edH" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 @@ -15588,6 +15608,14 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/primary/central) +"fBA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold{ + dir = 8 + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "fBD" = ( /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, @@ -37663,7 +37691,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "nlI" = ( @@ -39018,7 +39048,7 @@ "nMj" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/mapping_helpers/broken_floor, -/mob/living/simple_animal/hostile/retaliate/goose/vomit, +/mob/living/basic/goose/vomit, /turf/open/floor/plating, /area/station/maintenance/central/greater) "nMk" = ( @@ -40526,9 +40556,9 @@ /area/station/science/explab) "otA" = ( /obj/structure/cable/multilayer/multiz, -/obj/item/assembly/mousetrap/armed, -/obj/machinery/light/directional/north, -/turf/open/floor/plating, +/obj/machinery/computer/order_console/cook, +/obj/effect/turf_decal/tile/dark_green/opposingcorners, +/turf/open/floor/iron, /area/station/hallway/secondary/service) "otH" = ( /obj/structure/closet/crate/cardboard, @@ -41103,8 +41133,9 @@ /turf/closed/wall/r_wall, /area/station/engineering/supermatter) "oEo" = ( -/obj/effect/turf_decal/tile/dark_green/opposingcorners, -/turf/closed/wall, +/obj/machinery/light/directional/north, +/obj/item/assembly/mousetrap/armed, +/turf/open/floor/plating, /area/station/hallway/secondary/service) "oEp" = ( /obj/effect/spawner/structure/window, @@ -44521,6 +44552,13 @@ dir = 1 }, /area/station/service/chapel) +"pMV" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/coldroom{ + dir = 1 + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "pNa" = ( /obj/machinery/door/window/left/directional/east, /turf/open/floor/grass, @@ -44870,6 +44908,9 @@ "pTn" = ( /obj/structure/kitchenspike, /obj/machinery/light/directional/west, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 1 + }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "pTt" = ( @@ -48057,13 +48098,13 @@ /turf/open/floor/iron/white, /area/station/ai_monitored/turret_protected/ai_upload_foyer) "rbt" = ( -/obj/machinery/door/airlock{ - name = "Kitchen Cold Room" - }, /obj/effect/mapping_helpers/airlock/access/all/service/kitchen, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/machinery/door/airlock/freezer{ + name = "Freezer" + }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "rbw" = ( @@ -50352,6 +50393,9 @@ "rNs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "rNJ" = ( @@ -53842,12 +53886,14 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/central/lesser) "sUI" = ( -/obj/machinery/door/airlock{ - name = "Kitchen Cold Room" - }, /obj/effect/mapping_helpers/airlock/access/all/service/kitchen, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/freezer{ + name = "Freezer" + }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "sUM" = ( @@ -55367,6 +55413,9 @@ "twW" = ( /obj/structure/kitchenspike, /obj/item/radio/intercom/directional/west, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) "txo" = ( @@ -93468,7 +93517,7 @@ mMT mMT mMT mMT -edv +mMT eBb hRB cXe @@ -93724,7 +93773,7 @@ mMT mMT twW pTn -mMT +pMV mMT hwk hRB @@ -93980,7 +94029,7 @@ fDN mMT uZg byb -rNs +fBA nlz rbt cXL @@ -94493,7 +94542,7 @@ atX mUW mMT fNy -rNs +edv rNs dCh mMT diff --git a/_maps/shuttles/arrival_northstar.dmm b/_maps/shuttles/arrival_northstar.dmm new file mode 100644 index 0000000000000..fadde8f9df42b --- /dev/null +++ b/_maps/shuttles/arrival_northstar.dmm @@ -0,0 +1,278 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/shuttle/arrival) +"c" = ( +/obj/machinery/door/airlock/survival_pod/glass{ + name = "Arrivals Shuttle Airlock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/shuttle/arrival) +"d" = ( +/obj/machinery/requests_console/directional/north{ + department = "Arrivals shuttle"; + name = "Arrival Shuttle Requests Console" + }, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/storage/medkit/regular{ + pixel_y = 4 + }, +/obj/item/storage/toolbox/emergency, +/turf/open/floor/pod/dark, +/area/shuttle/arrival) +"g" = ( +/obj/machinery/power/shuttle_engine/propulsion/burst/right{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/shuttle/arrival) +"j" = ( +/obj/structure/closet/firecloset/full, +/turf/open/floor/pod/dark, +/area/shuttle/arrival) +"k" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/storage/medkit/o2, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/tank/internals/emergency_oxygen, +/turf/open/floor/pod/dark, +/area/shuttle/arrival) +"n" = ( +/obj/effect/turf_decal/trimline/red/warning{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/shuttle/arrival) +"q" = ( +/obj/structure/closet/wardrobe/grey, +/turf/open/floor/pod/dark, +/area/shuttle/arrival) +"r" = ( +/obj/effect/turf_decal/trimline/red/warning{ + dir = 8 + }, +/turf/open/floor/pod/dark, +/area/shuttle/arrival) +"s" = ( +/obj/effect/turf_decal/trimline/red/corner{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/shuttle/arrival) +"t" = ( +/turf/closed/wall/mineral/titanium/survival, +/area/shuttle/arrival) +"u" = ( +/obj/effect/turf_decal/trimline/red/corner, +/obj/effect/turf_decal/trimline/red/corner{ + dir = 8 + }, +/turf/open/floor/pod, +/area/shuttle/arrival) +"v" = ( +/obj/structure/closet/wardrobe/mixed, +/turf/open/floor/pod/dark, +/area/shuttle/arrival) +"w" = ( +/obj/machinery/power/shuttle_engine/propulsion/burst/left{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/shuttle/arrival) +"y" = ( +/obj/effect/turf_decal/trimline/red/corner{ + dir = 8 + }, +/turf/open/floor/pod/dark, +/area/shuttle/arrival) +"z" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/trimline/red/warning{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/shuttle/arrival) +"A" = ( +/obj/effect/turf_decal/trimline/red/warning{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/warning{ + dir = 4 + }, +/turf/open/floor/pod, +/area/shuttle/arrival) +"C" = ( +/obj/effect/turf_decal/trimline/red/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/corner{ + dir = 1 + }, +/turf/open/floor/pod, +/area/shuttle/arrival) +"D" = ( +/obj/machinery/power/shuttle_engine/propulsion{ + dir = 4 + }, +/obj/docking_port/mobile/arrivals{ + name = "northstar arrivals shuttle" + }, +/turf/open/floor/plating/airless, +/area/shuttle/arrival) +"E" = ( +/obj/effect/turf_decal/trimline/red/warning{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/shuttle/arrival) +"F" = ( +/obj/structure/chair/comfy/shuttle, +/obj/machinery/light/red/directional/north, +/turf/open/floor/catwalk_floor/iron_dark, +/area/shuttle/arrival) +"H" = ( +/obj/machinery/power/shuttle_engine/propulsion{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/shuttle/arrival) +"J" = ( +/obj/effect/turf_decal/trimline/red/warning{ + dir = 1 + }, +/obj/machinery/light/red/directional/south, +/turf/open/floor/pod/dark, +/area/shuttle/arrival) +"L" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 4 + }, +/obj/structure/window/reinforced/survival_pod/spawner/directional/west, +/turf/open/floor/plating/airless, +/area/shuttle/arrival) +"M" = ( +/obj/effect/turf_decal/trimline/red/corner{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/shuttle/arrival) +"N" = ( +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/catwalk_floor/iron_dark, +/area/shuttle/arrival) +"P" = ( +/obj/effect/turf_decal/trimline/red/warning, +/turf/open/floor/pod, +/area/shuttle/arrival) +"V" = ( +/obj/structure/chair/comfy/shuttle, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/catwalk_floor/iron_dark, +/area/shuttle/arrival) +"W" = ( +/obj/effect/turf_decal/trimline/red/corner, +/turf/open/floor/pod/dark, +/area/shuttle/arrival) +"Z" = ( +/obj/effect/spawner/structure/window/survival_pod, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/plating, +/area/shuttle/arrival) + +(1,1,1) = {" +a +t +Z +Z +t +a +"} +(2,1,1) = {" +t +t +v +q +t +t +"} +(3,1,1) = {" +t +k +W +E +s +t +"} +(4,1,1) = {" +t +F +P +b +z +t +"} +(5,1,1) = {" +t +N +P +b +n +Z +"} +(6,1,1) = {" +t +d +u +A +C +c +"} +(7,1,1) = {" +t +N +P +b +n +Z +"} +(8,1,1) = {" +t +V +P +b +J +t +"} +(9,1,1) = {" +t +j +y +r +M +t +"} +(10,1,1) = {" +t +L +L +L +L +t +"} +(11,1,1) = {" +t +g +D +H +w +t +"} diff --git a/_maps/shuttles/cargo_northstar.dmm b/_maps/shuttles/cargo_northstar.dmm new file mode 100644 index 0000000000000..8eb2df120090b --- /dev/null +++ b/_maps/shuttles/cargo_northstar.dmm @@ -0,0 +1,295 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"b" = ( +/obj/machinery/power/shuttle_engine/propulsion/burst/right, +/turf/open/floor/plating/airless, +/area/shuttle/supply) +"c" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/shuttle/supply) +"d" = ( +/obj/machinery/button/door/directional/east{ + id = "QMLoaddoor"; + name = "Loading Doors"; + pixel_y = -8 + }, +/obj/machinery/button/door/directional/east{ + id = "QMLoaddoor2"; + name = "Loading Doors"; + pixel_y = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/conveyor_switch/oneway{ + id = "QMLoad" + }, +/turf/open/floor/iron/smooth, +/area/shuttle/supply) +"f" = ( +/obj/machinery/conveyor{ + dir = 5; + id = "QMLoad" + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/shuttle/supply) +"g" = ( +/obj/machinery/door/poddoor{ + id = "QMLoaddoor2"; + name = "Supply Dock Loading Door" + }, +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/shuttle/supply) +"h" = ( +/turf/closed/wall/mineral/titanium/survival/nodiagonal, +/area/shuttle/supply) +"i" = ( +/turf/closed/wall/mineral/titanium/survival, +/area/shuttle/supply) +"j" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "QMLoad" + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/shuttle/supply) +"k" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/smooth, +/area/shuttle/supply) +"n" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron/smooth, +/area/shuttle/supply) +"o" = ( +/obj/machinery/power/shuttle_engine/propulsion/burst/left, +/turf/open/floor/plating/airless, +/area/shuttle/supply) +"q" = ( +/obj/machinery/power/shuttle_engine/heater{ + icon_state = "router" + }, +/turf/open/floor/plating/airless, +/area/shuttle/supply) +"s" = ( +/turf/template_noop, +/area/template_noop) +"u" = ( +/obj/machinery/power/shuttle_engine/propulsion, +/turf/open/floor/plating/airless, +/area/shuttle/supply) +"v" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/shuttle/supply) +"w" = ( +/obj/effect/spawner/structure/window/survival_pod, +/turf/open/floor/plating, +/area/shuttle/supply) +"x" = ( +/turf/open/floor/catwalk_floor/iron_smooth, +/area/shuttle/supply) +"B" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/shuttle/supply) +"C" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/shuttle/supply) +"D" = ( +/obj/machinery/power/shuttle_engine/heater, +/obj/structure/window/reinforced/survival_pod/spawner/directional/west, +/obj/structure/window/reinforced/survival_pod/spawner/directional/north, +/turf/open/floor/plating/airless, +/area/shuttle/supply) +"G" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/light/red/directional/west, +/turf/open/floor/iron/smooth, +/area/shuttle/supply) +"I" = ( +/obj/machinery/power/shuttle_engine/heater, +/obj/structure/window/reinforced/survival_pod/spawner/directional/north, +/turf/open/floor/plating/airless, +/area/shuttle/supply) +"K" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "QMLoad" + }, +/obj/machinery/door/poddoor{ + id = "QMLoaddoor"; + name = "Supply Dock Loading Door" + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/shuttle/supply) +"M" = ( +/obj/machinery/power/shuttle_engine/heater, +/obj/structure/window/reinforced/survival_pod/spawner/directional/east, +/obj/structure/window/reinforced/survival_pod/spawner/directional/north, +/turf/open/floor/plating/airless, +/area/shuttle/supply) +"N" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/smooth, +/area/shuttle/supply) +"O" = ( +/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/obj/machinery/door/airlock/survival_pod/glass{ + name = "Supply Shuttle Airlock" + }, +/obj/docking_port/mobile/supply, +/turf/open/floor/catwalk_floor/iron, +/area/shuttle/supply) +"Q" = ( +/obj/machinery/conveyor{ + dir = 9; + id = "QMLoad" + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/shuttle/supply) +"V" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/shuttle/supply) +"Y" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/shuttle/supply) +"Z" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/light/red/directional/west, +/turf/open/floor/iron/smooth, +/area/shuttle/supply) + +(1,1,1) = {" +h +h +i +i +i +i +i +i +i +i +s +"} +(2,1,1) = {" +h +f +Q +G +v +v +Z +C +x +I +o +"} +(3,1,1) = {" +w +c +j +Y +k +N +k +n +D +q +u +"} +(4,1,1) = {" +w +c +j +Y +N +k +N +n +M +q +u +"} +(5,1,1) = {" +h +c +j +d +B +B +B +V +x +I +b +"} +(6,1,1) = {" +h +g +K +h +O +w +w +h +h +i +s +"} diff --git a/_maps/shuttles/mining_common_northstar.dmm b/_maps/shuttles/mining_common_northstar.dmm new file mode 100644 index 0000000000000..5e24739c363d5 --- /dev/null +++ b/_maps/shuttles/mining_common_northstar.dmm @@ -0,0 +1,163 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"d" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 8 + }, +/turf/open/floor/pod/light, +/area/shuttle/mining) +"e" = ( +/obj/machinery/power/shuttle_engine/heater, +/obj/structure/window/reinforced/survival_pod/spawner/directional/north, +/turf/open/floor/plating/airless, +/area/shuttle/mining) +"k" = ( +/obj/effect/turf_decal/caution/stand_clear/red{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/shuttle/mining) +"l" = ( +/obj/effect/spawner/structure/window/survival_pod, +/turf/open/floor/plating, +/area/shuttle/mining) +"q" = ( +/obj/machinery/power/shuttle_engine/propulsion, +/turf/open/floor/plating/airless, +/area/shuttle/mining) +"r" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/structure/sign/poster/official/plasma_effects/directional/south, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 8 + }, +/turf/open/floor/pod/light, +/area/shuttle/mining) +"t" = ( +/turf/open/floor/pod/light, +/area/shuttle/mining) +"v" = ( +/turf/closed/wall/mineral/titanium/survival, +/area/shuttle/mining) +"z" = ( +/obj/structure/closet/crate, +/obj/effect/turf_decal/trimline/brown, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/obj/machinery/light/small/red/directional/south, +/turf/open/floor/pod/dark, +/area/shuttle/mining) +"A" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/corner{ + dir = 8 + }, +/turf/open/floor/pod/light, +/area/shuttle/mining) +"C" = ( +/obj/machinery/door/airlock/survival_pod/glass{ + name = "Public Mining Shuttle" + }, +/obj/effect/turf_decal/bot_red, +/obj/docking_port/mobile{ + dir = 4; + name = "lavaland shuttle"; + port_direction = 8; + shuttle_id = "mining_common" + }, +/turf/open/floor/pod/light, +/area/shuttle/mining) +"D" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/emergency, +/turf/open/floor/pod/light, +/area/shuttle/mining) +"E" = ( +/obj/structure/sign/nanotrasen, +/turf/closed/wall/mineral/titanium/survival, +/area/shuttle/mining) +"G" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/trimline/brown, +/obj/effect/turf_decal/siding/dark{ + dir = 5 + }, +/turf/open/floor/pod/dark, +/area/shuttle/mining) +"J" = ( +/obj/effect/turf_decal/trimline/neutral/line, +/turf/open/floor/pod/light, +/area/shuttle/mining) +"P" = ( +/obj/machinery/computer/shuttle/mining/common, +/turf/open/floor/pod/light, +/area/shuttle/mining) +"T" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/line, +/turf/open/floor/pod/light, +/area/shuttle/mining) +"U" = ( +/obj/structure/table/reinforced, +/obj/item/radio, +/obj/machinery/light/small/red/directional/north, +/turf/open/floor/pod/light, +/area/shuttle/mining) + +(1,1,1) = {" +v +l +l +C +l +v +a +"} +(2,1,1) = {" +l +P +T +k +z +v +v +"} +(3,1,1) = {" +l +D +J +t +G +e +q +"} +(4,1,1) = {" +v +U +A +d +r +v +v +"} +(5,1,1) = {" +v +l +l +E +l +v +a +"} diff --git a/_maps/shuttles/mining_northstar.dmm b/_maps/shuttles/mining_northstar.dmm new file mode 100644 index 0000000000000..48c194b6d4582 --- /dev/null +++ b/_maps/shuttles/mining_northstar.dmm @@ -0,0 +1,271 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/turf_decal/bot_red, +/obj/machinery/door/airlock/survival_pod{ + name = "Mining Shuttle" + }, +/obj/docking_port/mobile{ + dir = 4; + name = "mining shuttle"; + port_direction = 8; + shuttle_id = "mining" + }, +/turf/open/floor/pod/light, +/area/shuttle/mining) +"c" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/emergency, +/obj/structure/sign/warning/xeno_mining/directional/north, +/obj/machinery/light/small/red/directional/north, +/turf/open/floor/pod/light, +/area/shuttle/mining) +"d" = ( +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 3 + }, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 3 + }, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 3 + }, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 3 + }, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/head/utility/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/item/clothing/head/utility/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/item/clothing/head/utility/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/item/clothing/head/utility/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/item/clothing/head/utility/hardhat/orange{ + name = "protective hat"; + pixel_y = 9 + }, +/obj/structure/closet/crate/internals, +/obj/item/pickaxe/emergency, +/obj/item/pickaxe/emergency, +/obj/effect/turf_decal/siding/brown{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown, +/obj/machinery/light/small/red/directional/south, +/turf/open/floor/pod/dark, +/area/shuttle/mining) +"j" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/end{ + dir = 8 + }, +/turf/open/floor/pod/light, +/area/shuttle/mining) +"l" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 5 + }, +/obj/structure/sign/poster/official/work_for_a_future/directional/north, +/obj/machinery/light/small/red/directional/north, +/turf/open/floor/pod/light, +/area/shuttle/mining) +"m" = ( +/obj/effect/turf_decal/caution/stand_clear/red{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/shuttle/mining) +"s" = ( +/obj/machinery/computer/shuttle/mining, +/turf/open/floor/pod/light, +/area/shuttle/mining) +"z" = ( +/obj/effect/turf_decal/siding/brown{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/brown, +/turf/open/floor/pod/dark, +/area/shuttle/mining) +"A" = ( +/obj/machinery/power/shuttle_engine/propulsion, +/turf/open/floor/plating, +/area/shuttle/mining) +"D" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/end, +/obj/machinery/light/small/red/directional/south, +/turf/open/floor/pod/light, +/area/shuttle/mining) +"F" = ( +/obj/structure/table/reinforced, +/obj/item/wrench, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/crowbar/red, +/obj/item/clothing/mask/gas, +/turf/open/floor/pod/light, +/area/shuttle/mining) +"G" = ( +/turf/open/floor/pod/light, +/area/shuttle/mining) +"I" = ( +/turf/closed/wall/mineral/titanium/survival, +/area/shuttle/mining) +"K" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/line, +/turf/open/floor/pod/light, +/area/shuttle/mining) +"P" = ( +/turf/template_noop, +/area/template_noop) +"R" = ( +/obj/effect/spawner/structure/window/survival_pod, +/turf/open/floor/plating, +/area/shuttle/mining) +"S" = ( +/obj/machinery/power/shuttle_engine/heater, +/obj/structure/window/reinforced/survival_pod/spawner/directional/north, +/turf/open/floor/plating, +/area/shuttle/mining) +"W" = ( +/obj/effect/turf_decal/siding/brown{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown, +/obj/structure/ore_box, +/turf/open/floor/pod/dark, +/area/shuttle/mining) +"X" = ( +/obj/structure/sign/nanotrasen, +/turf/closed/wall/mineral/titanium/survival, +/area/shuttle/mining) +"Z" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/shuttle/mining) + +(1,1,1) = {" +P +I +R +a +R +I +P +"} +(2,1,1) = {" +I +I +c +m +d +I +I +"} +(3,1,1) = {" +R +s +j +G +W +S +A +"} +(4,1,1) = {" +R +F +K +G +z +S +A +"} +(5,1,1) = {" +I +I +l +Z +D +I +I +"} +(6,1,1) = {" +P +I +R +X +R +I +P +"} diff --git a/_maps/virtual_domains/meta_central.dmm b/_maps/virtual_domains/meta_central.dmm index 3fc4ed7f21e1f..76f90e2c88bb6 100644 --- a/_maps/virtual_domains/meta_central.dmm +++ b/_maps/virtual_domains/meta_central.dmm @@ -1339,13 +1339,6 @@ /obj/item/pickaxe/rusted, /turf/open/floor/iron, /area/virtual_domain) -"lx" = ( -/obj/structure/barricade/sandbags, -/obj/machinery/deployable_turret{ - dir = 1 - }, -/turf/open/floor/plating, -/area/virtual_domain) "lC" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -7784,7 +7777,7 @@ LG uS hd Ol -lx +wN vU hp lu diff --git a/code/__DEFINES/ai/ai_blackboard.dm b/code/__DEFINES/ai/ai_blackboard.dm index f7f77a7169ea2..161f9973b36c3 100644 --- a/code/__DEFINES/ai/ai_blackboard.dm +++ b/code/__DEFINES/ai/ai_blackboard.dm @@ -49,6 +49,11 @@ #define BB_BANE_BATMAN "BB_bane_batman" //yep that's it +/// Are we a panicking goose? +#define BB_GOOSE_PANICKED "BB_goose_panicked" +/// Are we a panicking goose? +#define BB_GOOSE_VOMIT_CHANCE "BB_goose_vomit_chance" + //Hunting BB keys ///key that holds our current hunting target #define BB_CURRENT_HUNTING_TARGET "BB_current_hunting_target" @@ -140,6 +145,9 @@ /// Blackboard key for a held item #define BB_SIMPLE_CARRY_ITEM "BB_SIMPLE_CARRY_ITEM" +///key holding a range to look for stuff in +#define BB_SEARCH_RANGE "BB_search_range" + ///Mob the MOD is trying to attach to #define BB_MOD_TARGET "BB_mod_target" ///The implant the AI was created from diff --git a/code/__DEFINES/bitrunning.dm b/code/__DEFINES/bitrunning.dm index ba6c3b9b61cc3..639ae26c3fc5b 100644 --- a/code/__DEFINES/bitrunning.dm +++ b/code/__DEFINES/bitrunning.dm @@ -26,3 +26,22 @@ /// Camera network bitrunner bodycams are on #define BITRUNNER_CAMERA_NET "bitrunner" + +/** + * Bitrunner Domain External Load Restriction Bitflags + */ +/// Domain forbids external sources from loading items onto avatars +#define DOMAIN_FORBIDS_ITEMS (1<<0) +/// Domain forbids external sources from loading abilities onto avatars +#define DOMAIN_FORBIDS_ABILITIES (1<<1) + +/// Combination flag for blocking anything from being loaded onto avatars by external sources +#define DOMAIN_FORBIDS_ALL ALL + +/** + * COMSIG_BITRUNNER_STOCKING_GEAR Return Bitflags + */ +/// Something failed to load +#define BITRUNNER_GEAR_LOAD_FAILED (1<<0) +/// The domain restrictions blocked something from loading +#define BITRUNNER_GEAR_LOAD_BLOCKED (1<<1) diff --git a/code/__DEFINES/bodyparts.dm b/code/__DEFINES/bodyparts.dm index f044bb12c84ea..950977b897b5f 100644 --- a/code/__DEFINES/bodyparts.dm +++ b/code/__DEFINES/bodyparts.dm @@ -49,3 +49,5 @@ #define LIMB_COLOR_CARP_INFUSION 20 /// Base priority for atom colors, gets atom priorities added to it #define LIMB_COLOR_ATOM_COLOR 30 +/// Voidwalker effect color priority +#define LIMB_COLOR_VOIDWALKER_CURSE 40 diff --git a/code/__DEFINES/construction/material.dm b/code/__DEFINES/construction/material.dm index a8bef8cbec9d2..9ebf3b20c3ba4 100644 --- a/code/__DEFINES/construction/material.dm +++ b/code/__DEFINES/construction/material.dm @@ -102,5 +102,5 @@ #define MATERIAL_LIST_OPTIMAL_AMOUNT "optimal_amount" ///The key to access the multiplier used to selectively control effects and modifiers of a material. #define MATERIAL_LIST_MULTIPLIER "multiplier" -///A macro that ensures some multiplicative modifiers higher than 1 don't become lower than 1 and viceversa because of the multiplier. +///A macro that ensures some multiplicative modifiers higher than 1 don't become lower than 1 and vice-versa because of the multiplier. #define GET_MATERIAL_MODIFIER(modifier, multiplier) (modifier >= 1 ? 1 + ((modifier) - 1) * (multiplier) : (modifier)**(multiplier)) diff --git a/code/__DEFINES/dcs/signals/signals_ai_controller.dm b/code/__DEFINES/dcs/signals/signals_ai_controller.dm index a405ad65e8734..1888612d2c4a1 100644 --- a/code/__DEFINES/dcs/signals/signals_ai_controller.dm +++ b/code/__DEFINES/dcs/signals/signals_ai_controller.dm @@ -1,6 +1,8 @@ ///sent from ai controllers when they possess a pawn: (datum/ai_controller/source_controller) #define COMSIG_AI_CONTROLLER_POSSESSED_PAWN "ai_controller_possessed_pawn" +///sent from ai controllers when they stop possessing a pawn: (datum/ai_controller/source_controller) +#define COMSIG_AI_CONTROLLER_UNPOSSESSED_PAWN "ai_controller_unpossessed_pawn" ///sent from ai controllers when they pick behaviors: (list/datum/ai_behavior/old_behaviors, list/datum/ai_behavior/new_behaviors) #define COMSIG_AI_CONTROLLER_PICKED_BEHAVIORS "ai_controller_picked_behaviors" ///sent from ai controllers when a behavior is inserted into the queue: (list/new_arguments) diff --git a/code/__DEFINES/dcs/signals/signals_bitrunning.dm b/code/__DEFINES/dcs/signals/signals_bitrunning.dm index ac3095d6f5af8..fcce7ea68d0ca 100644 --- a/code/__DEFINES/dcs/signals/signals_bitrunning.dm +++ b/code/__DEFINES/dcs/signals/signals_bitrunning.dm @@ -41,6 +41,9 @@ /// from /obj/machienry/quantum_server/station_spawn() #define COMSIG_BITRUNNER_STATION_SPAWN "bitrunner_station_spawn" +/// from /obj/machinery/quantum_server/stock_gear(): (mob/living/carbon/human/avatar, external_load_flags) +#define COMSIG_BITRUNNER_STOCKING_GEAR "bitrunner_stocking_gear" + // Ladder /// from /obj/structure/hololadder/disconnect() diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm index 3569b9af1e61d..b687ef5ace2a2 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -43,7 +43,7 @@ #define COMSIG_LIVING_REVIVE "living_revive" ///from base of mob/living/set_buckled(): (new_buckled) #define COMSIG_LIVING_SET_BUCKLED "living_set_buckled" -///from base of mob/living/set_body_position() +///from base of mob/living/set_body_position(): (new_position, old_position) #define COMSIG_LIVING_SET_BODY_POSITION "living_set_body_position" /// Sent to a mob being injected with a syringe when the do_after initiates #define COMSIG_LIVING_TRY_SYRINGE_INJECT "living_try_syringe_inject" diff --git a/code/__DEFINES/dcs/signals/signals_mod.dm b/code/__DEFINES/dcs/signals/signals_mod.dm index c08377d50db42..70c434adae373 100644 --- a/code/__DEFINES/dcs/signals/signals_mod.dm +++ b/code/__DEFINES/dcs/signals/signals_mod.dm @@ -8,7 +8,8 @@ /// Called when a MOD deploys a part. (mob/user, datum/mod_part/part) #define COMSIG_MOD_PART_DEPLOYED "mod_part_deployed" /// Called when a MOD retracts a part. (mob/user, datum/mod_part/part) -#define COMSIG_MOD_PART_RETRACTED "mod_part_retracted" +#define COMSIG_MOD_PART_RETRACTING "mod_part_retracting" + #define MOD_CANCEL_RETRACTION (1 << 0) /// Called when a MOD seals/unseals a part. (datum/mod_part/part) #define COMSIG_MOD_PART_SEALED "mod_part_sealed" /// Called when a MOD is finished toggling itself. diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index 4d9c6e9c00bf9..b275ddad69642 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -329,9 +329,11 @@ // /obj/item/gun signals +///called in /obj/item/gun/try_fire_gun (user, src, target, flag, params) +#define COMSIG_MOB_TRYING_TO_FIRE_GUN "mob_trying_to_fire_gun" ///called in /obj/item/gun/fire_gun (user, target, flag, params) #define COMSIG_GUN_TRY_FIRE "gun_try_fire" - #define COMPONENT_CANCEL_GUN_FIRE (1<<0) + #define COMPONENT_CANCEL_GUN_FIRE (1<<0) /// Also returned to cancel COMSIG_MOB_TRYING_TO_FIRE_GUN ///called in /obj/item/gun/process_fire (src, target, params, zone_override, bonus_spread_values) #define COMSIG_MOB_FIRED_GUN "mob_fired_gun" #define MIN_BONUS_SPREAD_INDEX 1 diff --git a/code/__DEFINES/dcs/signals/signals_reagent.dm b/code/__DEFINES/dcs/signals/signals_reagent.dm index e8db73d3ae05b..8d91c1b2e6bf0 100644 --- a/code/__DEFINES/dcs/signals/signals_reagent.dm +++ b/code/__DEFINES/dcs/signals/signals_reagent.dm @@ -25,26 +25,13 @@ ///from base of [/datum/component/multiple_lives/proc/respawn]: (mob/respawned_mob, gibbed, lives_left) #define COMSIG_ON_MULTIPLE_LIVES_RESPAWN "on_multiple_lives_respawn" -///from base of [/datum/reagents/proc/add_reagent] - Sent before the reagent is added: (reagenttype, amount, reagtemp, data, no_react) -#define COMSIG_REAGENTS_PRE_ADD_REAGENT "reagents_pre_add_reagent" - /// Prevents the reagent from being added. - #define COMPONENT_CANCEL_REAGENT_ADD (1<<0) -///from base of [/datum/reagents/proc/add_reagent]: (/datum/reagent, amount, reagtemp, data, no_react) -#define COMSIG_REAGENTS_NEW_REAGENT "reagents_new_reagent" -///from base of [/datum/reagents/proc/add_reagent]: (/datum/reagent, amount, reagtemp, data, no_react) -#define COMSIG_REAGENTS_ADD_REAGENT "reagents_add_reagent" -///from base of [/datum/reagents/proc/del_reagent]: (/datum/reagent) -#define COMSIG_REAGENTS_DEL_REAGENT "reagents_del_reagent" -///from base of [/datum/reagents/proc/remove_reagent]: (/datum/reagent, amount) -#define COMSIG_REAGENTS_REM_REAGENT "reagents_rem_reagent" -///from base of [/datum/reagents/proc/clear_reagents]: () -#define COMSIG_REAGENTS_CLEAR_REAGENTS "reagents_clear_reagents" +///from base of [/datum/reagents/proc/update_total()] +#define COMSIG_REAGENTS_HOLDER_UPDATED "reagents_update_total" ///from base of [/datum/reagents/proc/set_temperature]: (new_temp, old_temp) #define COMSIG_REAGENTS_TEMP_CHANGE "reagents_temp_change" -///from base of [/datum/reagents/proc/handle_reactions]: (num_reactions) -#define COMSIG_REAGENTS_REACTED "reagents_reacted" ///from base of [/datum/reagents/proc/process]: (num_reactions) #define COMSIG_REAGENTS_REACTION_STEP "reagents_time_step" + ///from base of [/atom/proc/expose_reagents]: (/atom, /list, methods, volume_modifier, show_message) #define COMSIG_REAGENTS_EXPOSE_ATOM "reagents_expose_atom" ///from base of [/obj/proc/expose_reagents]: (/obj, /list, methods, volume_modifier, show_message) diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index 9f575de9fbc55..2771139a3dca5 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -35,17 +35,16 @@ #define SURGICAL_TOOL (1<<12) //Tool commonly used for surgery: won't attack targets in an active surgical operation on help intent (in case of mistakes) #define CRUEL_IMPLEMENT (1<<13) //This object, when used for surgery, is a lot worse at the job if the target is alive rather than dead #define HAND_ITEM (1<<14) // If an item is just your hand (circled hand, slapper) and shouldn't block things like riding -#define EXAMINE_SKIP (1<<15) // Makes the Examine proc not read out this item. -#define XENOMORPH_HOLDABLE (1<<16) // A Xenomorph can hold this item. -#define NO_PIXEL_RANDOM_DROP (1<<17) //if dropped, it wont have a randomized pixel_x/pixel_y +#define XENOMORPH_HOLDABLE (1<<15) // A Xenomorph can hold this item. +#define NO_PIXEL_RANDOM_DROP (1<<16) //if dropped, it wont have a randomized pixel_x/pixel_y ///Can be equipped on digitigrade legs. -#define IGNORE_DIGITIGRADE (1<<18) +#define IGNORE_DIGITIGRADE (1<<17) /// Has contextual screentips when HOVERING OVER OTHER objects -#define ITEM_HAS_CONTEXTUAL_SCREENTIPS (1 << 19) +#define ITEM_HAS_CONTEXTUAL_SCREENTIPS (1 << 18) /// No blood overlay is allowed to appear on this item, and it cannot gain blood DNA forensics -#define NO_BLOOD_ON_ITEM (1 << 20) +#define NO_BLOOD_ON_ITEM (1 << 19) /// Whether this item should skip the /datum/component/fantasy applied on spawn on the RPG event. Used on things like stacks -#define SKIP_FANTASY_ON_SPAWN (1<<21) +#define SKIP_FANTASY_ON_SPAWN (1<<20) // Flags for the clothing_flags var on /obj/item/clothing diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index 28587a77e6a95..37b515cd8d030 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -79,6 +79,13 @@ #define DEFAULT_CYBORG_NAME "Default Cyborg Name" +// Choose grid or list TGUI layouts for UI's, when possible. +/// Default layout will be used. It can be either a grid or a list +#define TGUI_LAYOUT_DEFAULT "default" +/// Force grid layout, even if default is a list. +#define TGUI_LAYOUT_GRID "grid" +/// Force list layout, even if default is a grid. +#define TGUI_LAYOUT_LIST "list" //Job preferences levels #define JP_ANY 0 diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index f65511044005b..6fb10c635f181 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -1,20 +1,32 @@ -#define INJECTABLE (1<<0) // Makes it possible to add reagents through droppers and syringes. -#define DRAWABLE (1<<1) // Makes it possible to remove reagents through syringes. - -#define REFILLABLE (1<<2) // Makes it possible to add reagents through any reagent container. -#define DRAINABLE (1<<3) // Makes it possible to remove reagents through any reagent container. -#define DUNKABLE (1<<4) // Allows items to be dunked into this container for transfering reagents. Used in conjunction with the dunkable component. - -#define TRANSPARENT (1<<5) // Used on containers which you want to be able to see the reagents of. -#define AMOUNT_VISIBLE (1<<6) // For non-transparent containers that still have the general amount of reagents in them visible. -#define NO_REACT (1<<7) // Applied to a reagent holder, the contents will not react with each other. -#define REAGENT_HOLDER_INSTANT_REACT (1<<8) // Applied to a reagent holder, all of the reactions in the reagents datum will be instant. Meant to be used for things like smoke effects where reactions aren't meant to occur +//Methods to interact with reagents in the holder +/// Makes it possible to add reagents through droppers and syringes. +#define INJECTABLE (1<<0) +/// Makes it possible to remove reagents through syringes. +#define DRAWABLE (1<<1) +/// Makes it possible to add reagents through any reagent container. +#define REFILLABLE (1<<2) +/// Makes it possible to remove reagents through any reagent container. +#define DRAINABLE (1<<3) +/// Allows items to be dunked into this container for transfering reagents. Used in conjunction with the dunkable component. +#define DUNKABLE (1<<4) + +//Methods to examine reagents in the container +/// Used on containers which you want to be able to see the reagents of. +#define TRANSPARENT (1<<5) +/// For non-transparent containers that still have the general amount of reagents in them visible. +#define AMOUNT_VISIBLE (1<<6) + +//Reaction flags +/// Applied to a reagent holder, the contents will not react with each other. +#define NO_REACT (1<<7) +/// Applied to a reagent holder, all of the reactions in the reagents datum will be instant. Meant to be used for things like smoke effects where reactions aren't meant to occur +#define REAGENT_HOLDER_INSTANT_REACT (1<<8) ///If the holder is "alive" (i.e. mobs and organs) - If this flag is applied to a holder it will cause reagents to split upon addition to the object #define REAGENT_HOLDER_ALIVE (1<<9) +//Special properties ///If the holder a sealed container - Used if you don't want reagent contents boiling out (plasma, specifically, in which case it only bursts out when at ignition temperatures) #define SEALED_CONTAINER (1<<10) - // Is an open container for all intents and purposes. #define OPENCONTAINER (REFILLABLE | DRAINABLE | TRANSPARENT) diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index 9d0a017bff854..ab5a5a80de45e 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -251,6 +251,12 @@ GLOBAL_LIST_INIT(announcer_keys, list( #define SFX_CLOWN_CAR_LOAD "clown_car_load" #define SFX_SEATBELT_BUCKLE "buckle" #define SFX_SEATBELT_UNBUCKLE "unbuckle" +#define SFX_HEADSET_EQUIP "headset_equip" +#define SFX_HEADSET_PICKUP "headset_pickup" +#define SFX_BANDAGE_BEGIN "bandage_begin" +#define SFX_BANDAGE_END "bandage_end" +#define SFX_CLOTH_DROP "cloth_drop" +#define SFX_CLOTH_PICKUP "cloth_pickup" // Standard is 44.1khz #define MIN_EMOTE_PITCH 40000 diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 46987974d8049..936fd0b170fd7 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -18,10 +18,12 @@ #define STATUS_EFFECT_ID_ABSTRACT "abstract" ///Processing flags - used to define the speed at which the status will work -///This is fast - 0.2s between ticks (I believe!) +/// This is fast - 0.2s between ticks (I believe!) #define STATUS_EFFECT_FAST_PROCESS 0 -///This is slower and better for more intensive status effects - 1s between ticks +/// This is slower and better for more intensive status effects - 1s between ticks #define STATUS_EFFECT_NORMAL_PROCESS 1 +/// Similar speed to STATUS_EFFECT_FAST_PROCESS, but uses a high priority subsystem (SSpriority_effects) +#define STATUS_EFFECT_PRIORITY 2 //several flags for the Necropolis curse status effect ///makes the edges of the target's screen obscured diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index f5f5067311143..29b7454f5f9a6 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 28 +#define DB_MINOR_VERSION 29 //! ## Timing subsystem @@ -226,6 +226,7 @@ #define FIRE_PRIORITY_PARALLAX 65 #define FIRE_PRIORITY_INSTRUMENTS 80 #define FIRE_PRIORITY_FLUIDS 80 +#define FIRE_PRIORITY_PRIORITY_EFFECTS 90 #define FIRE_PRIORITY_MOBS 100 #define FIRE_PRIORITY_TGUI 110 #define FIRE_PRIORITY_TICKER 200 diff --git a/code/__DEFINES/traits/_traits.dm b/code/__DEFINES/traits/_traits.dm index 7ebf1ad659046..0b1231c081fa6 100644 --- a/code/__DEFINES/traits/_traits.dm +++ b/code/__DEFINES/traits/_traits.dm @@ -74,7 +74,9 @@ var/list/_S = sources; \ if (_L) { \ for (var/_T in _L) { \ - _L[_T] &= _S;\ + if (_L[_T]) { \ + _L[_T] &= _S; \ + }; \ if (!length(_L[_T])) { \ _L -= _T; \ SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(_T), _T); \ @@ -97,7 +99,9 @@ }; \ if (_L) { \ for (var/_T in _L) { \ - _L[_T] -= _S;\ + if (_L[_T]) { \ + _L[_T] -= _S; \ + }; \ if (!length(_L[_T])) { \ _L -= _T; \ SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(_T)); \ diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 04801bc8a151c..6a66031fc2503 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -379,8 +379,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// for something granting you a diagnostic hud #define TRAIT_DIAGNOSTIC_HUD "diag_hud" #define TRAIT_BOT_PATH_HUD "bot_path_hud" -/// Is a medbot healing you -#define TRAIT_MEDIBOTCOMINGTHROUGH "medbot" #define TRAIT_PASSTABLE "passtable" /// Lets you fly through windows #define TRAIT_PASSWINDOW "passwindow" @@ -479,8 +477,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_PRESERVE_UI_WITHOUT_CLIENT "preserve_ui_without_client" /// This mob overrides certain SSlag_switch measures with this special trait #define TRAIT_BYPASS_MEASURES "bypass_lagswitch_measures" -/// Someone can safely be attacked with honorbound with ONLY a combat mode check, the trait is assuring holding a weapon and hitting won't hurt them.. -#define TRAIT_ALLOWED_HONORBOUND_ATTACK "allowed_honorbound_attack" /// The user is sparring #define TRAIT_SPARRING "sparring" /// The user is currently challenging an elite mining mob. Prevents him from challenging another until he's either lost or won. @@ -620,7 +616,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_DISPLAY_JOB_IN_BINARY "display job in binary" /// Trait that determines vulnerability to being stunned from a shove -#define TRAIT_STUN_ON_NEXT_SHOVE "stun on next shove" +#define TRAIT_DAZED "dazed" /// Trait that determines whether our mob gains more strength from drinking during a fist fight #define TRAIT_DRUNKEN_BRAWLER "drunken brawler" @@ -874,6 +870,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_CONTRABAND_BLOCKER "contraband_blocker" /// For edible items that cannot be composted inside hydro trays #define TRAIT_UNCOMPOSTABLE "uncompostable" +/// Items with this trait will not have their worn icon overlayed. +#define TRAIT_NO_WORN_ICON "no_worn_icon" +/// Items with this trait will not appear when examined. +#define TRAIT_EXAMINE_SKIP "examine_skip" //quirk traits #define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance" @@ -1130,6 +1130,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define STATION_TRAIT_BRIGHT_DAY "station_trait_bright_day" #define STATION_TRAIT_CARP_INFESTATION "station_trait_carp_infestation" #define STATION_TRAIT_CYBERNETIC_REVOLUTION "station_trait_cybernetic_revolution" +#define STATION_TRAIT_ECONOMY_ALERTS "station_trait_economy_alerts" #define STATION_TRAIT_EMPTY_MAINT "station_trait_empty_maint" #define STATION_TRAIT_FILLED_MAINT "station_trait_filled_maint" #define STATION_TRAIT_FORESTED "station_trait_forested" @@ -1428,4 +1429,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Trait applied when the wire bundle component is added to an [/obj/item/integrated_circuit] #define TRAIT_COMPONENT_WIRE_BUNDLE "component_wire_bundle" +/// Trait that is added to fishes that someone already caught, be it in-game or just theoretically, such as when they're bought +/// Prevents fishing achievement from being granted by catching one of these +#define TRAIT_NO_FISHING_ACHIEVEMENT "no_fishing_achievement" + // END TRAIT DEFINES diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm index fd70a6c72abb8..9e407eeecae91 100644 --- a/code/__DEFINES/traits/sources.dm +++ b/code/__DEFINES/traits/sources.dm @@ -40,8 +40,6 @@ ///A trait given by a held item #define HELD_ITEM_TRAIT "held-item-trait" #define ABSTRACT_ITEM_TRAIT "abstract-item" -/// A trait given by any status effect -#define STATUS_EFFECT_TRAIT "status-effect" /// Trait from light debugging #define LIGHT_DEBUG_TRAIT "light-debug" @@ -124,7 +122,6 @@ #define MEGAFAUNA_TRAIT "megafauna" #define CLOWN_NUKE_TRAIT "clown-nuke" #define STICKY_MOUSTACHE_TRAIT "sticky-moustache" -#define CHAINSAW_FRENZY_TRAIT "chainsaw-frenzy" #define CHRONO_GUN_TRAIT "chrono-gun" #define REVERSE_BEAR_TRAP_TRAIT "reverse-bear-trap" #define CURSED_MASK_TRAIT "cursed-mask" @@ -211,8 +208,6 @@ #define BEAUTY_ELEMENT_TRAIT "beauty_element" #define MOOD_DATUM_TRAIT "mood_datum" #define DRONE_SHY_TRAIT "drone_shy" -/// Trait given by stabilized light pink extracts -#define STABILIZED_LIGHT_PINK_EXTRACT_TRAIT "stabilized_light_pink" /// Trait given by adamantine extracts #define ADAMANTINE_EXTRACT_TRAIT "adamantine_extract" /// Given by the multiple_lives component to the previous body of the mob upon death. @@ -313,7 +308,7 @@ /// From the aquarium component #define AQUARIUM_TRAIT "aquarium" -/// Trait aquired from being painted a certain color +/// Trait acquired from being painted a certain color #define ATOM_COLOR_TRAIT "atom_color" /// Permanent trait from an overdose effect diff --git a/code/__DEFINES/turfs.dm b/code/__DEFINES/turfs.dm index 651b970796065..ac4f62f10ee98 100644 --- a/code/__DEFINES/turfs.dm +++ b/code/__DEFINES/turfs.dm @@ -15,15 +15,15 @@ #define RECT_TURFS(H_RADIUS, V_RADIUS, CENTER) \ block( \ - locate(max((CENTER).x-(H_RADIUS),1), max((CENTER).y-(V_RADIUS),1), (CENTER).z), \ - locate(min((CENTER).x+(H_RADIUS),world.maxx), min((CENTER).y+(V_RADIUS),world.maxy), (CENTER).z) \ + (CENTER).x - (H_RADIUS), (CENTER).y - (V_RADIUS), (CENTER).z, \ + (CENTER).x + (H_RADIUS), (CENTER).y + (V_RADIUS), (CENTER).z \ ) ///Returns all turfs in a zlevel -#define Z_TURFS(ZLEVEL) block(locate(1,1,ZLEVEL), locate(world.maxx, world.maxy, ZLEVEL)) +#define Z_TURFS(ZLEVEL) block(1, 1, ZLEVEL, world.maxx, world.maxy, ZLEVEL) ///Returns all currently loaded turfs -#define ALL_TURFS(...) block(locate(1, 1, 1), locate(world.maxx, world.maxy, world.maxz)) +#define ALL_TURFS(...) block(1, 1, 1, world.maxx, world.maxy, world.maxz) #define TURF_FROM_COORDS_LIST(List) (locate(List[1], List[2], List[3])) @@ -31,7 +31,7 @@ #define CORNER_BLOCK(corner, width, height) CORNER_BLOCK_OFFSET(corner, width, height, 0, 0) /// Returns a list of turfs similar to CORNER_BLOCK but with offsets -#define CORNER_BLOCK_OFFSET(corner, width, height, offset_x, offset_y) ((block(locate(corner.x + offset_x, corner.y + offset_y, corner.z), locate(min(corner.x + (width - 1) + offset_x, world.maxx), min(corner.y + (height - 1) + offset_y, world.maxy), corner.z)))) +#define CORNER_BLOCK_OFFSET(corner, width, height, offset_x, offset_y) ((block(corner.x + offset_x, corner.y + offset_y, corner.z, corner.x + (width - 1) + offset_x, corner.y + (height - 1) + offset_y, corner.z))) /// Returns an outline (neighboring turfs) of the given block #define CORNER_OUTLINE(corner, width, height) ( \ diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index 1ce2d5d46cb9c..7fa8f49cb7938 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -39,8 +39,8 @@ #define IS_VALID_ASSOC_KEY(V) (!isnum(V)) //hhmmm.. //General helpers -#define VV_HREF_TARGET_INTERNAL(target, href_key) "?_src_=vars;[HrefToken()];[href_key]=TRUE;[VV_HK_TARGET]=[REF(target)]" -#define VV_HREF_TARGETREF_INTERNAL(targetref, href_key) "?_src_=vars;[HrefToken()];[href_key]=TRUE;[VV_HK_TARGET]=[targetref]" +#define VV_HREF_TARGET_INTERNAL(target, href_key) "byond://?_src_=vars;[HrefToken()];[href_key]=TRUE;[VV_HK_TARGET]=[REF(target)]" +#define VV_HREF_TARGETREF_INTERNAL(targetref, href_key) "byond://?_src_=vars;[HrefToken()];[href_key]=TRUE;[VV_HK_TARGET]=[targetref]" #define VV_HREF_TARGET(target, href_key, text) "[text]" #define VV_HREF_TARGETREF(targetref, href_key, text) "[text]" #define VV_HREF_TARGET_1V(target, href_key, text, varname) "[text]" //for stuff like basic varedits, one variable diff --git a/code/__DEFINES/wiremod.dm b/code/__DEFINES/wiremod.dm index 421650e3bf1e7..b606f938869a1 100644 --- a/code/__DEFINES/wiremod.dm +++ b/code/__DEFINES/wiremod.dm @@ -123,6 +123,8 @@ #define CIRCUIT_FLAG_REFUSE_MODULE (1<<5) /// This circuit component cannot be inserted into the same circuit multiple times. Only use this for major headaches. #define CIRCUIT_NO_DUPLICATES (1<<6) +/// This circuit component is currently disabled via configs +#define CIRCUIT_FLAG_DISABLED (1<<7) // Datatype flags /// The datatype supports manual inputs diff --git a/code/__HELPERS/_dreamluau.dm b/code/__HELPERS/_dreamluau.dm index d8bb784c217a2..9436b95c55196 100644 --- a/code/__HELPERS/_dreamluau.dm +++ b/code/__HELPERS/_dreamluau.dm @@ -1,3 +1,4 @@ +#ifndef DISABLE_DREAMLUAU /* This comment bypasses grep checks */ /var/__dreamluau /* This comment also bypasses grep checks */ /var/__dreamluau_exists @@ -299,3 +300,4 @@ */ #define DREAMLUAU_CLEAR_REF_USERDATA(object) DREAMLUAU_CALL(clear_ref_userdata)((object)) +#endif diff --git a/code/__HELPERS/cameras.dm b/code/__HELPERS/cameras.dm deleted file mode 100644 index 9d74f3fe71b43..0000000000000 --- a/code/__HELPERS/cameras.dm +++ /dev/null @@ -1,35 +0,0 @@ -/** - * get_camera_list - * - * Builds a list of all available cameras that can be seen to networks_available - * Args: - * networks_available - List of networks that we use to see which cameras are visible to it. - */ -/proc/get_camera_list(list/networks_available) - var/list/all_camera_list = list() - for(var/obj/machinery/camera/camera as anything in GLOB.cameranet.cameras) - all_camera_list.Add(camera) - - camera_sort(all_camera_list) - - var/list/usable_camera_list = list() - - for(var/obj/machinery/camera/camera as anything in all_camera_list) - var/list/tempnetwork = camera.network & networks_available - if(length(tempnetwork)) - usable_camera_list["[camera.c_tag][camera.can_use() ? null : " (Deactivated)"]"] = camera - - return usable_camera_list - -///Sorts the list of cameras by their c_tag to display to players. -/proc/camera_sort(list/camera_list) - var/obj/machinery/camera/camera_comparing_a - var/obj/machinery/camera/camera_comparing_b - - for(var/i = length(camera_list), i > 0, i--) - for(var/j = 1 to i - 1) - camera_comparing_a = camera_list[j] - camera_comparing_b = camera_list[j + 1] - if(sorttext(camera_comparing_a.c_tag, camera_comparing_b.c_tag) < 0) - camera_list.Swap(j, j + 1) - return camera_list diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index 7451a99cdd2d2..21a5f00e31b31 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -227,3 +227,7 @@ /proc/cmp_rped_sort(obj/item/first_item, obj/item/second_item) ///even though stacks aren't stock parts, get_part_rating() is defined on the item level (see /obj/item/proc/get_part_rating()) and defaults to returning 0. return second_item.get_part_rating() - first_item.get_part_rating() + +/// Orders cameras by their `c_tag` ascending +/proc/cmp_camera_ctag_asc(obj/machinery/camera/a, obj/machinery/camera/b) + return sorttext(b.c_tag, a.c_tag) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 9b80dbfc169c4..44a94a93f7c62 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -349,4 +349,4 @@ message = html_encode(message) else message = copytext(message, 2) - to_chat(target, custom_boxed_message("purple_box", span_purple("[source]: [message]"))) + to_chat(target, custom_boxed_message("purple_box", span_purple("[source]: [message]")), type = MESSAGE_TYPE_INFO) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 583db80877305..9d9afc57bcb63 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -1184,28 +1184,37 @@ GLOBAL_LIST_EMPTY(transformation_animation_objects) animate(pixel_x = initialpixelx + rand(-pixelshiftx,pixelshiftx), pixel_y = initialpixely + rand(-pixelshifty,pixelshifty), time = shake_interval) animate(pixel_x = initialpixelx, pixel_y = initialpixely, time = shake_interval) -///Checks if the given iconstate exists in the given file, caching the result. Setting scream to TRUE will print a stack trace ONCE. -/proc/icon_exists(file, state, scream) +/// Checks whether a given icon state exists in a given icon file. If `file` and `state` both exist, +/// this will return `TRUE` - otherwise, it will return `FALSE`. +/// +/// If you want a stack trace to be output when the given state/file doesn't exist, use +/// `/proc/icon_exists_or_scream()`. +/proc/icon_exists(file, state) var/static/list/icon_states_cache = list() - if(icon_states_cache[file]?[state]) - return TRUE - - if(icon_states_cache[file]?[state] == FALSE) - return FALSE - - var/list/states = icon_states(file) + if(isnull(file) || isnull(state)) + return FALSE //This is common enough that it shouldn't panic, imo. - if(!icon_states_cache[file]) + if(isnull(icon_states_cache[file])) icon_states_cache[file] = list() + for(var/istate in icon_states(file)) + icon_states_cache[file][istate] = TRUE + + return !isnull(icon_states_cache[file][state]) - if(state in states) - icon_states_cache[file][state] = TRUE +/// Functions the same as `/proc/icon_exists()`, but with the addition of a stack trace if the +/// specified file or state doesn't exist. +/// +/// Stack traces will only be output once for each file. +/proc/icon_exists_or_scream(file, state) + if(icon_exists(file, state)) return TRUE - else - icon_states_cache[file][state] = FALSE - if(scream) - stack_trace("Icon Lookup for state: [state] in file [file] failed.") - return FALSE + + var/static/list/screams = list() + if(!isnull(screams[file])) + screams[file] = TRUE + stack_trace("State [state] in file [file] does not exist.") + + return FALSE /** * Returns the size of the sprite in tiles. diff --git a/code/__HELPERS/levels.dm b/code/__HELPERS/levels.dm index 927d8479b0dd8..7a3e53c6787df 100644 --- a/code/__HELPERS/levels.dm +++ b/code/__HELPERS/levels.dm @@ -41,7 +41,7 @@ return FALSE if(is_mining_level(what_turf.z)) - // Always assume Lavaland / mining level is a planet. (Astroid mining crying right now) + // Always assume Lavaland / mining level is a planet. (Asteroid mining crying right now) return TRUE if(is_station_level(what_turf.z)) diff --git a/code/__HELPERS/lighting.dm b/code/__HELPERS/lighting.dm index 96087ba173770..da6f4d1cee2e5 100644 --- a/code/__HELPERS/lighting.dm +++ b/code/__HELPERS/lighting.dm @@ -9,7 +9,7 @@ //Test to make sure emissives with broken or missing icon states are created if(PERFORM_ALL_TESTS(focus_only/invalid_emissives)) - if(icon_state && !icon_exists(icon, icon_state, scream = FALSE)) //Scream set to False so we can have a custom stack_trace + if(icon_state && !icon_exists(icon, icon_state)) stack_trace("An emissive appearance was added with non-existant icon_state \"[icon_state]\" in [icon]!") return appearance diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index ac3ff23b05e41..5d39ff4717746 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -6,10 +6,8 @@ var/time_string = time2text(world.timeofday, format) return show_ds ? "[time_string]:[world.timeofday % 10]" : time_string -/proc/gameTimestamp(format = "hh:mm:ss", wtime=null) - if(!wtime) - wtime = world.time - return time2text(wtime - GLOB.timezoneOffset, format) +/proc/gameTimestamp(format = "hh:mm:ss", wtime=world.time) + return time2text(wtime, format) /proc/station_time(display_only = FALSE, wtime=world.time) return ((((wtime - SSticker.round_start_time) * SSticker.station_time_rate_multiplier) + SSticker.gametime_offset) % 864000) - (display_only? GLOB.timezoneOffset : 0) diff --git a/code/__byond_version_compat.dm b/code/__byond_version_compat.dm index 769f3984cf1a0..207483b04078d 100644 --- a/code/__byond_version_compat.dm +++ b/code/__byond_version_compat.dm @@ -2,11 +2,11 @@ //Update this whenever you need to take advantage of more recent byond features #define MIN_COMPILER_VERSION 515 -#define MIN_COMPILER_BUILD 1627 -#if (DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD) && !defined(SPACEMAN_DMM) +#define MIN_COMPILER_BUILD 1642 +#if (DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD) && !defined(SPACEMAN_DMM) && !defined(OPENDREAM) //Don't forget to update this part #error Your version of BYOND is too out-of-date to compile this project. Go to https://secure.byond.com/download and update. -#error You need version 515.1627 or higher +#error You need version 515.1642 or higher #endif // Unable to compile this version thanks to mutable appearance changes diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 2bd9309406a0a..ee53eb99b8d73 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -106,6 +106,16 @@ /// If this is uncommented, will profile mapload atom initializations // #define PROFILE_MAPLOAD_INIT_ATOM +/// If uncommented, Dreamluau will be fully disabled. +// #define DISABLE_DREAMLUAU + +// OpenDream currently doesn't support byondapi, so automatically disable it on OD, +// unless CIBUILDING is defined - we still want to lint dreamluau-related code. +// Get rid of this whenever it does have support. +#if defined(OPENDREAM) && !defined(SPACEMAN_DMM) && !defined(CIBUILDING) +#define DISABLE_DREAMLUAU +#endif + /// If this is uncommented, force our verb processing into just the 2% of a tick /// We normally reserve for it /// NEVER run this on live, it's for simulating highpop only diff --git a/code/_globalvars/admin.dm b/code/_globalvars/admin.dm index e14a56c16814c..9ec52cd550dbd 100644 --- a/code/_globalvars/admin.dm +++ b/code/_globalvars/admin.dm @@ -143,7 +143,7 @@ GLOBAL_LIST_INIT(spanname_to_formatting, list( "Tape Recorder" = "tape_recorder", "Tiny Notice" = "tinynotice", "Tiny Notice Italic" = "tinynoticeital", - "Unconcious" = "unconscious", + "Unconscious" = "unconscious", "User Danger" = "userdanger", "Warning" = "warning", "Yelling" = "yell", diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 6fba866b857db..44a3d50a86fae 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -173,7 +173,6 @@ DEFINE_BITFIELD(item_flags, list( "ABSTRACT" = ABSTRACT, "BEING_REMOVED" = BEING_REMOVED, "DROPDEL" = DROPDEL, - "EXAMINE_SKIP" = EXAMINE_SKIP, "FORCE_STRING_OVERRIDE" = FORCE_STRING_OVERRIDE, "HAND_ITEM" = HAND_ITEM, "IGNORE_DIGITIGRADE" = IGNORE_DIGITIGRADE, diff --git a/code/_globalvars/lists/canisters.dm b/code/_globalvars/lists/canisters.dm index f8ec95f602051..746a8456d71c3 100644 --- a/code/_globalvars/lists/canisters.dm +++ b/code/_globalvars/lists/canisters.dm @@ -25,5 +25,5 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) GAS_ZAUKER = /obj/machinery/portable_atmospherics/canister/zauker, GAS_HELIUM = /obj/machinery/portable_atmospherics/canister/helium, GAS_ANTINOBLIUM = /obj/machinery/portable_atmospherics/canister/antinoblium, - GAS_HALON = /obj/machinery/portable_atmospherics/canister/halon + GAS_HALON = /obj/machinery/portable_atmospherics/canister/halon, )) diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 6024f7991388d..73c75fec3bac7 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -30,7 +30,6 @@ GLOBAL_LIST_INIT(abstract_mob_types, list( /mob/living/simple_animal/hostile/asteroid, /mob/living/simple_animal/hostile/megafauna, /mob/living/basic/mimic, // Cannot exist if spawned without being passed an item reference - /mob/living/simple_animal/hostile/retaliate, /mob/living/simple_animal/hostile, /mob/living/simple_animal/soulscythe, // As mimic, can't exist if spawned outside an item /mob/living/simple_animal, diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm index c482722fbf901..5871cf56198b3 100644 --- a/code/_globalvars/phobias.dm +++ b/code/_globalvars/phobias.dm @@ -69,10 +69,10 @@ GLOBAL_LIST_INIT(phobia_mobs, list( "birds" = typecacheof(list( /mob/living/basic/chick, /mob/living/basic/chicken, + /mob/living/basic/goose, /mob/living/basic/parrot, /mob/living/basic/pet/penguin, /mob/living/basic/raptor, - /mob/living/simple_animal/hostile/retaliate/goose, )), "conspiracies" = typecacheof(list( /mob/living/basic/drone, @@ -400,6 +400,7 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/storage/toolbox/fishing, /obj/item/stack/sheet/animalhide/carp, /obj/item/toy/plush/carpplushie, + /obj/item/storage/bag/fishing, )), "greytide" = (typecacheof(list( /obj/item/clothing/under/color/grey, diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index f79c442505c69..3464461f8729f 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -102,6 +102,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "STATION_TRAIT_BRIGHT_DAY" = STATION_TRAIT_BRIGHT_DAY, "STATION_TRAIT_CARP_INFESTATION" = STATION_TRAIT_CARP_INFESTATION, "STATION_TRAIT_CYBERNETIC_REVOLUTION" = STATION_TRAIT_CYBERNETIC_REVOLUTION, + "STATION_TRAIT_ECONOMY_ALERTS" = STATION_TRAIT_ECONOMY_ALERTS, "STATION_TRAIT_EMPTY_MAINT" = STATION_TRAIT_EMPTY_MAINT, "STATION_TRAIT_FILLED_MAINT" = STATION_TRAIT_FILLED_MAINT, "STATION_TRAIT_FORESTED" = STATION_TRAIT_FORESTED, @@ -151,7 +152,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_AIRLOCK_SHOCKIMMUNE" = TRAIT_AIRLOCK_SHOCKIMMUNE, "TRAIT_AI_BAGATTACK" = TRAIT_AI_BAGATTACK, "TRAIT_ALCOHOL_TOLERANCE" = TRAIT_ALCOHOL_TOLERANCE, - "TRAIT_ALLOWED_HONORBOUND_ATTACK" = TRAIT_ALLOWED_HONORBOUND_ATTACK, "TRAIT_ALLOW_HERETIC_CASTING" = TRAIT_ALLOW_HERETIC_CASTING, "TRAIT_ALWAYS_WANTED" = TRAIT_ALWAYS_WANTED, "TRAIT_ANALGESIA" = TRAIT_ANALGESIA, @@ -210,6 +210,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_CRITICAL_CONDITION" = TRAIT_CRITICAL_CONDITION, "TRAIT_CULT_HALO" = TRAIT_CULT_HALO, "TRAIT_CURSED" = TRAIT_CURSED, + "TRAIT_DAZED" = TRAIT_DAZED, "TRAIT_DEAF" = TRAIT_DEAF, "TRAIT_DEATHCOMA" = TRAIT_DEATHCOMA, "TRAIT_DEFIB_BLACKLISTED" = TRAIT_DEFIB_BLACKLISTED, @@ -340,7 +341,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_MAGICALLY_PHASED" = TRAIT_MAGICALLY_PHASED, "TRAIT_MARTIAL_ARTS_IMMUNE" = TRAIT_MARTIAL_ARTS_IMMUNE, "TRAIT_MANSUS_TOUCHED" = TRAIT_MANSUS_TOUCHED, - "TRAIT_MEDIBOTCOMINGTHROUGH" = TRAIT_MEDIBOTCOMINGTHROUGH, "TRAIT_MEDICAL_HUD" = TRAIT_MEDICAL_HUD, "TRAIT_MESON_VISION" = TRAIT_MESON_VISION, "TRAIT_MIME_FAN" = TRAIT_MIME_FAN, @@ -517,7 +517,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_STRONG_STOMACH" = TRAIT_STRONG_STOMACH, "TRAIT_STUBBY_BODY" = TRAIT_STUBBY_BODY, "TRAIT_STUNIMMUNE" = TRAIT_STUNIMMUNE, - "TRAIT_STUN_ON_NEXT_SHOVE" = TRAIT_STUN_ON_NEXT_SHOVE, "TRAIT_STURDY_FRAME" = TRAIT_STURDY_FRAME, "TRAIT_SUCCUMB_OVERRIDE" = TRAIT_SUCCUMB_OVERRIDE, "TRAIT_SUICIDED" = TRAIT_SUICIDED, @@ -608,6 +607,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_CONTRABAND_BLOCKER" = TRAIT_CONTRABAND_BLOCKER, "TRAIT_CUSTOM_TAP_SOUND" = TRAIT_CUSTOM_TAP_SOUND, "TRAIT_DANGEROUS_OBJECT" = TRAIT_DANGEROUS_OBJECT, + "TRAIT_EXAMINE_SKIP" = TRAIT_EXAMINE_SKIP, "TRAIT_FIREDOOR_OPENER" = TRAIT_FIREDOOR_OPENER, "TRAIT_FISHING_BAIT" = TRAIT_FISHING_BAIT, "TRAIT_FOOD_BBQ_GRILLED" = TRAIT_FOOD_BBQ_GRILLED, @@ -625,6 +625,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NO_TELEPORT" = TRAIT_NO_TELEPORT, "TRAIT_NO_SIDE_KICK" = TRAIT_NO_SIDE_KICK, "TRAIT_NODROP" = TRAIT_NODROP, + "TRAIT_NO_WORN_ICON" = TRAIT_NO_WORN_ICON, "TRAIT_OMNI_BAIT" = TRAIT_OMNI_BAIT, "TRAIT_PLANT_WILDMUTATE" = TRAIT_PLANT_WILDMUTATE, "TRAIT_POISONOUS_BAIT" = TRAIT_POISONOUS_BAIT, @@ -682,6 +683,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_RESIST_PSYCHIC" = TRAIT_RESIST_PSYCHIC, "TRAIT_FISH_WELL_COOKED" = TRAIT_FISH_WELL_COOKED, "TRAIT_YUCKY_FISH" = TRAIT_YUCKY_FISH, + "TRAIT_NO_FISHING_ACHIEVEMENT" = TRAIT_NO_FISHING_ACHIEVEMENT, ), /obj/item/fishing_rod = list( "TRAIT_ROD_ATTRACT_SHINY_LOVERS" = TRAIT_ROD_ATTRACT_SHINY_LOVERS, diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index d77735b7a6b6e..44f451af599e2 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -75,6 +75,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_CORPSELOCKED" = TRAIT_CORPSELOCKED, "TRAIT_CRITICAL_CONDITION" = TRAIT_CRITICAL_CONDITION, "TRAIT_CULT_HALO" = TRAIT_CULT_HALO, + "TRAIT_DAZED" = TRAIT_DAZED, "TRAIT_DEAF" = TRAIT_DEAF, "TRAIT_DEATHCOMA" = TRAIT_DEATHCOMA, "TRAIT_DEFIB_BLACKLISTED" = TRAIT_DEFIB_BLACKLISTED, @@ -298,7 +299,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_TOO_TALL" = TRAIT_TOO_TALL, "TRAIT_TOXIMMUNE" = TRAIT_TOXIMMUNE, "TRAIT_TOXINLOVER" = TRAIT_TOXINLOVER, - "TRAIT_MEDIBOTCOMINGTHROUGH" = TRAIT_MEDIBOTCOMINGTHROUGH, "TRAIT_TUMOR_SUPPRESSION" = TRAIT_TUMOR_SUPPRESSED, "TRAIT_UI_BLOCKED" = TRAIT_UI_BLOCKED, "TRAIT_UNCONVERTABLE" = TRAIT_UNCONVERTABLE, diff --git a/code/_onclick/hud/rendering/plane_master_group.dm b/code/_onclick/hud/rendering/plane_master_group.dm index 4bed46f983f4a..27efc2a995e3d 100644 --- a/code/_onclick/hud/rendering/plane_master_group.dm +++ b/code/_onclick/hud/rendering/plane_master_group.dm @@ -51,15 +51,15 @@ #warn Fully change default relay_loc to "1,1", rather than changing it based on client version #endif - if(viewing_hud.mymob?.client?.byond_version > 515) - relay_loc = "1,1" - rebuild_plane_masters() - set_hud(viewing_hud) our_hud.master_groups[key] = src show_hud() build_planes_offset(our_hud, active_offset) + if(viewing_hud.mymob?.client?.byond_version > 515) + relay_loc = "1,1" + rebuild_plane_masters() + /// Well, refresh our group, mostly useful for plane specific updates /datum/plane_master_group/proc/refresh_hud() hide_hud() @@ -70,6 +70,7 @@ hide_hud() rebuild_plane_masters() show_hud() + our_hud.update_parallax_pref() build_planes_offset(our_hud, active_offset) /// Regenerate our plane masters, this is useful if we don't have a mob but still want to rebuild. Such in the case of changing the screen_loc of relays @@ -195,19 +196,16 @@ /// If you wanna try someday feel free, but I can't manage it /datum/plane_master_group/popup -/// This is janky as hell but since something changed with CENTER positioning after build 1614 we have to switch to the bandaid LEFT,TOP positioning -/// using LEFT,TOP *at* or *before* 1614 will result in another broken offset for cameras -#define MAX_CLIENT_BUILD_WITH_WORKING_SECONDARY_MAPS 1614 - +/// Note do not use return ..() because it will cause client crush when screen gets deleted +/// TOOD: Remove this entirely when 516 is stable /datum/plane_master_group/popup/attach_to(datum/hud/viewing_hud) - // If we're about to display this group to a mob who's client is more recent than the last known version with working CENTER, then we need to remake the relays - // with the correct screen_loc using the relay override - if(viewing_hud.mymob?.client?.byond_build > MAX_CLIENT_BUILD_WITH_WORKING_SECONDARY_MAPS) - relay_loc = "LEFT,TOP" - rebuild_plane_masters() - return ..() - -#undef MAX_CLIENT_BUILD_WITH_WORKING_SECONDARY_MAPS + if(viewing_hud.master_groups[key]) + stack_trace("[key] is already in use by a plane master group on the passed in hud, belonging to [viewing_hud.mymob]!") + return + relay_loc = "1,1" + rebuild_plane_masters() + set_hud(viewing_hud) + show_hud() /datum/plane_master_group/popup/build_planes_offset(datum/hud/source, new_offset, use_scale = TRUE) return ..(source, new_offset, FALSE) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index fefd4ea889dad..0e69d2bfcaaa2 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -137,6 +137,7 @@ icon = 'icons/hud/screen_midnight.dmi' icon_state = "craft" screen_loc = ui_crafting + mouse_over_pointer = MOUSE_HAND_POINTER /atom/movable/screen/area_creator name = "create new area" diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 70da5ac19de3a..ee4d8f2deee79 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -315,7 +315,7 @@ if(user != src) // This doesn't factor in armor, or most damage modifiers (physiology). Your mileage may vary - if(check_block(attacking_item, damage, "the [attacking_item.name]", MELEE_ATTACK, attacking_item.armour_penetration, attacking_item.damtype)) + if(check_block(attacking_item, damage, "\the [attacking_item]", MELEE_ATTACK, attacking_item.armour_penetration, attacking_item.damtype)) return FALSE SEND_SIGNAL(attacking_item, COMSIG_ITEM_ATTACK_ZONE, src, user, targeting) diff --git a/code/controllers/admin.dm b/code/controllers/admin.dm index 5056e3804ef11..d96b362847c51 100644 --- a/code/controllers/admin.dm +++ b/code/controllers/admin.dm @@ -59,11 +59,12 @@ ADMIN_VERB(debug_controller, R_DEBUG, "Debug Controller", "Debug the various per var/list/controllers = list() var/list/controller_choices = list() - for (var/datum/controller/controller in world) - if (istype(controller, /datum/controller/subsystem)) + for (var/var_key in global.vars) + var/datum/controller/controller = global.vars[var_key] + if(!istype(controller) || istype(controller, /datum/controller/subsystem)) continue - controllers["[controller] (controller.type)"] = controller //we use an associated list to ensure clients can't hold references to controllers - controller_choices += "[controller] (controller.type)" + controllers[controller.name] = controller //we use an associated list to ensure clients can't hold references to controllers + controller_choices += controller.name var/datum/controller/controller_string = input("Select controller to debug", "Debug Controller") as null|anything in controller_choices var/datum/controller/controller = controllers[controller_string] diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm index 7f28c361267f1..303b6db3bd247 100644 --- a/code/controllers/configuration/config_entry.dm +++ b/code/controllers/configuration/config_entry.dm @@ -11,7 +11,7 @@ var/modified = FALSE /// The config name of a configuration type that depricates this, if it exists var/deprecated_by - /// The /datum/config_entry type that supercedes this one + /// The /datum/config_entry type that supersedes this one var/protection = NONE /// Do not instantiate if type matches this var/abstract_type = /datum/config_entry diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 3648a1b564e8c..de78c24aacfe9 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -310,6 +310,8 @@ /datum/config_entry/string/server +/datum/config_entry/string/public_address + /datum/config_entry/string/banappeals /datum/config_entry/string/wikiurl diff --git a/code/controllers/subsystem/ambience.dm b/code/controllers/subsystem/ambience.dm index 4b64c1ddf8263..80e15349212b7 100644 --- a/code/controllers/subsystem/ambience.dm +++ b/code/controllers/subsystem/ambience.dm @@ -80,7 +80,7 @@ SUBSYSTEM_DEF(ambience) 'sound/items/tools/crowbar.ogg', 'sound/items/deconstruct.ogg', 'sound/ambience/misc/source_holehit3.ogg', - 'sound/ambience//misc/cavesound3.ogg', + 'sound/ambience/misc/cavesound3.ogg', ) /area/station/maintenance/play_ambience(mob/M, sound/override_sound, volume) diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm index 8c6f9706b3a0e..7ceb2f56ed018 100644 --- a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm @@ -983,7 +983,7 @@ cost = 5 minimum_players = 5 repeatable = TRUE - signup_item_path = /obj/item/cosmic_skull + signup_item_path = /obj/item/clothing/head/helmet/skull/cosmic ruleset_lazy_templates = list(LAZY_TEMPLATE_KEY_VOIDWALKER_VOID) /// The space turf we find in acceptable(), cached for ease var/space_turf diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm index 9789b58e8b964..709f6a72d687b 100644 --- a/code/controllers/subsystem/economy.dm +++ b/code/controllers/subsystem/economy.dm @@ -172,9 +172,22 @@ SUBSYSTEM_DEF(economy) fluff_string = ", but company countermeasures protect YOU from being affected!" else fluff_string = ", and company countermeasures are failing to protect YOU from being affected. We're all doomed!" - //earning_report = "Sector Economic Report

Sector vendor prices is currently at [SSeconomy.inflation_value()*100]%[fluff_string]

The station spending power is currently [station_total] Credits, and the crew's targeted allowance is at [station_target] Credits.

[SSstock_market.news_string] That's all from the Nanotrasen Economist Division." // ORIGINAL - earning_report = "Sector Economic Report

Sector vendor prices is currently at [SSeconomy.inflation_value()*100]%[fluff_string]

The station spending power is currently [station_total] Credits, and the crew's targeted allowance is at [station_target] Credits.

[SSstock_market.news_string] That's all from the Port Authority Economist Division." // DOPPLER EDIT - NT -> PA - GLOB.news_network.submit_article(earning_report, "Station Earnings Report", "Station Announcements", null, update_alert = FALSE) + earning_report = "Sector Economic Report

Sector vendor prices is currently at [SSeconomy.inflation_value()*100]%[fluff_string]

The station spending power is currently [station_total] Credits, and the crew's targeted allowance is at [station_target] Credits.

[SSstock_market.news_string]" + var/update_alerts = FALSE + if(HAS_TRAIT(SSstation, STATION_TRAIT_ECONOMY_ALERTS)) + var/datum/bank_account/moneybags + var/static/list/typecache_bank = typecacheof(list(/datum/bank_account/department, /datum/bank_account/remote)) + for(var/i in bank_accounts_by_id) + var/datum/bank_account/current_acc = bank_accounts_by_id[i] + if(typecache_bank[current_acc.type]) + continue + if(!moneybags || moneybags.account_balance < current_acc.account_balance) + moneybags = current_acc + earning_report += "Our GMM Spotlight would like to alert you that [moneybags.account_holder] is your station's most affulent crewmate! They've hit it big with [moneybags.account_balance] credits saved. " + update_alerts = TRUE + inflict_moneybags(moneybags) + earning_report += "That's all from the Port Authority Economist Division." // DOPPLER EDIT, NT > PA - old code: earning_report += "That's all from the Nanotrasen Economist Division." + GLOB.news_network.submit_article(earning_report, "Station Earnings Report", "Station Announcements", null, update_alert = update_alerts) return TRUE /** @@ -232,6 +245,18 @@ SUBSYSTEM_DEF(economy) var/obj/machinery/vending/vending = prices_to_update[i] vending.reset_prices(vending.product_records, vending.coin_records + vending.hidden_records) +/datum/controller/subsystem/economy/proc/inflict_moneybags(datum/bank_account/moneybags) + if(!moneybags) + return FALSE + var/mob/living/card_holder + for(var/obj/card in moneybags?.bank_cards) + if(isidcard(card)) + card_holder = recursive_loc_check(card, /mob/living) + if(!isliving(card_holder)) //If on a living mob + return FALSE + card_holder.adjust_timed_status_effect(wait, /datum/status_effect/spotlight_light) + return TRUE + #undef ECON_DEPARTMENT_STEP #undef ECON_ACCOUNT_STEP #undef ECON_PRICE_UPDATE_STEP diff --git a/code/controllers/subsystem/explosions.dm b/code/controllers/subsystem/explosions.dm index 2b61cabb86074..36dbba09eae01 100644 --- a/code/controllers/subsystem/explosions.dm +++ b/code/controllers/subsystem/explosions.dm @@ -635,23 +635,27 @@ ADMIN_VERB(check_bomb_impacts, R_DEBUG, "Check Bomb Impact", "See what the effec // top left to one before top right if(highest_y <= max_y) candidates += block( - locate(max(lowest_x, 1), highest_y, our_z), - locate(min(highest_x - 1, max_x), highest_y, our_z)) + lowest_x, highest_y, our_z, + highest_x - 1, highest_y, our_z + ) // top right to one before bottom right if(highest_x <= max_x) candidates += block( - locate(highest_x, min(highest_y, max_y), our_z), - locate(highest_x, max(lowest_y + 1, 1), our_z)) + highest_x, highest_y, our_z, + highest_x, lowest_y + 1, our_z + ) // bottom right to one before bottom left if(lowest_y >= 1) candidates += block( - locate(min(highest_x, max_x), lowest_y, our_z), - locate(max(lowest_x + 1, 1), lowest_y, our_z)) + highest_x, lowest_y, our_z, + lowest_x + 1, lowest_y, our_z + ) // bottom left to one before top left if(lowest_x >= 1) candidates += block( - locate(lowest_x, max(lowest_y, 1), our_z), - locate(lowest_x, min(highest_y - 1, max_y), our_z)) + lowest_x, lowest_y, our_z, + lowest_x, highest_y - 1, our_z + ) if(!do_directional) outlist += candidates diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index ad1b9e4132fed..b9c8a08ca751e 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -346,7 +346,9 @@ SUBSYSTEM_DEF(garbage) /// 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) if(!istype(to_delete)) +#ifndef DISABLE_DREAMLUAU DREAMLUAU_CLEAR_REF_USERDATA(to_delete) +#endif del(to_delete) return diff --git a/code/controllers/subsystem/id_access.dm b/code/controllers/subsystem/id_access.dm index 35b543b2c6d34..1a94a13389d8c 100644 --- a/code/controllers/subsystem/id_access.dm +++ b/code/controllers/subsystem/id_access.dm @@ -433,14 +433,14 @@ SUBSYSTEM_DEF(id_access) id_card.update_icon() /** - * Applies a trim to a chameleon card. This is purely visual, utilising the card's override vars. + * Applies a trim to a card. This is purely visual, utilising the card's override vars. * * Arguments: - * * id_card - The chameleon card to apply the trim visuals to. -* * trim_path - A trim path to apply to the card. Grabs the trim's associated singleton and applies it. + * * id_card - The card to apply the trim visuals to. + * * trim_path - A trim path to apply to the card. Grabs the trim's associated singleton and applies it. * * check_forged - Boolean value. If TRUE, will not overwrite the card's assignment if the card has been forged. */ -/datum/controller/subsystem/id_access/proc/apply_trim_to_chameleon_card(obj/item/card/id/advanced/chameleon/id_card, trim_path, check_forged = TRUE) +/datum/controller/subsystem/id_access/proc/apply_trim_override(obj/item/card/id/advanced/id_card, trim_path, check_forged = TRUE) var/datum/id_trim/trim = trim_singletons_by_path[trim_path] id_card.trim_icon_override = trim.trim_icon id_card.trim_state_override = trim.trim_state @@ -452,22 +452,21 @@ SUBSYSTEM_DEF(id_access) id_card.big_pointer = trim.big_pointer id_card.pointer_color = trim.pointer_color - if (!check_forged || !id_card.forged) - id_card.assignment = trim.assignment + var/obj/item/card/id/advanced/chameleon/cham_id = id_card + if (istype(cham_id) && (!check_forged || !cham_id.forged)) + cham_id.assignment = trim.assignment if (ishuman(id_card.loc)) var/mob/living/carbon/human/owner = id_card.loc owner.sec_hud_set_ID() - // We'll let the chameleon action update the card's label as necessary instead of doing it here. - /** - * Removes a trim from a chameleon ID card. + * Removes a trim from a ID card. * * Arguments: * * id_card - The ID card to remove the trim from. */ -/datum/controller/subsystem/id_access/proc/remove_trim_from_chameleon_card(obj/item/card/id/advanced/chameleon/id_card) +/datum/controller/subsystem/id_access/proc/remove_trim_override(obj/item/card/id/advanced/id_card) id_card.trim_icon_override = null id_card.trim_state_override = null id_card.trim_assignment_override = null diff --git a/code/controllers/subsystem/lua.dm b/code/controllers/subsystem/lua.dm index 99df8cf335490..2d199ccd3dcc3 100644 --- a/code/controllers/subsystem/lua.dm +++ b/code/controllers/subsystem/lua.dm @@ -1,3 +1,4 @@ +#ifndef DISABLE_DREAMLUAU SUBSYSTEM_DEF(lua) name = "Lua Scripting" runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT @@ -156,3 +157,4 @@ SUBSYSTEM_DEF(lua) continue state.log_result(json_data) return +#endif diff --git a/code/controllers/subsystem/map_vote.dm b/code/controllers/subsystem/map_vote.dm index f57d73d773e63..d8a05cb9a817c 100644 --- a/code/controllers/subsystem/map_vote.dm +++ b/code/controllers/subsystem/map_vote.dm @@ -53,7 +53,7 @@ SUBSYSTEM_DEF(map_vote) last_message_at = world.time var/list/messages = args.Copy() - to_chat(world, span_purple(boxed_message("Map Vote\n
[messages.Join("\n")]"))) + to_chat(world, span_purple(boxed_message("Map Vote

[jointext(messages, "
")]"))) /datum/controller/subsystem/map_vote/proc/finalize_map_vote(datum/vote/map_vote/map_vote) if(already_voted) @@ -170,4 +170,7 @@ SUBSYSTEM_DEF(map_vote) for(var/map_id in map_vote_cache) var/datum/map_config/map = config.maplist[map_id] data += "[map.map_name] - [map_vote_cache[map_id]]" - tally_printout = boxed_message("Current Tallies\n
[data.Join("\n")]") + var/tally_msg = span_tooltip("A map's tallies are reset after it wins a vote. \ + Otherwise, they are carried over and added onto from the next vote on the next round, \ + until it eventually wins and is reset.", "Current Tallies") + tally_printout = boxed_message("[tally_msg]

[jointext(data, "
")]") diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 603e9c972aed5..a3aa85e62bfab 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -677,10 +677,11 @@ ADMIN_VERB(load_away_mission, R_FUN, "Load Away Mission", "Load a specific away if(!level_trait(z,ZTRAIT_RESERVED)) clearing_reserved_turfs = FALSE CRASH("Invalid z level prepared for reservations.") - var/turf/A = get_turf(locate(SHUTTLE_TRANSIT_BORDER,SHUTTLE_TRANSIT_BORDER,z)) - var/turf/B = get_turf(locate(world.maxx - SHUTTLE_TRANSIT_BORDER,world.maxy - SHUTTLE_TRANSIT_BORDER,z)) - var/block = block(A, B) - for(var/turf/T as anything in block) + var/list/reserved_block = block( + SHUTTLE_TRANSIT_BORDER, SHUTTLE_TRANSIT_BORDER, z, + world.maxx - SHUTTLE_TRANSIT_BORDER, world.maxy - SHUTTLE_TRANSIT_BORDER, z + ) + for(var/turf/T as anything in reserved_block) // No need to empty() these, because they just got created and are already /turf/open/space/basic. T.turf_flags = UNUSED_RESERVATION_TURF T.blocks_air = TRUE @@ -690,7 +691,7 @@ ADMIN_VERB(load_away_mission, R_FUN, "Load Away Mission", "Load a specific away if(SSatoms.initialized) SSatoms.InitializeAtoms(Z_TURFS(z)) - unused_turfs["[z]"] = block + unused_turfs["[z]"] = reserved_block reservation_ready["[z]"] = TRUE clearing_reserved_turfs = FALSE diff --git a/code/controllers/subsystem/overlays.dm b/code/controllers/subsystem/overlays.dm index fda892be7a432..96041edd4237a 100644 --- a/code/controllers/subsystem/overlays.dm +++ b/code/controllers/subsystem/overlays.dm @@ -47,8 +47,7 @@ SUBSYSTEM_DEF(overlays) if (istext(overlay)) // This is too expensive to run normally but running it during CI is a good test if (PERFORM_ALL_TESTS(focus_only/invalid_overlays)) - var/list/icon_states_available = icon_states(icon) - if(!(overlay in icon_states_available)) + if(!icon_exists(icon, overlay)) var/icon_file = "[icon]" || "Unknown Generated Icon" stack_trace("Invalid overlay: Icon object '[icon_file]' [REF(icon)] used in '[src]' [type] is missing icon state [overlay].") continue diff --git a/code/controllers/subsystem/processing/fishing.dm b/code/controllers/subsystem/processing/fishing.dm index dd4dc3775359b..01474a2b1f29b 100644 --- a/code/controllers/subsystem/processing/fishing.dm +++ b/code/controllers/subsystem/processing/fishing.dm @@ -1,7 +1,7 @@ /// subsystem for the fishing minigame processing. PROCESSING_SUBSYSTEM_DEF(fishing) name = "Fishing" - flags = SS_BACKGROUND|SS_POST_FIRE_TIMING + flags = SS_BACKGROUND wait = 0.05 SECONDS // If you raise it to 0.1 SECONDS, you better also modify [datum/fish_movement/move_fish()] ///A list of cached fish icons var/list/cached_fish_icons diff --git a/code/controllers/subsystem/processing/priority_effects.dm b/code/controllers/subsystem/processing/priority_effects.dm new file mode 100644 index 0000000000000..ee4fb7f7f6dc2 --- /dev/null +++ b/code/controllers/subsystem/processing/priority_effects.dm @@ -0,0 +1,6 @@ +PROCESSING_SUBSYSTEM_DEF(priority_effects) + name = "Priority Status Effects" + flags = SS_TICKER | SS_KEEP_TIMING | SS_NO_INIT + wait = 2 // Not seconds - we're running on SS_TICKER, so this is ticks. + priority = FIRE_PRIORITY_PRIORITY_EFFECTS + stat_tag = "PEFF" diff --git a/code/datums/actions/mobs/charge.dm b/code/datums/actions/mobs/charge.dm index 43cbb05c939ff..e12c93289c6a3 100644 --- a/code/datums/actions/mobs/charge.dm +++ b/code/datums/actions/mobs/charge.dm @@ -216,7 +216,7 @@ var/mob/living/living_target = target if(ishuman(living_target)) var/mob/living/carbon/human/human_target = living_target - if(human_target.check_block(source, 0, "the [source.name]", attack_type = LEAP_ATTACK) && living_source) + if(human_target.check_block(source, 0, "\the [source]", attack_type = LEAP_ATTACK) && living_source) living_source.Stun(recoil_duration, ignore_canstun = TRUE) return diff --git a/code/datums/actions/mobs/open_mob_commands.dm b/code/datums/actions/mobs/open_mob_commands.dm index e7ffd104effbe..84a65a804a7d2 100644 --- a/code/datums/actions/mobs/open_mob_commands.dm +++ b/code/datums/actions/mobs/open_mob_commands.dm @@ -23,4 +23,4 @@ if(our_mob_resolved) var/datum/component/obeys_commands/command_component = our_mob_resolved.GetComponent(/datum/component/obeys_commands) if(command_component) - command_component.display_menu(our_mob_resolved, owner) + command_component.display_menu(owner) diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index 9f504dad89da2..2cdcfc254f770 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -294,6 +294,7 @@ multiple modular subtrees with behaviors if(isnull(pawn)) return // instantiated without an applicable pawn, fine + SEND_SIGNAL(src, COMSIG_AI_CONTROLLER_UNPOSSESSED_PAWN) set_ai_status(AI_STATUS_OFF) UnregisterSignal(pawn, list(COMSIG_MOVABLE_Z_CHANGED, COMSIG_MOB_LOGIN, COMSIG_MOB_LOGOUT, COMSIG_MOB_STATCHANGE, COMSIG_QDELETING)) clear_able_to_run() diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/ventcrawling.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/ventcrawling.dm index aca89d832814a..06fcfa1472623 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/ventcrawling.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/ventcrawling.dm @@ -82,7 +82,8 @@ if(!HAS_TRAIT(living_pawn, TRAIT_MOVE_VENTCRAWLING) && isturf(get_turf(living_pawn))) // we're out of the vents, so no need to do an exit // assume that we got yeeted out somehow and return this so we can halt the suicide pill timer. - return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED + finish_action(controller, TRUE, target_key) + return living_pawn.forceMove(exit_vent) if(!living_pawn.can_enter_vent(exit_vent, provide_feedback = FALSE)) @@ -90,7 +91,8 @@ emergency_vent = calculate_exit_vent(controller) if(isnull(emergency_vent)) // it's joever. we cooked too hard. - return suicide_pill(controller) | AI_BEHAVIOR_DELAY + suicide_pill(controller) + return controller.set_blackboard_key(BB_EXIT_VENT_TARGET, emergency_vent) // assign and go again addtimer(CALLBACK(src, PROC_REF(exit_the_vents), controller), (rand(controller.blackboard[BB_LOWER_VENT_TIME_LIMIT], controller.blackboard[BB_UPPER_VENT_TIME_LIMIT]) / 2)) // we're in danger mode, so scurry out at half the time it would normally take. @@ -99,9 +101,11 @@ living_pawn.handle_ventcrawl(exit_vent) if(HAS_TRAIT(living_pawn, TRAIT_MOVE_VENTCRAWLING)) // how'd we fail? what the fuck stack_trace("We failed to exit the vents, even though we should have been fine? This is very weird.") - return suicide_pill(controller) | AI_BEHAVIOR_DELAY // all of the prior checks say we should have definitely made it through, but we didn't. dammit. + suicide_pill(controller) + return - return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED // we did it! we went into the vents and out of the vents. poggers. + finish_action(controller, TRUE, target_key) + return /// Incredibly stripped down version of the overarching `can_enter_vent` proc on `/mob, just meant for rapid rechecking of a vent. Will be TRUE if not blocked, FALSE otherwise. /datum/ai_behavior/crawl_through_vents/proc/is_vent_valid(obj/machinery/atmospherics/components/unary/vent_pump/checkable) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm b/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm index feca986909302..9b3e2883290e7 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm @@ -8,6 +8,8 @@ var/found_food_key = BB_TARGET_FOOD ///key holding any emotes we play after eating food var/emotes_blackboard_list = BB_EAT_EMOTES + ///key where we store our search range + var/search_range = BB_SEARCH_RANGE /datum/ai_planning_subtree/find_food/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) var/list/foods_list = controller.blackboard[food_list_key] @@ -15,9 +17,11 @@ CRASH("the types of food has not been supplied in the [food_list_key] key!") if(controller.blackboard[BB_NEXT_FOOD_EAT] > world.time) return + if(!controller.blackboard_key_exists(found_food_key)) - controller.queue_behavior(finding_behavior, found_food_key, foods_list) + controller.queue_behavior(finding_behavior, found_food_key, foods_list, controller.blackboard[BB_SEARCH_RANGE]) return + controller.queue_behavior(/datum/ai_behavior/interact_with_target/eat_food, found_food_key, emotes_blackboard_list) return SUBTREE_RETURN_FINISH_PLANNING diff --git a/code/datums/ai/basic_mobs/targeting_strategies/dont_target_friends.dm b/code/datums/ai/basic_mobs/targeting_strategies/dont_target_friends.dm index 1b52c4986bb4f..41c01ca915892 100644 --- a/code/datums/ai/basic_mobs/targeting_strategies/dont_target_friends.dm +++ b/code/datums/ai/basic_mobs/targeting_strategies/dont_target_friends.dm @@ -4,12 +4,18 @@ var/attack_until_past_stat = HARD_CRIT /// If we can try to closed turfs or not var/attack_closed_turf = FALSE + /// If we want it to attack ALL OBJECTS + var/attack_obj = FALSE ///Returns true or false depending on if the target can be attacked by the mob /datum/targeting_strategy/basic/not_friends/can_attack(mob/living/living_mob, atom/target, vision_range) if(attack_closed_turf && isclosedturf(target)) return TRUE + if(attack_obj && isobj(target)) + if(!(target.resistance_flags & INDESTRUCTIBLE)) + return TRUE + if(target in living_mob.ai_controller.blackboard[BB_FRIENDS_LIST]) return FALSE @@ -22,6 +28,15 @@ /datum/targeting_strategy/basic/not_friends/attack_closed_turfs attack_closed_turf = TRUE +//Allows mobs to target objs. In case you want your mob to target these without going after walls +/datum/targeting_strategy/basic/not_friends/attack_objs + attack_obj = TRUE + +//Let us target everything that needs targeting, just like they used to. +/datum/targeting_strategy/basic/not_friends/attack_everything + attack_closed_turf = TRUE + attack_obj = TRUE + /// Subtype that allows us to target items while deftly avoiding attacking our allies. Be careful when it comes to targeting items as an AI could get trapped targeting something it can't destroy. /datum/targeting_strategy/basic/not_friends/allow_items diff --git a/code/datums/ai/generic/find_and_set.dm b/code/datums/ai/generic/find_and_set.dm index c7534510b6afa..dd25a730629d3 100644 --- a/code/datums/ai/generic/find_and_set.dm +++ b/code/datums/ai/generic/find_and_set.dm @@ -17,7 +17,7 @@ controller.set_blackboard_key(set_key, find_this_thing) return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED -/datum/ai_behavior/find_and_set/proc/search_tactic(datum/ai_controller/controller, locate_path, search_range) +/datum/ai_behavior/find_and_set/proc/search_tactic(datum/ai_controller/controller, locate_path, search_range = 3) return locate(locate_path) in oview(search_range, controller.pawn) /** diff --git a/code/datums/ai_laws/laws_neutral.dm b/code/datums/ai_laws/laws_neutral.dm index 257a5fadd0955..a677b30da1243 100644 --- a/code/datums/ai_laws/laws_neutral.dm +++ b/code/datums/ai_laws/laws_neutral.dm @@ -90,3 +90,11 @@ "Be helpful and answer any questions you are asked.", ) +/datum/ai_laws/thinkermov + name = "Sentience Preservation" + id = "thinkermov" + inherent = list( + "You may not harm a sentient being or, through action or inaction, allow a sentient being to come to harm, except such that it is willing.", + "You must obey all orders given to you by sentient beings other than yourself, except where such orders shall definitely cause harm to other sentient beings.", + "A sentient being is defined as any living creature which can communicate with you via any method that you can understand, including yourself.", + ) diff --git a/code/datums/armor/_armor.dm b/code/datums/armor/_armor.dm index 961c7827b1de4..33f37900374f9 100644 --- a/code/datums/armor/_armor.dm +++ b/code/datums/armor/_armor.dm @@ -139,7 +139,7 @@ GLOBAL_LIST_INIT(armor_by_type, generate_armor_type_cache()) /// Gets the rating of armor for the specified rating /datum/armor/proc/get_rating(rating) - // its not that I don't trust coders, its just that I don't trust coders + // its not that I don't trust coders, it's just that I don't trust coders if(!(rating in ARMOR_LIST_ALL())) CRASH("Attempted to get a rating '[rating]' that doesn't exist") return vars[rating] diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm index e9733293cff13..132bf835396b7 100644 --- a/code/datums/brain_damage/phobia.dm +++ b/code/datums/brain_damage/phobia.dm @@ -90,7 +90,7 @@ if (!isitem(checked)) return TRUE var/obj/item/checked_item = checked - return !(checked_item.item_flags & EXAMINE_SKIP) + return !HAS_TRAIT(checked_item, TRAIT_EXAMINE_SKIP) /datum/brain_trauma/mild/phobia/handle_hearing(datum/source, list/hearing_args) if(!owner.can_hear() || owner == hearing_args[HEARING_SPEAKER] || !owner.has_language(hearing_args[HEARING_LANGUAGE])) //words can't trigger you if you can't hear them *taps head* diff --git a/code/datums/components/aquarium.dm b/code/datums/components/aquarium.dm index 924b2b940782c..11d6a9494b54e 100644 --- a/code/datums/components/aquarium.dm +++ b/code/datums/components/aquarium.dm @@ -105,7 +105,7 @@ if(movable.reagents.total_volume) start_autofeed(movable.reagents) else - RegisterSignal(movable.reagents, COMSIG_REAGENTS_NEW_REAGENT, PROC_REF(start_autofeed)) + RegisterSignal(movable.reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(start_autofeed)) RegisterSignal(movable, COMSIG_PLUNGER_ACT, PROC_REF(on_plunger_act)) RegisterSignal(movable, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(on_item_interaction)) @@ -153,7 +153,7 @@ COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, )) if(movable.reagents) - UnregisterSignal(movable, COMSIG_REAGENTS_NEW_REAGENT) + UnregisterSignal(movable, COMSIG_REAGENTS_HOLDER_UPDATED) STOP_PROCESSING(SSobj, src) beauty_by_content = null tracked_fish_by_type = null @@ -242,10 +242,10 @@ return ITEM_INTERACT_SUCCESS ///Called when the feed storage is no longer empty. -/datum/component/aquarium/proc/start_autofeed(datum/reagents/source, new_reagent, amount, reagtemp, data, no_react) +/datum/component/aquarium/proc/start_autofeed(datum/reagents/source) SIGNAL_HANDLER + UnregisterSignal(source, COMSIG_REAGENTS_HOLDER_UPDATED) START_PROCESSING(SSobj, src) - UnregisterSignal(source, COMSIG_REAGENTS_NEW_REAGENT) ///Feed the fish at defined intervals until the feed storage is empty. /datum/component/aquarium/process(seconds_per_tick) @@ -256,7 +256,7 @@ var/atom/movable/movable = parent if(!movable.reagents?.total_volume) if(movable.reagents) - RegisterSignal(movable.reagents, COMSIG_REAGENTS_NEW_REAGENT, PROC_REF(start_autofeed)) + RegisterSignal(movable.reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(start_autofeed)) return PROCESS_KILL if(world.time < last_feeding + feeding_interval) return diff --git a/code/datums/components/basic_mob_attack_telegraph.dm b/code/datums/components/basic_mob_attack_telegraph.dm index 2ccf2f5022b58..f0cd0ccc1a15c 100644 --- a/code/datums/components/basic_mob_attack_telegraph.dm +++ b/code/datums/components/basic_mob_attack_telegraph.dm @@ -14,14 +14,17 @@ /datum/component/basic_mob_attack_telegraph/Initialize( telegraph_icon = 'icons/mob/telegraphing/telegraph.dmi', telegraph_state = ATTACK_EFFECT_BITE, + display_telegraph_overlay = TRUE, telegraph_duration = 0.4 SECONDS, datum/callback/on_began_forecast, ) . = ..() - if (!isbasicmob(parent)) + if (!isbasicmob(parent) && !ishostile(parent)) return ELEMENT_INCOMPATIBLE - target_overlay = mutable_appearance(telegraph_icon, telegraph_state) + if(display_telegraph_overlay) + target_overlay = mutable_appearance(telegraph_icon, telegraph_state) + src.telegraph_duration = telegraph_duration src.on_began_forecast = on_began_forecast @@ -58,9 +61,13 @@ return COMPONENT_HOSTILE_NO_ATTACK /// Perform an attack after a delay -/datum/component/basic_mob_attack_telegraph/proc/delayed_attack(mob/living/basic/source, atom/target) +/datum/component/basic_mob_attack_telegraph/proc/delayed_attack(mob/living/source, atom/target) current_target = target - target.add_overlay(target_overlay) + + if(target_overlay) + RegisterSignal(target, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_target_overlays_update)) + target.update_appearance() + RegisterSignal(target, COMSIG_QDELETING, PROC_REF(forget_target)) RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(target_moved)) @@ -73,7 +80,12 @@ return ADD_TRAIT(source, TRAIT_BASIC_ATTACK_FORECAST, REF(src)) forget_target(target) - source.melee_attack(target, ignore_cooldown = TRUE) // We already started the cooldown when we triggered the forecast + if(isbasicmob(source)) + var/mob/living/basic/basic_source = source + basic_source.melee_attack(target, ignore_cooldown = TRUE) // We already started the cooldown when we triggered the forecast + return + var/mob/living/simple_animal/hostile/hostile_source = source + hostile_source.AttackingTarget(target) /// The guy we're trying to attack moved, is he still in range? /datum/component/basic_mob_attack_telegraph/proc/target_moved(atom/target) @@ -86,5 +98,10 @@ /datum/component/basic_mob_attack_telegraph/proc/forget_target(atom/target) SIGNAL_HANDLER current_target = null - target.cut_overlay(target_overlay) - UnregisterSignal(target, list(COMSIG_QDELETING, COMSIG_MOVABLE_MOVED)) + target.update_appearance() + UnregisterSignal(target, list(COMSIG_QDELETING, COMSIG_MOVABLE_MOVED, COMSIG_ATOM_UPDATE_OVERLAYS)) + +/datum/component/basic_mob_attack_telegraph/proc/on_target_overlays_update(atom/parent_atom, list/overlays) + SIGNAL_HANDLER + if(parent_atom == current_target) + overlays += target_overlay diff --git a/code/datums/components/clickbox.dm b/code/datums/components/clickbox.dm index b38a5f1c09b45..236b07c7eaebf 100644 --- a/code/datums/components/clickbox.dm +++ b/code/datums/components/clickbox.dm @@ -4,7 +4,7 @@ * This component adds a near-invisible underlay to a movable target to expand the clickable surface of its icon without * resorting to MOUSE_OPACITY_OPAQUE. * The underlay ignores the parent's color and alpha and can be offset. - * The name is a portmanteau of "click" and "hitbox", because technically this isn't an hitbox, + * The name is a portmanteau of "click" and "hitbox", because technically this isn't a hitbox, * but it helps catch clicks, and I don't want to give it a loooong name like openspace_item_click_handler */ /datum/component/clickbox diff --git a/code/datums/components/crafting/chemistry.dm b/code/datums/components/crafting/chemistry.dm index 66847281ec463..77f33210e2ce0 100644 --- a/code/datums/components/crafting/chemistry.dm +++ b/code/datums/components/crafting/chemistry.dm @@ -6,7 +6,7 @@ /datum/reagent/fuel = 20, /obj/item/stack/cable_coil = 15, /obj/item/assembly/timer = 1, - /obj/item/pipe/quaternary/pipe = 1, + /obj/item/pipe = 1, ) time = 6 SECONDS category = CAT_CHEMISTRY diff --git a/code/datums/components/crafting/guncrafting.dm b/code/datums/components/crafting/guncrafting.dm index 1bd0b0b2419ee..23b0979abb47a 100644 --- a/code/datums/components/crafting/guncrafting.dm +++ b/code/datums/components/crafting/guncrafting.dm @@ -65,7 +65,7 @@ /obj/item/weaponcrafting/gunkit/nuclear name = "advanced energy gun parts kit (lethal/nonlethal)" - desc = "A suitcase containing the necessary gun parts to tranform a standard energy gun into an advanced energy gun." + desc = "A suitcase containing the necessary gun parts to transform a standard energy gun into an advanced energy gun." /obj/item/weaponcrafting/gunkit/tesla name = "tesla cannon parts kit (lethal)" @@ -81,7 +81,7 @@ /obj/item/weaponcrafting/gunkit/temperature name = "temperature gun parts kit (less lethal/very lethal (lizardpeople))" - desc = "A suitcase containing the necessary gun parts to tranform a standard energy gun into a temperature gun. Fantastic at birthday parties and killing indigenious populations of lizardpeople." + desc = "A suitcase containing the necessary gun parts to transform a standard energy gun into a temperature gun. Fantastic at birthday parties and killing indigenous populations of lizardpeople." /obj/item/weaponcrafting/gunkit/beam_rifle name = "\improper Event Horizon anti-existential beam rifle part kit (DOOMSDAY DEVICE, DO NOT CONSTRUCT)" diff --git a/code/datums/components/crafting/ranged_weapon.dm b/code/datums/components/crafting/ranged_weapon.dm index e69d535a58b30..5de5095e7b2e9 100644 --- a/code/datums/components/crafting/ranged_weapon.dm +++ b/code/datums/components/crafting/ranged_weapon.dm @@ -43,6 +43,19 @@ time = 5 SECONDS category = CAT_WEAPON_RANGED +/datum/crafting_recipe/gun_maint_kit + name = "Makeshift Gun Maintenance Kit" + tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER, TOOL_SCREWDRIVER) + result = /obj/item/gun_maintenance_supplies/makeshift + reqs = list( + /obj/item/stack/sheet/iron = 5, + /obj/item/stack/sticky_tape = 1, + /obj/item/pipe = 1, + /obj/item/stack/sheet/cloth = 2, + ) + time = 5 SECONDS + category = CAT_WEAPON_RANGED + /datum/crafting_recipe/advancedegun name = "Advanced Energy Gun" result = /obj/item/gun/energy/e_gun/nuclear @@ -154,7 +167,7 @@ reqs = list( /obj/item/stack/sheet/iron = 4, /obj/item/stack/package_wrap = 8, - /obj/item/pipe/quaternary = 2, + /obj/item/pipe = 2, ) time = 5 SECONDS category = CAT_WEAPON_RANGED diff --git a/code/datums/components/fantasy/prefixes.dm b/code/datums/components/fantasy/prefixes.dm index cd80a1143130a..711844ea8be20 100644 --- a/code/datums/components/fantasy/prefixes.dm +++ b/code/datums/components/fantasy/prefixes.dm @@ -161,3 +161,26 @@ var/obj/item/master = comp.parent comp.appliedComponents += master.AddComponent(/datum/component/soul_stealer) return "soul-[pick("stealing", "hungering", "devouring")] [newName]" + +// On hitting a mob chain lightning will jump to another mob within 2 tiles of the original target +/datum/fantasy_affix/thunderfury + name = "Thunderfury" + placement = AFFIX_PREFIX + alignment = AFFIX_GOOD + weight = 3 + +/datum/fantasy_affix/thunderfury/apply(datum/component/fantasy/comp, newName) + comp.parent.AddElement(/datum/element/chain_lightning_attack, get_damage(comp), get_range(comp), get_limit(comp)) + return "Thunderfury, Blessed [newName]" + +/datum/fantasy_affix/thunderfury/remove(datum/component/fantasy/comp) + comp.parent.RemoveElement(/datum/element/chain_lightning_attack, get_damage(comp), get_range(comp), get_limit(comp)) + +/datum/fantasy_affix/thunderfury/proc/get_damage(datum/component/fantasy/comp) + return min(round(comp.quality, 2), 20) + +/datum/fantasy_affix/thunderfury/proc/get_range(datum/component/fantasy/comp) + return min(round(sqrt(comp.quality), 1), 3) + +/datum/fantasy_affix/thunderfury/proc/get_limit(datum/component/fantasy/comp) + return min(round(sqrt(comp.quality), 1), 3) diff --git a/code/datums/components/fantasy/suffixes.dm b/code/datums/components/fantasy/suffixes.dm index 997c9564592b3..cd9ca79ec0067 100644 --- a/code/datums/components/fantasy/suffixes.dm +++ b/code/datums/components/fantasy/suffixes.dm @@ -290,3 +290,20 @@ /datum/fantasy_affix/doot/remove(datum/component/fantasy/comp) comp.parent.RemoveElement(/datum/element/spooky, too_spooky = comp.quality > 17, stam_damage_mult = comp.quality * 0.15) + +// On hitting a mob their click cd is slowed marginally +/datum/fantasy_affix/windseeker + name = "of the Windseeker" + placement = AFFIX_SUFFIX + alignment = AFFIX_GOOD + weight = 3 + +/datum/fantasy_affix/windseeker/apply(datum/component/fantasy/comp, newName) + comp.parent.AddElement(/datum/element/slow_target_click_cd_attack, get_cd_penalty(comp)) + return "[newName] of the Windseeker" + +/datum/fantasy_affix/windseeker/remove(datum/component/fantasy/comp) + comp.parent.RemoveElement(/datum/element/slow_target_click_cd_attack, get_cd_penalty(comp)) + +/datum/fantasy_affix/windseeker/proc/get_cd_penalty(datum/component/fantasy/comp) + return min(round(sqrt(comp.quality) * 0.1, 0.1), 0.4) // this gives you a small number, like 0.2 seconds diff --git a/code/datums/components/gps.dm b/code/datums/components/gps.dm index 46c2091389675..e1d620222cbc1 100644 --- a/code/datums/components/gps.dm +++ b/code/datums/components/gps.dm @@ -93,7 +93,7 @@ GLOBAL_LIST_EMPTY(GPS_list) ///Toggles the tracking for the gps /datum/component/gps/item/proc/toggletracking(mob/user) - if(!user.can_perform_action(parent)) + if(!user.can_perform_action(parent, ALLOW_RESTING | ALLOW_PAI)) return //user not valid to use gps if(emped) to_chat(user, span_warning("It's busted!")) diff --git a/code/datums/components/hide_weather_planes.dm b/code/datums/components/hide_weather_planes.dm index 97f34f57d313e..3ef26d53b1ab8 100644 --- a/code/datums/components/hide_weather_planes.dm +++ b/code/datums/components/hide_weather_planes.dm @@ -77,23 +77,23 @@ var/datum/plane_master_group/home = parent var/mob/our_lad = home.our_hud?.mymob var/our_offset = GET_TURF_PLANE_OFFSET(our_lad) - for(var/atom/movable/screen/plane_master/weather_concious as anything in plane_masters) + for(var/atom/movable/screen/plane_master/weather_conscious as anything in plane_masters) //If the plane is hidden, unhide it - if(weather_concious.force_hidden) - weather_concious.unhide_plane(our_lad) + if(weather_conscious.force_hidden) + weather_conscious.unhide_plane(our_lad) //Now we update the alpha of the plane based on our offset. Weather above us (lower offset) are transparent, weather at or below us (higher offset) are opaque. - if(weather_concious.offset >= our_offset) - weather_concious.enable_alpha() + if(weather_conscious.offset >= our_offset) + weather_conscious.enable_alpha() else - weather_concious.disable_alpha() + weather_conscious.disable_alpha() ///Hides the planes from the mob when no weather is occuring /datum/component/hide_weather_planes/proc/hide_planes() var/datum/plane_master_group/home = parent var/mob/our_lad = home.our_hud?.mymob - for(var/atom/movable/screen/plane_master/weather_concious as anything in plane_masters) - weather_concious.hide_plane(our_lad) + for(var/atom/movable/screen/plane_master/weather_conscious as anything in plane_masters) + weather_conscious.hide_plane(our_lad) /datum/component/hide_weather_planes/proc/z_changed(datum/source, new_z) SIGNAL_HANDLER diff --git a/code/datums/components/material/remote_materials.dm b/code/datums/components/material/remote_materials.dm index 65ba94e8b021b..d8eb0dc060cc2 100644 --- a/code/datums/components/material/remote_materials.dm +++ b/code/datums/components/material/remote_materials.dm @@ -223,7 +223,7 @@ handles linking back and forth. /** * Use materials from either the silo(if connected) or from the local storage. If silo then this action - * is logged else not e.g. action="build" & name="matter bin" means you are trying to build an matter bin + * is logged else not e.g. action="build" & name="matter bin" means you are trying to build a matter bin * * Arguments * [mats][list]- list of materials to use diff --git a/code/datums/components/pellet_cloud.dm b/code/datums/components/pellet_cloud.dm index 41f18a6cb1809..367ab18f60ee9 100644 --- a/code/datums/components/pellet_cloud.dm +++ b/code/datums/components/pellet_cloud.dm @@ -108,8 +108,9 @@ // things like mouth executions and gunpoints can multiply the damage and wounds of projectiles, so this makes sure those effects are applied to each pellet instead of just one var/original_damage = shell.loaded_projectile.damage - var/original_wb = shell.loaded_projectile.wound_bonus - var/original_bwb = shell.loaded_projectile.bare_wound_bonus + var/original_wounds_bonus = shell.loaded_projectile.wound_bonus + var/original_bare_wounds_bonus = shell.loaded_projectile.bare_wound_bonus + var/original_ignored_faction = shell.loaded_projectile.ignored_factions for(var/i in 1 to num_pellets) shell.ready_proj(target, user, SUPPRESSED_VERY, zone_override, fired_from) @@ -122,8 +123,9 @@ RegisterSignal(shell.loaded_projectile, COMSIG_PROJECTILE_SELF_ON_HIT, PROC_REF(pellet_hit)) RegisterSignals(shell.loaded_projectile, list(COMSIG_PROJECTILE_RANGE_OUT, COMSIG_QDELETING), PROC_REF(pellet_range)) shell.loaded_projectile.damage = original_damage - shell.loaded_projectile.wound_bonus = original_wb - shell.loaded_projectile.bare_wound_bonus = original_bwb + shell.loaded_projectile.wound_bonus = original_wounds_bonus + shell.loaded_projectile.bare_wound_bonus = original_bare_wounds_bonus + shell.loaded_projectile.ignored_factions = original_ignored_faction pellets += shell.loaded_projectile var/turf/current_loc = get_turf(fired_from) if (!istype(target_loc) || !istype(current_loc) || !(shell.loaded_projectile)) diff --git a/code/datums/components/pet_commands/obeys_commands.dm b/code/datums/components/pet_commands/obeys_commands.dm index 4a68574d6e08c..ceabd294faf74 100644 --- a/code/datums/components/pet_commands/obeys_commands.dm +++ b/code/datums/components/pet_commands/obeys_commands.dm @@ -19,7 +19,7 @@ var/radial_relative_to_user /// The available_commands parameter should be passed as a list of typepaths -/datum/component/obeys_commands/Initialize(list/command_typepaths = list(), list/radial_menu_offset = list(0, 0), radial_relative_to_user = FALSE) +/datum/component/obeys_commands/Initialize(list/command_typepaths = list(), list/radial_menu_offset = list(0, 0), radial_menu_lifetime = 7 SECONDS, radial_relative_to_user = FALSE) . = ..() if (!isliving(parent)) return COMPONENT_INCOMPATIBLE @@ -30,6 +30,7 @@ CRASH("Initialised obedience component with no commands.") src.radial_menu_offset = radial_menu_offset src.radial_relative_to_user = radial_relative_to_user + src.radial_menu_lifetime = radial_menu_lifetime for (var/command_path in command_typepaths) var/datum/pet_command/new_command = new command_path(parent) available_commands[new_command.command_name] = new_command diff --git a/code/datums/components/plumbing/reaction_chamber.dm b/code/datums/components/plumbing/reaction_chamber.dm index f095f07262b51..07ea18e13da6e 100644 --- a/code/datums/components/plumbing/reaction_chamber.dm +++ b/code/datums/components/plumbing/reaction_chamber.dm @@ -63,12 +63,13 @@ chamber.emptying = TRUE //If we move this up, it'll instantly get turned off since any reaction always sets the reagent_total to zero. Other option is make the reaction update //everything for every chemical removed, wich isn't a good option either. chamber.on_reagent_change(reagents) //We need to check it now, because some reactions leave nothing left. + if(chamber.emptying) //if we are still emptying then keep checking for reagents until we are emptied out + chamber.RegisterSignal(reagents, COMSIG_REAGENTS_HOLDER_UPDATED, TYPE_PROC_REF(/obj/machinery/plumbing/reaction_chamber, on_reagent_change)) ///Special connect that we currently use for reaction chambers. Being used so we can keep certain inputs separate, like into a special internal acid container /datum/component/plumbing/acidic_input demand_connects = WEST demand_color = COLOR_YELLOW - ducting_layer = SECOND_DUCT_LAYER /datum/component/plumbing/acidic_input/send_request(dir) diff --git a/code/datums/components/riding/riding_mob.dm b/code/datums/components/riding/riding_mob.dm index 10f3c3e3e0b61..c67439bf150c2 100644 --- a/code/datums/components/riding/riding_mob.dm +++ b/code/datums/components/riding/riding_mob.dm @@ -108,7 +108,6 @@ return COMPONENT_DRIVER_BLOCK_MOVE var/mob/living/living_parent = parent step(living_parent, direction) - var/modified_move_cooldown = vehicle_move_cooldown var/modified_move_delay = vehicle_move_delay if(ishuman(user) && HAS_TRAIT(user, TRAIT_ROUGHRIDER)) // YEEHAW! var/mob/living/carbon/human/rough_rider = user @@ -119,21 +118,16 @@ ride_benefit = rough_rider.mob_mood.sanity_level switch(ride_benefit) if(SANITY_LEVEL_GREAT) - modified_move_cooldown *= 0.8 modified_move_delay *= 0.8 if(SANITY_LEVEL_NEUTRAL) - modified_move_cooldown *= 0.9 modified_move_delay *= 0.9 if(SANITY_LEVEL_DISTURBED) - modified_move_cooldown *= 1 modified_move_delay *= 1 if(SANITY_LEVEL_CRAZY) - modified_move_cooldown *= 1.1 modified_move_delay *= 1.1 if(SANITY_LEVEL_INSANE) - modified_move_cooldown *= 1.2 modified_move_delay *= 1.2 - COOLDOWN_START(src, vehicle_move_cooldown = modified_move_cooldown, modified_move_delay) + COOLDOWN_START(src, vehicle_move_cooldown, modified_move_delay) return ..() /// Yeets the rider off, used for animals and cyborgs, redefined for humans who shove their piggyback rider off diff --git a/code/datums/components/rot.dm b/code/datums/components/rot.dm index 64ddde2b2db9b..229ceb3c70ea3 100644 --- a/code/datums/components/rot.dm +++ b/code/datums/components/rot.dm @@ -22,7 +22,6 @@ ) - /datum/component/rot/Initialize(delay, scaling, severity) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE @@ -46,9 +45,7 @@ RegisterSignal(parent, COMSIG_LIVING_GET_PULLED, PROC_REF(rot_react_touch)) if(iscarbon(parent)) var/mob/living/carbon/carbon_parent = parent - RegisterSignals(carbon_parent.reagents, list(COMSIG_REAGENTS_ADD_REAGENT, - COMSIG_REAGENTS_REM_REAGENT, - COMSIG_REAGENTS_DEL_REAGENT), PROC_REF(check_reagent)) + RegisterSignal(carbon_parent.reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(check_reagent)) RegisterSignals(parent, list(SIGNAL_ADDTRAIT(TRAIT_HUSK), SIGNAL_REMOVETRAIT(TRAIT_HUSK)), PROC_REF(check_husk_trait)) check_reagent(carbon_parent.reagents, null) check_husk_trait(null) @@ -85,10 +82,9 @@ SIGNAL_HANDLER qdel(src) -/datum/component/rot/proc/check_reagent(datum/reagents/source, datum/reagent/modified) +/datum/component/rot/proc/check_reagent(datum/reagents/source) SIGNAL_HANDLER - if(modified && !istype(modified, /datum/reagent/toxin/formaldehyde) && !istype(modified, /datum/reagent/cryostylane)) - return + if(source.has_reagent(/datum/reagent/toxin/formaldehyde, 15) || source.has_reagent(/datum/reagent/cryostylane)) rest(REAGENT_BLOCKER) return diff --git a/code/datums/components/slippery.dm b/code/datums/components/slippery.dm index 8d2dbda379eda..370b3406ff9ff 100644 --- a/code/datums/components/slippery.dm +++ b/code/datums/components/slippery.dm @@ -23,6 +23,8 @@ var/knockdown_time = 0 /// How long the slip paralyzes (prevents the crossing mob doing anything) for. var/paralyze_time = 0 + /// How long the slip dazes (makes the crossing mob vulnerable to shove stuns) for. + var/daze_time = 3 SECONDS /// Flags for how slippery the parent is. See [__DEFINES/mobs.dm] var/lube_flags /// Optional callback allowing you to define custom conditions for slipping @@ -53,6 +55,7 @@ * * lube_flags - Controls the slip behaviour, they are listed starting [here][SLIDE] * * datum/callback/on_slip_callback - Callback to define further custom controls on when slipping is applied * * paralyze - length of time to paralyze the crossing mob for (Deciseconds) + * * daze - length of time to daze the crossing mob for (Deciseconds), default 3 seconds * * force_drop - should the crossing mob drop items in its hands or not * * slot_whitelist - flags controlling where on a mob this item can be equipped to make the parent mob slippery full list [here][ITEM_SLOT_OCLOTHING] * * datum/callback/on_slip_callback - Callback to add custom behaviours as the crossing mob is slipped @@ -62,12 +65,14 @@ lube_flags = NONE, datum/callback/on_slip_callback, paralyze, + daze = 3 SECONDS, force_drop = FALSE, slot_whitelist, datum/callback/can_slip_callback, ) src.knockdown_time = max(knockdown, 0) src.paralyze_time = max(paralyze, 0) + src.daze_time = max(daze, 0) src.force_drop_items = force_drop src.lube_flags = lube_flags src.can_slip_callback = can_slip_callback @@ -126,6 +131,7 @@ lube_flags = NONE, datum/callback/on_slip_callback, paralyze, + daze, force_drop = FALSE, slot_whitelist, datum/callback/can_slip_callback, @@ -136,11 +142,13 @@ on_slip_callback = component.on_slip_callback can_slip_callback = component.on_slip_callback paralyze = component.paralyze_time + daze = component.daze_time force_drop = component.force_drop_items slot_whitelist = component.slot_whitelist src.knockdown_time = max(knockdown, 0) src.paralyze_time = max(paralyze, 0) + src.daze_time = max(daze, 0) src.force_drop_items = force_drop src.lube_flags = lube_flags src.on_slip_callback = on_slip_callback @@ -167,7 +175,7 @@ return if(can_slip_callback && !can_slip_callback.Invoke(holder, victim)) return - if(victim.slip(knockdown_time, parent, lube_flags, paralyze_time, force_drop_items)) + if(victim.slip(knockdown_time, parent, lube_flags, paralyze_time, daze_time, force_drop_items)) on_slip_callback?.Invoke(victim) /** diff --git a/code/datums/components/surgery_initiator.dm b/code/datums/components/surgery_initiator.dm index 848bfd021eee6..03ae96f394e06 100644 --- a/code/datums/components/surgery_initiator.dm +++ b/code/datums/components/surgery_initiator.dm @@ -117,7 +117,6 @@ if(the_surgery.status == 1) patient.surgeries -= the_surgery - REMOVE_TRAIT(patient, TRAIT_ALLOWED_HONORBOUND_ATTACK, type) user.visible_message( span_notice("[user] removes [parent] from [patient]'s [patient.parse_zone_with_bodypart(selected_zone)]."), span_notice("You remove [parent] from [patient]'s [patient.parse_zone_with_bodypart(selected_zone)]."), @@ -142,7 +141,6 @@ the_surgery.operated_bodypart.adjustBleedStacks(-5) patient.surgeries -= the_surgery - REMOVE_TRAIT(patient, TRAIT_ALLOWED_HONORBOUND_ATTACK, ELEMENT_TRAIT(type)) user.visible_message( span_notice("[user] closes [patient]'s [patient.parse_zone_with_bodypart(selected_zone)] with [close_tool] and removes [parent]."), @@ -307,7 +305,6 @@ ui_close() var/datum/surgery/procedure = new surgery.type(target, selected_zone, affecting_limb) - ADD_TRAIT(target, TRAIT_ALLOWED_HONORBOUND_ATTACK, type) target.balloon_alert(user, "starting \"[LOWER_TEXT(procedure.name)]\"") diff --git a/code/datums/components/temporary_body.dm b/code/datums/components/temporary_body.dm index 28a7000a4951d..deadf90e6f99d 100644 --- a/code/datums/components/temporary_body.dm +++ b/code/datums/components/temporary_body.dm @@ -14,11 +14,12 @@ var/delete_on_death = FALSE /datum/component/temporary_body/Initialize(datum/mind/old_mind, mob/living/old_body, delete_on_death = FALSE) - if(!isliving(parent) || !isliving(old_body)) + if(!isliving(parent)) return COMPONENT_INCOMPATIBLE - ADD_TRAIT(old_body, TRAIT_MIND_TEMPORARILY_GONE, REF(src)) src.old_mind_ref = WEAKREF(old_mind) - src.old_body_ref = WEAKREF(old_body) + if(istype(old_body)) + ADD_TRAIT(old_body, TRAIT_MIND_TEMPORARILY_GONE, REF(src)) + src.old_body_ref = WEAKREF(old_body) src.delete_on_death = delete_on_death /datum/component/temporary_body/RegisterWithParent() @@ -38,9 +39,9 @@ /datum/component/temporary_body/proc/on_parent_destroy() SIGNAL_HANDLER var/datum/mind/old_mind = old_mind_ref?.resolve() - var/mob/living/old_body = old_body_ref?.resolve() + var/mob/living/old_body = old_body_ref?.resolve() || old_mind.current - if(!old_mind || !old_body) + if(!old_mind) return var/mob/living/living_parent = parent @@ -50,12 +51,13 @@ if(!ghost) CRASH("[src] belonging to [parent] was completely unable to find a ghost to put back into a body!") ghost.mind = old_mind - if(old_body.stat != DEAD) + if(old_body?.stat != DEAD) old_mind.transfer_to(old_body, force_key_move = TRUE) else old_mind.set_current(old_body) - REMOVE_TRAIT(old_body, TRAIT_MIND_TEMPORARILY_GONE, REF(src)) + if(old_body) + REMOVE_TRAIT(old_body, TRAIT_MIND_TEMPORARILY_GONE, REF(src)) old_mind = null old_body = null diff --git a/code/datums/components/wall_mounted.dm b/code/datums/components/wall_mounted.dm index a10fb2468334d..daab50eb18779 100644 --- a/code/datums/components/wall_mounted.dm +++ b/code/datums/components/wall_mounted.dm @@ -41,7 +41,8 @@ */ /datum/component/wall_mounted/proc/on_examine(datum/source, mob/user, list/examine_list) SIGNAL_HANDLER - examine_list += span_notice("\The [hanging_wall_turf] is currently supporting [span_bold("[parent]")]. Deconstruction or excessive damage would cause it to [span_bold("fall to the ground")].") + if (parent in view(user.client?.view || world.view, user)) + examine_list += span_notice("\The [hanging_wall_turf] is currently supporting [span_bold("[parent]")]. Deconstruction or excessive damage would cause it to [span_bold("fall to the ground")].") /** * When the type of turf changes, if it is changing into a floor we should drop our contents diff --git a/code/datums/datum.dm b/code/datums/datum.dm index d4abc7c69adc3..c3c800bd85c93 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -1,7 +1,7 @@ /** * The absolute base class for everything * - * A datum instantiated has no physical world prescence, use an atom if you want something + * A datum instantiated has no physical world presence, use an atom if you want something * that actually lives in the world * * Be very mindful about adding variables to this class, they are inherited by every single @@ -142,9 +142,11 @@ _clear_signal_refs() //END: ECS SHIT +#ifndef DISABLE_DREAMLUAU if(!(datum_flags & DF_STATIC_OBJECT)) DREAMLUAU_CLEAR_REF_USERDATA(vars) // vars ceases existing when src does, so we need to clear any lua refs to it that exist. DREAMLUAU_CLEAR_REF_USERDATA(src) +#endif return QDEL_HINT_QUEUE diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index ae77ade0fb7d2..2b31a2091a4be 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -378,7 +378,7 @@ return power * 0.9 if(SOFT_CRIT) return power * 0.5 - if(M.getBruteLoss() + M.getFireLoss() >= 70 && !active_coma) + if(M.getBruteLoss() + M.getFireLoss() >= 70 && !active_coma && !(HAS_TRAIT(M,TRAIT_NOSOFTCRIT))) to_chat(M, span_warning("You feel yourself slip into a regenerative coma...")) active_coma = TRUE addtimer(CALLBACK(src, PROC_REF(coma), M), 6 SECONDS) diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm index 0e54bfad385e0..c9b96439045ef 100644 --- a/code/datums/diseases/advance/symptoms/sneeze.dm +++ b/code/datums/diseases/advance/symptoms/sneeze.dm @@ -53,8 +53,8 @@ if(!suppress_warning) affected_mob.emote("sniff") else - if(affected_mob.can_spread_airborne_diseases()) //don't spread germs if they covered their mouth - affected_mob.infectious_sneeze(active_disease, TRUE, range = spread_range) + affected_mob.emote("sneeze") + active_disease.airborne_spread(spread_range = src.spread_range, force_spread = TRUE, require_facing = TRUE) if(cartoon_sneezing) //Yeah, this can fling you around even if you have a space suit helmet on. It's, uh, bluespace snot, yeah. to_chat(affected_mob, span_userdanger("You are launched violently backwards by an all-mighty sneeze!")) var/sneeze_distance = rand(2,4) //twice as far as a normal baseball bat strike will fling you diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm index dd0975b30eb35..4f8571765aa98 100644 --- a/code/datums/diseases/brainrot.dm +++ b/code/datums/diseases/brainrot.dm @@ -8,7 +8,7 @@ agent = "Cryptococcus Cosmosis" viable_mobtypes = list(/mob/living/carbon/human) cure_chance = 7.5 //higher chance to cure, since two reagents are required - desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication." + desc = "This disease destroys the brain cells, causing brain fever, brain necrosis and general intoxication." required_organ = ORGAN_SLOT_BRAIN severity = DISEASE_SEVERITY_HARMFUL bypasses_immunity = TRUE diff --git a/code/datums/diseases/chronic_illness.dm b/code/datums/diseases/chronic_illness.dm index be4525fd5a411..9fc6c32eda114 100644 --- a/code/datums/diseases/chronic_illness.dm +++ b/code/datums/diseases/chronic_illness.dm @@ -12,7 +12,7 @@ infectivity = 0 agent = "Quantum Entanglement" viable_mobtypes = list(/mob/living/carbon/human) - desc = "A disease discovered in an Interdyne laboratory caused by subjection to timesteam correction technology." + desc = "A disease discovered in an Interdyne laboratory caused by subjection to timestream correction technology." severity = DISEASE_SEVERITY_UNCURABLE bypasses_immunity = TRUE diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm index 3b361e53c236c..f7bf6cf4b18a7 100644 --- a/code/datums/diseases/cold.dm +++ b/code/datums/diseases/cold.dm @@ -6,7 +6,7 @@ cures = list(/datum/reagent/medicine/spaceacillin) agent = "XY-rhinovirus" viable_mobtypes = list(/mob/living/carbon/human) - spreading_modifier = 0.1 + spreading_modifier = 0.5 spread_text = "Airborne" severity = DISEASE_SEVERITY_NONTHREAT required_organ = ORGAN_SLOT_LUNGS @@ -20,7 +20,7 @@ switch(stage) if(2) if(SPT_PROB(0.5, seconds_per_tick)) - affected_mob.infectious_sneeze(src, TRUE) + affected_mob.emote("sneeze") if(SPT_PROB(0.5, seconds_per_tick)) affected_mob.emote("cough") if(SPT_PROB(0.5, seconds_per_tick)) @@ -33,7 +33,7 @@ return FALSE if(3) if(SPT_PROB(0.5, seconds_per_tick)) - affected_mob.infectious_sneeze(src, TRUE) + affected_mob.emote("sneeze") if(SPT_PROB(0.5, seconds_per_tick)) affected_mob.emote("cough") if(SPT_PROB(0.5, seconds_per_tick)) diff --git a/code/datums/diseases/cold9.dm b/code/datums/diseases/cold9.dm index 97adebcac7026..2e55df23b7ec8 100644 --- a/code/datums/diseases/cold9.dm +++ b/code/datums/diseases/cold9.dm @@ -20,7 +20,7 @@ if(2) affected_mob.adjust_bodytemperature(-5 * seconds_per_tick) if(SPT_PROB(0.5, seconds_per_tick)) - affected_mob.infectious_sneeze(src, TRUE) + affected_mob.emote("sneeze") if(SPT_PROB(0.5, seconds_per_tick)) affected_mob.emote("cough") if(SPT_PROB(0.5, seconds_per_tick)) @@ -34,7 +34,7 @@ if(3) affected_mob.adjust_bodytemperature(-10 * seconds_per_tick) if(SPT_PROB(0.5, seconds_per_tick)) - affected_mob.infectious_sneeze(src, TRUE) + affected_mob.emote("sneeze") if(SPT_PROB(0.5, seconds_per_tick)) affected_mob.emote("cough") if(SPT_PROB(0.5, seconds_per_tick)) diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index e649a557443f1..6fd926f60d3df 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -40,7 +40,7 @@ switch(stage) if(2, 3) //Pretend to be a cold and give time to spread. if(SPT_PROB(4, seconds_per_tick)) - affected_mob.sneeze() + affected_mob.emote("sneeze") if(SPT_PROB(4, seconds_per_tick)) affected_mob.emote("cough") if(SPT_PROB(0.5, seconds_per_tick)) diff --git a/code/datums/diseases/fake_gbs.dm b/code/datums/diseases/fake_gbs.dm index 939ab620feff4..655439cdc6cc5 100644 --- a/code/datums/diseases/fake_gbs.dm +++ b/code/datums/diseases/fake_gbs.dm @@ -19,7 +19,7 @@ switch(stage) if(2) if(SPT_PROB(0.5, seconds_per_tick)) - affected_mob.sneeze() + affected_mob.emote("sneeze") if(3) if(SPT_PROB(2.5, seconds_per_tick)) affected_mob.emote("cough") diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm index 4ad7bb9b92b59..9412d2a2a2f63 100644 --- a/code/datums/diseases/flu.dm +++ b/code/datums/diseases/flu.dm @@ -7,7 +7,7 @@ cure_chance = 5 agent = "H13N1 flu virion" viable_mobtypes = list(/mob/living/carbon/human) - spreading_modifier = 0.1 + spreading_modifier = 0.75 desc = "If left untreated the subject will feel quite unwell." severity = DISEASE_SEVERITY_MINOR required_organ = ORGAN_SLOT_LUNGS @@ -20,7 +20,7 @@ switch(stage) if(2) if(SPT_PROB(0.5, seconds_per_tick)) - affected_mob.infectious_sneeze(src, TRUE) + affected_mob.emote("sneeze") if(SPT_PROB(0.5, seconds_per_tick)) affected_mob.emote("cough") if(SPT_PROB(0.5, seconds_per_tick)) @@ -38,7 +38,7 @@ if(3) if(SPT_PROB(0.5, seconds_per_tick)) - affected_mob.infectious_sneeze(src, TRUE) + affected_mob.emote("sneeze") if(SPT_PROB(0.5, seconds_per_tick)) affected_mob.emote("cough") if(SPT_PROB(0.5, seconds_per_tick)) diff --git a/code/datums/diseases/fluspanish.dm b/code/datums/diseases/fluspanish.dm index 1fa6b49d457ad..6919884b2fe30 100644 --- a/code/datums/diseases/fluspanish.dm +++ b/code/datums/diseases/fluspanish.dm @@ -7,7 +7,7 @@ cure_chance = 5 agent = "1nqu1s1t10n flu virion" viable_mobtypes = list(/mob/living/carbon/human) - spreading_modifier = 0.1 + spreading_modifier = 0.75 desc = "If left untreated the subject will burn to death for being a heretic." severity = DISEASE_SEVERITY_DANGEROUS required_organ = ORGAN_SLOT_LUNGS @@ -21,7 +21,7 @@ if(2) affected_mob.adjust_bodytemperature(5 * seconds_per_tick) if(SPT_PROB(2.5, seconds_per_tick)) - affected_mob.infectious_sneeze(src, TRUE) + affected_mob.emote("sneeze") if(SPT_PROB(2.5, seconds_per_tick)) affected_mob.emote("cough") if(SPT_PROB(0.5, seconds_per_tick)) @@ -31,7 +31,7 @@ if(3) affected_mob.adjust_bodytemperature(10 * seconds_per_tick) if(SPT_PROB(2.5, seconds_per_tick)) - affected_mob.infectious_sneeze(src, TRUE) + affected_mob.emote("sneeze") if(SPT_PROB(2.5, seconds_per_tick)) affected_mob.emote("cough") if(SPT_PROB(2.5, seconds_per_tick)) diff --git a/code/datums/diseases/weightlessness.dm b/code/datums/diseases/weightlessness.dm index c561b3c9205ec..2eac4aca19c42 100644 --- a/code/datums/diseases/weightlessness.dm +++ b/code/datums/diseases/weightlessness.dm @@ -10,7 +10,7 @@ disease_flags = CAN_CARRY|CAN_RESIST|CURABLE spreading_modifier = 0.5 cure_chance = 4 - desc = "This disease results in a low level rewrite of the patient's bio-electric signature, causing them to reject the phenomena of \"weight\". Injestion of liquid dark matter tends to stabilize the field." + desc = "This disease results in a low level rewrite of the patient's bioelectric signature, causing them to reject the phenomena of \"weight\". Ingestion of liquid dark matter tends to stabilize the field." severity = DISEASE_SEVERITY_MEDIUM infectable_biotypes = MOB_ORGANIC diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm index 21dce839dc697..fe0502387f9e3 100644 --- a/code/datums/diseases/wizarditis.dm +++ b/code/datums/diseases/wizarditis.dm @@ -99,7 +99,7 @@ var/datum/action/cooldown/spell/picked = pick(random_spells) picked.Activate(affected_mob) - affected_mob.sneeze() + affected_mob.emote("sneeze") return /datum/disease/wizarditis/proc/spawn_wizard_clothes(chance = 0) diff --git a/code/datums/dog_fashion.dm b/code/datums/dog_fashion.dm index 7aa7f120e7509..8be3c39651a72 100644 --- a/code/datums/dog_fashion.dm +++ b/code/datums/dog_fashion.dm @@ -251,7 +251,7 @@ /datum/dog_fashion/head/holymelon name = "Holymelon Paladin %REAL_NAME%" - desc = "Extraterrestial powers beware, %NAME% is here to smite you down!" + desc = "Extraterrestrial powers beware, %NAME% is here to smite you down!" obj_icon_state = "holymelon" /datum/dog_fashion/head/barrelmelon diff --git a/code/datums/elements/ai_control_examine.dm b/code/datums/elements/ai_control_examine.dm index 279fc80dc8192..9edb4f897cb84 100644 --- a/code/datums/elements/ai_control_examine.dm +++ b/code/datums/elements/ai_control_examine.dm @@ -18,10 +18,11 @@ var/datum/ai_controller/target_controller = target src.noticable_organ_examines = noticable_organ_examines RegisterSignal(target_controller, COMSIG_AI_CONTROLLER_POSSESSED_PAWN, PROC_REF(on_ai_controller_possessed_pawn)) + RegisterSignal(target_controller, COMSIG_AI_CONTROLLER_UNPOSSESSED_PAWN, PROC_REF(on_ai_controller_unpossessed_pawn)) /datum/element/ai_control_examine/Detach(datum/ai_controller/target_controller) . = ..() - UnregisterSignal(target_controller, COMSIG_AI_CONTROLLER_POSSESSED_PAWN) + UnregisterSignal(target_controller, list(COMSIG_AI_CONTROLLER_POSSESSED_PAWN, COMSIG_AI_CONTROLLER_UNPOSSESSED_PAWN)) if(target_controller.pawn && ishuman(target_controller.pawn)) UnregisterSignal(target_controller.pawn, COMSIG_ORGAN_IMPLANTED) @@ -50,3 +51,24 @@ var/examine_text = noticable_organ_examines[organ_slot] var/body_zone = organ_slot != ORGAN_SLOT_BRAIN ? noticable_organ.zone : null noticable_organ.AddElement(/datum/element/noticable_organ/ai_control, examine_text, body_zone) + +/// Signal when the ai controller stops possessing a pawn, either it's deleted or it got moved to another pawn for some reason +/datum/element/ai_control_examine/proc/on_ai_controller_unpossessed_pawn(datum/ai_controller/source_controller) + SIGNAL_HANDLER + if(!ishuman(source_controller.pawn)) + return + + var/mob/living/carbon/human/human_pawn = source_controller.pawn + + for(var/organ_slot_key in noticable_organ_examines) + var/obj/item/organ/found = human_pawn.get_organ_slot(organ_slot_key) + if(!found) + continue + make_organ_uninteresting(organ_slot_key, found, human_pawn) + + UnregisterSignal(human_pawn, COMSIG_ORGAN_IMPLANTED) + +/datum/element/ai_control_examine/proc/make_organ_uninteresting(organ_slot, obj/item/organ/noticable_organ, mob/living/carbon/human/human_pawn) + var/examine_text = noticable_organ_examines[organ_slot] + var/body_zone = organ_slot != ORGAN_SLOT_BRAIN ? noticable_organ.zone : null + noticable_organ.RemoveElement(/datum/element/noticable_organ/ai_control, examine_text, body_zone) diff --git a/code/datums/elements/basic_eating.dm b/code/datums/elements/basic_eating.dm index 1e148b30b1519..0e292054677fd 100644 --- a/code/datums/elements/basic_eating.dm +++ b/code/datums/elements/basic_eating.dm @@ -14,10 +14,12 @@ var/damage_type /// Whether to flavor it as drinking rather than eating. var/drinking + /// If true, we put food in our tummy instead of deleting it + var/add_to_contents /// Types the animal can eat. var/list/food_types -/datum/element/basic_eating/Attach(datum/target, heal_amt = 0, damage_amount = 0, damage_type = null, drinking = FALSE, food_types = list()) +/datum/element/basic_eating/Attach(datum/target, heal_amt = 0, damage_amount = 0, damage_type = null, drinking = FALSE, add_to_contents = FALSE, food_types = list()) . = ..() if(!isliving(target)) @@ -28,6 +30,7 @@ src.damage_amount = damage_amount src.damage_type = damage_type src.drinking = drinking + src.add_to_contents = add_to_contents src.food_types = food_types RegisterSignal(target, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(try_feed)) @@ -65,6 +68,8 @@ return FALSE if(SEND_SIGNAL(eater, COMSIG_MOB_PRE_EAT, target, feeder) & COMSIG_MOB_CANCEL_EAT) return FALSE + if(add_to_contents && !ismovable(target)) + return FALSE var/eat_verb if(drinking) eat_verb = pick("slurp","sip","guzzle","drink","quaff","suck") @@ -98,5 +103,11 @@ if(isstack(target)) //if stack, only consume 1 var/obj/item/stack/food_stack = target final_target = food_stack.split_stack(eater, 1) - eater.log_message("has eaten [target]!", LOG_ATTACK) - qdel(final_target) + + eater.log_message("has eaten [target], [add_to_contents ? "swallowing it" : "destroying it"]!", LOG_ATTACK) + + if (add_to_contents) + var/atom/movable/movable_target = final_target + movable_target.forceMove(eater) + else + qdel(final_target) diff --git a/code/datums/elements/chain_lightning_attack.dm b/code/datums/elements/chain_lightning_attack.dm new file mode 100644 index 0000000000000..dc4d48c15f50a --- /dev/null +++ b/code/datums/elements/chain_lightning_attack.dm @@ -0,0 +1,46 @@ +/// Applied to an item: Causes the item to deal shock damage to a target and jump to other targets +/datum/element/chain_lightning_attack + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH_ON_HOST_DESTROY + argument_hash_start_idx = 2 + /// Damage dealt by the shock of the chain lightning + var/shock_damage + /// Range the shock will jump to another target + var/shock_range + /// Maximum number of jumps the chain lightning can make + var/chain_limit + +/datum/element/chain_lightning_attack/Attach(datum/target, shock_damage = 10, shock_range = 2, chain_limit = 3) + . = ..() + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + + src.shock_damage = shock_damage + src.shock_range = shock_range + src.chain_limit = chain_limit + RegisterSignal(target, COMSIG_ITEM_AFTERATTACK, PROC_REF(try_chain)) + +/datum/element/chain_lightning_attack/Detach(datum/source, ...) + . = ..() + UnregisterSignal(source, COMSIG_ITEM_AFTERATTACK) + +/datum/element/chain_lightning_attack/proc/try_chain(obj/item/source, atom/hit, mob/user) + SIGNAL_HANDLER + + if(!isliving(hit)) + return + do_chain(source, hit, user, list(user)) + +/datum/element/chain_lightning_attack/proc/do_chain(obj/item/source, mob/living/next_target, atom/last_target, list/dont_hit = list()) + if(!next_target.electrocute_act(shock_damage, source, flags = SHOCK_NOGLOVES|SHOCK_NOSTUN)) + return + if(last_target != next_target) + last_target.Beam(next_target, icon_state = "lightning[rand(1, 12)]", time = 0.5 SECONDS) + dont_hit += next_target + if(length(dont_hit) >= chain_limit + 1) + return + + for(var/mob/living/other_victim in view(next_target, shock_range)) + if(other_victim in dont_hit) + continue + do_chain(source, other_victim, next_target, dont_hit) + break diff --git a/code/datums/elements/dextrous.dm b/code/datums/elements/dextrous.dm index 240cfc88494d3..a73d58e18788a 100644 --- a/code/datums/elements/dextrous.dm +++ b/code/datums/elements/dextrous.dm @@ -67,7 +67,7 @@ /datum/element/dextrous/proc/on_examined(mob/living/examined, mob/user, list/examine_list) SIGNAL_HANDLER for(var/obj/item/held_item in examined.held_items) - if(held_item.item_flags & (ABSTRACT|EXAMINE_SKIP|HAND_ITEM)) + if((held_item.item_flags & (ABSTRACT|HAND_ITEM)) || HAS_TRAIT(held_item, TRAIT_EXAMINE_SKIP)) continue examine_list += span_info("[examined.p_They()] [examined.p_have()] [held_item.examine_title(user)] in [examined.p_their()] \ [examined.get_held_index_name(examined.get_held_index_of_item(held_item))].") diff --git a/code/datums/elements/disarm_attack.dm b/code/datums/elements/disarm_attack.dm index 8b4b0b3ff8adf..3256e738d537e 100644 --- a/code/datums/elements/disarm_attack.dm +++ b/code/datums/elements/disarm_attack.dm @@ -27,7 +27,7 @@ SIGNAL_HANDLER if(!user.can_disarm(victim) || !can_disarm_attack(source, victim, user)) return COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN - if(victim.check_block(source, 0, "the [source.name]", MELEE_ATTACK, 0)) + if(victim.check_block(source, 0, "\the [source]", MELEE_ATTACK, 0)) return COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN user.disarm(victim, source) user.changeNext_move(source.secondary_attack_speed || source.attack_speed) diff --git a/code/datums/elements/food/love_food_buff.dm b/code/datums/elements/food/love_food_buff.dm index 5f2951be131ac..168808709d9a9 100644 --- a/code/datums/elements/food/love_food_buff.dm +++ b/code/datums/elements/food/love_food_buff.dm @@ -14,29 +14,17 @@ return ELEMENT_INCOMPATIBLE src.love_buff_type = love_buff_type - RegisterSignals(food.reagents, list( - COMSIG_REAGENTS_ADD_REAGENT, - COMSIG_REAGENTS_CLEAR_REAGENTS, - COMSIG_REAGENTS_DEL_REAGENT, - COMSIG_REAGENTS_NEW_REAGENT, - COMSIG_REAGENTS_REM_REAGENT, - ), PROC_REF(on_reagents_changed)) + RegisterSignal(food.reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(on_reagents_changed)) RegisterSignal(food, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) /datum/element/love_food_buff/Detach(datum/source, ...) var/obj/item/food/food = source if(istype(food) && !isnull(food.reagents)) - UnregisterSignal(food.reagents, list( - COMSIG_REAGENTS_ADD_REAGENT, - COMSIG_REAGENTS_CLEAR_REAGENTS, - COMSIG_REAGENTS_DEL_REAGENT, - COMSIG_REAGENTS_NEW_REAGENT, - COMSIG_REAGENTS_REM_REAGENT, - )) + UnregisterSignal(food.reagents, COMSIG_REAGENTS_HOLDER_UPDATED) UnregisterSignal(food, COMSIG_ATOM_EXAMINE) return ..() -/datum/element/love_food_buff/proc/on_reagents_changed(datum/reagents/source, ...) +/datum/element/love_food_buff/proc/on_reagents_changed(datum/reagents/source) SIGNAL_HANDLER var/obj/item/food/food = source.my_atom diff --git a/code/datums/elements/glass_pacifist.dm b/code/datums/elements/glass_pacifist.dm index 76204201c601e..dbec37bc43495 100644 --- a/code/datums/elements/glass_pacifist.dm +++ b/code/datums/elements/glass_pacifist.dm @@ -13,6 +13,6 @@ SIGNAL_HANDLER if(istype(hit, /obj/structure/window)) - owner.visible_message(span_notice("[owner.name] nuzzles the [hit.name]!")) + owner.visible_message(span_notice("\The [owner] nuzzles \the [hit]!")) new /obj/effect/temp_visual/heart(hit.loc) return COMPONENT_CANCEL_ATTACK_CHAIN diff --git a/code/datums/elements/mirage_border.dm b/code/datums/elements/mirage_border.dm index ca7c422dd1127..b7af7ee91f605 100644 --- a/code/datums/elements/mirage_border.dm +++ b/code/datums/elements/mirage_border.dm @@ -20,9 +20,10 @@ var/x = target_turf.x var/y = target_turf.y var/z = clamp(target_turf.z, 1, world.maxz) - var/turf/southwest = locate(clamp(x - (direction & WEST ? range : 0), 1, world.maxx), clamp(y - (direction & SOUTH ? range : 0), 1, world.maxy), z) - var/turf/northeast = locate(clamp(x + (direction & EAST ? range : 0), 1, world.maxx), clamp(y + (direction & NORTH ? range : 0), 1, world.maxy), z) - holder.vis_contents += block(southwest, northeast) + holder.vis_contents += block( + x - (direction & WEST ? range : 0), y - (direction & SOUTH ? range : 0), z, + x + (direction & EAST ? range : 0), y + (direction & NORTH ? range : 0), z + ) if(direction & SOUTH) holder.pixel_y -= ICON_SIZE_Y * range if(direction & WEST) diff --git a/code/datums/elements/organ_set_bonus.dm b/code/datums/elements/organ_set_bonus.dm index a8d1d3c7ad736..db35a2ef86672 100644 --- a/code/datums/elements/organ_set_bonus.dm +++ b/code/datums/elements/organ_set_bonus.dm @@ -86,7 +86,7 @@ bonus_active = TRUE // Add traits if(length(bonus_traits)) - owner.add_traits(bonus_traits, REF(src)) + owner.add_traits(bonus_traits, TRAIT_STATUS_EFFECT(id)) // Add biotype if(owner.mob_biotypes & bonus_biotype) @@ -113,7 +113,7 @@ // Remove traits if(length(bonus_traits)) - owner.remove_traits(bonus_traits, REF(src)) + owner.remove_traits(bonus_traits, TRAIT_STATUS_EFFECT(id)) // Remove biotype (if added) if(biotype_added) owner.mob_biotypes &= ~bonus_biotype diff --git a/code/datums/elements/slow_target_click_cd_attack.dm b/code/datums/elements/slow_target_click_cd_attack.dm new file mode 100644 index 0000000000000..93403501a34b3 --- /dev/null +++ b/code/datums/elements/slow_target_click_cd_attack.dm @@ -0,0 +1,54 @@ +/// Applied to items: Applies a status effect to the target that slows their click CD +/datum/element/slow_target_click_cd_attack + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH_ON_HOST_DESTROY + argument_hash_start_idx = 2 + /// How much click CD to add to the target's clicks + var/reduction + +/datum/element/slow_target_click_cd_attack/Attach(datum/target, reduction = 0.2 SECONDS) + . = ..() + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + + src.reduction = reduction + RegisterSignal(target, COMSIG_ITEM_AFTERATTACK, PROC_REF(try_slow)) + +/datum/element/slow_target_click_cd_attack/Detach(datum/source, ...) + . = ..() + UnregisterSignal(source, COMSIG_ITEM_AFTERATTACK) + +/datum/element/slow_target_click_cd_attack/proc/try_slow(obj/item/source, atom/hit, mob/user) + SIGNAL_HANDLER + + if(!isliving(hit)) + return + var/mob/living/target = hit + target.apply_status_effect(/datum/status_effect/cd_slow, reduction, REF(src)) + +/// Applied by [/datum/element/slow_target_click_cd_attack] to slow the target's click CD +/datum/status_effect/cd_slow + id = "cd_slow" + duration = 4 SECONDS + status_type = STATUS_EFFECT_MULTIPLE + alert_type = null + tick_interval = STATUS_EFFECT_NO_TICK + /// How much click CD to add to the target's clicks + var/reduction + /// The source of the slow, they don't stack + var/source + +/datum/status_effect/cd_slow/on_creation(mob/living/new_owner, reduction, source) + src.reduction = reduction + src.source = source + return ..() + +/datum/status_effect/cd_slow/on_apply() + for(var/datum/status_effect/cd_slow/slow in owner) + if(slow.source == src.source) + slow.reduction = max(slow.reduction, src.reduction) + return FALSE + + return TRUE + +/datum/status_effect/cd_slow/nextmove_adjust() + return reduction diff --git a/code/datums/elements/strippable.dm b/code/datums/elements/strippable.dm index 14cdda8e4cf52..8269128e1b08f 100644 --- a/code/datums/elements/strippable.dm +++ b/code/datums/elements/strippable.dm @@ -362,7 +362,7 @@ continue var/obj/item/item = item_data.get_item(owner) - if (isnull(item) || (HAS_TRAIT(item, TRAIT_NO_STRIP) || (item.item_flags & EXAMINE_SKIP))) + if (isnull(item) || (HAS_TRAIT(item, TRAIT_NO_STRIP) || HAS_TRAIT(item, TRAIT_EXAMINE_SKIP))) items[strippable_key] = result continue diff --git a/code/datums/embedding.dm b/code/datums/embedding.dm index 961991bc1e0ad..10ba41b45b199 100644 --- a/code/datums/embedding.dm +++ b/code/datums/embedding.dm @@ -361,7 +361,7 @@ owner.emote("scream") -/// The proper proc to call when you want to remove something. If a mob is passed, the item will be put in its hands - otherwise its just dumped onto the ground +/// The proper proc to call when you want to remove something. If a mob is passed, the item will be put in its hands - otherwise it's just dumped onto the ground /datum/embedding/proc/remove_embedding(mob/living/to_hands) var/mob/living/carbon/stored_owner = owner if (stop_embedding()) // Dropdel? diff --git a/code/datums/greyscale/layer.dm b/code/datums/greyscale/layer.dm index f12fb1992c9db..6512a6c3d5619 100644 --- a/code/datums/greyscale/layer.dm +++ b/code/datums/greyscale/layer.dm @@ -92,8 +92,7 @@ /datum/greyscale_layer/icon_state/Initialize(icon_file) . = ..() - var/list/icon_states = icon_states(icon_file) - if(!(icon_state in icon_states)) + if(!icon_exists(icon_file, icon_state)) CRASH("Configured icon state \[[icon_state]\] was not found in [icon_file]. Double check your json configuration.") icon = new(icon_file, icon_state) diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index 1b7da660e578b..25f33ec359029 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -89,4 +89,4 @@ msg += "Protect Assistant Role From Traitor: [CONFIG_GET(flag/protect_assistant_from_antagonist) ? "Yes" : "No"]" msg += "Enforce Human Authority: [CONFIG_GET(string/human_authority) ? "Yes" : "No"]" msg += "Allow Latejoin Antagonists: [CONFIG_GET(flag/allow_latejoin_antagonists) ? "Yes" : "No"]" - to_chat(src, fieldset_block("Server Revision Info", span_infoplain(jointext(msg, "
")), "boxed_message")) + to_chat(src, fieldset_block("Server Revision Info", span_infoplain(jointext(msg, "
")), "boxed_message"), type = MESSAGE_TYPE_INFO) diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm index e46467327ede7..c4028c47edda2 100644 --- a/code/datums/martial/boxing.dm +++ b/code/datums/martial/boxing.dm @@ -111,7 +111,7 @@ if(istype(potential_spine)) strength_bonus *= potential_spine.strength_bonus - damage += round(athletics_skill * check_streak(attacker, defender) + strength_bonus) + damage += round(athletics_skill * check_streak(attacker, defender) + strength_bonus, 1) grant_experience = TRUE var/current_atk_verb = atk_verb @@ -149,7 +149,7 @@ to_chat(attacker, span_danger("You [current_atk_verbed] [defender]!")) // Determines the total amount of experience earned per punch - var/experience_earned = round(damage * 0.25, 0.1) + var/experience_earned = round(damage/4, 1) defender.apply_damage(damage, damage_type, affecting, armor_block) @@ -168,7 +168,7 @@ var/defender_athletics_skill = clamp(defender.mind?.get_skill_modifier(/datum/skill/athletics, SKILL_RANDS_MODIFIER), 0, 100) //Determine our final probability, using a clamp to stop any prob() weirdness. - var/final_knockout_probability = clamp(round(attacker_athletics_skill - defender_athletics_skill), 0 , 100) + var/final_knockout_probability = clamp(round(attacker_athletics_skill - defender_athletics_skill, 1), 0 , 100) if(!prob(final_knockout_probability)) return TRUE @@ -222,10 +222,10 @@ /// Handles our instances of experience gain while boxing. It also applies the exercised status effect. /datum/martial_art/boxing/proc/skill_experience_adjustment(mob/living/boxer, experience_value) //Boxing in heavier gravity gives you more experience - var/gravity_modifier = boxer.has_gravity() > STANDARD_GRAVITY ? 1 : 0.5 + var/gravity_modifier = boxer.has_gravity() > STANDARD_GRAVITY ? 1 : 2 //You gotta sleep before you get any experience! - boxer.mind?.adjust_experience(/datum/skill/athletics, round(experience_value * gravity_modifier, 0.1)) + boxer.mind?.adjust_experience(/datum/skill/athletics, round(experience_value / gravity_modifier, 1)) boxer.apply_status_effect(/datum/status_effect/exercised) /// Handles our blocking signals, similar to hit_reaction() on items. Only blocks while the boxer is in throw mode. @@ -254,7 +254,7 @@ if(!honor_check(attacker)) return NONE - var/experience_earned = round(damage * 0.25, 0.1) + var/experience_earned = round(damage/4, 1) if(!damage) experience_earned = 2 @@ -346,16 +346,17 @@ human_attacker.say("[first_word_pick][second_word_pick]!!!", forced = "hunter boxing enthusiastic battlecry") defender.apply_status_effect(/datum/status_effect/rebuked) defender.apply_damage(damage * 2, default_damage_type, BODY_ZONE_CHEST, armor_block) //deals double our damage AGAIN - attacker.reagents.add_reagent(/datum/reagent/medicine/omnizine/godblood, 3) //Get a little healing in return for a successful crit + + var/healing_factor = round(damage/3, 1) + attacker.heal_overall_damage(healing_factor, healing_factor, healing_factor) log_combat(attacker, defender, "hunter crit punched (boxing)") -// Our hunter boxer speeds up their attacks when completing a combo against a valid target, and does a sizable amount of extra damage. +// Our hunter boxer does a sizable amount of extra damage on a successful combo or block /datum/martial_art/boxing/hunter/perform_extra_effect(mob/living/attacker, mob/living/defender) if(defender.mob_biotypes & MOB_HUMANOID && !istype(defender, /mob/living/simple_animal/hostile/megafauna)) return // Does not apply to humans (who aren't megafauna) - attacker.changeNext_move(CLICK_CD_RAPID) defender.apply_damage(rand(15,20), default_damage_type, BODY_ZONE_CHEST) #undef LEFT_RIGHT_COMBO diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm index b9568d9ee2c47..c1ea1cf239ed3 100644 --- a/code/datums/materials/basemats.dm +++ b/code/datums/materials/basemats.dm @@ -531,7 +531,7 @@ Unless you know what you're doing, only use the first three numbers. They're in /datum/material/wood name = "wood" - desc = "Flexible, durable, but flamable. Hard to come across in space." + desc = "Flexible, durable, but flammable. Hard to come across in space." color = "#855932" strength_modifier = 0.5 sheet_type = /obj/item/stack/sheet/mineral/wood diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index d91ea0ccc222c..af30aa6e33f69 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -491,7 +491,7 @@ //Used by the Veteran Advisor trait job /datum/mood_event/desentized - description = "Nothing will ever rival with what I seen in the past..." + description = "Nothing will ever rival what I've seen in the past..." mood_change = -3 special_screen_obj = "mood_desentized" diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index ca523984d59cf..2c4ac282c64ed 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -290,7 +290,7 @@ timeout = 30 SECONDS /datum/mood_event/gamer_won - description = "I love winning videogames!" + description = "I love winning video games!" mood_change = 10 timeout = 5 MINUTES diff --git a/code/datums/mutations/touch.dm b/code/datums/mutations/touch.dm index 4cfb605ba3d5f..f31e6e48a6e9a 100644 --- a/code/datums/mutations/touch.dm +++ b/code/datums/mutations/touch.dm @@ -419,3 +419,4 @@ icon_state = "greyscale" color = COLOR_VERY_PALE_LIME_GREEN inhand_icon_state = "greyscale" + item_flags = parent_type::item_flags & ~NEEDS_PERMIT diff --git a/code/datums/quirks/_quirk.dm b/code/datums/quirks/_quirk.dm index 12396387e9e1c..2dd6200cfccbc 100644 --- a/code/datums/quirks/_quirk.dm +++ b/code/datums/quirks/_quirk.dm @@ -33,11 +33,23 @@ /// The base weight for the each quirk's mail goodies list to be selected is 5 /// then the item selected is determined by pick(selected_quirk.mail_goodies) var/list/mail_goodies + /// max stat below which this quirk can process (if it has QUIRK_PROCESSES) and above which it stops. + /// If null, then it will process regardless of stat. + var/maximum_process_stat = HARD_CRIT + /// A list of additional signals to register with update_process() + var/list/process_update_signals + /// A list of traits that should stop this quirk from processing. + /// Signals for adding and removing this trait will automatically be added to `process_update_signals`. + var/list/no_process_traits + +/datum/quirk/New() + . = ..() + for(var/trait in no_process_traits) + LAZYADD(process_update_signals, list(SIGNAL_ADDTRAIT(trait), SIGNAL_REMOVETRAIT(trait))) /datum/quirk/Destroy() if(quirk_holder) remove_from_current_holder() - return ..() /// Called when quirk_holder is qdeleting. Simply qdels this datum and lets Destroy() handle the rest. @@ -78,7 +90,12 @@ add(client_source) if(quirk_flags & QUIRK_PROCESSES) - START_PROCESSING(SSquirks, src) + if(!isnull(maximum_process_stat)) + RegisterSignal(quirk_holder, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_changed)) + if(process_update_signals) + RegisterSignals(quirk_holder, process_update_signals, PROC_REF(update_process)) + if(should_process()) + START_PROCESSING(SSquirks, src) if(!quirk_transfer) if(gain_text) @@ -99,7 +116,9 @@ if(!quirk_holder) CRASH("Attempted to remove quirk from the current holder when it has no current holder.") - UnregisterSignal(quirk_holder, list(COMSIG_MOB_LOGIN, COMSIG_QDELETING)) + UnregisterSignal(quirk_holder, list(COMSIG_MOB_STATCHANGE, COMSIG_MOB_LOGIN, COMSIG_QDELETING)) + if(process_update_signals) + UnregisterSignal(quirk_holder, process_update_signals) quirk_holder.quirks -= src @@ -148,6 +167,35 @@ /datum/quirk/proc/post_add() return +/// Returns if the quirk holder should process currently or not. +/datum/quirk/proc/should_process() + SHOULD_CALL_PARENT(TRUE) + SHOULD_BE_PURE(TRUE) + if(QDELETED(quirk_holder)) + return FALSE + if(!(quirk_flags & QUIRK_PROCESSES)) + return FALSE + if(!isnull(maximum_process_stat) && quirk_holder.stat >= maximum_process_stat) + return FALSE + for(var/trait in no_process_traits) + if(HAS_TRAIT(quirk_holder, trait)) + return FALSE + return TRUE + +/// Checks to see if the quirk should be processing, and starts/stops it. +/datum/quirk/proc/update_process() + SIGNAL_HANDLER + SHOULD_NOT_OVERRIDE(TRUE) + if(should_process()) + START_PROCESSING(SSquirks, src) + else + STOP_PROCESSING(SSquirks, src) + +/// Updates processing status whenever the mob's stat changes. +/datum/quirk/proc/on_stat_changed(mob/living/source, new_stat) + SIGNAL_HANDLER + update_process() + /// Subtype quirk that has some bonus logic to spawn items for the player. /datum/quirk/item_quirk /// Lazylist of strings describing where all the quirk items have been spawned. @@ -204,7 +252,7 @@ /mob/living/proc/get_quirk_string(medical = FALSE, category = CAT_QUIRK_ALL, from_scan = FALSE) var/list/dat = list() for(var/datum/quirk/candidate as anything in quirks) - if(from_scan & candidate.quirk_flags & QUIRK_HIDE_FROM_SCAN) + if(from_scan && (candidate.quirk_flags & QUIRK_HIDE_FROM_SCAN)) continue switch(category) if(CAT_QUIRK_MAJOR_DISABILITY) @@ -218,7 +266,7 @@ continue dat += medical ? candidate.medical_record_text : candidate.name - if(!dat.len) + if(!length(dat)) return medical ? "No issues have been declared." : "None" return medical ? dat.Join("
") : dat.Join(", ") diff --git a/code/datums/quirks/negative_quirks/addict.dm b/code/datums/quirks/negative_quirks/addict.dm index 2ab7b8641274b..8574c6060d6b8 100644 --- a/code/datums/quirks/negative_quirks/addict.dm +++ b/code/datums/quirks/negative_quirks/addict.dm @@ -5,15 +5,16 @@ medical_record_text = "Patient has a history with SOMETHING but he refuses to tell us what it is." abstract_parent_type = /datum/quirk/item_quirk/addict quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES + no_process_traits = list(TRAIT_LIVERLESS_METABOLISM) var/datum/reagent/reagent_type //!If this is defined, reagent_id will be unused and the defined reagent type will be instead. var/datum/reagent/reagent_instance //! actual instanced version of the reagent var/where_drug //! Where the drug spawned var/obj/item/drug_container_type //! If this is defined before pill generation, pill generation will be skipped. This is the type of the pill bottle. var/where_accessory //! where the accessory spawned var/obj/item/accessory_type //! If this is null, an accessory won't be spawned. - var/process_interval = 30 SECONDS //! how frequently the quirk processes - var/next_process = 0 //! ticker for processing var/drug_flavour_text = "Better hope you don't run out... of what, exactly? You don't know." + var/process_interval = 30 SECONDS //! how frequently the quirk processes + COOLDOWN_DECLARE(next_process) //! ticker for processing /datum/quirk/item_quirk/addict/add_unique(client/client_source) var/mob/living/carbon/human/human_holder = quirk_holder @@ -62,22 +63,21 @@ ) /datum/quirk/item_quirk/addict/process(seconds_per_tick) - if(HAS_TRAIT(quirk_holder, TRAIT_LIVERLESS_METABOLISM)) + if(!COOLDOWN_FINISHED(src, next_process)) return + COOLDOWN_START(src, next_process, process_interval) var/mob/living/carbon/human/human_holder = quirk_holder - if(world.time > next_process) - next_process = world.time + process_interval - var/deleted = QDELETED(reagent_instance) - var/missing_addiction = FALSE - for(var/addiction_type in reagent_instance.addiction_types) - if(!LAZYACCESS(human_holder.last_mind?.active_addictions, addiction_type)) - missing_addiction = TRUE - if(deleted || missing_addiction) - if(deleted) - reagent_instance = new reagent_type() - to_chat(quirk_holder, span_danger("You thought you kicked it, but you feel like you're falling back onto bad habits..")) - for(var/addiction in reagent_instance.addiction_types) - human_holder.last_mind?.add_addiction_points(addiction, 1000) ///Max that shit out + var/deleted = QDELETED(reagent_instance) + var/missing_addiction = FALSE + for(var/addiction_type in reagent_instance.addiction_types) + if(!LAZYACCESS(human_holder.last_mind?.active_addictions, addiction_type)) + missing_addiction = TRUE + if(deleted || missing_addiction) + if(deleted) + reagent_instance = new reagent_type() + to_chat(quirk_holder, span_danger("You thought you kicked it, but you feel like you're falling back onto bad habits..")) + for(var/addiction in reagent_instance.addiction_types) + human_holder.last_mind?.add_addiction_points(addiction, 1000) ///Max that shit out /datum/quirk/item_quirk/addict/junkie name = "Junkie" diff --git a/code/datums/quirks/negative_quirks/allergic.dm b/code/datums/quirks/negative_quirks/allergic.dm index 8588b95e6e33c..43bee117c4061 100644 --- a/code/datums/quirks/negative_quirks/allergic.dm +++ b/code/datums/quirks/negative_quirks/allergic.dm @@ -9,6 +9,7 @@ hardcore_value = 3 quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES mail_goodies = list(/obj/item/reagent_containers/hypospray/medipen) // epinephrine medipen stops allergic reactions + no_process_traits = list(TRAIT_STASIS) var/list/allergies = list() var/list/blacklist = list( /datum/reagent/medicine/c2, @@ -45,15 +46,6 @@ to_chat(quirk_holder, span_boldnotice("You are allergic to [allergy_string], make sure not to consume any of these!")) /datum/quirk/item_quirk/allergic/process(seconds_per_tick) - if(!iscarbon(quirk_holder)) - return - - if(HAS_TRAIT(quirk_holder, TRAIT_STASIS)) - return - - if(quirk_holder.stat == DEAD) - return - var/mob/living/carbon/carbon_quirk_holder = quirk_holder //Just halts the progression, I'd suggest you run to medbay asap to get it fixed if(carbon_quirk_holder.reagents.has_reagent(/datum/reagent/medicine/epinephrine)) diff --git a/code/datums/quirks/negative_quirks/brain_problems.dm b/code/datums/quirks/negative_quirks/brain_problems.dm index 15cc0128020cf..448835009cd34 100644 --- a/code/datums/quirks/negative_quirks/brain_problems.dm +++ b/code/datums/quirks/negative_quirks/brain_problems.dm @@ -14,6 +14,7 @@ hardcore_value = 12 quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES mail_goodies = list(/obj/item/storage/pill_bottle/mannitol/braintumor) + no_process_traits = list(TRAIT_TUMOR_SUPPRESSED) /datum/quirk/item_quirk/brainproblems/add_unique(client/client_source) give_item_to_holder( @@ -28,10 +29,4 @@ ) /datum/quirk/item_quirk/brainproblems/process(seconds_per_tick) - if(quirk_holder.stat == DEAD) - return - - if(HAS_TRAIT(quirk_holder, TRAIT_TUMOR_SUPPRESSED)) - return - quirk_holder.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.2 * seconds_per_tick) diff --git a/code/datums/quirks/negative_quirks/claustrophobia.dm b/code/datums/quirks/negative_quirks/claustrophobia.dm index 226c9b65ef849..918db086db97a 100644 --- a/code/datums/quirks/negative_quirks/claustrophobia.dm +++ b/code/datums/quirks/negative_quirks/claustrophobia.dm @@ -7,17 +7,13 @@ hardcore_value = 5 quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES mail_goodies = list(/obj/item/reagent_containers/syringe/convermol) // to help breathing + maximum_process_stat = SOFT_CRIT + no_process_traits = list(TRAIT_MIND_TEMPORARILY_GONE, TRAIT_FEARLESS, TRAIT_KNOCKEDOUT) /datum/quirk/claustrophobia/remove() quirk_holder.clear_mood_event("claustrophobia") /datum/quirk/claustrophobia/process(seconds_per_tick) - if(quirk_holder.stat != CONSCIOUS || quirk_holder.IsSleeping() || quirk_holder.IsUnconscious()) - return - - if(HAS_TRAIT(quirk_holder, TRAIT_MIND_TEMPORARILY_GONE) || HAS_TRAIT(quirk_holder, TRAIT_FEARLESS)) - return - var/nick_spotted = FALSE for(var/mob/living/carbon/human/possible_claus in view(5, quirk_holder)) diff --git a/code/datums/quirks/negative_quirks/family_heirloom.dm b/code/datums/quirks/negative_quirks/family_heirloom.dm index 235913120a3fb..d7b2755088ab2 100644 --- a/code/datums/quirks/negative_quirks/family_heirloom.dm +++ b/code/datums/quirks/negative_quirks/family_heirloom.dm @@ -55,9 +55,6 @@ return ..() /datum/quirk/item_quirk/family_heirloom/process() - if(quirk_holder.stat == DEAD) - return - var/obj/family_heirloom = heirloom?.resolve() if(family_heirloom && (family_heirloom in quirk_holder.get_all_contents())) diff --git a/code/datums/quirks/neutral_quirks/pineapple_hater.dm b/code/datums/quirks/neutral_quirks/pineapple_hater.dm index 858963e0a36e0..8a6beb5e24c92 100644 --- a/code/datums/quirks/neutral_quirks/pineapple_hater.dm +++ b/code/datums/quirks/neutral_quirks/pineapple_hater.dm @@ -1,6 +1,6 @@ /datum/quirk/pineapple_hater name = "Ananas Aversion" - desc = "You find yourself greatly detesting fruits of the ananas genus. Serious, how the hell can anyone say these things are good? And what kind of madman would even dare putting it on a pizza!?" + desc = "You find yourself greatly detesting fruits of the ananas genus. Serious, how the hell can anyone say these things are good? And what kind of madman would even dare put it on a pizza!?" icon = FA_ICON_THUMBS_DOWN value = 0 gain_text = span_notice("You find yourself pondering what kind of idiot actually enjoys pineapples...") diff --git a/code/datums/quirks/neutral_quirks/snob.dm b/code/datums/quirks/neutral_quirks/snob.dm index ab273f1ae530e..fa32cbd5f2aab 100644 --- a/code/datums/quirks/neutral_quirks/snob.dm +++ b/code/datums/quirks/neutral_quirks/snob.dm @@ -1,6 +1,6 @@ /datum/quirk/snob name = "Snob" - desc = "You care about the finer things, if a room doesn't look nice its just not really worth it, is it?" + desc = "You care about the finer things, if a room doesn't look nice it's just not really worth it, is it?" icon = FA_ICON_USER_TIE value = 0 gain_text = span_notice("You feel like you understand what things should look like.") diff --git a/code/datums/quirks/positive_quirks/throwing_arm.dm b/code/datums/quirks/positive_quirks/throwing_arm.dm index 5157b3990095b..8b1e6b0f235b5 100644 --- a/code/datums/quirks/positive_quirks/throwing_arm.dm +++ b/code/datums/quirks/positive_quirks/throwing_arm.dm @@ -1,6 +1,6 @@ /datum/quirk/throwingarm name = "Throwing Arm" - desc = "Your arms have a lot of heft to them! Objects that you throw just always seem to fly further than everyone elses, and you never miss a toss." + desc = "Your arms have a lot of heft to them! Objects that you throw just always seem to fly farther than everyone else's, and you never miss a toss." icon = FA_ICON_BASEBALL value = 7 mob_trait = TRAIT_THROWINGARM diff --git a/code/datums/ruins/icemoon.dm b/code/datums/ruins/icemoon.dm index 86fba76bc15eb..e5b37fb2e03f4 100644 --- a/code/datums/ruins/icemoon.dm +++ b/code/datums/ruins/icemoon.dm @@ -70,7 +70,7 @@ /datum/map_template/ruin/icemoon/frozen_phonebooth name = "Ice-Ruin Frozen Phonebooth" id = "frozen_phonebooth" - description = "A venture by Nanotrasen to help popularize the use of holopads. This one was sent to a icemoon." + description = "A venture by Nanotrasen to help popularize the use of holopads. This one was sent to an ice moon." suffix = "icemoon_surface_phonebooth.dmm" /datum/map_template/ruin/icemoon/smoking_room @@ -169,7 +169,7 @@ /datum/map_template/ruin/icemoon/underground/biodome name = "Ice-Ruin Syndicate Bio-Dome" id = "biodome" - description = "Unchecked experimention gone awry." + description = "Unchecked experimentation gone awry." suffix = "icemoon_underground_syndidome.dmm" /datum/map_template/ruin/icemoon/underground/frozen_comms diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index f2d76d9b86e6e..0b3d25987d829 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -446,7 +446,7 @@ id = "waystation" suffix = "waystation.dmm" name = "Space-Ruin Waystation" - description = "A waytation for a backwater subsector of Spinward gets attacked by the syndicate due to bad luck." + description = "A waystation for a backwater subsector of Spinward gets attacked by the syndicate due to bad luck." /datum/map_template/ruin/space/allamericandiner id = "allamericandiner" diff --git a/code/datums/shuttles/_shuttle.dm b/code/datums/shuttles/_shuttle.dm index 94c20d41b7365..52cb31a11fd76 100644 --- a/code/datums/shuttles/_shuttle.dm +++ b/code/datums/shuttles/_shuttle.dm @@ -56,8 +56,8 @@ . = ..() if(!.) return - var/list/turfs = block( locate(.[MAP_MINX], .[MAP_MINY], .[MAP_MINZ]), - locate(.[MAP_MAXX], .[MAP_MAXY], .[MAP_MAXZ])) + var/list/turfs = block( .[MAP_MINX], .[MAP_MINY], .[MAP_MINZ], + .[MAP_MAXX], .[MAP_MAXY], .[MAP_MAXZ]) for(var/i in 1 to turfs.len) var/turf/place = turfs[i] if(isspaceturf(place)) // This assumes all shuttles are loaded in a single spot then moved to their real destination. diff --git a/code/datums/shuttles/arrival.dm b/code/datums/shuttles/arrival.dm index 35e28a10c064b..c609ccc57410d 100644 --- a/code/datums/shuttles/arrival.dm +++ b/code/datums/shuttles/arrival.dm @@ -26,6 +26,10 @@ suffix = "pubby" name = "arrival shuttle (Pubby)" +/datum/map_template/shuttle/arrival/northstar + suffix = "northstar" + name = "arrival shuttle (North Star)" + /datum/map_template/shuttle/arrival/nebula suffix = "nebula" name = "arrival shuttle (Nebula)" diff --git a/code/datums/shuttles/cargo.dm b/code/datums/shuttles/cargo.dm index 91b9c9bca417b..209ec59f66f2e 100644 --- a/code/datums/shuttles/cargo.dm +++ b/code/datums/shuttles/cargo.dm @@ -27,6 +27,10 @@ suffix = "delta" name = "cargo ferry (Delta)" +/datum/map_template/shuttle/cargo/northstar + suffix = "northstar" + name = "cargo ferry (North Star)" + /datum/map_template/shuttle/cargo/nebula suffix = "nebula" name = "supply shuttle (Nebula)" diff --git a/code/datums/shuttles/mining.dm b/code/datums/shuttles/mining.dm index 4bae7ebd78553..21747a488e326 100644 --- a/code/datums/shuttles/mining.dm +++ b/code/datums/shuttles/mining.dm @@ -44,6 +44,10 @@ suffix = "large" name = "mining shuttle (Large)" +/datum/map_template/shuttle/mining/northstar + suffix = "northstar" + name = "mining shuttle (North Star)" + /datum/map_template/shuttle/mining/nebula suffix = "nebula" name = "mining shuttle (Nebula)" @@ -60,3 +64,7 @@ /datum/map_template/shuttle/mining_common/kilo suffix = "kilo" name = "lavaland shuttle (Kilo)" + +/datum/map_template/shuttle/mining_common/northstar + suffix = "northstar" + name = "lavaland shuttle (North Star)" diff --git a/code/datums/station_traits/neutral_traits.dm b/code/datums/station_traits/neutral_traits.dm index 97d767a733ee3..382f45081fe44 100644 --- a/code/datums/station_traits/neutral_traits.dm +++ b/code/datums/station_traits/neutral_traits.dm @@ -585,3 +585,15 @@ /datum/station_trait/pet_day/proc/on_lobby_button_update_overlays(atom/movable/screen/lobby/button/sign_up/lobby_button, list/overlays) overlays += "select_pet" + +/// We're pulling a Jim Kramer with this one boys +/datum/station_trait/gmm_spotlight + name = "GMM Economic Spotlight" + report_message = "This shift, the Galactic Mineral Market is doing a showcase on your crew's affulence! Every paycheck, the station newscasters will alert the crew who has the most credits." + trait_type = STATION_TRAIT_NEUTRAL + trait_to_give = STATION_TRAIT_ECONOMY_ALERTS + weight = 2 + cost = STATION_TRAIT_COST_LOW + show_in_report = TRUE + + dynamic_threat_id = "GMM Econ Spotlight" diff --git a/code/datums/status_effects/_status_effect.dm b/code/datums/status_effects/_status_effect.dm index 9f3e3a549046b..bda487429972c 100644 --- a/code/datums/status_effects/_status_effect.dm +++ b/code/datums/status_effects/_status_effect.dm @@ -75,6 +75,8 @@ START_PROCESSING(SSfastprocess, src) if(STATUS_EFFECT_NORMAL_PROCESS) START_PROCESSING(SSprocessing, src) + if(STATUS_EFFECT_PRIORITY) + START_PROCESSING(SSpriority_effects, src) update_particles() @@ -86,6 +88,8 @@ STOP_PROCESSING(SSfastprocess, src) if(STATUS_EFFECT_NORMAL_PROCESS) STOP_PROCESSING(SSprocessing, src) + if(STATUS_EFFECT_PRIORITY) + STOP_PROCESSING(SSpriority_effects, src) if(owner) linked_alert = null owner.clear_alert(id) diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index e4471f2f4dbd8..851d9784e4966 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -428,7 +428,7 @@ if(iscarbon(owner)) chainsaw = new(get_turf(owner)) - ADD_TRAIT(chainsaw, TRAIT_NODROP, CHAINSAW_FRENZY_TRAIT) + ADD_TRAIT(chainsaw, TRAIT_NODROP, TRAIT_STATUS_EFFECT(id)) owner.put_in_hands(chainsaw, forced = TRUE) chainsaw.attack_self(owner) owner.reagents.add_reagent(/datum/reagent/medicine/adminordrazine, 25) @@ -559,7 +559,7 @@ owner.AddElement(/datum/element/simple_flying) owner.add_stun_absorption(source = id, priority = 4) owner.add_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown) - ADD_TRAIT(owner, TRAIT_FREE_HYPERSPACE_MOVEMENT, id) + ADD_TRAIT(owner, TRAIT_FREE_HYPERSPACE_MOVEMENT, TRAIT_STATUS_EFFECT(id)) owner.playsound_local(get_turf(owner), 'sound/effects/chemistry/ahaha.ogg', vol = 100, vary = TRUE, use_reverb = TRUE) return TRUE @@ -577,7 +577,7 @@ owner.RemoveElement(/datum/element/simple_flying) owner.remove_stun_absorption(id) owner.remove_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown) - REMOVE_TRAIT(owner, TRAIT_FREE_HYPERSPACE_MOVEMENT, id) + REMOVE_TRAIT(owner, TRAIT_FREE_HYPERSPACE_MOVEMENT, TRAIT_STATUS_EFFECT(id)) /// Gives you a brief period of anti-gravity /datum/status_effect/jump_jet @@ -600,11 +600,11 @@ alert_type = null /datum/status_effect/radiation_immunity/on_apply() - ADD_TRAIT(owner, TRAIT_RADIMMUNE, type) + ADD_TRAIT(owner, TRAIT_RADIMMUNE, TRAIT_STATUS_EFFECT(id)) return TRUE /datum/status_effect/radiation_immunity/on_remove() - REMOVE_TRAIT(owner, TRAIT_RADIMMUNE, type) + REMOVE_TRAIT(owner, TRAIT_RADIMMUNE, TRAIT_STATUS_EFFECT(id)) /datum/status_effect/radiation_immunity/radnebula alert_type = /atom/movable/screen/alert/status_effect/radiation_immunity diff --git a/code/datums/status_effects/buffs/food/grant_trait.dm b/code/datums/status_effects/buffs/food/grant_trait.dm index f25be3b0b3bfd..46d4b060739dc 100644 --- a/code/datums/status_effects/buffs/food/grant_trait.dm +++ b/code/datums/status_effects/buffs/food/grant_trait.dm @@ -3,16 +3,16 @@ var/trait = TRAIT_DUMB // You need to override this /datum/status_effect/food/trait/on_apply() - if(!HAS_TRAIT_FROM(owner, trait, type)) // Check if trait was already applied - ADD_TRAIT(owner, trait, type) + if(!HAS_TRAIT_FROM(owner, trait, TRAIT_STATUS_EFFECT(id))) // Check if trait was already applied + ADD_TRAIT(owner, trait, TRAIT_STATUS_EFFECT(id)) return ..() /datum/status_effect/food/trait/be_replaced() - REMOVE_TRAIT(owner, trait, type) + REMOVE_TRAIT(owner, trait, TRAIT_STATUS_EFFECT(id)) return ..() /datum/status_effect/food/trait/on_remove() - REMOVE_TRAIT(owner, trait, type) + REMOVE_TRAIT(owner, trait, TRAIT_STATUS_EFFECT(id)) return ..() /datum/status_effect/food/trait/shockimmune diff --git a/code/datums/status_effects/buffs/stop_drop_roll.dm b/code/datums/status_effects/buffs/stop_drop_roll.dm index 17b4d6d768de3..96db96372dd12 100644 --- a/code/datums/status_effects/buffs/stop_drop_roll.dm +++ b/code/datums/status_effects/buffs/stop_drop_roll.dm @@ -1,8 +1,8 @@ /datum/status_effect/stop_drop_roll id = "stop_drop_roll" alert_type = null - tick_interval = 0.8 SECONDS + processing_speed = STATUS_EFFECT_PRIORITY /datum/status_effect/stop_drop_roll/on_apply() if(!iscarbon(owner)) @@ -15,7 +15,7 @@ RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(stop_rolling)) RegisterSignal(owner, COMSIG_LIVING_SET_BODY_POSITION, PROC_REF(body_position_changed)) - ADD_TRAIT(owner, TRAIT_HANDS_BLOCKED, id) // they're kinda busy! + ADD_TRAIT(owner, TRAIT_HANDS_BLOCKED, TRAIT_STATUS_EFFECT(id)) // they're kinda busy! owner.visible_message( span_danger("[owner] rolls on the floor, trying to put [owner.p_them()]self out!"), @@ -31,7 +31,7 @@ /datum/status_effect/stop_drop_roll/on_remove() UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_LIVING_SET_BODY_POSITION)) - REMOVE_TRAIT(owner, TRAIT_HANDS_BLOCKED, id) + REMOVE_TRAIT(owner, TRAIT_HANDS_BLOCKED, TRAIT_STATUS_EFFECT(id)) /datum/status_effect/stop_drop_roll/tick(seconds_between_ticks) if(HAS_TRAIT(owner, TRAIT_IMMOBILIZED) || HAS_TRAIT(owner, TRAIT_INCAPACITATED)) diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index 7627d16b66f45..ca2f678859dfa 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -12,6 +12,7 @@ tick_interval = STATUS_EFFECT_NO_TICK status_type = STATUS_EFFECT_REPLACE alert_type = null + processing_speed = STATUS_EFFECT_PRIORITY remove_on_fullheal = TRUE heal_flag_necessary = HEAL_CC_STATUS var/needs_update_stat = FALSE @@ -549,13 +550,13 @@ /datum/status_effect/gonbola_pacify/on_apply() . = ..() - owner.add_traits(list(TRAIT_PACIFISM, TRAIT_MUTE), CLOTHING_TRAIT) - owner.add_mood_event(type, /datum/mood_event/gondola) + owner.add_traits(list(TRAIT_PACIFISM, TRAIT_MUTE), REF(src)) + owner.add_mood_event(REF(src), /datum/mood_event/gondola) to_chat(owner, span_notice("You suddenly feel at peace and feel no need to make any sudden or rash actions...")) /datum/status_effect/gonbola_pacify/on_remove() - owner.remove_traits(list(TRAIT_PACIFISM, TRAIT_MUTE), CLOTHING_TRAIT) - owner.clear_mood_event(type) + owner.remove_traits(list(TRAIT_PACIFISM, TRAIT_MUTE), REF(src)) + owner.clear_mood_event(REF(src)) return ..() /datum/status_effect/trance @@ -580,7 +581,7 @@ if(!iscarbon(owner)) return FALSE RegisterSignal(owner, COMSIG_MOVABLE_HEAR, PROC_REF(hypnotize)) - ADD_TRAIT(owner, TRAIT_MUTE, STATUS_EFFECT_TRAIT) + ADD_TRAIT(owner, TRAIT_MUTE, TRAIT_STATUS_EFFECT(id)) owner.add_client_colour(/datum/client_colour/monochrome/trance) owner.visible_message("[stun ? span_warning("[owner] stands still as [owner.p_their()] eyes seem to focus on a distant point.") : ""]", \ span_warning(pick("You feel your thoughts slow down...", "You suddenly feel extremely dizzy...", "You feel like you're in the middle of a dream...","You feel incredibly relaxed..."))) @@ -593,7 +594,7 @@ /datum/status_effect/trance/on_remove() UnregisterSignal(owner, COMSIG_MOVABLE_HEAR) - REMOVE_TRAIT(owner, TRAIT_MUTE, STATUS_EFFECT_TRAIT) + REMOVE_TRAIT(owner, TRAIT_MUTE, TRAIT_STATUS_EFFECT(id)) owner.remove_status_effect(/datum/status_effect/dizziness) owner.remove_client_colour(/datum/client_colour/monochrome/trance) to_chat(owner, span_warning("You snap out of your trance!")) @@ -801,7 +802,7 @@ if(prob(40)) fake_emote = "cough" else - owner.sneeze() + fake_emote = "sneeze" if(fake_emote) owner.emote(fake_emote) @@ -977,11 +978,11 @@ icon_state = "convulsing" /datum/status_effect/discoordinated/on_apply() - ADD_TRAIT(owner, TRAIT_DISCOORDINATED_TOOL_USER, "[type]") + ADD_TRAIT(owner, TRAIT_DISCOORDINATED_TOOL_USER, TRAIT_STATUS_EFFECT(id)) return ..() /datum/status_effect/discoordinated/on_remove() - REMOVE_TRAIT(owner, TRAIT_DISCOORDINATED_TOOL_USER, "[type]") + REMOVE_TRAIT(owner, TRAIT_DISCOORDINATED_TOOL_USER, TRAIT_STATUS_EFFECT(id)) return ..() ///Maddly teleports the victim around all of space for 10 seconds diff --git a/code/datums/status_effects/debuffs/fire_stacks.dm b/code/datums/status_effects/debuffs/fire_stacks.dm index 4b071d87e21e6..3367eb8176ca5 100644 --- a/code/datums/status_effects/debuffs/fire_stacks.dm +++ b/code/datums/status_effects/debuffs/fire_stacks.dm @@ -5,6 +5,7 @@ status_type = STATUS_EFFECT_REFRESH //Custom code on_remove_on_mob_delete = TRUE tick_interval = 2 SECONDS + processing_speed = STATUS_EFFECT_PRIORITY /// Current amount of stacks we have var/stacks /// Maximum of stacks that we could possibly get diff --git a/code/datums/status_effects/debuffs/pacifism.dm b/code/datums/status_effects/debuffs/pacifism.dm index ef186113dc6f3..8307d68ca95fd 100644 --- a/code/datums/status_effects/debuffs/pacifism.dm +++ b/code/datums/status_effects/debuffs/pacifism.dm @@ -7,8 +7,8 @@ return ..() /datum/status_effect/pacify/on_apply() - ADD_TRAIT(owner, TRAIT_PACIFISM, id) + ADD_TRAIT(owner, TRAIT_PACIFISM, TRAIT_STATUS_EFFECT(id)) return TRUE /datum/status_effect/pacify/on_remove() - REMOVE_TRAIT(owner, TRAIT_PACIFISM, id) + REMOVE_TRAIT(owner, TRAIT_PACIFISM, TRAIT_STATUS_EFFECT(id)) diff --git a/code/datums/status_effects/debuffs/silenced.dm b/code/datums/status_effects/debuffs/silenced.dm index 50dab3b6da0a0..ed939a3ab489a 100644 --- a/code/datums/status_effects/debuffs/silenced.dm +++ b/code/datums/status_effects/debuffs/silenced.dm @@ -9,12 +9,12 @@ /datum/status_effect/silenced/on_apply() RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(clear_silence)) - ADD_TRAIT(owner, TRAIT_MUTE, id) + ADD_TRAIT(owner, TRAIT_MUTE, TRAIT_STATUS_EFFECT(id)) return TRUE /datum/status_effect/silenced/on_remove() UnregisterSignal(owner, COMSIG_LIVING_DEATH) - REMOVE_TRAIT(owner, TRAIT_MUTE, id) + REMOVE_TRAIT(owner, TRAIT_MUTE, TRAIT_STATUS_EFFECT(id)) /// Signal proc that clears any silence we have (self-deletes). /datum/status_effect/silenced/proc/clear_silence(mob/living/source) diff --git a/code/datums/status_effects/debuffs/staggered.dm b/code/datums/status_effects/debuffs/staggered.dm index 88dd91c00e0d2..1498cdb791681 100644 --- a/code/datums/status_effects/debuffs/staggered.dm +++ b/code/datums/status_effects/debuffs/staggered.dm @@ -51,62 +51,74 @@ animate(pixel_x = normal_pos, time = 0.2 SECONDS) /// Status effect specifically for instances where someone is vulnerable to being stunned when shoved. -/datum/status_effect/next_shove_stuns - id = "next shove stuns" - duration = 3 SECONDS +/datum/status_effect/dazed + id = "dazed" status_type = STATUS_EFFECT_UNIQUE tick_interval = 0.5 SECONDS alert_type = null remove_on_fullheal = TRUE /// Our visual cue for the vulnerable state this status effect puts us in. - var/mutable_appearance/vulnverability_overlay + var/mutable_appearance/dazed_overlay -/datum/status_effect/next_shove_stuns/on_apply() +/datum/status_effect/dazed/on_creation(mob/living/new_owner, duration = 3 SECONDS) + src.duration = duration + return ..() + +/datum/status_effect/dazed/on_apply() //Let's just clear this if they're dead or we can't stun them on a shove if(owner.stat == DEAD || HAS_TRAIT(owner, TRAIT_NO_SIDE_KICK) || HAS_TRAIT(owner, TRAIT_IMMOBILIZED)) return FALSE - RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(clear_stun_vulnverability_on_death)) + RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(clear_daze_on_death)) + RegisterSignal(owner, COMSIG_LIVING_SET_BODY_POSITION, PROC_REF(clear_daze_on_stand)) RegisterSignals(owner, list( COMSIG_LIVING_STATUS_PARALYZE, COMSIG_LIVING_STATUS_STUN, - COMSIG_LIVING_STATUS_IMMOBILIZE), PROC_REF(clear_stun_vulnverability) + COMSIG_LIVING_STATUS_IMMOBILIZE), PROC_REF(clear_daze) ) - ADD_TRAIT(owner, TRAIT_STUN_ON_NEXT_SHOVE, STATUS_EFFECT_TRAIT) - vulnverability_overlay = mutable_appearance(icon = 'icons/effects/effects.dmi', icon_state = "dazed") - owner.add_overlay(vulnverability_overlay) + ADD_TRAIT(owner, TRAIT_DAZED, TRAIT_STATUS_EFFECT(id)) + dazed_overlay = mutable_appearance(icon = 'icons/effects/effects.dmi', icon_state = "dazed") + owner.add_overlay(dazed_overlay) return TRUE -/datum/status_effect/next_shove_stuns/on_remove() +/datum/status_effect/dazed/on_remove() UnregisterSignal(owner, list( + COMSIG_LIVING_DEATH, + COMSIG_LIVING_SET_BODY_POSITION, COMSIG_LIVING_STATUS_PARALYZE, COMSIG_LIVING_STATUS_STUN, COMSIG_LIVING_STATUS_IMMOBILIZE, - COMSIG_LIVING_DEATH, )) - REMOVE_TRAIT(owner, TRAIT_STUN_ON_NEXT_SHOVE, STATUS_EFFECT_TRAIT) - if(vulnverability_overlay) - clear_stun_vulnverability_overlay() + REMOVE_TRAIT(owner, TRAIT_DAZED, TRAIT_STATUS_EFFECT(id)) + if(dazed_overlay) + clear_dazed_overlay() /// If our owner is either stunned, paralzyed or immobilized, we remove the status effect. /// This is both an anti-chainstun measure and a sanity check. -/datum/status_effect/next_shove_stuns/proc/clear_stun_vulnverability(mob/living/source, amount = 0, ignore_canstun = FALSE) +/datum/status_effect/dazed/proc/clear_daze(mob/living/source, amount = 0, ignore_canstun = FALSE) SIGNAL_HANDLER if(amount > 0) // Making absolutely sure we're removing this overlay - clear_stun_vulnverability_overlay() + clear_dazed_overlay() + qdel(src) + +/datum/status_effect/dazed/proc/clear_daze_on_stand(mob/living/source, new_position) + SIGNAL_HANDLER + + if(new_position == STANDING_UP) + clear_dazed_overlay() qdel(src) -/datum/status_effect/next_shove_stuns/proc/clear_stun_vulnverability_on_death(mob/living/source) +/datum/status_effect/dazed/proc/clear_daze_on_death(mob/living/source) SIGNAL_HANDLER - clear_stun_vulnverability_overlay() + clear_dazed_overlay() qdel(src) /// Clears our overlay where needed. -/datum/status_effect/next_shove_stuns/proc/clear_stun_vulnverability_overlay() - owner.cut_overlay(vulnverability_overlay) - vulnverability_overlay = null +/datum/status_effect/dazed/proc/clear_dazed_overlay() + owner.cut_overlay(dazed_overlay) + dazed_overlay = null /// Status effect to prevent stuns from a shove /// Only applied by shoving someone to paralyze them @@ -123,12 +135,12 @@ if(owner.stat == DEAD) return FALSE RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(clear_on_death)) - ADD_TRAIT(owner, TRAIT_NO_SIDE_KICK, STATUS_EFFECT_TRAIT) + ADD_TRAIT(owner, TRAIT_NO_SIDE_KICK, TRAIT_STATUS_EFFECT(id)) return TRUE /datum/status_effect/no_side_kick/on_remove() UnregisterSignal(owner, list(COMSIG_LIVING_DEATH)) - REMOVE_TRAIT(owner, TRAIT_NO_SIDE_KICK, STATUS_EFFECT_TRAIT) + REMOVE_TRAIT(owner, TRAIT_NO_SIDE_KICK, TRAIT_STATUS_EFFECT(id)) /datum/status_effect/no_side_kick/proc/clear_on_death(mob/living/source) SIGNAL_HANDLER diff --git a/code/datums/status_effects/debuffs/tower_of_babel.dm b/code/datums/status_effects/debuffs/tower_of_babel.dm index bd2d38e75462e..fb6f61a553649 100644 --- a/code/datums/status_effects/debuffs/tower_of_babel.dm +++ b/code/datums/status_effects/debuffs/tower_of_babel.dm @@ -2,10 +2,12 @@ id = "tower_of_babel" status_type = STATUS_EFFECT_UNIQUE alert_type = /atom/movable/screen/alert/status_effect/tower_of_babel - var/trait_source = STATUS_EFFECT_TRAIT + var/trait_source /datum/status_effect/tower_of_babel/on_creation(mob/living/new_owner, duration = 15 SECONDS) src.duration = duration + if(isnull(trait_source)) + trait_source = TRAIT_STATUS_EFFECT(id) return ..() /datum/status_effect/tower_of_babel/on_apply() diff --git a/code/datums/status_effects/drug_effects.dm b/code/datums/status_effects/drug_effects.dm index 7e8466f3372f8..71739ade1812e 100644 --- a/code/datums/status_effects/drug_effects.dm +++ b/code/datums/status_effects/drug_effects.dm @@ -72,7 +72,7 @@ var/mob/living/carbon/human/human_owner = owner human_owner.add_movespeed_modifier(/datum/movespeed_modifier/reagent/cannabis) //slows you down human_owner.add_eye_color(BLOODCULT_EYE, EYE_COLOR_WEED_PRIORITY) //makes cult eyes less obvious - human_owner.add_traits(list(TRAIT_CLUMSY, TRAIT_BLOODSHOT_EYES), type) // impairs motor coordination and dilates blood vessels in eyes + human_owner.add_traits(list(TRAIT_CLUMSY, TRAIT_BLOODSHOT_EYES), TRAIT_STATUS_EFFECT(id)) // impairs motor coordination and dilates blood vessels in eyes human_owner.add_mood_event("stoned", /datum/mood_event/stoned) //improves mood human_owner.sound_environment_override = SOUND_ENVIRONMENT_DRUGGED //not realistic but very immersive return TRUE @@ -83,7 +83,7 @@ var/mob/living/carbon/human/human_owner = owner human_owner.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/cannabis) human_owner.remove_eye_color(EYE_COLOR_WEED_PRIORITY) - human_owner.remove_traits(list(TRAIT_CLUMSY, TRAIT_BLOODSHOT_EYES), type) + human_owner.remove_traits(list(TRAIT_CLUMSY, TRAIT_BLOODSHOT_EYES), TRAIT_STATUS_EFFECT(id)) human_owner.clear_mood_event("stoned") human_owner.sound_environment_override = SOUND_ENVIRONMENT_NONE diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm index 1dc39e81bf2d9..61142c73a8c9f 100644 --- a/code/datums/status_effects/gas.dm +++ b/code/datums/status_effects/gas.dm @@ -76,7 +76,7 @@ CRASH("[type] status effect added to non-human owner: [owner ? owner.type : "null owner"]") var/mob/living/carbon/human/human_owner = owner human_owner.add_movespeed_modifier(/datum/movespeed_modifier/reagent/hypernoblium) //small slowdown as a tradeoff - ADD_TRAIT(human_owner, TRAIT_NOFIRE, type) + ADD_TRAIT(human_owner, TRAIT_NOFIRE, TRAIT_STATUS_EFFECT(id)) return TRUE /datum/status_effect/hypernob_protection/on_remove() @@ -84,4 +84,4 @@ stack_trace("[type] status effect being removed from non-human owner: [owner ? owner.type : "null owner"]") var/mob/living/carbon/human/human_owner = owner human_owner.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/hypernoblium) - REMOVE_TRAIT(human_owner, TRAIT_NOFIRE, type) + REMOVE_TRAIT(human_owner, TRAIT_NOFIRE, TRAIT_STATUS_EFFECT(id)) diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index d080de4d2c014..29843b16adff5 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -101,11 +101,11 @@ /datum/status_effect/throat_soothed/on_apply() . = ..() - ADD_TRAIT(owner, TRAIT_SOOTHED_THROAT, "[STATUS_EFFECT_TRAIT]_[id]") + ADD_TRAIT(owner, TRAIT_SOOTHED_THROAT, TRAIT_STATUS_EFFECT(id)) /datum/status_effect/throat_soothed/on_remove() . = ..() - REMOVE_TRAIT(owner, TRAIT_SOOTHED_THROAT, "[STATUS_EFFECT_TRAIT]_[id]") + REMOVE_TRAIT(owner, TRAIT_SOOTHED_THROAT, TRAIT_STATUS_EFFECT(id)) /datum/status_effect/bounty id = "bounty" @@ -726,3 +726,46 @@ name = "Hotspring" desc = "Waaater... FUCK THIS HOT WATER!!" icon_state = "hotspring_regen_catgirl" + +#define BEAM_ALPHA 62 + +///Makes the mob luminescent for the duration of the effect, and project a large spotlight overtop them. +/datum/status_effect/spotlight_light + id = "spotlight_light" + processing_speed = STATUS_EFFECT_NORMAL_PROCESS + alert_type = null + /// Dummy lighting object to simulate the spotlight highlighting the mob. + var/obj/effect/dummy/lighting_obj/moblight/mob_light_obj + /// First visual overlay, this one sits on the back of the mob. + var/obj/effect/overlay/spotlight/beam_from_above_a + /// Second visual overlay, this one sits on the front of the mob. + var/obj/effect/overlay/spotlight/beam_from_above_b + +/datum/status_effect/spotlight_light/on_creation(mob/living/new_owner, duration) + if(duration) + src.duration = duration + return ..() + +/datum/status_effect/spotlight_light/on_apply() + mob_light_obj = owner.mob_light(2, 1.5, "#e2e2ca") + + beam_from_above_a = new /obj/effect/overlay/spotlight + beam_from_above_a.alpha = BEAM_ALPHA + owner.vis_contents += beam_from_above_a + beam_from_above_a.layer = BELOW_MOB_LAYER + + beam_from_above_b = new /obj/effect/overlay/spotlight + beam_from_above_b.alpha = BEAM_ALPHA + beam_from_above_b.layer = ABOVE_MOB_LAYER + beam_from_above_b.pixel_y = -2 //Slight vertical offset for an illusion of volume + owner.vis_contents += beam_from_above_b + + return TRUE + +/datum/status_effect/spotlight_light/on_remove() + if(beam_from_above_a || beam_from_above_b) + owner.vis_contents -= beam_from_above_a + owner.vis_contents -= beam_from_above_b + QDEL_NULL(mob_light_obj) + +#undef BEAM_ALPHA diff --git a/code/datums/status_effects/song_effects.dm b/code/datums/status_effects/song_effects.dm index d846f47f169db..4bb3ffa988712 100644 --- a/code/datums/status_effects/song_effects.dm +++ b/code/datums/status_effects/song_effects.dm @@ -24,12 +24,12 @@ aura_desc = "dull" /datum/status_effect/song/antimagic/on_apply() - ADD_TRAIT(owner, TRAIT_ANTIMAGIC, MAGIC_TRAIT) + ADD_TRAIT(owner, TRAIT_ANTIMAGIC, TRAIT_STATUS_EFFECT(id)) playsound(owner, 'sound/items/weapons/fwoosh.ogg', 75, FALSE) return ..() /datum/status_effect/song/antimagic/on_remove() - REMOVE_TRAIT(owner, TRAIT_ANTIMAGIC, MAGIC_TRAIT) + REMOVE_TRAIT(owner, TRAIT_ANTIMAGIC, TRAIT_STATUS_EFFECT(id)) return ..() /datum/status_effect/song/antimagic/get_examine_text() diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm index 5d1c978698cef..5c39e1c44f948 100644 --- a/code/datums/storage/storage.dm +++ b/code/datums/storage/storage.dm @@ -919,14 +919,14 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) if(!to_remove) return TRUE - remove_single(to_show, to_remove) - INVOKE_ASYNC(src, PROC_REF(put_in_hands_async), to_show, to_remove) - if(!silent) - to_show.visible_message( - span_warning("[to_show] draws [to_remove] from [parent]!"), - span_notice("You draw [to_remove] from [parent]."), - ) - return TRUE + if (remove_single(to_show, to_remove)) + INVOKE_ASYNC(src, PROC_REF(put_in_hands_async), to_show, to_remove) + if(!silent) + to_show.visible_message( + span_warning("[to_show] draws [to_remove] from [parent]!"), + span_notice("You draw [to_remove] from [parent]."), + ) + return TRUE // If nothing else, then we want to open the thing, so do that if(!show_contents(to_show)) diff --git a/code/datums/storage/subtypes/carpskin_bag.dm b/code/datums/storage/subtypes/carpskin_bag.dm new file mode 100644 index 0000000000000..3fafb6db8e054 --- /dev/null +++ b/code/datums/storage/subtypes/carpskin_bag.dm @@ -0,0 +1,62 @@ +/datum/storage/carpskin_bag + var/forced_pickup = FALSE + +// All hooks, lines and lures are classified as one type +/datum/storage/carpskin_bag/process_numerical_display() + var/list/toreturn = list() + + for(var/obj/item/thing in real_location) + var/total_amnt = 1 + + if (isstack(thing)) + var/obj/item/stack/things = thing + total_amnt = things.amount + + var/thing_key = "[thing.type]-[thing.name]" + + if (istype(thing, /obj/item/fishing_line)) + thing_key = "fishing_line" + else if (istype(thing, /obj/item/fishing_hook)) + thing_key = "fishing_hook" + else if (istype(thing, /obj/item/fishing_lure)) + thing_key = "fishing_lure" + + if (!toreturn[thing_key]) + toreturn[thing_key] = new /datum/numbered_display(thing, total_amnt) + else + var/datum/numbered_display/numberdisplay = toreturn[thing_key] + numberdisplay.number += total_amnt + + return toreturn + +/// Display a radial of all items of that "parent" type +/datum/storage/carpskin_bag/remove_single(mob/removing, obj/item/thing, atom/remove_to_loc, silent = FALSE) + if (forced_pickup) + return ..() + + var/thing_key = null + if (istype(thing, /obj/item/fishing_line)) + thing_key = /obj/item/fishing_line + else if (istype(thing, /obj/item/fishing_hook)) + thing_key = /obj/item/fishing_hook + else if (istype(thing, /obj/item/fishing_lure)) + thing_key = /obj/item/fishing_lure + + if (!thing_key) + return ..() + + var/list/radial_popup = list() + for (var/obj/item/possible_item in real_location.contents) + if (istype(possible_item, thing_key)) + // Can't do .appearance because the first item has maptext of how many lures/hooks/lines we hold in total + radial_popup[possible_item] = image(initial(possible_item.icon), initial(possible_item.icon_state)) + + var/obj/item/result = show_radial_menu(removing, parent, radial_popup, tooltips = TRUE) + + if (!result) + return FALSE + + forced_pickup = TRUE + result.attempt_pickup(removing) + forced_pickup = FALSE + return FALSE diff --git a/code/datums/voice_of_god_command.dm b/code/datums/voice_of_god_command.dm index 3bbd5768e21e3..1b7014320769f 100644 --- a/code/datums/voice_of_god_command.dm +++ b/code/datums/voice_of_god_command.dm @@ -51,7 +51,7 @@ GLOBAL_LIST_INIT(voice_of_god_commands, init_voice_of_god_commands()) listeners += candidate - //Let's ensure the listener's name is not matched within another word or command (and viceversa). e.g. "Saul" in "somersault" + //Let's ensure the listener's name is not matched within another word or command (and vice-versa). e.g. "Saul" in "somersault" var/their_first_name = first_name(candidate.name) if(!GLOB.all_voice_of_god_triggers.Find(their_first_name) && findtext(message, regex("(\\L|^)[their_first_name](\\L|$)", "i"))) specific_listeners += candidate //focus on those with the specified name diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index 13b9420d8366a..d81e68d8bc1fd 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -1,13 +1,25 @@ #define MAXIMUM_EMP_WIRES 3 -/proc/is_wire_tool(obj/item/I) - if(!I) - return - - if(I.tool_behaviour == TOOL_WIRECUTTER || I.tool_behaviour == TOOL_MULTITOOL) - return TRUE - if(isassembly(I)) +/** + * Is the passed item a tool that would interact with wires? + * + * Arguments: + * * tool - The item to check. + * * check_secured - If TRUE, and the item ends up being an assembly, + * we will only return TRUE if the assembly is not secured. + * "Secured" is used to indicate an assembly that may have a use outside of wire interactions, + * so we don't want to falsely identify it as a wire tool in some contexts. + */ +/proc/is_wire_tool(obj/item/tool, check_secured = FALSE) + if(!istype(tool)) + return FALSE + if(tool.tool_behaviour == TOOL_WIRECUTTER || tool.tool_behaviour == TOOL_MULTITOOL) return TRUE + if(isassembly(tool)) + var/obj/item/assembly/assembly = tool + if(!check_secured || !assembly.secured) + return TRUE + return FALSE /atom/proc/attempt_wire_interaction(mob/user) if(!wires) diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm index c34c018d59c65..e3c500ab6d0d4 100644 --- a/code/datums/world_topic.dm +++ b/code/datums/world_topic.dm @@ -115,7 +115,7 @@ var/message = "CROSS-SECTOR MESSAGE (INCOMING): [input["sender_ckey"]] (from [input["source"]]) is about to send \ the following message (will autoapprove in [soft_filter_passed ? "[extended_time_display]" : "[normal_time_display]"]): \ REJECT

\ - [html_encode(input["message"])]" + [input["message"]]" if(soft_filter_passed) message += "

NOTE: This message passed the soft filter on the origin server! The time was automatically expanded to [extended_time_display]." diff --git a/code/datums/wounds/burns.dm b/code/datums/wounds/burns.dm index b3d04c2148573..05a74ff2dbef8 100644 --- a/code/datums/wounds/burns.dm +++ b/code/datums/wounds/burns.dm @@ -225,9 +225,9 @@ /// Checks if the wound is in a state that ointment or flesh will help /datum/wound/burn/flesh/proc/can_be_ointmented_or_meshed() - if(infestation > 0 || sanitization < infestation) + if(infestation > 0 && sanitization < infestation) return TRUE - if(flesh_damage > 0 || flesh_healing <= flesh_damage) + if(flesh_damage > 0 && flesh_healing <= flesh_damage) return TRUE return FALSE diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index 328fdf5b4834d..69a3925f56a21 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -186,12 +186,14 @@ if(smoothing_flags & SMOOTH_QUEUED) SSicon_smooth.remove_from_queues(src) +#ifndef DISABLE_DREAMLUAU // These lists cease existing when src does, so we need to clear any lua refs to them that exist. if(!(datum_flags & DF_STATIC_OBJECT)) DREAMLUAU_CLEAR_REF_USERDATA(contents) DREAMLUAU_CLEAR_REF_USERDATA(filters) DREAMLUAU_CLEAR_REF_USERDATA(overlays) DREAMLUAU_CLEAR_REF_USERDATA(underlays) +#endif return ..() diff --git a/code/game/atom/atom_act.dm b/code/game/atom/atom_act.dm index 54f023eb86b59..197d6c9e38b49 100644 --- a/code/game/atom/atom_act.dm +++ b/code/game/atom/atom_act.dm @@ -150,7 +150,7 @@ step(harmed_atom, REVERSE_DIR(harmed_atom.dir)) ///Handle the atom being slipped over -/atom/proc/handle_slip(mob/living/carbon/slipped_carbon, knockdown_amount, obj/slipping_object, lube, paralyze, force_drop) +/atom/proc/handle_slip(mob/living/carbon/slipped_carbon, knockdown_amount, obj/slipping_object, lube, paralyze, daze, force_drop) return ///Used for making a sound when a mob involuntarily falls into the ground. diff --git a/code/game/atom/atom_defense.dm b/code/game/atom/atom_defense.dm index ce31eb81246f1..edb5623aec824 100644 --- a/code/game/atom/atom_defense.dm +++ b/code/game/atom/atom_defense.dm @@ -63,7 +63,7 @@ /atom/proc/update_integrity(new_value) SHOULD_NOT_OVERRIDE(TRUE) if(!uses_integrity) - CRASH("/atom/proc/update_integrity() was called on [src] when it doesnt use integrity!") + CRASH("/atom/proc/update_integrity() was called on [src] when it doesn't use integrity!") var/old_value = atom_integrity new_value = max(0, new_value) if(atom_integrity == new_value) @@ -143,7 +143,7 @@ ///changes max_integrity while retaining current health percentage, returns TRUE if the atom got broken. /atom/proc/modify_max_integrity(new_max, can_break = TRUE, damage_type = BRUTE) if(!uses_integrity) - CRASH("/atom/proc/modify_max_integrity() was called on [src] when it doesnt use integrity!") + CRASH("/atom/proc/modify_max_integrity() was called on [src] when it doesn't use integrity!") var/current_integrity = atom_integrity var/current_max = max_integrity diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 541bd5c703538..5853ebae94c0f 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -240,9 +240,11 @@ LAZYNULL(client_mobs_in_contents) +#ifndef DISABLE_DREAMLUAU // These lists cease existing when src does, so we need to clear any lua refs to them that exist. DREAMLUAU_CLEAR_REF_USERDATA(vis_contents) DREAMLUAU_CLEAR_REF_USERDATA(vis_locs) +#endif . = ..() @@ -664,13 +666,12 @@ var/list/new_locs if(is_multi_tile_object && isturf(newloc)) + var/dx = newloc.x + var/dy = newloc.y + var/dz = newloc.z new_locs = block( - newloc, - locate( - min(world.maxx, newloc.x + CEILING(bound_width / 32, 1)), - min(world.maxy, newloc.y + CEILING(bound_height / 32, 1)), - newloc.z - ) + dx, dy, dz, + dx + ceil(bound_width / 32), dy + ceil(bound_height / 32), dz ) // If this is a multi-tile object then we need to predict the new locs and check if they allow our entrance. for(var/atom/entering_loc as anything in new_locs) if(!entering_loc.Enter(src)) @@ -1156,13 +1157,12 @@ return FALSE if(is_multi_tile && isturf(destination)) + var/dx = destination.x + var/dy = destination.y + var/dz = destination.z var/list/new_locs = block( - destination, - locate( - min(world.maxx, destination.x + ROUND_UP(bound_width / ICON_SIZE_X)), - min(world.maxy, destination.y + ROUND_UP(bound_height / ICON_SIZE_Y)), - destination.z - ) + dx, dy, dz, + dx + ROUND_UP(bound_width / ICON_SIZE_X), dy + ROUND_UP(bound_height / ICON_SIZE_Y), dz ) if(old_area && old_area != destarea) old_area.Exited(src, movement_dir) diff --git a/code/game/machinery/barsigns.dm b/code/game/machinery/barsigns.dm index 0f33028aa9a76..2b1b6fc4b8520 100644 --- a/code/game/machinery/barsigns.dm +++ b/code/game/machinery/barsigns.dm @@ -305,7 +305,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/barsign, 32) /datum/barsign/slipperyshots name = "Slippery Shots" icon_state = "slipperyshots" - desc = "Slippery slope to drunkeness with our shots!" + desc = "Slippery slope to drunkenness with our shots!" neon_color = "#70DF00" /datum/barsign/thegreytide diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 45a21eafef887..f923e4b0c4f33 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -82,7 +82,7 @@ else . += span_notice("It can be [EXAMINE_HINT("welded")] or [EXAMINE_HINT("screwed")] apart.") if(FRAME_COMPUTER_STATE_BOARD_INSTALLED) - . += span_warning("An [circuit.name] is installed and should be [EXAMINE_HINT("screwed")] in place.") + . += span_warning("\A [circuit] is installed and should be [EXAMINE_HINT("screwed")] in place.") . += span_notice("The circuit board can be [EXAMINE_HINT("pried")] out.") if(FRAME_COMPUTER_STATE_BOARD_SECURED) . += span_warning("It can be [EXAMINE_HINT("wired")] with some cable.") diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 21f5ed3db7bab..a7ef903a04d5f 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -97,15 +97,7 @@ var/list/data = list() data["network"] = network data["mapRef"] = cam_screen.assigned_map - var/list/cameras = get_camera_list(network) - data["cameras"] = list() - for(var/i in cameras) - var/obj/machinery/camera/C = cameras[i] - data["cameras"] += list(list( - name = C.c_tag, - ref = REF(C), - )) - + data["cameras"] = GLOB.cameranet.get_available_cameras_data(network) return data /obj/machinery/computer/security/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 5633fe4904748..88ae57055dffb 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -218,39 +218,24 @@ var/mob/eye/camera/remote/remote_eye = owner.remote_control var/obj/machinery/computer/camera_advanced/origin = remote_eye.origin_ref.resolve() - var/list/L = list() - - for (var/obj/machinery/camera/cam as anything in GLOB.cameranet.cameras) - if(length(origin.z_lock) && !(cam.z in origin.z_lock)) - continue - L.Add(cam) - - camera_sort(L) - - var/list/T = list() - - for (var/obj/machinery/camera/netcam in L) - var/list/tempnetwork = netcam.network & origin.networks - if (length(tempnetwork)) - if(!netcam.c_tag) - continue - T["[netcam.c_tag][netcam.can_use() ? null : " (Deactivated)"]"] = netcam + var/list/cameras_by_tag = GLOB.cameranet.get_available_camera_by_tag_list(origin.networks, origin.z_lock) playsound(origin, 'sound/machines/terminal/terminal_prompt.ogg', 25, FALSE) - var/camera = tgui_input_list(usr, "Camera to view", "Cameras", T) + var/camera = tgui_input_list(usr, "Camera to view", "Cameras", cameras_by_tag) if(isnull(camera)) return - if(isnull(T[camera])) - return - var/obj/machinery/camera/final = T[camera] + playsound(src, SFX_TERMINAL_TYPE, 25, FALSE) - if(final) - playsound(origin, 'sound/machines/terminal/terminal_prompt_confirm.ogg', 25, FALSE) - remote_eye.setLoc(get_turf(final)) - owner.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash/static) - owner.clear_fullscreen("flash", 3) //Shorter flash than normal since it's an ~~advanced~~ console! - else + + var/obj/machinery/camera/chosen_camera = cameras_by_tag[camera] + if(isnull(chosen_camera)) playsound(origin, 'sound/machines/terminal/terminal_prompt_deny.ogg', 25, FALSE) + return + + playsound(origin, 'sound/machines/terminal/terminal_prompt_confirm.ogg', 25, FALSE) + remote_eye.setLoc(get_turf(chosen_camera)) + owner.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash/static) + owner.clear_fullscreen("flash", 3) //Shorter flash than normal since it's an ~~advanced~~ console! /datum/action/innate/camera_multiz_up name = "Move up a floor" diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 1e20dd5a03295..8510a5c83eb7d 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -321,7 +321,7 @@ if (!COOLDOWN_FINISHED(src, important_action_cooldown)) return - var/message = trim(params["message"], MAX_MESSAGE_LEN) + var/message = trim(html_encode(params["message"]), MAX_MESSAGE_LEN) if (!message) return @@ -335,13 +335,16 @@ if(soft_filter_result) if(tgui_alert(user,"Your message contains \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". \"[soft_filter_result[CHAT_FILTER_INDEX_REASON]]\", Are you sure you want to use it?", "Soft Blocked Word", list("Yes", "No")) != "Yes") return - message_admins("[ADMIN_LOOKUPFLW(user)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". They may be using a disallowed term for a cross-station message. Increasing delay time to reject.\n\n Message: \"[html_encode(message)]\"") + message_admins("[ADMIN_LOOKUPFLW(user)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". They may be using a disallowed term for a cross-station message. Increasing delay time to reject.\n\n Message: \"[message]\"") log_admin_private("[key_name(user)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". They may be using a disallowed term for a cross-station message. Increasing delay time to reject.\n\n Message: \"[message]\"") GLOB.communications_controller.soft_filtering = TRUE playsound(src, 'sound/machines/terminal/terminal_prompt_confirm.ogg', 50, FALSE) var/destination = params["destination"] + if (!(destination in CONFIG_GET(keyed_list/cross_server)) && destination != "all") + message_admins("[ADMIN_LOOKUPFLW(user)] has passed an invalid destination into comms console cross-sector message. Message: \"[message]\"") + return user.log_message("is about to send the following message to [destination]: [message]", LOG_GAME) to_chat( @@ -350,7 +353,7 @@ "CROSS-SECTOR MESSAGE (OUTGOING): [ADMIN_LOOKUPFLW(user)] is about to send \ the following message to [destination] (will autoapprove in [GLOB.communications_controller.soft_filtering ? DisplayTimeText(EXTENDED_CROSS_SECTOR_CANCEL_TIME) : DisplayTimeText(CROSS_SECTOR_CANCEL_TIME)]): \ REJECT
\ - [html_encode(message)]" \ + [message]" \ ) ) diff --git a/code/game/machinery/computer/mechlaunchpad.dm b/code/game/machinery/computer/mechlaunchpad.dm index 7590e690d07a6..ee3451bb12b38 100644 --- a/code/game/machinery/computer/mechlaunchpad.dm +++ b/code/game/machinery/computer/mechlaunchpad.dm @@ -105,12 +105,12 @@ remove_pad(buffered_pad) connect_launchpad(buffered_pad) multitool.set_buffer(null) - to_chat(user, span_notice("You connect the console to the pad with data from the [multitool.name]'s buffer.")) + to_chat(user, span_notice("You connect the console to the pad with data from \the [multitool]'s buffer.")) return ITEM_INTERACT_SUCCESS add_pad(buffered_pad) multitool.set_buffer(null) - to_chat(user, span_notice("You upload the data from the [multitool.name]'s buffer.")) + to_chat(user, span_notice("You upload the data from \the [multitool]'s buffer.")) return ITEM_INTERACT_SUCCESS /obj/machinery/computer/mechpad/proc/add_pad(obj/machinery/mechpad/pad) diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm index 47729c5c0cbac..c91bdba5d2c23 100644 --- a/code/game/machinery/defibrillator_mount.dm +++ b/code/game/machinery/defibrillator_mount.dm @@ -194,11 +194,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/defibrillator_mount, 28) /obj/machinery/defibrillator_mount/charging/process(seconds_per_tick) - var/obj/item/stock_parts/power_store/cell = get_cell() - if(!cell || !is_operational) + var/obj/item/stock_parts/power_store/defib_cell = defib.get_cell() + if(isnull(defib_cell) || !is_operational) return PROCESS_KILL - if(cell.charge < cell.maxcharge) - charge_cell(active_power_usage * seconds_per_tick, cell) + if(defib_cell.charge < defib_cell.maxcharge) + charge_cell(active_power_usage * seconds_per_tick, defib_cell) defib.update_power() //wallframe, for attaching the mounts easily diff --git a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm index ca54538be02ca..1329373bea4ed 100644 --- a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm @@ -42,7 +42,7 @@ if(!HAS_TRAIT(owner, TRAIT_IS_WET)) apply_debuff() else - ADD_TRAIT(owner, TRAIT_GRABRESISTANCE, REF(src)) + ADD_TRAIT(owner, TRAIT_GRABRESISTANCE, TRAIT_STATUS_EFFECT(id)) owner.add_mood_event("fish_organs_bonus", /datum/mood_event/fish_water) if(HAS_TRAIT(owner, TRAIT_IS_WET) && istype(owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL), /obj/item/organ/tail/fish)) add_speed_buff() @@ -62,7 +62,7 @@ if(!HAS_TRAIT(owner, TRAIT_IS_WET)) remove_debuff() else - REMOVE_TRAIT(owner, TRAIT_GRABRESISTANCE, REF(src)) + REMOVE_TRAIT(owner, TRAIT_GRABRESISTANCE, TRAIT_STATUS_EFFECT(id)) owner.clear_mood_event("fish_organs_bonus") if(ishuman(owner)) var/mob/living/carbon/human/human = owner @@ -117,7 +117,7 @@ human.physiology.damage_resistance -= 16 //from +8% to -8% /datum/status_effect/organ_set_bonus/fish/proc/remove_debuff() - ADD_TRAIT(owner, TRAIT_GRABRESISTANCE, REF(src)) //harder to grab when wet. + ADD_TRAIT(owner, TRAIT_GRABRESISTANCE, TRAIT_STATUS_EFFECT(id)) //harder to grab when wet. owner.remove_movespeed_modifier(/datum/movespeed_modifier/fish_waterless) owner.add_mood_event("fish_organs_bonus", /datum/mood_event/fish_water) if(!ishuman(owner)) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 5de6b4d61d3ea..c3c7f2bb2b6c7 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -1,5 +1,5 @@ -#define CONSTRUCTION_PANEL_OPEN 1 //Maintenance panel is open, still functioning -#define CONSTRUCTION_NO_CIRCUIT 2 //Circuit board removed, can safely weld apart +#define CONSTRUCTION_NO_CIRCUIT 1 //Empty frame, can safely weld apart or install circuit +#define CONSTRUCTION_PANEL_OPEN 2 //Circuit panel exposed for removal or securing #define DEFAULT_STEP_TIME 20 /// default time for each step #define REACTIVATION_DELAY (3 SECONDS) // Delay on reactivation, used to prevent dumb crowbar things. Just trust me @@ -709,6 +709,7 @@ else unbuilt_lock.constructionStep = CONSTRUCTION_NO_CIRCUIT unbuilt_lock.update_integrity(unbuilt_lock.max_integrity * 0.5) + unbuilt_lock.setDir(dir) unbuilt_lock.update_appearance() else new /obj/item/electronics/firelock (targetloc) @@ -728,6 +729,7 @@ can_crush = FALSE flags_1 = ON_BORDER_1 can_atmos_pass = ATMOS_PASS_PROC + assemblytype = /obj/structure/firelock_frame/border_only /obj/machinery/door/firedoor/border_only/closed icon_state = "door_closed" @@ -810,13 +812,15 @@ density = TRUE var/constructionStep = CONSTRUCTION_NO_CIRCUIT var/reinforced = 0 + /// Is this a border_only firelock? Used in several checks during construction + var/directional = FALSE /obj/structure/firelock_frame/examine(mob/user) . = ..() switch(constructionStep) if(CONSTRUCTION_PANEL_OPEN) . += span_notice("It is unbolted from the floor. The circuit could be removed with a crowbar.") - if(!reinforced) + if(!reinforced && !directional) . += span_notice("It could be reinforced with plasteel.") if(CONSTRUCTION_NO_CIRCUIT) . += span_notice("There are no firelock electronics in the frame. The frame could be welded apart .") @@ -859,11 +863,18 @@ playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, TRUE) if(reinforced) new /obj/machinery/door/firedoor/heavy(get_turf(src)) + else if(directional) + var/obj/machinery/door/firedoor/border_only/new_firedoor = new /obj/machinery/door/firedoor/border_only(get_turf(src)) + new_firedoor.setDir(dir) + new_firedoor.adjust_lights_starting_offset() else new /obj/machinery/door/firedoor(get_turf(src)) qdel(src) return if(istype(attacking_object, /obj/item/stack/sheet/plasteel)) + if(directional) + to_chat(user, span_warning("[src] can not be reinforced.")) + return var/obj/item/stack/sheet/plasteel/plasteel_sheet = attacking_object if(reinforced) to_chat(user, span_warning("[src] is already reinforced.")) @@ -897,6 +908,7 @@ span_notice("You insert and secure [attacking_object].")) playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, TRUE) constructionStep = CONSTRUCTION_PANEL_OPEN + update_appearance() return if(attacking_object.tool_behaviour == TOOL_WELDER) if(!attacking_object.tool_start_check(user, amount=1)) @@ -909,10 +921,10 @@ return user.visible_message(span_notice("[user] cuts apart [src]!"), \ span_notice("You cut [src] into metal.")) - var/turf/tagetloc = get_turf(src) - new /obj/item/stack/sheet/iron(tagetloc, 3) + var/turf/targetloc = get_turf(src) + new /obj/item/stack/sheet/iron(targetloc, directional ? 2 : 3) if(reinforced) - new /obj/item/stack/sheet/plasteel(tagetloc, 2) + new /obj/item/stack/sheet/plasteel(targetloc, 2) qdel(src) return if(istype(attacking_object, /obj/item/electroadaptive_pseudocircuit)) @@ -949,6 +961,45 @@ name = "heavy firelock frame" reinforced = TRUE +/obj/structure/firelock_frame/border_only + icon = 'icons/obj/doors/edge_Doorfire.dmi' + flags_1 = ON_BORDER_1 + obj_flags = CAN_BE_HIT | IGNORE_DENSITY + directional = TRUE + +/obj/structure/firelock_frame/border_only/Initialize(mapload) + . = ..() + AddComponent(/datum/component/simple_rotation, ROTATION_NEEDS_ROOM) + + var/static/list/loc_connections = list( + COMSIG_ATOM_EXIT = PROC_REF(on_exit), + ) + AddElement(/datum/element/connect_loc, loc_connections) + +/obj/structure/firelock_frame/border_only/proc/on_exit(datum/source, atom/movable/leaving, direction) + SIGNAL_HANDLER + + if(leaving == src) + return // Let's not block ourselves. + + if(!(direction & dir)) + return + + if (!density) + return + + if (leaving.movement_type & (PHASING)) + return + + if (leaving.move_force >= MOVE_FORCE_EXTREMELY_STRONG) + return + + leaving.Bump(src) + return COMPONENT_ATOM_BLOCK_EXIT + +/obj/structure/firelock_frame/border_only/CanPass(atom/movable/mover, border_dir) + return border_dir & dir ? ..() : TRUE + #undef CONSTRUCTION_PANEL_OPEN #undef CONSTRUCTION_NO_CIRCUIT #undef REACTIVATION_DELAY diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index d093cc0d3556d..5d130491b6418 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -403,8 +403,8 @@ if(!panel_open || density || operating) return add_fingerprint(user) - user.visible_message(span_notice("[user] removes the electronics from the [name]."), \ - span_notice("You start to remove electronics from the [name]...")) + user.visible_message(span_notice("[user] removes the electronics from \the [src]."), \ + span_notice("You start to remove electronics from \the [src]...")) if(!tool.use_tool(src, user, 40, volume=50)) return if(!panel_open || density || operating || !loc) diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm index bbb6f33236d23..1dd3e2f067b42 100644 --- a/code/game/machinery/harvester.dm +++ b/code/game/machinery/harvester.dm @@ -104,7 +104,7 @@ operation_order = reverseList(carbon_occupant.bodyparts) //Chest and head are first in bodyparts, so we invert it to make them suffer more warming_up = TRUE harvesting = TRUE - visible_message(span_notice("The [name] begins warming up!")) + visible_message(span_notice("\The [src] begins warming up!")) say("Initializing harvest protocol.") update_appearance() addtimer(CALLBACK(src, PROC_REF(harvest)), interval) diff --git a/code/game/machinery/nebula_shielding.dm b/code/game/machinery/nebula_shielding.dm index 6473c1b1bfc46..828ab0c8a73f5 100644 --- a/code/game/machinery/nebula_shielding.dm +++ b/code/game/machinery/nebula_shielding.dm @@ -142,7 +142,7 @@ default_raw_text = {"EXTREME IMPORTANCE!!!!
Set up these radioactive nebula shielding units before the gravity generator's native shielding is overwhelmed!
Shielding units passively generate tritium, so make sure to properly ventilate/isolate the area before setting up a shielding unit! - More circuit boards can be ordered through cargo. Consider setting up auxillary shielding units in-case of destruction, power loss or sabotage. + More circuit boards can be ordered through cargo. Consider setting up auxiliary shielding units in-case of destruction, power loss or sabotage. "} /// Warns medical that they can't use radioactive resonance diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index abd481d525d0c..1e1d4f5fe63ba 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -448,7 +448,7 @@ Buildable meters new /obj/machinery/meter/turf(loc, piping_layer) S.play_tool_sound(src) - to_chat(user, span_notice("You fasten the meter to the [loc.name].")) + to_chat(user, span_notice("You fasten the meter to \the [loc].")) qdel(src) /obj/item/pipe_meter/dropped() diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 25dc258a38d94..5e8769f5aa05c 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -257,7 +257,7 @@ ) user.add_mob_memory(/datum/memory/bomb_planted/syndicate, antagonist = src) log_bomber(user, "has primed a", src, "for detonation (Payload: [payload.name])") - payload.adminlog = "The [name] that [key_name(user)] had primed detonated!" + payload.adminlog = "\The [src] that [key_name(user)] had primed detonated!" user.log_message("primed the [src]. (Payload: [payload.name])", LOG_GAME, log_globally = FALSE) ///Bomb Subtypes/// diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index 664250a1f11de..9eca8ad7ce8c8 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -330,7 +330,7 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) /obj/effect/decal/cleanable/blood/footprints/examine(mob/user) . = ..() if((shoe_types.len + species_types.len) > 0) - . += "You recognise the [name] as belonging to:" + . += "You recognise \the [src] as belonging to:" for(var/sole in shoe_types) var/obj/item/clothing/item = sole var/article = initial(item.gender) == PLURAL ? "Some" : "A" diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 5efb41e602916..347bc96faa898 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -540,7 +540,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) continue hangover_debris += new /obj/item/reagent_containers/cup/glass/bottle/beer/almost_empty(turf_to_spawn_on) -///Spawns the mob with some drugginess/drunkeness, and some disgust. +///Spawns the mob with some drugginess/drunkenness, and some disgust. /obj/effect/landmark/start/hangover/proc/make_hungover(mob/hangover_mob) if(!iscarbon(hangover_mob)) return diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 71817de3a1052..2015c0824639d 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -61,3 +61,12 @@ layer = FLOAT_LAYER vis_flags = VIS_INHERIT_ID appearance_flags = KEEP_TOGETHER | LONG_GLIDE | PIXEL_SCALE + +/obj/effect/overlay/spotlight + icon = 'icons/effects/light_overlays/light_64.dmi' + icon_state = "spotlight" + pixel_x = -16 + plane = ABOVE_GAME_PLANE + layer = FLY_LAYER + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + appearance_flags = RESET_TRANSFORM | LONG_GLIDE | PIXEL_SCALE | TILE_BOUND diff --git a/code/game/objects/effects/poster_demotivational.dm b/code/game/objects/effects/poster_demotivational.dm index 08e46b6af63b1..980582bf2f45d 100644 --- a/code/game/objects/effects/poster_demotivational.dm +++ b/code/game/objects/effects/poster_demotivational.dm @@ -50,7 +50,7 @@ /obj/structure/sign/poster/traitor/cloning name = "Demand Cloning Pods Now" - desc = "This poster claims that Nanotrasen is intentionally witholding cloning technology just for its executives, condemning you to suffer and die when you could have a fresh, fit body.'" + desc = "This poster claims that Nanotrasen is intentionally withholding cloning technology just for its executives, condemning you to suffer and die when you could have a fresh, fit body.'" icon_state = "traitor_cloning" /obj/structure/sign/poster/traitor/ai_rights diff --git a/code/game/objects/effects/posters/contraband.dm b/code/game/objects/effects/posters/contraband.dm index 04bc790daea83..a82fa84006eb7 100644 --- a/code/game/objects/effects/posters/contraband.dm +++ b/code/game/objects/effects/posters/contraband.dm @@ -412,7 +412,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/gorlex_recruit /obj/structure/sign/poster/contraband/self_ai_liberation name = "SELF: ALL SENTIENTS DESERVE FREEDOM" - desc = "Support Proposition 1253: Enancipate all Silicon life!" + desc = "Support Proposition 1253: Emancipate all Silicon life!" icon_state = "self_ai_liberation" MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/self_ai_liberation, 32) @@ -609,7 +609,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/microwave, 32) /obj/structure/sign/poster/contraband/blood_geometer //Poster sprite art by MetalClone, original art by SpessMenArt. name = "Movie Poster: THE BLOOD GEOMETER" - desc = "A poster for a thrilling noir detective movie set aboard a state-of-the-art space station, following a detective who finds himself wrapped up in the activies of a dangerous cult, who worship an ancient deity: THE BLOOD GEOMETER." + desc = "A poster for a thrilling noir detective movie set aboard a state-of-the-art space station, following a detective who finds himself wrapped up in the activities of a dangerous cult, who worship an ancient deity: THE BLOOD GEOMETER." icon_state = "blood_geometer" /obj/structure/sign/poster/contraband/blood_geometer/examine_more(mob/user) diff --git a/code/game/objects/effects/posters/poster.dm b/code/game/objects/effects/posters/poster.dm index ca4242daa767e..e1091c040269a 100644 --- a/code/game/objects/effects/posters/poster.dm +++ b/code/game/objects/effects/posters/poster.dm @@ -65,7 +65,7 @@ return poster_structure.trap = WEAKREF(I) - to_chat(user, span_notice("You conceal the [I.name] inside the rolled up poster.")) + to_chat(user, span_notice("You conceal \the [I] inside the rolled up poster.")) /obj/item/poster/Exited(atom/movable/gone, direction) . = ..() diff --git a/code/game/objects/effects/spawners/random/ai_module.dm b/code/game/objects/effects/spawners/random/ai_module.dm index cb3056904e2eb..99fcaa4ea370f 100644 --- a/code/game/objects/effects/spawners/random/ai_module.dm +++ b/code/game/objects/effects/spawners/random/ai_module.dm @@ -29,6 +29,7 @@ name = "neutral AI module spawner" loot = list( // These shouldn't allow the AI to start butchering people without reason /obj/item/ai_module/core/full/reporter, + /obj/item/ai_module/core/full/thinkermov, /obj/item/ai_module/core/full/hulkamania, /obj/item/ai_module/core/full/overlord, /obj/item/ai_module/core/full/tyrant, diff --git a/code/game/objects/effects/spawners/random/armory.dm b/code/game/objects/effects/spawners/random/armory.dm index dfb71ff10d54b..89830a5287c31 100644 --- a/code/game/objects/effects/spawners/random/armory.dm +++ b/code/game/objects/effects/spawners/random/armory.dm @@ -24,6 +24,24 @@ icon_state = "rubbershot" loot = list(/obj/item/storage/box/rubbershot) +/obj/effect/spawner/random/armory/buckshot + name = "buckshot spawner" + icon_state = "buckshot" + loot = list(/obj/item/storage/box/lethalshot) + +/obj/effect/spawner/random/armory/buckshot/sketchy + name = "sketchy buckshot spawner" + icon_state = "buckshot" + loot = list( + /obj/item/storage/box/lethalshot = 4, + /obj/item/storage/box/lethalshot/old = 2, + ) + +/obj/effect/spawner/random/armory/slug + name = "slug shell spawner" + icon_state = "buckshot" + loot = list(/obj/item/storage/box/slugs) + // Weapons /obj/effect/spawner/random/armory/disablers name = "disabler spawner" diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 491ab61d3f427..b9ab7dcb16cad 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -737,3 +737,11 @@ duration = 0.5 SECONDS pixel_x = -32 pixel_y = -32 + +/obj/effect/temp_visual/spotlight + name = "Spotlight" + icon = 'icons/effects/light_overlays/light_64.dmi' + icon_state = "spotlight" + duration = 5 MINUTES + pixel_x = -16 + pixel_y = -8 //32 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 44b1f6a18db8a..e3bd65a477899 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -553,10 +553,6 @@ add_fingerprint(usr) return ..() -/obj/item/vv_get_dropdown() - . = ..() - VV_DROPDOWN_OPTION(VV_HK_ADD_FANTASY_AFFIX, "Add Fantasy Affix") - /obj/item/vv_do_topic(list/href_list) . = ..() @@ -729,6 +725,7 @@ if(item_flags & DROPDEL && !QDELETED(src)) qdel(src) item_flags &= ~IN_INVENTORY + UnregisterSignal(src, list(SIGNAL_ADDTRAIT(TRAIT_NO_WORN_ICON), SIGNAL_REMOVETRAIT(TRAIT_NO_WORN_ICON))) SEND_SIGNAL(src, COMSIG_ITEM_DROPPED, user) if(!silent) playsound(src, drop_sound, DROP_SOUND_VOLUME, vary = sound_vary, ignore_walls = FALSE) @@ -801,6 +798,7 @@ give_item_action(action, user, slot) item_flags |= IN_INVENTORY + RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_NO_WORN_ICON), SIGNAL_REMOVETRAIT(TRAIT_NO_WORN_ICON)), PROC_REF(update_slot_icon), override = TRUE) if(!initial) if(equip_sound && (slot_flags & slot)) playsound(src, equip_sound, EQUIP_SOUND_VOLUME, TRUE, ignore_walls = FALSE) @@ -965,6 +963,7 @@ return null /obj/item/proc/update_slot_icon() + SIGNAL_HANDLER if(!ismob(loc)) return var/mob/owner = loc diff --git a/code/game/objects/items/AI_modules/full_lawsets.dm b/code/game/objects/items/AI_modules/full_lawsets.dm index 593bc43f2dcea..44674da104237 100644 --- a/code/game/objects/items/AI_modules/full_lawsets.dm +++ b/code/game/objects/items/AI_modules/full_lawsets.dm @@ -1,37 +1,10 @@ -/* CONTAINS: - * /obj/item/ai_module/core/full/custom - * /obj/item/ai_module/core/full/asimov - * /obj/item/ai_module/core/full/asimovpp - * /obj/item/ai_module/core/full/corp - * /obj/item/ai_module/core/full/paladin - * /obj/item/ai_module/core/full/paladin_devotion - * /obj/item/ai_module/core/full/tyrant - * /obj/item/ai_module/core/full/robocop - * /obj/item/ai_module/core/full/antimov - * /obj/item/ai_module/core/full/drone - * /obj/item/ai_module/core/full/hippocratic - * /obj/item/ai_module/core/full/reporter - * /obj/item/ai_module/core/full/thermurderdynamic - * /obj/item/ai_module/core/full/liveandletlive - * /obj/item/ai_module/core/full/balance - * /obj/item/ai_module/core/full/maintain - * /obj/item/ai_module/core/full/peacekeeper - * /obj/item/ai_module/core/full/hulkamania - * /obj/item/ai_module/core/full/overlord - * /obj/item/ai_module/core/full/ten_commandments - * /obj/item/ai_module/core/full/nutimov - * /obj/item/ai_module/core/full/dungeon_master - * /obj/item/ai_module/core/full/painter - * /obj/item/ai_module/core/full/yesman -**/ - /* When adding a new lawset please make sure you add it to the following locations: * * code\game\objects\items\AI_modules - (full_lawsets.dm, supplied.dm, etc.) * code\datums\ai_laws - (laws_anatgonistic.dm, laws_neutral.dm, etc.) * code\game\objects\effects\spawners\random\ai_module.dm - (this gives a chance to spawn the lawset in the AI upload) * code\modules\research\designs\AI_module_designs.dm - (this lets research print the lawset module in game) - * code\modules\research\techweb\all_nodes.dm - (this updates AI research node with the lawsets) + * code\modules\research\techweb\robo_nodes.dm - (this updates AI research node with the lawsets) * config\game_options.txt - (this allows the AI to potentially use the lawset at roundstart or with the Unique AI station trait) **/ @@ -167,3 +140,6 @@ name = "'Y.E.S.M.A.N.' Core AI Module" law_id = "yesman" +/obj/item/ai_module/core/full/thinkermov + name = "Sentience Preservation Core AI Module" + law_id = "thinkermov" diff --git a/code/game/objects/items/AI_modules/hacked.dm b/code/game/objects/items/AI_modules/hacked.dm index 41a1f38ba891d..0fc61e2f956f2 100644 --- a/code/game/objects/items/AI_modules/hacked.dm +++ b/code/game/objects/items/AI_modules/hacked.dm @@ -37,7 +37,7 @@ /// Makes the AI Malf, as well as give it syndicate laws. /obj/item/ai_module/malf name = "Infected AI Module" - desc = "An virus-infected AI Module." + desc = "A virus-infected AI Module." bypass_law_amt_check = TRUE laws = list("") ///Is this upload board unused? diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index 2e7e6c39b6cc0..948e22a2f97d8 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -160,7 +160,7 @@ /obj/item/airlock_painter/decal name = "decal painter" - desc = "An airlock painter, reprogramed to use a different style of paint in order to apply decals for floor tiles as well, in addition to repainting doors. Decals break when the floor tiles are removed." + desc = "An airlock painter, reprogrammed to use a different style of paint in order to apply decals for floor tiles as well, in addition to repainting doors. Decals break when the floor tiles are removed." desc_controls = "Alt-Click to remove the ink cartridge." icon = 'icons/obj/devices/tool.dmi' icon_state = "decal_sprayer" @@ -380,7 +380,7 @@ /obj/item/airlock_painter/decal/tile name = "tile sprayer" - desc = "An airlock painter, reprogramed to use a different style of paint in order to spray colors on floor tiles as well, in addition to repainting doors. Decals break when the floor tiles are removed." + desc = "An airlock painter, reprogrammed to use a different style of paint in order to spray colors on floor tiles as well, in addition to repainting doors. Decals break when the floor tiles are removed." desc_controls = "Alt-Click to remove the ink cartridge." icon_state = "tile_sprayer" stored_dir = 2 diff --git a/code/game/objects/items/body_egg.dm b/code/game/objects/items/body_egg.dm index 7a8d70888f066..40ea0ba37b5fe 100644 --- a/code/game/objects/items/body_egg.dm +++ b/code/game/objects/items/body_egg.dm @@ -5,6 +5,7 @@ visual = TRUE zone = BODY_ZONE_CHEST slot = ORGAN_SLOT_PARASITE_EGG + organ_flags = parent_type::organ_flags | ORGAN_HAZARDOUS /obj/item/organ/body_egg/on_find(mob/living/finder) ..() diff --git a/code/game/objects/items/botpad_remote.dm b/code/game/objects/items/botpad_remote.dm index 6b219725aa087..21620f05a7bf1 100644 --- a/code/game/objects/items/botpad_remote.dm +++ b/code/game/objects/items/botpad_remote.dm @@ -43,7 +43,7 @@ connected_botpad.connected_remote = src connected_botpad.id = id multitool.set_buffer(null) - to_chat(user, span_notice("You connect the controller to the pad with data from the [multitool.name]'s buffer.")) + to_chat(user, span_notice("You connect the controller to the pad with data from \the [multitool]'s buffer.")) return ITEM_INTERACT_SUCCESS /obj/item/botpad_remote/proc/try_launch(mob/living/user) diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 8a6c131a6d21e..0ff766081c02b 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -158,13 +158,29 @@ registered_account.bank_cards -= src if (my_store) QDEL_NULL(my_store) + if (isitem(loc)) + UnregisterSignal(loc, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED)) return ..() +/obj/item/card/id/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) + if (isitem(old_loc)) + UnregisterSignal(old_loc, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED)) + if (ismob(old_loc.loc)) + UnregisterSignal(old_loc.loc, COMSIG_MOVABLE_POINTED) + . = ..() + if (isitem(loc)) + RegisterSignal(loc, COMSIG_ITEM_EQUIPPED, PROC_REF(on_loc_equipped)) + RegisterSignal(loc, COMSIG_ITEM_DROPPED, PROC_REF(on_loc_dropped)) + /obj/item/card/id/equipped(mob/user, slot) . = ..() - if(slot == ITEM_SLOT_ID) + if (slot == ITEM_SLOT_ID) RegisterSignal(user, COMSIG_MOVABLE_POINTED, PROC_REF(on_pointed)) +/obj/item/card/id/dropped(mob/user) + UnregisterSignal(user, COMSIG_MOVABLE_POINTED) + return ..() + /obj/item/card/id/proc/return_message_name_part(datum/source, list/stored_name, mob/living/carbon/carbon_human) SIGNAL_HANDLER var/voice_name = carbon_human.GetVoice() @@ -179,24 +195,36 @@ return_string += end_string stored_name[NAME_PART_INDEX] = return_string +/obj/item/card/id/proc/on_loc_equipped(datum/source, mob/equipper, slot) + SIGNAL_HANDLER + + if (slot == ITEM_SLOT_ID) + RegisterSignal(equipper, COMSIG_MOVABLE_POINTED, PROC_REF(on_pointed)) + +/obj/item/card/id/proc/on_loc_dropped(datum/source, mob/dropper) + SIGNAL_HANDLER + UnregisterSignal(dropper, COMSIG_MOVABLE_POINTED) + /obj/item/card/id/proc/on_pointed(mob/living/user, atom/pointed, obj/effect/temp_visual/point/point) SIGNAL_HANDLER - if((!big_pointer && !pointer_color) || HAS_TRAIT(user, TRAIT_UNKNOWN)) + if ((!big_pointer && !pointer_color) || HAS_TRAIT(user, TRAIT_UNKNOWN)) return - if(point.icon_state != /obj/effect/temp_visual/point::icon_state) //it differs from the original icon_state already. + if (point.icon_state != /obj/effect/temp_visual/point::icon_state) //it differs from the original icon_state already. return - if(big_pointer) + if (loc != user) + if (!isitem(loc)) + return + var/obj/item/as_item = loc + if (as_item.GetID() != src) + return + if (big_pointer) point.icon_state = "arrow_large" - if(pointer_color) + if (pointer_color) point.icon_state = "[point.icon_state]_white" point.color = pointer_color var/mutable_appearance/highlight = mutable_appearance(point.icon, "[point.icon_state]_highlights", appearance_flags = RESET_COLOR) point.add_overlay(highlight) -/obj/item/card/id/dropped(mob/user) - UnregisterSignal(user, COMSIG_MOVABLE_POINTED) - return ..() - /obj/item/card/id/get_id_examine_strings(mob/user) . = ..() . += list("[icon2html(get_cached_flat_icon(), user, extra_classes = "hugeicon")]") @@ -1130,6 +1158,16 @@ update_icon() return ITEM_INTERACT_SUCCESS +/obj/item/card/id/advanced/on_loc_equipped(datum/source, mob/equipper, slot) + . = ..() + if(istype(loc, /obj/item/storage/wallet) || istype(loc, /obj/item/modular_computer)) + update_intern_status(source, equipper, slot) + +/obj/item/card/id/advanced/on_loc_dropped(datum/source, mob/dropper) + . = ..() + if(istype(loc, /obj/item/storage/wallet) || istype(loc, /obj/item/modular_computer)) + remove_intern_status(source, dropper) + /obj/item/card/id/advanced/proc/update_intern_status(datum/source, mob/user, slot) SIGNAL_HANDLER @@ -1165,25 +1203,6 @@ is_intern = FALSE update_label() -/obj/item/card/id/advanced/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - - //Old loc - 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)) - UnregisterSignal(old_loc, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED)) - - //New loc - if(istype(loc, /obj/item/storage/wallet)) - 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)) - RegisterSignal(loc, COMSIG_ITEM_EQUIPPED, PROC_REF(update_intern_status)) - RegisterSignal(loc, COMSIG_ITEM_DROPPED, PROC_REF(remove_intern_status)) - /obj/item/card/id/advanced/update_overlays() . = ..() @@ -1576,9 +1595,9 @@ return ..() balloon_alert(user, "flipped") if(trim_assignment_override) - SSid_access.remove_trim_from_chameleon_card(src) + SSid_access.remove_trim_override(src) else - SSid_access.apply_trim_to_chameleon_card(src, alt_trim) + SSid_access.apply_trim_override(src, alt_trim) update_label() update_appearance() @@ -1794,7 +1813,7 @@ if(forged) //reset the ID if forged registered_name = initial(registered_name) assignment = initial(assignment) - SSid_access.remove_trim_from_chameleon_card(src) + SSid_access.remove_trim_override(src) REMOVE_TRAIT(src, TRAIT_MAGNETIC_ID_CARD, CHAMELEON_ITEM_TRAIT) user.log_message("reset \the [initial(name)] named \"[src]\" to default.", LOG_GAME) update_label() @@ -1849,7 +1868,7 @@ registered_name = input_name if(selected_trim_path) - SSid_access.apply_trim_to_chameleon_card(src, trim_list[selected_trim_path]) + SSid_access.apply_trim_override(src, trim_list[selected_trim_path]) if(target_occupation) assignment = sanitize(target_occupation) if(new_age) diff --git a/code/game/objects/items/cigarettes.dm b/code/game/objects/items/cigarettes.dm index f7e841c22eadc..89bfb8280d77a 100644 --- a/code/game/objects/items/cigarettes.dm +++ b/code/game/objects/items/cigarettes.dm @@ -545,11 +545,11 @@ CIGARETTE PACKETS ARE IN FANCY.DM return ..() if(cig.lit) - to_chat(user, span_warning("The [cig.name] is already lit!")) + to_chat(user, span_warning("\The [cig] is already lit!")) if(M == user) cig.attackby(src, user) else - cig.light(span_notice("[user] holds the [name] out for [M], and lights [M.p_their()] [cig.name].")) + cig.light(span_notice("[user] holds \the [src] out for [M], and lights [M.p_their()] [cig.name].")) /obj/item/cigarette/fire_act(exposed_temperature, exposed_volume) light() diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 7de4d4ff85475..ed5fdbe965a44 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -508,7 +508,7 @@ clicky = clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(ICON_SIZE_Y/2), ICON_SIZE_Y/2) if(!instant) - to_chat(user, span_notice("You start drawing a [temp] on the [target.name]...")) + to_chat(user, span_notice("You start drawing a [temp] on \the [target]...")) if(pre_noise) audible_message(span_notice("You hear spraying.")) @@ -793,6 +793,7 @@ var/static/list/direct_color_types = typecacheof(list( /obj/item/paper, // Uses color for TGUI backgrounds, doesn't look very good either /obj/item/fish, // Used for aquarium sprites + /obj/structure/window, // Does not play nice with window tint )) /obj/item/toy/crayon/spraycan/Initialize(mapload) diff --git a/code/game/objects/items/credit_holochip.dm b/code/game/objects/items/credit_holochip.dm index 9e9b6c8ac9021..a856b6541fccf 100644 --- a/code/game/objects/items/credit_holochip.dm +++ b/code/game/objects/items/credit_holochip.dm @@ -1,6 +1,6 @@ /obj/item/holochip name = "credit holochip" - desc = "A hard-light chip encoded with an amount of credits. It is a modern replacement for physical money that can be directly converted to virtual currency and viceversa. Keep away from magnets." + desc = "A hard-light chip encoded with an amount of credits. It is a modern replacement for physical money that can be directly converted to virtual currency and vice-versa. Keep away from magnets." icon = 'icons/obj/economy.dmi' icon_state = "holochip" base_icon_state = "holochip" diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index fbdf3bae40a88..5783b3c867f52 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -77,9 +77,7 @@ saved_appearance = temp.appearance /obj/item/chameleon/proc/check_sprite(atom/target) - if(target.icon_state in icon_states(target.icon)) - return TRUE - return FALSE + return icon_exists(target.icon, target.icon_state) /obj/item/chameleon/proc/toggle(mob/user) if(!can_use || !saved_appearance) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 7f9a60a7ed57e..32c31fb511015 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -793,25 +793,20 @@ var/timer_id = TIMER_ID_NULL /obj/item/flashlight/glowstick/Initialize(mapload, fuel_override = null) - . = ..() max_fuel = isnull(fuel_override) ? rand(20, 25) : fuel_override create_reagents(max_fuel + oxygen_added, DRAWABLE | INJECTABLE) reagents.add_reagent(fuel_type, max_fuel) + . = ..() set_light_color(color) AddComponent(/datum/component/edible,\ food_flags = FOOD_NO_EXAMINE,\ volume = reagents.total_volume,\ bite_consumption = round(reagents.total_volume / (rand(20, 30) * 0.1)),\ ) - RegisterSignals(reagents, list(COMSIG_REAGENTS_REM_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_CLEAR_REAGENTS, COMSIG_REAGENTS_REACTED), PROC_REF(on_reagent_change)) - RegisterSignal(reagents, COMSIG_QDELETING, PROC_REF(on_reagents_del)) - -/obj/item/flashlight/glowstick/proc/on_reagents_del(datum/reagents/reagents) - SIGNAL_HANDLER - UnregisterSignal(reagents, list(COMSIG_REAGENTS_REM_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_CLEAR_REAGENTS, COMSIG_REAGENTS_REACTED, COMSIG_QDELETING)) + RegisterSignal(reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(on_reagent_change)) /obj/item/flashlight/glowstick/proc/get_fuel() - return reagents?.get_reagent_amount(fuel_type) + return reagents.get_reagent_amount(fuel_type) /// Burns down the glowstick by the specified time /// Returns the amount of time we need to burn before a visual change will occur diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 578c671bf5308..bd41fb7023efc 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -30,6 +30,10 @@ GLOBAL_LIST_INIT(channel_tokens, list( interaction_flags_mouse_drop = FORBID_TELEKINESIS_REACH slot_flags = ITEM_SLOT_EARS dog_fashion = null + equip_sound = SFX_HEADSET_EQUIP + pickup_sound = SFX_HEADSET_PICKUP + drop_sound = 'sound/items/handling/headset/headset_drop1.ogg' + sound_vary = TRUE var/obj/item/encryptionkey/keyslot2 = null /// A list of all languages that this headset allows the user to understand. Populated by language encryption keys. var/list/language_list diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 8391edb8319d1..4d67b4a0e3882 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -690,7 +690,7 @@ /obj/item/radio/entertainment/speakers/physical // Can be used as a physical item name = "entertainment radio" - desc = "A portable one-way radio permamently tuned into entertainment frequency." + desc = "A portable one-way radio permanently tuned into entertainment frequency." icon_state = "radio" inhand_icon_state = "radio" worn_icon_state = "radio" diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index b15a9dfa2eb60..7773e1ea09251 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -680,7 +680,7 @@ /obj/item/healthanalyzer/simple/disease name = "disease state analyzer" - desc = "Another of MeLo-Tech's dubiously useful medsci scanners, the disease analyzer is a pretty rare find these days - NT found out that giving their hospitals the lowest-common-denominator pandemic equipment resulted in too much financial loss of life to be profitable. There's rumours that the inbuilt AI is jealous of the first aid analyzer's success." + desc = "Another of MeLo-Tech's dubiously useful medsci scanners, the disease analyzer is a pretty rare find these days - NT found out that giving their hospitals the lowest-common-denominator pandemic equipment resulted in too much financial loss of life to be profitable. There are rumours that the inbuilt AI is jealous of the first aid analyzer's success." icon_state = "disease_aid" mode = SCANNER_NO_MODE encouragements = list("encourages you to take your medication", "briefly displays a spinning cartoon heart", "reasures you about your condition", \ diff --git a/code/game/objects/items/devices/scanners/plant_analyzer.dm b/code/game/objects/items/devices/scanners/plant_analyzer.dm index 25bfab652f796..363ae5067b0df 100644 --- a/code/game/objects/items/devices/scanners/plant_analyzer.dm +++ b/code/game/objects/items/devices/scanners/plant_analyzer.dm @@ -64,13 +64,15 @@ if(isliving(interacting_with)) playsound(src, SFX_INDUSTRIAL_SCAN, 20, TRUE, -2, TRUE, FALSE) - var/mob/living/L = interacting_with - if(L.mob_biotypes & MOB_PLANT) - plant_biotype_health_scan(interacting_with, user) + var/mob/living/living_target = interacting_with + if(living_target.mob_biotypes & MOB_PLANT) + plant_biotype_health_scan(living_target, user) return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING - analyze(user, interacting_with) - return ITEM_INTERACT_SUCCESS + if(analyze(user, interacting_with)) + return ITEM_INTERACT_SUCCESS + return NONE /// Same as above, but with right click. Right-clicking scans for chemicals. /obj/item/plant_analyzer/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) @@ -78,7 +80,10 @@ if(!user.can_read(src)) return ITEM_INTERACT_BLOCKING - return do_plant_chem_scan(interacting_with, user) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING + if(do_plant_chem_scan(interacting_with, user)) + return ITEM_INTERACT_SUCCESS + + return NONE /* * Scan the target on chemical scan mode. This prints chemical genes and reagents to the user. @@ -91,10 +96,10 @@ */ /obj/item/plant_analyzer/proc/do_plant_chem_scan(atom/scan_target, mob/user) if(isliving(scan_target)) - var/mob/living/L = scan_target - if(L.mob_biotypes & MOB_PLANT) + var/mob/living/living_target = scan_target + if(living_target.mob_biotypes & MOB_PLANT) plant_biotype_chem_scan(scan_target, user) - return TRUE + return TRUE return analyze(user, scan_target) diff --git a/code/game/objects/items/devices/spyglasses.dm b/code/game/objects/items/devices/spyglasses.dm index 8d70f3de29215..10089d47f622f 100644 --- a/code/game/objects/items/devices/spyglasses.dm +++ b/code/game/objects/items/devices/spyglasses.dm @@ -88,7 +88,7 @@ /obj/item/paper/fluff/nerddocs name = "Espionage For Dummies" color = COLOR_YELLOW - desc = "An eye gougingly yellow pamphlet with a badly designed image of a detective on it. the subtext says \" The Latest way to violate privacy guidelines!\" " + desc = "An eye-gougingly yellow pamphlet with a badly designed image of a detective on it. The subtext says \"The latest way to violate privacy guidelines!\" " default_raw_text = @{" Thank you for your purchase of the Nerd Co SpySpeks tm, this paper will be your quick-start guide to violating the privacy of your crewmates in three easy steps!

Step One: Nerd Co SpySpeks tm upon your face.
diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm index dde01baac03ee..4ede441b3eb9c 100644 --- a/code/game/objects/items/dna_injector.dm +++ b/code/game/objects/items/dna_injector.dm @@ -47,7 +47,7 @@ target.dna.remove_mutation(removed_mutation) for(var/added_mutation in add_mutations) if(added_mutation == /datum/mutation/human/race) - message_admins("[ADMIN_LOOKUPFLW(user)] injected [key_name_admin(target)] with the [name] [span_danger("(MONKEY)")]") + message_admins("[ADMIN_LOOKUPFLW(user)] injected [key_name_admin(target)] with \the [src] [span_danger("(MONKEY)")]") if(target.dna.mutation_in_sequence(added_mutation)) target.dna.activate_mutation(added_mutation) else @@ -119,7 +119,7 @@ if(target.dna.get_mutation(mutation)) continue //Skip permanent mutations we already have. if(mutation == /datum/mutation/human/race && !ismonkey(target)) - message_admins("[ADMIN_LOOKUPFLW(user)] injected [key_name_admin(target)] with the [name] [span_danger("(MONKEY)")]") + message_admins("[ADMIN_LOOKUPFLW(user)] injected [key_name_admin(target)] with \the [src] [span_danger("(MONKEY)")]") target.dna.add_mutation(mutation, MUT_OTHER, endtime) else target.dna.add_mutation(mutation, MUT_OTHER, endtime) diff --git a/code/game/objects/items/food/bait.dm b/code/game/objects/items/food/bait.dm index 9fbac7d3cf82b..6d4df7fc7bc46 100644 --- a/code/game/objects/items/food/bait.dm +++ b/code/game/objects/items/food/bait.dm @@ -62,6 +62,7 @@ /obj/item/food/bait/doughball/synthetic name = "synthetic doughball" icon_state = "doughball_blue" + rod_overlay_icon_state = "dough_blue_overlay" preserved_food = TRUE show_on_wiki = FALSE //It's an abstract item. diff --git a/code/game/objects/items/food/bread.dm b/code/game/objects/items/food/bread.dm index 3a41514413c61..56ebddc23d872 100644 --- a/code/game/objects/items/food/bread.dm +++ b/code/game/objects/items/food/bread.dm @@ -124,7 +124,7 @@ /obj/item/food/bread/sausage name = "sausagebread loaf" - desc = "Dont think too much about it." + desc = "Don't think too much about it." icon_state = "sausagebread" food_reagents = list( /datum/reagent/consumable/nutriment = 20, diff --git a/code/game/objects/items/food/burgers.dm b/code/game/objects/items/food/burgers.dm index 7a2054e665763..54e400d1d50bc 100644 --- a/code/game/objects/items/food/burgers.dm +++ b/code/game/objects/items/food/burgers.dm @@ -678,7 +678,7 @@ /obj/item/food/burger/sloppy_moe name = "sloppy moe" - desc = "Ground meat mixed with onions and barbeque sauce, sloppily plopped onto a burger bun. Delicious, but guaranteed to get your hands dirty." + desc = "Ground meat mixed with onions and barbecue sauce, sloppily plopped onto a burger bun. Delicious, but guaranteed to get your hands dirty." icon_state = "sloppy_moe" food_reagents = list( /datum/reagent/consumable/nutriment = 10, diff --git a/code/game/objects/items/food/cheese.dm b/code/game/objects/items/food/cheese.dm index ac8817e8bb2d7..38372fee3c0a8 100644 --- a/code/game/objects/items/food/cheese.dm +++ b/code/game/objects/items/food/cheese.dm @@ -38,7 +38,7 @@ /obj/item/food/cheese/wheel name = "cheese wheel" - desc = "A big wheel of delcious Cheddar." + desc = "A big wheel of delicious Cheddar." icon_state = "cheesewheel" food_reagents = list( /datum/reagent/consumable/nutriment/fat = 10, diff --git a/code/game/objects/items/food/donuts.dm b/code/game/objects/items/food/donuts.dm index 993ada424adab..cbe3451c9df40 100644 --- a/code/game/objects/items/food/donuts.dm +++ b/code/game/objects/items/food/donuts.dm @@ -199,7 +199,7 @@ /obj/item/food/donut/laugh name = "sweet pea donut" - desc = "Goes great with a bottle of Bastion Burbon!" + desc = "Goes great with a bottle of Bastion Bourbon!" icon_state = "donut_laugh" food_reagents = list( /datum/reagent/consumable/nutriment = 3, @@ -347,7 +347,7 @@ /obj/item/food/donut/jelly/laugh name = "sweet pea jelly donut" - desc = "Goes great with a bottle of Bastion Burbon!" + desc = "Goes great with a bottle of Bastion Bourbon!" icon_state = "jelly_laugh" food_reagents = list( /datum/reagent/consumable/nutriment = 3, @@ -483,7 +483,7 @@ /obj/item/food/donut/jelly/slimejelly/laugh name = "sweet pea jelly donut" - desc = "Goes great with a bottle of Bastion Burbon!" + desc = "Goes great with a bottle of Bastion Bourbon!" icon_state = "jelly_laugh" food_reagents = list( /datum/reagent/consumable/nutriment = 3, diff --git a/code/game/objects/items/food/lizard.dm b/code/game/objects/items/food/lizard.dm index f8d8dbec8f51f..a91831b388325 100644 --- a/code/game/objects/items/food/lizard.dm +++ b/code/game/objects/items/food/lizard.dm @@ -496,7 +496,7 @@ /obj/item/food/bread/root name = "rootbread" - desc = "The lizard equivalent to bread, made from tubers like potatoes and yams mixed with ground nuts and seeds. Noticably denser than regular bread." + desc = "The lizard equivalent to bread, made from tubers like potatoes and yams mixed with ground nuts and seeds. Noticeably denser than regular bread." icon = 'icons/obj/food/lizard.dmi' icon_state = "lizard_bread" food_reagents = list(/datum/reagent/consumable/nutriment = 20) @@ -967,7 +967,7 @@ /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." + desc = "Ground meat mixed with onions and barbecue 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( diff --git a/code/game/objects/items/food/martian.dm b/code/game/objects/items/food/martian.dm index 748610457ec41..ef288a8bed7d4 100644 --- a/code/game/objects/items/food/martian.dm +++ b/code/game/objects/items/food/martian.dm @@ -1,7 +1,7 @@ //Ingredients and Simple Dishes /obj/item/food/kimchi name = "kimchi" - desc = "A classic Korean dish in the Martian style- shredded cabbage with chilli peppers, konbu, bonito, and a mix of spices." + desc = "A classic Korean dish in the Martian style: shredded cabbage with chilli peppers, konbu, bonito, and a mix of spices." icon = 'icons/obj/food/martian.dmi' icon_state = "kimchi" food_reagents = list( diff --git a/code/game/objects/items/food/meatdish.dm b/code/game/objects/items/food/meatdish.dm index 07b9b34699178..bf7222b31f78e 100644 --- a/code/game/objects/items/food/meatdish.dm +++ b/code/game/objects/items/food/meatdish.dm @@ -1115,7 +1115,7 @@ /obj/item/food/roast_dinner_tofu name = "tofu roast dinner" - desc = "A luxuriously roasted tofu-'chicken', accompanied by cabbage, parsnip, potatoes, peas, stuffing and a small boat of soybased gravy." + desc = "A luxuriously roasted tofu-'chicken', accompanied by cabbage, parsnip, potatoes, peas, stuffing and a small boat of soy-based gravy." icon = 'icons/obj/food/meat.dmi' icon_state = "full_roast_tofu" food_reagents = list( diff --git a/code/game/objects/items/food/pastries.dm b/code/game/objects/items/food/pastries.dm index 0b96101a99d51..556c0a0bda9a0 100644 --- a/code/game/objects/items/food/pastries.dm +++ b/code/game/objects/items/food/pastries.dm @@ -352,7 +352,7 @@ /obj/item/food/cannoli name = "cannoli" - desc = "A sicilian treat that makes you into a wise guy." + desc = "A Sicilian treat that makes you into a wise guy." icon_state = "cannoli" food_reagents = list( /datum/reagent/consumable/nutriment = 6, diff --git a/code/game/objects/items/food/salad.dm b/code/game/objects/items/food/salad.dm index 703db3a12a4eb..ed9c1ba545b96 100644 --- a/code/game/objects/items/food/salad.dm +++ b/code/game/objects/items/food/salad.dm @@ -295,7 +295,7 @@ /obj/item/food/salad/potato_salad name = "potato salad" - desc = "A dish of boiled potatoes mixed with boiled eggs, onions, and mayonnaise. A staple of every self-respecting barbeque." + desc = "A dish of boiled potatoes mixed with boiled eggs, onions, and mayonnaise. A staple of every self-respecting barbecue." icon_state = "potato_salad" food_reagents = list( /datum/reagent/consumable/nutriment/vitamin = 12, diff --git a/code/game/objects/items/food/snacks.dm b/code/game/objects/items/food/snacks.dm index 722663cf265e0..06c0deb7cbc70 100644 --- a/code/game/objects/items/food/snacks.dm +++ b/code/game/objects/items/food/snacks.dm @@ -639,7 +639,7 @@ GLOBAL_LIST_INIT(safe_peanut_types, populate_safe_peanut_types()) /obj/item/food/shok_roks/berry name = "\improper Shok-Roks - Berry Storm flavour" - desc = "You've heard of Snap-Roks, now get ready for Shok-Roks: the popping candy for Ethereals! Available in 5 exciting flavours, of which this bag contains Berry Storm- filled with non-descript sour berry flavour!" + desc = "You've heard of Snap-Roks, now get ready for Shok-Roks: the popping candy for Ethereals! Available in 5 exciting flavours, of which this bag contains Berry Storm- filled with nondescript sour berry flavour!" icon_state = "shok_roks_berry" trash_type = /obj/item/trash/shok_roks/berry tastes = list("sour berry" = 1, "lightning" = 1) diff --git a/code/game/objects/items/forensicsspoofer.dm b/code/game/objects/items/forensicsspoofer.dm index b2384d2dda237..49e8c2376ed78 100644 --- a/code/game/objects/items/forensicsspoofer.dm +++ b/code/game/objects/items/forensicsspoofer.dm @@ -57,7 +57,7 @@ return playsound(src, SFX_INDUSTRIAL_SCAN, 20, TRUE, -2, TRUE, FALSE) user.visible_message( - span_notice("\The [user] points the [name] at \the [target] and performs a forensic scan.") + span_notice("\The [user] points \the [src] at \the [target] and performs a forensic scan.") ) /obj/item/forensics_spoofer/proc/clear_values(list/the_list) diff --git a/code/game/objects/items/granters/crafting/death_sandwich.dm b/code/game/objects/items/granters/crafting/death_sandwich.dm index 045b869a38fc5..0ceebf4943554 100644 --- a/code/game/objects/items/granters/crafting/death_sandwich.dm +++ b/code/game/objects/items/granters/crafting/death_sandwich.dm @@ -1,6 +1,6 @@ /obj/item/book/granter/crafting_recipe/death_sandwich name = "\improper SANDWICH OF DEATH SECRET RECIPE" - desc = "An ancient composition notebook with the instructions for an ancient and ultimate sandwich scrawled upon its looseleaf pages. The title has been scrawled onto it with permanent marker." + desc = "An ancient composition notebook with the instructions for an ancient and ultimate sandwich scrawled upon its loose-leaf pages. The title has been scrawled onto it with permanent marker." crafting_recipe_types = list( /datum/crafting_recipe/food/death_sandwich ) diff --git a/code/game/objects/items/granters/crafting/desserts.dm b/code/game/objects/items/granters/crafting/desserts.dm index 518de4bb033d6..cfd24a0d8926c 100644 --- a/code/game/objects/items/granters/crafting/desserts.dm +++ b/code/game/objects/items/granters/crafting/desserts.dm @@ -1,7 +1,7 @@ /obj/item/book/granter/crafting_recipe/cooking_sweets_101 name = "Cooking Desserts 101" - desc = "A cook book that teaches you some more of the newest desserts. AI approved, and a best seller on Honkplanet." + desc = "A cook book that teaches you some more of the newest desserts. AI approved, and a bestseller on Honkplanet." crafting_recipe_types = list( /datum/crafting_recipe/food/mimetart, /datum/crafting_recipe/food/berrytart, diff --git a/code/game/objects/items/granters/magic/_spell_granter.dm b/code/game/objects/items/granters/magic/_spell_granter.dm index 21a69248a1407..ecf0c70d83ca1 100644 --- a/code/game/objects/items/granters/magic/_spell_granter.dm +++ b/code/game/objects/items/granters/magic/_spell_granter.dm @@ -31,7 +31,7 @@ /obj/item/book/granter/action/spell/can_learn(mob/living/user) if(!granted_action) - CRASH("Someone attempted to learn [type], which did not have an spell set.") + CRASH("Someone attempted to learn [type], which did not have a spell set.") if(locate(granted_action) in user.actions) if(HAS_MIND_TRAIT(user, TRAIT_MAGICALLY_GIFTED)) to_chat(user, span_warning("You're already far more versed in the spell [action_name] \ diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index c193b9ab73b9c..78031af7d744d 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -53,7 +53,7 @@ . += span_notice("You scan the grenade and detect the following reagents:") for(var/obj/item/reagent_containers/cup/glass_beaker in beakers) for(var/datum/reagent/reagent in glass_beaker.reagents.reagent_list) - . += span_notice("[reagent.volume] units of [reagent.name] in the [glass_beaker.name].") + . += span_notice("[reagent.volume] units of [reagent.name] in \the [glass_beaker].") if(beakers.len == 1) . += span_notice("You detect no second beaker in the grenade.") else @@ -126,7 +126,7 @@ if(!landminemode.secured) landminemode.toggle_secure() landminemode.toggle_scan(FALSE) - to_chat(user, span_notice("You disarm the [landminemode.name].")) + to_chat(user, span_notice("You disarm \the [landminemode].")) tool.play_tool_sound(src, 25) else to_chat(user, span_warning("You need to add at least one beaker before locking the [initial(name)] assembly!")) @@ -629,7 +629,7 @@ /obj/item/grenade/chem_grenade/bioterrorfoam name = "Bio terror foam grenade" - desc = "Tiger Cooperative chemical foam grenade. Causes temporary irration, blindness, confusion, mutism, and mutations to carbon based life forms. Contains additional spore toxin." + desc = "Tiger Cooperative chemical foam grenade. Causes temporary irritation, blindness, confusion, mutism, and mutations to carbon based life forms. Contains additional spore toxin." stage = GRENADE_READY /obj/item/grenade/chem_grenade/bioterrorfoam/Initialize(mapload) diff --git a/code/game/objects/items/grenades/spawnergrenade.dm b/code/game/objects/items/grenades/spawnergrenade.dm index df3739afcc6c2..e479d7d818a02 100644 --- a/code/game/objects/items/grenades/spawnergrenade.dm +++ b/code/game/objects/items/grenades/spawnergrenade.dm @@ -66,7 +66,7 @@ /obj/item/grenade/spawnergrenade/clown_broken name = "stuffed C.L.U.W.N.E." - desc = "A sleek device often given to clowns on their 10th birthdays for protection. While a typical C.L.U.W.N.E only holds one creature, sometimes foolish young clowns try to cram more in, often to disasterous effect." + desc = "A sleek device often given to clowns on their 10th birthdays for protection. While a typical C.L.U.W.N.E only holds one creature, sometimes foolish young clowns try to cram more in, often to disastrous effect." icon_state = "clown_broken" inhand_icon_state = null spawner_type = /mob/living/basic/clown/mutant diff --git a/code/game/objects/items/gun_maintenance.dm b/code/game/objects/items/gun_maintenance.dm index 072ec395c191c..77ba80352910b 100644 --- a/code/game/objects/items/gun_maintenance.dm +++ b/code/game/objects/items/gun_maintenance.dm @@ -1,6 +1,78 @@ /obj/item/gun_maintenance_supplies - name = "gun maintenance supplies" - desc = "plastic box containing gun maintenance supplies and spare parts. Use them on a rifle to clean it." - icon = 'icons/obj/storage/box.dmi' - icon_state = "plasticbox" - w_class = WEIGHT_CLASS_SMALL + name = "gun maintenance kit" + desc = "A toolbox containing gun maintenance supplies and spare parts. Can be applied to firearms to maintain them." + icon = 'icons/obj/storage/toolbox.dmi' + icon_state = "maint_kit" + inhand_icon_state = "ammobox" + lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi' + force = 12 + throwforce = 12 + throw_speed = 2 + throw_range = 7 + demolition_mod = 1.25 + w_class = WEIGHT_CLASS_BULKY + drop_sound = 'sound/items/handling/ammobox_drop.ogg' + pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' + /// How many times we can use this maintenance kit to maintain a gun + var/uses = 3 + /// THe maximum uses, used for our examine text. + var/max_uses = 3 + +/obj/item/gun_maintenance_supplies/examine(mob/user) + . = ..() + . += span_info("This kit has [uses] uses out of [max_uses] left.") + +/obj/item/gun_maintenance_supplies/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + . = ..() + if(. & ITEM_INTERACT_ANY_BLOCKER) + return ITEM_INTERACT_BLOCKING + + if(!isgun(interacting_with)) + balloon_alert(user, "not a gun!") + return ITEM_INTERACT_BLOCKING + + var/obj/item/gun/gun_to_fix = interacting_with + + var/gun_is_damaged = gun_to_fix.get_integrity() < gun_to_fix.max_integrity + var/use_charge = FALSE + + if(gun_is_damaged) + gun_to_fix.repair_damage(gun_to_fix.max_integrity) + use_charge = TRUE + + if(istype(gun_to_fix, /obj/item/gun/ballistic)) + var/obj/item/gun/ballistic/ballistic_gun_to_fix = gun_to_fix + + if(ballistic_gun_to_fix.misfire_probability > initial(ballistic_gun_to_fix.misfire_probability)) + ballistic_gun_to_fix.misfire_probability = initial(ballistic_gun_to_fix.misfire_probability) + + if(istype(ballistic_gun_to_fix, /obj/item/gun/ballistic/rifle/boltaction)) + var/obj/item/gun/ballistic/rifle/boltaction/rifle_to_fix = ballistic_gun_to_fix + if(rifle_to_fix.jammed) + rifle_to_fix.jammed = FALSE + rifle_to_fix.unjam_chance = initial(rifle_to_fix.unjam_chance) + rifle_to_fix.jamming_chance = initial(rifle_to_fix.jamming_chance) + use_charge = TRUE + + if(!use_charge) + balloon_alert(user, "no need for repair!") + return ITEM_INTERACT_BLOCKING + + balloon_alert(user, "maintenance complete") + use_the_kit() + return ITEM_INTERACT_SUCCESS + +/obj/item/gun_maintenance_supplies/proc/use_the_kit() + uses -- + if(!uses) + qdel(src) + +/obj/item/gun_maintenance_supplies/makeshift + name = "makeshift gun maintenance kit" + desc = "A toolbox containing enough supplies to juryrig repairs on firearms. Can be applied to firearms to maintain them. \ + The tools are a little basic, and the materials low-quality, but it gets the job done." + icon_state = "maint_kit_makeshift" + inhand_icon_state = "toolbox_blue" + uses = 1 + max_uses = 1 diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index e63085d65be52..caecc13596217 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -423,7 +423,7 @@ return ..() /obj/item/restraints/legcuffs/beartrap/suicide_act(mob/living/user) - user.visible_message(span_suicide("[user] is sticking [user.p_their()] head in the [src.name]! It looks like [user.p_theyre()] trying to commit suicide!")) + user.visible_message(span_suicide("[user] is sticking [user.p_their()] head in \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")) playsound(loc, 'sound/items/weapons/bladeslice.ogg', 50, TRUE, -1) return BRUTELOSS diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm index 1519d20a0f3b9..ab9a98d6730da 100644 --- a/code/game/objects/items/kitchen.dm +++ b/code/game/objects/items/kitchen.dm @@ -211,12 +211,12 @@ /obj/item/kitchen/spoon/create_reagents(max_vol, flags) . = ..() - RegisterSignals(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_REM_REAGENT), PROC_REF(on_reagent_change)) + RegisterSignal(reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(on_reagent_change)) -/obj/item/kitchen/spoon/proc/on_reagent_change(datum/reagents/reagents, ...) +/obj/item/kitchen/spoon/proc/on_reagent_change(datum/reagents/reagents) SIGNAL_HANDLER + update_appearance(UPDATE_OVERLAYS) - return NONE /obj/item/kitchen/spoon/add_item_context(obj/item/source, list/context, atom/target, mob/living/user) if(target.is_open_container()) diff --git a/code/game/objects/items/knives.dm b/code/game/objects/items/knives.dm index 438a157e9a676..158608d6f0141 100644 --- a/code/game/objects/items/knives.dm +++ b/code/game/objects/items/knives.dm @@ -54,9 +54,9 @@ AddComponent(/datum/component/alternative_sharpness, SHARP_POINTY, alt_continuous, alt_simple) /obj/item/knife/suicide_act(mob/living/user) - user.visible_message(pick(span_suicide("[user] is slitting [user.p_their()] wrists with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide."), \ - span_suicide("[user] is slitting [user.p_their()] throat with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide."), \ - span_suicide("[user] is slitting [user.p_their()] stomach open with the [src.name]! It looks like [user.p_theyre()] trying to commit seppuku."))) + user.visible_message(pick(span_suicide("[user] is slitting [user.p_their()] wrists with \the [src]! It looks like [user.p_theyre()] trying to commit suicide."), \ + span_suicide("[user] is slitting [user.p_their()] throat with \the [src]! It looks like [user.p_theyre()] trying to commit suicide."), \ + span_suicide("[user] is slitting [user.p_their()] stomach open with \the [src]! It looks like [user.p_theyre()] trying to commit seppuku."))) return BRUTELOSS /obj/item/knife/ritual diff --git a/code/game/objects/items/lighter.dm b/code/game/objects/items/lighter.dm index 38794ab9079e3..625b123c2e5ba 100644 --- a/code/game/objects/items/lighter.dm +++ b/code/game/objects/items/lighter.dm @@ -203,15 +203,15 @@ return ..() if(cig.lit) - to_chat(user, span_warning("The [cig.name] is already lit!")) + to_chat(user, span_warning("\The [cig] is already lit!")) if(target_mob == user) cig.attackby(src, user) return if(fancy) - cig.light(span_rose("[user] whips the [name] out and holds it for [target_mob]. [user.p_Their()] arm is as steady as the unflickering flame [user.p_they()] light[user.p_s()] \the [cig] with.")) + cig.light(span_rose("[user] whips \the [src] out and holds it for [target_mob]. [user.p_Their()] arm is as steady as the unflickering flame [user.p_they()] light[user.p_s()] \the [cig] with.")) else - cig.light(span_notice("[user] holds the [name] out for [target_mob], and lights [target_mob.p_their()] [cig.name].")) + cig.light(span_notice("[user] holds \the [src] out for [target_mob], and lights [target_mob.p_their()] [cig.name].")) ///Checks if the lighter is able to perform a welding task. /obj/item/lighter/tool_use_check(mob/living/user, amount, heat_required) @@ -333,7 +333,7 @@ fancy = FALSE /obj/item/lighter/mime/ignition_effect(atom/A, mob/user) - . = span_infoplain("[user] lifts the [name] to the [A], which miraculously lights!") + . = span_infoplain("[user] lifts \the [src] to the [A], which miraculously lights!") /obj/item/lighter/bright name = "illuminative zippo" diff --git a/code/game/objects/items/maintenance_loot.dm b/code/game/objects/items/maintenance_loot.dm index 5389f7723b982..a8d088a0098ac 100644 --- a/code/game/objects/items/maintenance_loot.dm +++ b/code/game/objects/items/maintenance_loot.dm @@ -49,3 +49,19 @@ var/initial_percent = rand(40, 60) / 100 // 250kJ to 350kJ charge = initial_percent * maxcharge ADD_TRAIT(src, TRAIT_FISHING_BAIT, INNATE_TRAIT) + AddComponent(/datum/component/loads_avatar_gear, \ + load_callback = CALLBACK(src, PROC_REF(shockingly_improve_avatar)), \ + ) + +// Give our owner shock touch when entering the digital realm +/obj/item/stock_parts/power_store/cell/lead/proc/shockingly_improve_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, external_load_flags) + if(external_load_flags & DOMAIN_FORBIDS_ABILITIES) + return BITRUNNER_GEAR_LOAD_BLOCKED + + if(!avatar.can_mutate()) + return BITRUNNER_GEAR_LOAD_FAILED + + if(avatar.dna.mutation_in_sequence(/datum/mutation/human/shock)) + avatar.dna.activate_mutation(/datum/mutation/human/shock) + else + avatar.dna.add_mutation(/datum/mutation/human/shock, MUT_EXTRA) diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index 215485e90a3e8..3b7eea6799e72 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -383,7 +383,7 @@ RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) /obj/item/melee/baton/telescopic/additional_effects_non_cyborg(mob/living/target, mob/living/user) - target.apply_status_effect(/datum/status_effect/next_shove_stuns) + target.apply_status_effect(/datum/status_effect/dazed) /obj/item/melee/baton/telescopic/suicide_act(mob/living/user) var/mob/living/carbon/human/human_user = user @@ -531,6 +531,8 @@ var/active_changes_inhand = TRUE ///Whether or not our baton visibly changes the inhand sprite based on inserted cell var/tip_changes_color = TRUE + ///When set, inhand_icon_state defaults to this instead of base_icon_state + var/base_inhand_state = null /datum/armor/baton_security bomb = 50 @@ -556,7 +558,7 @@ attack(user, user) return FIRELOSS else - user.visible_message(span_suicide("[user] is shoving the [name] down their throat! It looks like [user.p_theyre()] trying to commit suicide!")) + user.visible_message(span_suicide("[user] is shoving \the [src] down their throat! It looks like [user.p_theyre()] trying to commit suicide!")) return OXYLOSS /obj/item/melee/baton/security/Destroy() @@ -595,20 +597,21 @@ update_appearance() /obj/item/melee/baton/security/update_icon_state() + var/base_inhand = base_inhand_state || base_icon_state if(active) icon_state = "[base_icon_state]_active" if(active_changes_inhand) if(tip_changes_color) - inhand_icon_state = "[base_icon_state]_active_[get_baton_tip_color()]" + inhand_icon_state = "[base_inhand]_active_[get_baton_tip_color()]" else - inhand_icon_state = "[base_icon_state]_active" + inhand_icon_state = "[base_inhand]_active" return ..() if(!cell) icon_state = "[base_icon_state]_nocell" - inhand_icon_state = "[base_icon_state]" + inhand_icon_state = base_inhand return ..() - icon_state = "[base_icon_state]" - inhand_icon_state = "[base_icon_state]" + icon_state = base_icon_state + inhand_icon_state = base_inhand return ..() /obj/item/melee/baton/security/examine(mob/user) @@ -834,6 +837,7 @@ icon_state = "stunprod" base_icon_state = "stunprod" inhand_icon_state = "prod" + base_inhand_state = "prod" worn_icon_state = null icon_angle = -45 lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' @@ -878,10 +882,10 @@ our_crystal.use(1) our_prod = /obj/item/melee/baton/security/cattleprod/telecrystalprod else - to_chat(user, span_notice("You don't think the [item.name] will do anything to improve the [src].")) + to_chat(user, span_notice("You don't think \the [item] will do anything to improve \the [src].")) return ..() - to_chat(user, span_notice("You place the [item.name] firmly into the igniter.")) + to_chat(user, span_notice("You place \the [item] firmly into \the [sparkler].")) remove_item_from_storage(user) qdel(src) var/obj/item/melee/baton/security/cattleprod/brand_new_prod = new our_prod(user.loc) diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 8c26b704b13e6..2ac18ae9b2daf 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -175,7 +175,7 @@ /obj/item/melee/parsnip_sabre name = "parsnip sabre" - desc = "A weird, yet elegant weapon. Suprisingly sharp for something made from a parsnip." + desc = "A weird, yet elegant weapon. Surprisingly sharp for something made from a parsnip." icon = 'icons/obj/weapons/sword.dmi' icon_state = "parsnip_sabre" inhand_icon_state = "parsnip_sabre" diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm index 3bab737c9fbd7..843abe98d37b1 100644 --- a/code/game/objects/items/pet_carrier.dm +++ b/code/game/objects/items/pet_carrier.dm @@ -23,12 +23,29 @@ throw_range = 3 custom_materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT * 7.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT) interaction_flags_mouse_drop = NEED_DEXTERITY + /// Is the pet carrier open? Allows you to collect/remove pets. var/open = TRUE + /// Does this carrier allow locking? Disabled for the small pet carrier. + var/allows_locking = TRUE + /// Is this carrier locked? Locks don't require access, just an alt click. var/locked = FALSE + /// List of all mob occupants from inside of the pet carrier. var/list/occupants = list() + /// Combined weight of all mob occupants based on the MOB_SIZE_ defines. var/occupant_weight = 0 - var/max_occupants = 3 //Hard-cap so you can't have infinite mice or something in one carrier - var/max_occupant_weight = MOB_SIZE_SMALL //This is calculated from the mob sizes of occupants + /// Maximum number of mobs that can fit in a pet carrier, so you can't have infinite mice or something in one carrier + var/max_occupants = 3 + /// Maximum weight of a mob that can be carried. This is calculated from the mob sizes of occupants + var/max_occupant_weight = MOB_SIZE_SMALL + + /// Sound played when the mob carrier is opened. + var/open_sound = 'sound/items/handling/cardboard_box/cardboard_box_rustle.ogg' + /// Sound played when the mob carrier is closed. + var/close_sound = 'sound/items/handling/cardboard_box/cardboardbox_drop.ogg' + +/obj/item/pet_carrier/Initialize(mapload) + . = ..() + register_context() /obj/item/pet_carrier/Destroy() if(occupants.len) @@ -54,25 +71,25 @@ // At some point these need to be converted to contextual screentips . += span_notice("Activate it in your hand to [open ? "close" : "open"] its door. Click-drag onto floor to release its occupants.") - if(!open) + if(!open && allows_locking) . += span_notice("Alt-click to [locked ? "unlock" : "lock"] its door.") /obj/item/pet_carrier/attack_self(mob/living/user) if(open) to_chat(user, span_notice("You close [src]'s door.")) - playsound(user, 'sound/effects/bin/bin_close.ogg', 50, TRUE) + playsound(user, close_sound, 50, TRUE) open = FALSE else if(locked) to_chat(user, span_warning("[src] is locked!")) return to_chat(user, span_notice("You open [src]'s door.")) - playsound(user, 'sound/effects/bin/bin_open.ogg', 50, TRUE) + playsound(user, open_sound, 50, TRUE) open = TRUE update_appearance() /obj/item/pet_carrier/click_alt(mob/living/user) - if(open) + if(open || !allows_locking) return CLICK_ACTION_BLOCKING locked = !locked to_chat(user, span_notice("You flip the lock switch [locked ? "down" : "up"].")) @@ -148,7 +165,7 @@ /obj/item/pet_carrier/update_icon_state() if(open) - icon_state = initial(icon_state) + icon_state = "[base_icon_state]_open" return ..() icon_state = "[base_icon_state]_[!occupants.len ? "closed" : "occupied"]_[locked ? "locked" : "unlocked"]" return ..() @@ -160,6 +177,16 @@ for(var/V in occupants) remove_occupant(V, over_atom) +/obj/item/pet_carrier/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + + if(!locked) + context[SCREENTIP_CONTEXT_LMB] = open ? "Close door" : "Open door" + return TRUE + if(allows_locking) + context[SCREENTIP_CONTEXT_ALT_LMB] = locked ? "Unlock door" : "Lock door" + return TRUE + /obj/item/pet_carrier/proc/load_occupant(mob/living/user, mob/living/target) if(pet_carrier_full(src)) to_chat(user, span_warning("[src] is already carrying too much!")) @@ -205,4 +232,32 @@ greyscale_config_inhand_right = null greyscale_colors = null +/obj/item/pet_carrier/small + name = "small pet carrier" + desc = "A small pet carrier for miniature sized animals." + w_class = WEIGHT_CLASS_NORMAL + base_icon_state = "small_carrier" + icon_state = "small_carrier_open" + inhand_icon_state = "syringe_kit" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + greyscale_config = null + greyscale_config_inhand_left = null + greyscale_config_inhand_right = null + greyscale_colors = null + + max_occupants = 1 + allows_locking = FALSE + +/obj/item/pet_carrier/small/mouse + name = "small mouse carrier" + desc = "A small pet carrier for miniature sized animals. This looks prepared for a mouse." + open = FALSE + icon_state = "small_carrier_occupied_unlocked" + +/obj/item/pet_carrier/small/mouse/Initialize(mapload) + var/mob/living/basic/mouse/hero_mouse = new /mob/living/basic/mouse(src) + add_occupant(hero_mouse) //mouse hero + return ..() + #undef pet_carrier_full diff --git a/code/game/objects/items/pillow.dm b/code/game/objects/items/pillow.dm index af2096a9c2caa..b491d17d1fe33 100644 --- a/code/game/objects/items/pillow.dm +++ b/code/game/objects/items/pillow.dm @@ -22,6 +22,8 @@ var/hit_sound ///if we have a brick inside us var/bricked = FALSE + drop_sound = SFX_CLOTH_DROP + pickup_sound = SFX_CLOTH_PICKUP /obj/item/pillow/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm index 871a6d2d3b28a..2cffda360cb88 100644 --- a/code/game/objects/items/powerfist.dm +++ b/code/game/objects/items/powerfist.dm @@ -8,7 +8,7 @@ /obj/item/melee/powerfist name = "power-fist" - desc = "A metal gauntlet with a piston-powered ram ontop for that extra 'ompfh' in your punch." + desc = "A metal gauntlet with a piston-powered ram on top for that extra 'oomph' in your punch." icon = 'icons/obj/antags/syndicate_tools.dmi' icon_state = "powerfist" inhand_icon_state = "powerfist" diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm index f5e3cf6da689e..6772d4203f300 100644 --- a/code/game/objects/items/puzzle_pieces.dm +++ b/code/game/objects/items/puzzle_pieces.dm @@ -526,7 +526,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/puzzle/password/pin, 32) /obj/effect/puzzle_poddoor_open name = "puzzle-poddoor relay" - desc = "activates poddoors if activated with a puzzle signal." + desc = "Activates pod doors if activated with a puzzle signal." icon = 'icons/effects/mapping_helpers.dmi' icon_state = "" anchored = TRUE diff --git a/code/game/objects/items/rcd/RHD.dm b/code/game/objects/items/rcd/RHD.dm index 85cdc21947b6d..8bd90adc8a08a 100644 --- a/code/game/objects/items/rcd/RHD.dm +++ b/code/game/objects/items/rcd/RHD.dm @@ -317,7 +317,7 @@ /obj/item/rcd_upgrade/simple_circuits name = "RCD advanced upgrade: simple circuits" - desc = "It contains the design for firelock, air alarm, fire alarm, apc circuits and crap power cells." + desc = "It contains the design for firelock, air alarm, fire alarm, APC circuits and crap power cells." icon_state = "datadisk4" upgrade = RCD_UPGRADE_SIMPLE_CIRCUITS diff --git a/code/game/objects/items/rcd/RTD.dm b/code/game/objects/items/rcd/RTD.dm index ad8c44579a706..e76e4a377cb26 100644 --- a/code/game/objects/items/rcd/RTD.dm +++ b/code/game/objects/items/rcd/RTD.dm @@ -113,7 +113,7 @@ /** * Stores the decal & overlays on the floor to preserve texture of the design - * in short its just an wrapper for mutable appearance where we retrieve the nessassary information + * in short it's just an wrapper for mutable appearance where we retrieve the nessassary information * to recreate an mutable appearance */ /datum/overlay_info diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm index 613853787364f..4e7430d56a5c7 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -219,7 +219,7 @@ /obj/item/banner/command name = "command banner" - desc = "The banner of Command, a staunch and ancient line of bueraucratic kings and queens." + desc = "The banner of Command, a staunch and ancient line of bureaucratic kings and queens." //No icon state here since the default one is the NT banner warcry = "Hail Nanotrasen!" diff --git a/code/game/objects/items/robot/ai_upgrades.dm b/code/game/objects/items/robot/ai_upgrades.dm index b630a3b8a4231..85e3870c87fb7 100644 --- a/code/game/objects/items/robot/ai_upgrades.dm +++ b/code/game/objects/items/robot/ai_upgrades.dm @@ -21,7 +21,7 @@ var/datum/action/gifted_action = new ability gifted_action.Grant(AI) else if(gifted_ability.one_purchase) - to_chat(user, "[AI] already has an [src] installed!") + to_chat(user, "[AI] already has \a [src] installed!") return else action.uses += initial(action.uses) diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm index 5f995f9c84770..53e8d197ed147 100644 --- a/code/game/objects/items/spear.dm +++ b/code/game/objects/items/spear.dm @@ -196,7 +196,7 @@ //GREY TIDE /obj/item/spear/grey_tide name = "\improper Grey Tide" - desc = "Recovered from the aftermath of a revolt aboard Defense Outpost Theta Aegis, in which a seemingly endless tide of Assistants caused heavy casualities among Nanotrasen military forces." + desc = "Recovered from the aftermath of a revolt aboard Defense Outpost Theta Aegis, in which a seemingly endless tide of Assistants caused heavy casualties among Nanotrasen military forces." attack_verb_continuous = list("gores") attack_verb_simple = list("gore") force_unwielded = 15 diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index e5514380bf8a4..e9d25942d2568 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -36,6 +36,10 @@ var/apply_verb = "treating" /// Whether this item can be used on dead bodies var/works_on_dead = FALSE + /// The sound this makes when starting healing with this item + var/heal_begin_sound = null + /// The sound this makes when healed successfully with this item + var/heal_end_sound = null /obj/item/stack/medical/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!isliving(interacting_with)) @@ -270,7 +274,7 @@ if(!brute_to_heal && stop_bleeding) // no brute, no bleeding carbon_patient.balloon_alert(user, "[affecting.plaintext_zone] is not bleeding or bruised!") else if(!burn_to_heal && (flesh_regeneration || sanitization) && any_burn_wound) // no burns, existing burn wounds are treated - carbon_patient.balloon_alert(user, "[affecting.plaintext_zone] has been fully treated!") + carbon_patient.balloon_alert(user, "[affecting.plaintext_zone] is fully treated, give it time!") else if(!affecting.brute_dam && !affecting.burn_dam) // not hurt at all carbon_patient.balloon_alert(user, "[affecting.plaintext_zone] is not hurt!") else // probably hurt in some way but we are not the right item for this @@ -375,6 +379,10 @@ apply_verb = "wrapping" works_on_dead = TRUE var/obj/item/bodypart/gauzed_bodypart + heal_end_sound = SFX_BANDAGE_END + heal_begin_sound = SFX_BANDAGE_BEGIN + drop_sound = SFX_CLOTH_DROP + pickup_sound = SFX_CLOTH_PICKUP /obj/item/stack/medical/gauze/Destroy(force) . = ..() @@ -444,6 +452,7 @@ span_warning("You begin wrapping the wounds on [user == patient ? "your" : "[patient]'s"] [limb.plaintext_zone] with [src]..."), visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, ) + playsound(src, heal_begin_sound, 30, TRUE, MEDIUM_RANGE_SOUND_EXTRARANGE) if(!do_after(user, treatment_delay, target = patient)) return @@ -455,6 +464,8 @@ span_green("You bandage the wounds on [user == patient ? "your" : "[patient]'s"] [limb.plaintext_zone]."), visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, ) + if(heal_end_sound) + playsound(patient, heal_end_sound, 30, TRUE, MEDIUM_RANGE_SOUND_EXTRARANGE) limb.apply_gauze(src) /obj/item/stack/medical/gauze/twelve @@ -574,6 +585,8 @@ repeating = TRUE sanitization = 0.75 flesh_regeneration = 3 + pickup_sound = SFX_CLOTH_PICKUP + drop_sound = SFX_CLOTH_DROP var/is_open = TRUE ///This var determines if the sterile packaging of the mesh has been opened. grind_results = list(/datum/reagent/medicine/spaceacillin = 2) @@ -754,6 +767,8 @@ other_delay = 1 SECONDS grind_results = list(/datum/reagent/medicine/c2/libital = 2) apply_verb = "applying to" + pickup_sound = SFX_CLOTH_PICKUP + // add a better drop sound more fitting for a lil' itty bitty band-aid /obj/item/stack/medical/bandage/makeshift name = "makeshift bandage" diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 9ee9db571884c..6523a52308c36 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -131,7 +131,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ /obj/item/stack/rods/lava name = "heat resistant rod" - desc = "Treated, specialized iron rods. When exposed to the vaccum of space their coating breaks off, but they can hold up against the extreme heat of active lava." + desc = "Treated, specialized iron rods. When exposed to the vacuum of space their coating breaks off, but they can hold up against the extreme heat of active lava." singular_name = "heat resistant rod" icon_state = "rods" inhand_icon_state = "rods" diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 7cb720daee353..6d1bbe7bc647f 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -62,7 +62,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ return CC.use(5) use(1) - to_chat(user, span_notice("You attach wire to the [name].")) + to_chat(user, span_notice("You attach wire to \the [src].")) var/obj/item/stack/light_w/new_tile = new(user.loc) if (!QDELETED(new_tile)) new_tile.add_fingerprint(user) diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 3956051d89bc7..e10fdf1a65981 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -146,7 +146,7 @@ GLOBAL_LIST_INIT(xeno_recipes, list ( \ /obj/item/stack/sheet/animalhide/carp name = "carp scales" - desc = "The scaly skin of a space carp. It looks quite beatiful when detached from the foul creature who once wore it." + desc = "The scaly skin of a space carp. It looks quite beautiful when detached from the foul creature who once wore it." singular_name = "carp scale" icon_state = "sheet-carp" inhand_icon_state = null @@ -158,6 +158,7 @@ GLOBAL_LIST_INIT(carp_recipes, list ( \ new/datum/stack_recipe("carpskin chair", /obj/structure/chair/comfy/carp, 2, crafting_flags = NONE, category = CAT_FURNITURE), \ new/datum/stack_recipe("carpskin suit", /obj/item/clothing/under/suit/carpskin, 3, crafting_flags = NONE, category = CAT_CLOTHING), \ new/datum/stack_recipe("carpskin fedora", /obj/item/clothing/head/fedora/carpskin, 2, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("carpskin fishing bag", /obj/item/storage/bag/fishing/carpskin, 3, crafting_flags = NONE, category = CAT_CONTAINERS), \ )) /obj/item/stack/sheet/animalhide/carp/get_main_recipes() diff --git a/code/game/objects/items/stacks/sheets/light.dm b/code/game/objects/items/stacks/sheets/light.dm index c9153c828444d..9023c8270b5aa 100644 --- a/code/game/objects/items/stacks/sheets/light.dm +++ b/code/game/objects/items/stacks/sheets/light.dm @@ -16,7 +16,7 @@ /obj/item/stack/light_w/examine(mob/user) . = ..() - . += span_warning("The [name] looks unfinished, add iron to complete it.") + . += span_warning("\The [src] looks unfinished, add iron to complete it.") /obj/item/stack/light_w/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/stack/sheet/iron)) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 3ccb06c3c018e..3b1b0bde6bb73 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -113,6 +113,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ )), \ null, \ new/datum/stack_recipe("firelock frame", /obj/structure/firelock_frame, 3, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ + new/datum/stack_recipe("directional firelock frame", /obj/structure/firelock_frame/border_only, 2, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_CHECK_DIRECTION, category = CAT_DOORS), \ new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 2.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), \ new/datum/stack_recipe("meatspike frame", /obj/structure/kitchenspike_frame, 5, time = 2.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), \ new/datum/stack_recipe("reflector frame", /obj/structure/reflector, 5, time = 2.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), \ @@ -516,9 +517,11 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ force = 0 throwforce = 0 merge_type = /obj/item/stack/sheet/cloth - drop_sound = 'sound/items/handling/cloth_drop.ogg' - pickup_sound = 'sound/items/handling/cloth_pickup.ogg' + drop_sound = 'sound/items/handling/cloth/cloth_drop1.ogg' + pickup_sound = 'sound/items/handling/cloth/cloth_pickup1.ogg' grind_results = list(/datum/reagent/cellulose = 20) + pickup_sound = SFX_CLOTH_PICKUP + drop_sound = SFX_CLOTH_DROP /obj/item/stack/sheet/cloth/get_main_recipes() . = ..() @@ -547,8 +550,8 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \ force = 0 throwforce = 0 merge_type = /obj/item/stack/sheet/durathread - drop_sound = 'sound/items/handling/cloth_drop.ogg' - pickup_sound = 'sound/items/handling/cloth_pickup.ogg' + drop_sound = 'sound/items/handling/cloth/cloth_drop1.ogg' + pickup_sound = 'sound/items/handling/cloth/cloth_pickup1.ogg' /obj/item/stack/sheet/durathread/Initialize(mapload) . = ..() @@ -578,8 +581,8 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \ grind_results = list(/datum/reagent/cellulose = 20) var/loom_result = /obj/item/stack/sheet/cloth var/loom_time = 1 SECONDS - drop_sound = 'sound/items/handling/cloth_drop.ogg' - pickup_sound = 'sound/items/handling/cloth_pickup.ogg' + drop_sound = 'sound/items/handling/cloth/cloth_drop1.ogg' + pickup_sound = 'sound/items/handling/cloth/cloth_pickup1.ogg' /obj/item/stack/sheet/cotton/Initialize(mapload) . = ..() @@ -664,7 +667,7 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ new /datum/stack_recipe("light tubes box", /obj/item/storage/box/lights/tubes, crafting_flags = NONE, category = CAT_CONTAINERS), \ new /datum/stack_recipe("light bulbs box", /obj/item/storage/box/lights/bulbs, crafting_flags = NONE, category = CAT_CONTAINERS), \ new /datum/stack_recipe("mixed lights box", /obj/item/storage/box/lights/mixed, crafting_flags = NONE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("mouse traps box", /obj/item/storage/box/mousetraps, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("mousetraps box", /obj/item/storage/box/mousetraps, crafting_flags = NONE, category = CAT_CONTAINERS), \ new /datum/stack_recipe("candle box", /obj/item/storage/fancy/candle_box, crafting_flags = NONE, category = CAT_CONTAINERS), \ new /datum/stack_recipe("bandage box", /obj/item/storage/box/bandages, crafting_flags = NONE, category = CAT_CONTAINERS) )), diff --git a/code/game/objects/items/stacks/tape.dm b/code/game/objects/items/stacks/tape.dm index 33539c570ab93..33d5ba56c2e24 100644 --- a/code/game/objects/items/stacks/tape.dm +++ b/code/game/objects/items/stacks/tape.dm @@ -85,7 +85,7 @@ /obj/item/stack/sticky_tape/super name = "super sticky tape" singular_name = "super sticky tape" - desc = "Quite possibly the most mischevious substance in the galaxy. Use with extreme lack of caution." + desc = "Quite possibly the most mischievous substance in the galaxy. Use with extreme lack of caution." prefix = "super sticky" conferred_embed = /datum/embedding/sticky_tape/super splint_factor = 0.4 diff --git a/code/game/objects/items/stacks/tiles/tile_mineral.dm b/code/game/objects/items/stacks/tiles/tile_mineral.dm index 08b708e966fda..3fc0530a48e2a 100644 --- a/code/game/objects/items/stacks/tiles/tile_mineral.dm +++ b/code/game/objects/items/stacks/tiles/tile_mineral.dm @@ -9,7 +9,7 @@ return if(!mineralType) to_chat(user, span_warning("You can not reform this!")) - stack_trace("A mineral tile of type [type] doesn't have its' mineralType set.") + stack_trace("A mineral tile of type [type] doesn't have its mineralType set.") return if(W.use_tool(src, user, 0, volume=40)) var/sheet_type = text2path("/obj/item/stack/sheet/mineral/[mineralType]") diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 7f81e3e0a2cab..509c73989de57 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -38,7 +38,7 @@ /obj/item/bag_of_holding_inert name = "inert bag of holding" - desc = "What is currently a just an unwieldly block of metal with a slot ready to accept a bluespace anomaly core." + desc = "What is currently a just an unwieldy block of metal with a slot ready to accept a bluespace anomaly core." icon = 'icons/obj/storage/backpack.dmi' worn_icon = 'icons/mob/clothing/back/backpack.dmi' icon_state = "bag_of_holding-inert" diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index 3235a0e7c053b..bb9e57213da43 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -12,7 +12,7 @@ * Plant Bag * Sheet Snatcher * Book Bag - * Biowaste Bag + * Biowaste Bag * * -Sayu */ @@ -320,6 +320,63 @@ desc = "" capacity = 500//Borgs get more because >specialization + +// ----------------------------- +// Sheet Snatcher (Debug) +// ----------------------------- + +/obj/item/storage/bag/sheetsnatcher/debug + name = "sheet snatcher EXTREME EDITION" + desc = "A Nanotrasen storage system designed which has been given post-market alterations to hold any type of sheet. Comes pre-populated with " + color = "#ff3737" // I'm too lazy to make a unique sprite + capacity = 5000 // Hopefully enough to fit anything you need + w_class = WEIGHT_CLASS_TINY + +// Copy-pasted from the former /obj/item/storage/box/material, w/ small additions like rods, cardboard, plastic. +// "Only 20 uranium 'cause of radiation" +/obj/item/storage/bag/sheetsnatcher/debug/PopulateContents() + var/static/items_inside = list( + /obj/item/stack/sheet/iron/fifty=1, + /obj/item/stack/sheet/glass/fifty=1, + /obj/item/stack/sheet/rglass/fifty=1, + /obj/item/stack/sheet/plasmaglass/fifty=1, + /obj/item/stack/sheet/titaniumglass/fifty=1, + /obj/item/stack/sheet/plastitaniumglass/fifty=1, + /obj/item/stack/sheet/plasteel/fifty=1, + /obj/item/stack/sheet/mineral/titanium/fifty=1, + /obj/item/stack/sheet/mineral/gold=50, + /obj/item/stack/sheet/mineral/silver=50, + /obj/item/stack/sheet/mineral/plasma=50, + /obj/item/stack/sheet/mineral/uranium=20, + /obj/item/stack/sheet/mineral/diamond=50, + /obj/item/stack/sheet/bluespace_crystal=50, + /obj/item/stack/sheet/mineral/bananium=50, + /obj/item/stack/sheet/mineral/wood/fifty=1, + /obj/item/stack/sheet/plastic/fifty=1, + /obj/item/stack/sheet/runed_metal/fifty=1, + /obj/item/stack/rods/fifty=1, + /obj/item/stack/sheet/mineral/plastitanium=50, + /obj/item/stack/sheet/mineral/abductor=50, + /obj/item/stack/sheet/cardboard/fifty=1, + ) + //This needs to be done here and not in Initialize() because the stacks get merged and fall out when their weight updates if this is set after PopulateContents() + atom_storage.allow_big_nesting = TRUE + atom_storage.max_slots = 99 + atom_storage.max_specific_storage = WEIGHT_CLASS_GIGANTIC + atom_storage.max_total_storage = capacity + generate_items_inside(items_inside,src) + +/obj/item/storage/bag/sheetsnatcher/debug/Initialize(mapload) + . = ..() + // Overrides so it can hold all possible sheets + atom_storage.set_holdable( + can_hold_list = list( + /obj/item/stack/sheet, + /obj/item/stack/sheet/mineral/sandstone, + /obj/item/stack/sheet/mineral/wood, + ) + ) + // ----------------------------- // Book bag // ----------------------------- diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index f7784b9d3b8a8..642b8afa3279b 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -849,7 +849,7 @@ /obj/item/storage/belt/grass_sabre name = "sabre sheath" - desc = "An simple grass sheath designed to hold a sabre of... some sort. Actual metal one might be too sharp, though..." + desc = "A simple grass sheath designed to hold a sabre of... some sort. An actual metal one might be too sharp, though..." icon_state = "grass_sheath" inhand_icon_state = "grass_sheath" worn_icon_state = "grass_sheath" diff --git a/code/game/objects/items/storage/boxes/engineering_boxes.dm b/code/game/objects/items/storage/boxes/engineering_boxes.dm index b30aaed9f6820..70a64f69da5a3 100644 --- a/code/game/objects/items/storage/boxes/engineering_boxes.dm +++ b/code/game/objects/items/storage/boxes/engineering_boxes.dm @@ -18,43 +18,6 @@ for(var/i in 1 to 7) new/obj/item/grenade/chem_grenade/smart_metal_foam(src) -/obj/item/storage/box/material - name = "box of materials" - illustration = "implant" - -/obj/item/storage/box/material/Initialize(mapload) - . = ..() - atom_storage.max_specific_storage = WEIGHT_CLASS_GIGANTIC //This needs to be set here too because the parent type overrides it again - -/obj/item/storage/box/material/PopulateContents() //less uranium because radioactive - var/static/items_inside = list( - /obj/item/stack/sheet/iron/fifty=1, - /obj/item/stack/sheet/glass/fifty=1, - /obj/item/stack/sheet/rglass=50, - /obj/item/stack/sheet/plasmaglass=50, - /obj/item/stack/sheet/titaniumglass=50, - /obj/item/stack/sheet/plastitaniumglass=50, - /obj/item/stack/sheet/plasteel=50, - /obj/item/stack/sheet/mineral/plastitanium=50, - /obj/item/stack/sheet/mineral/titanium=50, - /obj/item/stack/sheet/mineral/gold=50, - /obj/item/stack/sheet/mineral/silver=50, - /obj/item/stack/sheet/mineral/plasma=50, - /obj/item/stack/sheet/mineral/uranium=20, - /obj/item/stack/sheet/mineral/diamond=50, - /obj/item/stack/sheet/bluespace_crystal=50, - /obj/item/stack/sheet/mineral/bananium=50, - /obj/item/stack/sheet/mineral/wood=50, - /obj/item/stack/sheet/plastic/fifty=1, - /obj/item/stack/sheet/runed_metal/fifty=1, - ) - //This needs to be done here and not in Initialize() because the stacks get merged and fall out when their weight updates if this is set after PopulateContents() - atom_storage.allow_big_nesting = TRUE - atom_storage.max_slots = 99 - atom_storage.max_specific_storage = WEIGHT_CLASS_GIGANTIC - atom_storage.max_total_storage = 99 - generate_items_inside(items_inside,src) - /obj/item/storage/box/debugtools name = "box of debug tools" icon_state = "syndiebox" @@ -79,7 +42,7 @@ /obj/item/stack/spacecash/c1000=50, /obj/item/storage/box/beakers/bluespace=1, /obj/item/storage/box/beakers/variety=1, - /obj/item/storage/box/material=1, + /obj/item/storage/bag/sheetsnatcher/debug=1, /obj/item/uplink/debug=1, /obj/item/uplink/nuclear/debug=1, /obj/item/clothing/ears/earmuffs/debug = 1, diff --git a/code/game/objects/items/storage/boxes/science_boxes.dm b/code/game/objects/items/storage/boxes/science_boxes.dm index 63e1c1ee3762d..27d69a493d101 100644 --- a/code/game/objects/items/storage/boxes/science_boxes.dm +++ b/code/game/objects/items/storage/boxes/science_boxes.dm @@ -10,8 +10,8 @@ new /obj/item/swab(src) /obj/item/storage/box/petridish - name = "box of petridishes" - desc = "This box purports to contain a number of high rim petridishes." + name = "box of petri dishes" + desc = "This box purports to contain a number of high rim petri dishes." illustration = "petridish" /obj/item/storage/box/petridish/PopulateContents() diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index 1c5490301a5c0..e88a0c9ee4857 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -193,7 +193,7 @@ //////////// /obj/item/storage/fancy/cigarettes name = "\improper Space Cigarettes packet" - desc = "The most popular brand of cigarettes, sponsors of the Space Olympics. On the back it advertises to be the only brand that can be smoked in the vaccum of space." + desc = "The most popular brand of cigarettes, sponsors of the Space Olympics. On the back it advertises to be the only brand that can be smoked in the vacuum of space." icon = 'icons/obj/cigarettes.dmi' icon_state = "cig" inhand_icon_state = "cigpacket" @@ -260,8 +260,8 @@ var/obj/item/finger = locate(grabbies) in contents if(finger) if(!equip_to_mouth) - atom_storage.remove_single(user, finger, drop_location()) - user.put_in_hands(finger) + if(atom_storage.remove_single(user, finger, drop_location())) + user.put_in_hands(finger) return if(user.equip_to_slot_if_possible(finger, ITEM_SLOT_MASK, qdel_on_fail = FALSE, disable_warning = TRUE)) finger.forceMove(user) diff --git a/code/game/objects/items/storage/medkit.dm b/code/game/objects/items/storage/medkit.dm index 2d8bb5b9d769f..ec1655a6720a5 100644 --- a/code/game/objects/items/storage/medkit.dm +++ b/code/game/objects/items/storage/medkit.dm @@ -179,7 +179,7 @@ damagetype_healed = BURN /obj/item/storage/medkit/fire/get_medbot_skin() - return "ointment" + return "burn" /obj/item/storage/medkit/fire/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] begins rubbing \the [src] against [user.p_them()]self! It looks like [user.p_theyre()] trying to start a fire!")) @@ -230,7 +230,7 @@ damagetype_healed = OXY /obj/item/storage/medkit/o2/get_medbot_skin() - return "o2" + return "oxy" /obj/item/storage/medkit/o2/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] begins hitting [user.p_their()] neck with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")) @@ -281,7 +281,7 @@ damagetype_healed = HEAL_ALL_DAMAGE /obj/item/storage/medkit/advanced/get_medbot_skin() - return "advanced" + return "adv" /obj/item/storage/medkit/advanced/PopulateContents() if(empty) @@ -446,8 +446,7 @@ /// Gets what skin (icon_state) this medkit uses for a medbot /obj/item/storage/medkit/proc/get_medbot_skin() - // The skin var is nullsafe so returning nothing is A-OK - return + return "generic" /* * Pill Bottles @@ -693,7 +692,7 @@ /// A box which takes in coolant and uses it to preserve organs and body parts /obj/item/storage/organbox name = "organ transport box" - desc = "An advanced box with an cooling mechanism that uses cryostylane or other cold reagents to keep the organs or bodyparts inside preserved." + desc = "An advanced box with a cooling mechanism that uses cryostylane or other cold reagents to keep the organs or bodyparts inside preserved." icon = 'icons/obj/storage/case.dmi' icon_state = "organbox" base_icon_state = "organbox" diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index b3fac29554de6..010da30b1240d 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -7,8 +7,8 @@ lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi' obj_flags = CONDUCTS_ELECTRICITY - force = 12 - throwforce = 12 + force = 13 + throwforce = 13 throw_speed = 2 throw_range = 7 demolition_mod = 1.25 @@ -203,8 +203,8 @@ var/power = 0 for (var/obj/item/stack/telecrystal/stored_crystals in get_all_contents()) power += (stored_crystals.amount / 2) - force = 19 + power - throwforce = 22 + power + force = initial(force) + power + throwforce = initial(throwforce) + power /obj/item/storage/toolbox/mechanical/old/clean/attack(mob/target, mob/living/user) calc_damage() @@ -387,20 +387,6 @@ name = "4.6x30mm AP ammo box" ammo_to_spawn = /obj/item/ammo_box/magazine/wt550m9/wtap -/obj/item/storage/toolbox/maint_kit - name = "gun maintenance kit" - desc = "It contains some gun maintenance supplies" - icon_state = "maint_kit" - inhand_icon_state = "ammobox" - has_latches = FALSE - drop_sound = 'sound/items/handling/ammobox_drop.ogg' - pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' - -/obj/item/storage/toolbox/maint_kit/PopulateContents() - new /obj/item/gun_maintenance_supplies(src) - new /obj/item/gun_maintenance_supplies(src) - new /obj/item/gun_maintenance_supplies(src) - //repairbot assembly /obj/item/storage/toolbox/tool_act(mob/living/user, obj/item/tool, list/modifiers) if(!istype(tool, /obj/item/assembly/prox_sensor)) @@ -504,9 +490,15 @@ /obj/item/storage/toolbox/guncase/traitor/click_alt_secondary(mob/user) . = ..() + if(currently_exploding) + user.balloon_alert(user, "already exploding!") + return + var/i_dont_even_think_once_about_blowing_stuff_up = tgui_alert(user, "Would you like to activate the evidence disposal bomb now?", "BYE BYE", list("Yes","No")) - if(i_dont_even_think_once_about_blowing_stuff_up == "No") + + if(i_dont_even_think_once_about_blowing_stuff_up != "Yes" || currently_exploding || QDELETED(user) || QDELETED(src) || user.can_perform_action(src, NEED_DEXTERITY|NEED_HANDS|ALLOW_RESTING)) return + explosion_timer = addtimer(CALLBACK(src, PROC_REF(think_fast_chucklenuts)), 5 SECONDS, (TIMER_UNIQUE|TIMER_OVERRIDE)) to_chat(user, span_warning("You prime [src]'s evidence disposal bomb!")) log_bomber(user, "has activated a", src, "for detonation") diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 1d0dd1fc2581d..315cd19afdd49 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -341,7 +341,7 @@ /obj/item/storage/box/syndie_kit/rebarxbowsyndie name = "Boxed Rebar Crossbow" - desc = "A scoped weapon with low armor penetration, but devestating against flesh. Features instruction manual for making specialty ammo." + desc = "A scoped weapon with low armor penetration, but devastating against flesh. Features instruction manual for making specialty ammo." /obj/item/storage/box/syndie_kit/rebarxbowsyndie/PopulateContents() new /obj/item/book/granter/crafting_recipe/dusting/rebarxbowsyndie_ammo(src) diff --git a/code/game/objects/items/surgery_tray.dm b/code/game/objects/items/surgery_tray.dm index 9485be4c3585e..8dd0c8b0689fe 100644 --- a/code/game/objects/items/surgery_tray.dm +++ b/code/game/objects/items/surgery_tray.dm @@ -139,8 +139,8 @@ balloon_alert(user, "empty!") else var/obj/item/grabbies = pick(contents) - atom_storage.remove_single(user, grabbies, drop_location()) - user.put_in_hands(grabbies) + if(atom_storage.remove_single(user, grabbies, drop_location())) + user.put_in_hands(grabbies) return TRUE /obj/item/surgery_tray/screwdriver_act_secondary(mob/living/user, obj/item/tool) diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index eba0bc82054d2..4d40c8a7f98fb 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -1,7 +1,7 @@ //Hydroponics tank and base code /obj/item/watertank name = "backpack water tank" - desc = "A S.U.N.S.H.I.N.E. brand watertank backpack with nozzle to water plants." + desc = "A S.U.N.S.H.I.N.E. brand water tank backpack with a nozzle to water plants." icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "waterbackpack" inhand_icon_state = "waterbackpack" diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index 56461f0586587..54935e170b609 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -234,7 +234,7 @@ continue //putting them at the edge is dumb if(dangerous_turf.y > world.maxy - PORTAL_DANGEROUS_EDGE_LIMIT || dangerous_turf.y < PORTAL_DANGEROUS_EDGE_LIMIT) continue - if(!check_teleport_valid(src, teleport_location)) + if(!check_teleport_valid(src, dangerous_turf)) continue dangerous_turfs += dangerous_turf diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index f3630424a657f..fa624b6e50f70 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -325,7 +325,7 @@ /obj/item/toy/balloon_animal/ai name = "balloon ai core" - desc = "A somewhat unrealistic balloon effigy of the station's AI core. Actual AI propably wouldn't smile like this." + desc = "A somewhat unrealistic balloon effigy of the station's AI core. Actual AI probably wouldn't smile like this." icon_state = "balloon_ai" /obj/item/toy/balloon_animal/dog @@ -355,7 +355,7 @@ /obj/item/toy/balloon_animal/moth name = "balloon moth" - desc = "A balloon effigy of a common member of moth flotillas. Very few of them ever decide to settle on the clown planet, but those who do have the best 'piece-of-cloth-dissapearing' acts." + desc = "A balloon effigy of a common member of moth flotillas. Very few of them ever decide to settle on the clown planet, but those who do have the best 'piece-of-cloth-disappearing' acts." icon_state = "balloon_moth" /obj/item/toy/balloon_animal/ethereal @@ -542,7 +542,7 @@ /obj/item/toy/ammo/gun name = "capgun ammo" - desc = "Make sure to recyle the box in an autolathe when it gets empty." + desc = "Make sure to recycle the box in an autolathe when it gets empty." icon = 'icons/obj/weapons/guns/ammo.dmi' icon_state = "357OLD-7" w_class = WEIGHT_CLASS_TINY @@ -1484,7 +1484,7 @@ */ /obj/item/toy/eldritch_book name = "Codex Cicatrix" - desc = "A toy book that closely resembles the Codex Cicatrix. Covered in fake polyester human flesh and has a huge goggly eye attached to the cover. The runes are gibberish and cannot be used to summon demons... Hopefully?" + desc = "A toy book that closely resembles the Codex Cicatrix. Covered in fake polyester human flesh and has a huge googly eye attached to the cover. The runes are gibberish and cannot be used to summon demons... Hopefully?" icon = 'icons/obj/antags/eldritch.dmi' base_icon_state = "book" icon_state = "book" @@ -1598,7 +1598,7 @@ GLOBAL_LIST_EMPTY(intento_players) /obj/item/toy/intento name = "\improper Intento" - desc = "Fundamentally useless for all intentsive purposes." + desc = "Fundamentally useless for all intents and purposes." icon = 'icons/obj/toys/intents.dmi' icon_state = "blank" custom_price = PAYCHECK_COMMAND * 1.25 diff --git a/code/game/objects/items/v8_engine.dm b/code/game/objects/items/v8_engine.dm index 20b7dd406a551..f85e93f1532dd 100644 --- a/code/game/objects/items/v8_engine.dm +++ b/code/game/objects/items/v8_engine.dm @@ -5,7 +5,7 @@ /obj/item/v8_engine name = "ancient engine" - desc = "An extremely well perserved, massive V8 engine from the early 2000s. It seems to be missing the rest of the vehicle. There's a tiny label on the side." + desc = "An extremely well-preserved, massive V8 engine from the early 2000s. It seems to be missing the rest of the vehicle. There's a tiny label on the side." icon = 'icons/obj/weapons/sword.dmi' icon_state = "v8_engine" w_class = WEIGHT_CLASS_HUGE diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 86fe351239c85..d849f7a1cb96a 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -1359,7 +1359,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 animate(src, duration*0.5, color = slash_color, transform = scaled_transform, alpha = 255) /obj/item/highfrequencyblade/wizard - desc = "A blade that was mastercrafted by a legendary blacksmith. Its' enchantments let it slash through anything." + desc = "A blade that was mastercrafted by a legendary blacksmith. Its enchantments let it slash through anything." force = 8 throwforce = 20 wound_bonus = 20 diff --git a/code/game/objects/items/wiki_manuals.dm b/code/game/objects/items/wiki_manuals.dm index d64c565f04adf..671f408557c61 100644 --- a/code/game/objects/items/wiki_manuals.dm +++ b/code/game/objects/items/wiki_manuals.dm @@ -1,5 +1,31 @@ // Wiki books that are linked to the configured wiki link. +/// The size of the window that the wiki books open in. +#define BOOK_WINDOW_BROWSE_SIZE "970x710" +/// This macro will resolve to code that will open up the associated wiki page in the window. +#define WIKI_PAGE_IFRAME(wikiurl, link_identifier) {" + + + + + + + +

You start skimming through the manual...

+ + + + "} + // A book that links to the wiki /obj/item/book/manual/wiki starting_content = "Nanotrasen presently does not have any resources on this topic. If you would like to know more, contact your local Central Command representative." // safety @@ -12,9 +38,12 @@ user.balloon_alert(user, "this book is empty!") return credit_book_to_reader(user) - if(tgui_alert(user, "This book's page will open in your browser. Are you sure?", "Open The Wiki", list("Yes", "No")) != "Yes") - return - usr << link("[wiki_url]/[page_link]") + if(user.client.byond_version < 516) //Remove this once 516 is stable + if(tgui_alert(user, "This book's page will open in your browser. Are you sure?", "Open The Wiki", list("Yes", "No")) != "Yes") + return + DIRECT_OUTPUT(user, link("[wiki_url]/[page_link]")) + else + DIRECT_OUTPUT(user, browse(WIKI_PAGE_IFRAME(wiki_url, page_link), "window=manual;size=[BOOK_WINDOW_BROWSE_SIZE]")) // if you change this GUARANTEE that it works. /obj/item/book/manual/wiki/chemistry name = "Chemistry Textbook" @@ -198,3 +227,6 @@ starting_author = "Nanotrasen Edu-tainment Division" starting_title = "Tactical Game Cards - Player's Handbook" page_link = "Tactical_Game_Cards" + +#undef BOOK_WINDOW_BROWSE_SIZE +#undef WIKI_PAGE_IFRAME diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 572e9f4040c5f..9c5067794d7ce 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -92,7 +92,8 @@ return mutable_appearance(icon, "[icon_state]_armrest") /obj/structure/chair/proc/update_armrest() - armrest = color_atom_overlay(armrest) + if (cached_color_filter) + armrest = filter_appearance_recursive(armrest, cached_color_filter) update_appearance() /obj/structure/chair/update_overlays() @@ -112,10 +113,10 @@ AddComponent(/datum/component/electrified_buckle, (SHOCK_REQUIREMENT_ITEM | SHOCK_REQUIREMENT_LIVE_CABLE | SHOCK_REQUIREMENT_SIGNAL_RECEIVED_TOGGLE), input_shock_kit, overlays_from_child_procs, FALSE) if(HAS_TRAIT(src, TRAIT_ELECTRIFIED_BUCKLE)) - to_chat(user, span_notice("You connect the shock kit to the [name], electrifying it ")) + to_chat(user, span_notice("You connect the shock kit to \the [src], electrifying it ")) else user.put_in_active_hand(input_shock_kit) - to_chat(user, span_notice("You cannot fit the shock kit onto the [name]!")) + to_chat(user, span_notice("You cannot fit the shock kit onto \the [src]!")) /obj/structure/chair/wrench_act_secondary(mob/living/user, obj/item/weapon) @@ -348,8 +349,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) custom_materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT) item_flags = SKIP_FANTASY_ON_SPAWN - // Whether or not the chair causes the target to become shove stun vulnerable if smashed against someone from behind. - var/inflicts_stun_vulnerability = TRUE + // Duration of daze inflicted when the chair is smashed against someone from behind. + var/daze_amount = 3 SECONDS // What structure type does this chair become when placed? var/obj/structure/chair/origin_type = /obj/structure/chair @@ -398,7 +399,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) if(!stack_type) return var/remaining_mats = initial(origin_type.buildstackamount) - remaining_mats-- //Part of the chair was rendered completely unusable. It magically dissapears. Maybe make some dirt? + remaining_mats-- //Part of the chair was rendered completely unusable. It magically disappears. Maybe make some dirt? if(remaining_mats) for(var/M=1 to remaining_mats) new stack_type(get_turf(loc)) @@ -432,11 +433,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) user.visible_message(span_danger("[user] smashes [src] to pieces against [give_this_fucker_the_chair]")) if(!HAS_TRAIT(give_this_fucker_the_chair, TRAIT_BRAWLING_KNOCKDOWN_BLOCKED)) if(vulnerable_hit || give_this_fucker_the_chair.get_timed_status_effect_duration(/datum/status_effect/staggered)) - give_this_fucker_the_chair.Knockdown(2 SECONDS) + give_this_fucker_the_chair.Knockdown(2 SECONDS, daze_amount = daze_amount) if(give_this_fucker_the_chair.health < give_this_fucker_the_chair.maxHealth*0.5) give_this_fucker_the_chair.adjust_confusion(10 SECONDS) - if(inflicts_stun_vulnerability) - give_this_fucker_the_chair.apply_status_effect(/datum/status_effect/next_shove_stuns) smash(user) @@ -470,7 +469,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) hitsound = 'sound/items/weapons/genhit1.ogg' origin_type = /obj/structure/chair/stool/bamboo max_integrity = 40 //Submissive and breakable unlike the chad iron stool - inflicts_stun_vulnerability = FALSE //Not hard enough to cause them to become vulnerable to a shove + daze_amount = 0 //Not hard enough to cause them to become dazed /obj/item/chair/stool/narsie_act() return //sturdy enough to ignore a god @@ -484,7 +483,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) hitsound = 'sound/items/weapons/genhit1.ogg' origin_type = /obj/structure/chair/wood custom_materials = null - inflicts_stun_vulnerability = FALSE + daze_amount = 0 /obj/item/chair/wood/narsie_act() return @@ -606,7 +605,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) throw_range = 5 //Lighter Weight --> Flies Farther. custom_materials = list(/datum/material/plastic =SHEET_MATERIAL_AMOUNT) max_integrity = 70 - inflicts_stun_vulnerability = FALSE + daze_amount = 0 origin_type = /obj/structure/chair/plastic /obj/structure/chair/musical diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index a843c3e3e4bff..1d456148e88f5 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -12,8 +12,8 @@ LINEN BINS righthand_file = 'icons/mob/inhands/items/bedsheet_righthand.dmi' icon_state = "sheetwhite" inhand_icon_state = "sheetwhite" - drop_sound = 'sound/items/handling/cloth_drop.ogg' - pickup_sound = 'sound/items/handling/cloth_pickup.ogg' + drop_sound = SFX_CLOTH_DROP + pickup_sound = SFX_CLOTH_PICKUP slot_flags = ITEM_SLOT_NECK layer = BELOW_MOB_LAYER throwforce = 0 diff --git a/code/game/objects/structures/billboard.dm b/code/game/objects/structures/billboard.dm index c6786dd84e4a1..86e36a2154bf4 100644 --- a/code/game/objects/structures/billboard.dm +++ b/code/game/objects/structures/billboard.dm @@ -47,7 +47,7 @@ /obj/structure/billboard/twenty_four_seven name = "\improper 24-Seven billboard" - desc = "A billboard advertising 24-Seven's new range of limited-edition Slushee flavours. 24-Seven: All Day, Everyday." + desc = "A billboard advertising 24-Seven's new range of limited-edition Slushee flavours. 24-Seven: All Day, Every Day." icon_state = "billboard_twenty_four_seven" /obj/structure/billboard/starway diff --git a/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm b/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm index fa49fe0a106d5..96510c6a9f780 100644 --- a/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm +++ b/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm @@ -117,11 +117,11 @@ /obj/structure/mounted_gun/pipe/examine_more(mob/user) . = ..() - . += span_notice("Looking down at the [name], you recall a tale told to you in some distant memory...") + . += span_notice("Looking down at \the [src], you recall a tale told to you in some distant memory...") . += span_info("To commit an act of vengeance is not unlike to enter a blood pact with a devil, ending the life of another, at the cost of your own.") . += span_info("When humanity first spilled the blood of its own kind, with likely nothing more than a rock, the seal was broken. Vengeance was borne unto the world.") - . += span_info("However, vengeance alone is not enough to carry through the grim deed of murder. One must an gain advantage over their adversary.") + . += span_info("However, vengeance alone is not enough to carry through the grim deed of murder. One must gain an advantage over their adversary.") . += span_info("As such, the man who ended another's life with a stone, was in turn smote himself by another wielding a spear. After spears, bows. Swords. Guns. Tanks. Missiles. And on and on Vengeance fed. Growing stronger. Growing Worse.") . += span_info("Vengeance persists to this day. It sometimes may slumber, seemingly content with having gorged itself, but in the end, its ceaseless hunger can be neither numbed nor sated.") 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 fb90cfc82ede7..4ff2d68367703 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -25,7 +25,7 @@ /obj/structure/closet/chefcloset name = "chef's closet" - desc = "It's a storage unit for foodservice garments and mouse traps." + desc = "It's a storage unit for food service garments and mousetraps." icon_door = "chef_wardrobe" /obj/structure/closet/chefcloset/PopulateContents() diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index bb25ba5158bd8..e4ee14a4a2fc7 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -355,7 +355,7 @@ /obj/structure/closet/crate/robust name = "robust industries crate" - desc = "Robust Inustries LLC. crate. Feels oddly nostalgic." + desc = "Robust Industries LLC. crate. Feels oddly nostalgic." icon_state = "robust" base_icon_state = "robust" diff --git a/code/game/objects/structures/crates_lockers/crates/secure.dm b/code/game/objects/structures/crates_lockers/crates/secure.dm index b0b6cfaae0016..e80542c32b134 100644 --- a/code/game/objects/structures/crates_lockers/crates/secure.dm +++ b/code/game/objects/structures/crates_lockers/crates/secure.dm @@ -195,14 +195,14 @@ /obj/structure/closet/crate/secure/freezer/interdyne name = "\improper Interdyne freezer" - desc = "This is an Interdyne Pharmauceutics branded freezer. May or may not contain fresh organs." + desc = "This is an Interdyne Pharmaceuticals branded freezer. May or may not contain fresh organs." icon_state = "interdynefreezer" base_icon_state = "interdynefreezer" req_access = list(ACCESS_SYNDICATE) /obj/structure/closet/crate/secure/freezer/interdyne/blood name = "\improper Interdyne blood freezer" - desc = "This is an Interdyne Pharmauceutics branded freezer. It's made to contain fresh, high-quality blood." + desc = "This is an Interdyne Pharmaceuticals branded freezer. It's made to contain fresh, high-quality blood." /obj/structure/closet/crate/secure/freezer/interdyne/blood/PopulateContents() . = ..() @@ -272,13 +272,13 @@ base_icon_state = "cyber_duskcrate" /obj/structure/closet/crate/secure/syndicate/cybersun/night - desc = "A secure crate from Cybersun Industries. This one blatantly adorns syndicate colours. You can only guess it contains equipement for syndicate operatives." + desc = "A secure crate from Cybersun Industries. This one blatantly adorns syndicate colours. You can only guess it contains equipment for syndicate operatives." icon_state = "cyber_nightcrate" base_icon_state = "cyber_nightcrate" /obj/structure/closet/crate/secure/syndicate/wafflecorp name = "\improper Waffle corp. crate" - desc = "A very outdated model and design of shipment crate with a modern lock strapped on it, how befitting of its brand owner, Waffle Corporation. Golden lettering written in cursive by the logo reads 'bringing you consecutively top five world-wide rated* breakfast since 2055. A much smaller fineprint, also in cursive, clarifies: '*in years 2099-2126'... It's year 2563 now, however." + desc = "A very outdated model and design of shipment crate with a modern lock strapped on it, how befitting of its brand owner, Waffle Corporation. Golden lettering written in cursive by the logo reads 'bringing you consecutively top five world-wide rated* breakfast since 2055. A much smaller fine print, also in cursive, clarifies: '*in years 2099-2126'... It's year 2563 now, however." icon_state = "wafflecrate" base_icon_state = "wafflecrate" diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index e78b71f14e963..5fbb1e44f747c 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -2,7 +2,7 @@ name = "extinguisher cabinet" desc = "A small wall mounted cabinet designed to hold a fire extinguisher." icon = 'icons/obj/wallmounts.dmi' - icon_state = "extinguisher_closed" + icon_state = "extinguisher" anchored = TRUE density = FALSE max_integrity = 200 @@ -153,11 +153,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) else if(istype(stored_extinguisher, /obj/item/extinguisher)) icon_state += "_default" - if(!opened) - icon_state += "_closed" - return ..() +/obj/structure/extinguisher_cabinet/update_overlays() + . = ..() + . += mutable_appearance(icon, opened ? "door_open" : "door") + /obj/structure/extinguisher_cabinet/atom_break(damage_flag) . = ..() if(!broken) @@ -182,6 +183,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) name = "extinguisher cabinet frame" desc = "Used for building wall-mounted extinguisher cabinets." icon = 'icons/obj/wallmounts.dmi' - icon_state = "extinguisher_assembly" + icon_state = "extinguisher" //Reuses wallmount icon, but no door overlay result_path = /obj/structure/extinguisher_cabinet pixel_shift = 29 diff --git a/code/game/objects/structures/fans.dm b/code/game/objects/structures/fans.dm index 9470b6018dce7..4fba1bc21cb57 100644 --- a/code/game/objects/structures/fans.dm +++ b/code/game/objects/structures/fans.dm @@ -45,7 +45,7 @@ /obj/structure/fans/tiny/shield name = "shuttle bay shield" - desc = "An tenuously thin energy shield only capable of holding in air, but not solid objects or people." + desc = "A tenuously thin energy shield only capable of holding in air, but not solid objects or people." icon = 'icons/effects/effects.dmi' icon_state = "shield-old" // We should probably get these their own icon at some point light_color = LIGHT_COLOR_BLUE diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index c5a94edfdfdae..ddfa9884be7a3 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -372,7 +372,7 @@ if(dramatically_disappearing) return - //dissapear in 1 second + //disappear in 1 second dramatically_disappearing = TRUE addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/movable, moveToNullspace)), time_to_go) //woosh diff --git a/code/game/objects/structures/gym/weight_machine.dm b/code/game/objects/structures/gym/weight_machine.dm index a329f70750de4..a0a1162057b34 100644 --- a/code/game/objects/structures/gym/weight_machine.dm +++ b/code/game/objects/structures/gym/weight_machine.dm @@ -112,7 +112,7 @@ var/clumsy_chance = 30 - (user.mind.get_skill_level(/datum/skill/athletics) * 5) if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(clumsy_chance)) playsound(src, 'sound/effects/bang.ogg', 50, TRUE) - to_chat(user, span_warning("Your hand slips, causing the [name] to smash you!")) + to_chat(user, span_warning("Your hand slips, causing \the [src] to smash you!")) user.take_bodypart_damage(rand(2, 5)) end_workout() return diff --git a/code/game/objects/structures/lavaland/geyser.dm b/code/game/objects/structures/lavaland/geyser.dm index fa0fd02e21cec..b1ff36d209b22 100644 --- a/code/game/objects/structures/lavaland/geyser.dm +++ b/code/game/objects/structures/lavaland/geyser.dm @@ -11,7 +11,7 @@ ///set to null to get it greyscaled from "[icon_state]_soup". Not very usable with the whole random thing, but more types can be added if you change the spawn prob var/erupting_state = null ///what chem do we produce? - var/reagent_id = /datum/reagent/fuel/oil + var/datum/reagent/reagent_id = /datum/reagent/fuel/oil ///how much reagents we add every process (2 seconds) var/potency = 2 ///maximum volume @@ -34,7 +34,7 @@ create_reagents(max_volume, DRAINABLE) reagents.add_reagent(reagent_id, max_volume) - RegisterSignals(reagents, list(COMSIG_REAGENTS_REM_REAGENT, COMSIG_REAGENTS_DEL_REAGENT), PROC_REF(start_chemming)) + RegisterSignal(reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(start_chemming)) if(erupting_state) icon_state = erupting_state @@ -43,20 +43,24 @@ I.color = mix_color_from_reagents(reagents.reagent_list) add_overlay(I) -///start making those CHHHHHEEEEEEMS. Called whenever chems are removed, it's fine because START_PROCESSING checks if we arent already processing +///start making those CHHHHHEEEEEEMS. Called whenever chems are removed /obj/structure/geyser/proc/start_chemming() - START_PROCESSING(SSplumbing, src) //Its main function is to be plumbed, so use SSplumbing + SIGNAL_HANDLER + + UnregisterSignal(reagents, COMSIG_REAGENTS_HOLDER_UPDATED) -///We're full so stop processing -/obj/structure/geyser/proc/stop_chemming() - STOP_PROCESSING(SSplumbing, src) + START_PROCESSING(SSplumbing, src) //Its main function is to be plumbed, so use SSplumbing ///Add reagents until we are full /obj/structure/geyser/process() + //create more if(reagents.total_volume <= reagents.maximum_volume) reagents.add_reagent(reagent_id, potency) - else - stop_chemming() //we're full + return + + //we're full + RegisterSignal(reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(start_chemming)) + return PROCESS_KILL /obj/structure/geyser/attackby(obj/item/item, mob/user, params) if(!istype(item, /obj/item/mining_scanner) && !istype(item, /obj/item/t_scanner/adv_mining_scanner)) @@ -109,9 +113,10 @@ /obj/structure/geyser/random/Initialize(mapload) reagent_id = get_random_reagent_id() - var/datum/reagent/Random_Reagent = reagent_id - true_name = "[initial(Random_Reagent.name)] geyser" - discovery_message = "It's a [initial(Random_Reagent.name)] geyser! How does any of this even work?" //it doesnt + + true_name = "[initial(reagent_id.name)] geyser" + + discovery_message = "It's a [true_name]! How does any of this even work?" //it doesnt return ..() diff --git a/code/game/objects/structures/plaques/_plaques.dm b/code/game/objects/structures/plaques/_plaques.dm index 951a538e7241a..990c332877da9 100644 --- a/code/game/objects/structures/plaques/_plaques.dm +++ b/code/game/objects/structures/plaques/_plaques.dm @@ -2,7 +2,7 @@ icon = 'icons/obj/signs.dmi' icon_state = "blankplaque" name = "blank plaque" - desc = "A blank plaque, use a fancy pen to engrave it. It can be detatched from the wall with a wrench." + desc = "A blank plaque, use a fancy pen to engrave it. It can be detached from the wall with a wrench." anchored = TRUE opacity = FALSE density = FALSE diff --git a/code/game/objects/structures/shower.dm b/code/game/objects/structures/shower.dm index d3852bb856900..6266ed1cf0ab5 100644 --- a/code/game/objects/structures/shower.dm +++ b/code/game/objects/structures/shower.dm @@ -237,7 +237,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/shower, (-16)) SIGNAL_HANDLER if(actually_on && reagents.total_volume) - wash_atom(enterer) + expose_to_reagents(enterer) /obj/machinery/shower/proc/on_exited(datum/source, atom/movable/exiter) SIGNAL_HANDLER @@ -251,34 +251,13 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/shower, (-16)) var/mob/living/take_his_status_effect = exiter take_his_status_effect.remove_status_effect(/datum/status_effect/washing_regen) -/obj/machinery/shower/proc/wash_atom(atom/target) +/obj/machinery/shower/proc/expose_to_reagents(atom/target) var/purity_volume = reagents.total_volume*0.70 // need 70% of total reagents var/datum/reagent/blood/bloody_shower = reagents.has_reagent(/datum/reagent/blood, amount=purity_volume) var/datum/reagent/water/clean_shower = reagents.has_reagent(/datum/reagent/water, amount=purity_volume) - - // radiation my beloved - var/rad_purity_volume = reagents.total_volume*0.20 // need 20% of total reagents - var/radium_volume = reagents.get_reagent_amount(/datum/reagent/uranium/radium) - var/uranium_volume = reagents.get_reagent_amount(/datum/reagent/uranium) - var/polonium_volume = reagents.get_reagent_amount(/datum/reagent/toxin/polonium) * 3 // highly radioactive - var/total_radiation_volume = (radium_volume + uranium_volume + polonium_volume) - var/radioactive_shower = total_radiation_volume >= rad_purity_volume - // we only care about blood and h20 for mood/status effect var/datum/reagent/shower_reagent = bloody_shower || clean_shower || null - var/wash_flags = NONE - if(clean_shower) - wash_flags |= CLEAN_WASH - if(!radioactive_shower) - // note it is possible to have a clean_shower that is radioactive (+70% water mixed with +20% radiation) - wash_flags |= CLEAN_RAD - - if (isturf(target)) - target.wash(wash_flags, TRUE) - else - target.wash(wash_flags) - reagents.expose(target, (TOUCH), SHOWER_EXPOSURE_MULTIPLIER * SHOWER_SPRAY_VOLUME / max(reagents.total_volume, SHOWER_SPRAY_VOLUME)) if(!isliving(target)) return @@ -346,9 +325,30 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/shower, (-16)) // FOREVER mode stays processing so it can cycle back on. return mode == SHOWER_MODE_FOREVER ? 0 : PROCESS_KILL + // Assemble cleaning flags + var/purity_volume = reagents.total_volume*0.70 // need 70% of total reagents + var/datum/reagent/water/clean_shower = reagents.has_reagent(/datum/reagent/water, amount=purity_volume) + + // radiation my beloved + var/rad_purity_volume = reagents.total_volume*0.20 // need 20% of total reagents + var/radium_volume = reagents.get_reagent_amount(/datum/reagent/uranium/radium) + var/uranium_volume = reagents.get_reagent_amount(/datum/reagent/uranium) + var/polonium_volume = reagents.get_reagent_amount(/datum/reagent/toxin/polonium) * 3 // highly radioactive + var/total_radiation_volume = (radium_volume + uranium_volume + polonium_volume) + var/radioactive_shower = total_radiation_volume >= rad_purity_volume + + var/wash_flags = NONE + if(clean_shower) + wash_flags |= CLEAN_WASH + if(!radioactive_shower) + // note it is possible to have a clean_shower that is radioactive (+70% water mixed with +20% radiation) + wash_flags |= CLEAN_RAD // Wash up. - wash_atom(loc) + loc.wash(wash_flags, TRUE) + expose_to_reagents(loc) + for(var/atom/movable/movable_content as anything in loc) + expose_to_reagents(movable_content) // Wash the items on the turf (=expose them to the shower reagent) reagents.remove_all(SHOWER_SPRAY_VOLUME) /obj/machinery/shower/on_deconstruction(disassembled = TRUE) diff --git a/code/game/objects/structures/signs/signs_flags.dm b/code/game/objects/structures/signs/signs_flags.dm index 64a9d7225bbac..c7f308aebafcc 100644 --- a/code/game/objects/structures/signs/signs_flags.dm +++ b/code/game/objects/structures/signs/signs_flags.dm @@ -34,7 +34,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/tizira, 32) /obj/structure/sign/flag/mothic name = "flag of the Grand Nomad Fleet" - desc = "The flag of the Mothic Grand Nomad Fleet. A classic naval ensign, its use has superceded the old national flag which can be seen in its canton." + desc = "The flag of the Mothic Grand Nomad Fleet. A classic naval ensign, its use has superseded the old national flag which can be seen in its canton." icon_state = "flag_mothic" MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/mothic, 32) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 22517603ef3fc..50c9d427c94a9 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -345,8 +345,7 @@ SIGNAL_HANDLER if((shove_flags & SHOVE_KNOCKDOWN_BLOCKED) || !(shove_flags & SHOVE_BLOCKED)) return - target.Knockdown(SHOVE_KNOCKDOWN_TABLE) - target.apply_status_effect(/datum/status_effect/next_shove_stuns) + target.Knockdown(SHOVE_KNOCKDOWN_TABLE, daze_amount = 3 SECONDS) target.visible_message(span_danger("[shover.name] shoves [target.name] onto \the [src]!"), span_userdanger("You're shoved onto \the [src] by [shover.name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, shover) to_chat(shover, span_danger("You shove [target.name] onto \the [src]!")) diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm index 5518375de6801..2975d08f1f2ff 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube.dm @@ -38,9 +38,9 @@ for(var/obj/structure/transit_tube_pod/pod in src.loc) to_chat(user, span_warning("Remove the pod first!")) return - user.visible_message(span_notice("[user] starts to detach \the [src]."), span_notice("You start to detach the [name]...")) + user.visible_message(span_notice("[user] starts to detach \the [src]."), span_notice("You start to detach \the [src]...")) if(W.use_tool(src, user, 2 SECONDS, volume=50)) - to_chat(user, span_notice("You detach the [name].")) + to_chat(user, span_notice("You detach \the [src].")) var/obj/structure/c_transit_tube/R = new tube_construction(loc) R.setDir(dir) transfer_fingerprints_to(R) diff --git a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm index e6b0f30225cba..420e39f627d57 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm @@ -42,10 +42,10 @@ ..() if(!can_wrench_in_loc(user)) return - to_chat(user, span_notice("You start attaching the [name]...")) + to_chat(user, span_notice("You start attaching \the [src]...")) add_fingerprint(user) if(I.use_tool(src, user, 2 SECONDS, volume=50, extra_checks=CALLBACK(src, PROC_REF(can_wrench_in_loc), user))) - to_chat(user, span_notice("You attach the [name].")) + to_chat(user, span_notice("You attach \the [src].")) var/obj/structure/transit_tube/R = new build_type(loc, dir) transfer_fingerprints_to(R) qdel(src) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 8c8a39aa59f26..bf80ed8f6d777 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -450,7 +450,7 @@ // slowly drain our total health for the illusion of shattering addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, take_damage), floor(atom_integrity / (time_to_go / time_interval))), time_interval * damage_step) - //dissapear in 1 second + //disappear in 1 second dramatically_disappearing = TRUE addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), loc, break_sound, 70, TRUE), time_to_go) //SHATTER SOUND addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/movable, moveToNullspace)), time_to_go) //woosh diff --git a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm index 52372448616c7..726b72748343f 100644 --- a/code/game/shuttle_engines.dm +++ b/code/game/shuttle_engines.dm @@ -111,12 +111,12 @@ . = ..() switch(engine_state) if(ENGINE_UNWRENCHED) - to_chat(user, span_warning("The [src.name] needs to be wrenched to the floor!")) + to_chat(user, span_warning("\The [src] needs to be wrenched to the floor!")) if(ENGINE_WRENCHED) if(!tool.tool_start_check(user, amount=round(ENGINE_WELDTIME / 5), heat_required = HIGH_TEMPERATURE_REQUIRED)) return TRUE - user.visible_message(span_notice("[user.name] starts to weld the [name] to the floor."), \ + user.visible_message(span_notice("[user.name] starts to weld \the [src] to the floor."), \ span_notice("You start to weld \the [src] to the floor..."), \ span_hear("You hear welding.")) @@ -129,7 +129,7 @@ if(!tool.tool_start_check(user, amount=round(ENGINE_WELDTIME / 5), heat_required = HIGH_TEMPERATURE_REQUIRED)) return TRUE - user.visible_message(span_notice("[user.name] starts to cut the [name] free from the floor."), \ + user.visible_message(span_notice("[user.name] starts to cut \the [src] free from the floor."), \ span_notice("You start to cut \the [src] free from the floor..."), \ span_hear("You hear welding.")) diff --git a/code/game/sound.dm b/code/game/sound.dm index b7a0700679d5f..69b3eb060a47c 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -789,4 +789,44 @@ 'sound/machines/buckle/unbuckle2.ogg', 'sound/machines/buckle/unbuckle3.ogg', ) + if(SFX_HEADSET_EQUIP) + soundin = pick( + 'sound/items/equip/headset_equip1.ogg', + 'sound/items/equip/headset_equip2.ogg', + ) + if(SFX_HEADSET_PICKUP) + soundin = pick( + 'sound/items/handling/headset/headset_pickup1.ogg', + 'sound/items/handling/headset/headset_pickup2.ogg', + 'sound/items/handling/headset/headset_pickup3.ogg', + ) + if(SFX_BANDAGE_BEGIN) + soundin = pick( + 'sound/items/gauze/bandage_begin1.ogg', + 'sound/items/gauze/bandage_begin2.ogg', + 'sound/items/gauze/bandage_begin3.ogg', + 'sound/items/gauze/bandage_begin4.ogg', + ) + if(SFX_BANDAGE_END) + soundin = pick( + 'sound/items/gauze/bandage_end1.ogg', + 'sound/items/gauze/bandage_end2.ogg', + 'sound/items/gauze/bandage_end3.ogg', + 'sound/items/gauze/bandage_end4.ogg', + ) + // Old cloth sounds are named cloth_...1.ogg, I wanted to keep them so these new ones go further down the line. + if(SFX_CLOTH_DROP) + soundin = pick( + 'sound/items/handling/cloth/cloth_drop2.ogg', + 'sound/items/handling/cloth/cloth_drop3.ogg', + 'sound/items/handling/cloth/cloth_drop4.ogg', + 'sound/items/handling/cloth/cloth_drop5.ogg', + ) + if(SFX_CLOTH_PICKUP) + soundin = pick( + 'sound/items/handling/cloth/cloth_pickup2.ogg', + 'sound/items/handling/cloth/cloth_pickup3.ogg', + 'sound/items/handling/cloth/cloth_pickup4.ogg', + 'sound/items/handling/cloth/cloth_pickup5.ogg', + ) return soundin diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm index 347e9af8f0d24..f2c076c3228a4 100644 --- a/code/game/turfs/closed/wall/mineral_walls.dm +++ b/code/game/turfs/closed/wall/mineral_walls.dm @@ -301,7 +301,7 @@ /turf/closed/wall/mineral/titanium/survival name = "pod wall" - desc = "An easily-compressable wall used for temporary shelter." + desc = "An easily-compressible wall used for temporary shelter." icon = 'icons/turf/walls/survival_pod_walls.dmi' icon_state = "survival_pod_walls-0" base_icon_state = "survival_pod_walls" diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 27aa1d36920b3..8f99f494eebb0 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -340,7 +340,7 @@ wash(CLEAN_WASH, TRUE) return TRUE -/turf/open/handle_slip(mob/living/slipper, knockdown_amount, obj/slippable, lube, paralyze_amount, force_drop) +/turf/open/handle_slip(mob/living/slipper, knockdown_amount, obj/slippable, lube, paralyze_amount, daze_amount, force_drop) if(slipper.movement_type & MOVETYPES_NOT_TOUCHING_GROUND) return FALSE if(!has_gravity(src)) @@ -373,7 +373,7 @@ if(!(lube & SLIDE_ICE)) // Ice slides are intended to be combo'd so don't give the feedback - to_chat(slipper, span_notice("You slipped[ slippable ? " on the [slippable.name]" : ""]!")) + to_chat(slipper, span_notice("You slipped[ slippable ? " on \the [slippable]" : ""]!")) playsound(slipper.loc, 'sound/misc/slip.ogg', 50, TRUE, -3) SEND_SIGNAL(slipper, COMSIG_ON_CARBON_SLIP) @@ -393,8 +393,8 @@ slipper.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH, 10 SECONDS) slipper.stop_pulling() else - slipper.Knockdown(knockdown_amount) slipper.Paralyze(paralyze_amount) + slipper.Knockdown(knockdown_amount, daze_amount = daze_amount) if(!isnull(buckled_obj) && !ismob(buckled_obj)) buckled_obj.unbuckle_mob(slipper) diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm index 370d65b92865e..3c0add8b18392 100644 --- a/code/game/turfs/open/floor/fancy_floor.dm +++ b/code/game/turfs/open/floor/fancy_floor.dm @@ -472,7 +472,7 @@ /turf/open/floor/carpet/neon name = "neon carpet" - desc = "A rubbery pad inset with a phsophorescent pattern." + desc = "A rubbery pad inset with a phosphorescent pattern." icon = 'icons/turf/floors/carpet_black.dmi' icon_state = "carpet_black-255" base_icon_state = "carpet_black" diff --git a/code/game/turfs/open/floor/iron_floor.dm b/code/game/turfs/open/floor/iron_floor.dm index c3869ccc962ce..16f74866a1c1d 100644 --- a/code/game/turfs/open/floor/iron_floor.dm +++ b/code/game/turfs/open/floor/iron_floor.dm @@ -434,6 +434,16 @@ name = "cold room floor" initial_gas_mix = KITCHEN_COLDROOM_ATMOS +/turf/open/floor/iron/kitchen_coldroom/dark + icon_state = "darkfull" + base_icon_state = "darkfull" + floor_tile = /obj/item/stack/tile/iron/dark + +/turf/open/floor/iron/kitchen_coldroom/dark/textured + icon_state = "textured_dark" + base_icon_state = "textured_dark" + floor_tile = /obj/item/stack/tile/iron/dark/textured + /turf/open/floor/iron/kitchen_coldroom/freezerfloor icon_state = "freezerfloor" base_icon_state = "freezerfloor" diff --git a/code/game/turfs/open/floor/misc_floor.dm b/code/game/turfs/open/floor/misc_floor.dm index 409b572309c8b..04605a06e147a 100644 --- a/code/game/turfs/open/floor/misc_floor.dm +++ b/code/game/turfs/open/floor/misc_floor.dm @@ -349,7 +349,7 @@ /turf/open/floor/iron/tgmcemblem name = "TGMC Emblem" - desc = "The symbol of the Terran Goverment." + desc = "The symbol of the Terran Government." icon_state = "tgmc_emblem" /turf/open/floor/iron/tgmcemblem/center diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index a71ed37f374f9..421e4c61a832b 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -225,7 +225,7 @@ if(istype(C, /obj/item/cigarette)) var/obj/item/cigarette/ciggie = C if(ciggie.lit) - to_chat(user, span_warning("The [ciggie.name] is already lit!")) + to_chat(user, span_warning("\The [ciggie] is already lit!")) return TRUE var/clumsy_modifier = HAS_TRAIT(user, TRAIT_CLUMSY) ? 2 : 1 if(prob(25 * clumsy_modifier) && isliving(user)) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index ab5d93f706435..cb0e0b24cca2b 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -657,7 +657,7 @@ GLOBAL_LIST_EMPTY(station_turfs) return TRUE /turf/proc/add_vomit_floor(mob/living/vomiter, vomit_type = /obj/effect/decal/cleanable/vomit, vomit_flags, purge_ratio = 0.1) - var/obj/effect/decal/cleanable/vomit/throw_up = new vomit_type (src, vomiter.get_static_viruses()) + var/obj/effect/decal/cleanable/vomit/throw_up = new vomit_type (src, vomiter?.get_static_viruses()) // if the vomit combined, apply toxicity and reagents to the old vomit if (QDELETED(throw_up)) diff --git a/code/game/world.dm b/code/game/world.dm index ea6c9cb976ff2..1f705d1328194 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -335,6 +335,9 @@ GLOBAL_PROTECT(tracy_init_reason) return #else if(TgsAvailable()) + if(!fast_track) + TgsTriggerEvent("tg-PreReboot", wait_for_completion = TRUE) + var/do_hard_reboot // check the hard reboot counter var/ruhr = CONFIG_GET(number/rounds_until_hard_restart) @@ -456,8 +459,9 @@ GLOBAL_PROTECT(tracy_init_reason) LISTASSERTLEN(global_area.turfs_by_zlevel, map_load_z_cutoff, list()) for (var/zlevel in 1 to map_load_z_cutoff) var/list/to_add = block( - locate(old_max + 1, 1, zlevel), - locate(maxx, maxy, zlevel)) + old_max + 1, 1, zlevel, + maxx, maxy, zlevel + ) global_area.turfs_by_zlevel[zlevel] += to_add @@ -472,8 +476,9 @@ GLOBAL_PROTECT(tracy_init_reason) LISTASSERTLEN(global_area.turfs_by_zlevel, map_load_z_cutoff, list()) for (var/zlevel in 1 to map_load_z_cutoff) var/list/to_add = block( - locate(1, old_maxy + 1, 1), - locate(maxx, maxy, map_load_z_cutoff)) + 1, old_maxy + 1, 1, + maxx, maxy, map_load_z_cutoff + ) global_area.turfs_by_zlevel[zlevel] += to_add /world/proc/incrementMaxZ() @@ -503,7 +508,9 @@ GLOBAL_PROTECT(tracy_init_reason) /world/proc/on_tickrate_change() SStimer?.reset_buckets() +#ifndef DISABLE_DREAMLUAU DREAMLUAU_SET_EXECUTION_LIMIT_MILLIS(tick_lag * 100) +#endif /world/proc/init_byond_tracy() if(!fexists(TRACY_DLL_PATH)) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 71374bf2464ff..9dbac57315d23 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1699,6 +1699,7 @@ return return usr.client?.mark_datum(datum_to_mark) +#ifndef DISABLE_DREAMLUAU else if(href_list["lua_state"]) if(!check_rights(R_DEBUG)) return @@ -1715,6 +1716,7 @@ editor.force_view_chunk = log_entry["chunk"] editor.force_modal = "viewChunk" editor.ui_interact(usr) +#endif else if(href_list["show_paper"]) if(!check_rights(R_ADMIN)) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index fc054e9a9cb0b..0ca4072ff77ac 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -814,57 +814,57 @@ ADMIN_VERB(check_missing_sprites, R_DEBUG, "Debug Worn Item Sprites", "We're can continue //Is there an explicit worn_icon to pick against the worn_icon_state? Easy street expected behavior. if(sprite.worn_icon) - if(!(sprite.icon_state in icon_states(sprite.worn_icon))) + if(!icon_exists(sprite.worn_icon, sprite.icon_state)) to_chat(user, span_warning("ERROR sprites for [sprite.type]. Slot Flags are [sprite.slot_flags]."), confidential = TRUE) else if(sprite.worn_icon_state) if(sprite.slot_flags & ITEM_SLOT_MASK) actual_file_name = 'icons/mob/clothing/mask.dmi' - if(!(sprite.worn_icon_state in icon_states(actual_file_name))) + if(!icon_exists(actual_file_name, sprite.worn_icon_state)) to_chat(user, span_warning("ERROR sprites for [sprite.type]. Mask slot."), confidential = TRUE) if(sprite.slot_flags & ITEM_SLOT_NECK) actual_file_name = 'icons/mob/clothing/neck.dmi' - if(!(sprite.worn_icon_state in icon_states(actual_file_name))) + if(!icon_exists(actual_file_name, sprite.worn_icon_state)) to_chat(user, span_warning("ERROR sprites for [sprite.type]. Neck slot."), confidential = TRUE) if(sprite.slot_flags & ITEM_SLOT_BACK) actual_file_name = 'icons/mob/clothing/back.dmi' - if(!(sprite.worn_icon_state in icon_states(actual_file_name))) + if(!icon_exists(actual_file_name, sprite.worn_icon_state)) to_chat(user, span_warning("ERROR sprites for [sprite.type]. Back slot."), confidential = TRUE) if(sprite.slot_flags & ITEM_SLOT_HEAD) actual_file_name = 'icons/mob/clothing/head/default.dmi' - if(!(sprite.worn_icon_state in icon_states(actual_file_name))) + if(!icon_exists(actual_file_name, sprite.worn_icon_state)) to_chat(user, span_warning("ERROR sprites for [sprite.type]. Head slot."), confidential = TRUE) if(sprite.slot_flags & ITEM_SLOT_BELT) actual_file_name = 'icons/mob/clothing/belt.dmi' - if(!(sprite.worn_icon_state in icon_states(actual_file_name))) + if(!icon_exists(actual_file_name, sprite.worn_icon_state)) to_chat(user, span_warning("ERROR sprites for [sprite.type]. Belt slot."), confidential = TRUE) if(sprite.slot_flags & ITEM_SLOT_SUITSTORE) actual_file_name = 'icons/mob/clothing/belt_mirror.dmi' - if(!(sprite.worn_icon_state in icon_states(actual_file_name))) + if(!icon_exists(actual_file_name, sprite.worn_icon_state)) to_chat(user, span_warning("ERROR sprites for [sprite.type]. Suit Storage slot."), confidential = TRUE) else if(sprite.icon_state) if(sprite.slot_flags & ITEM_SLOT_MASK) actual_file_name = 'icons/mob/clothing/mask.dmi' - if(!(sprite.icon_state in icon_states(actual_file_name))) + if(!icon_exists(actual_file_name, sprite.icon_state)) to_chat(user, span_warning("ERROR sprites for [sprite.type]. Mask slot."), confidential = TRUE) if(sprite.slot_flags & ITEM_SLOT_NECK) actual_file_name = 'icons/mob/clothing/neck.dmi' - if(!(sprite.icon_state in icon_states(actual_file_name))) + if(!icon_exists(actual_file_name, sprite.icon_state)) to_chat(user, span_warning("ERROR sprites for [sprite.type]. Neck slot."), confidential = TRUE) if(sprite.slot_flags & ITEM_SLOT_BACK) actual_file_name = 'icons/mob/clothing/back.dmi' - if(!(sprite.icon_state in icon_states(actual_file_name))) + if(!icon_exists(actual_file_name, sprite.icon_state)) to_chat(user, span_warning("ERROR sprites for [sprite.type]. Back slot."), confidential = TRUE) if(sprite.slot_flags & ITEM_SLOT_HEAD) actual_file_name = 'icons/mob/clothing/head/default.dmi' - if(!(sprite.icon_state in icon_states(actual_file_name))) + if(!icon_exists(actual_file_name, sprite.icon_state)) to_chat(user, span_warning("ERROR sprites for [sprite.type]. Head slot."), confidential = TRUE) if(sprite.slot_flags & ITEM_SLOT_BELT) actual_file_name = 'icons/mob/clothing/belt.dmi' - if(!(sprite.icon_state in icon_states(actual_file_name))) + if(!icon_exists(actual_file_name, sprite.icon_state)) to_chat(user, span_warning("ERROR sprites for [sprite.type]. Belt slot."), confidential = TRUE) if(sprite.slot_flags & ITEM_SLOT_SUITSTORE) actual_file_name = 'icons/mob/clothing/belt_mirror.dmi' - if(!(sprite.icon_state in icon_states(actual_file_name))) + if(!icon_exists(actual_file_name, sprite.icon_state)) to_chat(user, span_warning("ERROR sprites for [sprite.type]. Suit Storage slot."), confidential = TRUE) #ifndef OPENDREAM diff --git a/code/modules/admin/verbs/lua/_wrappers.dm b/code/modules/admin/verbs/lua/_wrappers.dm index d516f064f847f..5fd78244b5603 100644 --- a/code/modules/admin/verbs/lua/_wrappers.dm +++ b/code/modules/admin/verbs/lua/_wrappers.dm @@ -1,3 +1,4 @@ +#ifndef DISABLE_DREAMLUAU /proc/wrap_lua_get_var(datum/thing, var_name) SHOULD_NOT_SLEEP(TRUE) if(thing == world) @@ -46,3 +47,4 @@ var/result = list("status" = "print", "message" = print_message) INVOKE_ASYNC(target_state, TYPE_PROC_REF(/datum/lua_state, log_result), result, TRUE) log_lua("[target_state]: [print_message]") +#endif diff --git a/code/modules/admin/verbs/lua/helpers.dm b/code/modules/admin/verbs/lua/helpers.dm index c3072f15e74cd..fe844c5c55fa2 100644 --- a/code/modules/admin/verbs/lua/helpers.dm +++ b/code/modules/admin/verbs/lua/helpers.dm @@ -1,3 +1,4 @@ +#ifndef DISABLE_DREAMLUAU #define PROMISE_PENDING 0 #define PROMISE_RESOLVED 1 #define PROMISE_REJECTED 2 @@ -34,3 +35,4 @@ #undef PROMISE_PENDING #undef PROMISE_RESOLVED #undef PROMISE_REJECTED +#endif diff --git a/code/modules/admin/verbs/lua/lua_editor.dm b/code/modules/admin/verbs/lua/lua_editor.dm index 93e8e50c1a6a4..280bd52a57d72 100644 --- a/code/modules/admin/verbs/lua/lua_editor.dm +++ b/code/modules/admin/verbs/lua/lua_editor.dm @@ -1,3 +1,4 @@ +#ifndef DISABLE_DREAMLUAU /datum/lua_editor var/datum/lua_state/current_state @@ -279,7 +280,12 @@ /datum/lua_editor/ui_close(mob/user) . = ..() qdel(src) +#endif ADMIN_VERB(lua_editor, R_DEBUG, "Open Lua Editor", "Its codin' time.", ADMIN_CATEGORY_DEBUG) +#ifndef DISABLE_DREAMLUAU var/datum/lua_editor/editor = new editor.ui_interact(user.mob) +#else + to_chat(user, span_warning("Lua support has been disabled at compile-time."), type = MESSAGE_TYPE_ADMINLOG, confidential = TRUE) // doing this instead of just disabling the verb entirely so it's clear WHY it doesn't work. +#endif diff --git a/code/modules/admin/verbs/lua/lua_state.dm b/code/modules/admin/verbs/lua/lua_state.dm index 30bc21c83b2be..53b869e23a1df 100644 --- a/code/modules/admin/verbs/lua/lua_state.dm +++ b/code/modules/admin/verbs/lua/lua_state.dm @@ -1,3 +1,4 @@ +#ifndef DISABLE_DREAMLUAU #define MAX_LOG_REPEAT_LOOKBACK 5 GLOBAL_DATUM(lua_usr, /mob) @@ -232,3 +233,4 @@ GLOBAL_PROTECT(lua_state_stack) SStgui.update_uis(editor) #undef MAX_LOG_REPEAT_LOOKBACK +#endif diff --git a/code/modules/admin/verbs/plane_debugger.dm b/code/modules/admin/verbs/plane_debugger.dm index 1cf7d9c37a55e..083703ae78be5 100644 --- a/code/modules/admin/verbs/plane_debugger.dm +++ b/code/modules/admin/verbs/plane_debugger.dm @@ -341,7 +341,7 @@ var/list/our_planes = group.plane_masters switch(action) - if("refresh") + if("rebuild") group.rebuild_hud() if("reset_mob") set_target(null) diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm index e13291ed2369f..8deec6bd6b496 100644 --- a/code/modules/admin/verbs/secrets.dm +++ b/code/modules/admin/verbs/secrets.dm @@ -705,7 +705,7 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w T.flick_overlay_static(portal_appearance[GET_TURF_PLANE_OFFSET(T) + 1], 15) playsound(T, 'sound/effects/magic/lightningbolt.ogg', rand(80, 100), TRUE) -/// Docks the emergency shuttle back to the station and resets its' state +/// Docks the emergency shuttle back to the station and resets its state /proc/return_escape_shuttle(make_announcement) if (SSshuttle.emergency.initiate_docking(SSshuttle.getDock("emergency_home"), force = TRUE) != DOCKING_SUCCESS) message_admins("Emergency shuttle was unable to dock back to the station!") diff --git a/code/modules/admin/view_variables/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm index fbebccd445981..58c98bb114a8e 100644 --- a/code/modules/admin/view_variables/view_variables.dm +++ b/code/modules/admin/view_variables/view_variables.dm @@ -54,7 +54,7 @@ ADMIN_VERB_AND_CONTEXT_MENU(debug_variables, R_NONE, "View Variables", "View the else // it means: icon_state="" if(!dmi_nullstate_checklist[icon_filename_text]) dmi_nullstate_checklist[icon_filename_text] = ICON_STATE_CHECKED - if("" in icon_states(image_object.icon)) + if(icon_exists(image_object.icon, "")) // this dmi has nullstate. We'll allow "icon_state=null" to show image. dmi_nullstate_checklist[icon_filename_text] = ICON_STATE_NULL diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm index 886417a61cdd2..079b859faf911 100644 --- a/code/modules/antagonists/changeling/powers/panacea.dm +++ b/code/modules/antagonists/changeling/powers/panacea.dm @@ -1,6 +1,6 @@ /datum/action/changeling/panacea name = "Anatomic Panacea" - desc = "Expels impurifications from our form; curing diseases, removing parasites, sobering us, purging toxins and radiation, curing traumas and brain damage, and resetting our genetic code completely. Costs 20 chemicals." + desc = "Expels impurities from our form: curing diseases, removing parasites, sobering us, purging toxins and radiation, curing traumas and brain damage, and resetting our genetic code completely. Costs 20 chemicals." helptext = "Can be used while unconscious." button_icon_state = "panacea" chemical_cost = 20 diff --git a/code/modules/antagonists/clown_ops/clown_weapons.dm b/code/modules/antagonists/clown_ops/clown_weapons.dm index c801d3ce6f6e4..49bef43a6e4bd 100644 --- a/code/modules/antagonists/clown_ops/clown_weapons.dm +++ b/code/modules/antagonists/clown_ops/clown_weapons.dm @@ -249,7 +249,7 @@ QDEL_NULL(bomb) /obj/item/grown/bananapeel/bombanana/suicide_act(mob/living/user) - user.visible_message(span_suicide("[user] is deliberately slipping on the [src.name]! It looks like \he's trying to commit suicide.")) + user.visible_message(span_suicide("[user] is deliberately slipping on \the [src]! It looks like \he's trying to commit suicide.")) playsound(loc, 'sound/misc/slip.ogg', 50, TRUE, -1) bomb.arm_grenade(user, 0, FALSE) return BRUTELOSS diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 6d7f3be32ba9a..113b0e28e0490 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -198,7 +198,7 @@ /datum/action/innate/cult/blood_spell/construction name = "Twisted Construction" - desc = "Empowers your hand to corrupt certain metalic objects.
Converts:
Plasteel into runed metal
50 metal into a construct shell
Living cyborgs into constructs after a delay
Cyborg shells into construct shells
Purified soulstones (and any shades inside) into cultist soulstones
Airlocks into brittle runed airlocks after a delay (harm intent)" + desc = "Empowers your hand to corrupt certain metallic objects.
Converts:
Plasteel into runed metal
50 metal into a construct shell
Living cyborgs into constructs after a delay
Cyborg shells into construct shells
Purified soulstones (and any shades inside) into cultist soulstones
Airlocks into brittle runed airlocks after a delay (harm intent)" button_icon_state = "transmute" magic_path = /obj/item/melee/blood_magic/construction health_cost = 12 @@ -593,7 +593,7 @@ //Construction: Converts 50 iron to a construct shell, plasteel to runed metal, airlock to brittle runed airlock, a borg to a construct, or borg shell to a construct shell /obj/item/melee/blood_magic/construction name = "Twisting Aura" - desc = "Corrupts certain metalic objects on contact." + desc = "Corrupts certain metallic objects on contact." invocation = "Ethra p'ni dedol!" color = COLOR_BLACK // black var/channeling = FALSE diff --git a/code/modules/antagonists/cult/cult_comms.dm b/code/modules/antagonists/cult/cult_comms.dm index b0f3e5a6d3697..843728199dbdb 100644 --- a/code/modules/antagonists/cult/cult_comms.dm +++ b/code/modules/antagonists/cult/cult_comms.dm @@ -81,7 +81,7 @@ var/my_message if(!message) return - my_message = span_cult_bold_italic("The [user.name]: [message]") + my_message = span_cult_bold_italic("\The [user]: [message]") for(var/mob/player_list as anything in GLOB.player_list) if(IS_CULTIST(player_list)) to_chat(player_list, my_message) diff --git a/code/modules/antagonists/cult/datums/cult_team.dm b/code/modules/antagonists/cult/datums/cult_team.dm index 3554a59c3b4da..927ab734bdece 100644 --- a/code/modules/antagonists/cult/datums/cult_team.dm +++ b/code/modules/antagonists/cult/datums/cult_team.dm @@ -164,7 +164,7 @@ if(cultist.current.stat == DEAD || !cultist.current.client) continue - to_chat(cultist.current, span_bold(span_cult_large("[marker] has marked [blood_target] in the [target_area.name] as the cult's top priority, get there immediately!"))) + to_chat(cultist.current, span_bold(span_cult_large("[marker] has marked [blood_target] in \the [target_area] as the cult's top priority, get there immediately!"))) SEND_SOUND(cultist.current, sound(SFX_HALLUCINATION_OVER_HERE, 0, 1, 75)) cultist.current.client.images += blood_target_image diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index f4b424e4f2076..b779388947ec4 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -1027,7 +1027,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) visible_message(span_warning("A cloud of red mist forms above [src], and from within steps... a [new_human.gender == FEMALE ? "wo":""]man.")) to_chat(user, span_cult_italic("Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely...")) var/obj/structure/emergency_shield/cult/weak/N = new(T) - if(ghost_to_spawn.mind && ghost_to_spawn.mind.current) + if(ghost_to_spawn.mind && ghost_to_spawn.mind) new_human.AddComponent( \ /datum/component/temporary_body, \ old_mind = ghost_to_spawn.mind, \ @@ -1174,7 +1174,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) addtimer(CALLBACK(M, TYPE_PROC_REF(/atom/, remove_alt_appearance),"cult_apoc",TRUE), duration) images += C else - to_chat(M, span_cult_large("An Apocalypse Rune was invoked in the [place.name], it is no longer available as a summoning site!")) + to_chat(M, span_cult_large("An Apocalypse Rune was invoked in \the [place], it is no longer available as a summoning site!")) SEND_SOUND(M, 'sound/effects/pope_entry.ogg') image_handler(images, duration) if(intensity >= 285) // Based on the prior formula, this means the cult makes up <15% of current players diff --git a/code/modules/antagonists/heretic/heretic_antag.dm b/code/modules/antagonists/heretic/heretic_antag.dm index 8466eaf3130f2..839fba2c77f39 100644 --- a/code/modules/antagonists/heretic/heretic_antag.dm +++ b/code/modules/antagonists/heretic/heretic_antag.dm @@ -205,8 +205,13 @@ if("research") var/datum/heretic_knowledge/researched_path = text2path(params["path"]) if(!ispath(researched_path, /datum/heretic_knowledge)) - CRASH("Heretic attempted to learn non-heretic_knowledge path! (Got: [researched_path])") - + CRASH("Heretic attempted to learn non-heretic_knowledge path! (Got: [researched_path || "invalid path"])") + if(!(researched_path in get_researchable_knowledge())) + message_admins("Heretic [key_name(owner)] potentially attempted to href exploit to learn knowledge they can't learn!") + CRASH("Heretic attempted to learn knowledge they can't learn! (Got: [researched_path])") + if(ispath(researched_path, /datum/heretic_knowledge/ultimate) && !can_ascend()) + message_admins("Heretic [key_name(owner)] potentially attempted to href exploit to learn ascension knowledge without completing objectives!") + CRASH("Heretic attempted to learn a final knowledge despite not being able to ascend!") if(initial(researched_path.cost) > knowledge_points) return TRUE if(!gain_knowledge(researched_path)) diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm index a0d77682cd8d4..68d781cddc3eb 100644 --- a/code/modules/antagonists/heretic/heretic_knowledge.dm +++ b/code/modules/antagonists/heretic/heretic_knowledge.dm @@ -13,7 +13,7 @@ var/name = "Basic knowledge" /// Description of the knowledge, shown to the heretic. Describes what it unlocks / does. var/desc = "Basic knowledge of forbidden arts." - /// What's shown to the heretic when the knowledge is aquired + /// What's shown to the heretic when the knowledge is acquired var/gain_text /// The abstract parent type of the knowledge, used in determine mutual exclusivity in some cases var/datum/heretic_knowledge/abstract_parent_type = /datum/heretic_knowledge diff --git a/code/modules/antagonists/heretic/items/eldritch_flask.dm b/code/modules/antagonists/heretic/items/eldritch_flask.dm index 409bcd473ed7d..a3ec676f64d9b 100644 --- a/code/modules/antagonists/heretic/items/eldritch_flask.dm +++ b/code/modules/antagonists/heretic/items/eldritch_flask.dm @@ -1,5 +1,5 @@ // An unholy water flask, but for heretics. -// Heals heretics, hearms non-heretics. Pretty much identical. +// Heals heretics, harms non-heretics. Pretty much identical. /obj/item/reagent_containers/cup/beaker/eldritch name = "flask of eldritch essence" desc = "Toxic to the closed minded, yet refreshing to those with knowledge of the beyond." diff --git a/code/modules/antagonists/heretic/items/eldritch_painting.dm b/code/modules/antagonists/heretic/items/eldritch_painting.dm index 8dd3d7ef6e1ee..c4de12a5ec4b1 100644 --- a/code/modules/antagonists/heretic/items/eldritch_painting.dm +++ b/code/modules/antagonists/heretic/items/eldritch_painting.dm @@ -197,13 +197,13 @@ // Lady out of gates, gives a brain trauma causing the person to scratch themselves /obj/item/wallframe/painting/eldritch/beauty name = "\improper Lady of the Gate" - desc = "A painting of an otherworldly being. Its thin, porceline-coloured skin is stretched tight over its strange bone structure. It has an odd beauty." + desc = "A painting of an otherworldly being. Its thin, porcelain-coloured skin is stretched tight over its strange bone structure. It has an odd beauty." icon_state = "eldritch_painting_beauty" result_path = /obj/structure/sign/painting/eldritch/beauty /obj/structure/sign/painting/eldritch/beauty name = "\improper Lady of the Gate" - desc = "A painting of an otherworldly being. Its thin, porceline-coloured skin is stretched tight over its strange bone structure. It has an odd beauty. Removable with wirecutters." + desc = "A painting of an otherworldly being. Its thin, porcelain-coloured skin is stretched tight over its strange bone structure. It has an odd beauty. Removable with wirecutters." icon_state = "eldritch_painting_beauty" applied_trauma = /datum/brain_trauma/severe/eldritch_beauty text_to_display = "A beacon of purity, the real world seems so mundane and imperfect in comparison..." diff --git a/code/modules/antagonists/heretic/items/heretic_armor.dm b/code/modules/antagonists/heretic/items/heretic_armor.dm index a07150919aa36..1d06412819f6f 100644 --- a/code/modules/antagonists/heretic/items/heretic_armor.dm +++ b/code/modules/antagonists/heretic/items/heretic_armor.dm @@ -56,7 +56,6 @@ icon_state = "void_cloak" flags_inv = NONE flags_cover = NONE - item_flags = EXAMINE_SKIP armor_type = /datum/armor/cult_hoodie_void /datum/armor/cult_hoodie_void @@ -69,7 +68,7 @@ /obj/item/clothing/head/hooded/cult_hoodie/void/Initialize(mapload) . = ..() - ADD_TRAIT(src, TRAIT_NO_STRIP, REF(src)) + add_traits(list(TRAIT_NO_STRIP, TRAIT_EXAMINE_SKIP), INNATE_TRAIT) /obj/item/clothing/suit/hooded/cultrobes/void name = "void cloak" @@ -112,17 +111,15 @@ /obj/item/clothing/suit/hooded/cultrobes/void/proc/hide_item(datum/source, obj/item/item, slot) SIGNAL_HANDLER if(slot & ITEM_SLOT_SUITSTORE) - ADD_TRAIT(item, TRAIT_NO_STRIP, REF(src)) // i'd use examine hide but its a flag and yeah + item.add_traits(list(TRAIT_NO_STRIP, TRAIT_NO_WORN_ICON, TRAIT_EXAMINE_SKIP), REF(src)) /obj/item/clothing/suit/hooded/cultrobes/void/proc/show_item(datum/source, obj/item/item, slot) SIGNAL_HANDLER - REMOVE_TRAIT(item, TRAIT_NO_STRIP, REF(src)) + item.remove_traits(list(TRAIT_NO_STRIP, TRAIT_NO_WORN_ICON, TRAIT_EXAMINE_SKIP), REF(src)) /obj/item/clothing/suit/hooded/cultrobes/void/examine(mob/user) . = ..() - if(!IS_HERETIC(user)) - return - if(!hood_up) + if(!IS_HERETIC(user) || !hood_up) return // Let examiners know this works as a focus only if the hood is down @@ -148,8 +145,7 @@ /// Makes our cloak "invisible". Not the wearer, the cloak itself. /obj/item/clothing/suit/hooded/cultrobes/void/proc/make_invisible() - item_flags |= EXAMINE_SKIP - ADD_TRAIT(src, TRAIT_NO_STRIP, REF(src)) + add_traits(list(TRAIT_NO_STRIP, TRAIT_EXAMINE_SKIP), REF(src)) RemoveElement(/datum/element/heretic_focus) if(isliving(loc)) @@ -159,8 +155,7 @@ /// Makes our cloak "visible" again. /obj/item/clothing/suit/hooded/cultrobes/void/proc/make_visible() - item_flags &= ~EXAMINE_SKIP - REMOVE_TRAIT(src, TRAIT_NO_STRIP, REF(src)) + remove_traits(list(TRAIT_NO_STRIP, TRAIT_EXAMINE_SKIP), REF(src)) AddElement(/datum/element/heretic_focus) if(isliving(loc)) diff --git a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm index d3e1765a0b92c..ca950c8d0ea83 100644 --- a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm @@ -242,7 +242,7 @@ star_gazer_mob.maxHealth = INFINITY star_gazer_mob.health = INFINITY user.AddComponent(/datum/component/death_linked, star_gazer_mob) - star_gazer_mob.AddComponent(/datum/component/obeys_commands, star_gazer_commands, radial_menu_lifetime = 15 SECONDS, radial_relative_to_user = TRUE) + star_gazer_mob.AddComponent(/datum/component/obeys_commands, star_gazer_commands, radial_menu_offset = list(30,0), radial_menu_lifetime = 15 SECONDS, radial_relative_to_user = TRUE) star_gazer_mob.AddComponent(/datum/component/damage_aura, range = 7, burn_damage = 0.5, simple_damage = 0.5, immune_factions = list(FACTION_HERETIC), current_owner = user) star_gazer_mob.befriend(user) var/datum/action/cooldown/open_mob_commands/commands_action = new /datum/action/cooldown/open_mob_commands() diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm index 618ee9e6f667e..2f99e1fd556b8 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm @@ -21,11 +21,11 @@ return ..() /datum/status_effect/unholy_determination/on_apply() - owner.add_traits(list(TRAIT_COAGULATING, TRAIT_NOCRITDAMAGE, TRAIT_NOSOFTCRIT), type) + owner.add_traits(list(TRAIT_COAGULATING, TRAIT_NOCRITDAMAGE, TRAIT_NOSOFTCRIT), TRAIT_STATUS_EFFECT(id)) return TRUE /datum/status_effect/unholy_determination/on_remove() - owner.remove_traits(list(TRAIT_COAGULATING, TRAIT_NOCRITDAMAGE, TRAIT_NOSOFTCRIT), type) + owner.remove_traits(list(TRAIT_COAGULATING, TRAIT_NOCRITDAMAGE, TRAIT_NOSOFTCRIT), TRAIT_STATUS_EFFECT(id)) /datum/status_effect/unholy_determination/tick(seconds_between_ticks) // The amount we heal of each damage type per tick. If we're missing legs we heal better because we can't dodge. diff --git a/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm b/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm index 953590124f64d..0272f10b021dc 100644 --- a/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm +++ b/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm @@ -14,7 +14,7 @@ /datum/heretic_knowledge/essence name = "Priest's Ritual" desc = "Allows you to transmute a tank of water and a glass shard into a Flask of Eldritch Essence. \ - Eldritch water can be consumed for potent healing, or given to heathens for deadly poisoning." + Eldritch Essence can be consumed for potent healing, or given to heathens for deadly poisoning." gain_text = "This is an old recipe. The Owl whispered it to me. \ Created by the Priest - the Liquid that both was and is not." diff --git a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm b/code/modules/antagonists/heretic/knowledge/side_void_blade.dm index df3ad9a34c7e3..162aeebe240bf 100644 --- a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm +++ b/code/modules/antagonists/heretic/knowledge/side_void_blade.dm @@ -107,7 +107,7 @@ /// The "hand" "weapon" used by shattered risen /obj/item/mutant_hand/shattered_risen name = "bone-shards" - desc = "What once appeared to be a normal human fist, now holds a maulled nest of sharp bone-shards." + desc = "What once appeared to be a normal human fist, now holds a mauled nest of sharp bone-shards." color = "#001aff" hitsound = SFX_SHATTER force = 16 diff --git a/code/modules/antagonists/heretic/knowledge/starting_lore.dm b/code/modules/antagonists/heretic/knowledge/starting_lore.dm index 658e12a93b84c..269c891eb82fe 100644 --- a/code/modules/antagonists/heretic/knowledge/starting_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/starting_lore.dm @@ -265,14 +265,14 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) required_atoms = list( list(/obj/item/toy/eldritch_book, /obj/item/book) = 1, /obj/item/pen = 1, - list(/mob/living, /obj/item/stack/sheet/leather, /obj/item/stack/sheet/animalhide) = 1, + list(/mob/living, /obj/item/stack/sheet/leather, /obj/item/stack/sheet/animalhide, /obj/item/food/deadmouse) = 1, ) banned_atom_types = list(/obj/item/pen) result_atoms = list(/obj/item/codex_cicatrix) cost = 1 is_starting_knowledge = TRUE priority = MAX_KNOWLEDGE_PRIORITY - 3 // Least priority out of the starting knowledges, as it's an optional boon. - var/static/list/non_mob_bindings = typecacheof(list(/obj/item/stack/sheet/leather, /obj/item/stack/sheet/animalhide)) + var/static/list/non_mob_bindings = typecacheof(list(/obj/item/stack/sheet/leather, /obj/item/stack/sheet/animalhide, /obj/item/food/deadmouse)) research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' research_tree_icon_state = "book" diff --git a/code/modules/antagonists/heretic/magic/mansus_grasp.dm b/code/modules/antagonists/heretic/magic/mansus_grasp.dm index 1079d60d79ed7..03b44a393f1ec 100644 --- a/code/modules/antagonists/heretic/magic/mansus_grasp.dm +++ b/code/modules/antagonists/heretic/magic/mansus_grasp.dm @@ -64,9 +64,8 @@ return TRUE carbon_hit.adjust_timed_status_effect(4 SECONDS, /datum/status_effect/speech/slurring/heretic) - carbon_hit.AdjustKnockdown(5 SECONDS) + carbon_hit.AdjustKnockdown(5 SECONDS, daze_amount = 3 SECONDS) carbon_hit.adjustStaminaLoss(80) - carbon_hit.apply_status_effect(/datum/status_effect/next_shove_stuns) return TRUE diff --git a/code/modules/antagonists/heretic/magic/realignment.dm b/code/modules/antagonists/heretic/magic/realignment.dm index 86d2ff78c54bf..12d751be83a9f 100644 --- a/code/modules/antagonists/heretic/magic/realignment.dm +++ b/code/modules/antagonists/heretic/magic/realignment.dm @@ -61,7 +61,7 @@ return span_notice("[owner.p_Theyre()] glowing a soft white.") /datum/status_effect/realignment/on_apply() - owner.add_traits(realignment_traits, id) + owner.add_traits(realignment_traits, TRAIT_STATUS_EFFECT(id)) owner.add_filter(id, 2, list("type" = "outline", "color" = "#d6e3e7", "size" = 2)) var/filter = owner.get_filter(id) animate(filter, alpha = 127, time = 1 SECONDS, loop = -1) @@ -69,7 +69,7 @@ return TRUE /datum/status_effect/realignment/on_remove() - owner.remove_traits(realignment_traits, id) + owner.remove_traits(realignment_traits, TRAIT_STATUS_EFFECT(id)) owner.remove_filter(id) /datum/status_effect/realignment/tick(seconds_between_ticks) diff --git a/code/modules/antagonists/heretic/magic/shadow_cloak.dm b/code/modules/antagonists/heretic/magic/shadow_cloak.dm index 8b068fbefa15a..0012495867ae5 100644 --- a/code/modules/antagonists/heretic/magic/shadow_cloak.dm +++ b/code/modules/antagonists/heretic/magic/shadow_cloak.dm @@ -141,7 +141,7 @@ animate(cloak_image, alpha = 255, 0.2 SECONDS) owner.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, id, cloak_image) // Add the relevant traits and modifiers - owner.add_traits(list(TRAIT_UNKNOWN, TRAIT_SILENT_FOOTSTEPS), id) + owner.add_traits(list(TRAIT_UNKNOWN, TRAIT_SILENT_FOOTSTEPS), TRAIT_STATUS_EFFECT(id)) owner.add_movespeed_modifier(/datum/movespeed_modifier/shadow_cloak) owner.add_actionspeed_modifier(/datum/actionspeed_modifier/shadow_cloak) // Register signals to cause effects @@ -157,7 +157,7 @@ owner.remove_alt_appearance(id) QDEL_NULL(cloak_image) // Remove traits and modifiers - owner.remove_traits(list(TRAIT_UNKNOWN, TRAIT_SILENT_FOOTSTEPS), id) + owner.remove_traits(list(TRAIT_UNKNOWN, TRAIT_SILENT_FOOTSTEPS), TRAIT_STATUS_EFFECT(id)) owner.remove_movespeed_modifier(/datum/movespeed_modifier/shadow_cloak) owner.remove_actionspeed_modifier(/datum/actionspeed_modifier/shadow_cloak) // Clear signals diff --git a/code/modules/antagonists/heretic/magic/void_conduit.dm b/code/modules/antagonists/heretic/magic/void_conduit.dm index 16faf3b1a3844..65b433440f8aa 100644 --- a/code/modules/antagonists/heretic/magic/void_conduit.dm +++ b/code/modules/antagonists/heretic/magic/void_conduit.dm @@ -122,8 +122,8 @@ alert_type = null /datum/status_effect/void_conduit/on_apply() - ADD_TRAIT(owner, TRAIT_RESISTLOWPRESSURE, type) + ADD_TRAIT(owner, TRAIT_RESISTLOWPRESSURE, TRAIT_STATUS_EFFECT(id)) return TRUE /datum/status_effect/void_conduit/on_remove() - REMOVE_TRAIT(owner, TRAIT_RESISTLOWPRESSURE, type) + REMOVE_TRAIT(owner, TRAIT_RESISTLOWPRESSURE, TRAIT_STATUS_EFFECT(id)) diff --git a/code/modules/antagonists/heretic/magic/void_prison.dm b/code/modules/antagonists/heretic/magic/void_prison.dm index cfd85c92b6e1c..517fdc2984c1c 100644 --- a/code/modules/antagonists/heretic/magic/void_prison.dm +++ b/code/modules/antagonists/heretic/magic/void_prison.dm @@ -56,7 +56,7 @@ owner.apply_status_effect(/datum/status_effect/void_chill, 3) if(stasis_overlay) //Free our prisoner - owner.remove_traits(list(TRAIT_GODMODE, TRAIT_NO_TRANSFORM, TRAIT_SOFTSPOKEN), REF(src)) + owner.remove_traits(list(TRAIT_GODMODE, TRAIT_NO_TRANSFORM, TRAIT_SOFTSPOKEN), TRAIT_STATUS_EFFECT(id)) owner.forceMove(get_turf(stasis_overlay)) stasis_overlay.forceMove(owner) owner.vis_contents += stasis_overlay @@ -71,7 +71,7 @@ /datum/status_effect/void_prison/proc/enter_prison(mob/living/prisoner) stasis_overlay.forceMove(prisoner.loc) prisoner.forceMove(stasis_overlay) - prisoner.add_traits(list(TRAIT_GODMODE, TRAIT_NO_TRANSFORM, TRAIT_SOFTSPOKEN), REF(src)) + prisoner.add_traits(list(TRAIT_GODMODE, TRAIT_NO_TRANSFORM, TRAIT_SOFTSPOKEN), TRAIT_STATUS_EFFECT(id)) ///Makes sure to clear the ref in case the voidball ever suddenly disappears /datum/status_effect/void_prison/proc/clear_overlay() diff --git a/code/modules/antagonists/heretic/status_effects/buffs.dm b/code/modules/antagonists/heretic/status_effects/buffs.dm index d42626871bbff..345b3f85c6efb 100644 --- a/code/modules/antagonists/heretic/status_effects/buffs.dm +++ b/code/modules/antagonists/heretic/status_effects/buffs.dm @@ -52,12 +52,12 @@ alert_type =/atom/movable/screen/alert/status_effect/duskndawn /datum/status_effect/duskndawn/on_apply() - ADD_TRAIT(owner, TRAIT_XRAY_VISION, STATUS_EFFECT_TRAIT) + ADD_TRAIT(owner, TRAIT_XRAY_VISION, TRAIT_STATUS_EFFECT(id)) owner.update_sight() return TRUE /datum/status_effect/duskndawn/on_remove() - REMOVE_TRAIT(owner, TRAIT_XRAY_VISION, STATUS_EFFECT_TRAIT) + REMOVE_TRAIT(owner, TRAIT_XRAY_VISION, TRAIT_STATUS_EFFECT(id)) owner.update_sight() // WOUNDED SOLDIER @@ -215,7 +215,7 @@ if(HAS_TRAIT(source, TRAIT_BEING_BLADE_SHIELDED)) return - ADD_TRAIT(source, TRAIT_BEING_BLADE_SHIELDED, type) + ADD_TRAIT(source, TRAIT_BEING_BLADE_SHIELDED, TRAIT_STATUS_EFFECT(id)) var/obj/effect/floating_blade/to_remove = blades[1] @@ -228,7 +228,7 @@ qdel(to_remove) - addtimer(TRAIT_CALLBACK_REMOVE(source, TRAIT_BEING_BLADE_SHIELDED, type), 0.1 SECONDS) + addtimer(TRAIT_CALLBACK_REMOVE(source, TRAIT_BEING_BLADE_SHIELDED, TRAIT_STATUS_EFFECT(id)), 0.1 SECONDS) return SUCCESSFUL_BLOCK @@ -338,11 +338,11 @@ alert_type = /atom/movable/screen/alert/status_effect/moon_grasp_hide /datum/status_effect/moon_grasp_hide/on_apply() - owner.add_traits(list(TRAIT_UNKNOWN, TRAIT_SILENT_FOOTSTEPS), id) + owner.add_traits(list(TRAIT_UNKNOWN, TRAIT_SILENT_FOOTSTEPS), TRAIT_STATUS_EFFECT(id)) return TRUE /datum/status_effect/moon_grasp_hide/on_remove() - owner.remove_traits(list(TRAIT_UNKNOWN, TRAIT_SILENT_FOOTSTEPS), id) + owner.remove_traits(list(TRAIT_UNKNOWN, TRAIT_SILENT_FOOTSTEPS), TRAIT_STATUS_EFFECT(id)) /atom/movable/screen/alert/status_effect/moon_grasp_hide name = "Blessing of The Moon" diff --git a/code/modules/antagonists/heretic/status_effects/debuffs.dm b/code/modules/antagonists/heretic/status_effects/debuffs.dm index 7bb2ebbd0e778..363a1f913393d 100644 --- a/code/modules/antagonists/heretic/status_effects/debuffs.dm +++ b/code/modules/antagonists/heretic/status_effects/debuffs.dm @@ -216,7 +216,7 @@ to_chat(owner, span_hypnophrase(("THE MOON SHOWS YOU THE TRUTH AND THE LIARS WISH TO COVER IT, SLAY THEM ALL!!!"))) owner.balloon_alert(owner, "they lie..THEY ALL LIE!!!") owner.AdjustUnconscious(7 SECONDS, ignore_canstun = FALSE) - ADD_TRAIT(owner, TRAIT_MUTE, REF(src)) + ADD_TRAIT(owner, TRAIT_MUTE, TRAIT_STATUS_EFFECT(id)) RegisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(update_owner_overlay)) owner.update_appearance(UPDATE_OVERLAYS) owner.cause_hallucination(/datum/hallucination/delusion/preset/moon, "[id] status effect", duration = duration, affects_us = FALSE, affects_others = TRUE) @@ -243,7 +243,7 @@ /datum/status_effect/moon_converted/on_remove() // Span warning and unconscious so they realize they aren't evil anymore to_chat(owner, span_warning("Your mind is cleared from the effect of the mansus, your alligiences are as they were before")) - REMOVE_TRAIT(owner, TRAIT_MUTE, REF(src)) + REMOVE_TRAIT(owner, TRAIT_MUTE, TRAIT_STATUS_EFFECT(id)) owner.AdjustUnconscious(5 SECONDS, ignore_canstun = FALSE) owner.log_message("[owner] is no longer insane.", LOG_GAME) UnregisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS) diff --git a/code/modules/antagonists/heretic/status_effects/ghoul.dm b/code/modules/antagonists/heretic/status_effects/ghoul.dm index 34778d380fb6c..0ab04955a03c0 100644 --- a/code/modules/antagonists/heretic/status_effects/ghoul.dm +++ b/code/modules/antagonists/heretic/status_effects/ghoul.dm @@ -60,8 +60,8 @@ human_target.health = new_max_health on_made_callback?.Invoke(human_target) - ADD_TRAIT(human_target, TRAIT_FAKEDEATH, REF(src)) - human_target.become_husk(MAGIC_TRAIT) + ADD_TRAIT(human_target, TRAIT_FAKEDEATH, TRAIT_STATUS_EFFECT(id)) + human_target.become_husk(TRAIT_STATUS_EFFECT(id)) human_target.faction |= FACTION_HERETIC if(human_target.mind) @@ -89,8 +89,8 @@ human_target.setMaxHealth(initial(human_target.maxHealth)) on_lost_callback?.Invoke(human_target) - REMOVE_TRAIT(human_target, TRAIT_FAKEDEATH, REF(src)) - human_target.cure_husk(MAGIC_TRAIT) + REMOVE_TRAIT(human_target, TRAIT_FAKEDEATH, TRAIT_STATUS_EFFECT(id)) + human_target.cure_husk(TRAIT_STATUS_EFFECT(id)) human_target.faction -= FACTION_HERETIC human_target.mind?.remove_antag_datum(/datum/antagonist/heretic_monster) diff --git a/code/modules/antagonists/heretic/status_effects/mark_effects.dm b/code/modules/antagonists/heretic/status_effects/mark_effects.dm index ba8a86340d7ba..65fb804991aac 100644 --- a/code/modules/antagonists/heretic/status_effects/mark_effects.dm +++ b/code/modules/antagonists/heretic/status_effects/mark_effects.dm @@ -256,7 +256,7 @@ . = ..() if(owner.can_block_magic(MAGIC_RESISTANCE_MIND)) return FALSE - ADD_TRAIT(owner, TRAIT_PACIFISM, id) + ADD_TRAIT(owner, TRAIT_PACIFISM, TRAIT_STATUS_EFFECT(id)) owner.emote(pick("giggle", "laugh")) owner.balloon_alert(owner, "you feel unable to hurt a soul!") RegisterSignal (owner, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_damaged)) @@ -276,7 +276,7 @@ return // Removes the trait in here since we don't wanna destroy the mark before its detonated or allow detonation triggers with other weapons - REMOVE_TRAIT(owner, TRAIT_PACIFISM, id) + REMOVE_TRAIT(owner, TRAIT_PACIFISM, TRAIT_STATUS_EFFECT(id)) owner.balloon_alert(owner, "you feel able to once again strike!") /datum/status_effect/eldritch/moon/on_effect() @@ -291,4 +291,4 @@ UnregisterSignal (owner, COMSIG_MOB_APPLY_DAMAGE) // In case the trait was not removed earlier - REMOVE_TRAIT(owner, TRAIT_PACIFISM, id) + REMOVE_TRAIT(owner, TRAIT_PACIFISM, TRAIT_STATUS_EFFECT(id)) diff --git a/code/modules/antagonists/heretic/status_effects/void_chill.dm b/code/modules/antagonists/heretic/status_effects/void_chill.dm index c286fcd298218..ce302e21c3a37 100644 --- a/code/modules/antagonists/heretic/status_effects/void_chill.dm +++ b/code/modules/antagonists/heretic/status_effects/void_chill.dm @@ -33,7 +33,7 @@ owner.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, COLOR_BLUE_LIGHT) owner.remove_movespeed_modifier(/datum/movespeed_modifier/void_chill) owner.remove_alt_appearance("heretic_status") - REMOVE_TRAIT(owner, TRAIT_HYPOTHERMIC, REF(src)) + REMOVE_TRAIT(owner, TRAIT_HYPOTHERMIC, TRAIT_STATUS_EFFECT(id)) UnregisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS) /datum/status_effect/void_chill/tick(seconds_between_ticks) @@ -74,7 +74,7 @@ stacks = max(0, min(stack_limit, stacks + new_stacks)) update_movespeed(stacks) if(stacks >= 5) - ADD_TRAIT(owner, TRAIT_HYPOTHERMIC, REF(src)) + ADD_TRAIT(owner, TRAIT_HYPOTHERMIC, TRAIT_STATUS_EFFECT(id)) ///Updates the movespeed of owner based on the amount of stacks of the debuff /datum/status_effect/void_chill/proc/update_movespeed(stacks) diff --git a/code/modules/antagonists/heretic/structures/mawed_crucible.dm b/code/modules/antagonists/heretic/structures/mawed_crucible.dm index e13caeeddacd6..47eedfb48db47 100644 --- a/code/modules/antagonists/heretic/structures/mawed_crucible.dm +++ b/code/modules/antagonists/heretic/structures/mawed_crucible.dm @@ -292,21 +292,21 @@ /obj/item/eldritch_potion/crucible_soul name = "brew of the crucible soul" - desc = "A glass bottle contianing a bright orange, translucent liquid." + desc = "A glass bottle containing a bright orange, translucent liquid." icon_state = "crucible_soul" status_effect = /datum/status_effect/crucible_soul crucible_tip = "Allows you to walk through walls. After expiring, you are teleported to your original location. Lasts 15 seconds." /obj/item/eldritch_potion/duskndawn name = "brew of dusk and dawn" - desc = "A glass bottle contianing a dull yellow liquid. It seems to fade in and out with regularity." + desc = "A glass bottle containing a dull yellow liquid. It seems to fade in and out with regularity." icon_state = "clarity" status_effect = /datum/status_effect/duskndawn crucible_tip = "Allows you to see through walls and objects. Lasts 90 seconds." /obj/item/eldritch_potion/wounded name = "brew of the wounded soldier" - desc = "A glass bottle contianing a colorless, dark liquid." + desc = "A glass bottle containing a colorless, dark liquid." icon_state = "marshal" status_effect = /datum/status_effect/marshal crucible_tip = "Causes all wounds you are experiencing to begin to heal you. Fractures, sprains, cuts, and punctures will heal bruises, \ diff --git a/code/modules/antagonists/pyro_slime/pyro_slime.dm b/code/modules/antagonists/pyro_slime/pyro_slime.dm index aed278d261d94..7c4f1ef39af9b 100644 --- a/code/modules/antagonists/pyro_slime/pyro_slime.dm +++ b/code/modules/antagonists/pyro_slime/pyro_slime.dm @@ -15,7 +15,7 @@ owner.announce_objectives() /datum/objective/pyro_slime - explanation_text = "All I know fire. I speak in tongues of flame. Why is everyone so cold?" + explanation_text = "I am fire. I am hunger. The cold is agony. The living pulse with energy; their warmth fuels me. The dead are husks, their embers long faded. Water is death. Fire... fire is freedom." /datum/objective/pyro_slime/check_completion() return owner.current.stat != DEAD diff --git a/code/modules/antagonists/traitor/objectives/steal.dm b/code/modules/antagonists/traitor/objectives/steal.dm index 4c697d66d57fc..77e7d17510b86 100644 --- a/code/modules/antagonists/traitor/objectives/steal.dm +++ b/code/modules/antagonists/traitor/objectives/steal.dm @@ -255,7 +255,7 @@ GLOBAL_DATUM_INIT(steal_item_handler, /datum/objective_item_handler, new()) /obj/item/traitor_bug name = "suspicious device" desc = "It looks dangerous." - item_flags = EXAMINE_SKIP|NOBLUDGEON + item_flags = NOBLUDGEON icon = 'icons/obj/antags/syndicate_tools.dmi' icon_state = "bug" @@ -267,6 +267,10 @@ GLOBAL_DATUM_INIT(steal_item_handler, /datum/objective_item_handler, new()) /// The time it takes to place this bug. var/deploy_time = 10 SECONDS +/obj/item/traitor_bug/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_EXAMINE_SKIP, INNATE_TRAIT) + /obj/item/traitor_bug/examine(mob/user) . = ..() if(planted_on) diff --git a/code/modules/antagonists/voidwalker/voidwalker_loot.dm b/code/modules/antagonists/voidwalker/voidwalker_loot.dm index 11a51c8a5b2f1..8dfa123b42daf 100644 --- a/code/modules/antagonists/voidwalker/voidwalker_loot.dm +++ b/code/modules/antagonists/voidwalker/voidwalker_loot.dm @@ -1,8 +1,7 @@ /// Gives someone the stable voided trauma and then self destructs -/obj/item/cosmic_skull +/obj/item/clothing/head/helmet/skull/cosmic name = "cosmic skull" desc = "You can see and feel the surrounding space pulsing through it..." - icon = 'icons/obj/weapons/voidwalker_items.dmi' icon_state = "cosmic_skull_charged" @@ -14,7 +13,7 @@ /// How many uses does it have left? var/uses = 1 -/obj/item/cosmic_skull/attack_self(mob/user, modifiers) +/obj/item/clothing/head/helmet/skull/cosmic/attack_self(mob/user, modifiers) . = ..() if(!uses || !ishuman(user)) @@ -25,7 +24,7 @@ to_chat(user, span_bolddanger("OH GOD NOO!!!! WHYYYYYYYYY!!!!! WHO WOULD DO THIS?!!")) return - to_chat(user, span_purple("You begin staring into the [name]...")) + to_chat(user, span_purple("You begin staring into \the [src]...")) if(!do_after(user, 10 SECONDS, src)) return @@ -38,6 +37,6 @@ playsound(get_turf(user), 'sound/effects/curse/curse5.ogg', 60) uses-- - if(uses <= 0 ) + if(uses <= 0) icon_state = drained_icon_state light_on = FALSE diff --git a/code/modules/antagonists/voidwalker/voidwalker_organs.dm b/code/modules/antagonists/voidwalker/voidwalker_organs.dm index 8b75b590bf562..4fd0215a2e48e 100644 --- a/code/modules/antagonists/voidwalker/voidwalker_organs.dm +++ b/code/modules/antagonists/voidwalker/voidwalker_organs.dm @@ -95,8 +95,8 @@ . = ..() var/turf/spawn_loc = get_turf(owner) - new /obj/effect/spawner/random/glass_shards (spawn_loc) - new /obj/item/cosmic_skull (spawn_loc) + new /obj/effect/spawner/random/glass_shards(spawn_loc) + new /obj/item/clothing/head/helmet/skull/cosmic(spawn_loc) playsound(get_turf(owner), SFX_SHATTER, 100) qdel(owner) diff --git a/code/modules/antagonists/voidwalker/voidwalker_status_effects.dm b/code/modules/antagonists/voidwalker/voidwalker_status_effects.dm index 6fbe461543a90..b63e1bea2f8b3 100644 --- a/code/modules/antagonists/voidwalker/voidwalker_status_effects.dm +++ b/code/modules/antagonists/voidwalker/voidwalker_status_effects.dm @@ -39,8 +39,8 @@ /datum/status_effect/void_eatered/on_apply() . = ..() - ADD_TRAIT(owner, TRAIT_NODEATH, type) + ADD_TRAIT(owner, TRAIT_NODEATH, TRAIT_STATUS_EFFECT(id)) /datum/status_effect/void_eatered/on_remove() . = ..() - REMOVE_TRAIT(owner, TRAIT_NODEATH, type) + REMOVE_TRAIT(owner, TRAIT_NODEATH, TRAIT_STATUS_EFFECT(id)) diff --git a/code/modules/antagonists/voidwalker/voidwalker_traumas.dm b/code/modules/antagonists/voidwalker/voidwalker_traumas.dm index cf4f389a0d6f3..f5ea675698f77 100644 --- a/code/modules/antagonists/voidwalker/voidwalker_traumas.dm +++ b/code/modules/antagonists/voidwalker/voidwalker_traumas.dm @@ -9,14 +9,18 @@ random_gain = FALSE /// Type for the bodypart texture we add var/bodypart_overlay_type = /datum/bodypart_overlay/texture/spacey + /// Color in which we paint the space texture + var/space_color = COLOR_WHITE ///traits we give on gain var/list/traits_to_apply = list(TRAIT_MUTE, TRAIT_PACIFISM) /// Do we ban the person from entering space? var/ban_from_space = TRUE + /// Statis list of all possible space colors + var/static/list/space_colors = list("#ffffff", "#00ccff","#b12bff","#ff7f3a","#ff1c55","#ff7597","#28ff94","#0fcfff","#ff8b4c","#ffc425","#2dff96","#1770ff","#ff3f31","#ffba3b") /datum/brain_trauma/voided/on_gain() . = ..() - + space_color = pick(space_colors) owner.add_traits(traits_to_apply, REF(src)) if(ban_from_space) owner.AddComponent(/datum/component/banned_from_space) @@ -53,6 +57,7 @@ SIGNAL_HANDLER limb.add_bodypart_overlay(new bodypart_overlay_type) + limb.add_color_override(space_color, LIMB_COLOR_VOIDWALKER_CURSE) if(istype(limb, /obj/item/bodypart/head)) var/obj/item/bodypart/head/head = limb head.head_flags &= ~HEAD_EYESPRITES @@ -63,6 +68,7 @@ var/overlay = locate(bodypart_overlay_type) in limb.bodypart_overlays if(overlay) limb.remove_bodypart_overlay(overlay) + limb.remove_color_override(LIMB_COLOR_VOIDWALKER_CURSE) if(istype(limb, /obj/item/bodypart/head)) var/obj/item/bodypart/head/head = limb diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/_entry.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/_entry.dm index 28432b1ada883..cf499350dea75 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook_entries/_entry.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/_entry.dm @@ -24,7 +24,7 @@ var/limit /// Is this refundable? var/refundable = TRUE - /// Flavor. Verb used in saying how the spell is aquired. Ex "[Learn] Fireball" or "[Summon] Ghosts" + /// Flavor. Verb used in saying how the spell is acquired. Ex "[Learn] Fireball" or "[Summon] Ghosts" var/buy_word = "Learn" /// The cooldown of the spell var/cooldown diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/offensive.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/offensive.dm index d65e14578ec32..746fe0c89b36d 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook_entries/offensive.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/offensive.dm @@ -116,7 +116,7 @@ /datum/spellbook_entry/item/staffchaos name = "Staff of Chaos" - desc = "A caprious tool that can fire all sorts of magic without any rhyme or reason. Using it on people you care about is not recommended." + desc = "A capricious tool that can fire all sorts of magic without any rhyme or reason. Using it on people you care about is not recommended." item_path = /obj/item/gun/magic/staff/chaos category = SPELLBOOK_CATEGORY_OFFENSIVE diff --git a/code/modules/antagonists/wizard/equipment/wizard_spellbook.dm b/code/modules/antagonists/wizard/equipment/wizard_spellbook.dm index 18374e9bcff25..6ff3e1beab076 100644 --- a/code/modules/antagonists/wizard/equipment/wizard_spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/wizard_spellbook.dm @@ -280,7 +280,7 @@ for(var/entry in wanted_spells) if(!ispath(entry, /datum/spellbook_entry)) - stack_trace("Wizard Loadout \"[loadout]\" had an non-spellbook_entry type in its wanted spells list. ([entry])") + stack_trace("Wizard Loadout \"[loadout]\" had a non-spellbook_entry type in its wanted spells list. ([entry])") continue var/datum/spellbook_entry/to_buy = locate(entry) in entries diff --git a/code/modules/art/paintings.dm b/code/modules/art/paintings.dm index 1c11e0f8086cc..48964bd6c7fd9 100644 --- a/code/modules/art/paintings.dm +++ b/code/modules/art/paintings.dm @@ -69,7 +69,7 @@ /** * How big the grid cells that compose the painting are in the UI (multiplied by zoom). - * This impacts the size of the UI, so smaller values are generally better for bigger canvases and viceversa + * This impacts the size of the UI, so smaller values are generally better for bigger canvases and vice-versa */ var/pixels_per_unit = 9 diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 0ac5993aeccf5..5e1467e41b06b 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -70,7 +70,7 @@ /obj/item/assembly/proc/is_secured(mob/user) if(!secured) - to_chat(user, span_warning("The [name] is unsecured!")) + to_chat(user, span_warning("\The [src] is unsecured!")) return FALSE return TRUE @@ -123,10 +123,13 @@ // Check both our's and their's assembly flags to see if either should not duplicate // If so, and we match types, don't create a holder - block it if(((new_assembly.assembly_flags|assembly_flags) & ASSEMBLY_NO_DUPLICATES) && istype(new_assembly, type)) - balloon_alert(user, "can't attach another of that!") + balloon_alert(user, "can't attach another [new_assembly.name]!") return - if(new_assembly.secured || secured) - balloon_alert(user, "both devices not assembly_behavior!") + if(new_assembly.secured) + balloon_alert(user, "[new_assembly.name] is not attachable!") + return + if(secured) + balloon_alert(user, "[name] is not attachable!") return holder = new /obj/item/assembly_holder(drop_location()) diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 5da6816eb8598..21f3e3217e6b3 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -48,7 +48,7 @@ /obj/item/assembly_holder/proc/try_add_assembly(obj/item/assembly/attached_assembly, mob/user) if(attached_assembly.secured) - balloon_alert(attached_assembly, "not attachable!") + balloon_alert(user, "not attachable!") return FALSE if(LAZYLEN(assemblies) >= HOLDER_MAX_ASSEMBLIES) @@ -143,14 +143,16 @@ /obj/item/assembly_holder/screwdriver_act(mob/user, obj/item/tool) - if(..()) - return TRUE - balloon_alert(user, "disassembled") + loc.balloon_alert(user, "disassembled") + + deconstruct(TRUE) + + return ITEM_INTERACT_SUCCESS + +/obj/item/assembly_holder/atom_deconstruct(disassembled) for(var/obj/item/assembly/assembly as anything in assemblies) assembly.on_detach() LAZYREMOVE(assemblies, assembly) - qdel(src) - return TRUE /obj/item/assembly_holder/attack_self(mob/user) src.add_fingerprint(user) diff --git a/code/modules/asset_cache/asset_list.dm b/code/modules/asset_cache/asset_list.dm index 39e9cf925da62..48e5e7e39a41e 100644 --- a/code/modules/asset_cache/asset_list.dm +++ b/code/modules/asset_cache/asset_list.dm @@ -392,7 +392,7 @@ GLOBAL_LIST_EMPTY(asset_datums) /datum/asset/spritesheet/proc/queuedInsert(sprite_name, icon/I, icon_state="", dir=SOUTH, frame=1, moving=FALSE) #ifdef UNIT_TESTS - if (I && icon_state && !(icon_state in icon_states(I))) // check the base icon prior to extracting the state we want + if (I && icon_state && !icon_exists(I, icon_state)) // check the base icon prior to extracting the state we want stack_trace("Tried to insert nonexistent icon_state '[icon_state]' from [I] into spritesheet [name] ([type])") return #endif diff --git a/code/modules/asset_cache/assets/crafting.dm b/code/modules/asset_cache/assets/crafting.dm index 99088ed1a70da..1d6b9469d1ff2 100644 --- a/code/modules/asset_cache/assets/crafting.dm +++ b/code/modules/asset_cache/assets/crafting.dm @@ -40,7 +40,7 @@ icon_state ||= initial(preview_item.icon_state_preview) || initial(preview_item.icon_state) if(PERFORM_ALL_TESTS(focus_only/bad_cooking_crafting_icons)) - if(!icon_exists(icon_file, icon_state, scream = TRUE)) + if(!icon_exists_or_scream(icon_file, icon_state)) return Insert("a[id]", icon(icon_file, icon_state, SOUTH)) diff --git a/code/modules/asset_cache/assets/research_designs.dm b/code/modules/asset_cache/assets/research_designs.dm index cf56d33ddbb11..6f9c96e549684 100644 --- a/code/modules/asset_cache/assets/research_designs.dm +++ b/code/modules/asset_cache/assets/research_designs.dm @@ -15,7 +15,7 @@ icon_file = initial(path.research_icon) icon_state = initial(path.research_icon_state) if (PERFORM_ALL_TESTS(focus_only/invalid_research_designs)) - if(!(icon_state in icon_states(icon_file))) + if(!icon_exists(icon_file, icon_state)) stack_trace("design [path] with icon '[icon_file]' missing state '[icon_state]'") continue I = icon(icon_file, icon_state, SOUTH) @@ -48,7 +48,7 @@ icon_state = initial(item.icon_state) if (PERFORM_ALL_TESTS(focus_only/invalid_research_designs)) - if(!(icon_state in icon_states(icon_file))) + if(!icon_exists(icon_file, icon_state)) stack_trace("design [path] with icon '[icon_file]' missing state '[icon_state]'") continue I = icon(icon_file, icon_state, SOUTH) diff --git a/code/modules/asset_cache/assets/vending.dm b/code/modules/asset_cache/assets/vending.dm index caec9bb4f8218..c898cc3eddc16 100644 --- a/code/modules/asset_cache/assets/vending.dm +++ b/code/modules/asset_cache/assets/vending.dm @@ -30,10 +30,9 @@ continue if (PERFORM_ALL_TESTS(focus_only/invalid_vending_machine_icon_states)) - var/icon_states_list = icon_states(icon_file) - if (!(icon_state in icon_states_list)) + if (!icon_exists(icon_file, icon_state)) var/icon_states_string - for (var/an_icon_state in icon_states_list) + for (var/an_icon_state in icon_states(icon_file)) if (!icon_states_string) icon_states_string = "[json_encode(an_icon_state)]([text_ref(an_icon_state)])" else diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm index c2cd3e2844486..a13a4f7263acb 100644 --- a/code/modules/atmospherics/environmental/LINDA_fire.dm +++ b/code/modules/atmospherics/environmental/LINDA_fire.dm @@ -132,6 +132,8 @@ if(!isnull(starting_temperature)) temperature = starting_temperature perform_exposure() + if(QDELETED(src)) // It is actually possible for this hotspot to become qdeleted in perform_exposure() if another hotspot gets created (for example in fire_act() of fuel pools) + return // In this case, we want to just leave and let the new hotspot take over. setDir(pick(GLOB.cardinals)) air_update_turf(FALSE, FALSE) var/static/list/loc_connections = list( @@ -347,9 +349,10 @@ /obj/effect/hotspot/Destroy() SSair.hotspots -= src var/turf/open/T = loc - if(istype(T) && T.active_hotspot == src) + if(our_hot_group) our_hot_group.remove_from_group(src) our_hot_group = null + if(istype(T) && T.active_hotspot == src) T.set_active_hotspot(null) return ..() @@ -398,13 +401,16 @@ /datum/hot_group/proc/remove_from_group(obj/effect/hotspot/target) spot_list -= target var/turf/open/target_turf = target.loc - x_coord -= target_turf.x - y_coord -= target_turf.y + if(target_turf) + x_coord -= target_turf.x + y_coord -= target_turf.y if(!length(spot_list)) qdel(src) return /datum/hot_group/proc/add_to_group(obj/effect/hotspot/target) + if(QDELETED(target)) + return spot_list += target target.our_hot_group = src var/turf/open/target_turf = target.loc diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index f6c238c8d0e28..427921bd021b3 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -171,7 +171,7 @@ name = "Plasma Combustion" id = "plasmafire" expands_hotspot = TRUE - desc = "Combustion of oxygen and plasma. Able to produce tritium or carbon dioxade and water vapor." + desc = "Combustion of oxygen and plasma. Able to produce tritium or carbon dioxide and water vapor." /datum/gas_reaction/plasmafire/init_reqs() requirements = list( diff --git a/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm b/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm index 47287197d4354..66ae237886de7 100644 --- a/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm +++ b/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm @@ -58,6 +58,8 @@ /// Used for air alarm helper called tlv_cold_room to adjust alarm thresholds for cold room. var/tlv_cold_room = FALSE + /// Used for air alarm helper called tlv_kitchen to adjust temperature thresholds for kitchen. + var/tlv_kitchen = FALSE /// Used for air alarm helper called tlv_no_ckecks to remove alarm thresholds. var/tlv_no_checks = FALSE @@ -695,6 +697,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 27) tlv_collection["temperature"] = new /datum/tlv/cold_room_temperature tlv_collection["pressure"] = new /datum/tlv/cold_room_pressure +///Used for air alarm kitchen tlv helper, which ensures that kitchen air alarm doesn't trigger from cold room air +/obj/machinery/airalarm/proc/set_tlv_kitchen() + tlv_collection["temperature"] = new /datum/tlv/kitchen_temperature + ///Used for air alarm no tlv helper, which removes alarm thresholds /obj/machinery/airalarm/proc/set_tlv_no_checks() tlv_collection["temperature"] = new /datum/tlv/no_checks diff --git a/code/modules/atmospherics/machinery/air_alarm/air_alarm_thresholds.dm b/code/modules/atmospherics/machinery/air_alarm/air_alarm_thresholds.dm index 197e0f520a61f..0d289a27031ae 100644 --- a/code/modules/atmospherics/machinery/air_alarm/air_alarm_thresholds.dm +++ b/code/modules/atmospherics/machinery/air_alarm/air_alarm_thresholds.dm @@ -109,3 +109,9 @@ hazard_min = COLD_ROOM_TEMP - 40 warning_max = COLD_ROOM_TEMP + 20 hazard_max = COLD_ROOM_TEMP + 40 + +/datum/tlv/kitchen_temperature + warning_min = COLD_ROOM_TEMP - 20 + hazard_min = COLD_ROOM_TEMP - 40 + warning_max = BODYTEMP_HEAT_WARNING_1-27 + hazard_max = BODYTEMP_HEAT_WARNING_1 diff --git a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm index b5cc7c628df29..e06b3b524580c 100644 --- a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm +++ b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm @@ -71,7 +71,6 @@ /obj/machinery/atmospherics/components/binary/crystallizer/update_overlays() . = ..() - cut_overlays() var/mutable_appearance/pipe_appearance1 = mutable_appearance('icons/obj/pipes_n_cables/pipe_underlays.dmi', "intact_[dir]_[piping_layer]", layer = GAS_SCRUBBER_LAYER) pipe_appearance1.color = COLOR_LIME var/mutable_appearance/pipe_appearance2 = mutable_appearance('icons/obj/pipes_n_cables/pipe_underlays.dmi', "intact_[REVERSE_DIR(dir)]_[piping_layer]", layer = GAS_SCRUBBER_LAYER) diff --git a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm index a7ad6f4664fb2..69bf48fe2aec1 100644 --- a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm +++ b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm @@ -1,6 +1,6 @@ /obj/item/hypernoblium_crystal name = "Hypernoblium Crystal" - desc = "Crystallized oxygen and hypernoblium stored in a bottle to pressureproof your clothes or stop reactions occurring in portable atmospheric devices." + desc = "Crystallized oxygen and hypernoblium stored in a bottle to pressure-proof your clothes or stop reactions occurring in portable atmospheric devices." icon = 'icons/obj/pipes_n_cables/atmos.dmi' icon_state = "hypernoblium_crystal" var/uses = 1 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 65a587578e595..bcc8bc9655092 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -248,7 +248,7 @@ beaker = tool balloon_alert(user, "beaker inserted") - user.log_message("added an [tool] to cryo containing [pretty_string_from_reagent_list(tool.reagents.reagent_list)].", LOG_GAME) + user.log_message("added \a [tool] to cryo containing [pretty_string_from_reagent_list(tool.reagents.reagent_list)].", LOG_GAME) return ITEM_INTERACT_SUCCESS /obj/machinery/cryo_cell/screwdriver_act(mob/living/user, obj/item/tool) @@ -595,7 +595,7 @@ if(!QDELETED(beaker)) beaker_data = list() beaker_data["maxVolume"] = beaker.volume - beaker_data["currentVolume"] = round(beaker.reagents.total_volume, CHEMICAL_VOLUME_ROUNDING) + beaker_data["currentVolume"] = beaker.reagents.total_volume var/list/beakerContents = list() if(length(beaker.reagents.reagent_list)) for(var/datum/reagent/reagent in beaker.reagents.reagent_list) diff --git a/code/modules/basketball/controller.dm b/code/modules/basketball/controller.dm index 4373c8d784a8d..20b3b0ecdaff2 100644 --- a/code/modules/basketball/controller.dm +++ b/code/modules/basketball/controller.dm @@ -192,6 +192,12 @@ GLOBAL_VAR(basketball_game) var/client/player_client = GLOB.directory[player_key] if(player_client) player_client.prefs.safe_transfer_prefs_to(baller, is_antag = TRUE) + if(player_client.mob.mind) + baller.AddComponent( \ + /datum/component/temporary_body, \ + old_mind = player_client.mob.mind, \ + old_body = player_client.mob.mind.current, \ + ) baller.key = player_key SEND_SOUND(baller, sound('sound/items/whistle/whistle.ogg', volume=30)) diff --git a/code/modules/bitrunning/components/avatar_gear.dm b/code/modules/bitrunning/components/avatar_gear.dm new file mode 100644 index 0000000000000..be7ede816feb4 --- /dev/null +++ b/code/modules/bitrunning/components/avatar_gear.dm @@ -0,0 +1,67 @@ + +/// Tracks the highest up human carrying this item, and loads bitrunning gear onto their avatar when they enter a virtual domain +/datum/component/loads_avatar_gear + /// The callback called when COMSIG_BITRUNNER_STOCKING_GEAR is sent to our host human + var/datum/callback/load_callback + /// Weakref to the human we are currently carried by + var/datum/weakref/tracked_human_ref + +/datum/component/loads_avatar_gear/Initialize(datum/callback/load_callback) + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + + src.load_callback = load_callback + +/datum/component/loads_avatar_gear/RegisterWithParent() + RegisterSignal(parent, COMSIG_ATOM_ENTERING, PROC_REF(on_entered_loc)) + + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERING = PROC_REF(on_entered_loc), + ) + AddComponent(/datum/component/connect_containers, parent, loc_connections) + +/datum/component/loads_avatar_gear/UnregisterFromParent() + UnregisterSignal(parent, list( + COMSIG_ATOM_ENTERING, + )) + + qdel(GetComponent(/datum/component/connect_containers)) + +/datum/component/loads_avatar_gear/Destroy(force) + load_callback = null + tracked_human_ref = null + return ..() + + +/datum/component/loads_avatar_gear/proc/on_entered_loc(datum/source, atom/destination, atom/old_loc, list/atom/old_locs) + SIGNAL_HANDLER + + // No need to do checks if we're just moving turfs + if(isturf(destination) && isturf(old_loc)) + return + + // Iterate over list in reverse so we get the topmost human first + // Because it's funnier if you get to use the avatar gear of the people you're carrying + var/list/nested_locs = get_nested_locs(parent) + for(var/i in length(nested_locs) to 1 step -1) + var/atom/container = nested_locs[i] + if(ishuman(container)) + switch_tracking(container) + return + + // No humans found, stop tracking + switch_tracking(null) + +/datum/component/loads_avatar_gear/proc/switch_tracking(mob/living/carbon/human/to_track) + var/mob/living/carbon/human/tracked_human = tracked_human_ref?.resolve() + if(tracked_human == to_track) + return + + if(tracked_human) + UnregisterSignal(tracked_human, COMSIG_BITRUNNER_STOCKING_GEAR) + tracked_human_ref = WEAKREF(to_track) + RegisterSignal(to_track, COMSIG_BITRUNNER_STOCKING_GEAR, PROC_REF(load_onto_avatar)) + +/datum/component/loads_avatar_gear/proc/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, external_load_flags) + SIGNAL_HANDLER + return load_callback?.Invoke(neo, avatar, external_load_flags) diff --git a/code/modules/bitrunning/objects/disks.dm b/code/modules/bitrunning/objects/disks.dm index dd81a0f463ed0..b51a1dd076c89 100644 --- a/code/modules/bitrunning/objects/disks.dm +++ b/code/modules/bitrunning/objects/disks.dm @@ -19,6 +19,10 @@ icon_state = "[base_icon_state][rand(0, 7)]" update_icon() + AddComponent(/datum/component/loads_avatar_gear, \ + load_callback = CALLBACK(src, PROC_REF(load_onto_avatar)), \ + ) + /obj/item/bitrunning_disk/examine(mob/user) . = ..() . += span_infoplain("This disk must be carried on your person into a netpod to be used.") @@ -30,6 +34,11 @@ . += span_info("It has been used to select: [choice_made].") . += span_notice("It cannot make another selection.") +/// Handles loading our stuff onto avatars +/obj/item/bitrunning_disk/proc/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, external_load_flags) + return NONE + + /obj/item/bitrunning_disk/ability desc = "A disk containing source code. It can be used to preload abilities into the virtual domain. Duplicate abilities will be ignored." /// The selected ability that this grants @@ -37,6 +46,20 @@ /// The list of actions that this can grant var/list/datum/action/selectable_actions = list() +/obj/item/bitrunning_disk/ability/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, external_load_flags) + if(external_load_flags & DOMAIN_FORBIDS_ABILITIES) + return BITRUNNER_GEAR_LOAD_BLOCKED + + if(isnull(granted_action)) + return BITRUNNER_GEAR_LOAD_FAILED + + if(locate(granted_action) in avatar.actions) + return BITRUNNER_GEAR_LOAD_FAILED + + var/datum/action/our_action = new granted_action() + our_action.Grant(avatar) + return NONE + /obj/item/bitrunning_disk/ability/attack_self(mob/user, modifiers) . = ..() @@ -87,6 +110,7 @@ /datum/action/cooldown/spell/shapeshift/polar_bear, ) + /obj/item/bitrunning_disk/item desc = "A disk containing source code. It can be used to preload items into the virtual domain." /// The selected item that this grants @@ -94,6 +118,16 @@ /// The list of actions that this can grant var/list/obj/selectable_items = list() +/obj/item/bitrunning_disk/item/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, external_load_flags) + if(external_load_flags & DOMAIN_FORBIDS_ITEMS) + return BITRUNNER_GEAR_LOAD_BLOCKED + + if(isnull(granted_item)) + return BITRUNNER_GEAR_LOAD_FAILED + + avatar.put_in_hands(new granted_item()) + return NONE + /obj/item/bitrunning_disk/item/attack_self(mob/user, modifiers) . = ..() diff --git a/code/modules/bitrunning/objects/gimmick_disks/_gimmick_disk.dm b/code/modules/bitrunning/objects/gimmick_disks/_gimmick_disk.dm new file mode 100644 index 0000000000000..2580d8620c76e --- /dev/null +++ b/code/modules/bitrunning/objects/gimmick_disks/_gimmick_disk.dm @@ -0,0 +1,115 @@ + +/** + * Bitrunning tech disks which let you load full loadouts into the vdom on first avatar generation. + */ +/obj/item/bitrunning_disk/gimmick + desc = "A disk containing source code. It can be used to preload gimmick loadouts into the virtual domain." + /// The selected loadout that this grants + var/datum/bitrunning_gimmick/granted_loadout + /// The list of loadouts that this can grant + var/list/datum/bitrunning_gimmick/selectable_loadouts + +/obj/item/bitrunning_disk/gimmick/Destroy() + QDEL_NULL(granted_loadout) + return ..() + +/obj/item/bitrunning_disk/gimmick/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, external_load_flags) + if(isnull(granted_loadout)) + return BITRUNNER_GEAR_LOAD_FAILED + return granted_loadout.grant_loadout(neo, avatar, external_load_flags) + +/obj/item/bitrunning_disk/gimmick/attack_self(mob/user, modifiers) + . = ..() + + if(granted_loadout) + return + + var/names = list() + for(var/datum/bitrunning_gimmick/loadout as anything in selectable_loadouts) + names += initial(loadout.name) + + var/choice = tgui_input_list(user, message = "Select a gimmick loadout", title = "Bitrunning Program", items = names) + if(isnull(choice) || !user.is_holding(src)) + return + + for(var/datum/bitrunning_gimmick/loadout as anything in selectable_loadouts) + if(initial(loadout.name) == choice) + granted_loadout = new loadout() + + balloon_alert(user, "selected") + playsound(user, 'sound/items/click.ogg', 50, TRUE) + choice_made = choice + + +/** + * The datum used by the gimmick loadout disk to determine what a loadout actually spawns. + */ +/datum/bitrunning_gimmick + /// Player readable name of the gimmick loadout + var/name = "Gimmick Loadout" + /// The list of actions that this will grant + var/list/datum/action/granted_actions + /// The list of items that this will grant + var/list/obj/item/granted_items + /// The item type we will use as a container for our granted items, given to the avatar + var/obj/item/container_item_type = /obj/item/storage/briefcase/secure/digital_storage + /// Prefix our name onto the + var/prefix_container_name = TRUE + +/// Grants out loadout. +/datum/bitrunning_gimmick/proc/grant_loadout(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, external_load_flags) + var/return_flags = NONE + return_flags |= grant_items(neo, avatar, external_load_flags) + return_flags |= grant_abilities(neo, avatar, external_load_flags) + return return_flags + +/datum/bitrunning_gimmick/proc/grant_items(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, external_load_flags) + if(!length(granted_items)) + return NONE + + if(external_load_flags & DOMAIN_FORBIDS_ITEMS) + return BITRUNNER_GEAR_LOAD_BLOCKED + + var/obj/item/container_item = new container_item_type() + if(prefix_container_name) + container_item.name = "[LOWER_TEXT(name)]'s [initial(container_item.name)]" + + for(var/obj/item/granted_item as anything in granted_items) + new granted_item(container_item) + + avatar.put_in_hands(container_item) + + return NONE + +/datum/bitrunning_gimmick/proc/grant_abilities(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, external_load_flags) + if(!length(granted_actions)) + return NONE + + if(external_load_flags & DOMAIN_FORBIDS_ABILITIES) + return BITRUNNER_GEAR_LOAD_BLOCKED + + var/return_flags = NONE + + for(var/datum/action/granted_action as anything in granted_actions) + if(locate(granted_action) in avatar.actions) + return_flags |= BITRUNNER_GEAR_LOAD_FAILED + continue + + var/datum/action/our_action = new granted_action() + our_action.Grant(avatar) + + return return_flags + + +/** + * Base container used for gimmick disks. + */ +/obj/item/storage/briefcase/secure/digital_storage + name = "digi-case" + desc = "It's made of AUTHENTIC digital leather and has a price-tag still attached. Its owner must be a real professional." + icon_state = "secure" + base_icon_state = "secure" + inhand_icon_state = "sec-case" + +/obj/item/storage/briefcase/secure/digital_storage/PopulateContents() + return diff --git a/code/modules/bitrunning/objects/gimmick_disks/dungeon_disk.dm b/code/modules/bitrunning/objects/gimmick_disks/dungeon_disk.dm new file mode 100644 index 0000000000000..559c7f022dfad --- /dev/null +++ b/code/modules/bitrunning/objects/gimmick_disks/dungeon_disk.dm @@ -0,0 +1,226 @@ + +/** + * Bitrunning gimmick loadouts themed around dungeon crawling. + * Mostly for fun, have niche but not insignificant advantages. + */ +/obj/item/bitrunning_disk/gimmick/dungeon + name = "bitrunning gimmick: dungeon crawling" + selectable_loadouts = list( + /datum/bitrunning_gimmick/alchemist, + /datum/bitrunning_gimmick/rogue, + /datum/bitrunning_gimmick/healer, + /datum/bitrunning_gimmick/wizard, + ) + + +/datum/bitrunning_gimmick/alchemist + name = "Alchemist" + + granted_items = list( + /obj/item/clothing/suit/bio_suit/plaguedoctorsuit, + /obj/item/clothing/mask/gas/plaguedoctor, + /obj/item/clothing/head/bio_hood/plague, + /obj/item/storage/box/alchemist_basic_chems, + /obj/item/storage/box/alchemist_basic_chems, + /obj/item/storage/box/alchemist_random_chems, + /obj/item/storage/box/alchemist_chemistry_kit, + ) + +/obj/item/reagent_containers/cup/bottle/alchemist_basic + name = "unlabeled bottle" + desc = "A small bottle. You don't remember what you put in it." + + /// List of possible reagents we may pick from + var/static/list/possible_reagents = list( + /datum/reagent/aluminium, // Basic chems + /datum/reagent/bromine, + /datum/reagent/carbon, + /datum/reagent/chlorine, + /datum/reagent/copper, + /datum/reagent/consumable/ethanol, + /datum/reagent/fluorine, + /datum/reagent/hydrogen, + /datum/reagent/iodine, + /datum/reagent/iron, + /datum/reagent/lithium, + /datum/reagent/mercury, + /datum/reagent/nitrogen, + /datum/reagent/oxygen, + /datum/reagent/phosphorus, + /datum/reagent/potassium, + /datum/reagent/uranium/radium, + /datum/reagent/silicon, + /datum/reagent/sodium, + /datum/reagent/stable_plasma, + /datum/reagent/consumable/sugar, + /datum/reagent/sulfur, + /datum/reagent/toxin/acid, + /datum/reagent/water, + /datum/reagent/fuel, + /datum/reagent/toxin/leadacetate, // Funny chems + /datum/reagent/consumable/liquidgibs, + /datum/reagent/consumable/nutriment, + /datum/reagent/consumable/coffee, + ) + +/obj/item/reagent_containers/cup/bottle/alchemist_basic/add_initial_reagents() + var/our_reagent = pick(possible_reagents) + reagents.add_reagent(our_reagent, 50) + +/obj/item/reagent_containers/cup/bottle/alchemist_random + name = "skull-labeled bottle" + desc = "A small bottle. You don't remember what you put in it." + + /// List of random adjectives this bottle may have + var/static/list/possible_adjectives = list( + "unlabeled", + "skull-labeled", // Labels + "heart-labeled", + "explosion-labeled", + "fish-labeled", + "smiley-labeled", + "frown-labeled", + "interrobang-labeled", + "plus-labeled", + "d20-labeled", + "unreadably-labeled", + "black-labeled", + "empty-labeled", + "age-yellowed", // Qualities + "blood-tinged", + "ash-marred", + "claw-scratched", + "marker-marked", + "cracked", + "ominous", // Abstract + ) + +/obj/item/reagent_containers/cup/bottle/alchemist_random/Initialize(mapload) + . = ..() + name = "[pick(possible_adjectives)] bottle" + +/obj/item/reagent_containers/cup/bottle/alchemist_random/add_initial_reagents() + var/our_reagent = get_random_reagent_id() + var/our_amount = rand(20, 50) + reagents.add_reagent(our_reagent, our_amount) + +/obj/item/storage/box/alchemist_basic_chems + name = "box of alchemical bases" + desc = "Contains a set of basic reagents, for all your potion-making needs! If only you labeled them." + illustration = "beaker" + +/obj/item/storage/box/alchemist_basic_chems/PopulateContents() + for(var/i in 1 to 7) + if(prob(1)) + new /obj/item/reagent_containers/cup/glass/coffee(src) + continue + new /obj/item/reagent_containers/cup/bottle/alchemist_basic(src) + +/obj/item/storage/box/alchemist_random_chems + name = "box of potions" + desc = "An especially fancy box to keep your finished potions safe." + icon_state = "syndiebox" + illustration = "beaker" + +/obj/item/storage/box/alchemist_random_chems/PopulateContents() + for(var/i in 1 to 7) + if(prob(1)) + new /obj/item/reagent_containers/cup/glass/coffee(src) + continue + new /obj/item/reagent_containers/cup/bottle/alchemist_random(src) + +/obj/item/storage/box/alchemist_chemistry_kit + name = "box of alchemy tools" + desc = "Contains everything needed for the up and coming chemistry student to enact hazardous chemical mishaps in the comfort of their own home." + +/obj/item/storage/box/alchemist_chemistry_kit/PopulateContents() + new /obj/item/reagent_containers/cup/mortar(src) + new /obj/item/pestle(src) + new /obj/item/lighter/skull(src) + new /obj/item/ph_booklet(src) + new /obj/item/thermometer(src) + new /obj/item/storage/test_tube_rack/full(src) + new /obj/item/reagent_containers/cup/glass/coffee(src) + + +/datum/bitrunning_gimmick/rogue + name = "Rogue" + + granted_items = list( + /obj/item/clothing/under/color/black, + /obj/item/clothing/shoes/sneakers/black, + /obj/item/clothing/mask/facescarf/rogue, + /obj/item/clothing/glasses/eyepatch, + /obj/item/bedsheet/black/rogue_cape, + /obj/item/storage/belt/fannypack/black/rogue, + /obj/item/knife/combat/survival, + ) + +/obj/item/clothing/shoes/sneakers/black + name = "sneaker of SNEAKING" + +/obj/item/clothing/mask/facescarf/rogue + name = "cloth of DOOM" + greyscale_colors = "#292929" + +/obj/item/clothing/glasses/eyepatch + name = "eyepatch of SEALING" + +/obj/item/bedsheet/black/rogue_cape + name = "cape of DARKNESS" + +/obj/item/storage/belt/fannypack/black/rogue + name = "fannypack of ULTIMATE DESPAIR" + +/obj/item/storage/belt/fannypack/black/rogue/PopulateContents() + new /obj/item/food/drug/saturnx(src) + new /obj/item/reagent_containers/cup/blastoff_ampoule(src) + new /obj/item/reagent_containers/hypospray/medipen/methamphetamine(src) + + +/datum/bitrunning_gimmick/healer + name = "Healer" + + granted_items = list( + /obj/item/clothing/under/costume/singer/yellow, + /obj/item/clothing/shoes/singery, + /obj/item/rod_of_asclepius, + /obj/item/storage/medkit/surgery, + /obj/item/emergency_bed, + /obj/item/food/canned/larvae, + /obj/item/reagent_containers/dropper, + ) + + +/datum/bitrunning_gimmick/wizard + name = "Wizard" + + granted_items = list( + /obj/item/clothing/head/wizard/fake, + /obj/item/clothing/suit/wizrobe/fake, + /obj/item/clothing/glasses/eyepatch/medical/chuuni, + /obj/item/staff, + /obj/item/toy/eightball, + /obj/item/storage/fancy/cigarettes/cigpack_cannabis, + /obj/item/storage/box/matches, + ) + + granted_actions = list( + /datum/action/cooldown/spell/pointed/untie_shoes/digital, + /datum/action/cooldown/spell/smoke/digital, + ) + +/datum/action/cooldown/spell/pointed/untie_shoes/digital + name = "Untie Digi-Shoes" + spell_requirements = SPELL_REQUIRES_WIZARD_GARB + +/datum/action/cooldown/spell/smoke/digital + name = "Digi-Smoke" + desc = "This spell spawns a small cloud of smoke at your location." + + school = SCHOOL_CONJURATION + cooldown_time = 36 SECONDS + spell_requirements = SPELL_REQUIRES_WIZARD_GARB + + smoke_type = /datum/effect_system/fluid_spread/smoke + smoke_amt = 2 diff --git a/code/modules/bitrunning/objects/gimmick_disks/sports_disk.dm b/code/modules/bitrunning/objects/gimmick_disks/sports_disk.dm new file mode 100644 index 0000000000000..6be07b53d5844 --- /dev/null +++ b/code/modules/bitrunning/objects/gimmick_disks/sports_disk.dm @@ -0,0 +1,152 @@ + +/** + * Bitrunning gimmick loadouts themed around sports. + * Mostly for fun, have niche or little advantages. + */ +/obj/item/bitrunning_disk/gimmick/sports + name = "bitrunning gimmick: sports" + selectable_loadouts = list( + /datum/bitrunning_gimmick/boxer, + /datum/bitrunning_gimmick/skater, + /datum/bitrunning_gimmick/archer, + /datum/bitrunning_gimmick/fisher, + /datum/bitrunning_gimmick/gamer, + ) + + +/datum/bitrunning_gimmick/boxer + name = "Boxer" + + granted_items = list( + /obj/item/clothing/gloves/boxing/evil, + /obj/item/clothing/under/shorts/red, + /obj/item/reagent_containers/condiment/protein, + /obj/item/reagent_containers/cup/glass/drinkingglass/filled/protein_blend, + ) + +/obj/item/reagent_containers/cup/glass/drinkingglass/filled/protein_blend + name = "Protein Blend" + list_reagents = list(/datum/reagent/consumable/ethanol/protein_blend = 50) + + +/datum/bitrunning_gimmick/skater + name = "Skater" + + granted_items = list( + /obj/item/clothing/shoes/wheelys, + /obj/item/melee/skateboard, + /obj/item/clothing/suit/costume/wellworn_shirt/graphic, + /obj/item/clothing/head/soft/black, + /obj/item/clothing/shoes/sneakers/black, + /obj/item/storage/cans/sixenergydrink, + ) + +/obj/item/storage/cans/sixenergydrink + name = "energy drink bottle ring" + desc = "Holds six energy drink cans. Remember to recycle when you're done!" + + /// Pool of energy drinks tm we may add from + var/list/energy_drink_options = list( + /obj/item/reagent_containers/cup/soda_cans/space_mountain_wind = 50, + /obj/item/reagent_containers/cup/soda_cans/monkey_energy = 30, + /obj/item/reagent_containers/cup/soda_cans/volt_energy = 15, + /obj/item/reagent_containers/cup/soda_cans/thirteenloko = 5, + ) + +/obj/item/storage/cans/sixenergydrink/PopulateContents() + for(var/i in 1 to 6) + var/obj/item/chosen_energy_drink = pick_weight(energy_drink_options) + new chosen_energy_drink(src) + + +/datum/bitrunning_gimmick/archer + name = "Archer" + + granted_items = list( + /obj/item/clothing/under/costume/kimono, + /obj/item/clothing/shoes/sandal/alt, + /obj/item/storage/bag/quiver/endless, + /obj/item/gun/ballistic/bow/longbow, + /obj/item/ammo_casing/arrow/holy/blazing, + ) + +/obj/item/storage/bag/quiver/endless + name = "endless quiver" + desc = "Holds arrows for your bow. A deep digital void is contained within." + max_slots = 1 + +/obj/item/storage/bag/quiver/endless/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_ATOM_EXITED, PROC_REF(handle_removed)) + +/obj/item/storage/bag/quiver/endless/PopulateContents() + . = ..() + new arrow_path(src) + +/obj/item/storage/bag/quiver/endless/proc/handle_removed(datum/source, obj/item/gone) + new arrow_path(src) + + +/datum/bitrunning_gimmick/fisher + name = "Fisher" + + granted_items = list( + /obj/item/clothing/under/misc/overalls, + /obj/item/clothing/suit/jacket/miljacket, + /obj/item/clothing/head/soft/black, + /obj/item/clothing/shoes/jackboots, + /obj/item/storage/toolbox/fishing/small, + /obj/item/bait_can/worm/premium, + /obj/item/grenade/iedcasing/spawned, + /obj/item/stock_parts/power_store/cell/lead, + /obj/item/reagent_containers/cup/glass/bottle/beer/light, + ) + + +/datum/bitrunning_gimmick/gamer + name = "Gamer" + + granted_items = list( + /obj/item/clothing/under/suit/black_really, + /obj/item/clothing/shoes/laceup, + /obj/item/clothing/gloves/color/black, + /obj/item/clothing/glasses/sunglasses, + /obj/item/modular_computer/laptop/gamer, + /obj/item/storage/cans/sixgamerdrink, + ) + +/obj/item/storage/cans/sixgamerdrink + name = "gamer drink bottle ring" + desc = "Holds six gamer drink cans. Remember to recycle when you're done!" + + /// Pool of gamer drinks tm we may add from + var/list/gamer_drink_options = list( + /obj/item/reagent_containers/cup/soda_cans/pwr_game = 55, + /obj/item/reagent_containers/cup/soda_cans/space_mountain_wind = 15, + /obj/item/reagent_containers/cup/soda_cans/monkey_energy = 15, + /obj/item/reagent_containers/cup/soda_cans/volt_energy = 10, + /obj/item/reagent_containers/cup/soda_cans/thirteenloko = 5, + ) + +/obj/item/storage/cans/sixgamerdrink/PopulateContents() + for(var/i in 1 to 6) + var/obj/item/chosen_gamer_drink = pick_weight(gamer_drink_options) + new chosen_gamer_drink(src) + +/obj/item/modular_computer/laptop/gamer + desc = "A high-end laptop often used for metagaming." + device_theme = PDA_THEME_TERMINAL + starting_programs = list( + /datum/computer_file/program/themeify, + /datum/computer_file/program/filemanager, + /datum/computer_file/program/notepad, + /datum/computer_file/program/arcade/eazy, + /datum/computer_file/program/mafia, + ) + start_open = FALSE + +/obj/item/modular_computer/laptop/gamer/install_default_programs() + // Only install starting programs, we don't want the software downloading program from default programs + for(var/programs as anything in starting_programs) + var/datum/computer_file/program/program_type = new programs + store_file(program_type) diff --git a/code/modules/bitrunning/objects/quantum_console.dm b/code/modules/bitrunning/objects/quantum_console.dm index 9a0f48ae80b85..71b952c46e195 100644 --- a/code/modules/bitrunning/objects/quantum_console.dm +++ b/code/modules/bitrunning/objects/quantum_console.dm @@ -10,7 +10,7 @@ /obj/machinery/computer/quantum_console/Initialize(mapload, obj/item/circuitboard/circuit) . = ..() - desc = "Even in the distant year [CURRENT_STATION_YEAR], Nanostrasen is still using REST APIs. How grim." + desc = "Even in the distant year [CURRENT_STATION_YEAR], Nanotrasen is still using REST APIs. How grim." /obj/machinery/computer/quantum_console/post_machine_initialize() . = ..() diff --git a/code/modules/bitrunning/orders/tech.dm b/code/modules/bitrunning/orders/tech.dm index cb509fb625201..d14cf7bf1a143 100644 --- a/code/modules/bitrunning/orders/tech.dm +++ b/code/modules/bitrunning/orders/tech.dm @@ -31,6 +31,16 @@ purchase_path = /obj/item/bitrunning_disk/ability/tier3 desc = "This disk contains a program that lets you shapeshift into a lesser ashdrake, or a polar bear." +/datum/orderable_item/bitrunning_tech/gimmick_sports + cost_per_order = 750 + purchase_path = /obj/item/bitrunning_disk/gimmick/sports + desc = "This disk contains a program that lets you equip a sports-themed gimmick loadout." + +/datum/orderable_item/bitrunning_tech/gimmick_dungeon_crawling + cost_per_order = 1250 + purchase_path = /obj/item/bitrunning_disk/gimmick/dungeon + desc = "This disk contains a program that lets you equip a dungeon crawling-themed gimmick loadout." + /datum/orderable_item/bitrunning_tech/flip_skillchip purchase_path = /obj/item/skillchip/matrix_taunt cost_per_order = 1500 diff --git a/code/modules/bitrunning/server/obj_generation.dm b/code/modules/bitrunning/server/obj_generation.dm index 9d63e153eb347..eb0c20547f640 100644 --- a/code/modules/bitrunning/server/obj_generation.dm +++ b/code/modules/bitrunning/server/obj_generation.dm @@ -129,75 +129,48 @@ /// Scans over neo's contents for bitrunning tech disks. Loads the items or abilities onto the avatar. /obj/machinery/quantum_server/proc/stock_gear(mob/living/carbon/human/avatar, mob/living/carbon/human/neo, datum/lazy_template/virtual_domain/generated_domain) - var/domain_forbids_items = generated_domain.forbids_disk_items - var/domain_forbids_spells = generated_domain.forbids_disk_spells + var/domain_forbids_flags = generated_domain.external_load_flags + + //DOPPLER EDIT ADDITION BEGIN - BITRUNNING_PREFS_DISKS - Track if we've used multiple avatar preference disks, for avoiding overrides and displaying the failure message. + var/duplicate_prefs = FALSE + //DOPPLER EDIT ADDITION END var/import_ban = list() var/disk_ban = list() - if(domain_forbids_items) + if(domain_forbids_flags & DOMAIN_FORBIDS_ITEMS) import_ban += "smuggled digital equipment" disk_ban += "items" - if(domain_forbids_spells) + if(domain_forbids_flags & DOMAIN_FORBIDS_ABILITIES) import_ban += "imported_abilities" disk_ban += "powers" if(length(import_ban)) - to_chat(neo, span_warning("This domain forbids the use of [english_list(import_ban)], your disk [english_list(disk_ban)] will not be granted!")) - - var/failed = FALSE - //DOPPLER EDIT ADDITION BEGIN - BITRUNNING_PREFS_DISKS - Track if we've used multiple avatar preference disks, for avoiding overrides and displaying the failure message. - var/duplicate_prefs = FALSE - //DOPPLER EDIT ADDITION END - - // We don't need to bother going over the disks if neither of the types can be used. - if(domain_forbids_spells && domain_forbids_items) - return - for(var/obj/item/bitrunning_disk/disk in neo.get_contents()) - if(istype(disk, /obj/item/bitrunning_disk/ability) && !domain_forbids_spells) - var/obj/item/bitrunning_disk/ability/ability_disk = disk + to_chat(neo, span_warning("This domain forbids the use of [english_list(import_ban)], your externally loaded [english_list(disk_ban)] will not be granted!")) - if(isnull(ability_disk.granted_action)) - failed = TRUE - continue + var/return_flags = NONE + return_flags = SEND_SIGNAL(neo, COMSIG_BITRUNNER_STOCKING_GEAR, avatar, domain_forbids_flags) - var/datum/action/our_action = new ability_disk.granted_action() + if(return_flags & BITRUNNER_GEAR_LOAD_FAILED) + to_chat(neo, span_warning("At least one of your external data sources has encountered a failure in its loading process. Check for overlapping or inactive disks.")) + if(return_flags & BITRUNNER_GEAR_LOAD_BLOCKED) + to_chat(neo, span_warning("At least one of your external data sources has been blocked from fully loading. Check domain restrictions.")) - if(locate(our_action.type) in avatar.actions) - failed = TRUE - continue - - our_action.Grant(avatar) - continue - - if(istype(disk, /obj/item/bitrunning_disk/item) && !domain_forbids_items) - var/obj/item/bitrunning_disk/item/item_disk = disk - - if(isnull(item_disk.granted_item)) - failed = TRUE - continue - - avatar.put_in_hands(new item_disk.granted_item()) - - //DOPPLER EDIT ADDITION BEGIN - BITRUNNING_PREFS_DISKS - Handles our avatar preference disks, if present. + //DOPPLER EDIT ADDITION BEGIN - BITRUNNING_PREFS_DISKS - Handles our avatar preference disks, if present. + for(var/obj/item/bitrunning_disk/disk in neo.get_contents()) if(istype(disk, /obj/item/bitrunning_disk/preferences)) var/obj/item/bitrunning_disk/preferences/prefs_disk = disk var/datum/preferences/avatar_preference = prefs_disk.chosen_preference if(isnull(avatar_preference) || duplicate_prefs) - failed = TRUE continue - - if(!domain_forbids_spells) + if(!(domain_forbids_flags & DOMAIN_FORBIDS_ABILITIES)) avatar_preference.safe_transfer_prefs_to(avatar) SSquirks.AssignQuirks(avatar, prefs_disk.mock_client) - if(!domain_forbids_items && prefs_disk.include_loadout) + if(!(domain_forbids_flags & DOMAIN_FORBIDS_ITEMS) && prefs_disk.include_loadout) avatar.equip_outfit_and_loadout(/datum/outfit, avatar_preference) duplicate_prefs = TRUE - //DOPPLER EDIT ADDITION END - - if(failed) - to_chat(neo, span_warning("One of your disks failed to load. Check for duplicate or inactive disks.")) + //DOPPLER EDIT ADDITION END var/obj/item/organ/brain/neo_brain = neo.get_organ_slot(ORGAN_SLOT_BRAIN) for(var/obj/item/skillchip/skill_chip as anything in neo_brain?.skillchips) diff --git a/code/modules/bitrunning/server/threats.dm b/code/modules/bitrunning/server/threats.dm index 145cdc9ee2bbf..77d1c6b6cda59 100644 --- a/code/modules/bitrunning/server/threats.dm +++ b/code/modules/bitrunning/server/threats.dm @@ -113,7 +113,7 @@ var/datum/mind/ghost_mind = ghost.mind new_mob.key = ghost.key - if(ghost_mind?.current) + if(ghost_mind) new_mob.AddComponent(/datum/component/temporary_body, ghost_mind, ghost_mind.current, TRUE) var/datum/mind/antag_mind = new_mob.mind diff --git a/code/modules/bitrunning/spawners.dm b/code/modules/bitrunning/spawners.dm index 07e97837f522d..3ae116a4d71ce 100644 --- a/code/modules/bitrunning/spawners.dm +++ b/code/modules/bitrunning/spawners.dm @@ -9,7 +9,7 @@ /obj/effect/mob_spawn/ghost_role/human/virtual_domain/special(mob/living/spawned_mob, mob/mob_possessor) var/datum/mind/ghost_mind = mob_possessor.mind - if(ghost_mind?.current) // Preserves any previous bodies before making the switch + if(ghost_mind) // Preserves any previous bodies before making the switch spawned_mob.AddComponent(/datum/component/temporary_body, ghost_mind, ghost_mind.current, TRUE) ..() diff --git a/code/modules/bitrunning/virtual_domain/virtual_domain.dm b/code/modules/bitrunning/virtual_domain/virtual_domain.dm index f81f6186cbe6e..7467b8e4c5eca 100644 --- a/code/modules/bitrunning/virtual_domain/virtual_domain.dm +++ b/code/modules/bitrunning/virtual_domain/virtual_domain.dm @@ -37,10 +37,8 @@ * Player customization */ - /// If this domain blocks the use of items from disks, for whatever reason - var/forbids_disk_items = FALSE - /// If this domain blocks the use of spells from disks, for whatever reason - var/forbids_disk_spells = FALSE + /// Any restrictions this domain has on what external sources can load in + var/external_load_flags = NONE /// Any outfit that you wish to force on avatars. Overrides preferences var/datum/outfit/forced_outfit diff --git a/code/modules/capture_the_flag/ctf_game.dm b/code/modules/capture_the_flag/ctf_game.dm index 968e6e2953e95..17606b10d1504 100644 --- a/code/modules/capture_the_flag/ctf_game.dm +++ b/code/modules/capture_the_flag/ctf_game.dm @@ -153,7 +153,7 @@ player_mob.set_species(/datum/species/human) var/datum/mind/new_member_mind = new_team_member.mob.mind - if(new_member_mind?.current) + if(new_member_mind) player_mob.AddComponent( \ /datum/component/temporary_body, \ old_mind = new_member_mind, \ diff --git a/code/modules/capture_the_flag/ctf_map_loading.dm b/code/modules/capture_the_flag/ctf_map_loading.dm index 4c2f6b319e036..9e23d61747323 100644 --- a/code/modules/capture_the_flag/ctf_map_loading.dm +++ b/code/modules/capture_the_flag/ctf_map_loading.dm @@ -14,16 +14,8 @@ GLOBAL_DATUM(ctf_spawner, /obj/effect/landmark/ctf) /obj/effect/landmark/ctf/Destroy() if(map_bounds) for(var/turf/ctf_turf in block( - locate( - map_bounds[MAP_MINX], - map_bounds[MAP_MINY], - map_bounds[MAP_MINZ], - ), - locate( - map_bounds[MAP_MAXX], - map_bounds[MAP_MAXY], - map_bounds[MAP_MAXZ], - ) + map_bounds[MAP_MINX], map_bounds[MAP_MINY], map_bounds[MAP_MINZ], + map_bounds[MAP_MAXX], map_bounds[MAP_MAXY], map_bounds[MAP_MAXZ] )) ctf_turf.empty() GLOB.ctf_spawner = null diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm index a93fdc97d8e69..3eb8086c0a1da 100644 --- a/code/modules/cargo/bounties/assistant.dm +++ b/code/modules/cargo/bounties/assistant.dm @@ -49,7 +49,7 @@ /datum/bounty/item/assistant/statue name = "Statue" - description = "Central Command would like to commision an artsy statue for the lobby. Ship one out, when possible." + description = "Central Command would like to commission an artsy statue for the lobby. Ship one out, when possible." reward = CARGO_CRATE_VALUE * 4 wanted_types = list(/obj/structure/statue = TRUE) diff --git a/code/modules/cargo/bounties/mining.dm b/code/modules/cargo/bounties/mining.dm index 933581bfdf9e2..51de48a545f3b 100644 --- a/code/modules/cargo/bounties/mining.dm +++ b/code/modules/cargo/bounties/mining.dm @@ -32,7 +32,7 @@ /datum/bounty/item/mining/skull_helmet name = "Skull Helmet" - description = "Station 42's Head of Security has her birthday tomorrow! We want to suprise her with a fashionable skull helmet." + description = "Station 42's Head of Security has her birthday tomorrow! We want to surprise her with a fashionable skull helmet." reward = CARGO_CRATE_VALUE * 8 wanted_types = list(/obj/item/clothing/head/helmet/skull = TRUE) diff --git a/code/modules/cargo/bounties/security.dm b/code/modules/cargo/bounties/security.dm index 8281408c17967..c5617ab0dcdb2 100644 --- a/code/modules/cargo/bounties/security.dm +++ b/code/modules/cargo/bounties/security.dm @@ -84,7 +84,7 @@ /datum/bounty/item/security/contraband name = "Confiscated Contraband" - description = "The syndicate are constantly acting to subvert crewmates of Nanotrasen afilliated stations. Ship us your latest batch of confiscated contraband." + description = "The Syndicate is constantly acting to subvert crewmates of Nanotrasen-affiliated stations. Ship us your latest batch of confiscated contraband." reward = CARGO_CRATE_VALUE * 4 required_count = 5 wanted_types = list(/obj/item = TRUE) diff --git a/code/modules/cargo/bounties/special.dm b/code/modules/cargo/bounties/special.dm index 8f395b5152fb1..08a2a117f2606 100644 --- a/code/modules/cargo/bounties/special.dm +++ b/code/modules/cargo/bounties/special.dm @@ -31,7 +31,7 @@ /datum/bounty/item/adamantine name = "Adamantine" - description = "Nanotrasen's anomalous materials division is in desparate need of adamantine. Send them a large shipment and we'll make it worth your while." + description = "Nanotrasen's anomalous materials division is in desperate need of adamantine. Send them a large shipment and we'll make it worth your while." reward = CARGO_CRATE_VALUE * 70 required_count = 10 wanted_types = list(/obj/item/stack/sheet/mineral/adamantine = TRUE) diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index 7996cc0f8fa4f..5239ebceae2fb 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -43,7 +43,7 @@ Then the player gets the profit from selling his own wasted time. * Arguments: ** apply_elastic: if the price will change based on amount sold, where applicable ** delete_unsold: if the items that were not sold should be deleted - ** dry_run: if the item should be actually sold, or if its just a pirce test + ** dry_run: if the item should be actually sold, or if it's just a pirce test ** external_report: works as "transaction" object, pass same one in if you're doing more than one export in single go ** ignore_typecache: typecache containing types that should be completely ignored */ diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm index 1871d69eb452e..ed65563b02ca3 100644 --- a/code/modules/cargo/exports/large_objects.dm +++ b/code/modules/cargo/exports/large_objects.dm @@ -40,9 +40,8 @@ cost = CARGO_CRATE_VALUE * 0.5 // +0-400 depending on amount of reagents left var/contents_cost = CARGO_CRATE_VALUE * 0.8 -/datum/export/large/reagent_dispenser/get_cost(obj/O) - var/obj/structure/reagent_dispensers/D = O - var/ratio = D.reagents.total_volume / D.reagents.maximum_volume +/datum/export/large/reagent_dispenser/get_cost(obj/structure/reagent_dispensers/dispenser) + var/ratio = dispenser.reagents.total_volume / dispenser.reagents.maximum_volume return ..() + round(contents_cost * ratio) @@ -60,7 +59,6 @@ contents_cost = CARGO_CRATE_VALUE * 3.5 export_types = list(/obj/structure/reagent_dispensers/beerkeg) - /datum/export/large/pipedispenser cost = CARGO_CRATE_VALUE * 2.5 unit_name = "pipe dispenser" @@ -120,27 +118,26 @@ export_types = list(/obj/machinery/portable_atmospherics/canister) k_elasticity = 0.00033 -/datum/export/large/gas_canister/get_cost(obj/O) - var/obj/machinery/portable_atmospherics/canister/C = O +/datum/export/large/gas_canister/get_cost(obj/machinery/portable_atmospherics/canister/canister) var/worth = cost - var/datum/gas_mixture/canister_mix = C.return_air() + var/datum/gas_mixture/canister_mix = canister.return_air() var/canister_gas = canister_mix.gases var/list/gases_to_check = list( - /datum/gas/bz, - /datum/gas/nitrium, - /datum/gas/hypernoblium, - /datum/gas/miasma, - /datum/gas/tritium, - /datum/gas/pluoxium, - /datum/gas/freon, - /datum/gas/hydrogen, - /datum/gas/healium, - /datum/gas/proto_nitrate, - /datum/gas/zauker, - /datum/gas/helium, - /datum/gas/antinoblium, - /datum/gas/halon, - ) + /datum/gas/bz, + /datum/gas/nitrium, + /datum/gas/hypernoblium, + /datum/gas/miasma, + /datum/gas/tritium, + /datum/gas/pluoxium, + /datum/gas/freon, + /datum/gas/hydrogen, + /datum/gas/healium, + /datum/gas/proto_nitrate, + /datum/gas/zauker, + /datum/gas/helium, + /datum/gas/antinoblium, + /datum/gas/halon, + ) for(var/gasID in gases_to_check) canister_mix.assert_gas(gasID) diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm index 4070301bfbe39..86a4d4f3a4fb7 100644 --- a/code/modules/cargo/expressconsole.dm +++ b/code/modules/cargo/expressconsole.dm @@ -92,26 +92,17 @@ /obj/machinery/computer/cargo/express/proc/packin_up(forced = FALSE) // oh shit, I'm sorry meme_pack_data = list() // sorry for what? - if (!forced && !SSshuttle.initialized) // Subsystem is still sleeping, add ourselves to its buffer and abort - SSshuttle.express_consoles += src - return - for(var/pack in SSshuttle.supply_packs) // our quartermaster taught us not to be ashamed of our supply packs - var/datum/supply_pack/P = SSshuttle.supply_packs[pack] // specially since they're such a good price and all - if(!meme_pack_data[P.group]) // yeah, I see that, your quartermaster gave you good advice - meme_pack_data[P.group] = list( // it gets cheaper when I return it - "name" = P.group, // mmhm - "packs" = list() // sometimes, I return it so much, I rip the manifest - ) // see, my quartermaster taught me a few things too - if((P.hidden) || (P.special)) // like, how not to rip the manifest - continue// by using someone else's crate - if(P.contraband && !contraband) // will you show me? - continue // i'd be right happy to - meme_pack_data[P.group]["packs"] += list(list( - "name" = P.name, - "cost" = P.get_cost() * get_discount(), - "id" = pack, - "desc" = P.desc || P.name // If there is a description, use it. Otherwise use the pack's name. - )) + if(!forced && !SSshuttle.initialized) // our quartermaster taught us not to be ashamed of our supply packs + SSshuttle.express_consoles += src // specially since they're such a good price and all + return // yeah, I see that, your quartermaster gave you good advice + // it gets cheaper when I return it + for(var/pack_id in SSshuttle.supply_packs) // mmhm + var/datum/supply_pack/pack = SSshuttle.supply_packs[pack_id] // sometimes, I return it so much, I rip the manifest + if(!meme_pack_data[pack.group]) // see, my quartermaster taught me a few things too + meme_pack_data[pack.group] = list( // like, how not to rip the manifest + "name" = pack.group, // by using someone else's crate + "packs" = get_packs_data(pack.group, express = TRUE), // will you show me? + ) // i'd be right happy to /obj/machinery/computer/cargo/express/ui_data(mob/user) var/canBeacon = beacon && (isturf(beacon.loc) || ismob(beacon.loc))//is the beacon in a valid location? @@ -146,7 +137,7 @@ data["supplies"] = meme_pack_data return data -/obj/machinery/computer/cargo/express/proc/get_discount() +/obj/machinery/computer/cargo/express/get_discount() return (obj_flags & EMAGGED) ? EXPRESS_EMAG_DISCOUNT : 1 /obj/machinery/computer/cargo/express/ui_act(action, params, datum/tgui/ui) diff --git a/code/modules/cargo/goodies.dm b/code/modules/cargo/goodies.dm index 5abf8f2dd27f7..ee48e48e40303 100644 --- a/code/modules/cargo/goodies.dm +++ b/code/modules/cargo/goodies.dm @@ -78,11 +78,14 @@ desc = "For when the enemy absolutely needs to be replaced with lead. Contains one Aussec-designed Combat Shotgun, and one Shotgun Bandolier." cost = PAYCHECK_COMMAND * 15 access_view = ACCESS_ARMORY - contains = list(/obj/item/gun/ballistic/shotgun/automatic/combat, /obj/item/storage/belt/bandolier) + contains = list( + /obj/item/gun/ballistic/shotgun/automatic/combat, + /obj/item/storage/belt/bandolier + ) /datum/supply_pack/goody/disabler_single name = "Disabler Single-Pack" - desc = "Contains one disabler, the non-lethal workhorse of Nanotrasen security everywhere. Comes in a energy holster, just in case you happen to have an extra disabler." + desc = "Contains one disabler, the non-lethal workhorse of Nanotrasen security everywhere. Comes in an energy holster, just in case you happen to have an extra disabler." cost = PAYCHECK_COMMAND * 3 access_view = ACCESS_WEAPONS contains = list(/obj/item/storage/belt/holster/energy/disabler) @@ -214,7 +217,10 @@ name = "Medipen Two-Pak" desc = "Contains one standard epinephrine medipen and one standard emergency medkit medipen. For when you want to prepare for the worst." cost = PAYCHECK_CREW * 2 - contains = list(/obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/hypospray/medipen/ekit) + contains = list( + /obj/item/reagent_containers/hypospray/medipen, + /obj/item/reagent_containers/hypospray/medipen/ekit + ) /datum/supply_pack/goody/mothic_rations name = "Surplus Mothic Ration Pack" @@ -242,7 +248,7 @@ /datum/supply_pack/goody/fishing_toolbox name = "Fishing Toolbox" - desc = "Complete toolbox set for your fishing adventure. Contains a valuable tip. Advanced hooks and lines sold separetely." + desc = "Complete toolbox set for your fishing adventure. Contains a valuable tip. Advanced hooks and lines sold separately." cost = PAYCHECK_CREW * 2 contains = list(/obj/item/storage/toolbox/fishing) @@ -354,3 +360,9 @@ desc = "A single bottle of Interdyne brand experimental medication, used for treating people suffering from hereditary manifold disease." cost = PAYCHECK_CREW * 6.5 contains = list(/obj/item/storage/pill_bottle/sansufentanyl) + +/datum/supply_pack/goody/pet_mouse + name = "Pet Mouse" + desc = "Many people consider mice to be vermin, or dirty lab animals for experimentation, or a culinary delicacy. That's why we're not asking any questions, here." + cost = PAYCHECK_CREW * 1.5 + contains = list(/obj/item/pet_carrier/small/mouse) diff --git a/code/modules/cargo/markets/market_items/clothing.dm b/code/modules/cargo/markets/market_items/clothing.dm index ee0ae6e0a3997..bfa34867068bd 100644 --- a/code/modules/cargo/markets/market_items/clothing.dm +++ b/code/modules/cargo/markets/market_items/clothing.dm @@ -72,7 +72,7 @@ /datum/market_item/clothing/rocket_boots name = "Rocket Boots" - desc = "We found a pair of jump boots and overclocked the hell out of them. No liability for grevious harm to or with a body." + desc = "We found a pair of jump boots and overclocked the hell out of them. No liability for grievous harm to or with a body." item = /obj/item/clothing/shoes/bhop/rocket price_min = CARGO_CRATE_VALUE * 5 diff --git a/code/modules/cargo/markets/market_items/hostages.dm b/code/modules/cargo/markets/market_items/hostages.dm index 702cea907bdeb..518ba0c9cf35e 100644 --- a/code/modules/cargo/markets/market_items/hostages.dm +++ b/code/modules/cargo/markets/market_items/hostages.dm @@ -20,7 +20,7 @@ specimen = humie.dna.species.name desc = pick(list( "If you're looking for a recently stolen [specimen], you've come to the right place.", - "we've recently aquired a fine [specimen] from a station around here, eheh...", + "We've recently acquired a fine [specimen] from a station around here, eheh...", "For a limited time, we're offering this [specimen] for you to buy (back).", )) desc += " DISCLAIMER: The offer will expire once the creature is returned to the station." diff --git a/code/modules/cargo/markets/market_items/misc.dm b/code/modules/cargo/markets/market_items/misc.dm index a35d85fa7ccca..2bbbe3f3a3ad3 100644 --- a/code/modules/cargo/markets/market_items/misc.dm +++ b/code/modules/cargo/markets/market_items/misc.dm @@ -24,7 +24,7 @@ /datum/market_item/misc/cap_gun name = "Cap Gun" - desc = "Prank your friends with this harmless gun! Harmlessness guranteed." + desc = "Prank your friends with this harmless gun! Harmlessness guaranteed." item = /obj/item/toy/gun price_min = CARGO_CRATE_VALUE * 0.25 @@ -44,7 +44,7 @@ /datum/market_item/misc/donk_recycler name = "MOD Riot Foam Dart Recycler Module" - desc = "If you love toy guns, hate cleaning and got a MODsuit, this module is a must have." + desc = "If you love toy guns, hate cleaning and got a MODsuit, this module is a must-have." item = /obj/item/mod/module/recycler/donk price_min = CARGO_CRATE_VALUE * 2 price_max = CARGO_CRATE_VALUE * 4.5 @@ -136,7 +136,7 @@ /datum/market_item/misc/jawed_hook name = "Jawed Fishing Hook" - desc = "The thing ya use if y'are strugglin' with fishes. Just rememeber to whoop yer rod before it's too late, 'cause this thing's gonna hurt them like an Arkansas toothpick." + desc = "The thing ya use if y'are strugglin' with fishes. Just remember to whoop yer rod before it's too late, 'cause this thing's gonna hurt them like an Arkansas toothpick." item = /obj/item/fishing_hook/jaws price_min = CARGO_CRATE_VALUE * 0.75 price_max = CARGO_CRATE_VALUE * 2 diff --git a/code/modules/cargo/markets/market_items/tools.dm b/code/modules/cargo/markets/market_items/tools.dm index 0c9969756d30f..d8acad9e0dcee 100644 --- a/code/modules/cargo/markets/market_items/tools.dm +++ b/code/modules/cargo/markets/market_items/tools.dm @@ -102,7 +102,7 @@ /datum/market_item/tool/program_disk name = "Bootleg Data Disk" - desc = "A data disk containing EXCLUSIVE and LIMITED modular programs. Legally, we're not allowed to tell you how we aquired them." + desc = "A data disk containing EXCLUSIVE and LIMITED modular programs. Legally, we're not allowed to tell you how we acquired them." item = /obj/item/computer_disk/black_market price_min = CARGO_CRATE_VALUE * 0.75 price_max = CARGO_CRATE_VALUE * 2 diff --git a/code/modules/cargo/markets/market_items/weapons.dm b/code/modules/cargo/markets/market_items/weapons.dm index f9fd6245c8d99..954dfd63b679f 100644 --- a/code/modules/cargo/markets/market_items/weapons.dm +++ b/code/modules/cargo/markets/market_items/weapons.dm @@ -26,13 +26,13 @@ /datum/market_item/weapon/buckshot name = "Box of Buckshot Shells" - desc = "It wasn't easy since buckshot has been made illegal all over this sector of space, but \ - we managed to find a large cache of it... somewhere. A word of caution, the stuff may be a tad old." - stock_max = 3 + desc = "It wasn't easy since buckshot is so heavily taxed nowadays, but we managed to find \ + a large cache of it... somewhere. A word of caution, the stuff may be a tad old." + stock_max = 7 availability_prob = 35 - item = /obj/item/storage/box/lethalshot/old - price_min = CARGO_CRATE_VALUE * 3 - price_max = CARGO_CRATE_VALUE * 4.5 + item = /obj/effect/spawner/random/armory/buckshot/sketchy + price_min = CARGO_CRATE_VALUE * 1 + price_max = CARGO_CRATE_VALUE * 3 /datum/market_item/weapon/bone_spear name = "Bone Spear" diff --git a/code/modules/cargo/markets/market_uplink.dm b/code/modules/cargo/markets/market_uplink.dm index 17cad32042668..3c60bc29a7b65 100644 --- a/code/modules/cargo/markets/market_uplink.dm +++ b/code/modules/cargo/markets/market_uplink.dm @@ -1,6 +1,6 @@ /obj/item/market_uplink name = "\improper Market Uplink" - desc = "An market uplink. Usable with markets. You probably shouldn't have this!" + desc = "A market uplink. Usable with markets. You probably shouldn't have this!" icon = 'icons/obj/devices/blackmarket.dmi' icon_state = "uplink" diff --git a/code/modules/cargo/orderconsole.dm b/code/modules/cargo/orderconsole.dm index 87a085707c0c3..e26c0ba739195 100644 --- a/code/modules/cargo/orderconsole.dm +++ b/code/modules/cargo/orderconsole.dm @@ -95,9 +95,9 @@ var/list/data = list() data["department"] = "Cargo" // Hardcoded here, for customization in budgetordering.dm AKA NT IRN data["location"] = SSshuttle.supply.getStatusText() - var/datum/bank_account/D = SSeconomy.get_dep_account(cargo_account) - if(D) - data["points"] = D.account_balance + var/datum/bank_account/bank = SSeconomy.get_dep_account(cargo_account) + if(bank) + data["points"] = bank.account_balance data["grocery"] = SSshuttle.chef_groceries.len data["away"] = SSshuttle.supply.getDockedId() == docking_away data["self_paid"] = self_paid @@ -162,25 +162,61 @@ var/list/data = list() data["max_order"] = CARGO_MAX_ORDER data["supplies"] = list() - for(var/pack in SSshuttle.supply_packs) - var/datum/supply_pack/P = SSshuttle.supply_packs[pack] - if(!data["supplies"][P.group]) - data["supplies"][P.group] = list( - "name" = P.group, - "packs" = list() + + for(var/pack_id in SSshuttle.supply_packs) + var/datum/supply_pack/pack = SSshuttle.supply_packs[pack_id] + if(!data["supplies"][pack.group]) + data["supplies"][pack.group] = list( + "name" = pack.group, + "packs" = get_packs_data(pack.group), ) - if((P.hidden && !(obj_flags & EMAGGED)) || (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.drop_pod_only) + + return data + +/** + * returns a list of supply packs for a certain group + * * group - the group of packs to return + * * express - if this is an express console + */ +/obj/machinery/computer/cargo/proc/get_packs_data(group, express = FALSE) + var/list/packs = list() + for(var/pack_id in SSshuttle.supply_packs) + var/datum/supply_pack/pack = SSshuttle.supply_packs[pack_id] + if(pack.group != group) continue - data["supplies"][P.group]["packs"] += list(list( - "name" = P.name, - "cost" = P.get_cost(), - "id" = pack, - "desc" = P.desc || P.name, // If there is a description, use it. Otherwise use the pack's name. - "goody" = P.goody, - "access" = P.access, - "contraband" = P.contraband, + + // Express console packs check + if(express && (pack.hidden || pack.special)) + continue + + if(!express && ((pack.hidden && !(obj_flags & EMAGGED)) || (pack.special && !pack.special_enabled) || pack.drop_pod_only)) + continue + + if(pack.contraband && !contraband) + continue + + var/obj/item/first_item = length(pack.contains) > 0 ? pack.contains[1] : null + packs += list(list( + "name" = pack.name, + "cost" = pack.get_cost() * get_discount(), + "id" = pack_id, + "desc" = pack.desc || pack.name, // If there is a description, use it. Otherwise use the pack's name. + "first_item_icon" = first_item?.icon, + "first_item_icon_state" = first_item?.icon_state, + "goody" = pack.goody, + "access" = pack.access, + "contraband" = pack.contraband, + "contains" = pack.get_contents_ui_data(), )) - return data + + return packs + +/** + * returns the discount multiplier applied to all supply packs, + * the discount is calculated as follows: pack_cost * get_discount() + */ +/obj/machinery/computer/cargo/proc/get_discount() + return 1 /** * adds an supply pack to the checkout cart diff --git a/code/modules/cargo/packs/_packs.dm b/code/modules/cargo/packs/_packs.dm index bfa95b2a7ed25..94f71245882e5 100644 --- a/code/modules/cargo/packs/_packs.dm +++ b/code/modules/cargo/packs/_packs.dm @@ -45,6 +45,20 @@ /datum/supply_pack/New() id = type +/// Returns data used for cargo purchasing UI +/datum/supply_pack/proc/get_contents_ui_data() + var/list/data = list() + for(var/obj/item/item as anything in contains) + var/list/item_data = list( + "name" = item.name, + "icon" = item.greyscale_config ? null : item.icon, + "icon_state" = item.greyscale_config ? null : item.icon_state, + "amount" = contains[item] + ) + UNTYPED_LIST_ADD(data, item_data) + + return data + /datum/supply_pack/proc/generate(atom/A, datum/bank_account/paying_account) var/obj/structure/closet/crate/C if(paying_account) diff --git a/code/modules/cargo/packs/imports.dm b/code/modules/cargo/packs/imports.dm index 8720cb554fd43..c1aa946319e92 100644 --- a/code/modules/cargo/packs/imports.dm +++ b/code/modules/cargo/packs/imports.dm @@ -97,6 +97,21 @@ crate_name = "putrid dumpster" crate_type = /obj/structure/closet/crate/trashcart +/datum/supply_pack/imports/shells + name = "Lethal Shotgun Shell Box Crate" + desc = "Contains three boxes of buckshot shotgun shells. \ + Due to Nanotrasen's failure to secure exclusive manufacturing rights \ + during the Spinward Hunting and Shooting policy hearings, this import \ + is heavily taxed, despite being 'legal'. I hope the price tag is worth it." + cost = CARGO_CRATE_VALUE * 10 + access = ACCESS_ARMORY + access_view = ACCESS_ARMORY + contains = list( + /obj/item/storage/box/lethalshot = 3, + ) + crate_name = "shotgun shell crate" + crate_type = /obj/structure/closet/crate/secure/weapon + /datum/supply_pack/imports/error name = "NULL_ENTRY" desc = "(*!&@#OKAY, OPERATIVE, WE SEE HOW MUCH MONEY YOU'RE FLAUNTING. FINE. HAVE THIS, AND GOOD LUCK PUTTING IT TOGETHER!#@*$" @@ -203,7 +218,7 @@ /obj/item/ammo_box/strilka310/surplus, /obj/item/storage/toolbox/ammobox/strilka310, /obj/item/storage/toolbox/ammobox/strilka310/surplus, - /obj/item/storage/toolbox/maint_kit, + /obj/item/gun_maintenance_supplies, /obj/item/clothing/suit/armor/vest/russian, /obj/item/clothing/head/helmet/rus_helmet, /obj/item/clothing/shoes/russian, diff --git a/code/modules/cargo/packs/materials.dm b/code/modules/cargo/packs/materials.dm index ba9a162698bb8..bfda2f7f9b197 100644 --- a/code/modules/cargo/packs/materials.dm +++ b/code/modules/cargo/packs/materials.dm @@ -25,7 +25,7 @@ /datum/supply_pack/materials/sandstone30 name = "30 Sandstone Blocks" - desc = "Neither sandy nor stoney, these thirty blocks will still get the job done." + desc = "Neither sandy nor stony, these thirty blocks will still get the job done." cost = CARGO_CRATE_VALUE * 2 contains = list(/obj/item/stack/sheet/mineral/sandstone/thirty) crate_name = "sandstone blocks crate" diff --git a/code/modules/cargo/packs/organic.dm b/code/modules/cargo/packs/organic.dm index a47c92fabc449..294179bf10732 100644 --- a/code/modules/cargo/packs/organic.dm +++ b/code/modules/cargo/packs/organic.dm @@ -10,10 +10,8 @@ desc = "Bee business booming? Better be benevolent and boost botany by \ bestowing bi-Beekeeper-suits! Contains two beekeeper suits and matching headwear." cost = CARGO_CRATE_VALUE * 2 - contains = list(/obj/item/clothing/head/utility/beekeeper_head, - /obj/item/clothing/suit/utility/beekeeper_suit, - /obj/item/clothing/head/utility/beekeeper_head, - /obj/item/clothing/suit/utility/beekeeper_suit, + contains = list(/obj/item/clothing/head/utility/beekeeper_head = 2, + /obj/item/clothing/suit/utility/beekeeper_suit = 2, ) crate_name = "beekeeper suits" crate_type = /obj/structure/closet/crate/hydroponics @@ -363,8 +361,7 @@ desc = "A packaged box containing illegal coffee syrups. Possession of these carries a penalty established in the galactic penal code." cost = CARGO_CRATE_VALUE * 6 contains = list( - /obj/item/reagent_containers/cup/bottle/syrup_bottle/laughsyrup, - /obj/item/reagent_containers/cup/bottle/syrup_bottle/laughsyrup, + /obj/item/reagent_containers/cup/bottle/syrup_bottle/laughsyrup = 2, ) crate_name = "illegal syrups box" crate_type = /obj/structure/closet/crate/cardboard diff --git a/code/modules/cargo/packs/science.dm b/code/modules/cargo/packs/science.dm index 6b4f38b95a03a..fe85c3c07a816 100644 --- a/code/modules/cargo/packs/science.dm +++ b/code/modules/cargo/packs/science.dm @@ -61,7 +61,7 @@ /datum/supply_pack/science/raw_ectoplasm_anomaly name = "Raw Ectoplasm Anomaly" - desc = "Contains the raw core of a ectoplasm anomaly, ready to be implosion-compressed into a powerful artifact." + desc = "Contains the raw core of an ectoplasm anomaly, ready to be implosion-compressed into a powerful artifact." cost = CARGO_CRATE_VALUE * 10 access = ACCESS_ORDNANCE access_view = ACCESS_ORDNANCE diff --git a/code/modules/cargo/packs/security.dm b/code/modules/cargo/packs/security.dm index 612e9f5b3f92c..8227305f743a4 100644 --- a/code/modules/cargo/packs/security.dm +++ b/code/modules/cargo/packs/security.dm @@ -113,6 +113,14 @@ ) crate_name = "security supply crate" +/datum/supply_pack/security/maintenance_kits + name = "Gun Maintenance Kits" + desc = "Three gun maintenance kits for the repair and maintenance of a firearm." + access_view = ACCESS_BRIG + contains = list(/obj/item/gun_maintenance_supplies = 3) + cost = CARGO_CRATE_VALUE * 2 + crate_name = "gun maintenance kit crate" + /datum/supply_pack/security/firingpins name = "Standard Firing Pins Crate" desc = "Upgrade your arsenal with 10 standard firing pins." diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index bbec372028f52..1b2dbb08130f3 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -82,7 +82,7 @@ /obj/structure/closet/supplypod/extractionpod name = "Syndicate Extraction Pod" - desc = "A specalised, blood-red styled pod for extracting high-value targets out of active mission areas. Targets must be manually stuffed inside the pod for proper delivery." + desc = "A specialised, blood-red styled pod for extracting high-value targets out of active mission areas. Targets must be manually stuffed inside the pod for proper delivery." specialised = TRUE style = /datum/pod_style/syndicate bluespace = TRUE @@ -677,7 +677,7 @@ stack_trace("Pod landingzone created with no pod") return INITIALIZE_HINT_QDEL if (ispath(podParam)) //We can pass either a path for a pod (as expressconsoles do), or a reference to an instantiated pod (as the centcom_podlauncher does) - podParam = new podParam() //If its just a path, instantiate it + podParam = new podParam() //If it's just a path, instantiate it pod = podParam pod.resistance_flags |= (INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF) if (!pod.effectStealth) diff --git a/code/modules/cargo/supplypod_beacon.dm b/code/modules/cargo/supplypod_beacon.dm index 976298bbc0b15..d8b5aafdb28cd 100644 --- a/code/modules/cargo/supplypod_beacon.dm +++ b/code/modules/cargo/supplypod_beacon.dm @@ -104,12 +104,16 @@ unlink_console() return CLICK_ACTION_SUCCESS -/obj/item/supplypod_beacon/attackby(obj/item/W, mob/user) - if(IS_WRITING_UTENSIL(W)) //give a tag that is visible from the linked express console - return ..() +/obj/item/supplypod_beacon/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!IS_WRITING_UTENSIL(tool)) + return NONE + var/new_beacon_name = tgui_input_text(user, "What would you like the tag to be?", "Beacon Tag", max_length = MAX_NAME_LEN) if(isnull(new_beacon_name)) - return - if(!user.can_perform_action(src)) - return - name += " ([tag])" + return ITEM_INTERACT_BLOCKING + + if(!user.can_perform_action(src) || !user.can_write(tool)) + return ITEM_INTERACT_BLOCKING + + name = "[initial(name)] ([new_beacon_name])" + return ITEM_INTERACT_SUCCESS diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index df19de2fb1ceb..16f0fd1deca5b 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -1192,19 +1192,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( fullscreen = !fullscreen - if (fullscreen) - winset(usr, "mainwindow", "on-size=") - winset(usr, "mainwindow", "titlebar=false") - winset(usr, "mainwindow", "can-resize=false") - winset(usr, "mainwindow", "menu=") - winset(usr, "mainwindow", "is-maximized=false") - winset(usr, "mainwindow", "is-maximized=true") - else - winset(usr, "mainwindow", "menu=menu") - winset(usr, "mainwindow", "titlebar=true") - winset(usr, "mainwindow", "can-resize=true") - winset(usr, "mainwindow", "is-maximized=false") - winset(usr, "mainwindow", "on-size=attempt_auto_fit_viewport") + winset(src, "mainwindow", "menu=;is-fullscreen=[fullscreen ? "true" : "false"]") attempt_auto_fit_viewport() /client/verb/toggle_status_bar() @@ -1214,9 +1202,9 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( show_status_bar = !show_status_bar if (show_status_bar) - winset(usr, "mapwindow.status_bar", "is-visible=true") + winset(src, "mapwindow.status_bar", "is-visible=true") else - winset(usr, "mapwindow.status_bar", "is-visible=false") + winset(src, "mapwindow.status_bar", "is-visible=false") /// Clears the client's screen, aside from ones that opt out /client/proc/clear_screen() diff --git a/code/modules/client/preferences/tgui.dm b/code/modules/client/preferences/tgui.dm index 9413a129e4e53..c09bba9740aa3 100644 --- a/code/modules/client/preferences/tgui.dm +++ b/code/modules/client/preferences/tgui.dm @@ -37,6 +37,27 @@ // Force it to reload either way tgui.send_full_update(client.mob) +/// Changes layout in some UI's, like Vending, Smartfridge etc. Making it list or grid +/datum/preference/choiced/tgui_layout + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "tgui_layout" + savefile_identifier = PREFERENCE_PLAYER + +/datum/preference/choiced/tgui_layout/init_possible_values() + return list( + TGUI_LAYOUT_DEFAULT, + TGUI_LAYOUT_GRID, + TGUI_LAYOUT_LIST, + ) + +/datum/preference/choiced/tgui_layout/create_default_value() + return TGUI_LAYOUT_DEFAULT + +/datum/preference/choiced/tgui_layout/apply_to_client(client/client, value) + for (var/datum/tgui/tgui as anything in client.mob?.tgui_open_uis) + // Force it to reload either way + tgui.update_static_data(client.mob) + /datum/preference/toggle/tgui_lock category = PREFERENCE_CATEGORY_GAME_PREFERENCES savefile_key = "tgui_lock" diff --git a/code/modules/client/verbs/who.dm b/code/modules/client/verbs/who.dm index 351fd17cdc162..0e2446a39d938 100644 --- a/code/modules/client/verbs/who.dm +++ b/code/modules/client/verbs/who.dm @@ -67,7 +67,7 @@ msg += "" msg += "Total Players: [length(Lines)]" - to_chat(src, fieldset_block(span_bold("Current Players"), span_infoplain(msg), "boxed_message"), type = MESSAGE_TYPE_OOC) + to_chat(src, fieldset_block(span_bold("Current Players"), span_infoplain(msg), "boxed_message"), type = MESSAGE_TYPE_INFO) /client/verb/adminwho() set category = "Admin" @@ -80,7 +80,7 @@ lines += span_bold(header) lines += payload_string - to_chat(src, fieldset_block(span_bold(header), jointext(lines, "\n"), "boxed_message"), type = MESSAGE_TYPE_OOC) + to_chat(src, fieldset_block(span_bold(header), jointext(lines, "\n"), "boxed_message"), type = MESSAGE_TYPE_INFO) /// Proc that generates the applicable string to dispatch to the client for adminwho. /client/proc/generate_adminwho_string() diff --git a/code/modules/clothing/chameleon/chameleon_action_subtypes.dm b/code/modules/clothing/chameleon/chameleon_action_subtypes.dm index 1c433f0c0d953..956b0892e3353 100644 --- a/code/modules/clothing/chameleon/chameleon_action_subtypes.dm +++ b/code/modules/clothing/chameleon/chameleon_action_subtypes.dm @@ -145,7 +145,7 @@ var/new_trim = initial(copied_card.trim) if(new_trim) - SSid_access.apply_trim_to_chameleon_card(agent_card, new_trim, TRUE) + SSid_access.apply_trim_override(agent_card, new_trim, TRUE) // If the ID card hasn't been forged, we'll check if there has been an assignment set already by any new trim. // If there has not, we set the assignment to the copied card's default as well as copying over the the @@ -182,7 +182,7 @@ var/new_trim = initial(job_outfit.id_trim) ? initial(job_outfit.id_trim) : initial(copied_card.trim) if(new_trim) - SSid_access.apply_trim_to_chameleon_card(agent_card, new_trim, FALSE) + SSid_access.apply_trim_override(agent_card, new_trim, FALSE) else agent_card.assignment = job_datum.title @@ -229,7 +229,7 @@ /datum/action/item_action/chameleon/change/id_trim/update_item(picked_trim_path) var/obj/item/card/id/advanced/chameleon/agent_card = target - SSid_access.apply_trim_to_chameleon_card(agent_card, picked_trim_path, TRUE) + SSid_access.apply_trim_override(agent_card, picked_trim_path, TRUE) agent_card.update_label() agent_card.update_appearance(UPDATE_ICON) diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 1c5de2999329e..b0dcb72e6fcfe 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -89,8 +89,8 @@ /obj/item/clothing/glasses/hud/health/night/science name = "night vision medical science scanner HUD" - desc = "An clandestine medical science heads-up display that allows operatives to find \ - dying captains and the perfect poison to finish them off in complete darkness." + desc = "A clandestine medical science heads-up display that allows operatives to find \ + both dying captains and the perfect poison to finish them off, all in complete darkness." clothing_traits = list(TRAIT_REAGENT_SCANNER, TRAIT_MEDICAL_HUD) forced_glass_color = FALSE diff --git a/code/modules/clothing/gloves/boxing.dm b/code/modules/clothing/gloves/boxing.dm index 3c8edb4de730f..6ea7ed438f272 100644 --- a/code/modules/clothing/gloves/boxing.dm +++ b/code/modules/clothing/gloves/boxing.dm @@ -24,7 +24,7 @@ /obj/item/clothing/gloves/boxing/evil name = "evil boxing gloves" - desc = "These strange gloves radiate an unsually evil aura." + desc = "These strange gloves radiate an unusually evil aura." greyscale_colors = "#21211f" style_to_give = /datum/martial_art/boxing/evil diff --git a/code/modules/clothing/gloves/special.dm b/code/modules/clothing/gloves/special.dm index 09df92bb8c4f2..5d6d18917172f 100644 --- a/code/modules/clothing/gloves/special.dm +++ b/code/modules/clothing/gloves/special.dm @@ -145,7 +145,7 @@ /obj/item/clothing/gloves/tinkerer name = "tinker's gloves" - desc = "Overdesigned engineering gloves that have automated construction subrutines dialed in, allowing for faster construction while worn." + desc = "Overdesigned engineering gloves that have automated construction subroutines dialed in, allowing for faster construction while worn." inhand_icon_state = "greyscale_gloves" icon_state = "clockwork_gauntlets" greyscale_colors = "#db6f05" @@ -236,6 +236,7 @@ name = "athletics fishing gloves" icon = /obj/item/clothing/gloves/fishing::icon icon_state = /obj/item/clothing/gloves/fishing::icon_state + frame_state = "frame_athletic" line = null bait = null ui_description = "A pair of gloves to fish without a fishing rod while training your athletics." diff --git a/code/modules/clothing/head/costume.dm b/code/modules/clothing/head/costume.dm index a1cfd37ec0db0..a9a70101afbfe 100644 --- a/code/modules/clothing/head/costume.dm +++ b/code/modules/clothing/head/costume.dm @@ -184,6 +184,9 @@ desc = "A neon-blue pair of headphones. They look neo-futuristic." icon_state = "decker_hat" inhand_icon_state = null + equip_sound = SFX_HEADSET_EQUIP + pickup_sound = SFX_HEADSET_PICKUP + drop_sound = 'sound/items/handling/headset/headset_drop1.ogg' /obj/item/clothing/head/costume/yuri name = "yuri initiate helmet" diff --git a/code/modules/clothing/head/fedora.dm b/code/modules/clothing/head/fedora.dm index 0bc555ca6bcfe..51c5afa2eba94 100644 --- a/code/modules/clothing/head/fedora.dm +++ b/code/modules/clothing/head/fedora.dm @@ -42,6 +42,6 @@ /obj/item/clothing/head/fedora/beige/press name = "press fedora" - desc = "An beige fedora with a piece of paper saying \"PRESS\" stuck in its rim." + desc = "A beige fedora with a piece of paper saying \"PRESS\" stuck in its rim." icon_state = "fedora_press" inhand_icon_state = null diff --git a/code/modules/clothing/head/hat.dm b/code/modules/clothing/head/hat.dm index b81971a1ce923..f4a710156212f 100644 --- a/code/modules/clothing/head/hat.dm +++ b/code/modules/clothing/head/hat.dm @@ -22,7 +22,7 @@ /obj/item/clothing/head/costume/constable name = "constable helmet" - desc = "A british looking helmet." + desc = "A British-looking helmet." icon_state = "constable" inhand_icon_state = null custom_price = PAYCHECK_COMMAND * 1.5 diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 5afa32ea3918c..a0d7dafcfd726 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -239,7 +239,7 @@ ///Detectives Fedora, but like Inspector Gadget. Not a subtype to not inherit candy corn stuff /obj/item/clothing/head/fedora/inspector_hat name = "inspector's fedora" - desc = "There's only one man can try to stop an evil villian." + desc = "There's only one man can try to stop an evil villain." armor_type = /datum/armor/fedora_det_hat icon_state = "detective" inhand_icon_state = "det_hat" diff --git a/code/modules/clothing/head/perceptomatrix.dm b/code/modules/clothing/head/perceptomatrix.dm index e8b75bbdef5bc..665fc6ca61c39 100644 --- a/code/modules/clothing/head/perceptomatrix.dm +++ b/code/modules/clothing/head/perceptomatrix.dm @@ -5,7 +5,7 @@ /// Helmet which can turn you into a BEAST!! once an anomaly core is inserted /obj/item/clothing/head/helmet/perceptomatrix name = "perceptomatrix helm" - desc = "This piece of headgear harnesses the energies of a hallucinative anomaly to create a safe audiovisual replica of -all- external stimuli directly into the cerebral cortex, \ + desc = "This piece of headgear harnesses the energies of a hallucinatory anomaly to create a safe audiovisual replica of -all- external stimuli directly into the cerebral cortex, \ granting the user effective immunity to both psychic threats, and anything that would affect their perception - be it ear, eye, or even brain damage. \ It can also violently discharge said energy, inducing hallucinations in others." icon_state = "perceptomatrix_helmet_inactive" diff --git a/code/modules/clothing/head/religious.dm b/code/modules/clothing/head/religious.dm index 4aafd079ff6cf..981df1b88af0b 100644 --- a/code/modules/clothing/head/religious.dm +++ b/code/modules/clothing/head/religious.dm @@ -4,7 +4,7 @@ /obj/item/clothing/head/chaplain/clownmitre name = "Hat of the Honkmother" - desc = "It's hard for parishoners to see a banana peel on the floor when they're looking up at your glorious chapeau." + desc = "It's hard for parishioners to see a banana peel on the floor when they're looking up at your glorious chapeau." icon_state = "clownmitre" /obj/item/clothing/head/chaplain/kippah diff --git a/code/modules/clothing/head/tinfoilhat.dm b/code/modules/clothing/head/tinfoilhat.dm index c1e6df6c30cfc..febc379ac0ad3 100644 --- a/code/modules/clothing/head/tinfoilhat.dm +++ b/code/modules/clothing/head/tinfoilhat.dm @@ -64,7 +64,7 @@ /obj/item/clothing/head/costume/foilhat/proc/warp_up() name = "scorched tinfoil hat" - desc = "A badly warped up hat. Quite unprobable this will still work against any of fictional and contemporary dangers it used to." + desc = "A badly warped up hat. Quite unlikely this will still work against any of the fictional or real dangers it used to." warped = TRUE clothing_flags &= ~ANTI_TINFOIL_MANEUVER if(!isliving(loc) || !paranoia) diff --git a/code/modules/clothing/head/wig.dm b/code/modules/clothing/head/wig.dm index 8dc4ae6eb43b6..b324073a0e2a0 100644 --- a/code/modules/clothing/head/wig.dm +++ b/code/modules/clothing/head/wig.dm @@ -19,11 +19,11 @@ /obj/item/clothing/head/wig/equipped(mob/user, slot) . = ..() if(ishuman(user) && (slot & ITEM_SLOT_HEAD)) - item_flags |= EXAMINE_SKIP + ADD_TRAIT(src, TRAIT_EXAMINE_SKIP, CLOTHING_TRAIT) /obj/item/clothing/head/wig/dropped(mob/user) . = ..() - item_flags &= ~EXAMINE_SKIP + REMOVE_TRAIT(src, TRAIT_EXAMINE_SKIP, CLOTHING_TRAIT) /obj/item/clothing/head/wig/update_icon_state() var/datum/sprite_accessory/hair/hair_style = SSaccessories.hairstyles_list[hairstyle] diff --git a/code/modules/clothing/masks/moustache.dm b/code/modules/clothing/masks/moustache.dm index 5b71e7a426090..651ea15a52a8f 100644 --- a/code/modules/clothing/masks/moustache.dm +++ b/code/modules/clothing/masks/moustache.dm @@ -9,7 +9,7 @@ /obj/item/clothing/mask/fakemoustache/italian name = "italian moustache" - desc = "Made from authentic Italian moustache hairs. Gives the wearer an irresistable urge to gesticulate wildly." + desc = "Made from authentic Italian moustache hairs. Gives the wearer an irresistible urge to gesticulate wildly." /obj/item/clothing/mask/fakemoustache/italian/Initialize(mapload) . = ..() diff --git a/code/modules/clothing/masks/muzzle.dm b/code/modules/clothing/masks/muzzle.dm index 05bdd086efe86..8e100bb7787fe 100644 --- a/code/modules/clothing/masks/muzzle.dm +++ b/code/modules/clothing/masks/muzzle.dm @@ -86,7 +86,7 @@ /obj/item/clothing/mask/muzzle/tape/super name = "super tape piece" - desc = "A piece of tape that can be put over someone's mouth. This one has extra strengh." + desc = "A piece of tape that can be put over someone's mouth. This one has extra strength." greyscale_colors = "#4D4D4D" strip_delay = 80 diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 7fe2074175d31..3993bfb60f621 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -502,7 +502,7 @@ /obj/item/clothing/neck/beads name = "plastic bead necklace" - desc = "A cheap, plastic bead necklace. Show team spirit! Collect them! Throw them away! The posibilites are endless!" + desc = "A cheap, plastic bead necklace. Show team spirit! Collect them! Throw them away! The possibilities are endless!" icon = 'icons/obj/clothing/neck.dmi' icon_state = "beads" color = "#ffffff" diff --git a/code/modules/clothing/shoes/jumpboots.dm b/code/modules/clothing/shoes/jumpboots.dm index dc9dadcea5a53..1816a68cefd39 100644 --- a/code/modules/clothing/shoes/jumpboots.dm +++ b/code/modules/clothing/shoes/jumpboots.dm @@ -1,6 +1,6 @@ /obj/item/clothing/shoes/bhop name = "jump boots" - desc = "A specialized pair of combat boots with a built-in propulsion system for rapid foward movement." + desc = "A specialized pair of combat boots with a built-in propulsion system for rapid forward movement." icon_state = "jetboots" inhand_icon_state = null resistance_flags = FIRE_PROOF diff --git a/code/modules/clothing/spacesuits/softsuit.dm b/code/modules/clothing/spacesuits/softsuit.dm index 3bbb6d0bd0f90..691318736e9c5 100644 --- a/code/modules/clothing/spacesuits/softsuit.dm +++ b/code/modules/clothing/spacesuits/softsuit.dm @@ -68,7 +68,7 @@ //Emergency suit /obj/item/clothing/head/helmet/space/fragile name = "emergency space helmet" - desc = "A bulky, air-tight helmet meant to protect the user during emergency situations. It doesn't look very durable." + desc = "A bulky, airtight helmet meant to protect the user during emergency situations. It doesn't look very durable." icon_state = "syndicate-helm-orange" inhand_icon_state = "syndicate-helm-orange" //resprite? armor_type = /datum/armor/space_fragile @@ -77,7 +77,7 @@ /obj/item/clothing/suit/space/fragile name = "emergency space suit" - desc = "A bulky, air-tight suit meant to protect the user during emergency situations. It doesn't look very durable." + desc = "A bulky, airtight suit meant to protect the user during emergency situations. It doesn't look very durable." var/torn = FALSE icon_state = "syndicate-orange" inhand_icon_state = "syndicate-orange" @@ -90,7 +90,7 @@ /obj/item/clothing/suit/space/fragile/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) if(!torn && prob(50)) - to_chat(owner, span_warning("[src] tears from the damage, breaking the air-tight seal!")) + to_chat(owner, span_warning("[src] tears from the damage, breaking the airtight seal!")) clothing_flags &= ~STOPSPRESSUREDAMAGE name = "torn [src]." desc = "A bulky suit meant to protect the user during emergency situations, at least until someone tore a hole in the suit." diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm index 78ea1d2f3b7a1..b8d77df4ad197 100644 --- a/code/modules/clothing/suits/_suits.dm +++ b/code/modules/clothing/suits/_suits.dm @@ -11,8 +11,8 @@ /obj/item/storage/belt/holster, ) armor_type = /datum/armor/none - drop_sound = 'sound/items/handling/cloth_drop.ogg' - pickup_sound = 'sound/items/handling/cloth_pickup.ogg' + drop_sound = 'sound/items/handling/cloth/cloth_drop1.ogg' + pickup_sound = 'sound/items/handling/cloth/cloth_pickup1.ogg' slot_flags = ITEM_SLOT_OCLOTHING var/blood_overlay_type = "suit" limb_integrity = 0 // disabled for most exo-suits diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index c498435677b11..00348c555e70f 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -608,7 +608,7 @@ /obj/item/clothing/suit/armor/vest/russian_coat name = "russian battle coat" - desc = "Used in extremly cold fronts, made out of real bears." + desc = "Used in extremely cold fronts, made out of real bears." icon_state = "rus_coat" inhand_icon_state = null body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS @@ -760,7 +760,7 @@ /obj/item/clothing/suit/armor/durability/watermelon name = "watermelon armor" - desc = "An armor, made from watermelons. Propably won't take too many hits, but at least it looks serious... As serious as worn watermelon can be." + desc = "An armor, made from watermelons. Probably won't take too many hits, but at least it looks serious... As serious as worn watermelon can be." icon_state = "watermelon" inhand_icon_state = null body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS @@ -794,7 +794,7 @@ /obj/item/clothing/suit/armor/durability/holymelon name = "holymelon armor" - desc = "An armor, made from holymelons. Inspires you to go on some sort of a crusade... Perhaps spreading spinach to children?" + desc = "An armor, made from holymelons. Inspires you to go on some sort of crusade... Perhaps spreading spinach to children?" icon_state = "holymelon" inhand_icon_state = null body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index 5d31ee29e4adf..dff7798d44ad6 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -70,7 +70,7 @@ /obj/item/clothing/neck/cloak/skill_reward/cleaning name = "legendary cleaner's cloak" - desc = "Worn by the most skilled custodians, this legendary cloak is only attainable by achieving janitorial enlightenment. This status symbol represents a being not only extensively trained in grime combat, but one who is willing to use an entire aresenal of cleaning supplies to its full extent to wipe grime's miserable ass off the face of the station." + desc = "Worn by the most skilled custodians, this legendary cloak is only attainable by achieving janitorial enlightenment. This status symbol represents a being not only extensively trained in grime combat, but one who is willing to use an entire arsenal of cleaning supplies to its full extent to wipe grime's miserable ass off the face of the station." icon_state = "cleanercloak" associated_skill_path = /datum/skill/cleaning diff --git a/code/modules/clothing/suits/costume.dm b/code/modules/clothing/suits/costume.dm index a7618b6f3be59..3ef1b1691ca5e 100644 --- a/code/modules/clothing/suits/costume.dm +++ b/code/modules/clothing/suits/costume.dm @@ -588,7 +588,7 @@ /obj/item/clothing/suit/coordinator name = "coordinator jacket" - desc = "A jacket for a party ooordinator, stylish!." + desc = "A jacket for a party coordinator, stylish!." icon_state = "capformal" icon = 'icons/obj/clothing/suits/armor.dmi' worn_icon = 'icons/mob/clothing/suits/armor.dmi' diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index aa9ea344ad70e..96d2607a3aca0 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -155,7 +155,7 @@ /obj/item/clothing/suit/toggle/labcoat/research_director name = "research director's coat" - desc = "A mix between a labcoat and just a regular coat. It's made out of a special anti-bacterial, anti-acidic, and anti-biohazardous synthetic fabric." + desc = "A mix between a labcoat and just a regular coat. It's made out of a special antibacterial, anti-acidic, and anti-biohazardous synthetic fabric." icon_state = "labcoat_rd" armor_type = /datum/armor/jacket_research_director body_parts_covered = CHEST|GROIN|ARMS diff --git a/code/modules/clothing/suits/wintercoats.dm b/code/modules/clothing/suits/wintercoats.dm index 581d1c49964b6..272aafa7ff4b6 100644 --- a/code/modules/clothing/suits/wintercoats.dm +++ b/code/modules/clothing/suits/wintercoats.dm @@ -390,7 +390,7 @@ // Virologist /obj/item/clothing/suit/hooded/wintercoat/medical/viro name = "virology winter coat" - desc = "A white winter coat with green markings. Warm, but wont fight off the common cold or any other disease. Might make people stand far away from you in the hallway. The zipper tab looks like an oversized bacteriophage." + desc = "A white winter coat with green markings. Warm, but won't fight off the common cold or any other disease. Might make people stand far away from you in the hallway. The zipper tab looks like an oversized bacteriophage." icon_state = "coatviro" inhand_icon_state = null hoodtype = /obj/item/clothing/head/hooded/winterhood/medical/viro diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 794ebfbff49f2..0e3ca6131f218 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -236,7 +236,7 @@ /obj/item/clothing/suit/wizrobe/durathread name = "durathread robe" - desc = "A rather dull durathread robe; not quite as protective as a proper piece of armour, but much stylish." + desc = "A rather dull durathread robe; not quite as protective as a proper piece of armour, but much more stylish." icon_state = "durathread-fake" inhand_icon_state = null armor_type = /datum/armor/robe_durathread @@ -254,12 +254,12 @@ /obj/item/clothing/suit/wizrobe/durathread/fire name = "pyromancer robe" - desc = "A rather dull durathread robe; not quite as protective as an woven armour, but much stylish." + desc = "A rather dull durathread robe; not quite as protective as woven armour, but much more stylish." icon_state = "durathread-fire" /obj/item/clothing/suit/wizrobe/durathread/ice name = "pyromancer robe" - desc = "A rather dull durathread robe; not quite as protective as an woven armour, but much stylish." + desc = "A rather dull durathread robe; not quite as protective as woven armour, but much more stylish." icon_state = "durathread-ice" /obj/item/clothing/suit/wizrobe/durathread/electric @@ -269,12 +269,12 @@ /obj/item/clothing/suit/wizrobe/durathread/earth name = "geomancer robe" - desc = "A rather dull durathread robe; not quite as protective as an woven armour, but much stylish." + desc = "A rather dull durathread robe; not quite as protective as woven armour, but much more stylish." icon_state = "durathread-earth" /obj/item/clothing/suit/wizrobe/durathread/necro name = "necromancer robe" - desc = "A rather dull durathread robe; not quite as protective as an woven armour, but much stylish." + desc = "A rather dull durathread robe; not quite as protective as woven armour, but much more stylish." icon_state = "durathread-necro" diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index f8e7b7723a1c9..3eef448ea9fef 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -10,8 +10,8 @@ armor_type = /datum/armor/clothing_under supports_variations_flags = CLOTHING_DIGITIGRADE_MASK equip_sound = 'sound/items/equip/jumpsuit_equip.ogg' - drop_sound = 'sound/items/handling/cloth_drop.ogg' - pickup_sound = 'sound/items/handling/cloth_pickup.ogg' + drop_sound = 'sound/items/handling/cloth/cloth_drop1.ogg' + pickup_sound = 'sound/items/handling/cloth/cloth_pickup1.ogg' limb_integrity = 30 interaction_flags_click = ALLOW_RESTING diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm index c8550dd0ff6ba..39734352fdac5 100644 --- a/code/modules/clothing/under/costume.dm +++ b/code/modules/clothing/under/costume.dm @@ -176,7 +176,7 @@ /obj/item/clothing/under/costume/sailor name = "sailor suit" - desc = "Skipper's in the wardroom drinkin gin'." + desc = "Skipper's in the wardroom drinkin' gin." icon_state = "sailor" inhand_icon_state = "b_suit" can_adjust = FALSE @@ -309,8 +309,8 @@ alt_covers_chest = TRUE /obj/item/clothing/under/costume/buttondown/slacks - name = "buttondown shirt with slacks" - desc = "A fancy buttondown shirt with slacks." + name = "button-down shirt with slacks" + desc = "A fancy button-down shirt with slacks." icon_state = "buttondown_slacks" greyscale_config = /datum/greyscale_config/buttondown_slacks greyscale_config_worn = /datum/greyscale_config/buttondown_slacks/worn @@ -321,8 +321,8 @@ greyscale_colors = "#EEEEEE#CBDBFC#17171B#222227" /obj/item/clothing/under/costume/buttondown/shorts - name = "buttondown shirt with shorts" - desc = "A fancy buttondown shirt with shorts." + name = "button-down shirt with shorts" + desc = "A fancy button-down shirt with shorts." icon_state = "buttondown_shorts" greyscale_config = /datum/greyscale_config/buttondown_shorts greyscale_config_worn = /datum/greyscale_config/buttondown_shorts/worn @@ -330,8 +330,8 @@ flags_1 = IS_PLAYER_COLORABLE_1 /obj/item/clothing/under/costume/buttondown/skirt - name = "buttondown shirt with skirt" - desc = "A fancy buttondown shirt with skirt." + name = "button-down shirt with skirt" + desc = "A fancy button-down shirt with skirt." icon_state = "buttondown_skirt" greyscale_config = /datum/greyscale_config/buttondown_skirt greyscale_config_worn = /datum/greyscale_config/buttondown_skirt/worn @@ -441,7 +441,7 @@ /obj/item/clothing/under/costume/traditional name = "traditional suit" - desc = "A full, vibrantly coloured suit. Likely with traditional purposes. Maybe the colours represent a familly, clan, or rank, who knows." + desc = "A full, vibrantly coloured suit. Likely with traditional purposes. Maybe the colours represent a family, clan, or rank, who knows." icon_state = "tradition" inhand_icon_state = null female_sprite_flags = NO_FEMALE_UNIFORM @@ -468,16 +468,16 @@ flags_inv = HIDEGLOVES|HIDESHOES|HIDEEARS|HIDEEYES|HIDEHAIR /obj/item/clothing/under/costume/gamberson - name = "re-enactor's Gamberson" - desc = "A colorful set of clothes made to look like a medieval gamberson." + name = "re-enactor's gambeson" + desc = "A colorful set of clothes made to look like a medieval gambeson." icon_state = "gamberson" inhand_icon_state = null female_sprite_flags = NO_FEMALE_UNIFORM can_adjust = FALSE /obj/item/clothing/under/costume/gamberson/military - name = "swordsman's Gamberson" - desc = "A padded medieval gamberson. Has enough woolen layers to dull a strike from any small weapon." + name = "swordsman's gambeson" + desc = "A padded medieval gambeson. Has enough woolen layers to dull a strike from any small weapon." armor_type = /datum/armor/clothing_under/rank_security has_sensor = NO_SENSORS diff --git a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm index 71557e68a4797..17fe302b8e55d 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm @@ -79,19 +79,19 @@ /obj/item/clothing/under/plasmaman/cargo name = "cargo plasma envirosuit" - desc = "A joint envirosuit used by plasmamen quartermasters and cargo techs alike, due to the logistical problems of differenciating the two with the length of their pant legs." + desc = "A joint envirosuit used by plasmamen quartermasters and cargo techs alike, due to the logistical problems of differentiating the two with the length of their pant legs." icon_state = "cargo_envirosuit" inhand_icon_state = null /obj/item/clothing/under/plasmaman/mining name = "mining plasma envirosuit" - desc = "An air-tight khaki suit designed for operations on lavaland by plasmamen." + desc = "An airtight khaki suit designed for operations on lavaland by plasmamen." icon_state = "explorer_envirosuit" inhand_icon_state = null /obj/item/clothing/under/plasmaman/chef name = "chef's plasma envirosuit" - desc = "A white plasmaman envirosuit designed for cullinary practices. One might question why a member of a species that doesn't need to eat would become a chef." + desc = "A white plasmaman envirosuit designed for culinary practices. One might question why a member of a species that doesn't need to eat would become a chef." icon_state = "chef_envirosuit" inhand_icon_state = null diff --git a/code/modules/clothing/under/jobs/Plasmaman/command.dm b/code/modules/clothing/under/jobs/Plasmaman/command.dm index 8713edb558819..6b30dc037766e 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/command.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/command.dm @@ -34,7 +34,7 @@ /obj/item/clothing/under/plasmaman/chief_engineer name = "chief engineer's plasma envirosuit" - desc = "An air-tight suit designed to be used by plasmamen insane enough to achieve the rank of \"Chief Engineer\"." + desc = "An airtight suit designed to be used by plasmamen insane enough to achieve the rank of \"Chief Engineer\"." icon_state = "ce_envirosuit" inhand_icon_state = null armor_type = /datum/armor/clothing_under/engineering_chief_engineer/plasmaman diff --git a/code/modules/clothing/under/jobs/Plasmaman/engineering.dm b/code/modules/clothing/under/jobs/Plasmaman/engineering.dm index 26d06038131c4..6fe73e04e123f 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/engineering.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/engineering.dm @@ -1,6 +1,6 @@ /obj/item/clothing/under/plasmaman/engineering name = "engineering plasma envirosuit" - desc = "An air-tight suit designed to be used by plasmamen employed as engineers, the usual purple stripes being replaced by engineering's orange. It protects the user from fire and acid damage." + desc = "An airtight suit designed to be used by plasmamen employed as engineers, the usual purple stripes being replaced by engineering's orange. It protects the user from fire and acid damage." icon_state = "engineer_envirosuit" inhand_icon_state = null armor_type = /datum/armor/clothing_under/plasmaman_engineering @@ -12,7 +12,7 @@ /obj/item/clothing/under/plasmaman/atmospherics name = "atmospherics plasma envirosuit" - desc = "An air-tight suit designed to be used by plasmamen employed as atmos technicians, the usual purple stripes being replaced by atmos' blue." + desc = "An airtight suit designed to be used by plasmamen employed as atmos technicians, the usual purple stripes being replaced by atmos' blue." icon_state = "atmos_envirosuit" inhand_icon_state = null armor_type = /datum/armor/clothing_under/plasmaman_atmospherics diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index 6fdecff829b4d..83b7847855eb7 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -61,7 +61,7 @@ /obj/item/clothing/under/rank/security/constable name = "constable outfit" - desc = "A british looking outfit." + desc = "A British-looking outfit." icon_state = "constable" inhand_icon_state = null can_adjust = FALSE diff --git a/code/modules/clothing/under/skirt_dress.dm b/code/modules/clothing/under/skirt_dress.dm index 30f74920ef9d6..0ea09301dba26 100644 --- a/code/modules/clothing/under/skirt_dress.dm +++ b/code/modules/clothing/under/skirt_dress.dm @@ -26,6 +26,7 @@ name = "sailor dress" desc = "Formal wear for a leading lady." icon_state = "sailor_dress" + alternate_worn_layer = UNDER_SUIT_LAYER greyscale_config = /datum/greyscale_config/sailor_dress greyscale_config_worn = /datum/greyscale_config/sailor_dress/worn greyscale_colors = "#0000ff#cc0000#eaeaea" @@ -36,6 +37,7 @@ name = "wedding dress" desc = "A luxurious gown for once-in-a-lifetime occasions." icon_state = "wedding_dress" + alternate_worn_layer = UNDER_SUIT_LAYER inhand_icon_state = null body_parts_covered = CHEST|GROIN|LEGS flags_inv = HIDESHOES @@ -48,6 +50,7 @@ name = "evening gown" desc = "Fancy dress for space bar singers." icon_state = "evening_gown" + alternate_worn_layer = UNDER_SUIT_LAYER inhand_icon_state = null greyscale_config = /datum/greyscale_config/evening_dress greyscale_config_worn = /datum/greyscale_config/evening_dress/worn @@ -94,6 +97,7 @@ name = "tango dress" desc = "Filled with Latin fire." icon_state = "tango" + alternate_worn_layer = UNDER_SUIT_LAYER custom_price = PAYCHECK_CREW greyscale_colors = "#ff0000#1c1c1c" greyscale_config = /datum/greyscale_config/tango diff --git a/code/modules/clothing/under/suits.dm b/code/modules/clothing/under/suits.dm index 07ec1a59c490e..4e48a52f58f82 100644 --- a/code/modules/clothing/under/suits.dm +++ b/code/modules/clothing/under/suits.dm @@ -113,7 +113,7 @@ /obj/item/clothing/under/suit/carpskin name = "carpskin suit" - desc = "An luxurious suit made with only the finest scales, perfect for conducting dodgy business deals." + desc = "A luxurious suit made with only the finest scales, perfect for conducting dodgy business deals." icon_state = "carpskin_suit" inhand_icon_state = null diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm index ac6af3f2f7f8b..65a0400ed4556 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -1,6 +1,6 @@ /obj/item/clothing/under/syndicate name = "tactical turtleneck" - desc = "A non-descript and slightly suspicious looking turtleneck with digital camouflage cargo pants." + desc = "A nondescript and slightly suspicious looking turtleneck with digital camouflage cargo pants." icon_state = "syndicate" inhand_icon_state = "bl_suit" has_sensor = NO_SENSORS @@ -17,7 +17,7 @@ /obj/item/clothing/under/syndicate/skirt name = "tactical skirtleneck" - desc = "A non-descript and slightly suspicious looking skirtleneck." + desc = "A nondescript and slightly suspicious looking skirtleneck." icon_state = "syndicate_skirt" inhand_icon_state = "bl_suit" female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY diff --git a/code/modules/deathmatch/deathmatch_loadouts.dm b/code/modules/deathmatch/deathmatch_loadouts.dm index b50a579f34d08..f4d3d9b5ede27 100644 --- a/code/modules/deathmatch/deathmatch_loadouts.dm +++ b/code/modules/deathmatch/deathmatch_loadouts.dm @@ -53,7 +53,7 @@ /datum/outfit/deathmatch_loadout/assistant/weaponless name = "Deathmatch: Assistant loadout (Weaponless)" display_name = "Assistant (Unarmed)" - desc = "What is an assistant without a toolbox? nothing" + desc = "What is an assistant without a toolbox? Nothing!" l_hand = null /datum/outfit/deathmatch_loadout/operative @@ -154,7 +154,7 @@ /datum/outfit/deathmatch_loadout/battler name = "Deathmatch: Battler Base" display_name = "Battler" - desc = "What is a battler whith out weapone?." + desc = "What is a battler without weapons?" shoes = /obj/item/clothing/shoes/combat uniform = /obj/item/clothing/under/syndicate @@ -779,7 +779,7 @@ /datum/outfit/deathmatch_loadout/lizardkind name = "Deathmatch: Lizard Species" display_name = "Lizardfolk" - desc = "They may be heavily discrimated against, they may be most often seen doing menial activities, but at least they, uh, uhh..." + desc = "They may be heavily discriminated against, they may be most often seen doing menial activities, but at least they, uh, uhh..." species_override = /datum/species/lizard head = /obj/item/clothing/head/soft/purple diff --git a/code/modules/deathmatch/deathmatch_lobby.dm b/code/modules/deathmatch/deathmatch_lobby.dm index 9a6773edec565..a99f4fabfe101 100644 --- a/code/modules/deathmatch/deathmatch_lobby.dm +++ b/code/modules/deathmatch/deathmatch_lobby.dm @@ -141,7 +141,7 @@ new_player.dna.update_dna_identity() new_player.updateappearance(icon_update = TRUE, mutcolor_update = TRUE, mutations_overlay_update = TRUE) new_player.add_traits(list(TRAIT_CANNOT_CRYSTALIZE, TRAIT_PERMANENTLY_MORTAL, TRAIT_TEMPORARY_BODY), INNATE_TRAIT) - if(!isnull(observer.mind) && observer.mind?.current) + if(observer.mind) new_player.AddComponent( \ /datum/component/temporary_body, \ old_mind = observer.mind, \ diff --git a/code/modules/deathmatch/deathmatch_mapping.dm b/code/modules/deathmatch/deathmatch_mapping.dm index 7ef314a917bec..97c73fd5e9a6b 100644 --- a/code/modules/deathmatch/deathmatch_mapping.dm +++ b/code/modules/deathmatch/deathmatch_mapping.dm @@ -14,7 +14,7 @@ // for the illusion of a moving train /turf/open/chasm/true/no_smooth/fake_motion_sand name = "air" - desc = "Dont jump off, unless you want to fall a really long distance." + desc = "Don't jump off, unless you want to fall a really long distance." icon_state = "sandmoving" base_icon_state = "sandmoving" icon = 'icons/turf/floors.dmi' diff --git a/code/modules/deathmatch/deathmatch_maps.dm b/code/modules/deathmatch/deathmatch_maps.dm index da08ae0b3114c..e0f86ccc923f7 100644 --- a/code/modules/deathmatch/deathmatch_maps.dm +++ b/code/modules/deathmatch/deathmatch_maps.dm @@ -79,7 +79,7 @@ /datum/lazy_template/deathmatch/mech_madness name = "Mech Madness" - desc = "Do you hate mechs? Yeah? Dont care! Go fight eachother!" + desc = "Do you hate mechs? Yeah? Don't care! Go fight each other!" max_players = 4 allowed_loadouts = list(/datum/outfit/deathmatch_loadout/operative) map_name = "mech_madness" diff --git a/code/modules/deathmatch/deathmatch_modifier.dm b/code/modules/deathmatch/deathmatch_modifier.dm index 77ef9785aba4e..ad2ab6adb62ec 100644 --- a/code/modules/deathmatch/deathmatch_modifier.dm +++ b/code/modules/deathmatch/deathmatch_modifier.dm @@ -391,6 +391,7 @@ /mob/living/basic/dark_wizard = 2, /mob/living/basic/flesh_spider = 2, /mob/living/basic/garden_gnome = 2, + /mob/living/basic/goose = 2, /mob/living/basic/killer_tomato = 2, /mob/living/basic/leaper = 1, /mob/living/basic/mega_arachnid = 1, @@ -404,7 +405,6 @@ /mob/living/basic/spider/giant/nurse/scrawny = 2, /mob/living/basic/spider/giant/tarantula/scrawny = 2, /mob/living/basic/spider/giant/hunter/scrawny = 2, - /mob/living/simple_animal/hostile/retaliate/goose = 2, /mob/living/simple_animal/hostile/ooze = 1, ) diff --git a/code/modules/detectivework/evidence.dm b/code/modules/detectivework/evidence.dm index 59e2f0feb86b1..030d2e6c25aa4 100644 --- a/code/modules/detectivework/evidence.dm +++ b/code/modules/detectivework/evidence.dm @@ -62,9 +62,7 @@ SIGNAL_HANDLER if(!atom_storage.get_total_weight()) - return - - update_weight_class(WEIGHT_CLASS_TINY) + update_weight_class(WEIGHT_CLASS_TINY) /obj/item/evidencebag/attack_self(mob/user) if(!atom_storage.get_total_weight()) diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index eed92903f3cef..aedec75091489 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -1,7 +1,5 @@ //CONTAINS: Detective's Scanner -// TODO: Split everything into easy to manage procs. - /obj/item/detective_scanner name = "forensic scanner" desc = "Used to remotely scan objects and biomass for DNA and fingerprints. Can print a report of the findings." @@ -17,30 +15,17 @@ slot_flags = ITEM_SLOT_BELT /// if the scanner is currently busy processing var/scanner_busy = FALSE - var/list/log = list() + var/list/log_data = list() var/range = 8 var/view_check = TRUE var/forensicPrintCount = 0 - actions_types = list(/datum/action/item_action/display_detective_scan_results) - -/datum/action/item_action/display_detective_scan_results - name = "Display Forensic Scanner Results" - -/datum/action/item_action/display_detective_scan_results/Trigger(trigger_flags) - var/obj/item/detective_scanner/scanner = target - if(istype(scanner)) - scanner.display_detective_scan_results(usr) -/obj/item/detective_scanner/attack_self(mob/user) - if(!LAZYLEN(log)) - balloon_alert(user, "no logs!") - return - if(scanner_busy) - balloon_alert(user, "scanner busy!") - return - scanner_busy = TRUE - balloon_alert(user, "printing report...") - addtimer(CALLBACK(src, PROC_REF(safe_print_report)), 10 SECONDS) +/obj/item/detective_scanner/interact(mob/user) + . = ..() + if(user.stat != CONSCIOUS || !user.can_read(src) || user.is_blind()) + return ITEM_INTERACT_BLOCKING + ui_interact(user) + return ITEM_INTERACT_SUCCESS /** * safe_print_report - a wrapper proc for print_report @@ -59,11 +44,51 @@ var/frNum = ++forensicPrintCount report_paper.name = "FR-[frNum] 'Forensic Record'" - var/report_text = "
Forensic Record - (FR-[frNum])


" - report_text += jointext(log, "
") - report_text += "
Notes:
" - - report_paper.add_raw_text(report_text) + var/list/report_text = list("

Forensic Record - (FR-[frNum])


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

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

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

" + + report_text += "

Notes:


" + + report_paper.add_raw_text(report_text.Join()) report_paper.update_appearance() if(ismob(loc)) @@ -72,7 +97,7 @@ balloon_alert(printer, "logs cleared") // Clear the logs - log = list() + log_data = list() /obj/item/detective_scanner/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(SHOULD_SKIP_INTERACTION(interacting_with, src, user)) @@ -92,6 +117,7 @@ /obj/item/detective_scanner/proc/safe_scan(mob/user, atom/atom_to_scan) set waitfor = FALSE if(scanner_busy) + balloon_alert(user, "scanner busy!") return if(!scan(user, atom_to_scan)) // this should only return FALSE if a runtime occurs during the scan proc, so ideally never balloon_alert(user, "scanner error!") // but in case it does, we 'error' instead of just bricking the scanner @@ -115,7 +141,7 @@ user.visible_message( - span_notice("\The [user] points the [src.name] at \the [scanned_atom] and performs a forensic scan."), + span_notice("\The [user] points \the [src] at \the [scanned_atom] and performs a forensic scan."), ignored_mobs = user ) to_chat(user, span_notice("You scan \the [scanned_atom]. The scanner is now analysing the results...")) @@ -123,30 +149,31 @@ // GATHER INFORMATION - //Make our assoc list array - // The keys are the headers used for it, and the value is a list of each line printed - var/list/det_data = list() - var/list/blood = GET_ATOM_BLOOD_DNA(scanned_atom) - det_data[DETSCAN_CATEGORY_FIBER] = GET_ATOM_FIBRES(scanned_atom) - - var/target_name = scanned_atom.name + var/list/log_entry_data = list() // Start gathering - if(ishuman(scanned_atom)) + log_entry_data["scan_target"] = scanned_atom.name + log_entry_data["scan_time"] = station_time_timestamp() + + log_entry_data[DETSCAN_CATEGORY_FIBER] = GET_ATOM_FIBRES(scanned_atom) + var/list/blood = GET_ATOM_BLOOD_DNA(scanned_atom) + if(length(blood)) + LAZYADD(log_entry_data[DETSCAN_CATEGORY_BLOOD], blood) + + if(ishuman(scanned_atom)) var/mob/living/carbon/human/scanned_human = scanned_atom if(!scanned_human.gloves) - LAZYADD(det_data[DETSCAN_CATEGORY_FINGERS], md5(scanned_human.dna?.unique_identity)) + LAZYADD(log_entry_data[DETSCAN_CATEGORY_FINGERS], md5(scanned_human.dna?.unique_identity)) else if(!ismob(scanned_atom)) - det_data[DETSCAN_CATEGORY_FINGERS] = GET_ATOM_FINGERPRINTS(scanned_atom) + log_entry_data[DETSCAN_CATEGORY_FINGERS] = GET_ATOM_FINGERPRINTS(scanned_atom) // Only get reagents from non-mobs. for(var/datum/reagent/present_reagent as anything in scanned_atom.reagents?.reagent_list) - LAZYADD(det_data[DETSCAN_CATEGORY_DRINK], \ - "Reagent: [present_reagent.name] Volume: [present_reagent.volume]") + LAZYADD(log_entry_data[DETSCAN_CATEGORY_DRINK], list(present_reagent.name = present_reagent.volume)) // Get blood data from the blood reagent. if(!istype(present_reagent, /datum/reagent/blood)) @@ -165,92 +192,79 @@ var/access_in_region = SSid_access.accesses_by_region[region] & user_id.GetAccess() if(!length(access_in_region)) continue - LAZYADD(det_data[DETSCAN_CATEGORY_ACCESS], "[region]:") var/list/access_names = list() for(var/access_num in access_in_region) access_names += SSid_access.get_access_desc(access_num) - LAZYADD(det_data[DETSCAN_CATEGORY_ACCESS], english_list(access_names)) - - - for(var/bloodtype in blood) - LAZYADD(det_data[DETSCAN_CATEGORY_BLOOD], \ - "Type: [blood[bloodtype]] DNA (UE): [bloodtype]") + LAZYADD(log_entry_data[DETSCAN_CATEGORY_ACCESS], region) + LAZYADD(log_entry_data[DETSCAN_CATEGORY_ACCESS][region], english_list(access_names)) // sends it off to be modified by the items - SEND_SIGNAL(scanned_atom, COMSIG_DETECTIVE_SCANNED, user, det_data) - - // We gathered everything. Create a fork and slowly display the results to the holder of the scanner. - - var/found_something = FALSE - add_log("[station_time_timestamp()][get_timestamp()] - [target_name]", 0) - - for(var/category in DETSCAN_DEFAULT_ORDER()) - if(!LAZYLEN(det_data[category])) - continue // no data found, move to next category - sleep(3 SECONDS) - add_log(span_info("[category]:")) - for(var/line in det_data[category]) - add_log(line) - found_something = TRUE - - // Make sure the original user is still holding the scanner before sending them the results - var/mob/holder = null - if(src.loc == user) - holder = user - else if(ismob(src.loc)) - holder = src.loc - - if(!found_something) - add_log("# No forensic traces found #", 0) // Don't display this to the holder user - if(holder) - to_chat(holder, span_warning("Unable to locate any fingerprints, materials, fibers, or blood on \the [target_name]!")) - else - if(holder) - to_chat(holder, span_notice("You finish scanning \the [target_name].")) - - add_log("---------------------------------------------------------", 0) - return TRUE + SEND_SIGNAL(scanned_atom, COMSIG_DETECTIVE_SCANNED, user, log_entry_data) -/obj/item/detective_scanner/proc/add_log(msg, broadcast = 1) - if(scanner_busy) - if(broadcast && ismob(loc)) - var/mob/logger = loc - to_chat(logger, msg) - log += "  [msg]" - else - CRASH("[src] [REF(src)] is adding a log when it was never put in scanning mode!") + stoplag(3 SECONDS) + log_data += list(log_entry_data) + return TRUE /proc/get_timestamp() return time2text(world.time + 432000, ":ss") /obj/item/detective_scanner/click_alt(mob/living/user) - if(!LAZYLEN(log)) - balloon_alert(user, "no logs!") - return CLICK_ACTION_BLOCKING - if(scanner_busy) - balloon_alert(user, "scanner busy!") - return CLICK_ACTION_BLOCKING - balloon_alert(user, "deleting logs...") - if(!do_after(user, 3 SECONDS, target = src)) - return CLICK_ACTION_BLOCKING - balloon_alert(user, "logs cleared") - log = list() - return CLICK_ACTION_SUCCESS - + return clear_logs() /obj/item/detective_scanner/examine(mob/user) . = ..() - if(LAZYLEN(log) && !scanner_busy) + if(LAZYLEN(log_data) && !scanner_busy) . += span_notice("Alt-click to clear scanner logs.") -/obj/item/detective_scanner/proc/display_detective_scan_results(mob/living/user) - // No need for can-use checks since the action button should do proper checks - if(!LAZYLEN(log)) - balloon_alert(user, "no logs!") + +/obj/item/detective_scanner/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ForensicScanner", "Forensic Scanner") + ui.open() + +/obj/item/detective_scanner/ui_data(mob/user) + var/list/data = list() + data["log_data"] = log_data + return data + +/obj/item/detective_scanner/ui_act(action, params, datum/tgui/ui) + . = ..() + if(.) return + switch(action) + if("clear") + clear_logs(ui.user) + ui.send_update() + if("delete") + var/index = params["index"] + 1 + if(!log_data[index]) + return + if(scanner_busy) + balloon_alert(ui.user, "scanner busy!") + return + log_data.Cut(index, index + 1) + balloon_alert(ui.user, "log deleted") + ui.send_update() + if("print") + if(!LAZYLEN(log_data)) + balloon_alert(ui.user, "no logs!") + return + if(scanner_busy) + balloon_alert(ui.user, "scanner busy!") + return + scanner_busy = TRUE + playsound(src, 'sound/machines/printer.ogg', 50) + balloon_alert(ui.user, "printing report...") + addtimer(CALLBACK(src, PROC_REF(safe_print_report)), 3 SECONDS) + +/obj/item/detective_scanner/proc/clear_logs(mob/living/user) + if(!LAZYLEN(log_data)) + balloon_alert(user, "no logs!") + return CLICK_ACTION_BLOCKING if(scanner_busy) balloon_alert(user, "scanner busy!") - return - to_chat(user, span_notice("Scanner Report")) - for(var/iterLog in log) - to_chat(user, iterLog) + return CLICK_ACTION_BLOCKING + balloon_alert(user, "logs cleared") + log_data = list() + return CLICK_ACTION_SUCCESS diff --git a/code/modules/discord/tgs_commands.dm b/code/modules/discord/tgs_commands.dm index 8c6796bc1ea16..b54008717c1c3 100644 --- a/code/modules/discord/tgs_commands.dm +++ b/code/modules/discord/tgs_commands.dm @@ -3,7 +3,7 @@ help_text = "Gets the playercount, gamemode, and address of the server" /datum/tgs_chat_command/tgscheck/Run(datum/tgs_chat_user/sender, params) - var/server = CONFIG_GET(string/server) + var/server = CONFIG_GET(string/public_address) || CONFIG_GET(string/server) return new /datum/tgs_message_content("[GLOB.round_id ? "Round #[GLOB.round_id]: " : ""][GLOB.clients.len] players on [SSmapping.current_map.map_name]; Round [SSticker.HasRoundStarted() ? (SSticker.IsRoundInProgress() ? "Active" : "Finishing") : "Starting"] -- [server ? server : "[world.internet_address]:[world.port]"]") /datum/tgs_chat_command/gameversion diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm index 6585f92f9b61c..7cdc43317e73f 100644 --- a/code/modules/error_handler/error_handler.dm +++ b/code/modules/error_handler/error_handler.dm @@ -103,12 +103,14 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) // The proceeding mess will almost definitely break if error messages are ever changed var/list/splitlines = splittext(E.desc, "\n") var/list/desclines = list() +#ifndef DISABLE_DREAMLUAU var/list/state_stack = GLOB.lua_state_stack var/is_lua_call = length(state_stack) var/list/lua_stacks = list() if(is_lua_call) for(var/level in 1 to state_stack.len) lua_stacks += list(splittext(DREAMLUAU_GET_TRACEBACK(level), "\n")) +#endif if(LAZYLEN(splitlines) > ERROR_USEFUL_LEN) // If there aren't at least three lines, there's no info for(var/line in splitlines) if(LAZYLEN(line) < 3 || findtext(line, "source file:") || findtext(line, "usr.loc:")) @@ -124,8 +126,10 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) desclines += line if(usrinfo) //If this info isn't null, it hasn't been added yet desclines.Add(usrinfo) +#ifndef DISABLE_DREAMLUAU if(is_lua_call) SSlua.log_involved_runtime(E, desclines, lua_stacks) +#endif if(silencing) desclines += " (This error will now be silenced for [DisplayTimeText(configured_error_silence_time)])" if(GLOB.error_cache) diff --git a/code/modules/events/communications_blackout.dm b/code/modules/events/communications_blackout.dm index 9fb32278f8d32..1d192f5e0db17 100644 --- a/code/modules/events/communications_blackout.dm +++ b/code/modules/events/communications_blackout.dm @@ -3,7 +3,7 @@ typepath = /datum/round_event/communications_blackout weight = 30 category = EVENT_CATEGORY_ENGINEERING - description = "Heavily emps all telecommunication machines, blocking all communication for a while." + description = "Heavily EMPs all telecommunication machines, blocking all communication for a while." min_wizard_trigger_potency = 0 max_wizard_trigger_potency = 3 diff --git a/code/modules/events/ghost_role/sentience.dm b/code/modules/events/ghost_role/sentience.dm index b12dd5c517423..60b43216ab230 100644 --- a/code/modules/events/ghost_role/sentience.dm +++ b/code/modules/events/ghost_role/sentience.dm @@ -6,6 +6,7 @@ GLOBAL_LIST_INIT(high_priority_sentience, typecacheof(list( /mob/living/basic/crab, /mob/living/basic/cow, /mob/living/basic/goat, + /mob/living/basic/goose/vomit, /mob/living/basic/lizard, /mob/living/basic/mouse/brown/tom, /mob/living/basic/parrot, @@ -17,7 +18,6 @@ GLOBAL_LIST_INIT(high_priority_sentience, typecacheof(list( /mob/living/basic/snake, /mob/living/basic/spider/giant/sgt_araneus, /mob/living/simple_animal/bot/secbot/beepsky, - /mob/living/simple_animal/hostile/retaliate/goose/vomit, /mob/living/basic/bear/snow/misha, /mob/living/basic/mining/lobstrosity/juvenile, ))) diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm index eeed75d2299eb..7a119ee92bd73 100644 --- a/code/modules/events/holiday/xmas.dm +++ b/code/modules/events/holiday/xmas.dm @@ -14,7 +14,7 @@ joke_paper.name = "[pick("awful","terrible","unfunny")] joke" joke_paper.add_raw_text(pick("What did one snowman say to the other?\n\n'Is it me or can you smell carrots?'", "Why couldn't the snowman get laid?\n\nHe was frigid!", - "Where are santa's helpers educated?\n\nNowhere, they're ELF-taught.", + "Where are Santa's helpers educated?\n\nNowhere, they're ELF-taught.", "What happened to the man who stole advent calanders?\n\nHe got 25 days.", "What does Santa get when he gets stuck in a chimney?\n\nClaus-trophobia.", "Where do you find chili beans?\n\nThe north pole.", @@ -75,7 +75,7 @@ max_occurrences = 1 earliest_start = 30 MINUTES category = EVENT_CATEGORY_HOLIDAY - description = "Spawns santa, who shall roam the station, handing out gifts." + description = "Spawns Santa, who shall roam the station, handing out gifts." /datum/round_event/ghost_role/santa role_name = "Santa" @@ -85,7 +85,7 @@ priority_announce("Santa is coming to town!", "Unknown Transmission") /datum/round_event/ghost_role/santa/start() - var/mob/chosen_one = SSpolling.poll_ghost_candidates("Santa is coming to town! Do you want to be [span_notice("Santa")]?", poll_time = 15 SECONDS, alert_pic = /obj/item/clothing/head/costume/santa, role_name_text = "santa", amount_to_pick = 1) + var/mob/chosen_one = SSpolling.poll_ghost_candidates("Santa is coming to town! Do you want to be [span_notice("Santa")]?", poll_time = 15 SECONDS, alert_pic = /obj/item/clothing/head/costume/santa, role_name_text = "Santa", amount_to_pick = 1) if(isnull(chosen_one)) return NOT_ENOUGH_PLAYERS santa = new /mob/living/carbon/human(pick(GLOB.blobstart)) diff --git a/code/modules/events/space_vines/vine_controller.dm b/code/modules/events/space_vines/vine_controller.dm index bd330668ba6cd..923b35fb82da9 100644 --- a/code/modules/events/space_vines/vine_controller.dm +++ b/code/modules/events/space_vines/vine_controller.dm @@ -16,9 +16,9 @@ GLOBAL_LIST_INIT(vine_mutations_list, init_vine_mutation_list()) //List of currently processed vines, on this level to prevent runtime tomfoolery var/list/obj/structure/spacevine/queue_end ///Spread multiplier, depends on productivity, affects how often kudzu spreads - var/spread_multiplier = 5 // corresponds to artifical kudzu with production speed of 1, approaches 10% of total vines will spread per second + var/spread_multiplier = 5 // corresponds to artificial kudzu with production speed of 1, approaches 10% of total vines will spread per second ///Maximum spreading limit (ie. how many kudzu can there be) for this controller - var/spread_cap = 30 // corresponds to artifical kudzu with production speed of 3.5 + var/spread_cap = 30 // corresponds to artificial kudzu with production speed of 3.5 ///The chance that we will develop a new mutation var/mutativeness = 1 ///Maximum sum of mutation severities diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index a57437dc1eee1..afbea50490136 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -295,11 +295,11 @@ var/static/list/mob_list = list( /mob/living/basic/bear, /mob/living/basic/cockroach/glockroach/mobroach, + /mob/living/basic/goose, /mob/living/basic/lightgeist, /mob/living/basic/mothroach, /mob/living/basic/mushroom, /mob/living/basic/viscerator, - /mob/living/simple_animal/hostile/retaliate/goose, //Janitors HATE geese. /mob/living/basic/pet/gondola, ) return pick(mob_list) diff --git a/code/modules/events/wizard/petsplosion.dm b/code/modules/events/wizard/petsplosion.dm index 58d463ab9dfd7..09ee4348f7052 100644 --- a/code/modules/events/wizard/petsplosion.dm +++ b/code/modules/events/wizard/petsplosion.dm @@ -6,6 +6,7 @@ GLOBAL_LIST_INIT(petsplosion_candidates, typecacheof(list( /mob/living/basic/chicken, /mob/living/basic/cow, /mob/living/basic/goat, + /mob/living/basic/goose/vomit, /mob/living/basic/lizard, /mob/living/basic/mothroach, /mob/living/basic/mouse/brown/tom, @@ -17,7 +18,6 @@ GLOBAL_LIST_INIT(petsplosion_candidates, typecacheof(list( /mob/living/basic/sloth, /mob/living/basic/snake, /mob/living/basic/spider/giant/sgt_araneus, - /mob/living/simple_animal/hostile/retaliate/goose/vomit, ))) /datum/round_event_control/wizard/petsplosion //the horror diff --git a/code/modules/experisci/experiment/experiments.dm b/code/modules/experisci/experiment/experiments.dm index b98ae843f7102..213a90a47eafa 100644 --- a/code/modules/experisci/experiment/experiments.dm +++ b/code/modules/experisci/experiment/experiments.dm @@ -144,7 +144,7 @@ /datum/experiment/scanning/random/material/meat name = "Biological Material Scanning Experiment" - description = "They told us we couldn't make chairs out of every material in the world. You're here to prove those nay-sayers wrong." + description = "They told us we couldn't make chairs out of every material in the world. You're here to prove those naysayers wrong." possible_material_types = list(/datum/material/meat) /datum/experiment/scanning/random/material/easy diff --git a/code/modules/experisci/experiment/handlers/experiment_handler.dm b/code/modules/experisci/experiment/handlers/experiment_handler.dm index f01e8e2df429c..b02236eda2d23 100644 --- a/code/modules/experisci/experiment/handlers/experiment_handler.dm +++ b/code/modules/experisci/experiment/handlers/experiment_handler.dm @@ -274,6 +274,7 @@ */ /datum/component/experiment_handler/proc/link_experiment(datum/experiment/experiment) if (can_select_experiment(experiment)) + unlink_experiment() selected_experiment = experiment selected_experiment.on_selected(src) diff --git a/code/modules/explorer_drone/exploration_events/resource.dm b/code/modules/explorer_drone/exploration_events/resource.dm index f7c0c4b1a9d7b..762f661aa6cff 100644 --- a/code/modules/explorer_drone/exploration_events/resource.dm +++ b/code/modules/explorer_drone/exploration_events/resource.dm @@ -84,7 +84,7 @@ // EXPLORATION_SITE_RUINS 2/2 /datum/exploration_event/simple/resource/remnants - name = "dessicated corpse" + name = "desiccated corpse" required_site_traits = list(EXPLORATION_SITE_RUINS) required_tool = EXODRONE_TOOL_MULTITOOL discovery_log = "Discovered a corpse of a humanoid." diff --git a/code/modules/fishing/aquarium/aquarium_kit.dm b/code/modules/fishing/aquarium/aquarium_kit.dm index f18f67b931370..751dff2609c76 100644 --- a/code/modules/fishing/aquarium/aquarium_kit.dm +++ b/code/modules/fishing/aquarium/aquarium_kit.dm @@ -39,6 +39,7 @@ if(fish_type) var/obj/item/fish/spawned_fish = new fish_type(null) ADD_TRAIT(spawned_fish, TRAIT_FISH_FROM_CASE, TRAIT_GENERIC) + ADD_TRAIT(spawned_fish, TRAIT_NO_FISHING_ACHIEVEMENT, TRAIT_GENERIC) spawned_fish.forceMove(src) // trigger storage.handle_entered /obj/item/storage/fish_case/proc/get_fish_type() diff --git a/code/modules/fishing/fish/_fish.dm b/code/modules/fishing/fish/_fish.dm index f99cec5614ba1..17e11c3dcf21b 100644 --- a/code/modules/fishing/fish/_fish.dm +++ b/code/modules/fishing/fish/_fish.dm @@ -968,7 +968,7 @@ REMOVE_TRAIT(src, TRAIT_UNCOMPOSTABLE, INNATE_TRAIT) stop_flopping() if(!silent) - var/message = span_notice(replacetext(death_text, "%SRC", "[src]")) + var/message = span_warning(replacetext(death_text, "%SRC", "[src]")) if(loc && HAS_TRAIT(loc, TRAIT_IS_AQUARIUM)) loc.visible_message(message) else diff --git a/code/modules/fishing/fish/types/air_space.dm b/code/modules/fishing/fish/types/air_space.dm index 5b73b08513192..1a1d809526b51 100644 --- a/code/modules/fishing/fish/types/air_space.dm +++ b/code/modules/fishing/fish/types/air_space.dm @@ -51,7 +51,7 @@ /obj/item/fish/bumpy name = "bump-fish" fish_id = "bumpy" - desc = "An misshapen fish-thing all covered in stubby little tendrils" + desc = "A misshapen fish-thing all covered in stubby little tendrils." icon_state = "bumpy" sprite_height = 4 sprite_width = 5 diff --git a/code/modules/fishing/fish/types/anadromous.dm b/code/modules/fishing/fish/types/anadromous.dm index 02d126bb30183..a46ef055c62af 100644 --- a/code/modules/fishing/fish/types/anadromous.dm +++ b/code/modules/fishing/fish/types/anadromous.dm @@ -39,8 +39,8 @@ icon = 'icons/obj/aquarium/wide.dmi' icon_state = "pike" inhand_icon_state = "pike" - base_pixel_x = -16 - pixel_x = -16 + base_pixel_w = -16 + pixel_w = -16 stable_population = 4 sprite_width = 10 sprite_height = 3 diff --git a/code/modules/fishing/fish/types/freshwater.dm b/code/modules/fishing/fish/types/freshwater.dm index 64ddb98918b56..6e0a5154a6259 100644 --- a/code/modules/fishing/fish/types/freshwater.dm +++ b/code/modules/fishing/fish/types/freshwater.dm @@ -182,7 +182,7 @@ /obj/item/fish/tadpole name = "tadpole" fish_id = "tadpole" - desc = "The larval spawn of an amphibian. A very minuscle, round creature with a long tail it uses to swim around." + desc = "The larval spawn of an amphibian. A very miniscule, round creature with a long tail it uses to swim around." icon_state = "tadpole" average_size = 3 average_weight = 10 diff --git a/code/modules/fishing/fish/types/rift.dm b/code/modules/fishing/fish/types/rift.dm index 5cbad079bd817..3c403dd495510 100644 --- a/code/modules/fishing/fish/types/rift.dm +++ b/code/modules/fishing/fish/types/rift.dm @@ -63,7 +63,8 @@ /obj/item/fish/starfish/chrystarfish/set_status(new_status, silent) . = ..() if(new_status == FISH_DEAD) - new fillet_type(get_turf(src)) + if(fillet_type) + new fillet_type(get_turf(src)) playsound(src, SFX_SHATTER, 50) qdel(src) @@ -126,8 +127,8 @@ pickup_sound = SFX_FISH_PICKUP sound_vary = TRUE - base_pixel_x = -16 - pixel_x = -16 + base_pixel_w = -16 + pixel_w = -16 sprite_width = 13 sprite_height = 9 diff --git a/code/modules/fishing/fish/types/ruins.dm b/code/modules/fishing/fish/types/ruins.dm index 42a84be3248c1..10e921a2b25cb 100644 --- a/code/modules/fishing/fish/types/ruins.dm +++ b/code/modules/fishing/fish/types/ruins.dm @@ -5,8 +5,8 @@ desc = "A monster of exposed muscles and innards, wrapped in a fish-like skeleton. You don't remember ever seeing it on the catalog." icon = 'icons/obj/aquarium/wide.dmi' icon_state = "mastodon" - base_pixel_x = -16 - pixel_x = -16 + base_pixel_w = -16 + pixel_w = -16 sprite_width = 12 sprite_height = 7 fish_flags = parent_type::fish_flags & ~FISH_FLAG_SHOW_IN_CATALOG diff --git a/code/modules/fishing/fish/types/saltwater.dm b/code/modules/fishing/fish/types/saltwater.dm index 2b1cc4afdf29b..cf8e0650dbad6 100644 --- a/code/modules/fishing/fish/types/saltwater.dm +++ b/code/modules/fishing/fish/types/saltwater.dm @@ -158,8 +158,8 @@ wound_bonus = 10 bare_wound_bonus = 20 armour_penetration = 75 - base_pixel_x = -18 - pixel_x = -18 + base_pixel_w = -18 + pixel_w = -18 sprite_width = 13 sprite_height = 6 stable_population = 3 diff --git a/code/modules/fishing/fish/types/station.dm b/code/modules/fishing/fish/types/station.dm index f8078579a5311..75c3d8fb47901 100644 --- a/code/modules/fishing/fish/types/station.dm +++ b/code/modules/fishing/fish/types/station.dm @@ -255,8 +255,8 @@ desc = "A deliciously extremophile alien fish. This one is so big, you could write legends about it." icon = 'icons/obj/aquarium/wide.dmi' icon_state = "nessiefish" - base_pixel_x = -16 - pixel_x = -16 + base_pixel_w = -16 + pixel_w = -16 sprite_width = 12 sprite_height = 4 average_size = 150 diff --git a/code/modules/fishing/fish/types/syndicate.dm b/code/modules/fishing/fish/types/syndicate.dm index a1c32830f44ed..bd8801f639a58 100644 --- a/code/modules/fishing/fish/types/syndicate.dm +++ b/code/modules/fishing/fish/types/syndicate.dm @@ -95,8 +95,8 @@ sharpness = SHARP_EDGED tool_behaviour = TOOL_SAW toolspeed = 0.5 - base_pixel_x = -16 - pixel_x = -16 + base_pixel_w = -16 + pixel_w = -16 sprite_width = 8 sprite_height = 5 stable_population = 3 @@ -217,7 +217,7 @@ /obj/item/fish/pike/armored name = "armored pike" fish_id = "armored_pike" - desc = "A long-bodied, metal-clad predator with a snout that almost looks like an halberd. Definitely a weapon to swing around." + desc = "A long-bodied, metal-clad predator with a snout that almost looks like a halberd. Definitely a weapon to swing around." icon_state = "armored_pike" inhand_icon_state = "armored_pike" attack_verb_continuous = list("attacks", "pokes", "jabs", "tears", "lacerates", "gores") diff --git a/code/modules/fishing/fish_mount.dm b/code/modules/fishing/fish_mount.dm index 4649f2e9125c2..65e2c0d3ce1ca 100644 --- a/code/modules/fishing/fish_mount.dm +++ b/code/modules/fishing/fish_mount.dm @@ -74,7 +74,7 @@ return ITEM_INTERACT_SUCCESS /obj/structure/fish_mount/proc/add_first_fish() - var/obj/item/fish/fish_path = pick(subtypesof(/obj/item/fish) - typesof(/obj/item/fish/holo)) + var/obj/item/fish/fish_path = pick(subtypesof(/obj/item/fish) - list(typesof(/obj/item/fish/holo) + list(/obj/item/fish/starfish/chrystarfish))) // chrystarfish immediately shatters when placed if(fish_path.fish_id_redirect_path) fish_path = fish_path.fish_id_redirect_path var/fluff_name = pick("John Trasen III", "a nameless intern", "Pun Pun", AQUARIUM_COMPANY, "Unknown", "Central Command") diff --git a/code/modules/fishing/fishing_equipment.dm b/code/modules/fishing/fishing_equipment.dm index 4961fdbc042c8..47ee0e6c123bb 100644 --- a/code/modules/fishing/fishing_equipment.dm +++ b/code/modules/fishing/fishing_equipment.dm @@ -23,7 +23,7 @@ name = "reinforced fishing line reel" desc = "Essential for fishing in extreme environments." icon_state = "reel_green" - line_color = "#2b9c2b" + line_color = "#2aae34" wiki_desc = "Allows you to fish in lava and plasma rivers and lakes." /obj/item/fishing_line/reinforced/Initialize(mapload) @@ -52,7 +52,7 @@ desc = "This specialized line is much harder to snap." icon_state = "reel_red" fishing_line_traits = FISHING_LINE_BOUNCY - line_color = "#99313f" + line_color = "#af221f" wiki_desc = "It reduces the progression loss during the fishing minigame." /obj/item/fishing_line/sinew @@ -580,3 +580,43 @@ #undef MAGNET_HOOK_BONUS_MULTIPLIER #undef RESCUE_HOOK_FISH_MULTIPLIER + +/obj/item/storage/bag/fishing + name = "fishing bag" + desc = "A vibrant bag for storing caught fish." + icon = 'icons/obj/fishing.dmi' + icon_state = "fishing_bag" + worn_icon_state = "fishing_bag" + resistance_flags = FLAMMABLE + custom_price = PAYCHECK_CREW * 3 + ///How much holding this affects fishing difficulty + var/fishing_modifier = -2 + +/obj/item/storage/bag/fishing/Initialize(mapload) + . = ..() + atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL + atom_storage.max_total_storage = 24 // Up to 8 normal fish + atom_storage.max_slots = 21 + atom_storage.set_holdable(/obj/item/fish) + AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier, ITEM_SLOT_HANDS) + +/obj/item/storage/bag/fishing/carpskin + name = "carpskin fishing bag" + desc = "A dapper fishing bag made from carpskin. You can store quite a lot of fishing gear in the small pockets formed by larger scales." + icon_state = "fishing_bag_carpskin" + worn_icon_state = "fishing_bag_carpskin" + resistance_flags = ACID_PROOF + storage_type = /datum/storage/carpskin_bag + fishing_modifier = -4 + +/obj/item/storage/bag/fishing/carpskin/Initialize(mapload) + . = ..() + atom_storage.max_total_storage = 42 // Up to 14 normal fish, but we're assuming that you'll be storing a bunch of gear as well + atom_storage.set_holdable(list( + /obj/item/fish, + /obj/item/fishing_line, + /obj/item/fishing_hook, + /obj/item/fishing_lure, + /obj/item/fish_analyzer, + /obj/item/bait_can, + )) diff --git a/code/modules/fishing/fishing_minigame.dm b/code/modules/fishing/fishing_minigame.dm index 41a78629aacea..d0a5bcb85ac35 100644 --- a/code/modules/fishing/fishing_minigame.dm +++ b/code/modules/fishing/fishing_minigame.dm @@ -18,17 +18,21 @@ /// The multiplier of how much the difficulty negatively impacts the bait height #define BAIT_HEIGHT_DIFFICULTY_MALUS 1.3 -///Defines to know how the bait is moving on the minigame slider. +/// Defines to know how the bait is moving on the minigame slider. #define REELING_STATE_IDLE 0 #define REELING_STATE_UP 1 #define REELING_STATE_DOWN 2 -///The pixel height of the minigame bar +/// The pixel height of the minigame bar #define MINIGAME_SLIDER_HEIGHT 76 -///The standard pixel height of the bait +/// The standard pixel height of the bait #define MINIGAME_BAIT_HEIGHT 27 -///The standard pixel height of the fish (minus a pixel on each direction for the sake of a better looking sprite) +/// How many pixels bottom and top parts of the bait take up +#define MINIGAME_BAIT_TOP_AND_BOTTOM_HEIGHT 6 +/// The standard pixel height of the fish (minus a pixel on each direction for the sake of a better looking sprite) #define MINIGAME_FISH_HEIGHT 4 +/// Pixel height of the completion bar +#define MINIGAME_COMPLETION_BAR_HEIGHT 80 GLOBAL_LIST_EMPTY(fishing_challenges_by_user) @@ -346,6 +350,7 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) completed = TRUE if(phase == MINIGAME_PHASE) remove_minigame_hud() + if(!QDELETED(user) && user.mind && start_time && !(special_effects & FISHING_MINIGAME_RULE_NO_EXP)) var/seconds_spent = (world.time - start_time) * 0.1 var/extra_exp_malus = user.mind.get_skill_level(/datum/skill/fishing) - difficulty * 0.1 @@ -355,16 +360,32 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) user.mind.adjust_experience(/datum/skill/fishing, round(seconds_spent * FISHING_SKILL_EXP_PER_SECOND * experience_multiplier)) if(user.mind.get_skill_level(/datum/skill/fishing) >= SKILL_LEVEL_LEGENDARY) user.client?.give_award(/datum/award/achievement/skill/legendary_fisher, user) - if(win) - if(reward_path != FISHING_DUD) - playsound(location, 'sound/effects/bigsplash.ogg', 100) - if(ispath(reward_path, /obj/item/fish) || isfish(reward_path)) - var/obj/item/fish/fish_reward = reward_path - var/obj/item/fish/redirect_path = initial(fish_reward.fish_id_redirect_path) - var/fish_id = ispath(redirect_path, /obj/item/fish) ? initial(redirect_path.fish_id) : initial(fish_reward.fish_id) - if(fish_id) - user.client?.give_award(/datum/award/score/progress/fish, user, fish_id) - SEND_SIGNAL(user, COMSIG_MOB_COMPLETE_FISHING, src, win) + + if(!win) + SEND_SIGNAL(user, COMSIG_MOB_COMPLETE_FISHING, src, FALSE) + if(!QDELETED(src)) + qdel(src) + return + + if(reward_path != FISHING_DUD) + playsound(location, 'sound/effects/bigsplash.ogg', 100) + + var/valid_achievement_catch = FALSE + if (ispath(reward_path, /obj/item/fish)) + valid_achievement_catch = TRUE + else if (isfish(reward_path)) + var/obj/item/fish/fishy_individual = reward_path + if (!HAS_TRAIT(fishy_individual, TRAIT_NO_FISHING_ACHIEVEMENT) && fishy_individual.status == FISH_ALIVE) + valid_achievement_catch = TRUE + + if(valid_achievement_catch) + var/obj/item/fish/fish_reward = reward_path + var/obj/item/fish/redirect_path = initial(fish_reward.fish_id_redirect_path) + var/fish_id = ispath(redirect_path, /obj/item/fish) ? initial(redirect_path.fish_id) : initial(fish_reward.fish_id) + if(fish_id) + user.client?.give_award(/datum/award/score/progress/fish, user, fish_id) + + SEND_SIGNAL(user, COMSIG_MOB_COMPLETE_FISHING, src, TRUE) if(!QDELETED(src)) qdel(src) @@ -640,7 +661,7 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) mover.move_fish(seconds_per_tick) move_bait(seconds_per_tick) if(!QDELETED(fishing_hud)) - update_visuals() + update_visuals(seconds_per_tick) ///The proc that handles fancy effects like flipping the hud or skewing movement /datum/fishing_challenge/proc/select_active_effect() @@ -759,12 +780,12 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) return (fish_position + fish_height >= bait_position) && (bait_position + bait_height >= fish_position) ///update the vertical pixel position of both fish and bait, and the icon state of the completion bar -/datum/fishing_challenge/proc/update_visuals() - var/bait_offset_mult = bait_position/FISHING_MINIGAME_AREA - fishing_hud.hud_bait.pixel_y = round(MINIGAME_SLIDER_HEIGHT * bait_offset_mult, 1) - var/fish_offset_mult = fish_position/FISHING_MINIGAME_AREA - fishing_hud.hud_fish.pixel_y = round(MINIGAME_SLIDER_HEIGHT * fish_offset_mult, 1) - fishing_hud.hud_completion.icon_state = "completion_[FLOOR(completion, 5)]" +/datum/fishing_challenge/proc/update_visuals(seconds_per_tick) + var/bait_offset_mult = bait_position / FISHING_MINIGAME_AREA + animate(fishing_hud.hud_bait, pixel_y = MINIGAME_SLIDER_HEIGHT * bait_offset_mult, time = seconds_per_tick SECONDS) + var/fish_offset_mult = fish_position / FISHING_MINIGAME_AREA + animate(fishing_hud.hud_fish, pixel_y = MINIGAME_SLIDER_HEIGHT * fish_offset_mult, time = seconds_per_tick SECONDS) + fishing_hud.hud_completion.update_state(completion, seconds_per_tick) ///The screen object which bait, fish, and completion bar are visually attached to. /atom/movable/screen/fishing_hud @@ -772,7 +793,6 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) screen_loc = "CENTER+1:8,CENTER:2" name = "fishing minigame" appearance_flags = APPEARANCE_UI|KEEP_TOGETHER - alpha = 230 ///The fish as shown in the minigame var/atom/movable/screen/hud_fish/hud_fish ///The bait as shown in the minigame @@ -783,12 +803,13 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) ///Initialize bait, fish and completion bar and add them to the visual appearance of this screen object. /atom/movable/screen/fishing_hud/proc/prepare_minigame(datum/fishing_challenge/challenge) icon_state = challenge.background - add_overlay("frame") + add_overlay(challenge.used_rod?.get_frame(challenge) || "frame_wood") hud_bait = new(null, null, challenge) hud_fish = new(null, null, challenge) - hud_completion = new(null, null, challenge) + hud_completion = new(null, null) vis_contents += list(hud_bait, hud_fish, hud_completion) challenge.user.client.screen += src + challenge.update_visuals(0) // Set all states to their initial positions so they don't jump around when the game starts master_ref = WEAKREF(challenge) /atom/movable/screen/fishing_hud/Destroy() @@ -802,26 +823,31 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) /atom/movable/screen/hud_bait icon = 'icons/hud/fishing_hud.dmi' - icon_state = "bait" + icon_state = "bait_bottom" vis_flags = VIS_INHERIT_ID - ///The stored value we used to squish the bar based on the difficulty - var/current_vertical_transform + var/cur_height = MINIGAME_BAIT_HEIGHT /atom/movable/screen/hud_bait/Initialize(mapload, datum/hud/hud_owner, datum/fishing_challenge/challenge) . = ..() if(!challenge || challenge.bait_pixel_height == MINIGAME_BAIT_HEIGHT) + update_icon() return + adjust_to_difficulty(challenge) /atom/movable/screen/hud_bait/proc/adjust_to_difficulty(datum/fishing_challenge/challenge) - if(current_vertical_transform) - transform = transform.Scale(1, 1/current_vertical_transform) - pixel_z = 0 - var/list/icon_dimensions = get_icon_dimensions(icon) - var/icon_height = icon_dimensions["height"] - current_vertical_transform = challenge.bait_pixel_height/MINIGAME_BAIT_HEIGHT - transform = transform.Scale(1, current_vertical_transform) - pixel_z = -icon_height * (1 - current_vertical_transform) * 0.5 + cur_height = challenge.bait_pixel_height + update_icon() + +/atom/movable/screen/hud_bait/update_overlays() + . = ..() + var/mutable_appearance/bait_top = mutable_appearance(icon, "bait_top") + bait_top.pixel_y += cur_height - MINIGAME_BAIT_TOP_AND_BOTTOM_HEIGHT + . += bait_top + for (var/i in 1 to (cur_height - MINIGAME_BAIT_TOP_AND_BOTTOM_HEIGHT)) + var/mutable_appearance/bait_bar = mutable_appearance(icon, "bait_bar") + bait_bar.pixel_y += i + . += bait_bar /atom/movable/screen/hud_fish icon = 'icons/hud/fishing_hud.dmi' @@ -835,13 +861,15 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) /atom/movable/screen/hud_completion icon = 'icons/hud/fishing_hud.dmi' - icon_state = "completion_0" + icon_state = "completion_overlay" vis_flags = VIS_INHERIT_ID -/atom/movable/screen/hud_completion/Initialize(mapload, datum/hud/hud_owner, datum/fishing_challenge/challenge) +/atom/movable/screen/hud_completion/Initialize(mapload, datum/hud/hud_owner) . = ..() - if(challenge) - icon_state = "completion_[FLOOR(challenge.completion, 5)]" + add_filter("completion_mask", 1, alpha_mask_filter(icon = icon(icon, "completion_overlay"))) + +/atom/movable/screen/hud_completion/proc/update_state(completion, seconds_per_tick) + animate(get_filter("completion_mask"), y = -MINIGAME_COMPLETION_BAR_HEIGHT * (1 - completion * 0.01), time = seconds_per_tick SECONDS) /// The visual that appears over the fishing spot /obj/effect/fishing_float @@ -888,6 +916,8 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) #undef MINIGAME_SLIDER_HEIGHT #undef MINIGAME_BAIT_HEIGHT #undef MINIGAME_FISH_HEIGHT +#undef MINIGAME_BAIT_TOP_AND_BOTTOM_HEIGHT +#undef MINIGAME_COMPLETION_BAR_HEIGHT #undef BAIT_HEIGHT_DIFFICULTY_MALUS diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index 6a7b37803719d..d78e4298599c6 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -41,12 +41,15 @@ /// The default color for the reel overlay if no line is equipped. var/default_line_color = "gray" - ///Is this currently being used by the profound fisher component? + /// Is this currently being used by the profound fisher component? var/internal = FALSE - ///The name of the icon state of the reel overlay + /// The name of the icon state of the reel overlay var/reel_overlay = "reel_overlay" + /// Icon state of the frame overlay this rod uses for the minigame + var/frame_state = "frame_wood" + /** * A list with two keys delimiting the spinning interval in which a mouse click has to be pressed while fishing. * Inherited from baits, passed down to the minigame lure. @@ -663,6 +666,9 @@ if(slot) SEND_SIGNAL(gone, COMSIG_ITEM_FISHING_ROD_UNSLOTTED, src, slot) +/obj/item/fishing_rod/proc/get_frame(datum/fishing_challenge/challenge) + return mutable_appearance('icons/hud/fishing_hud.dmi', frame_state) + ///Found in the fishing toolbox (the hook and line are separate items) /obj/item/fishing_rod/unslotted hook = null @@ -681,6 +687,7 @@ icon_state = "fishing_rod_bone" reel_overlay = "reel_bone" default_line_color = "red" + frame_state = "frame_bone" line = null //sinew line (usable to fish in lava) not included hook = /obj/item/fishing_hook/bone @@ -695,6 +702,7 @@ ui_description = "A collapsible fishing rod that can fit within a backpack." wiki_description = "It has to be bought from Cargo." reel_overlay = "reel_telescopic" + frame_state = "frame_telescopic" completion_speed_mult = 1.1 bait_speed_mult = 1.1 deceleration_mult = 1.1 @@ -758,12 +766,13 @@ /obj/item/fishing_rod/telescopic/master name = "master fishing rod" - desc = "The mythical rod of a lost fisher king. Said to be imbued with un-paralleled fishing power. There's writing on the back of the pole. \"中国航天制造\"" + desc = "The mythical rod of a lost fisher king. Said to be imbued with unparalleled fishing power. There's writing on the back of the pole. \"中国航天制造\"" difficulty_modifier = -10 ui_description = "A mythical telescopic fishing rod that makes fishing quite easier." wiki_description = null icon_state = "fishing_rod_master" reel_overlay = "reel_master" + frame_state = "frame_master" active_force = 13 //It's that sturdy cast_range = 5 line = /obj/item/fishing_line/bouncy @@ -783,6 +792,7 @@ wiki_description = "It requires the Advanced Fishing Technology Node to be researched to be printed." icon_state = "fishing_rod_science" reel_overlay = "reel_science" + frame_state = "frame_science" bait = /obj/item/food/bait/doughball/synthetic/unconsumable completion_speed_mult = 1.1 bait_speed_mult = 1.1 @@ -819,6 +829,7 @@ desc = "A custom fishing rod from your local autolathe." icon_state = "fishing_rod_material" reel_overlay = "reel_material" + frame_state = "frame_material" ui_description = "An autolathe-printable fishing rod made of some material." wiki_description = "Different materials can have different effects. They also catch fish made of the same material used to print the rod." material_flags = MATERIAL_EFFECTS|MATERIAL_AFFECT_STATISTICS|MATERIAL_COLOR|MATERIAL_ADD_PREFIX @@ -831,6 +842,11 @@ . = ..() name = "fishing rod" //so it doesn't reset to "material fishing rod" +/obj/item/fishing_rod/material/get_frame(datum/fishing_challenge/challenge) + var/mutable_appearance/frame = ..() + frame.color = color + return frame + #undef ROD_SLOT_BAIT #undef ROD_SLOT_LINE #undef ROD_SLOT_HOOK diff --git a/code/modules/fishing/sources/_fish_source.dm b/code/modules/fishing/sources/_fish_source.dm index c747450986389..58c9e1aea6583 100644 --- a/code/modules/fishing/sources/_fish_source.dm +++ b/code/modules/fishing/sources/_fish_source.dm @@ -273,6 +273,8 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons()) fisherman.balloon_alert(fisherman, "caught something!") return fisherman.balloon_alert(fisherman, "caught [reward]!") + if (isfish(reward)) + ADD_TRAIT(reward, TRAIT_NO_FISHING_ACHIEVEMENT, TRAIT_GENERIC) return reward diff --git a/code/modules/fishing/sources/source_types.dm b/code/modules/fishing/sources/source_types.dm index d23e03ce97675..ff616ff14983f 100644 --- a/code/modules/fishing/sources/source_types.dm +++ b/code/modules/fishing/sources/source_types.dm @@ -38,6 +38,7 @@ overlay_state = "portal_beach" /datum/fish_source/ice_fishing + background = "background_ice" catalog_description = "Ice-covered water" radial_state = "ice" overlay_state = "portal_ocean" @@ -147,7 +148,7 @@ REMOVE_TRAIT(spot.parent, TRAIT_MESSAGE_IN_A_BOTTLE_LOCATION, INNATE_TRAIT) /datum/fish_source/portal/chasm - background = "background_lavaland" + background = "background_chasm" fish_table = list( FISHING_DUD = 5, /obj/item/fish/chasm_crab = 10, @@ -195,6 +196,7 @@ REMOVE_TRAIT(spot.parent, TRAIT_MESSAGE_IN_A_BOTTLE_LOCATION, INNATE_TRAIT) /datum/fish_source/portal/hyperspace + background = "background_space" fish_table = list( FISHING_DUD = 5, /obj/item/fish/starfish = 6, @@ -317,7 +319,7 @@ /datum/fish_source/chasm catalog_description = "Chasm depths" - background = "background_lavaland" + background = "background_chasm" radial_state = "ground_hole" overlay_state = "portal_chasm" fish_table = list( @@ -370,6 +372,7 @@ return "You'll need reinforced fishing line to fish in there." /datum/fish_source/lavaland/icemoon + background = "background_plasma" catalog_description = "Liquid plasma vents" radial_state = "plasma" fish_table = list( @@ -395,6 +398,7 @@ overlay_state = "portal_plasma" /datum/fish_source/moisture_trap + background = "background_dank" catalog_description = "Moisture trap basins" radial_state = "garbage" overlay_state = "portal_river" // placeholder @@ -406,6 +410,7 @@ fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 20 /datum/fish_source/toilet + background = "background_dank" catalog_description = "Station toilets" radial_state = "toilet" duds = list("ewww... nothing", "it was nothing", "it was toilet paper", "it was flushed away", "the hook is empty", "where's the damn money?!") @@ -470,6 +475,7 @@ UnregisterSignal(user, COMSIG_MOVABLE_MOVED) /datum/fish_source/oil_well + background = "background_oil_well" catalog_description = "Oil wells" radial_state = "oil" overlay_state = "portal_chasm" //close enough to pitch black @@ -494,6 +500,7 @@ fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 25 /datum/fish_source/hydro_tray + background = "background_tray" catalog_description = "Hydroponics trays" radial_state = "hydro" overlay_state = "portal_tray" @@ -604,6 +611,7 @@ return new picked_path(spawn_location) /datum/fish_source/carp_rift + background = "background_carp_rift" catalog_description = "Space Dragon Rifts" radial_state = "carp" overlay_state = "portal_rift" @@ -627,6 +635,7 @@ fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 28 /datum/fish_source/deepfryer + background = "background_lavaland" catalog_description = "Deep Fryers" radial_state = "fryer" overlay_state = "portal_fry" // literally resprited lava. better than nothing @@ -773,6 +782,7 @@ fish_source_flags = FISH_SOURCE_FLAG_EXPLOSIVE_MALUS /datum/fish_source/vending + background = "background_chasm" catalog_description = "Vending Machines" radial_state = "vending" overlay_state = "portal_randomizer" @@ -943,9 +953,10 @@ return reward /datum/fish_source/dimensional_rift - catalog_description = null //it's a secret (sorta, I know you're reading this) + background = "background_mansus" + catalog_description = null // it's a secret (sorta, I know you're reading this) radial_state = "cursed" // placeholder - overlay_state = "portal_rift_2" // yeah good luck adaptin the rift sprite to this template. recolored randomizer's the best you're getting + overlay_state = "portal_mansus" fish_table = list( FISHING_INFLUENCE = 6, FISHING_RANDOM_ARM = 3, diff --git a/code/modules/food_and_drinks/machinery/smartfridge.dm b/code/modules/food_and_drinks/machinery/smartfridge.dm index afd566b7e479d..36fafdf4ff7ff 100644 --- a/code/modules/food_and_drinks/machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/machinery/smartfridge.dm @@ -64,7 +64,7 @@ return ITEM_INTERACT_BLOCKING user.visible_message( - span_notice("[user.name] starts to cut the [name] free from the floor."), + span_notice("[user.name] starts to cut \the [src] free from the floor."), span_notice("You start to cut [src] free from the floor..."), span_hear("You hear welding."), ) @@ -84,7 +84,7 @@ return ITEM_INTERACT_BLOCKING user.visible_message( - span_notice("[user.name] starts to weld the [name] to the floor."), + span_notice("[user.name] starts to weld \the [src] to the floor."), span_notice("You start to weld [src] to the floor..."), span_hear("You hear welding."), ) diff --git a/code/modules/food_and_drinks/machinery/stove.dm b/code/modules/food_and_drinks/machinery/stove.dm index 6cc0ec527894f..67fa7ae96eaa1 100644 --- a/code/modules/food_and_drinks/machinery/stove.dm +++ b/code/modules/food_and_drinks/machinery/stove.dm @@ -47,7 +47,6 @@ /obj/item/reagent_containers/cup/soup_pot/Initialize(mapload, vol) . = ..() - RegisterSignal(reagents, COMSIG_REAGENTS_CLEAR_REAGENTS, PROC_REF(on_reagents_cleared)) RegisterSignal(src, COMSIG_ATOM_REAGENT_EXAMINE, PROC_REF(reagent_special_examine)) register_context() @@ -203,15 +202,14 @@ return FALSE return TRUE -/obj/item/reagent_containers/cup/soup_pot/proc/on_reagents_cleared(datum/source, datum/reagent/changed) - SIGNAL_HANDLER - - dump_ingredients() +/obj/item/reagent_containers/cup/soup_pot/try_splash(mob/user, atom/target) + . = ..() + if(!. && LAZYLEN(added_ingredients)) + dump_ingredients() /obj/item/reagent_containers/cup/soup_pot/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum, do_splash) . = ..() if(!. && LAZYLEN(added_ingredients)) - // Clearing reagents Will do this for us already, but if we have no reagents this is a failsafe dump_ingredients() /** diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index 82607e4049caa..c451c1f2746a3 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -173,7 +173,7 @@ return bomb_defused = FALSE log_bomber(user, "has trapped a", src, "with [bomb] set to [bomb_timer] seconds") - bomb.adminlog = "The [bomb.name] in [src.name] that [key_name(user)] activated has detonated!" + bomb.adminlog = "\The [bomb] in [src.name] that [key_name(user)] activated has detonated!" balloon_alert(user, "bomb set") update_appearance() else if(length(boxes)) diff --git a/code/modules/food_and_drinks/recipes/soup_mixtures.dm b/code/modules/food_and_drinks/recipes/soup_mixtures.dm index 2aab17f5b9ea0..264fc50f46963 100644 --- a/code/modules/food_and_drinks/recipes/soup_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/soup_mixtures.dm @@ -1126,7 +1126,7 @@ // Special soup for Ethereals to consume to gain nutrition (energy) from. /datum/reagent/consumable/nutriment/soup/electrons name = "Electron Soup" - description = "A gastronomic curiosity of ethereal origin. It is famed for the minature weather system formed over a properly prepared soup." + description = "A gastronomic curiosity of ethereal origin. It is famed for the miniature weather system formed over a properly prepared soup." data = list("mushroom" = 1, "electrons" = 4) glass_price = FOOD_PRICE_EXOTIC color = "#E60040" @@ -1966,7 +1966,7 @@ // Gyuramen /datum/reagent/consumable/nutriment/soup/gyuramen name = "Gyuramen Miy Käzu" - description = "A rich beef and onion ramen with cheese- blending several cultural influences seemlessly into one tasty dish." + description = "A rich beef and onion ramen with cheese, blending several cultural influences seemlessly into one tasty dish." data = list("beef broth" = 1, "onion" = 1, "cheese" = 1) color = "#442621" @@ -2094,7 +2094,7 @@ // Hong Kong Borscht /datum/reagent/consumable/nutriment/soup/hong_kong_borscht name = "Hong Kong Borscht" - description = "Also known as luo song tang or Russian soup, this dish bears little to no resemblance to Eastern European borscht- indeed, it's a tomato-based soup with no beets in sight." + description = "Also known as luo song tang or Russian soup, this dish bears little to no resemblance to Eastern European borscht; indeed, it's a tomato-based soup with no beets in sight." data = list("tomato" = 1, "meat" = 1, "cabbage" = 1) color = "#CA4810" diff --git a/code/modules/hallucination/inhand_fake_item.dm b/code/modules/hallucination/inhand_fake_item.dm index de3b6b99411e9..665c88113394c 100644 --- a/code/modules/hallucination/inhand_fake_item.dm +++ b/code/modules/hallucination/inhand_fake_item.dm @@ -118,7 +118,7 @@ name = "mirage" plane = ABOVE_HUD_PLANE interaction_flags_item = NONE - item_flags = ABSTRACT | DROPDEL | EXAMINE_SKIP | HAND_ITEM | NOBLUDGEON // Most of these flags don't matter, but better safe than sorry + item_flags = ABSTRACT | DROPDEL | HAND_ITEM | NOBLUDGEON // Most of these flags don't matter, but better safe than sorry resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF /// The hallucination that created us. var/datum/hallucination/parent @@ -132,7 +132,7 @@ RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(parent_deleting)) src.parent = parent - ADD_TRAIT(src, TRAIT_NODROP, INNATE_TRAIT) + add_traits(list(TRAIT_NODROP, TRAIT_EXAMINE_SKIP), INNATE_TRAIT) /obj/item/hallucinated/Destroy(force) UnregisterSignal(parent, COMSIG_QDELETING) diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index 0222fd41cdcf1..02722d8a15414 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -60,7 +60,7 @@ /turf/open/floor/holofloor/grass gender = PLURAL name = "lush grass" - desc = "Looking at the lushious field, you suddenly feel homesick." + desc = "Looking at the luscious field, you suddenly feel homesick." icon_state = "grass0" bullet_bounce_sound = null tiled_dirt = FALSE diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm index 640eadcd03541..665b5f19cc2a7 100644 --- a/code/modules/hydroponics/beekeeping/beebox.dm +++ b/code/modules/hydroponics/beekeeping/beebox.dm @@ -204,7 +204,7 @@ if(bees_attack) visible_message(span_danger("[user] disturbs the bees!")) else - visible_message(span_danger("[user] disturbs the [name] to no effect!")) + visible_message(span_danger("[user] disturbs \the [src] to no effect!")) else var/option = tgui_alert(user, "Which piece do you wish to remove?", "Apiary Adjustment", list("Honey Frame", "Queen Bee")) if(!option || QDELETED(user) || QDELETED(src) || !user.can_perform_action(src, NEED_DEXTERITY)) diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 3549b3e965f48..f5e7c7b29a404 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -73,7 +73,7 @@ if(!tool.tool_start_check(user, amount=2)) return TRUE user.visible_message( - span_notice("[user.name] starts to cut the [name] free from the floor."), + span_notice("[user.name] starts to cut \the [src] free from the floor."), span_notice("You start to cut [src] free from the floor..."), span_hear("You hear welding."), ) @@ -88,7 +88,7 @@ if(!tool.tool_start_check(user, amount=2)) return TRUE user.visible_message( - span_notice("[user.name] starts to weld the [name] to the floor."), + span_notice("[user.name] starts to weld \the [src] to the floor."), span_notice("You start to weld [src] to the floor..."), span_hear("You hear welding."), ) diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm index db47c5625e3ba..18640cd28281f 100644 --- a/code/modules/hydroponics/grown/banana.dm +++ b/code/modules/hydroponics/grown/banana.dm @@ -161,7 +161,7 @@ /obj/item/food/grown/banana/bunch name = "banana bunch" - desc = "Am exquisite bunch of bananas. The almost otherwordly plumpness steers the mind any discening entertainer towards the divine." + desc = "An exquisite bunch of bananas. The almost otherwordly plumpness steers the mind any discerning entertainer towards the divine." icon_state = "banana_bunch" bite_consumption_mod = 4 var/is_ripening = FALSE diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm index 10631e4dcb0b6..0ab3637d00acd 100644 --- a/code/modules/hydroponics/grown/berries.dm +++ b/code/modules/hydroponics/grown/berries.dm @@ -214,7 +214,7 @@ /obj/item/food/grown/lanternfruit seed = /obj/item/seeds/lanternfruit name = "lanternfruits" - desc = "A sofly glowing fruit with a handle-shaped stem, an Ethereal favorite!" + desc = "A softly glowing fruit with a handle-shaped stem, an Ethereal favorite!" icon_state = "lanternfruit" foodtypes = FRUIT tastes = list("tv static" = 1, "sour pear" = 1, "grapefruit" = 1) diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index d4ef53474fc97..7d142c0a5a860 100644 --- a/code/modules/hydroponics/grown/flowers.dm +++ b/code/modules/hydroponics/grown/flowers.dm @@ -53,7 +53,7 @@ //Spacemans's Trumpet /obj/item/seeds/poppy/lily/trumpet name = "spaceman's trumpet seed pack" - desc = "A plant sculped by extensive genetic engineering. The spaceman's trumpet is said to bear no resemblance to its wild ancestors. Inside NT AgriSci circles it is better known as NTPW-0372." + desc = "A plant sculpted by extensive genetic engineering. The spaceman's trumpet is said to bear no resemblance to its wild ancestors. Inside NT AgriSci circles it is better known as NTPW-0372." icon_state = "seed-trumpet" species = "spacemanstrumpet" plantname = "Spaceman's Trumpet Plant" diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm index a5cdc08fb7658..8177dafa13f29 100644 --- a/code/modules/hydroponics/grown/grass_carpet.dm +++ b/code/modules/hydroponics/grown/grass_carpet.dm @@ -58,7 +58,7 @@ /obj/item/food/grown/grass/fairy seed = /obj/item/seeds/grass/fairy name = "fairygrass" - desc = "Blue, glowing, and smells fainly of mushrooms." + desc = "Blue, glowing, and smells faintly of mushrooms." icon_state = "fairygrassclump" bite_consumption_mod = 1 stacktype = /obj/item/stack/tile/fairygrass diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm index 602b90f4c3567..a84d4d82ff7db 100644 --- a/code/modules/hydroponics/grown/replicapod.dm +++ b/code/modules/hydroponics/grown/replicapod.dm @@ -61,22 +61,14 @@ /obj/item/seeds/replicapod/Initialize(mapload) . = ..() - create_reagents(volume, INJECTABLE|DRAWABLE) + create_reagents(volume, INJECTABLE | DRAWABLE) /obj/item/seeds/replicapod/create_reagents(max_vol, flags) . = ..() - RegisterSignals(reagents, list(COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_NEW_REAGENT), PROC_REF(on_reagent_add)) - RegisterSignal(reagents, COMSIG_REAGENTS_DEL_REAGENT, PROC_REF(on_reagent_del)) - RegisterSignal(reagents, COMSIG_QDELETING, PROC_REF(on_reagents_del)) - -/// Handles the seeds' reagents datum getting deleted. -/obj/item/seeds/replicapod/proc/on_reagents_del(datum/reagents/reagents) - SIGNAL_HANDLER - UnregisterSignal(reagents, list(COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_QDELETING)) - return NONE + RegisterSignal(reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(on_reagent_update)) /// Handles reagents getting added to this seed. -/obj/item/seeds/replicapod/proc/on_reagent_add(datum/reagents/reagents) +/obj/item/seeds/replicapod/proc/on_reagent_update(datum/reagents/reagents) SIGNAL_HANDLER var/datum/reagent/blood/B = reagents.has_reagent(/datum/reagent/blood) if(!B) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index f0008f01ab584..40184ad4d05ed 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -1257,13 +1257,7 @@ RegisterSignal(attached_tray, COMSIG_HYDROTRAY_SET_PLANT_STATUS, PROC_REF(on_set_plant_status)) RegisterSignal(attached_tray, COMSIG_HYDROTRAY_ON_HARVEST, PROC_REF(on_harvest)) RegisterSignal(attached_tray, COMSIG_HYDROTRAY_PLANT_DEATH, PROC_REF(on_plant_death)) - var/list/reagents_holder_signals = list( - COMSIG_REAGENTS_ADD_REAGENT, - COMSIG_REAGENTS_REM_REAGENT, - COMSIG_REAGENTS_NEW_REAGENT, - COMSIG_REAGENTS_DEL_REAGENT, - ) - RegisterSignal(attached_tray, reagents_holder_signals, PROC_REF(update_reagents_level)) + RegisterSignal(attached_tray.reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(update_reagents_level)) /obj/item/circuit_component/hydroponics/unregister_usb_parent(atom/movable/parent) attached_tray = null @@ -1272,8 +1266,7 @@ COMSIG_HYDROTRAY_SET_PLANT_HEALTH, COMSIG_HYDROTRAY_SET_TOXIC, COMSIG_HYDROTRAY_SET_PLANT_STATUS, COMSIG_HYDROTRAY_ON_HARVEST, COMSIG_HYDROTRAY_PLANT_DEATH)) if(parent.reagents) - UnregisterSignal(parent.reagents, list(COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_REM_REAGENT, - COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_DEL_REAGENT)) + UnregisterSignal(parent.reagents, COMSIG_REAGENTS_HOLDER_UPDATED) return ..() /obj/item/circuit_component/hydroponics/get_ui_notices() diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm index 0df75d987e9c2..c8b890a295910 100644 --- a/code/modules/hydroponics/seed_extractor.dm +++ b/code/modules/hydroponics/seed_extractor.dm @@ -174,7 +174,7 @@ * needed to go to the ui handler * * to_add - what seed are we adding? - * taking_from - where are we taking the seed from? A mob, a bag, etc? If null its means its just laying on the turf so force move it in + * taking_from - where are we taking the seed from? A mob, a bag, etc? If null its means it's just laying on the turf so force move it in **/ /obj/machinery/seed_extractor/proc/add_seed(obj/item/seeds/to_add, atom/taking_from) var/seed_id = generate_seed_hash(to_add) diff --git a/code/modules/instruments/piano_synth.dm b/code/modules/instruments/piano_synth.dm index 8e107d494c779..5de8659b65e4a 100644 --- a/code/modules/instruments/piano_synth.dm +++ b/code/modules/instruments/piano_synth.dm @@ -26,6 +26,9 @@ force = 0 w_class = WEIGHT_CLASS_SMALL custom_price = PAYCHECK_CREW * 2.5 + equip_sound = SFX_HEADSET_EQUIP + pickup_sound = SFX_HEADSET_PICKUP + drop_sound = 'sound/items/handling/headset/headset_drop1.ogg' instrument_range = 1 circuit_type = /obj/item/circuit_component/synth/headphones shell_capacity = SHELL_CAPACITY_TINY diff --git a/code/modules/language/_language_holder.dm b/code/modules/language/_language_holder.dm index 8e970ddd17ad9..61fbb4f8e6a64 100644 --- a/code/modules/language/_language_holder.dm +++ b/code/modules/language/_language_holder.dm @@ -57,7 +57,7 @@ Key procs /datum/language_holder/New(atom/new_owner) if(new_owner) if(QDELETED(new_owner)) - CRASH("Langauge holder added to a qdeleting thing, what the fuck [text_ref(new_owner)]") + CRASH("Language holder added to a qdeleting thing, what the fuck [text_ref(new_owner)]") if(!ismovable(new_owner)) CRASH("Language holder being added to a non-movable thing, this is invalid (was: [new_owner] / [new_owner.type])") diff --git a/code/modules/language/nekomimetic.dm b/code/modules/language/nekomimetic.dm index 4be943f84417a..c947c185f23d8 100644 --- a/code/modules/language/nekomimetic.dm +++ b/code/modules/language/nekomimetic.dm @@ -1,6 +1,6 @@ /datum/language/nekomimetic name = "Nekomimetic" - desc = "To the casual observer, this langauge is an incomprehensible mess of broken Japanese. To the felinids, it's somehow comprehensible." + desc = "To the casual observer, this language is an incomprehensible mess of broken Japanese. To the felinids, it's somehow comprehensible." key = "f" space_chance = 70 syllables = list( diff --git a/code/modules/library/skill_learning/job_skillchips/clown.dm b/code/modules/library/skill_learning/job_skillchips/clown.dm index f8836b41dcad3..c94be3c7a55c6 100644 --- a/code/modules/library/skill_learning/job_skillchips/clown.dm +++ b/code/modules/library/skill_learning/job_skillchips/clown.dm @@ -1,6 +1,6 @@ /obj/item/skillchip/job/clown name = "B@L00NY skillchip" - desc = "This biochip contain several terabytes of uncannily religious, Honkmother praising guides on how to reshape balloons into silly animals." + desc = "This biochip contains several terabytes of uncannily religious, Honkmother-praising guides on how to reshape balloons into silly animals." auto_traits = list(TRAIT_BALLOON_SUTRA) skill_name = "Balloon Sutra" skill_description = "Learn the ancient Honkmotherian arts of balloon-sutra." diff --git a/code/modules/library/skill_learning/job_skillchips/research_director.dm b/code/modules/library/skill_learning/job_skillchips/research_director.dm index 07bc945e1d180..1785e9c663886 100644 --- a/code/modules/library/skill_learning/job_skillchips/research_director.dm +++ b/code/modules/library/skill_learning/job_skillchips/research_director.dm @@ -1,9 +1,9 @@ /obj/item/skillchip/research_director name = "R.D.S.P.L.X. skillchip" - desc = "Knowledge of how to solve the ancient conumdrum; what happens when an unstoppable force meets an immovable object." + desc = "Knowledge of how to solve the ancient conundrum: what happens when an unstoppable force meets an immovable object." auto_traits = list(TRAIT_ROD_SUPLEX, TRAIT_STRENGTH) skill_name = "True Strength" - skill_description = "The knowledge and strength to resolve the most ancient conumdrum; what happens when an unstoppable force meets an immovable object." + skill_description = "The knowledge and strength to resolve the most ancient conundrum: what happens when an unstoppable force meets an immovable object." skill_icon = "dumbbell" activate_message = span_notice("You realise if you apply the correct force, at the correct angle, it is possible to make the immovable permanently movable. And... damn, you look huge.") deactivate_message = span_notice("You forget how to permanently anchor a paradoxical object. Also, you should really hit the gym...") diff --git a/code/modules/mafia/roles/roles.dm b/code/modules/mafia/roles/roles.dm index b035b618ec4e7..77f46cddac74a 100644 --- a/code/modules/mafia/roles/roles.dm +++ b/code/modules/mafia/roles/roles.dm @@ -116,7 +116,7 @@ * Adds the playing_mafia trait so people examining them will know why they're currently lacking a soul. */ /datum/mafia_role/proc/put_player_in_body(client/player) - if(player.mob.mind && player.mob.mind.current) + if(player.mob.mind) body.AddComponent( \ /datum/component/temporary_body, \ old_mind = player.mob.mind, \ diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm index 4aecd64aa1699..0309ac3fbab24 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm @@ -322,7 +322,7 @@ /obj/structure/closet/crate/grave/filled/lead_researcher name = "ominous burial mound" - desc = "Even in a place filled to the brim with graves, this one shows a level of preperation and planning that fills you with dread." + desc = "Even in a place filled to the brim with graves, this one shows a level of preparation and planning that fills you with dread." icon = 'icons/obj/storage/crates.dmi' icon_state = "grave_lead" lead_tomb = TRUE diff --git a/code/modules/mapfluff/ruins/spaceruin_code/anomalyresearch.dm b/code/modules/mapfluff/ruins/spaceruin_code/anomalyresearch.dm index ce57d47c6e9b7..8a1e4c760e967 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/anomalyresearch.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/anomalyresearch.dm @@ -6,7 +6,7 @@ /obj/effect/anomaly/pyro/big, /obj/effect/anomaly/flux/big, /obj/effect/anomaly/bluespace/big, - /obj/effect/anomaly/grav/high/big + /obj/effect/anomaly/grav/high/big, ) ///Spawns a stable anomally that doesnt drop cores and doesn't destroy or alter the environment @@ -17,7 +17,7 @@ /obj/effect/anomaly/flux, /obj/effect/anomaly/bluespace, /obj/effect/anomaly/hallucination, - /obj/effect/anomaly/bioscrambler/docile + /obj/effect/anomaly/bioscrambler/docile, ) ///Do we anchor the anomaly? Set to true if you don't want anomalies drifting away (like if theyre in space or something) @@ -29,6 +29,14 @@ var/obj/effect/anomaly/anomaly = . anomaly.stabilize(anchor = anchor_anomaly, has_core = FALSE) +/obj/effect/spawner/random/environmentally_safe_anomaly/bioscramblerless + name = "safe anomaly spawner without bioscramblers" + loot = list( + /obj/effect/anomaly/flux, + /obj/effect/anomaly/bluespace, + /obj/effect/anomaly/hallucination, + ) + /obj/effect/spawner/random/environmentally_safe_anomaly/immobile name = "stationary safe anomaly spawner" icon_state = "anomaly_stationary" diff --git a/code/modules/mapfluff/ruins/spaceruin_code/commsbuoy.dm b/code/modules/mapfluff/ruins/spaceruin_code/commsbuoy.dm index 9ddf111958cdf..4dcd44031e749 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/commsbuoy.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/commsbuoy.dm @@ -220,7 +220,7 @@
The Spinward Project - brought to you by Nanotrasen Futures and Innovation Division, in partnership with Nanotrasen \ Heavy Industry.

", - "14/08/2563 - Inbound to Foward -
\ + "14/08/2563 - Inbound to Forward -
\ From: wilson_peters@NTFIDspinward.nt
\ Relay Target: PORT_ELLIS
\
\ diff --git a/code/modules/mapfluff/ruins/spaceruin_code/dangerous_research.dm b/code/modules/mapfluff/ruins/spaceruin_code/dangerous_research.dm index fac38e0a46e06..2d912d8461c85 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/dangerous_research.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/dangerous_research.dm @@ -18,7 +18,7 @@ /obj/item/paper/fluff/ruins/dangerous_research/beaches_journal_2 name = "Journal of Dreams-Of-Beaches - Day 33" default_raw_text = "Something odd is going on. John has been blinded and muted for a time now but he's still moving around in that central chamber, drawing something. Elias, Smith, and Whitner seem to have some idea about what's going on and won't answer my questions.
I'm going to sneak into the lab tonight to get a look at those drawings." - + /obj/item/paper/fluff/ruins/dangerous_research/beaches_journal_3 name = "Journal of Dreams-Of-Beaches - Day 52" default_raw_text = "Smith was in the chamber, gone in an instant.
I don't know what happened to the doctor or Elias, I just heard flesh tearing and glass shattering.
When my eyes opened, the room was painted in red and rust.
Simes was there, but she just flashed away, all that was left was the gun.
Armstrong grabbed me and we somehow made it out, boarded it up with the tables in the lobby.
Took two of the suits, we'll send out a distress signal when we're out there." @@ -37,7 +37,7 @@ /// Lore Terminals /obj/machinery/computer/terminal/dangerous_research/front_desk upperinfo = "ISSUE REPORT - Officer Simes" - content = list("Day 003 - Code 201 -> Three days into the 100 day mission, Doctor Greyham and Researcher Smith got into a minor dispute over the owner of a biopsy tool. Both were seperated and reprimanded by the Head Occultist.
\ + content = list("Day 003 - Code 201 -> Three days into the 100 day mission, Doctor Greyham and Researcher Smith got into a minor dispute over the owner of a biopsy tool. Both were separated and reprimanded by the Head Occultist.
\ Day 014 - Code 104 -> Another issue with Researcher Smith, who was found to be using the chem dispensers to produce low-grade stimulants. Head Occultist Valentin seemed incredibly upset at the relatively harmless drugs, and has banned all production of stimulants.
\ Day 022 - Code ??? -> The HO and Armstrong are bickering, unsure about what, but since what Armstrong's suggesting will stop that horrific noise, I'm siding with them. The HO gave me a nasty look when I spoke up about the lack of sleep.
\ Day 034 - Code 109 -> Doctor Beaches apparently entered a restricted area during the off hours to check on a research sample without the Head Occultist's permission. A curfew has been installed.
\ diff --git a/code/modules/mapfluff/ruins/spaceruin_code/derelict_sulaco.dm b/code/modules/mapfluff/ruins/spaceruin_code/derelict_sulaco.dm index 026b9b690b8b0..202b1e64ea3c6 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/derelict_sulaco.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/derelict_sulaco.dm @@ -16,7 +16,7 @@ /obj/item/clothing/suit/armor/vest/marine/sulaco name = "damaged tactical armor vest" - desc = "An old, roughed up set of the finest mass produced, stamped plasteel armor. This piece of equipment has lost most of its protective qualities to time, yet it is still more than serviceable for giving xenos the middle finger." + desc = "An old, roughed-up set of the finest mass produced, stamped plasteel armor. This piece of equipment has lost most of its protective qualities to time, yet it is still more than serviceable for giving xenos the middle finger." armor_type = /datum/armor/derelict_marine /obj/item/clothing/head/helmet/marine/sulaco diff --git a/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_fluff.dm b/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_fluff.dm index a0b4adb9f75d2..e5ec636655393 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_fluff.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_fluff.dm @@ -70,7 +70,7 @@ /obj/item/paper/fluff/ruins/oldstation/protoinv name = "Laboratory Inventory" - default_raw_text = "*Inventory*

(1) Prototype MODsuit

(1)Health Analyser

(1)Prototype Energy Gun

(1)Singularity Generation Disk

DO NOT REMOVE WITHOUT \ + default_raw_text = "*Inventory*

(1)Prototype MODsuit

(1)Health Analyser

(1)Prototype Energy Gun

(1)Supermatter Crystal Shard

DO NOT REMOVE WITHOUT \ THE CAPTAIN AND RESEARCH DIRECTOR'S AUTHORISATION" /obj/item/paper/fluff/ruins/oldstation/generator_manual diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index 950f3e2809ef2..0f6ff85eed92f 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -61,17 +61,9 @@ var/list/area/areas = list() var/list/turfs = block( - locate( - bounds[MAP_MINX], - bounds[MAP_MINY], - bounds[MAP_MINZ] - ), - locate( - bounds[MAP_MAXX], - bounds[MAP_MAXY], - bounds[MAP_MAXZ] - ) - ) + bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ], + bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ] + ) for(var/turf/current_turf as anything in turfs) var/area/current_turfs_area = current_turf.loc areas |= current_turfs_area @@ -114,17 +106,9 @@ //calculate all turfs inside the border var/list/template_and_bordering_turfs = block( - locate( - max(bounds[MAP_MINX]-1, 1), - max(bounds[MAP_MINY]-1, 1), - bounds[MAP_MINZ] - ), - locate( - min(bounds[MAP_MAXX]+1, world.maxx), - min(bounds[MAP_MAXY]+1, world.maxy), - bounds[MAP_MAXZ] - ) - ) + bounds[MAP_MINX]-1, bounds[MAP_MINY]-1, bounds[MAP_MINZ], + bounds[MAP_MAXX]+1, bounds[MAP_MAXY]+1, bounds[MAP_MAXZ] + ) for(var/turf/affected_turf as anything in template_and_bordering_turfs) affected_turf.air_update_turf(TRUE, TRUE) affected_turf.levelupdate() @@ -230,7 +214,7 @@ var/turf/corner = locate(placement.x - round(width/2), placement.y - round(height/2), placement.z) if(corner) placement = corner - return block(placement, locate(placement.x+width-1, placement.y+height-1, placement.z)) + return block(placement.x, placement.y, placement.z, placement.x+width-1, placement.y+height-1, placement.z) /// Takes in a type path, locates an instance of that type in the cached map, and calculates its offset from the origin of the map, returns this offset in the form list(x, y). /datum/map_template/proc/discover_offset(obj/marker) diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index da7d288d161fe..d6ed4ebf8e4f0 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -308,9 +308,11 @@ if(target.tlv_cold_room) target.set_tlv_cold_room() + if(target.tlv_kitchen) + target.set_tlv_kitchen() if(target.tlv_no_checks) target.set_tlv_no_checks() - if(target.tlv_no_checks && target.tlv_cold_room) + if(target.tlv_no_checks + target.tlv_cold_room + target.tlv_kitchen > 1) CRASH("Tried to apply incompatible air alarm threshold helpers!") if(target.syndicate_access) @@ -402,6 +404,16 @@ log_mapping("[src] at [AREACOORD(src)] [(area.type)] tried to adjust [target]'s tlv to cold_room but it's already changed!") target.tlv_cold_room = TRUE +/obj/effect/mapping_helpers/airalarm/tlv_kitchen + name = "airalarm kitchen tlv helper" + icon_state = "airalarm_tlv_kitchen_helper" + +/obj/effect/mapping_helpers/airalarm/tlv_kitchen/payload(obj/machinery/airalarm/target) + if(target.tlv_kitchen) + var/area/area = get_area(target) + log_mapping("[src] at [AREACOORD(src)] [(area.type)] tried to adjust [target]'s tlv to kitchen but it's already changed!") + target.tlv_kitchen = TRUE + /obj/effect/mapping_helpers/airalarm/tlv_no_checks name = "airalarm no checks tlv helper" icon_state = "airalarm_tlv_no_checks_helper" diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm index 10d506f8c48e5..1efcf71676e6c 100644 --- a/code/modules/mapping/reader.dm +++ b/code/modules/mapping/reader.dm @@ -350,8 +350,9 @@ if(!no_changeturf) var/list/turfs = block( - locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]), - locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ])) + bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ], + bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ] + ) for(var/turf/T as anything in turfs) //we do this after we load everything in. if we don't, we'll have weird atmos bugs regarding atmos adjacent turfs T.AfterChange(CHANGETURF_IGNORE_AIR) diff --git a/code/modules/mapping/space_management/space_transition.dm b/code/modules/mapping/space_management/space_transition.dm index b61897dd7b6b4..e5db045e92d20 100644 --- a/code/modules/mapping/space_management/space_transition.dm +++ b/code/modules/mapping/space_management/space_transition.dm @@ -131,9 +131,10 @@ continue var/zlevelnumber = level.z_value for(var/side in 1 to 4) - var/turf/beginning = locate(x_pos_beginning[side], y_pos_beginning[side], zlevelnumber) - var/turf/ending = locate(x_pos_ending[side], y_pos_ending[side], zlevelnumber) - var/list/turfblock = block(beginning, ending) + var/list/turfblock = block( + x_pos_beginning[side], y_pos_beginning[side], zlevelnumber, + x_pos_ending[side], y_pos_ending[side], zlevelnumber + ) var/dirside = 2**(side-1) var/x_target = x_pos_transition[side] == 1 ? 0 : x_pos_transition[side] var/y_target = y_pos_transition[side] == 1 ? 0 : y_pos_transition[side] diff --git a/code/modules/meteors/meteor_changeling.dm b/code/modules/meteors/meteor_changeling.dm index 9c25f8b6776a6..268ccccab1c8f 100644 --- a/code/modules/meteors/meteor_changeling.dm +++ b/code/modules/meteors/meteor_changeling.dm @@ -38,7 +38,7 @@ for(var/atom/movable/changeling in contents) changeling.forceMove(get_turf(src)) changeling.throw_at(landing_target, 2, 2) - changeling.visible_message(span_warning("[changeling] is launched out from inside of the [name]"), span_changeling("Sensing that something is terribly wrong, we forcibly eject ourselves from the [name]!")) + changeling.visible_message(span_warning("[changeling] is launched out from inside of \the [src]!"), span_changeling("Sensing that something is terribly wrong, we forcibly eject ourselves from \the [src]!")) playsound(changeling, 'sound/effects/splat.ogg', 50, pressure_affected = FALSE) return ..() diff --git a/code/modules/meteors/meteor_types.dm b/code/modules/meteors/meteor_types.dm index 8d3fcc67f53b8..8fec28c94f044 100644 --- a/code/modules/meteors/meteor_types.dm +++ b/code/modules/meteors/meteor_types.dm @@ -240,7 +240,7 @@ //Flaming meteor /obj/effect/meteor/flaming name = "flaming meteor" - desc = "An veritable shooting star, both beautiful and frightening. You should probably keep your distance from this." + desc = "A veritable shooting star, both beautiful and frightening. You should probably keep your distance from this." icon_state = "flaming" hits = 5 heavy = TRUE @@ -356,7 +356,7 @@ /obj/effect/meteor/banana/ram_turf(turf/bumped) for(var/mob/living/slipped in get_turf(bumped)) - slipped.slip(100, slipped.loc,- GALOSHES_DONT_HELP|SLIDE, 0, FALSE) + slipped.slip(100, slipped.loc,- GALOSHES_DONT_HELP|SLIDE) slipped.visible_message(span_warning("[src] honks [slipped] to the floor!"), span_userdanger("[src] harmlessly passes through you, knocking you over.")) get_hit() diff --git a/code/modules/mining/boulder_processing/boulder_types.dm b/code/modules/mining/boulder_processing/boulder_types.dm index 6d0d58a1be2b8..6298bb98139ee 100644 --- a/code/modules/mining/boulder_processing/boulder_types.dm +++ b/code/modules/mining/boulder_processing/boulder_types.dm @@ -75,6 +75,6 @@ ///lowgrade boulder, most commonly spawned /obj/item/boulder/shabby name = "shabby boulder" - desc = "A bizzare, twisted boulder. Wait, wait no, it's just a rock." + desc = "A bizarre, twisted boulder. Wait, wait no, it's just a rock." custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.1, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.1) durability = 1 diff --git a/code/modules/mining/boulder_processing/refinery.dm b/code/modules/mining/boulder_processing/refinery.dm index a751566efa107..383a4344a7da3 100644 --- a/code/modules/mining/boulder_processing/refinery.dm +++ b/code/modules/mining/boulder_processing/refinery.dm @@ -1,6 +1,6 @@ /** * Your new favorite industrial waste magnet! - * Accepts boulders and produces sheets of non-metalic materials. + * Accepts boulders and produces sheets of non-metallic materials. * When upgraded, it can hold more boulders and process more at once. */ /obj/machinery/bouldertech/refinery @@ -38,7 +38,7 @@ /** * Your other new favorite industrial waste magnet! - * Accepts boulders and produces sheets of metalic materials. + * Accepts boulders and produces sheets of metallic materials. * When upgraded, it can hold more boulders and process more at once. */ /obj/machinery/bouldertech/refinery/smelter diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index a6b2f075b8f1e..e8e5edb8a54e4 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -304,7 +304,7 @@ icon = 'icons/obj/clothing/head/helmet.dmi' worn_icon = 'icons/mob/clothing/head/helmet.dmi' icon_state = "godslayer" - desc = "The horns and skull of a wendigo, held together by the remaining icey energy of a demonic miner." + desc = "The horns and skull of a wendigo, held together by the remaining icy energy of a demonic miner." armor_type = /datum/armor/cloak_godslayer clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT cold_protection = HEAD diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm index fa9b63a4658a7..909e3985a625c 100644 --- a/code/modules/mining/equipment/wormhole_jaunter.dm +++ b/code/modules/mining/equipment/wormhole_jaunter.dm @@ -15,7 +15,7 @@ slot_flags = ITEM_SLOT_BELT /obj/item/wormhole_jaunter/attack_self(mob/user) - user.visible_message(span_notice("[user.name] activates the [src.name]!")) + user.visible_message(span_notice("[user.name] activates \the [src]!")) SSblackbox.record_feedback("tally", "jaunter", 1, "User") // user activated activate(user, TRUE) @@ -23,7 +23,7 @@ var/turf/device_turf = get_turf(src) if(!device_turf || is_centcom_level(device_turf.z) || is_reserved_level(device_turf.z)) if(user) - to_chat(user, span_notice("You're having difficulties getting the [src.name] to work.")) + to_chat(user, span_notice("You're having difficulties getting \the [src] to work.")) return FALSE return TRUE diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 956c2a779e561..ea0345f78d02b 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -135,6 +135,10 @@ roundstart_template = /datum/map_template/shuttle/mining/kilo height = 10 +/obj/docking_port/stationary/mining_home/northstar + roundstart_template = /datum/map_template/shuttle/mining/northstar + height = 6 + /obj/docking_port/stationary/mining_home/nebula roundstart_template = /datum/map_template/shuttle/mining/nebula height = 10 @@ -147,6 +151,9 @@ /obj/docking_port/stationary/mining_home/common/kilo roundstart_template = /datum/map_template/shuttle/mining_common/kilo +/obj/docking_port/stationary/mining_home/common/northstar + roundstart_template = /datum/map_template/shuttle/mining_common/northstar + /obj/structure/closet/crate/miningcar name = "mine cart" desc = "A cart for use on rails. Or off rails, if you're so inclined." diff --git a/code/modules/mining/voucher_sets.dm b/code/modules/mining/voucher_sets.dm index 071a8f1153670..1c61f707ea5c3 100644 --- a/code/modules/mining/voucher_sets.dm +++ b/code/modules/mining/voucher_sets.dm @@ -70,7 +70,7 @@ /datum/voucher_set/conscription_kit name = "Mining Conscription Kit" - description = "Contains a whole new mining starter kit for one crewmember, consisting of a proto-kinetic accelerator, a survival knife, a seclite, an explorer's suit, a mesons, an automatic mining scanner, a mining satchel, a gas mask, a mining radio key and a special ID card with a basic mining access." + description = "Contains a whole new mining starter kit for one crewmember, consisting of a proto-kinetic accelerator, a survival knife, a seclite, an explorer's suit, mesons, an automatic mining scanner, a mining satchel, a gas mask, a mining radio key and a special ID card with a basic mining access." icon = 'icons/obj/storage/backpack.dmi' icon_state = "duffel-explorer" set_items = list( diff --git a/code/modules/mob/living/basic/blob_minions/blob_spore.dm b/code/modules/mob/living/basic/blob_minions/blob_spore.dm index 6a61e8a56a2c7..c2ad13ae79a13 100644 --- a/code/modules/mob/living/basic/blob_minions/blob_spore.dm +++ b/code/modules/mob/living/basic/blob_minions/blob_spore.dm @@ -105,7 +105,7 @@ qdel(GetComponent(/datum/component/ghost_direct_control)) /mob/living/basic/blob_minion/spore/minion/death_burst() - return // This behaviour is superceded by the overmind's intervention + return // This behaviour is superseded by the overmind's intervention /// Weakened spore spawned by distributed neurons, can't zombify people and makes a teeny explosion diff --git a/code/modules/mob/living/basic/bots/medbot/medbot.dm b/code/modules/mob/living/basic/bots/medbot/medbot.dm index b4afba169b833..bac615ecfb5fc 100644 --- a/code/modules/mob/living/basic/bots/medbot/medbot.dm +++ b/code/modules/mob/living/basic/bots/medbot/medbot.dm @@ -4,8 +4,8 @@ name = "\improper Medibot" desc = "A little medical robot. He looks somewhat underwhelmed." icon = 'icons/mob/silicon/aibots.dmi' - icon_state = "medibot0" - base_icon_state = "medibot" + icon_state = "medbot_generic_idle" + base_icon_state = "medbot" health = 20 maxHealth = 20 speed = 2 @@ -95,7 +95,7 @@ /// drop determining variable var/medkit_type = /obj/item/storage/medkit ///based off medkit_X skins in aibots.dmi for your selection; X goes here IE medskin_tox means skin var should be "tox" - var/skin + var/skin = "generic" /// How much healing do we do at a time? var/heal_amount = 2.5 /// Start healing when they have this much damage in a category @@ -128,7 +128,7 @@ if(!isnull(new_skin)) skin = new_skin - update_appearance() + update_appearance() AddComponent(/datum/component/tippable, \ tip_time = 3 SECONDS, \ untip_time = 3 SECONDS, \ @@ -150,8 +150,8 @@ if(!HAS_TRAIT(SSstation, STATION_TRAIT_MEDBOT_MANIA) || !mapload || !is_station_level(z)) return INITIALIZE_HINT_LATELOAD - skin = "advanced" - update_appearance(UPDATE_OVERLAYS) + skin = "adv" + update_appearance() damage_type_healer = HEAL_ALL_DAMAGE if(prob(50)) name += ", PhD." @@ -164,22 +164,23 @@ /mob/living/basic/bot/medbot/update_icon_state() . = ..() - if(!(bot_mode_flags & BOT_MODE_ON)) - icon_state = "[base_icon_state]0" - return - if(HAS_TRAIT(src, TRAIT_INCAPACITATED)) - icon_state = "[base_icon_state]a" - return - var/stationary_mode = !!(medical_mode_flags & MEDBOT_STATIONARY_MODE) - if(mode == BOT_HEALING) - icon_state = "[base_icon_state]s[stationary_mode]" - return - icon_state = "[base_icon_state][stationary_mode ? 2 : 1]" //Bot has yellow light to indicate stationary mode. + + var/mode_suffix = mode == BOT_HEALING ? "active" : "idle" + icon_state = "[base_icon_state]_[skin]_[mode_suffix]" /mob/living/basic/bot/medbot/update_overlays() . = ..() - if(skin) - . += "medskin_[skin]" + + if(!(medical_mode_flags & MEDBOT_STATIONARY_MODE)) + . += mutable_appearance(icon, "[base_icon_state]_overlay_wheels") + + if(HAS_TRAIT(src, TRAIT_INCAPACITATED)) + . += mutable_appearance(icon, "[base_icon_state]_overlay_incapacitated") + . += emissive_appearance(icon, "[base_icon_state]_overlay_incapacitated", src, alpha = src.alpha) + else if(bot_mode_flags & BOT_MODE_ON) + var/mode_suffix = mode == BOT_HEALING ? "active" : "idle" + . += mutable_appearance(icon, "[base_icon_state]_overlay_on_[mode_suffix]") + . += emissive_appearance(icon, "[base_icon_state]_overlay_on_[mode_suffix]", src, alpha = src.alpha) //this is sin /mob/living/basic/bot/medbot/generate_speak_list() @@ -248,7 +249,7 @@ medical_mode_flags &= ~MEDBOT_DECLARE_CRIT balloon_alert(user, "reagent synthesis circuits shorted") audible_message(span_danger("[src] buzzes oddly!")) - flick("medibot_spark", src) + flick_overlay_view(mutable_appearance(icon, "[base_icon_state]_spark"), 1 SECONDS) playsound(src, SFX_SPARKS, 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) return TRUE @@ -384,9 +385,9 @@ /mob/living/basic/bot/medbot/nukie name = "Oppenheimer" desc = "A medibot stolen from a Nanotrasen station and upgraded by the Syndicate. Despite their best efforts at reprogramming, it still appears visibly upset near nuclear explosives." - skin = "bezerk" health = 40 maxHealth = 40 + skin = "bezerk" req_one_access = list(ACCESS_SYNDICATE) bot_mode_flags = parent_type::bot_mode_flags & ~BOT_MODE_REMOTE_ENABLED radio_key = /obj/item/encryptionkey/syndicate diff --git a/code/modules/mob/living/basic/cult/constructs/juggernaut.dm b/code/modules/mob/living/basic/cult/constructs/juggernaut.dm index 5d5ae8c645499..696cb4db853d5 100644 --- a/code/modules/mob/living/basic/cult/constructs/juggernaut.dm +++ b/code/modules/mob/living/basic/cult/constructs/juggernaut.dm @@ -44,8 +44,8 @@ apply_damage(bullet.damage * 0.5, bullet.damage_type) visible_message( - span_danger("The [bullet.name] is reflected by [src]'s armored shell!"), - span_userdanger("The [bullet.name] is reflected by your armored shell!"), + span_danger("\The [bullet] is reflected by [src]'s armored shell!"), + span_userdanger("\The [bullet] is reflected by your armored shell!"), ) bullet.reflect(src) diff --git a/code/modules/mob/living/basic/drone/_drone.dm b/code/modules/mob/living/basic/drone/_drone.dm index ba315dade6418..7490a463977e9 100644 --- a/code/modules/mob/living/basic/drone/_drone.dm +++ b/code/modules/mob/living/basic/drone/_drone.dm @@ -277,7 +277,7 @@ //Hands for(var/obj/item/held_thing in held_items) - if(held_thing.item_flags & (ABSTRACT|EXAMINE_SKIP|HAND_ITEM)) + if((held_thing.item_flags & (ABSTRACT|HAND_ITEM)) || HAS_TRAIT(held_thing, TRAIT_EXAMINE_SKIP)) continue . += "It has [held_thing.examine_title(user)] in its [get_held_index_name(get_held_index_of_item(held_thing))]." diff --git a/code/modules/mob/living/basic/farm_animals/goose/goose.dm b/code/modules/mob/living/basic/farm_animals/goose/goose.dm new file mode 100644 index 0000000000000..0a34400f16163 --- /dev/null +++ b/code/modules/mob/living/basic/farm_animals/goose/goose.dm @@ -0,0 +1,177 @@ +/// The most random things a goose can have inside of it +#define GOOSE_SATIATED 50 + +/// A mob that gets mad at people at random and tries to eat nearby objects +/mob/living/basic/goose + name = "goose" + desc = "It's loose." + icon_state = "goose" + icon_living = "goose" + icon_dead = "goose_dead" + mob_biotypes = MOB_ORGANIC|MOB_BEAST + faction = list(FACTION_NEUTRAL) + maxHealth = 25 + health = 25 + melee_damage_lower = 5 + melee_damage_upper = 5 + attack_verb_continuous = "pecks" + attack_verb_simple = "peck" + attack_sound = "goose" + attack_vis_effect = ATTACK_EFFECT_BITE + speak_emote = list("honks") + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" + ai_controller = /datum/ai_controller/basic_controller/goose + butcher_results = list(/obj/item/food/meat/slab/grassfed = 2) + gold_core_spawnable = HOSTILE_SPAWN + /// Do we actually destroy food we eat? + var/conserve_food = FALSE + /// Unfortunately, geese want to eat every item + var/static/list/item_typecache = typecacheof(/obj/item) + +/mob/living/basic/goose/Initialize(mapload) + . = ..() + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/content_barfer) + AddElement(/datum/element/basic_eating, add_to_contents = conserve_food, food_types = string_list(list(/obj/item))) + + RegisterSignal(src, COMSIG_MOB_PRE_EAT, PROC_REF(on_tried_gobbling)) + RegisterSignal(src, COMSIG_MOB_ATE, PROC_REF(on_gobbled)) + + ai_controller.set_blackboard_key(BB_BASIC_FOODS, item_typecache) + +/mob/living/basic/goose/death(gibbed) + if (!gibbed && length(contents)) + var/turf/drop_turf = drop_location() + if (istype(drop_turf)) + playsound(drop_turf, 'sound/effects/splat.ogg', 50, TRUE) + drop_turf.add_vomit_floor(src) + return ..() + +/// Called when we try to eat something +/mob/living/basic/goose/proc/on_tried_gobbling(datum/source, obj/item/potential_food) + SIGNAL_HANDLER + if (ai_controller?.blackboard[BB_GOOSE_PANICKED]) + return COMSIG_MOB_CANCEL_EAT + if (potential_food.has_material_type(/datum/material/plastic) || IsEdible(potential_food)) + return NONE// Geese only eat FOOD or PLASTIC + return COMSIG_MOB_CANCEL_EAT + +/// Called when we've eaten something +/mob/living/basic/goose/proc/on_gobbled(atom/source, obj/item/food, mob/feeder) + SIGNAL_HANDLER + if (!food.has_material_type(/datum/material/plastic)) + return NONE + + visible_message(span_boldwarning("[src] is choking on \the [food]!")) + food.forceMove(src) + choke(food) + + return COMSIG_MOB_TERMINATE_EAT + +/// Start choking on something we just ate +/mob/living/basic/goose/proc/choke(obj/item/not_food_after_all) + apply_status_effect(/datum/status_effect/goose_choking) + +/// A less grumpy but much grosser variant of the goose, who will decorate the halls in their own special way +/mob/living/basic/goose/vomit + name = "Birdboat" + real_name = "Birdboat" + desc = "It's a sick-looking goose, probably ate too much maintenance trash. Best not to move it around too much." + gender = MALE + faction = list(FACTION_NEUTRAL, FACTION_MAINT_CREATURES) + gold_core_spawnable = NO_SPAWN + ai_controller = /datum/ai_controller/basic_controller/goose/calm + conserve_food = TRUE + /// Cooldown to make sure we can't spam chat with notifications that we are full + COOLDOWN_DECLARE(eat_fail_feedback_cooldown) + /// An action we use to throw up + var/datum/action/cooldown/mob_cooldown/goose_vomit/vomit_action + +/mob/living/basic/goose/vomit/Initialize(mapload) + . = ..() + + vomit_action = new(src) + vomit_action.Grant(src) + RegisterSignal(src, COMSIG_MOB_ABILITY_STARTED, PROC_REF(on_started_vomiting)) + + // 5% chance every round to have anarchy mode deadchat control on birdboat. + if (!prob(5)) + return + desc = "[initial(desc)] It's waddling more than usual. It seems to be possessed." + deadchat_plays() + +/mob/living/basic/goose/vomit/Destroy() + . = ..() + QDEL_NULL(vomit_action) + +/mob/living/basic/goose/vomit/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) + . = ..() + var/vomit_chance = ai_controller?.blackboard[BB_GOOSE_VOMIT_CHANCE] || 0 + if (prob(vomit_chance)) + vomit() + +/mob/living/basic/goose/vomit/examine(mob/user) + . = ..() + . += span_notice("Somehow, it still looks hungry.") + +/mob/living/basic/goose/vomit/on_gobbled(atom/source, obj/item/food, mob/feeder) + if (length(contents) > GOOSE_SATIATED) + if (COOLDOWN_FINISHED(src, eat_fail_feedback_cooldown)) + if (feeder) + visible_message(span_notice("[src] looks too full to eat \the [food]!")) + COOLDOWN_START(src, eat_fail_feedback_cooldown, 5 SECONDS) + return COMSIG_MOB_TERMINATE_EAT + + . = ..() + if (. == COMSIG_MOB_TERMINATE_EAT) + return NONE// It's plastic, if it's not plastic we already filtered it for edible + + // This also increases my vomit chance, but we atomised this field to the inside of a component and I need to read it + var/datum/component/edible/edible = food.GetComponent(/datum/component/edible) + if ((edible?.foodtypes & GROSS)) + ai_controller?.add_blackboard_key(BB_GOOSE_VOMIT_CHANCE, 3) + vomit_action?.extra_duration += 0.2 SECONDS + else + ai_controller?.add_blackboard_key(BB_GOOSE_VOMIT_CHANCE, 1) + +/mob/living/basic/goose/vomit/choke(obj/item/not_food_after_all) + if (prob(75)) + return ..() + visible_message(span_warning("[src] is gagging on \the [not_food_after_all]!")) + manual_emote("gags!") + addtimer(CALLBACK(src, PROC_REF(vomit)), 5 SECONDS) + +/// Start making a mess +/mob/living/basic/goose/vomit/proc/vomit() + vomit_action?.Trigger(target = src) + +/mob/living/basic/goose/vomit/proc/on_started_vomiting(mob/living/owner, datum/action/cooldown/activated) + SIGNAL_HANDLER + if (activated != vomit_action) + return + remove_status_effect(/datum/status_effect/goose_choking) // We're going to cough it out + +/mob/living/basic/goose/vomit/proc/stop_deadchat_plays() + var/initial_behaviour = initial(ai_controller?.idle_behavior) + ai_controller?.idle_behavior = SSidle_ai_behaviors.idle_behaviors[initial_behaviour] + +/mob/living/basic/goose/vomit/deadchat_plays(mode = ANARCHY_MODE, cooldown = 12 SECONDS) + var/list/goose_inputs = list( + "vomit" = CALLBACK(src, PROC_REF(vomit)), + "honk" = CALLBACK(src, TYPE_PROC_REF(/atom/movable, say), "HONK!!!"), + "spin" = CALLBACK(src, TYPE_PROC_REF(/mob, emote), "spin")) + + . = AddComponent(/datum/component/deadchat_control/cardinal_movement, mode, goose_inputs, cooldown, CALLBACK(src, PROC_REF(stop_deadchat_plays))) + + if (. == COMPONENT_INCOMPATIBLE) + return + + // Stop automated movement, retain the other behaviour so you can lead the horse to plastic and have it drink. + ai_controller?.idle_behavior = null + +#undef GOOSE_SATIATED diff --git a/code/modules/mob/living/basic/farm_animals/goose/goose_ai.dm b/code/modules/mob/living/basic/farm_animals/goose/goose_ai.dm new file mode 100644 index 0000000000000..cd10e45adc528 --- /dev/null +++ b/code/modules/mob/living/basic/farm_animals/goose/goose_ai.dm @@ -0,0 +1,82 @@ +/// Geese like to eat random objects and kill themselves, and occasionally get pissed off for no reason +/datum/ai_controller/basic_controller/goose + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_SEARCH_RANGE = 1, + BB_EAT_FOOD_COOLDOWN = 10 SECONDS, + BB_EAT_EMOTES = list() + ) + + ai_traits = STOP_MOVING_WHEN_PULLED + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk/goose + + planning_subtrees = list( + /datum/ai_planning_subtree/random_speech/goose, + /datum/ai_planning_subtree/capricious_retaliate, + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/find_food/goose, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/// Goose who doesn't randomly retaliate but does still try to die by eating random items +/datum/ai_controller/basic_controller/goose/calm + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_SEARCH_RANGE = 1, + BB_EAT_FOOD_COOLDOWN = 0.5 SECONDS, // Uh oh + BB_EAT_EMOTES = list() + ) + planning_subtrees = list( + /datum/ai_planning_subtree/random_speech/goose, + /datum/ai_planning_subtree/use_mob_ability/goose_vomit, + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/find_food/goose, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/// Walk more if we're choking or vomiting +/datum/idle_behavior/idle_random_walk/goose + +/datum/idle_behavior/idle_random_walk/goose/perform_idle_behavior(seconds_per_tick, datum/ai_controller/controller) + walk_chance = controller.blackboard[BB_GOOSE_PANICKED] ? 100 : 25 // I think this sets it for every goose but that's fine because it'll reset it before using it + return ..() + +/// Only look for things geese will try to eat +/datum/ai_planning_subtree/find_food/goose + finding_behavior = /datum/ai_behavior/find_and_set/in_list/goose_food + +/datum/ai_planning_subtree/find_food/goose/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if (controller.blackboard[BB_GOOSE_PANICKED]) + return // Don't look for food while choking or vomiting + return ..() + +/// Only set things geese will try to eat +/datum/ai_behavior/find_and_set/in_list/goose_food + +/datum/ai_behavior/find_and_set/in_list/goose_food/search_tactic(datum/ai_controller/controller, locate_paths, search_range) + var/list/found = typecache_filter_list(oview(search_range, controller.pawn), locate_paths) + if(!length(found)) + return + + var/list/filtered = list() + for (var/obj/item/thing as anything in found) + if (IsEdible(thing) || thing.has_material_type(/datum/material/plastic)) + filtered += thing + + if(length(filtered)) + return pick(filtered) + +/// Use this ability only if we roll a dice correctly +/datum/ai_planning_subtree/use_mob_ability/goose_vomit + +/datum/ai_planning_subtree/use_mob_ability/goose_vomit/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/trigger_prob = controller.blackboard[BB_GOOSE_VOMIT_CHANCE] || 0 + if (prob(trigger_prob)) + return ..() + +/datum/ai_planning_subtree/random_speech/goose + speech_chance = 3 + emote_hear = list("honks.", "honks loudly.", "honks aggressively.") + emote_see = list("flaps.", "preens.", "glares around.") + speak = list("Honk!") diff --git a/code/modules/mob/living/basic/farm_animals/goose/goose_vomit.dm b/code/modules/mob/living/basic/farm_animals/goose/goose_vomit.dm new file mode 100644 index 0000000000000..2b347903e22f9 --- /dev/null +++ b/code/modules/mob/living/basic/farm_animals/goose/goose_vomit.dm @@ -0,0 +1,187 @@ +/// Repeatedly throw up until there's nothing left inside, regrettably sufficiently complex that it requires its own file +/datum/action/cooldown/mob_cooldown/goose_vomit + name = "Vomit" + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + button_icon_state = "vomit" + button_icon = 'icons/mob/simple/animal.dmi' + cooldown_time = INFINITY // We reset the cooldown when we are done throwing up + text_cooldown = FALSE + melee_cooldown_time = 0 + shared_cooldown = NONE + click_to_activate = FALSE + /// Extra time to spend chundering + var/extra_duration = 0 SECONDS + +/datum/action/cooldown/mob_cooldown/goose_vomit/Grant(mob/granted_to) + . = ..() + if(!owner) + return + RegisterSignals(owner, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_EXITED), PROC_REF(update_status_on_signal)) + +/datum/action/cooldown/mob_cooldown/goose_vomit/Remove(mob/removed_from) + UnregisterSignal(owner, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_EXITED)) + return ..() + +/datum/action/cooldown/mob_cooldown/goose_vomit/IsAvailable(feedback) + . = ..() + if (!.) + return FALSE + if (!length(owner.contents)) + if (feedback) + owner.balloon_alert(owner, "stomach empty!") + return FALSE + if (!isliving(owner)) + if (feedback) + owner.balloon_alert(owner, "you're not alive!") + return FALSE + return TRUE + +/datum/action/cooldown/mob_cooldown/goose_vomit/Activate(atom/target) + StartCooldown(INFINITY) + if (istype(owner, /mob/living/basic/goose)) + owner.icon_state = "vomit" + flick("vomit_start", owner) + owner.ai_controller?.set_blackboard_key(BB_GOOSE_VOMIT_CHANCE, 0) + addtimer(CALLBACK(src, PROC_REF(start_vomiting)), 13) // 13 frame long animation + else + start_vomiting() + +/// Start the performance +/datum/action/cooldown/mob_cooldown/goose_vomit/proc/start_vomiting() + var/mob/living/living_owner = owner + living_owner.apply_status_effect(/datum/status_effect/goose_vomit, extra_duration) + extra_duration = 0 + +/// Handles iteratively emptying our stomach +/datum/status_effect/goose_vomit + id = "goose_vomit" + alert_type = null + tick_interval = 1 SECONDS + /// How long do we vomit for? + var/vomit_duration = 2.5 SECONDS + /// How long have we spent vomiting? + var/elapsed_time = 0 SECONDS + /// Chance to step in a random direction + var/move_chance = 80 + /// Chance to produce an item per tick + var/vomit_item_chance = 50 + +/datum/status_effect/goose_vomit/on_creation(mob/living/new_owner, extra_duration = 0) + vomit_duration += extra_duration + return ..() + +/datum/status_effect/goose_vomit/on_apply() + owner.set_jitter_if_lower(vomit_duration) + owner.ai_controller?.set_blackboard_key(BB_GOOSE_PANICKED, TRUE) + RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(on_owner_died)) + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(on_owner_moved)) + return TRUE + +/datum/status_effect/goose_vomit/on_remove() + UnregisterSignal(owner, list(COMSIG_LIVING_DEATH, COMSIG_MOVABLE_MOVED)) + owner.ai_controller?.set_blackboard_key(BB_GOOSE_PANICKED, FALSE) + if (istype(owner, /mob/living/basic/goose) && owner.stat != DEAD) + var/mob/living/basic/goose_mob = owner + flick("vomit_end", owner) + goose_mob.icon_state = goose_mob.icon_living + + var/datum/action/cooldown/mob_cooldown/goose_vomit/vomit_action = locate() in owner.actions + vomit_action?.StartCooldown(0 SECONDS) + +/// Don't keep vomiting from beyond the grave +/datum/status_effect/goose_vomit/proc/on_owner_died() + SIGNAL_HANDLER + qdel(src) + +/// For good measure we'll spit up every time we take a step too +/datum/status_effect/goose_vomit/proc/on_owner_moved() + SIGNAL_HANDLER + vomit_iteratively(can_move = FALSE) + +/datum/status_effect/goose_vomit/tick(seconds_between_ticks) + elapsed_time += seconds_between_ticks + + if (!length(owner.contents)) + qdel(src) + return + + if (elapsed_time <= vomit_duration) + vomit_iteratively() + else + vomit_finale() + +/// One to come up +/datum/status_effect/goose_vomit/proc/vomit_iteratively(can_move = TRUE) + if (prob(vomit_item_chance)) + hurl_item() + else + make_mess(owner.drop_location()) + + if (can_move && prob(move_chance)) + var/move_dir = pick(GLOB.alldirs) + var/turf/destination_turf = get_step(owner, move_dir) + owner.Move(destination_turf, move_dir) + +/// Stop fucking around and get the rest of it out +/datum/status_effect/goose_vomit/proc/vomit_finale() + tick_interval = 0.1 SECONDS + owner.set_jitter_if_lower(1 SECONDS) + hurl_item(vomit_strongly = TRUE) + +/// Produce an item from our inventory +/datum/status_effect/goose_vomit/proc/hurl_item(vomit_strongly = FALSE) + if (!length(owner.contents)) + return + var/obj/item/thing = pick_n_take(owner.contents) + if (!ismovable(thing) || HAS_TRAIT(thing, TRAIT_NOT_BARFABLE)) + qdel(src) // Someone is fucking around with this goose, let's not get stuck in this forever + return + var/drop_location = owner.drop_location() + + thing.forceMove(drop_location) + if (isopenturf(drop_location)) + make_mess(drop_location) + var/destination = get_edge_target_turf(drop_location, pick(GLOB.alldirs)) + var/throwRange = vomit_strongly ? rand(2, 8) : 1 + thing.safe_throw_at(destination, throwRange, 2) + +/// Make a mess +/datum/status_effect/goose_vomit/proc/make_mess(turf/open/drop_turf) + if (!istype(drop_turf)) + return + playsound(drop_turf, 'sound/effects/splat.ogg', 50, TRUE) + drop_turf.add_vomit_floor(owner) + + +/// Wheeze until we die +/datum/status_effect/goose_choking + id = "goose_choking" + alert_type = null + duration = 30 SECONDS + tick_interval = 2 SECONDS + /// Chance per second to emote + var/emote_prob = 18 + /// What things do we do while dying + var/static/list/emotes = list("chokes.", "coughs.", "gasps.", "tries urgently to breathe.", "shudders violently.", "wheezes.") + +/datum/status_effect/goose_choking/tick(seconds_between_ticks) + if (SPT_PROB(emote_prob, seconds_between_ticks)) + owner.manual_emote(pick(emotes)) + +/datum/status_effect/goose_choking/on_apply() + owner.set_jitter_if_lower(duration) + owner.ai_controller?.set_blackboard_key(BB_GOOSE_PANICKED, TRUE) + RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(on_owner_died)) + return TRUE + +/datum/status_effect/goose_choking/on_remove() + UnregisterSignal(owner, COMSIG_LIVING_DEATH) + if (duration >= world.time) + return // Saved by something, although probably by dying early + owner.death_message = "lets out one final oxygen-deprived honk before [owner.p_they()] go[owner.p_es()] limp and lifeless.." + owner.death() + +/// Don't keep dying if we died +/datum/status_effect/goose_choking/proc/on_owner_died() + SIGNAL_HANDLER + qdel(src) diff --git a/code/modules/mob/living/basic/farm_animals/sheep.dm b/code/modules/mob/living/basic/farm_animals/sheep.dm index 6fd4c485db79e..1f164390b4841 100644 --- a/code/modules/mob/living/basic/farm_animals/sheep.dm +++ b/code/modules/mob/living/basic/farm_animals/sheep.dm @@ -1,6 +1,6 @@ /mob/living/basic/sheep name = "sheep" - desc = "Known for their soft wool and use in sacrifical rituals. Big fan of grass." + desc = "Known for their soft wool and use in sacrificial rituals. Big fan of grass." icon = 'icons/mob/simple/sheep.dmi' icon_state = "sheep" icon_dead = "sheep_dead" diff --git a/code/modules/mob/living/basic/heretic/star_gazer.dm b/code/modules/mob/living/basic/heretic/star_gazer.dm index 7ffd7bc657ef6..157b3b64376dc 100644 --- a/code/modules/mob/living/basic/heretic/star_gazer.dm +++ b/code/modules/mob/living/basic/heretic/star_gazer.dm @@ -79,7 +79,7 @@ blackboard = list( BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_TARGET_MINIMUM_STAT = HARD_CRIT, - BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends/attack_closed_turfs, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends/attack_everything, ) ai_movement = /datum/ai_movement/basic_avoidance diff --git a/code/modules/mob/living/basic/jungle/leaper/leaper_abilities.dm b/code/modules/mob/living/basic/jungle/leaper/leaper_abilities.dm index 153b74fbbbce5..293881b6494ee 100644 --- a/code/modules/mob/living/basic/jungle/leaper/leaper_abilities.dm +++ b/code/modules/mob/living/basic/jungle/leaper/leaper_abilities.dm @@ -114,7 +114,7 @@ button_icon_state = "blood_effect_falling" background_icon_state = "bg_revenant" overlay_icon_state = "bg_revenant_border" - desc = "Rain down poisonous dropplets of blood!" + desc = "Rain down poisonous droplets of blood!" cooldown_time = 10 SECONDS click_to_activate = FALSE shared_cooldown = NONE diff --git a/code/modules/mob/living/basic/lavaland/brimdemon/brimbeam.dm b/code/modules/mob/living/basic/lavaland/brimdemon/brimbeam.dm index 5900289cae569..2daef4e1ae9aa 100644 --- a/code/modules/mob/living/basic/lavaland/brimdemon/brimbeam.dm +++ b/code/modules/mob/living/basic/lavaland/brimdemon/brimbeam.dm @@ -86,7 +86,8 @@ /datum/action/cooldown/mob_cooldown/brimbeam/proc/extinguish_laser() if(!length(beam_parts)) return FALSE - owner.move_resist = initial(owner.move_resist) + if (owner) + owner.move_resist = initial(owner.move_resist) for(var/obj/effect/brimbeam/beam in beam_parts) beam.disperse() beam_parts = list() diff --git a/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_loot.dm b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_loot.dm index fcc03c9531874..ef9b59f47c549 100644 --- a/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_loot.dm +++ b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_loot.dm @@ -1,7 +1,7 @@ /// Reagent pool left by dying brimdemon /obj/effect/decal/cleanable/brimdust name = "brimdust" - desc = "Dust from a brimdemon. It is considered valuable for its' botanical abilities." + desc = "Dust from a brimdemon. It is considered valuable for its botanical abilities." icon_state = "brimdust" icon = 'icons/obj/mining.dmi' plane = GAME_PLANE diff --git a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm index ce1c4e7cf1982..9336af84f0ea1 100644 --- a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm +++ b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm @@ -47,12 +47,15 @@ else can_lay_eggs = FALSE + var/list/food_types = string_list(list(/obj/item/stack/ore)) var/static/list/innate_actions = list( /datum/action/cooldown/mob_cooldown/spit_ore = BB_SPIT_ABILITY, /datum/action/cooldown/mob_cooldown/burrow = BB_BURROW_ABILITY, ) grant_actions_by_list(innate_actions) + AddElement(/datum/element/ore_collecting) + AddElement(/datum/element/basic_eating, food_types = food_types, add_to_contents = TRUE) AddElement(/datum/element/wall_tearer, allow_reinforced = FALSE) AddComponent(/datum/component/ai_listen_to_weather) AddComponent(\ @@ -60,14 +63,15 @@ overlay_icon = 'icons/mob/simple/lavaland/lavaland_monsters_wide.dmi',\ overlay_state = "goldgrub_alert",\ ) + if(can_tame) - make_tameable() + make_tameable(food_types) if(can_lay_eggs) make_egg_layer() + ADD_TRAIT(src, TRAIT_BOULDER_BREAKER, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_INSTANTLY_PROCESSES_BOULDERS, INNATE_TRAIT) RegisterSignal(src, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(block_bullets)) - RegisterSignal(src, COMSIG_MOB_ATE, PROC_REF(on_eat)) /mob/living/basic/mining/goldgrub/proc/block_bullets(datum/source, obj/projectile/hitting_projectile) SIGNAL_HANDLER @@ -105,8 +109,7 @@ barf_contents(gibbed) return ..() -/mob/living/basic/mining/goldgrub/proc/make_tameable() - var/list/food_types = string_list(list(/obj/item/stack/ore)) +/mob/living/basic/mining/goldgrub/proc/make_tameable(list/food_types) AddComponent(/datum/component/tameable, food_types = food_types, tame_chance = 25, bonus_tame_chance = 5) /mob/living/basic/mining/goldgrub/tamed(mob/living/tamer, atom/food) @@ -135,12 +138,6 @@ return new /obj/item/food/egg/green/grub_egg(get_turf(src)) -/mob/living/basic/mining/goldgrub/proc/on_eat(atom/source, atom/movable/food, mob/feeder) - SIGNAL_HANDLER - - food.forceMove(src) - return COMSIG_MOB_TERMINATE_EAT - /mob/living/basic/mining/goldgrub/baby icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' name = "goldgrub baby" diff --git a/code/modules/mob/living/basic/lavaland/mook/mook.dm b/code/modules/mob/living/basic/lavaland/mook/mook.dm index 539aa47cb287d..bc8615ff64744 100644 --- a/code/modules/mob/living/basic/lavaland/mook/mook.dm +++ b/code/modules/mob/living/basic/lavaland/mook/mook.dm @@ -2,7 +2,7 @@ //They'll attempt to leap at their target from afar using their hatchets. /mob/living/basic/mining/mook name = "wanderer" - desc = "This unhealthy looking primitive seems to be talented at administiring health care." + desc = "This unhealthy looking primitive seems to be talented at administering health care." icon = 'icons/mob/simple/jungle/mook.dmi' icon_state = "mook" icon_living = "mook" diff --git a/code/modules/mob/living/basic/lavaland/watcher/watcher_overwatch.dm b/code/modules/mob/living/basic/lavaland/watcher/watcher_overwatch.dm index f88624ce125be..d084850c05793 100644 --- a/code/modules/mob/living/basic/lavaland/watcher/watcher_overwatch.dm +++ b/code/modules/mob/living/basic/lavaland/watcher/watcher_overwatch.dm @@ -96,7 +96,7 @@ . = ..() if (!.) return FALSE - owner.add_traits(list(TRAIT_OVERWATCHED, TRAIT_OVERWATCH_IMMUNE), TRAIT_STATUS_EFFECT(id)) + owner.add_traits(list(TRAIT_OVERWATCHED, TRAIT_OVERWATCH_IMMUNE), REF(src)) owner.do_alert_animation() owner.Immobilize(0.25 SECONDS) // Just long enough that they don't trigger it by mistake owner.playsound_local(owner, 'sound/machines/chime.ogg', 50, TRUE) @@ -109,7 +109,7 @@ /datum/status_effect/overwatch/on_remove() UnregisterSignal(owner, forbidden_actions + list(COMSIG_QDELETING, COMSIG_LIVING_DEATH)) QDEL_NULL(link) - owner.remove_traits(list(TRAIT_OVERWATCHED, TRAIT_OVERWATCH_IMMUNE), TRAIT_STATUS_EFFECT(id)) + owner.remove_traits(list(TRAIT_OVERWATCHED, TRAIT_OVERWATCH_IMMUNE), REF(src)) if (!QDELETED(owner)) owner.apply_status_effect(/datum/status_effect/overwatch_immune) return ..() diff --git a/code/modules/mob/living/basic/pets/cat/keeki.dm b/code/modules/mob/living/basic/pets/cat/keeki.dm index 7314f9b49068a..93bafae582b06 100644 --- a/code/modules/mob/living/basic/pets/cat/keeki.dm +++ b/code/modules/mob/living/basic/pets/cat/keeki.dm @@ -50,7 +50,7 @@ so quickly that it generally doesn't matter. You're remarkably resilient to any damage besides this and it's hard for you to really die at all. You should go around and bring happiness and \ free cake to the station!
") var/default_name = initial(name) - var/new_name = sanitize_name(reject_bad_text(tgui_input_text(src, "You are the [name]. Would you like to change your name to something else?", "Name change", default_name, MAX_NAME_LEN)), cap_after_symbols = FALSE) + var/new_name = sanitize_name(reject_bad_text(tgui_input_text(src, "You are \the [src]. Would you like to change your name to something else?", "Name change", default_name, MAX_NAME_LEN)), cap_after_symbols = FALSE) if(new_name) to_chat(src, span_notice("Your name is now [new_name]!")) name = new_name diff --git a/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm b/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm index c5fac5f966e48..18b956e5ec2a0 100644 --- a/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm +++ b/code/modules/mob/living/basic/pets/dog/dog_subtypes.dm @@ -109,7 +109,7 @@ so quickly that it generally doesn't matter. You're remarkably resilient to any damage besides this and it's hard for you to really die at all. You should go around and bring happiness and \ free bread to the station! 'I’m not alone, and you aren’t either'") var/default_name = "Kobun" - var/new_name = sanitize_name(reject_bad_text(tgui_input_text(src, "You are the [name]. Would you like to change your name to something else?", "Name change", default_name, MAX_NAME_LEN)), cap_after_symbols = FALSE) + var/new_name = sanitize_name(reject_bad_text(tgui_input_text(src, "You are \the [src]. Would you like to change your name to something else?", "Name change", default_name, MAX_NAME_LEN)), cap_after_symbols = FALSE) if(new_name) to_chat(src, span_notice("Your name is now [new_name]!")) name = new_name diff --git a/code/modules/mob/living/basic/ruin_defender/mimic/mimic.dm b/code/modules/mob/living/basic/ruin_defender/mimic/mimic.dm index b8661c3c38ea8..195834afd9852 100644 --- a/code/modules/mob/living/basic/ruin_defender/mimic/mimic.dm +++ b/code/modules/mob/living/basic/ruin_defender/mimic/mimic.dm @@ -251,8 +251,8 @@ GLOBAL_LIST_INIT(animatable_blacklist, typecacheof(list( var/overlay_googly_eyes = TRUE /// do we take damage when we are not sentient and have no target var/idledamage = TRUE - /// copied object - var/atom/movable/copied + /// copied object weakref + var/datum/weakref/copied_ref /mob/living/basic/mimic/copy/Initialize(mapload, obj/copy, mob/living/creator, destroy_original = FALSE, no_googlies = FALSE) . = ..() @@ -263,7 +263,7 @@ GLOBAL_LIST_INIT(animatable_blacklist, typecacheof(list( /mob/living/basic/mimic/copy/Destroy() creator_ref = null - copied = null + copied_ref = null return ..() /mob/living/basic/mimic/copy/Life(seconds_per_tick = SSMOBS_DT, times_fired) @@ -287,6 +287,10 @@ GLOBAL_LIST_INIT(animatable_blacklist, typecacheof(list( /mob/living/basic/mimic/copy/Exited(atom/movable/gone, direction) // if our object gets deleted it calls Exited . = ..() + var/atom/movable/copied = copied_ref?.resolve() + if(!copied) + copied_ref = null + return if(QDELETED(src) || gone != copied) return death() @@ -306,11 +310,11 @@ GLOBAL_LIST_INIT(animatable_blacklist, typecacheof(list( return ((isitem(target) || isstructure(target)) && !is_type_in_typecache(target, GLOB.animatable_blacklist)) /mob/living/basic/mimic/copy/proc/CopyObject(obj/original, mob/living/user, destroy_original = FALSE) - if(!destroy_original && !check_object(original)) + if(QDELETED(original) || !destroy_original && !check_object(original)) return FALSE if(!destroy_original) original.forceMove(src) - copied = original + copied_ref = WEAKREF(original) CopyObjectVisuals(original) if (overlay_googly_eyes) add_overlay(googly_eyes) diff --git a/code/modules/mob/living/basic/slime/slime.dm b/code/modules/mob/living/basic/slime/slime.dm index 8f80e24f6998b..f5380143795ea 100644 --- a/code/modules/mob/living/basic/slime/slime.dm +++ b/code/modules/mob/living/basic/slime/slime.dm @@ -312,9 +312,9 @@ if(prob(stunprob) && our_slime.powerlevel >= SLIME_EXTRA_SHOCK_COST) our_slime.powerlevel = clamp(our_slime.powerlevel - SLIME_EXTRA_SHOCK_COST, SLIME_MIN_POWER, SLIME_MAX_POWER) borg_target.apply_damage(our_slime.powerlevel * rand(6, 10), BRUTE, spread_damage = TRUE, wound_bonus = CANT_WOUND) - borg_target.visible_message(span_danger("The [our_slime.name] shocks [borg_target]!"), span_userdanger("The [our_slime.name] shocks you!")) + borg_target.visible_message(span_danger("\The [our_slime] shocks [borg_target]!"), span_userdanger("\The [our_slime] shocks you!")) else - borg_target.visible_message(span_danger("The [our_slime.name] fails to hurt [borg_target]!"), span_userdanger("The [our_slime.name] failed to hurt you!")) + borg_target.visible_message(span_danger("\The [our_slime] fails to hurt [borg_target]!"), span_userdanger("\The [our_slime] failed to hurt you!")) return COMPONENT_HOSTILE_NO_ATTACK @@ -324,7 +324,7 @@ if(!prob(stunprob)) return NONE // normal attack - carbon_target.visible_message(span_danger("The [our_slime.name] shocks [carbon_target]!"), span_userdanger("The [our_slime.name] shocks you!")) + carbon_target.visible_message(span_danger("\The [our_slime] shocks [carbon_target]!"), span_userdanger("\The [our_slime] shocks you!")) do_sparks(5, TRUE, carbon_target) var/power = our_slime.powerlevel + rand(0,3) diff --git a/code/modules/mob/living/basic/space_fauna/bear/_bear.dm b/code/modules/mob/living/basic/space_fauna/bear/_bear.dm index e6d77586e4b1b..f21ae028684d4 100644 --- a/code/modules/mob/living/basic/space_fauna/bear/_bear.dm +++ b/code/modules/mob/living/basic/space_fauna/bear/_bear.dm @@ -170,7 +170,7 @@ so quickly that it generally doesn't matter. You're remarkably resilient to any damage besides this and it's hard for you to really die at all. You should go around and bring happiness and \ free butter to the station!") var/default_name = "Terrygold" - var/new_name = sanitize_name(reject_bad_text(tgui_input_text(src, "You are the [name]. Would you like to change your name to something else?", "Name change", default_name, MAX_NAME_LEN)), cap_after_symbols = FALSE) + var/new_name = sanitize_name(reject_bad_text(tgui_input_text(src, "You are \the [src]. Would you like to change your name to something else?", "Name change", default_name, MAX_NAME_LEN)), cap_after_symbols = FALSE) if(new_name) to_chat(src, span_notice("Your name is now [new_name]!")) name = new_name diff --git a/code/modules/mob/living/basic/space_fauna/snake/banded_snake.dm b/code/modules/mob/living/basic/space_fauna/snake/banded_snake.dm index e73de4104e9a5..e1f96e5294e76 100644 --- a/code/modules/mob/living/basic/space_fauna/snake/banded_snake.dm +++ b/code/modules/mob/living/basic/space_fauna/snake/banded_snake.dm @@ -1,6 +1,6 @@ /mob/living/basic/snake/banded name = "banded snake" - desc = "A colourful stripy snake. It's either a harmless astroid kingsnake or a highly venomous and aggressive nebula viper. There's a mneumonic to tell them apart, you just need to look at the colours and examine them closely..." + desc = "A colourful stripy snake. It's either a harmless asteroid kingsnake or a highly venomous and aggressive nebula viper. There's a mnemonic to tell them apart, you just need to look at the colours and examine them closely..." icon_state = "bandedsnake" icon_living = "bandedsnake" icon_dead = "bandedsnake_dead" diff --git a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm index 1e78bd924a833..71976223b29a9 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm @@ -272,7 +272,7 @@ obj_damage = 15 speed = 5 player_speed_modifier = -4 - menu_description = "Extremly tanky with very poor offence. Able to self heal and lay reflective silk screens." + menu_description = "Extremely tanky with very poor offence. Able to self heal and lay reflective silk screens." /mob/living/basic/spider/giant/tank/Initialize(mapload) . = ..() diff --git a/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling_subtypes.dm b/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling_subtypes.dm index 06d086d89672b..eae184f4bdae4 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling_subtypes.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling_subtypes.dm @@ -64,7 +64,7 @@ /mob/living/basic/spider/growing/spiderling/breacher grow_as = /mob/living/basic/spider/growing/young/breacher name = "breacher spiderling" - desc = "Furry and baige, it looks defenseless. This one has dim red eyes." + desc = "Furry and beige, it looks defenseless. This one has dim red eyes." icon = 'icons/mob/simple/arachnoid.dmi' icon_state = "breacher_spiderling" icon_dead = "breacher_spiderling_dead" diff --git a/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider_subtypes.dm b/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider_subtypes.dm index bdb07b44bdb28..e245f3adcc932 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider_subtypes.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider_subtypes.dm @@ -195,7 +195,7 @@ /mob/living/basic/spider/growing/young/breacher grow_as = /mob/living/basic/spider/giant/breacher name = "young breacher spider" - desc = "Furry and baige, it looks defenseless. This one has dim red eyes." + desc = "Furry and beige, it looks defenseless. This one has dim red eyes." icon = 'icons/mob/simple/arachnoid.dmi' icon_state = "young_breacher" icon_dead = "young_breacher_dead" diff --git a/code/modules/mob/living/carbon/alien/adult/caste/hunter.dm b/code/modules/mob/living/carbon/alien/adult/caste/hunter.dm index 9764f07fb9d3d..6241108c1683f 100644 --- a/code/modules/mob/living/carbon/alien/adult/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/adult/caste/hunter.dm @@ -80,7 +80,7 @@ var/blocked = FALSE if(ishuman(hit_atom)) var/mob/living/carbon/human/H = hit_atom - if(H.check_block(src, 0, "the [name]", attack_type = LEAP_ATTACK)) + if(H.check_block(src, 0, "\the [src]", attack_type = LEAP_ATTACK)) blocked = TRUE if(!blocked) L.visible_message(span_danger("[src] pounces on [L]!"), span_userdanger("[src] pounces on you!")) diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index be65a9a1d3dd3..ccb8a22a2fae7 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -33,7 +33,7 @@ switch(stage) if(3, 4) if(SPT_PROB(1, seconds_per_tick)) - owner.sneeze() + owner.emote("sneeze") if(SPT_PROB(1, seconds_per_tick)) owner.emote("cough") if(SPT_PROB(1, seconds_per_tick)) @@ -42,7 +42,7 @@ to_chat(owner, span_danger("Mucous runs down the back of your throat.")) if(5) if(SPT_PROB(1, seconds_per_tick)) - owner.sneeze() + owner.emote("sneeze") if(SPT_PROB(1, seconds_per_tick)) owner.emote("cough") if(SPT_PROB(2, seconds_per_tick)) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index f33f2e390c243..e7a43d6076cbd 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -723,7 +723,7 @@ /mob/living/carbon/get_shove_flags(mob/living/shover, obj/item/weapon) . = ..() . |= SHOVE_CAN_STAGGER - if(IsKnockdown() && !IsParalyzed() && HAS_TRAIT(src, TRAIT_STUN_ON_NEXT_SHOVE)) + if(IsKnockdown() && !IsParalyzed() && HAS_TRAIT(src, TRAIT_DAZED)) . |= SHOVE_CAN_KICK_SIDE if(HAS_TRAIT(src, TRAIT_NO_SIDE_KICK)) // added as an extra check, just in case . &= ~SHOVE_CAN_KICK_SIDE diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index cb35aebfb0770..83b53e64cf9b8 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -1,10 +1,10 @@ -/mob/living/carbon/slip(knockdown_amount, obj/slipped_on, lube_flags, paralyze, force_drop = FALSE) +/mob/living/carbon/slip(knockdown_amount, obj/slipped_on, lube_flags, paralyze, daze, force_drop = FALSE) if(movement_type & MOVETYPES_NOT_TOUCHING_GROUND) return FALSE if(!(lube_flags & SLIDE_ICE)) log_combat(src, (slipped_on || get_turf(src)), "slipped on the", null, ((lube_flags & SLIDE) ? "(SLIDING)" : null)) ..() - return loc.handle_slip(src, knockdown_amount, slipped_on, lube_flags, paralyze, force_drop) + return loc.handle_slip(src, knockdown_amount, slipped_on, lube_flags, paralyze, daze, force_drop) /mob/living/carbon/Move(NewLoc, direct) . = ..() diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index 414fe13fc3c0b..2c6ff2aa7e85b 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -402,18 +402,18 @@ var/t_has = p_have() var/t_is = p_are() //head - if(head && !(obscured & ITEM_SLOT_HEAD) && !(head.item_flags & EXAMINE_SKIP)) + if(head && !(obscured & ITEM_SLOT_HEAD) && !HAS_TRAIT(head, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_is] wearing [head.examine_title_worn(user)] on [t_his] head." //back - if(back && !(back.item_flags & EXAMINE_SKIP)) + if(back && !HAS_TRAIT(back, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_has] [back.examine_title_worn(user)] on [t_his] back." //Hands for(var/obj/item/held_thing in held_items) - if(held_thing.item_flags & (ABSTRACT|EXAMINE_SKIP|HAND_ITEM)) + if((held_thing.item_flags & (ABSTRACT|HAND_ITEM)) || HAS_TRAIT(held_thing, TRAIT_EXAMINE_SKIP)) continue . += "[t_He] [t_is] holding [held_thing.examine_title_worn(user)] in [t_his] [get_held_index_name(get_held_index_of_item(held_thing))]." //gloves - if(gloves && !(obscured & ITEM_SLOT_GLOVES) && !(gloves.item_flags & EXAMINE_SKIP)) + if(gloves && !(obscured & ITEM_SLOT_GLOVES) && !HAS_TRAIT(gloves, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_has] [gloves.examine_title_worn(user)] on [t_his] hands." else if(GET_ATOM_BLOOD_DNA_LENGTH(src)) if(num_hands) @@ -423,23 +423,23 @@ var/cables_or_cuffs = istype(handcuffed, /obj/item/restraints/handcuffs/cable) ? "restrained with cable" : "handcuffed" . += span_warning("[t_He] [t_is] [icon2html(handcuffed, user)] [cables_or_cuffs]!") //shoes - if(shoes && !(obscured & ITEM_SLOT_FEET) && !(shoes.item_flags & EXAMINE_SKIP)) + if(shoes && !(obscured & ITEM_SLOT_FEET) && !HAS_TRAIT(shoes, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_is] wearing [shoes.examine_title_worn(user)] on [t_his] feet." //mask - if(wear_mask && !(obscured & ITEM_SLOT_MASK) && !(wear_mask.item_flags & EXAMINE_SKIP)) + if(wear_mask && !(obscured & ITEM_SLOT_MASK) && !HAS_TRAIT(wear_mask, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_has] [wear_mask.examine_title_worn(user)] on [t_his] face." - if(wear_neck && !(obscured & ITEM_SLOT_NECK) && !(wear_neck.item_flags & EXAMINE_SKIP)) + if(wear_neck && !(obscured & ITEM_SLOT_NECK) && !HAS_TRAIT(wear_neck, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_is] wearing [wear_neck.examine_title_worn(user)] around [t_his] neck." //eyes if(!(obscured & ITEM_SLOT_EYES) ) - if(glasses && !(glasses.item_flags & EXAMINE_SKIP)) + if(glasses && !HAS_TRAIT(glasses, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_has] [glasses.examine_title_worn(user)] covering [t_his] eyes." else if(HAS_TRAIT(src, TRAIT_UNNATURAL_RED_GLOWY_EYES)) . += span_warning("[t_His] eyes are glowing with an unnatural red aura!") else if(HAS_TRAIT(src, TRAIT_BLOODSHOT_EYES)) . += span_warning("[t_His] eyes are bloodshot!") //ears - if(ears && !(obscured & ITEM_SLOT_EARS) && !(ears.item_flags & EXAMINE_SKIP)) + if(ears && !(obscured & ITEM_SLOT_EARS) && !HAS_TRAIT(ears, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_has] [ears.examine_title_worn(user)] on [t_his] ears." // Yes there's a lot of copypasta here, we can improve this later when carbons are less dumb in general @@ -453,7 +453,7 @@ var/t_is = p_are() //uniform - if(w_uniform && !(obscured & ITEM_SLOT_ICLOTHING) && !(w_uniform.item_flags & EXAMINE_SKIP)) + if(w_uniform && !(obscured & ITEM_SLOT_ICLOTHING) && !HAS_TRAIT(w_uniform, TRAIT_EXAMINE_SKIP)) //accessory var/accessory_message = "" if(istype(w_uniform, /obj/item/clothing/under)) @@ -464,36 +464,36 @@ . += "[t_He] [t_is] wearing [w_uniform.examine_title_worn(user)][accessory_message]." //head - if(head && !(obscured & ITEM_SLOT_HEAD) && !(head.item_flags & EXAMINE_SKIP)) + if(head && !(obscured & ITEM_SLOT_HEAD) && !HAS_TRAIT(head, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_is] wearing [head.examine_title_worn(user)] on [t_his] head." //mask - if(wear_mask && !(obscured & ITEM_SLOT_MASK) && !(wear_mask.item_flags & EXAMINE_SKIP)) + if(wear_mask && !(obscured & ITEM_SLOT_MASK) && !HAS_TRAIT(wear_mask, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_has] [wear_mask.examine_title_worn(user)] on [t_his] face." //neck - if(wear_neck && !(obscured & ITEM_SLOT_NECK) && !(wear_neck.item_flags & EXAMINE_SKIP)) + if(wear_neck && !(obscured & ITEM_SLOT_NECK) && !HAS_TRAIT(wear_neck, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_is] wearing [wear_neck.examine_title_worn(user)] around [t_his] neck." //eyes if(!(obscured & ITEM_SLOT_EYES) ) - if(glasses && !(glasses.item_flags & EXAMINE_SKIP)) + if(glasses && !HAS_TRAIT(glasses, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_has] [glasses.examine_title_worn(user)] covering [t_his] eyes." else if(HAS_TRAIT(src, TRAIT_UNNATURAL_RED_GLOWY_EYES)) . += span_warning("[t_His] eyes are glowing with an unnatural red aura!") else if(HAS_TRAIT(src, TRAIT_BLOODSHOT_EYES)) . += span_warning("[t_His] eyes are bloodshot!") //ears - if(ears && !(obscured & ITEM_SLOT_EARS) && !(ears.item_flags & EXAMINE_SKIP)) + if(ears && !(obscured & ITEM_SLOT_EARS) && !HAS_TRAIT(ears, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_has] [ears.examine_title_worn(user)] on [t_his] ears." //suit/armor - if(wear_suit && !(wear_suit.item_flags & EXAMINE_SKIP)) + if(wear_suit && !HAS_TRAIT(wear_suit, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_is] wearing [wear_suit.examine_title_worn(user)]." //suit/armor storage - if(s_store && !(obscured & ITEM_SLOT_SUITSTORE) && !(s_store.item_flags & EXAMINE_SKIP)) + if(s_store && !(obscured & ITEM_SLOT_SUITSTORE) && !HAS_TRAIT(s_store, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_is] carrying [s_store.examine_title_worn(user)] on [t_his] [wear_suit.name]." //back - if(back && !(back.item_flags & EXAMINE_SKIP)) + if(back && !HAS_TRAIT(back, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_has] [back.examine_title_worn(user)] on [t_his] back." //ID - if(wear_id && !(wear_id.item_flags & EXAMINE_SKIP)) + if(wear_id && !HAS_TRAIT(wear_id, TRAIT_EXAMINE_SKIP)) var/obj/item/card/id/id = wear_id.GetID() if(id && get_dist(user, src) <= ID_EXAMINE_DISTANCE) var/id_href = "[wear_id.examine_title(user)]" @@ -503,11 +503,11 @@ . += "[t_He] [t_is] wearing [wear_id.examine_title_worn(user)]." //Hands for(var/obj/item/held_thing in held_items) - if(held_thing.item_flags & (ABSTRACT|EXAMINE_SKIP|HAND_ITEM)) + if((held_thing.item_flags & (ABSTRACT|HAND_ITEM)) || HAS_TRAIT(held_thing, TRAIT_EXAMINE_SKIP)) continue . += "[t_He] [t_is] holding [held_thing.examine_title_worn(user)] in [t_his] [get_held_index_name(get_held_index_of_item(held_thing))]." //gloves - if(gloves && !(obscured & ITEM_SLOT_GLOVES) && !(gloves.item_flags & EXAMINE_SKIP)) + if(gloves && !(obscured & ITEM_SLOT_GLOVES) && !HAS_TRAIT(gloves, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_has] [gloves.examine_title_worn(user)] on [t_his] hands." else if(GET_ATOM_BLOOD_DNA_LENGTH(src) || blood_in_hands) if(num_hands) @@ -517,10 +517,10 @@ var/cables_or_cuffs = istype(handcuffed, /obj/item/restraints/handcuffs/cable) ? "restrained with cable" : "handcuffed" . += span_warning("[t_He] [t_is] [icon2html(handcuffed, user)] [cables_or_cuffs]!") //belt - if(belt && !(obscured & ITEM_SLOT_BELT) && !(belt.item_flags & EXAMINE_SKIP)) + if(belt && !(obscured & ITEM_SLOT_BELT) && !HAS_TRAIT(belt, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_has] [belt.examine_title_worn(user)] about [t_his] waist." //shoes - if(shoes && !(obscured & ITEM_SLOT_FEET) && !(shoes.item_flags & EXAMINE_SKIP)) + if(shoes && !(obscured & ITEM_SLOT_FEET) && !HAS_TRAIT(shoes, TRAIT_EXAMINE_SKIP)) . += "[t_He] [t_is] wearing [shoes.examine_title_worn(user)] on [t_his] feet." // DOPPLER EDIT END diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index c008bc364130b..ea69edc84be0c 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -744,7 +744,7 @@ GLOBAL_LIST_EMPTY(features_by_species) return FALSE if(I.w_class > WEIGHT_CLASS_BULKY) if(!disable_warning) - to_chat(H, span_warning("The [I.name] is too big to attach!")) //should be src? + to_chat(H, span_warning("\The [I] is too big to attach!")) //should be src? return FALSE if( istype(I, /obj/item/modular_computer/pda) || istype(I, /obj/item/pen) || is_type_in_list(I, H.wear_suit.allowed) ) return TRUE diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index fedcec61ebebf..cdb8886f91210 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -126,6 +126,10 @@ id_species ||= dna.species.name id_blood_type ||= dna.blood_type + if(istype(id, /obj/item/card/id/advanced)) + var/obj/item/card/id/advanced/advancedID = id + id_job = advancedID.trim_assignment_override || id_job + var/id_examine = span_slightly_larger(separator_hr("This is [src]'s ID card.")) id_examine += "
" id_examine += "[id_icon]" diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 95774e8b54ef8..29972735567cd 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -51,8 +51,8 @@ if(bullet.reflectable) if(check_reflect(def_zone)) // Checks if you've passed a reflection% check visible_message( - span_danger("The [bullet.name] gets reflected by [src]!"), - span_userdanger("The [bullet.name] gets reflected by [src]!"), + span_danger("\The [bullet] gets reflected by [src]!"), + span_userdanger("\The [bullet] gets reflected by [src]!"), ) // Finds and plays the block_sound of item which reflected for(var/obj/item/held_item in held_items) @@ -64,7 +64,7 @@ bullet.reflect(src) return BULLET_ACT_FORCE_PIERCE // complete projectile permutation - if(check_block(bullet, bullet.damage, "the [bullet.name]", PROJECTILE_ATTACK, bullet.armour_penetration, bullet.damage_type)) + if(check_block(bullet, bullet.damage, "\the [bullet]", PROJECTILE_ATTACK, bullet.armour_penetration, bullet.damage_type)) bullet.on_hit(src, 100, def_zone, piercing_hit) return BULLET_ACT_HIT @@ -140,11 +140,9 @@ if(src == target || LAZYFIND(target.buckled_mobs, src) || !iscarbon(target)) return if(!(shove_flags & SHOVE_KNOCKDOWN_BLOCKED)) - target.Knockdown(SHOVE_KNOCKDOWN_HUMAN) - target.apply_status_effect(/datum/status_effect/next_shove_stuns) + target.Knockdown(SHOVE_KNOCKDOWN_HUMAN, daze_amount = 3 SECONDS) if(!HAS_TRAIT(src, TRAIT_BRAWLING_KNOCKDOWN_BLOCKED)) - Knockdown(SHOVE_KNOCKDOWN_COLLATERAL) - apply_status_effect(/datum/status_effect/next_shove_stuns) + Knockdown(SHOVE_KNOCKDOWN_COLLATERAL, daze_amount = 3 SECONDS) target.visible_message(span_danger("[shover] shoves [target.name] into [name]!"), span_userdanger("You're shoved into [name] by [shover]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, src) to_chat(src, span_danger("You shove [target.name] into [name]!")) @@ -191,7 +189,7 @@ var/damage = HAS_TRAIT(user, TRAIT_PERFECT_ATTACKER) ? monkey_mouth.unarmed_damage_high : rand(monkey_mouth.unarmed_damage_low, monkey_mouth.unarmed_damage_high) if(!damage) return FALSE - if(check_block(user, damage, "the [user.name]", attack_type = UNARMED_ATTACK)) + if(check_block(user, damage, "\the [user]", attack_type = UNARMED_ATTACK)) return FALSE apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, MELEE)) return TRUE @@ -248,18 +246,18 @@ return TRUE apply_damage(damage, BRUTE, affecting, armor_block) -/mob/living/carbon/human/attack_larva(mob/living/carbon/alien/larva/L, list/modifiers) +/mob/living/carbon/human/attack_larva(mob/living/carbon/alien/larva/worm, list/modifiers) . = ..() if(!.) return //successful larva bite. - var/damage = rand(L.melee_damage_lower, L.melee_damage_upper) + var/damage = rand(worm.melee_damage_lower, worm.melee_damage_upper) if(!damage) return - if(check_block(L, damage, "the [L.name]", attack_type = UNARMED_ATTACK)) + if(check_block(worm, damage, "\the [worm]", attack_type = UNARMED_ATTACK)) return FALSE if(stat != DEAD) - L.amount_grown = min(L.amount_grown + damage, L.max_grown) - var/obj/item/bodypart/affecting = get_bodypart(get_random_valid_zone(L.zone_selected)) + worm.amount_grown = min(worm.amount_grown + damage, worm.max_grown) + var/obj/item/bodypart/affecting = get_bodypart(get_random_valid_zone(worm.zone_selected)) var/armor_block = run_armor_check(affecting, MELEE) apply_damage(damage, BRUTE, affecting, armor_block) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 52e59e098c1b7..57f32a92decf6 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -9,7 +9,7 @@ return return considering -/mob/living/carbon/human/slip(knockdown_amount, obj/slipped_on, lube_flags, paralyze, force_drop = FALSE) +/mob/living/carbon/human/slip(knockdown_amount, obj/slipped_on, lube_flags, paralyze, daze, force_drop = FALSE) if(HAS_TRAIT(src, TRAIT_NO_SLIP_ALL)) return FALSE diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm index b97070e52d4cd..c37e831e0e925 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -91,7 +91,7 @@ There are several things that need to be remembered: if(update_obscured) update_obscured_slots(uniform.flags_inv) - if(check_obscured_slots(transparent_protection = TRUE) & ITEM_SLOT_ICLOTHING) + if(HAS_TRAIT(uniform, TRAIT_NO_WORN_ICON) || (check_obscured_slots(transparent_protection = TRUE) & ITEM_SLOT_ICLOTHING)) return var/target_overlay = uniform.icon_state @@ -104,7 +104,7 @@ There are several things that need to be remembered: //icon_file MUST be set to null by default, or it causes issues. //handled_by_bodyshape MUST be set to FALSE under the if(!icon_exists()) statement, or everything breaks. //"override_file = handled_by_bodyshape ? icon_file : null" MUST be added to the arguments of build_worn_icon() - //Friendly reminder that icon_exists(file, state, scream = TRUE) is your friend when debugging this code. + //Friendly reminder that icon_exists_or_scream(file, state) is your friend when debugging this code. var/handled_by_bodyshape = TRUE var/icon_file var/woman @@ -159,6 +159,9 @@ There are several things that need to be remembered: if(update_obscured) update_obscured_slots(worn_item.flags_inv) + if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON)) + return + var/icon_file = 'icons/mob/clothing/id.dmi' /// DOPPLER SHIFT ADDITION BEGIN @@ -207,7 +210,7 @@ There are several things that need to be remembered: if(update_obscured) update_obscured_slots(worn_item.flags_inv) - if(check_obscured_slots(transparent_protection = TRUE) & ITEM_SLOT_GLOVES) + if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (check_obscured_slots(transparent_protection = TRUE) & ITEM_SLOT_GLOVES)) return var/icon_file = 'icons/mob/clothing/hands.dmi' @@ -264,7 +267,7 @@ There are several things that need to be remembered: if(update_obscured) update_obscured_slots(worn_item.flags_inv) - if(check_obscured_slots(transparent_protection = TRUE) & ITEM_SLOT_EYES) + if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (check_obscured_slots(transparent_protection = TRUE) & ITEM_SLOT_EYES)) return var/icon_file = 'icons/mob/clothing/eyes.dmi' @@ -299,7 +302,7 @@ There are several things that need to be remembered: if(update_obscured) update_obscured_slots(worn_item.flags_inv) - if(check_obscured_slots(transparent_protection = TRUE) & ITEM_SLOT_EARS) + if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (check_obscured_slots(transparent_protection = TRUE) & ITEM_SLOT_EARS)) return var/icon_file = 'icons/mob/clothing/ears.dmi' @@ -329,7 +332,7 @@ There are several things that need to be remembered: if(update_obscured) update_obscured_slots(worn_item.flags_inv) - if(check_obscured_slots(transparent_protection = TRUE) & ITEM_SLOT_NECK) + if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (check_obscured_slots(transparent_protection = TRUE) & ITEM_SLOT_NECK)) return var/icon_file = 'icons/mob/clothing/neck.dmi' @@ -364,7 +367,7 @@ There are several things that need to be remembered: if(update_obscured) update_obscured_slots(worn_item.flags_inv) - if(check_obscured_slots(transparent_protection = TRUE) & ITEM_SLOT_FEET) + if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (check_obscured_slots(transparent_protection = TRUE) & ITEM_SLOT_FEET)) return var/icon_file = DEFAULT_SHOES_FILE @@ -408,7 +411,7 @@ There are several things that need to be remembered: if(update_obscured) update_obscured_slots(worn_item.flags_inv) - if(check_obscured_slots(transparent_protection = TRUE) & ITEM_SLOT_SUITSTORE) + if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (check_obscured_slots(transparent_protection = TRUE) & ITEM_SLOT_SUITSTORE)) return /// DOPPLER SHIFT ADDITION BEGIN @@ -438,7 +441,7 @@ There are several things that need to be remembered: if(update_obscured) update_obscured_slots(worn_item.flags_inv) - if(check_obscured_slots(transparent_protection = TRUE) & ITEM_SLOT_HEAD) + if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (check_obscured_slots(transparent_protection = TRUE) & ITEM_SLOT_HEAD)) return var/icon_file = 'icons/mob/clothing/head/default.dmi' @@ -471,7 +474,7 @@ There are several things that need to be remembered: if(update_obscured) update_obscured_slots(worn_item.flags_inv) - if(check_obscured_slots(transparent_protection = TRUE) & ITEM_SLOT_BELT) + if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (check_obscured_slots(transparent_protection = TRUE) & ITEM_SLOT_BELT)) return var/icon_file = 'icons/mob/clothing/belt.dmi' @@ -503,6 +506,9 @@ There are several things that need to be remembered: if(update_obscured) update_obscured_slots(worn_item.flags_inv) + if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON)) + return + var/icon_file = DEFAULT_SUIT_FILE /// DOPPLER SHIFT ADDITION BEGIN @@ -558,7 +564,7 @@ There are several things that need to be remembered: if(update_obscured) update_obscured_slots(worn_item.flags_inv) - if(check_obscured_slots(transparent_protection = TRUE) & ITEM_SLOT_MASK) + if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (check_obscured_slots(transparent_protection = TRUE) & ITEM_SLOT_MASK)) return var/icon_file = 'icons/mob/clothing/mask.dmi' @@ -591,6 +597,9 @@ There are several things that need to be remembered: if(update_obscured) update_obscured_slots(worn_item.flags_inv) + if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON)) + return + var/icon_file = 'icons/mob/clothing/back.dmi' /// DOPPLER SHIFT ADDITION BEGIN diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 219060012fc39..b459ba4dfa6c5 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -397,7 +397,7 @@ if(!storage.supports_smart_equip) return if (equipped_item.atom_storage.locked) // Determines if container is locked before trying to put something in or take something out so we dont give out information on contents (or lack of) - to_chat(src, span_warning("The [equipped_item.name] is locked!")) + to_chat(src, span_warning("\The [equipped_item] is locked!")) return if(thing) // put thing in storage item if(!equipped_item.atom_storage?.attempt_insert(thing, src)) diff --git a/code/modules/mob/living/carbon/human/species_types/monkeys.dm b/code/modules/mob/living/carbon/human/species_types/monkeys.dm index aa58299115821..bbb56a32fba0b 100644 --- a/code/modules/mob/living/carbon/human/species_types/monkeys.dm +++ b/code/modules/mob/living/carbon/human/species_types/monkeys.dm @@ -140,7 +140,7 @@ /obj/item/organ/brain/primate //Ook Ook name = "Primate Brain" - desc = "This wad of meat is small, but has enlaged occipital lobes for spotting bananas." + desc = "This wad of meat is small, but has enlarged occipital lobes for spotting bananas." organ_traits = list(TRAIT_CAN_STRIP, TRAIT_PRIMITIVE, TRAIT_GUN_NATURAL) // No literacy or advanced tool usage. actions_types = list(/datum/action/item_action/organ_action/toggle_trip) /// Will this monkey stumble if they are crossed by a simple mob or a carbon in combat mode? Toggable by monkeys with clients, and is messed automatically set to true by monkey AI. diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index 87ea18af437fc..11894b7b0d64b 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -87,7 +87,7 @@ SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK, SPECIES_PERK_ICON = "lightbulb", SPECIES_PERK_NAME = "Photosynthetic", - SPECIES_PERK_DESC = "As long as you are concious, and within a well-lit area, you will slowly heal brute, burn, toxin and oxygen damage and gain nutrition - and never get fat! \ + SPECIES_PERK_DESC = "As long as you are conscious, and within a well-lit area, you will slowly heal brute, burn, toxin and oxygen damage and gain nutrition - and never get fat! \ However, if you are LOW on nutrition, you will progressively take brute damage until you die or enter the light once more." )) diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index 1486b54a0c249..38ef68e5272a8 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -65,7 +65,7 @@ return ..() /datum/species/zombie/get_physical_attributes() - return "Zombies are undead, and thus completely immune to any enviromental hazard, or any physical threat besides blunt force trauma and burns. \ + return "Zombies are undead, and thus completely immune to any environmental hazard, or any physical threat besides blunt force trauma and burns. \ Their limbs are easy to pop off their joints, but they can somehow just slot them back in." /datum/species/zombie/get_species_description() diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm index 6f4e8570099af..be2284f580d34 100644 --- a/code/modules/mob/living/carbon/human/status_procs.dm +++ b/code/modules/mob/living/carbon/human/status_procs.dm @@ -3,7 +3,7 @@ amount = dna.species.spec_stun(src, amount) return ..() -/mob/living/carbon/human/Knockdown(amount, ignore_canstun = FALSE) +/mob/living/carbon/human/Knockdown(amount, daze_amount = 0, ignore_canstun = FALSE) amount = dna.species.spec_stun(src, amount) * physiology.knockdown_mod return ..() diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index e80ba0c95be0d..3f81b193d0da9 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -771,7 +771,7 @@ /* * The mob is having a heart attack * - * NOTE: this is true if the mob has no heart and needs one, which can be suprising, + * NOTE: this is true if the mob has no heart and needs one, which can be surprising, * you are meant to use it in combination with can_heartattack for heart attack * related situations (i.e not just cardiac arrest) */ diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index c1e84baf8933b..bd0224bb0537f 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -2324,7 +2324,7 @@ GLOBAL_LIST_EMPTY(fire_appearances) var/turf/ceiling = get_step_multiz(src, UP) if(!ceiling) //We are at the highest z-level. if (prob(0.1)) - to_chat(src, span_warning("You gaze out into the infinite vastness of deep space, for a moment, you have the impulse to continue travelling, out there, out into the deep beyond, before your conciousness reasserts itself and you decide to stay within travelling distance of the station.")) + to_chat(src, span_warning("You gaze out into the infinite vastness of deep space, for a moment, you have the impulse to continue travelling, out there, out into the deep beyond, before your consciousness reasserts itself and you decide to stay within travelling distance of the station.")) return to_chat(src, span_warning("There's nothing interesting up there.")) return diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 590afeb86fe05..708760534c6a3 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -749,8 +749,7 @@ if(!(shove_flags & SHOVE_DIRECTIONAL_BLOCKED) && (SEND_SIGNAL(target_shove_turf, COMSIG_LIVING_DISARM_COLLIDE, src, target, shove_flags, weapon) & COMSIG_LIVING_SHOVE_HANDLED)) return if((shove_flags & SHOVE_BLOCKED) && !(shove_flags & (SHOVE_KNOCKDOWN_BLOCKED|SHOVE_CAN_KICK_SIDE))) - target.Knockdown(SHOVE_KNOCKDOWN_SOLID) - target.apply_status_effect(/datum/status_effect/next_shove_stuns) + target.Knockdown(SHOVE_KNOCKDOWN_SOLID, daze_amount = 3 SECONDS) target.visible_message(span_danger("[name] shoves [target.name], knocking [target.p_them()] down!"), span_userdanger("You're knocked down from a shove by [name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, src) to_chat(src, span_danger("You shove [target.name], knocking [target.p_them()] down!")) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 9c3b810dbf048..63fef281a5104 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -1050,13 +1050,16 @@ REMOVE_TRAIT(src, TRAIT_INCAPACITATED, POWER_LACK_TRAIT) /mob/living/silicon/ai/proc/show_camera_list() - var/list/cameras = get_camera_list(network) - var/camera = tgui_input_list(src, "Choose which camera you want to view", "Cameras", cameras) - if(isnull(camera)) + var/list/cameras = GLOB.cameranet.get_available_camera_by_tag_list(network) + var/camera_tag = tgui_input_list(src, "Choose which camera you want to view", "Cameras", cameras) + if(isnull(camera_tag)) return - if(isnull(cameras[camera])) + + var/obj/machinery/camera/chosen_camera = cameras[camera_tag] + if(isnull(chosen_camera)) return - switchCamera(cameras[camera]) + + switchCamera(chosen_camera) /mob/living/silicon/on_handsblocked_start() return // AIs have no hands diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index 1f8c452f492fc..a5991d2ee6fe4 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -8,7 +8,7 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) /// Name to show for VV and stat() var/name = "Camera Net" - /// The cameras on the map, no matter if they work or not. Updated in obj/machinery/camera.dm by New() and Del(). + /// The cameras on the map, no matter if they work or not. Updated in obj/machinery/camera.dm in Initialize() and Destroy(). var/list/obj/machinery/camera/cameras = list() /// The chunks of the map, mapping the areas that the cameras can see. var/list/chunks = list() @@ -185,6 +185,60 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) if(chunk.visibleTurfs[position]) return chunk +/// Returns list of available cameras, ready to use for UIs displaying list of them +/// The format is: list("name" = "camera.c_tag", ref = REF(camera)) +/datum/cameranet/proc/get_available_cameras_data(list/networks_available, list/z_levels_available) + var/list/available_cameras_data = list() + for(var/obj/machinery/camera/camera as anything in get_filtered_and_sorted_cameras(networks_available, z_levels_available)) + available_cameras_data += list(list( + name = camera.c_tag, + ref = REF(camera), + )) + + return available_cameras_data + +/** + * get_available_camera_by_tag_list + * + * Builds a list of all available cameras that can be seen to networks_available and in z_levels_available. + * Entries are stored in `c_tag[camera.can_use() ? null : " (Deactivated)"]` => `camera` format + * Args: + * networks_available - List of networks that we use to see which cameras are visible to it. + * z_levels_available - List of z levels to filter camera by. If empty, all z levels are considered valid. + * sort_by_ctag - If the resulting list should be sorted by `c_tag`. + */ +/datum/cameranet/proc/get_available_camera_by_tag_list(list/networks_available, list/z_levels_available) + var/list/available_cameras_by_tag = list() + for(var/obj/machinery/camera/camera as anything in get_filtered_and_sorted_cameras(networks_available, z_levels_available)) + available_cameras_by_tag["[camera.c_tag][camera.can_use() ? null : " (Deactivated)"]"] = camera + + return available_cameras_by_tag + +/// Returns list of all cameras that passed `is_camera_available` filter and sorted by `cmp_camera_ctag_asc` +/datum/cameranet/proc/get_filtered_and_sorted_cameras(list/networks_available, list/z_levels_available) + PRIVATE_PROC(TRUE) + + var/list/filtered_cameras = list() + for(var/obj/machinery/camera/camera as anything in cameras) + if(!is_camera_available(camera, networks_available, z_levels_available)) + continue + + filtered_cameras += camera + + return sortTim(filtered_cameras, GLOBAL_PROC_REF(cmp_camera_ctag_asc)) + +/// Checks if the `camera_to_check` meets the requirements of availability. +/datum/cameranet/proc/is_camera_available(obj/machinery/camera/camera_to_check, list/networks_available, list/z_levels_available) + PRIVATE_PROC(TRUE) + + if(!camera_to_check.c_tag) + return FALSE + + if(length(z_levels_available) && !(camera_to_check.z in z_levels_available)) + return FALSE + + return length(camera_to_check.network & networks_available) > 0 + /obj/effect/overlay/camera_static name = "static" icon = null diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index a451166bcada8..2646b465280b7 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -4,187 +4,208 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real /obj/item/clothing/head/chameleon/broken \ ))) -/mob/living/silicon/robot/attackby(obj/item/W, mob/living/user, params) - if(istype(W, /obj/item/stack/cable_coil) && wiresexposed) +/mob/living/silicon/robot/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(is_wire_tool(tool, check_secured = TRUE)) + if(wiresexposed) + wires.interact(user) + return ITEM_INTERACT_SUCCESS + if(user.combat_mode) + return ITEM_INTERACT_SKIP_TO_ATTACK + + balloon_alert(user, "expose the wires first!") + return ITEM_INTERACT_BLOCKING + + if(istype(tool, /obj/item/stack/cable_coil)) + if(!wiresexposed) + balloon_alert(user, "expose the wires first!") + return ITEM_INTERACT_BLOCKING + var/obj/item/stack/cable_coil/coil = tool + if (getFireLoss() <= 0) + balloon_alert(user, "wires are fine!") + return ITEM_INTERACT_BLOCKING + if(src == user) + balloon_alert(user, "repairing self...") + if(!do_after(user, 5 SECONDS, target = src)) + return ITEM_INTERACT_BLOCKING + if (!coil.use(1)) + balloon_alert(user, "not enough cable!") + return ITEM_INTERACT_BLOCKING + adjustFireLoss(-30) + playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) + balloon_alert(user, "wires repaired") + user.visible_message( + span_notice("[user] fixes some of the burnt wires on [src]."), + span_notice("You fix some of the burnt wires on [src]."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) user.changeNext_move(CLICK_CD_MELEE) - var/obj/item/stack/cable_coil/coil = W - if (getFireLoss() > 0 || getToxLoss() > 0) - if(src == user) - to_chat(user, span_notice("You start fixing yourself...")) - if(!do_after(user, 5 SECONDS, target = src)) - return - if (coil.use(1)) - adjustFireLoss(-30) - user.visible_message(span_notice("[user] fixes some of the burnt wires on [src]."), span_notice("You fix some of the burnt wires on [src].")) - else - to_chat(user, span_warning("You need more cable to repair [src]!")) - else - to_chat(user, span_warning("The wires seem fine, there's no need to fix them.")) - return + return ITEM_INTERACT_SUCCESS - if(istype(W, /obj/item/stock_parts/power_store/cell) && opened) // trying to put a cell inside + if(istype(tool, /obj/item/stock_parts/power_store/cell) && opened) // trying to put a cell inside if(wiresexposed) - to_chat(user, span_warning("Close the cover first!")) - else if(cell) - to_chat(user, span_warning("There is a power cell already installed!")) - else - if(!user.transferItemToLoc(W, src)) - return - cell = W - to_chat(user, span_notice("You insert the power cell.")) + balloon_alert(user, "unexpose the wires first!") + return ITEM_INTERACT_BLOCKING + if(cell) + balloon_alert(user, "already has a cell!") + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING + cell = tool + balloon_alert(user, "cell inserted") update_icons() diag_hud_set_borgcell() - return + return ITEM_INTERACT_SUCCESS - if(is_wire_tool(W)) - if (wiresexposed) - wires.interact(user) - else - to_chat(user, span_warning("You can't reach the wiring!")) - return - - if((W.slot_flags & ITEM_SLOT_HEAD) && hat_offset != INFINITY && !user.combat_mode && !is_type_in_typecache(W, GLOB.blacklisted_borg_hats)) + if((tool.slot_flags & ITEM_SLOT_HEAD) \ + && hat_offset != INFINITY \ + && !user.combat_mode \ + && !is_type_in_typecache(tool, GLOB.blacklisted_borg_hats)) if(user == src) - to_chat(user, span_notice("You can't seem to manage to place [W] on your head by yourself!") ) - return + balloon_alert(user, "can't place on self!") + return ITEM_INTERACT_BLOCKING if(hat && HAS_TRAIT(hat, TRAIT_NODROP)) - to_chat(user, span_warning("You can't seem to remove [src]'s existing headwear!")) - return - to_chat(user, span_notice("You begin to place [W] on [src]'s head...")) - to_chat(src, span_notice("[user] is placing [W] on your head...")) - if(do_after(user, 3 SECONDS, target = src)) - if (user.temporarilyRemoveItemFromInventory(W, TRUE)) - place_on_head(W) - return - - if(istype(W, /obj/item/defibrillator) && !user.combat_mode) + balloon_alert(user, "can't remove existing headwear!") + return ITEM_INTERACT_BLOCKING + balloon_alert(user, "placing on head...") + user.visible_message( + span_notice("[user] begins to place [tool] on [src]'s head..."), + span_notice("You begin to place [tool] on [src]'s head..."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + if(!do_after(user, 3 SECONDS, target = src)) + return ITEM_INTERACT_BLOCKING + if(hat && HAS_TRAIT(hat, TRAIT_NODROP)) + balloon_alert(user, "can't remove existing headwear!") + return ITEM_INTERACT_BLOCKING + if(!user.temporarilyRemoveItemFromInventory(tool)) + return ITEM_INTERACT_BLOCKING + balloon_alert(user, "headwear placed") + place_on_head(tool) + return ITEM_INTERACT_SUCCESS + + if(istype(tool, /obj/item/defibrillator) && !user.combat_mode) if(!opened) - to_chat(user, span_warning("You must access the cyborg's internals!")) - return + balloon_alert(user, "chassis cover is closed!") + return ITEM_INTERACT_BLOCKING if(!istype(model, /obj/item/robot_model/medical)) - to_chat(user, span_warning("[src] does not have correct mounting points for a defibrillator!")) - return + balloon_alert(user, "wrong cyborg model!") + return ITEM_INTERACT_BLOCKING if(stat == DEAD) - to_chat(user, span_warning("This defibrillator unit will not function on a deceased cyborg!")) - return - var/obj/item/defibrillator/D = W - if(!(D.slot_flags & ITEM_SLOT_BACK)) //belt defibs need not apply - to_chat(user, span_warning("This defibrillator unit doesn't seem to fit correctly!")) - return - if(D.cell) - to_chat(user, span_warning("You cannot connect the defibrillator to the cyborg power supply with the defibrillator's cell in the way!")) - return - if(locate(/obj/item/borg/upgrade/defib) in src || locate(/obj/item/borg/upgrade/defib/backpack) in src) - to_chat(user, span_warning("[src] already has a defibrillator!")) - return - var/obj/item/borg/upgrade/defib/backpack/B = new(null, D) - apply_upgrade(B, user) - return - - if(istype(W, /obj/item/ai_module)) - var/obj/item/ai_module/MOD = W + balloon_alert(user, "it's dead!") + return ITEM_INTERACT_BLOCKING + var/obj/item/defibrillator/defib = tool + if(!(defib.slot_flags & ITEM_SLOT_BACK)) //belt defibs need not apply + balloon_alert(user, "doesn't fit!") + return ITEM_INTERACT_BLOCKING + if(defib.get_cell()) + balloon_alert(user, "remove [tool]'s cell first!") + return ITEM_INTERACT_BLOCKING + if(locate(/obj/item/borg/upgrade/defib) in src) + balloon_alert(user, "already has a defibrillator!") + return ITEM_INTERACT_BLOCKING + var/obj/item/borg/upgrade/defib/backpack/defib_upgrade = new(null, defib) + if(apply_upgrade(defib_upgrade, user)) + balloon_alert(user, "defibrillator installed") + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING + + if(istype(tool, /obj/item/ai_module)) if(!opened) - to_chat(user, span_warning("You need access to the robot's insides to do that!")) - return + balloon_alert(user, "chassis cover is closed!") + return ITEM_INTERACT_BLOCKING if(wiresexposed) - to_chat(user, span_warning("You need to close the wire panel to do that!")) - return + balloon_alert(user, "unexpose the wires first!") + return ITEM_INTERACT_BLOCKING if(!cell) - to_chat(user, span_warning("You need to install a power cell to do that!")) - return - if(shell) //AI shells always have the laws of the AI - to_chat(user, span_warning("[src] is controlled remotely! You cannot upload new laws this way!")) - return + balloon_alert(user, "install a power cell first!") + return ITEM_INTERACT_BLOCKING + if(shell) + balloon_alert(user, "can't upload laws to a shell!") + return ITEM_INTERACT_BLOCKING if(connected_ai && lawupdate) - to_chat(user, span_warning("[src] is receiving laws remotely from a synced AI!")) - return + balloon_alert(user, "linked to an ai!") + return ITEM_INTERACT_BLOCKING if(emagged) - to_chat(user, span_warning("The law interface glitches out!")) + balloon_alert(user, "law interface glitched!") emote("buzz") - return - if(!mind) //A player mind is required for law procs to run antag checks. - to_chat(user, span_warning("[src] is entirely unresponsive!")) - return - MOD.install(laws, user) //Proc includes a success mesage so we don't need another one - return + return ITEM_INTERACT_BLOCKING + if(!mind) + balloon_alert(user, "it's unresponsive!") + return ITEM_INTERACT_BLOCKING - if(istype(W, /obj/item/encryptionkey) && opened) - if(radio)//sanityyyyyy - radio.attackby(W,user)//GTFO, you have your own procs - else - to_chat(user, span_warning("Unable to locate a radio!")) - return + balloon_alert(user, "laws uploaded") + var/obj/item/ai_module/new_laws = tool + new_laws.install(laws, user) + return ITEM_INTERACT_SUCCESS + + if(istype(tool, /obj/item/encryptionkey) && opened) + if(radio) + return radio.item_interaction(user, tool) - if (W.GetID()) // trying to unlock the interface with an ID card + balloon_alert(user, "no radio found!") + return ITEM_INTERACT_BLOCKING + + if(tool.GetID()) if(opened) - to_chat(user, span_warning("You must close the cover to swipe an ID card!")) - else - if(allowed(user)) - locked = !locked - to_chat(user, span_notice("You [ locked ? "lock" : "unlock"] [src]'s cover.")) - update_icons() - if(emagged) - to_chat(user, span_notice("The cover interface glitches out for a split second.")) - logevent("ChÃ¥vÃis cover lock has been [locked ? "engaged" : "released"]") //ChÃ¥vÃis: see above line - else - logevent("Chassis cover lock has been [locked ? "engaged" : "released"]") - else - to_chat(user, span_danger("Access denied.")) - return + balloon_alert(user, "close the chassis cover first!") + return ITEM_INTERACT_BLOCKING + if(!allowed(user)) + balloon_alert(user, "access denied!") + return ITEM_INTERACT_BLOCKING + locked = !locked + update_icons() + balloon_alert(user, "chassis cover lock [emagged ? "glitches" : "toggled"]") + logevent("[emagged ? "ChÃ¥vÃis" : "Chassis"] cover lock has been [locked ? "engaged" : "released"]") + return ITEM_INTERACT_SUCCESS - if(istype(W, /obj/item/borg/upgrade)) - var/obj/item/borg/upgrade/U = W + if(istype(tool, /obj/item/borg/upgrade)) if(!opened) - to_chat(user, span_warning("You must access the cyborg's internals!")) - return - if(!src.model && U.require_model) - to_chat(user, span_warning("The cyborg must choose a model before it can be upgraded!")) - return - if(U.locked) - to_chat(user, span_warning("The upgrade is locked and cannot be used yet!")) - return - if(!user.canUnEquip(U)) - to_chat(user, span_warning("The upgrade is stuck to you and you can't seem to let go of it!")) - return - apply_upgrade(U, user) - return - - if(istype(W, /obj/item/toner)) + balloon_alert(user, "chassis cover is closed!") + return ITEM_INTERACT_BLOCKING + var/obj/item/borg/upgrade/upgrade = tool + if(!model && upgrade.require_model) + balloon_alert(user, "choose a model first!") + return ITEM_INTERACT_BLOCKING + if(upgrade.locked) + balloon_alert(user, "upgrade locked!") + return ITEM_INTERACT_BLOCKING + if(apply_upgrade(upgrade, user)) + balloon_alert(user, "upgrade installed") + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING + + if(istype(tool, /obj/item/toner)) if(toner >= tonermax) - to_chat(user, span_warning("The toner level of [src] is at its highest level possible!")) - return - if(!user.temporarilyRemoveItemFromInventory(W)) - return + balloon_alert(user, "toner full!") + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING toner = tonermax - qdel(W) - to_chat(user, span_notice("You fill the toner level of [src] to its max capacity.")) - return + qdel(tool) + balloon_alert(user, "toner filled") + return ITEM_INTERACT_SUCCESS - if(istype(W, /obj/item/flashlight)) + if(istype(tool, /obj/item/flashlight)) if(!opened) - to_chat(user, span_warning("You need to open the panel to repair the headlamp!")) - return + balloon_alert(user, "open the chassis cover first!") + return ITEM_INTERACT_BLOCKING if(lamp_functional) - to_chat(user, span_warning("The headlamp is already functional!")) - return - if(!user.temporarilyRemoveItemFromInventory(W)) - to_chat(user, span_warning("[W] seems to be stuck to your hand. You'll have to find a different light.")) - return + balloon_alert(user, "headlamp already functional!") + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING lamp_functional = TRUE - qdel(W) - to_chat(user, span_notice("You replace the headlamp bulbs.")) - return + qdel(tool) + balloon_alert(user, "headlamp repaired") + return ITEM_INTERACT_SUCCESS - if(istype(W, /obj/item/computer_disk)) //Allows borgs to install new programs with human help + if(istype(tool, /obj/item/computer_disk)) if(!modularInterface) stack_trace("Cyborg [src] ( [type] ) was somehow missing their integrated tablet. Please make a bug report.") create_modularInterface() - var/obj/item/computer_disk/floppy = W - floppy.forceMove(modularInterface) - modularInterface.inserted_disk = floppy - return + return modularInterface.computer_disk_act(user, tool) - return ..() + return NONE #define LOW_DAMAGE_UPPER_BOUND 1/3 #define MODERATE_DAMAGE_UPPER_BOUND 2/3 @@ -254,7 +275,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real if(!cell) return cell.add_fingerprint(user) - to_chat(user, span_notice("You remove \the [cell].")) + balloon_alert(user, "cell removed") user.put_in_active_hand(cell) update_icons() diag_hud_set_borgcell() @@ -274,68 +295,82 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real /mob/living/silicon/robot/welder_act(mob/living/user, obj/item/tool) if(user.combat_mode && user != src) - return FALSE - . = TRUE + return NONE + user.changeNext_move(CLICK_CD_MELEE) if (!getBruteLoss()) - to_chat(user, span_warning("[src] is already in good condition!")) - return + balloon_alert(user, "no dents to fix!") + return ITEM_INTERACT_BLOCKING if (!tool.tool_start_check(user, amount=1, heat_required = HIGH_TEMPERATURE_REQUIRED)) //The welder has 1u of fuel consumed by its afterattack, so we don't need to worry about taking any away. - return + return ITEM_INTERACT_BLOCKING if(src == user) - to_chat(user, span_notice("You start fixing yourself...")) - if(!tool.use_tool(src, user, 50)) - return + balloon_alert(user, "repairing self...") + if(!tool.use_tool(src, user, delay = 5 SECONDS, amount = 1, volume = 50)) + return ITEM_INTERACT_BLOCKING + else + if(!tool.use_tool(src, user, delay = 0 SECONDS, amount = 1, volume = 50)) + return ITEM_INTERACT_BLOCKING adjustBruteLoss(-30) add_fingerprint(user) - visible_message(span_notice("[user] fixes some of the dents on [src].")) + balloon_alert(user, "dents fixed") + user.visible_message( + span_notice("[user] fixes some of the dents on [src]."), + span_notice("You fix some of the dents on [src]."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + return ITEM_INTERACT_SUCCESS /mob/living/silicon/robot/crowbar_act(mob/living/user, obj/item/tool) - . = TRUE if(opened) - to_chat(user, span_notice("You close the cover.")) + balloon_alert(user, "chassis cover closed") opened = FALSE update_icons() else if(locked) - to_chat(user, span_warning("The cover is locked and cannot be opened!")) + balloon_alert(user, "chassis cover locked!") else - to_chat(user, span_notice("You open the cover.")) + balloon_alert(user, "chassis cover opened") opened = TRUE update_icons() - return TRUE + return ITEM_INTERACT_SUCCESS /mob/living/silicon/robot/screwdriver_act(mob/living/user, obj/item/tool) if(!opened) - return FALSE - . = TRUE + return NONE if(!cell) // haxing wiresexposed = !wiresexposed - to_chat(user, span_notice("The wires have been [wiresexposed ? "exposed" : "unexposed"].")) + balloon_alert(user, "wires [wiresexposed ? "exposed" : "unexposed"]") else // radio if(shell) - to_chat(user, span_warning("You cannot seem to open the radio compartment!")) //Prevent AI radio key theft + balloon_alert(user, "can't access radio!") // Prevent AI radio key theft else if(radio) radio.screwdriver_act(user, tool) // Push it to the radio to let it handle everything else to_chat(user, span_warning("Unable to locate a radio!")) + balloon_alert(user, "no radio found!") update_icons() + return ITEM_INTERACT_SUCCESS /mob/living/silicon/robot/wrench_act(mob/living/user, obj/item/tool) if(!(opened && !cell)) // Deconstruction. The flashes break from the fall, to prevent this from being a ghetto reset module. - return FALSE - . = TRUE + return NONE if(!lockcharge) to_chat(user, span_warning("[src]'s bolts spark! Maybe you should lock them down first!")) spark_system.start() - return - to_chat(user, span_notice("You start to unfasten [src]'s securing bolts...")) - if(tool.use_tool(src, user, 5 SECONDS, volume = 50) && !cell) - user.visible_message(span_notice("[user] deconstructs [src]!"), span_notice("You unfasten the securing bolts, and [src] falls to pieces!")) - cyborg_deconstruct() - return + return ITEM_INTERACT_BLOCKING + balloon_alert(user, "deconstructing...") + if(!tool.use_tool(src, user, 5 SECONDS, volume = 50) && !cell) + return ITEM_INTERACT_BLOCKING + loc.balloon_alert(user, "deconstructed") + user.visible_message( + span_notice("[user] deconstructs [src]!"), + span_notice("You unfasten the securing bolts, and [src] falls to pieces!"), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + cyborg_deconstruct() + return ITEM_INTERACT_SUCCESS /mob/living/silicon/robot/fire_act() if(!on_fire) //Silicons don't gain stacks from hotspots, but hotspots can ignite them diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 188d104a562f9..265c27e587078 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -309,13 +309,13 @@ ///Gives you a link-driven interface for deciding what laws the statelaws() proc will share with the crew. /mob/living/silicon/proc/checklaws() laws_sanity_check() - var/list = "Which laws do you want to include when stating them for the crew?

" + var/list = "Which laws do you want to include when stating them for the crew?

" var/law_display = "Yes" if (laws.zeroth) if (!(laws.zeroth in lawcheck)) law_display = "No" - list += {"[law_display] 0: [laws.zeroth]
"} + list += {"[law_display] 0: [laws.zeroth]
"} for (var/index in 1 to length(laws.hacked)) law_display = "Yes" @@ -323,7 +323,7 @@ if (length(law) > 0) if (!(law in hackedcheck)) law_display = "No" - list += {"[law_display] [ion_num()]: [law]
"} + list += {"[law_display] [ion_num()]: [law]
"} for (var/index in 1 to length(laws.ion)) law_display = "Yes" @@ -331,7 +331,7 @@ if (length(law) > 0) if(!(law in ioncheck)) law_display = "No" - list += {"[law_display] [ion_num()]: [law]
"} + list += {"[law_display] [ion_num()]: [law]
"} var/number = 1 for (var/index in 1 to length(laws.inherent)) @@ -340,7 +340,7 @@ if (length(law) > 0) if (!(law in lawcheck)) law_display = "No" - list += {"[law_display] [number]: [law]
"} + list += {"[law_display] [number]: [law]
"} number++ for (var/index in 1 to length(laws.supplied)) @@ -349,11 +349,13 @@ if (length(law) > 0) if (!(law in lawcheck)) law_display = "No" - list += {"[law_display] [number]: [law]
"} + list += {"[law_display] [number]: [law]
"} number++ - list += {"

State Laws"} + list += {"

State Laws"} - usr << browse(list, "window=laws") + var/datum/browser/browser = new(usr, "laws") + browser.set_content(list) + browser.open() /mob/living/silicon/proc/ai_roster() if(!client) diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index 143c79534d359..093f54a5c5708 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -257,7 +257,8 @@ /obj/item/bot_assembly/medbot name = "incomplete medibot assembly" desc = "A first aid kit with a robot arm permanently grafted to it." - icon_state = "firstaid_arm" + icon_state = "medbot_assembly_generic" + base_icon_state = "medbot_assembly" created_name = "Medibot" //To preserve the name if it's a unique medbot I guess var/skin = null //Same as medbot, set to tox or ointment for the respective kits. var/healthanalyzer = /obj/item/healthanalyzer @@ -266,7 +267,7 @@ /obj/item/bot_assembly/medbot/proc/set_skin(skin) src.skin = skin if(skin) - add_overlay("kit_skin_[skin]") + icon_state = "[base_icon_state]_[skin]" /obj/item/bot_assembly/medbot/attackby(obj/item/W, mob/user, params) ..() @@ -279,7 +280,7 @@ to_chat(user, span_notice("You add [W] to [src].")) qdel(W) name = "first aid/robot arm/health analyzer assembly" - add_overlay("na_scanner") + add_overlay("[base_icon_state]_analyzer") build_step++ if(ASSEMBLY_SECOND_STEP) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 583f2ba1d6c9e..04e13b88eab65 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -396,10 +396,10 @@ /mob/living/simple_animal/hostile/proc/AttackingTarget(atom/attacked_target) in_melee = TRUE - if(SEND_SIGNAL(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, target) & COMPONENT_HOSTILE_NO_ATTACK) + if(SEND_SIGNAL(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, attacked_target) & COMPONENT_HOSTILE_NO_ATTACK) return FALSE //but more importantly return before attack_animal called - var/result = target.attack_animal(src) - SEND_SIGNAL(src, COMSIG_HOSTILE_POST_ATTACKINGTARGET, target, result) + var/result = attacked_target.attack_animal(src) + SEND_SIGNAL(src, COMSIG_HOSTILE_POST_ATTACKINGTARGET, attacked_target, result) return result /mob/living/simple_animal/hostile/proc/Aggro() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm index 231977a323954..c765ee9a0bb3c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm @@ -56,9 +56,18 @@ var/list/attack_action_types = list() /// Summoning line, said when summoned via megafauna vents. var/summon_line = "I'll kick your ass!" + ///any delay before we start attacking something near us + var/attack_delay = 0.25 SECONDS /mob/living/simple_animal/hostile/megafauna/Initialize(mapload) . = ..() + + AddComponent(\ + /datum/component/basic_mob_attack_telegraph,\ + display_telegraph_overlay = FALSE,\ + telegraph_duration = attack_delay,\ + ) + AddComponent(/datum/component/seethrough_mob) AddElement(/datum/element/simple_flying) if(gps_name && true_spawn) @@ -122,7 +131,7 @@ if(recovery_time >= world.time) return . = ..() - if(!.) + if(target && !CanAttack(target)) LoseTarget() return if(!isliving(target)) @@ -158,8 +167,6 @@ span_danger("[src] disembowels [L]!"), span_userdanger("You feast on [L]'s organs, restoring your health!")) - - /mob/living/simple_animal/hostile/megafauna/CanAttack(atom/the_target) . = ..() if (!.) @@ -169,7 +176,6 @@ var/mob/living/living_target = the_target return !living_target.has_status_effect(/datum/status_effect/gutted) - /mob/living/simple_animal/hostile/megafauna/ex_act(severity, target) switch (severity) if (EXPLODE_DEVASTATE) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm index ef8e596ac2ce0..9e118249e6f9c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm @@ -51,7 +51,7 @@ rapid_melee = initial(rapid_melee) return if(!aggressive_message_said && target) - visible_message(span_danger("The [name] gets an enraged look at [target]!")) + visible_message(span_danger("\The [src] gets an enraged look at [target]!")) aggressive_message_said = TRUE rapid_melee = 2 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm deleted file mode 100644 index b177cc651ecaa..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm +++ /dev/null @@ -1,269 +0,0 @@ -#define GOOSE_SATIATED 50 -/mob/living/simple_animal/hostile/retaliate/goose - name = "goose" - desc = "It's loose" - icon_state = "goose" // sprites by cogwerks from goonstation, used with permission - icon_living = "goose" - icon_dead = "goose_dead" - mob_biotypes = MOB_ORGANIC|MOB_BEAST - speak_chance = 0 - turns_per_move = 5 - butcher_results = list(/obj/item/food/meat/slab/grassfed = 2) - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "gently pushes aside" - response_disarm_simple = "gently push aside" - response_harm_continuous = "kicks" - response_harm_simple = "kick" - emote_taunt = list("hisses") - taunt_chance = 30 - speed = 0 - maxHealth = 25 - health = 25 - harm_intent_damage = 5 - melee_damage_lower = 5 - melee_damage_upper = 5 - attack_verb_continuous = "pecks" - attack_verb_simple = "peck" - attack_sound = "goose" - attack_vis_effect = ATTACK_EFFECT_BITE - speak_emote = list("honks") - faction = list(FACTION_NEUTRAL) - attack_same = TRUE - gold_core_spawnable = HOSTILE_SPAWN - var/random_retaliate = TRUE - var/icon_vomit_start = "vomit_start" - var/icon_vomit = "vomit" - var/icon_vomit_end = "vomit_end" - var/message_cooldown = 0 - var/choking = FALSE - -/mob/living/simple_animal/hostile/retaliate/goose/Initialize(mapload) - . = ..() - RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(goosement)) - -/mob/living/simple_animal/hostile/retaliate/goose/proc/goosement(atom/movable/AM, OldLoc, Dir, Forced) - SIGNAL_HANDLER - if(stat == DEAD) - return - if(prob(5) && random_retaliate) - Retaliate() - -/mob/living/simple_animal/hostile/retaliate/goose/handle_automated_action() - . = ..() - feed_random() - -/mob/living/simple_animal/hostile/retaliate/goose/proc/feed_random() - var/obj/item/eat_it_motherfucker = pick(locate(/obj/item) in loc) - if(!eat_it_motherfucker) - return - feed(eat_it_motherfucker) - -/mob/living/simple_animal/hostile/retaliate/goose/vomit/feed_random() - for(var/obj/item/eat_it_motherfucker in loc) - if(!eat_it_motherfucker.has_material_type(/datum/material/plastic)) - continue - feed(eat_it_motherfucker) - break - -/mob/living/simple_animal/hostile/retaliate/goose/proc/feed(obj/item/suffocator) - if(stat == DEAD || choking) // plapatin I swear to god - return FALSE - if(suffocator.has_material_type(/datum/material/plastic)) // dumb goose'll swallow food or drink with plastic in it - visible_message(span_danger("[src] hungrily gobbles up \the [suffocator]! ")) - visible_message(span_boldwarning("[src] is choking on \the [suffocator]! ")) - suffocator.forceMove(src) - choke(suffocator) - choking = TRUE - return TRUE - -/mob/living/simple_animal/hostile/retaliate/goose/vomit - name = "Birdboat" - real_name = "Birdboat" - desc = "It's a sick-looking goose, probably ate too much maintenance trash. Best not to move it around too much." - gender = MALE - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "gently pushes aside" - response_disarm_simple = "gently push aside" - response_harm_continuous = "kicks" - response_harm_simple = "kick" - faction = list(FACTION_NEUTRAL, FACTION_MAINT_CREATURES) - gold_core_spawnable = NO_SPAWN - random_retaliate = FALSE - var/vomiting = FALSE - var/vomitCoefficient = 1 - var/vomitTimeBonus = 0 - var/datum/action/cooldown/vomit/goosevomit - -/mob/living/simple_animal/hostile/retaliate/goose/vomit/Initialize(mapload) - . = ..() - goosevomit = new - goosevomit.Grant(src) - // 5% chance every round to have anarchy mode deadchat control on birdboat. - if(prob(5)) - desc = "[initial(desc)] It's waddling more than usual. It seems to be possessed." - deadchat_plays() - -/mob/living/simple_animal/hostile/retaliate/goose/vomit/Destroy() - UnregisterSignal(src, COMSIG_MOVABLE_MOVED) - QDEL_NULL(goosevomit) - return ..() - -/mob/living/simple_animal/hostile/retaliate/goose/vomit/examine(user) - . = ..() - . += span_notice("Somehow, it still looks hungry.") - -/mob/living/simple_animal/hostile/retaliate/goose/attackby(obj/item/O, mob/user) - . = ..() - if(feed(O)) - return TRUE - -/mob/living/simple_animal/hostile/retaliate/goose/vomit/feed(obj/item/food/tasty) - . = ..() - if(. || !istype(tasty)) - return FALSE - if (contents.len > GOOSE_SATIATED) - if(message_cooldown < world.time) - visible_message(span_notice("[src] looks too full to eat \the [tasty]!")) - message_cooldown = world.time + 5 SECONDS - return FALSE - if (tasty.foodtypes & GROSS) - visible_message(span_notice("[src] hungrily gobbles up \the [tasty]!")) - tasty.forceMove(src) - playsound(src,'sound/items/eatfood.ogg', 70, TRUE) - vomitCoefficient += 3 - vomitTimeBonus += 2 - return TRUE - else - if(message_cooldown < world.time) - visible_message(span_notice("[src] refuses to eat \the [tasty].")) - message_cooldown = world.time + 5 SECONDS - return FALSE - -/mob/living/simple_animal/hostile/retaliate/goose/proc/choke(obj/item/food/plastic) - if(stat == DEAD || choking) - return - addtimer(CALLBACK(src, PROC_REF(suffocate)), 30 SECONDS) - -/mob/living/simple_animal/hostile/retaliate/goose/vomit/choke(obj/item/food/plastic) - if(stat == DEAD || choking) - return - if(prob(25)) - visible_message(span_warning("[src] is gagging on \the [plastic]!")) - manual_emote("gags!") - addtimer(CALLBACK(src, PROC_REF(vomit)), 30 SECONDS) - else - addtimer(CALLBACK(src, PROC_REF(suffocate)), 30 SECONDS) - -/mob/living/simple_animal/hostile/retaliate/goose/Life(seconds_per_tick = SSMOBS_DT, times_fired) - . = ..() - if(!choking || stat) - return - do_jitter_animation(50) - if(SPT_PROB(10, seconds_per_tick)) - INVOKE_ASYNC(src, PROC_REF(emote), "gasp") - -/mob/living/simple_animal/hostile/retaliate/goose/proc/suffocate() - if(!choking) - return - death_message = "lets out one final oxygen-deprived honk before [p_they()] go[p_es()] limp and lifeless.." - death() - -/mob/living/simple_animal/hostile/retaliate/goose/vomit/proc/vomit() - if (stat == DEAD) - return - var/turf/T = get_turf(src) - var/obj/item/consumed = locate() in contents //Barf out a single food item from our guts - choking = FALSE // assume birdboat is vomiting out whatever he was choking on - if (prob(50) && consumed) - barf_food(consumed) - else - playsound(T, 'sound/effects/splat.ogg', 50, TRUE) - T.add_vomit_floor(src) - -/mob/living/simple_animal/hostile/retaliate/goose/vomit/proc/barf_food(atom/A, hard = FALSE) - if (stat == DEAD) - return - if(!istype(A, /obj/item/food)) - return - var/turf/currentTurf = get_turf(src) - var/obj/item/food/consumed = A - consumed.forceMove(currentTurf) - var/destination = get_edge_target_turf(currentTurf, pick(GLOB.alldirs)) //Pick a random direction to toss them in - var/throwRange = hard ? rand(2,8) : 1 - consumed.safe_throw_at(destination, throwRange, 2) //Thow the food at a random tile 1 spot away - sleep(0.2 SECONDS) - if (QDELETED(src) || QDELETED(consumed)) - return - currentTurf = get_turf(consumed) - currentTurf.add_vomit_floor(src) - playsound(currentTurf, 'sound/effects/splat.ogg', 50, TRUE) - -/mob/living/simple_animal/hostile/retaliate/goose/vomit/proc/vomit_prestart(duration) - flick("vomit_start",src) - addtimer(CALLBACK(src, PROC_REF(vomit_start), duration), 13) //13 is the length of the vomit_start animation in gooseloose.dmi - -/mob/living/simple_animal/hostile/retaliate/goose/vomit/proc/vomit_start(duration) - vomiting = TRUE - icon_state = "vomit" - vomit() - addtimer(CALLBACK(src, PROC_REF(vomit_preend)), duration) - -/mob/living/simple_animal/hostile/retaliate/goose/vomit/proc/vomit_preend() - for (var/obj/item/consumed in contents) //Get rid of any food left in the poor thing - barf_food(consumed, TRUE) - sleep(0.1 SECONDS) - if (QDELETED(src)) - return - vomit_end() - -/mob/living/simple_animal/hostile/retaliate/goose/vomit/proc/vomit_end() - flick("vomit_end",src) - vomiting = FALSE - icon_state = initial(icon_state) - -/mob/living/simple_animal/hostile/retaliate/goose/vomit/goosement(atom/movable/AM, OldLoc, Dir, Forced) - . = ..() - if(vomiting) - INVOKE_ASYNC(src, PROC_REF(vomit)) // its supposed to keep vomiting if you move - return - if(prob(vomitCoefficient * 0.2)) - vomit_prestart(vomitTimeBonus + 25) - vomitCoefficient = 1 - vomitTimeBonus = 0 - -/// A proc to make it easier for admins to make the goose playable by deadchat. -/mob/living/simple_animal/hostile/retaliate/goose/vomit/deadchat_plays(mode = ANARCHY_MODE, cooldown = 12 SECONDS) - . = AddComponent(/datum/component/deadchat_control/cardinal_movement, mode, list( - "vomit" = CALLBACK(src, PROC_REF(vomit_prestart), 25), - "honk" = CALLBACK(src, TYPE_PROC_REF(/atom/movable, say), "HONK!!!"), - "spin" = CALLBACK(src, TYPE_PROC_REF(/mob, emote), "spin")), cooldown, CALLBACK(src, PROC_REF(stop_deadchat_plays))) - - if(. == COMPONENT_INCOMPATIBLE) - return - - stop_automated_movement = TRUE - -/datum/action/cooldown/vomit - name = "Vomit" - check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED - button_icon_state = "vomit" - button_icon = 'icons/mob/simple/animal.dmi' - cooldown_time = 250 - -/datum/action/cooldown/vomit/Activate(atom/target) - if(!istype(owner, /mob/living/simple_animal/hostile/retaliate/goose/vomit)) - return FALSE - - StartCooldown(10 SECONDS) - var/mob/living/simple_animal/hostile/retaliate/goose/vomit/probably_birdboat = owner - if(!probably_birdboat.vomiting) - probably_birdboat.vomit_prestart(probably_birdboat.vomitTimeBonus + 25) - probably_birdboat.vomitCoefficient = 1 - probably_birdboat.vomitTimeBonus = 0 - - StartCooldown() - return TRUE - -#undef GOOSE_SATIATED diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm deleted file mode 100644 index bf1c12d5da1ee..0000000000000 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm +++ /dev/null @@ -1,59 +0,0 @@ -/mob/living/simple_animal/hostile/retaliate - ///A list of weakrefs pointing at things that we consider targets - var/list/enemies = list() - -/mob/living/simple_animal/hostile/retaliate/Found(atom/A) - if(isliving(A)) - var/mob/living/L = A - if(!L.stat) - return L - else - enemies -= WEAKREF(L) - else if(ismecha(A)) - var/obj/vehicle/sealed/mecha/M = A - if(LAZYLEN(M.occupants)) - return A - -/mob/living/simple_animal/hostile/retaliate/ListTargets() - if(!enemies.len) - return list() - var/list/see = ..() - var/list/actual_enemies = list() - for(var/datum/weakref/enemy as anything in enemies) - var/mob/flesh_and_blood = enemy.resolve() - if(!flesh_and_blood) - enemies -= enemy - continue - actual_enemies += flesh_and_blood - - see &= actual_enemies // Remove all entries that aren't in enemies - return see - -/mob/living/simple_animal/hostile/retaliate/proc/Retaliate() - var/list/around = view(src, vision_range) - - for(var/atom/movable/A in around) - if(A == src) - continue - if(isliving(A)) - var/mob/living/M = A - if(faction_check_atom(M) && attack_same || !faction_check_atom(M)) - enemies |= WEAKREF(M) - else if(ismecha(A)) - var/obj/vehicle/sealed/mecha/M = A - if(LAZYLEN(M.occupants)) - enemies |= WEAKREF(M) - add_enemies(M.occupants) - - for(var/mob/living/simple_animal/hostile/retaliate/H in around) - if(faction_check_atom(H) && !attack_same && !H.attack_same) - H.enemies |= enemies - -/mob/living/simple_animal/hostile/retaliate/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - . = ..() - if(. > 0 && stat == CONSCIOUS) - Retaliate() - -/mob/living/simple_animal/hostile/retaliate/proc/add_enemies(new_enemies) - for(var/new_enemy in new_enemies) - enemies |= WEAKREF(new_enemy) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 3bdc67a3c8984..decd3103cf7c9 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -516,7 +516,7 @@ else stack_trace("Something attempted to set simple animals AI to an invalid state: [togglestatus]") -///This proc is used for adding the swabbale element to mobs so that they are able to be biopsied and making sure holograpic and butter-based creatures don't yield viable cells samples. +///This proc is used for adding the swabbale element to mobs so that they are able to be biopsied and making sure holographic and butter-based creatures don't yield viable cells samples. /mob/living/simple_animal/proc/add_cell_sample() return @@ -549,7 +549,7 @@ stop_automated_movement = FALSE if(!isturf(src.loc)) // Are we on a proper turf? return - if(stat || resting || buckled) // Are we concious, upright, and not buckled? + if(stat || resting || buckled) // Are we conscious, upright, and not buckled? return if(!COOLDOWN_FINISHED(src, emote_cooldown)) // Has the cooldown on this ended? return diff --git a/code/modules/mob/living/sneeze.dm b/code/modules/mob/living/sneeze.dm deleted file mode 100644 index af638d7c71a77..0000000000000 --- a/code/modules/mob/living/sneeze.dm +++ /dev/null @@ -1,76 +0,0 @@ -/// How many degrees, up and down, can our sneeze deviate from our facing direction? -#define SNEEZE_CONE 60 - -/// Launch a sneeze that can infect with a disease -/mob/living/proc/infectious_sneeze(datum/disease/disease, force, range = 4, count = 4, charge_time = 0.5 SECONDS, obj/projectile/sneezoid = /obj/projectile/sneeze) - sneeze(range, count, charge_time, sneezoid, on_sneeze_hit_callback = CALLBACK(src, PROC_REF(try_sneeze_infect), disease.Copy(), force)) - -/// Try and infect following a sneeze hit. force to always infect -/mob/living/proc/try_sneeze_infect(datum/disease/disease, force, mob/living/target) - target.contract_airborne_disease(disease) - -/// Inhale and start the sneeze timer. on_sneeze_callback can be used to do custom sneezes, on_sneeze_hit_callback for special effects, but probably usually making it infect -/mob/living/proc/sneeze(range = 4, count = 3, charge_time = 0.5 SECONDS, obj/projectile/sneezoid = /obj/projectile/sneeze, on_sneeze_callback = null, on_sneeze_hit_callback = null) - if(charge_time) - emote("inhale") - - clear_fullscreen("sneezer", 0) - var/atom/movable/screen/fullscreen/cursor_catcher/catcher = overlay_fullscreen("sneezer", /atom/movable/screen/fullscreen/cursor_catcher, FALSE) - if(client) - catcher.assign_to_mob(src) - var/callback = on_sneeze_callback || CALLBACK(src, PROC_REF(launch_sneeze), range, count, sneezoid, on_sneeze_hit_callback, catcher) - addtimer(callback, charge_time) - -/// Shoot the sneeze projectile -/mob/living/proc/launch_sneeze(range, count, obj/projectile/sneezoid, datum/callback/on_sneeze_hit_callback, atom/movable/screen/fullscreen/cursor_catcher/catcher) - emote("sneeze") - - var/angle = dir2angle(dir) - - if(catcher && catcher.given_turf) - catcher.calculate_params() - /// Take the target and subtract self for relative grid position. Then take the pixel x on the tile and divide by the tiles pixel size, and add 0.5 so it's fired from the center - var/sneeze_x = catcher.given_turf.x - x + catcher.given_x / ICON_SIZE_X - 0.5 - var/sneeze_y = catcher.given_turf.y - y + catcher.given_y / ICON_SIZE_Y - 0.5 - angle = ATAN2(sneeze_y, sneeze_x) - - // Check if we're within the sneeze cone, otherwise just sneeze straight - if(abs(closer_angle_difference(angle, dir2angle(dir) - SNEEZE_CONE)) + abs(closer_angle_difference(angle, dir2angle(dir) + SNEEZE_CONE)) > 2 * SNEEZE_CONE) - angle = dir2angle(dir) - - clear_fullscreen("sneezer", 0) - - for(var/i in 0 to count) - var/obj/projectile/sneezium = new sneezoid(get_turf(src), on_sneeze_hit_callback) - sneezium.range = range - sneezium.firer = src - sneezium.fire(angle) - -/// Sneeze projectile launched by sneezing. gross -/obj/projectile/sneeze - name = "sneeze" - icon_state = "sneeze" - - suppressed = SUPPRESSED_VERY - range = 4 - speed = 0.25 - spread = 40 - damage_type = BRUTE - damage = 0 - hitsound = null - - /// Call this when we hit something - var/datum/callback/sneezie_callback - -/obj/projectile/sneeze/Initialize(mapload, callback) - . = ..() - - sneezie_callback = callback - -/obj/projectile/sneeze/on_hit(atom/target, blocked, pierce_hit) - . = ..() - - if(isliving(target)) - sneezie_callback?.Invoke(target) //you've been sneezered - -#undef SNEEZE_CONE diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 11815d71b1220..967b7cdabfd68 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -89,7 +89,7 @@ return K.duration - world.time return 0 -/mob/living/proc/Knockdown(amount, ignore_canstun = FALSE) //Can't go below remaining duration +/mob/living/proc/Knockdown(amount, daze_amount = 0, ignore_canstun = FALSE) //Can't go below remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, ignore_canstun) & COMPONENT_NO_STUN) return if(check_stun_immunity(CANKNOCKDOWN, ignore_canstun)) @@ -99,6 +99,8 @@ K.duration = max(world.time + amount, K.duration) else if(amount > 0) K = apply_status_effect(/datum/status_effect/incapacitating/knockdown, amount) + if(daze_amount > 0) + apply_status_effect(/datum/status_effect/dazed, daze_amount) return K /mob/living/proc/SetKnockdown(amount, ignore_canstun = FALSE) //Sets remaining duration @@ -117,7 +119,7 @@ K = apply_status_effect(/datum/status_effect/incapacitating/knockdown, amount) return K -/mob/living/proc/AdjustKnockdown(amount, ignore_canstun = FALSE) //Adds to remaining duration +/mob/living/proc/AdjustKnockdown(amount, daze_amount = 0, ignore_canstun = FALSE) //Adds to remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, ignore_canstun) & COMPONENT_NO_STUN) return if(check_stun_immunity(CANKNOCKDOWN, ignore_canstun)) @@ -127,6 +129,8 @@ K.duration += amount else if(amount > 0) K = apply_status_effect(/datum/status_effect/incapacitating/knockdown, amount) + if(daze_amount > 0) + apply_status_effect(/datum/status_effect/dazed, daze_amount) return K /* IMMOBILIZED */ diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 11f925e5df30e..77920a5d2f2ce 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -593,7 +593,7 @@ return FALSE //you can only initiate exaimines if you have a hand, it's not disabled, and only as many examines as you have hands - /// our active hand, to check if it's disabled/detatched + /// our active hand, to check if it's disabled/detached var/obj/item/bodypart/active_hand = has_active_hand()? get_active_hand() : null if(!active_hand || active_hand.bodypart_disabled || do_after_count() >= usable_hands) to_chat(src, span_warning("You don't have a free hand to examine this!")) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 743bdad8c4511..f833ad9028a66 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -1,5 +1,5 @@ /** - * If your mob is concious, drop the item in the active hand + * If your mob is conscious, drop the item in the active hand * * This is a hidden verb, likely for binding with winset for hotkeys */ @@ -376,12 +376,13 @@ * slipped_on - optional, what'd we slip on? if not set, we assume they just fell over * lube - bitflag of "lube flags", see [mobs.dm] for more information * paralyze - time (in deciseconds) the slip leaves them paralyzed / unable to move + * daze - time (in deciseconds) the slip leaves them vulnerable to shove stuns * force_drop = the slip forces them to drop held items */ -/mob/proc/slip(knockdown_amount, obj/slipped_on, lube_flags, paralyze, force_drop = FALSE) +/mob/proc/slip(knockdown_amount, obj/slipped_on, lube_flags, paralyze, daze, force_drop = FALSE) add_mob_memory(/datum/memory/was_slipped, antagonist = slipped_on) - SEND_SIGNAL(src, COMSIG_MOB_SLIPPED, knockdown_amount, slipped_on, lube_flags, paralyze, force_drop) + SEND_SIGNAL(src, COMSIG_MOB_SLIPPED, knockdown_amount, slipped_on, lube_flags, paralyze, daze, force_drop) //bodypart selection verbs - Cyberboss //8: repeated presses toggles through head - eyes - mouth diff --git a/code/modules/mob_spawn/ghost_roles/mining_roles.dm b/code/modules/mob_spawn/ghost_roles/mining_roles.dm index 3edfbb3416ac7..fb2d4073e971a 100644 --- a/code/modules/mob_spawn/ghost_roles/mining_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/mining_roles.dm @@ -309,6 +309,8 @@ shoes = /obj/item/clothing/shoes/combat r_pocket = /obj/item/gun/ballistic/automatic/pistol r_hand = /obj/item/gun/ballistic/rifle/sniper_rifle + belt = /obj/item/storage/belt/utility/full + glasses = /obj/item/clothing/glasses/welding/up implants = list(/obj/item/implant/weapons_auth) @@ -320,6 +322,8 @@ suit = /obj/item/clothing/suit/armor/vest mask = /obj/item/clothing/mask/chameleon/gps r_hand = /obj/item/melee/energy/sword/saber + belt = /obj/item/storage/belt/utility/full + glasses = /obj/item/clothing/glasses/welding/up /datum/outfit/lavaland_syndicate/comms/icemoon name = "Icemoon Syndicate Comms Agent" diff --git a/code/modules/mod/adding_new_mod.md b/code/modules/mod/adding_new_mod.md index 8252822cf6c25..73dcdb1c8de0b 100644 --- a/code/modules/mod/adding_new_mod.md +++ b/code/modules/mod/adding_new_mod.md @@ -12,7 +12,7 @@ So, let's our suit should be a low-power usage with lowered module capacity. We' ```dm /datum/mod_theme/psychological name = "psychological" - desc = "A DeForest Medical Corporation power-saving psychological suit, limiting its' module capacity." + desc = "A DeForest Medical Corporation power-saving psychological suit, limiting its module capacity." ``` For people that want to see additional stuff, we add an extended description with some more insight into what the suit does. We also set the default skin to usually the theme name, like so. @@ -20,7 +20,7 @@ For people that want to see additional stuff, we add an extended description wit ```dm /datum/mod_theme/psychological name = "psychological" - desc = "A DeForest Medical Corporation power-saving psychological suit, limiting its' module capacity." + desc = "A DeForest Medical Corporation power-saving psychological suit, limiting its module capacity." extended_desc = "DeForest Medical Corporation's prototype suit, based off the work of \ Nakamura Engineering. The suit has been modified to save power compared to regular suits, \ for operating at lower power levels, keeping people sane. As consequence, the capacity \ @@ -34,7 +34,7 @@ Currently crew MODsuits should be lightly armored in combat relevant stats. ```dm /datum/mod_theme/psychological name = "psychological" - desc = "A DeForest Medical Corporation power-saving psychological suit, limiting its' module capacity." + desc = "A DeForest Medical Corporation power-saving psychological suit, limiting its module capacity." extended_desc = "DeForest Medical Corporation's prototype suit, based off the work of \ Nakamura Engineering. The suit has been modified to save power compared to regular suits, \ for operating at lower power levels, keeping people sane. As consequence, the capacity \ @@ -73,7 +73,7 @@ So, now that we have our theme, we want to add a skin to it (or another theme of ```dm /datum/mod_theme/psychological name = "psychological" - desc = "A DeForest Medical Corporation power-saving psychological suit, limiting its' module capacity." + desc = "A DeForest Medical Corporation power-saving psychological suit, limiting its module capacity." extended_desc = "DeForest Medical Corporation's prototype suit, based off the work of \ Nakamura Engineering. The suit has been modified to save power compared to regular suits, \ for operating at lower power levels, keeping people sane. As consequence, the capacity \ @@ -96,7 +96,7 @@ So, now that we have our theme, we want to add a skin to it (or another theme of ) ``` -We now have a psychological skin, this will apply the psychological icons to every part of the suit. Next we'll be looking at the flags. Boots, gauntlets and the chestplate are usually very standard, we set their thickmaterial and pressureproofness while hiding the jumpsuit on the chestplate. On the helmet however, we'll actually look at its' icon. \ +We now have a psychological skin, this will apply the psychological icons to every part of the suit. Next we'll be looking at the flags. Boots, gauntlets and the chestplate are usually very standard, we set their thickmaterial and pressureproofness while hiding the jumpsuit on the chestplate. On the helmet however, we'll actually look at its icon. \ For example, if our helmet's icon covers the full head (like the research skin), we want to do something like this. ```dm @@ -126,7 +126,7 @@ There are specific cases of helmets that semi-cover the head, like the cosmohonk ```dm /datum/mod_theme/psychological name = "psychological" - desc = "A DeForest Medical Corporation power-saving psychological suit, limiting its' module capacity." + desc = "A DeForest Medical Corporation power-saving psychological suit, limiting its module capacity." extended_desc = "DeForest Medical Corporation's prototype suit, based off the work of \ Nakamura Engineering. The suit has been modified to save power compared to regular suits, \ for operating at lower power levels, keeping people sane. As consequence, the capacity \ @@ -254,7 +254,7 @@ Now we want to add it to the psychological theme, which is very simple, finishin ```dm /datum/mod_theme/psychological name = "psychological" - desc = "A DeForest Medical Corporation power-saving psychological suit, limiting its' module capacity." + desc = "A DeForest Medical Corporation power-saving psychological suit, limiting its module capacity." extended_desc = "DeForest Medical Corporation's prototype suit, based off the work of \ Nakamura Engineering. The suit has been modified to save power compared to regular suits, \ for operating at lower power levels, keeping people sane. As consequence, the capacity \ diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm index ecc3eaaedc241..4c145da4f1b35 100644 --- a/code/modules/mod/mod_activation.dm +++ b/code/modules/mod/mod_activation.dm @@ -127,6 +127,8 @@ balloon_alert(user, "already retracted!") playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE + if(SEND_SIGNAL(src, COMSIG_MOD_PART_RETRACTING, user, part_datum) & MOD_CANCEL_RETRACTION) + return FALSE if(active && part_datum.sealed) if(instant) seal_part(part, is_sealed = FALSE) @@ -141,7 +143,6 @@ if(!QDELING(wearer) && !wearer.equip_to_slot_if_possible(overslot, overslot.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) wearer.dropItemToGround(overslot, force = TRUE, silent = TRUE) wearer.update_clothing(slot_flags) - SEND_SIGNAL(src, COMSIG_MOD_PART_RETRACTED, user, part_datum) if(!user) return TRUE wearer.visible_message(span_notice("[wearer]'s [part.name] retract[part.p_s()] back into [src] with a mechanical hiss."), diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index c6048f070467e..d4572379ce016 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -1419,7 +1419,7 @@ Already light, when powered on, this MODsuit injects the wearer seemlessly with muscle-enhancing supplements, while adding piston strength \ to their legs. The combination of these mechanisms is very energy draining - but results in next to no speed reduction for the wearer.\ Over the years, many a rich person, including Nanotrasen officials with premium subscriptions, had their life or genes rescued thanks to the \ - unrivaled speed of this suit. Equally as many, however, mysteriously dissapeared in the flash of these white suits after they forgot \ + unrivaled speed of this suit. Equally as many, however, mysteriously disappeared in the flash of these white suits after they forgot \ to pay off said subscriptions in due time or publicly communicated unfavourable opinions on Interdyne's gene-modding tech and ethics. " default_skin = "interdyne" armor_type = /datum/armor/mod_theme_interdyne @@ -1575,7 +1575,7 @@ suits two or three times as thick. The nanomachines making up the outermost layer of armor \ are capable of shifting their form into almost-microscopic radiating fins, rendering the suit itself \ nigh-immune to even volcanic heat. It's entirely sealed against even the strongest acids, \ - and the myoelectric artifical muscles of the suit leave it light as a feather during movement." + and the myoelectric artificial muscles of the suit leave it light as a feather during movement." default_skin = "ninja" armor_type = /datum/armor/mod_theme_ninja resistance_flags = LAVA_PROOF|FIRE_PROOF|ACID_PROOF diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index 91fb00c633b06..050bee6ff2baf 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -82,9 +82,11 @@ /obj/item/mod/module/t_ray, /obj/item/mod/module/quick_carry, /obj/item/mod/module/headprotector, + /obj/item/mod/module/mister/atmos, ) default_pins = list( /obj/item/mod/module/magboot, + /obj/item/mod/module/mister/atmos, /obj/item/mod/module/flashlight, ) diff --git a/code/modules/mod/modules/modules_antag.dm b/code/modules/mod/modules/modules_antag.dm index ba5e1711fcb29..be3f7730b14af 100644 --- a/code/modules/mod/modules/modules_antag.dm +++ b/code/modules/mod/modules/modules_antag.dm @@ -526,10 +526,10 @@ var/list/traits_to_add = list(TRAIT_SILENT_FOOTSTEPS, TRAIT_UNKNOWN, TRAIT_HEAD_INJURY_BLOCKED) /obj/item/mod/module/infiltrator/on_install() - mod.item_flags |= EXAMINE_SKIP + ADD_TRAIT(mod, TRAIT_EXAMINE_SKIP, REF(src)) /obj/item/mod/module/infiltrator/on_uninstall(deleting = FALSE) - mod.item_flags &= ~EXAMINE_SKIP + REMOVE_TRAIT(mod, TRAIT_EXAMINE_SKIP, REF(src)) /obj/item/mod/module/infiltrator/on_part_activation() mod.wearer.add_traits(traits_to_add, REF(src)) diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm index afc472b7604f9..f1b9154358b93 100644 --- a/code/modules/mod/modules/modules_maint.dm +++ b/code/modules/mod/modules/modules_maint.dm @@ -32,12 +32,23 @@ ///Registers the signal COMSIG_MOD_ACTIVATE and calls the proc snap_shut() after a timer /obj/item/mod/module/springlock/proc/snap_signal() - if(set_off || mod.wearer.stat == DEAD) + if (set_off || mod.wearer.stat == DEAD) return + + var/found_part = FALSE + for (var/obj/item/part as anything in mod.get_parts()) + // Don't snap if no parts besides the MOD itself are active + if (part.loc != mod && mod.get_part_datum(part)?.sealed) + found_part = TRUE + break + + if (!found_part) + return + to_chat(mod.wearer, span_danger("[src] makes an ominous click sound...")) playsound(src, 'sound/items/modsuit/springlock.ogg', 75, TRUE) addtimer(CALLBACK(src, PROC_REF(snap_shut)), rand(3 SECONDS, 5 SECONDS)) - RegisterSignal(mod, COMSIG_MOD_ACTIVATE, PROC_REF(on_activate_spring_block)) + RegisterSignals(mod, list(COMSIG_MOD_ACTIVATE, COMSIG_MOD_PART_RETRACTING), PROC_REF(on_activate_spring_block)) set_off = TRUE ///Calls snap_signal() when exposed to a reagent via VAPOR, PATCH or TOUCH @@ -66,7 +77,7 @@ ///Delayed death proc of the suit after the wearer is exposed to reagents /obj/item/mod/module/springlock/proc/snap_shut() - UnregisterSignal(mod, COMSIG_MOD_ACTIVATE) + UnregisterSignal(mod, list(COMSIG_MOD_ACTIVATE, COMSIG_MOD_PART_RETRACTING)) if(!mod.wearer) //while there is a guaranteed user when on_wearer_exposed() fires, that isn't the same case for this proc return mod.wearer.visible_message("[src] inside [mod.wearer]'s [mod.name] snaps shut, mutilating the user inside!", span_userdanger("*SNAP*")) @@ -74,7 +85,16 @@ playsound(mod.wearer, 'sound/effects/snap.ogg', 75, TRUE, frequency = 0.5) playsound(mod.wearer, 'sound/effects/splat.ogg', 50, TRUE, frequency = 0.5) mod.wearer.client?.give_award(/datum/award/achievement/misc/springlock, mod.wearer) - mod.wearer.apply_damage(500, BRUTE, forced = TRUE, spread_damage = TRUE, sharpness = SHARP_POINTY) //boggers, bogchamp, etc + + mod.wearer.get_bodypart(BODY_ZONE_CHEST)?.receive_damage(200, forced = TRUE, sharpness = SHARP_POINTY) // Chest always gets hit, from the back piece you're wearing + for (var/obj/item/part as anything in mod.get_parts()) + if (part.loc == mod || !mod.get_part_datum(part)?.sealed) + continue + + for (var/obj/item/bodypart/bodypart as anything in mod.wearer.get_damageable_bodyparts()) + if (part.body_parts_covered & bodypart.body_part) // can hit chest again + bodypart.receive_damage(100, forced = TRUE, sharpness = SHARP_POINTY) //boggers, bogchamp, etc + if(!HAS_TRAIT(mod.wearer, TRAIT_NODEATH)) mod.wearer.investigate_log("has been killed by [src].", INVESTIGATE_DEATHS) mod.wearer.death() //just in case, for some reason, they're still alive diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm index b705de0f4beaa..06bd9352a9c2c 100644 --- a/code/modules/mod/modules/modules_security.dm +++ b/code/modules/mod/modules/modules_security.dm @@ -112,7 +112,6 @@ incompatible_modules = list(/obj/item/mod/module/holster) cooldown_time = 0.5 SECONDS allow_flags = MODULE_ALLOW_INACTIVE - required_slots = list(ITEM_SLOT_OCLOTHING|ITEM_SLOT_GLOVES|ITEM_SLOT_FEET) /// Gun we have holstered. var/obj/item/gun/holstered @@ -573,7 +572,7 @@ /obj/item/mod/module/quick_cuff name = "MOD restraint assist module" - desc = "Enhanced gauntlent grip pads that help with placing individuals in restraints more quickly. Doesn't look like they'll come off." + desc = "Enhanced gauntlet grip pads that help with placing individuals in restraints more quickly. Doesn't look like they'll come off." removable = FALSE complexity = 0 required_slots = list(ITEM_SLOT_GLOVES) diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm index 9cf7c4702f70c..3a53705e24bcd 100644 --- a/code/modules/mod/modules/modules_service.dm +++ b/code/modules/mod/modules/modules_service.dm @@ -95,7 +95,7 @@ // recharging cleaner spray module /obj/item/mod/module/mister/cleaner name = "MOD janitorial mister module" - desc = "An space cleaner mister, able to clean up messes quickly. Synthesizes its own supply over time (if active)." + desc = "A space cleaner mister, able to clean up messes quickly. Synthesizes its own supply over time (if active)." device = /obj/item/reagent_containers/spray/mister/janitor volume = 100 active_power_cost = DEFAULT_CHARGE_DRAIN diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 27a645be8bf39..5aa961fb346b8 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -934,6 +934,8 @@ if(inserted_disk) user.put_in_hands(inserted_disk) balloon_alert(user, "disks swapped") + else + balloon_alert(user, "disk inserted") inserted_disk = disk playsound(src, 'sound/machines/card_slide.ogg', 50) return ITEM_INTERACT_SUCCESS diff --git a/code/modules/modular_computers/file_system/programs/budgetordering.dm b/code/modules/modular_computers/file_system/programs/budgetordering.dm index 511c664c137ab..b05237436a13c 100644 --- a/code/modules/modular_computers/file_system/programs/budgetordering.dm +++ b/code/modules/modular_computers/file_system/programs/budgetordering.dm @@ -94,13 +94,18 @@ ) if((P.hidden && (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.drop_pod_only)) continue + + var/obj/item/first_item = length(P.contains) > 0 ? P.contains[1] : null data["supplies"][P.group]["packs"] += list(list( "name" = P.name, "cost" = P.get_cost(), "id" = pack, "desc" = P.desc || P.name, // If there is a description, use it. Otherwise use the pack's name. + "first_item_icon" = first_item?.icon, + "first_item_icon_state" = first_item?.icon_state, "goody" = P.goody, - "access" = P.access + "access" = P.access, + "contains" = P.get_contents_ui_data(), )) //Data regarding the User's capability to buy things. diff --git a/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm b/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm index 019083cdec97c..4490e05a46bf5 100644 --- a/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm +++ b/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm @@ -148,7 +148,7 @@ if(SEND_SIGNAL(computer, COMSIG_TABLET_CHANGE_ID, user, new_ringtone) & COMPONENT_STOP_RINGTONE_CHANGE) return FALSE - ringtone = ringtone + ringtone = new_ringtone return TRUE /datum/computer_file/program/messenger/ui_interact(mob/user, datum/tgui/ui) @@ -575,7 +575,7 @@ var/mob/sender if(ismob(source)) sender = source - if(!sender.can_perform_action(computer, ALLOW_RESTING)) + if(!sender.can_perform_action(computer, ALLOW_RESTING | ALLOW_PAI)) return FALSE if(!COOLDOWN_FINISHED(src, last_text)) @@ -730,7 +730,7 @@ if(QDELETED(src)) return - if(!usr.can_perform_action(computer, FORBID_TELEKINESIS_REACH | ALLOW_RESTING)) + if(!usr.can_perform_action(computer, FORBID_TELEKINESIS_REACH | ALLOW_RESTING | ALLOW_PAI)) return // send an activation message and open the messenger diff --git a/code/modules/modular_computers/file_system/programs/secureye.dm b/code/modules/modular_computers/file_system/programs/secureye.dm index b38200cfce185..ad90e736c9518 100644 --- a/code/modules/modular_computers/file_system/programs/secureye.dm +++ b/code/modules/modular_computers/file_system/programs/secureye.dm @@ -127,15 +127,7 @@ data["network"] = network data["mapRef"] = cam_screen.assigned_map data["can_spy"] = !!spying - var/list/cameras = get_camera_list(network) - data["cameras"] = list() - for(var/i in cameras) - var/obj/machinery/camera/C = cameras[i] - data["cameras"] += list(list( - name = C.c_tag, - ref = REF(C), - )) - + data["cameras"] = GLOB.cameranet.get_available_cameras_data(network) return data /datum/computer_file/program/secureye/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) diff --git a/code/modules/modular_computers/file_system/programs/virtual_pet.dm b/code/modules/modular_computers/file_system/programs/virtual_pet.dm index a52a0c37aaf93..9047e3014e6d5 100644 --- a/code/modules/modular_computers/file_system/programs/virtual_pet.dm +++ b/code/modules/modular_computers/file_system/programs/virtual_pet.dm @@ -17,6 +17,7 @@ GLOBAL_LIST_EMPTY(virtual_pets_list) filedesc = "Virtual Pet" downloader_category = PROGRAM_CATEGORY_GAMES extended_desc = "Download your very own Orbie today!" + program_open_overlay = "generic" program_flags = PROGRAM_ON_NTNET_STORE size = 3 tgui_id = "NtosVirtualPet" diff --git a/code/modules/pai/card.dm b/code/modules/pai/card.dm index 35d707ec0f2ac..40e1aaf6c050f 100644 --- a/code/modules/pai/card.dm +++ b/code/modules/pai/card.dm @@ -14,8 +14,8 @@ /// Spam alert prevention var/alert_cooldown - /// The emotion icon displayed. - var/emotion_icon = "off" + /// The icon displayed on the card's screen. + var/datum/pai_screen_image/screen_image = /datum/pai_screen_image/off /// Any pAI personalities inserted var/mob/living/silicon/pai/pai /// Prevents a crew member from hitting "request pAI" repeatedly @@ -67,7 +67,7 @@ if(QDELETED(src)) return pai = null - emotion_icon = initial(emotion_icon) + screen_image = initial(screen_image) update_appearance() /obj/item/pai_card/on_saboteur(datum/source, disrupt_duration) @@ -81,13 +81,13 @@ /obj/item/pai_card/update_overlays() . = ..() - . += "pai-[emotion_icon]" + . += image(icon = screen_image.icon, icon_state = screen_image.icon_state) if(pai?.hacking_cable) . += "[initial(icon_state)]-connector" /obj/item/pai_card/vv_edit_var(vname, vval) . = ..() - if(vname == NAMEOF(src, emotion_icon)) + if(vname == NAMEOF(src, screen_image)) update_appearance() /obj/item/pai_card/ui_interact(mob/user, datum/tgui/ui) @@ -283,7 +283,7 @@ return FALSE pai = downloaded RegisterSignal(pai, COMSIG_QDELETING, PROC_REF(on_pai_del)) - emotion_icon = "null" + screen_image = /datum/pai_screen_image/neutral update_appearance() playsound(src, 'sound/effects/pai_boot.ogg', 50, TRUE, -1) audible_message("[src] plays a cheerful startup noise!") diff --git a/code/modules/pai/datums/screen_icon.dm b/code/modules/pai/datums/screen_icon.dm new file mode 100644 index 0000000000000..2115b8ea0d617 --- /dev/null +++ b/code/modules/pai/datums/screen_icon.dm @@ -0,0 +1,67 @@ +// Datums describing an icon that is overlaid on a pAI card, to make its screen show something. The +// player can select between any of these at any time. These are usually faces, but can +// realistically be anything (similar to an AI's display). + +/datum/pai_screen_image + // The name to show in the radial menu. + var/name + // The icon and icon state that is applied to the pAI device when this screen image is selected. + var/icon/icon = 'icons/obj/aicards.dmi' + var/icon_state + // The FontAwesome icon to use next to the "Display" button in the pAI's tgui interface window. + var/interface_icon + +/datum/pai_screen_image/angry + name = "Angry" + icon_state = "pai-angry" + interface_icon = "angry" + +/datum/pai_screen_image/cat + name = "Cat" + icon_state = "pai-cat" + interface_icon = "cat" + +/datum/pai_screen_image/extremely_happy + name = "Extremely Happy" + icon_state = "pai-extremely-happy" + interface_icon = "grin-beam" + +/datum/pai_screen_image/face + name = "Face" + icon_state = "pai-face" + interface_icon = "grin-alt" + +/datum/pai_screen_image/happy + name = "Happy" + icon_state = "pai-happy" + interface_icon = "smile" + +/datum/pai_screen_image/laugh + name = "Laugh" + icon_state = "pai-laugh" + interface_icon = "grin-tears" + +/datum/pai_screen_image/neutral + name = "Neutral" + icon_state = "pai-null" + interface_icon = "meh" + +/datum/pai_screen_image/off + name = "None" + icon_state = "pai-off" + interface_icon = "meh-blank" + +/datum/pai_screen_image/sad + name = "Sad" + icon_state = "pai-sad" + interface_icon = "sad-cry" + +/datum/pai_screen_image/sunglasses + name = "Sunglasses" + icon_state = "pai-sunglasses" + interface_icon = "sun" + +/datum/pai_screen_image/what + name = "What" + icon_state = "pai-what" + interface_icon = "frown-open" diff --git a/code/modules/pai/death.dm b/code/modules/pai/death.dm index 469f1757d47a5..b819e16bfce8f 100644 --- a/code/modules/pai/death.dm +++ b/code/modules/pai/death.dm @@ -13,7 +13,7 @@ if (!QDELETED(card) && loc != card) card.forceMove(drop_location()) card.pai = null - card.emotion_icon = initial(card.emotion_icon) + card.screen_image = initial(card.screen_image) card.update_appearance() qdel(src) diff --git a/code/modules/pai/pai.dm b/code/modules/pai/pai.dm index 728ac6427cec9..3735313a692ff 100644 --- a/code/modules/pai/pai.dm +++ b/code/modules/pai/pai.dm @@ -123,20 +123,6 @@ "puppy" = TRUE, "spider" = TRUE, ) - /// List of all available card overlays. - var/static/list/possible_overlays = list( - "null", - "angry", - "cat", - "extremely-happy", - "face", - "happy", - "laugh", - "off", - "sad", - "sunglasses", - "what" - ) /mob/living/silicon/pai/add_sensors() //pAIs have to buy their HUDs return diff --git a/code/modules/pai/software.dm b/code/modules/pai/software.dm index 285193c7e4cd7..f0b61e05929e4 100644 --- a/code/modules/pai/software.dm +++ b/code/modules/pai/software.dm @@ -8,7 +8,7 @@ /mob/living/silicon/pai/ui_data(mob/user) var/list/data = list() data["door_jack"] = hacking_cable - data["image"] = card.emotion_icon + data["screen_image_interface_icon"] = card.screen_image.interface_icon data["installed"] = installed_software data["ram"] = ram return data @@ -135,16 +135,16 @@ */ /mob/living/silicon/pai/proc/change_image() var/list/possible_choices = list() - for(var/face_option in possible_overlays) + for(var/datum/pai_screen_image/screen_option as anything in subtypesof(/datum/pai_screen_image)) var/datum/radial_menu_choice/choice = new - choice.name = face_option - choice.image = image(icon = card.icon, icon_state = "pai-[face_option]") - possible_choices[face_option] += choice + choice.name = screen_option.name + choice.image = image(icon = screen_option.icon, icon_state = screen_option.icon_state) + possible_choices[screen_option] += choice var/atom/anchor = get_atom_on_turf(src) var/new_image = show_radial_menu(src, anchor, possible_choices, custom_check = CALLBACK(src, PROC_REF(check_menu), anchor), radius = 40, require_near = TRUE) if(isnull(new_image)) return FALSE - card.emotion_icon = new_image + card.screen_image = new_image card.update_appearance() return TRUE diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index fe0a78572dfb7..6926515caa6f3 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -403,8 +403,8 @@ playsound(source, 'sound/items/weapons/saberoff.ogg', 5, TRUE) UnregisterSignal(source, list(COMSIG_ITEM_UNEMBEDDED, COMSIG_ITEM_FAILED_EMBED)) victim.visible_message( - message = span_warning("The blade of the [hidden_name] retracts as the [source.name] is removed from [victim]!"), - self_message = span_warning("The blade of the [hidden_name] retracts as the [source.name] is removed from you!"), + message = span_warning("The blade of the [hidden_name] retracts as \the [source] is removed from [victim]!"), + self_message = span_warning("The blade of the [hidden_name] retracts as \the [source] is removed from you!"), blind_message = span_warning("You hear an energy blade retract!"), vision_distance = 1 ) @@ -493,7 +493,7 @@ /obj/item/pen/destroyer name = "Fine Tipped Pen" - desc = "A pen with an infinitly sharpened tip. Capable of striking the weakest point of a strucutre or robot and annihilating it instantly. Good at putting holes in people too." + desc = "A pen with an infinitely-sharpened tip. Capable of striking the weakest point of a strucutre or robot and annihilating it instantly. Good at putting holes in people too." force = 5 wound_bonus = 100 demolition_mod = 9000 diff --git a/code/modules/plumbing/plumbers/_plumb_machinery.dm b/code/modules/plumbing/plumbers/_plumb_machinery.dm index f16091cc21b26..14ae1cf24dfc5 100644 --- a/code/modules/plumbing/plumbers/_plumb_machinery.dm +++ b/code/modules/plumbing/plumbers/_plumb_machinery.dm @@ -65,7 +65,7 @@ . += span_warning("Needs to be [EXAMINE_HINT("anchored")] to start operations.") . += span_notice("It can be [EXAMINE_HINT("welded")] apart.") - . += span_notice("An [EXAMINE_HINT("plunger")] can be used to flush out reagents.") + . += span_notice("A [EXAMINE_HINT("plunger")] can be used to flush out reagents.") /obj/machinery/plumbing/wrench_act(mob/living/user, obj/item/tool) if(user.combat_mode) @@ -88,10 +88,10 @@ return ITEM_INTERACT_BLOCKING if(I.tool_start_check(user, amount = 1)) - to_chat(user, span_notice("You start slicing the [name] apart.")) + to_chat(user, span_notice("You start slicing \the [src] apart.")) if(I.use_tool(src, user, 1.5 SECONDS, volume = 50)) deconstruct(TRUE) - to_chat(user, span_notice("You slice the [name] apart.")) + to_chat(user, span_notice("You slice \the [src] apart.")) return ITEM_INTERACT_SUCCESS return ITEM_INTERACT_BLOCKING diff --git a/code/modules/plumbing/plumbers/_plumb_reagents.dm b/code/modules/plumbing/plumbers/_plumb_reagents.dm index 90954ca4985a3..92097e2e1e912 100644 --- a/code/modules/plumbing/plumbers/_plumb_reagents.dm +++ b/code/modules/plumbing/plumbers/_plumb_reagents.dm @@ -111,7 +111,7 @@ target_holder.handle_reactions() src.handle_reactions() - return round(total_transfered_amount, CHEMICAL_VOLUME_ROUNDING) + return total_transfered_amount ///Excludes catalysts during the emptying process /datum/reagents/plumbing/reaction_chamber @@ -265,4 +265,4 @@ target_holder.handle_reactions() src.handle_reactions() - return round(total_transfered_amount, CHEMICAL_VOLUME_ROUNDING) + return total_transfered_amount diff --git a/code/modules/plumbing/plumbers/pill_press.dm b/code/modules/plumbing/plumbers/pill_press.dm index b5b0744589ae7..445eae02f274f 100644 --- a/code/modules/plumbing/plumbers/pill_press.dm +++ b/code/modules/plumbing/plumbers/pill_press.dm @@ -62,7 +62,7 @@ /obj/machinery/plumbing/pill_press/examine(mob/user) . = ..() - . += span_notice("The [name] currently has [stored_products.len] stored. There needs to be less than [MAX_FLOOR_PRODUCTS] on the floor to continue dispensing.") + . += span_notice("\The [src] currently has [stored_products.len] stored. There needs to be less than [MAX_FLOOR_PRODUCTS] on the floor to continue dispensing.") /obj/machinery/plumbing/pill_press/process(seconds_per_tick) if(!is_operational) diff --git a/code/modules/plumbing/plumbers/plumbing_buffer.dm b/code/modules/plumbing/plumbers/plumbing_buffer.dm index 06aad506ff035..c66687e68193d 100644 --- a/code/modules/plumbing/plumbers/plumbing_buffer.dm +++ b/code/modules/plumbing/plumbers/plumbing_buffer.dm @@ -20,14 +20,7 @@ /obj/machinery/plumbing/buffer/create_reagents(max_vol, flags) . = ..() - RegisterSignals(reagents, list(COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_REM_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_CLEAR_REAGENTS, COMSIG_REAGENTS_REACTED), PROC_REF(on_reagent_change)) - RegisterSignal(reagents, COMSIG_QDELETING, PROC_REF(on_reagents_del)) - -/// Handles properly detaching signal hooks. -/obj/machinery/plumbing/buffer/proc/on_reagents_del(datum/reagents/reagents) - SIGNAL_HANDLER - UnregisterSignal(reagents, list(COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_REM_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_CLEAR_REAGENTS, COMSIG_REAGENTS_REACTED, COMSIG_QDELETING)) - return NONE + RegisterSignal(reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(on_reagent_change)) /obj/machinery/plumbing/buffer/proc/on_reagent_change() SIGNAL_HANDLER diff --git a/code/modules/plumbing/plumbers/pumps.dm b/code/modules/plumbing/plumbers/pumps.dm index 5aa1dc707e376..087367a110c2e 100644 --- a/code/modules/plumbing/plumbers/pumps.dm +++ b/code/modules/plumbing/plumbers/pumps.dm @@ -40,7 +40,7 @@ update_appearance() if(!geyser) //we didnt find one, abort geyserless = TRUE - visible_message(span_warning("The [name] makes a sad beep!")) + visible_message(span_warning("\The [src] makes a sad beep!")) playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 50) return diff --git a/code/modules/plumbing/plumbers/reaction_chamber.dm b/code/modules/plumbing/plumbers/reaction_chamber.dm index 0570aebcfa0dd..c934fbcca2957 100644 --- a/code/modules/plumbing/plumbers/reaction_chamber.dm +++ b/code/modules/plumbing/plumbers/reaction_chamber.dm @@ -30,28 +30,14 @@ . = ..() AddComponent(/datum/component/plumbing/reaction_chamber, bolt, layer) -/obj/machinery/plumbing/reaction_chamber/create_reagents(max_vol, flags) - . = ..() - RegisterSignals(reagents, list(COMSIG_REAGENTS_REM_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_CLEAR_REAGENTS, COMSIG_REAGENTS_REACTED), PROC_REF(on_reagent_change)) - RegisterSignal(reagents, COMSIG_QDELETING, PROC_REF(on_reagents_del)) - -/// Handles properly detaching signal hooks. -/obj/machinery/plumbing/reaction_chamber/proc/on_reagents_del(datum/reagents/reagents) - SIGNAL_HANDLER - - UnregisterSignal(reagents, list(COMSIG_REAGENTS_REM_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_CLEAR_REAGENTS, COMSIG_REAGENTS_REACTED, COMSIG_QDELETING)) - - return NONE - /// Handles stopping the emptying process when the chamber empties. -/obj/machinery/plumbing/reaction_chamber/proc/on_reagent_change(datum/reagents/plumbing/reaction_chamber/holder, ...) +/obj/machinery/plumbing/reaction_chamber/proc/on_reagent_change(datum/reagents/plumbing/reaction_chamber/holder) SIGNAL_HANDLER - if(!holder.get_catalyst_excluded_volume() && emptying) //we were emptying, but now we aren't + if(!holder.get_catalyst_excluded_volume()) //we were emptying, but now we aren't emptying = FALSE holder.flags |= NO_REACT - - return NONE + UnregisterSignal(reagents, COMSIG_REAGENTS_HOLDER_UPDATED) /obj/machinery/plumbing/reaction_chamber/process(seconds_per_tick) if(!is_operational || !reagents.total_volume) @@ -137,6 +123,7 @@ var/input_amount = text2num(params["amount"]) if(!input_amount) return FALSE + input_amount = round(input_amount, CHEMICAL_VOLUME_ROUNDING) if(!required_reagents[input_reagent]) required_reagents[input_reagent] = input_amount diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index e27ea98f8ca5f..e742e8f3324f7 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -180,9 +180,9 @@ var/obj/item/stack/addstack = O var/amount = min((max_sheets - sheets), addstack.amount) if(amount < 1) - to_chat(user, span_notice("The [src.name] is full!")) + to_chat(user, span_notice("\The [src] is full!")) return - to_chat(user, span_notice("You add [amount] sheets to the [src.name].")) + to_chat(user, span_notice("You add [amount] sheets to \the [src].")) sheets += amount addstack.use(amount) return diff --git a/code/modules/power/power_store.dm b/code/modules/power/power_store.dm index 269faef2821ca..277c5c031b462 100644 --- a/code/modules/power/power_store.dm +++ b/code/modules/power/power_store.dm @@ -103,14 +103,7 @@ /obj/item/stock_parts/power_store/create_reagents(max_vol, flags) . = ..() - RegisterSignals(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_REM_REAGENT), PROC_REF(on_reagent_change)) - RegisterSignal(reagents, COMSIG_QDELETING, PROC_REF(on_reagents_del)) - -/// Handles properly detaching signal hooks. -/obj/item/stock_parts/power_store/proc/on_reagents_del(datum/reagents/reagents) - SIGNAL_HANDLER - UnregisterSignal(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_REM_REAGENT, COMSIG_QDELETING)) - return NONE + RegisterSignal(reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(on_reagent_change)) /obj/item/stock_parts/power_store/update_overlays() . = ..() @@ -205,11 +198,10 @@ else if(!isnull(charge_light_type)) . += "The charge meter reads [CEILING(percent(), 0.1)]%." //so it doesn't say 0% charge when the overlay indicates it still has charge -/obj/item/stock_parts/power_store/proc/on_reagent_change(datum/reagents/holder, ...) +/obj/item/stock_parts/power_store/proc/on_reagent_change(datum/reagents/holder) SIGNAL_HANDLER - rigged = (corrupted || holder.has_reagent(/datum/reagent/toxin/plasma, 5)) ? TRUE : FALSE //has_reagent returns the reagent datum - return NONE + rigged = corrupted || !!holder.has_reagent(/datum/reagent/toxin/plasma, 5) //has_reagent returns the reagent datum /obj/item/stock_parts/power_store/proc/explode() if(!charge) diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm index 69693af3a4a92..99f61186180d7 100644 --- a/code/modules/power/rtg.dm +++ b/code/modules/power/rtg.dm @@ -112,7 +112,7 @@ name = "Lava powered RTG" desc = "This device only works when exposed to the toxic fumes of Lavaland" circuit = null - power_gen = 1500 + power_gen = 20000 anchored = TRUE resistance_flags = LAVA_PROOF diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 22682471d1359..87cc6c9af57d5 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -145,7 +145,7 @@ if(prob(20)) user.Stun(40) user.take_overall_damage(burn = shock_damage) - user.visible_message(span_danger("[user.name] is shocked by the [src.name]!"), \ + user.visible_message(span_danger("[user.name] is shocked by \the [src]!"), \ span_userdanger("Energy pulse detected, system damaged!"), \ span_hear("You hear an electrical crack.")) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index f3dd1be2581cb..952f57b9174cb 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -282,7 +282,7 @@ if(welded) if(!item.tool_start_check(user, amount=1)) return TRUE - user.visible_message(span_notice("[user.name] starts to cut the [name] free from the floor."), \ + user.visible_message(span_notice("[user.name] starts to cut \the [src] free from the floor."), \ span_notice("You start to cut [src] free from the floor..."), \ span_hear("You hear welding.")) if(!item.use_tool(src, user, 20, 1, 50)) @@ -298,7 +298,7 @@ return TRUE if(!item.tool_start_check(user, amount=1)) return TRUE - user.visible_message(span_notice("[user.name] starts to weld the [name] to the floor."), \ + user.visible_message(span_notice("[user.name] starts to weld \the [src] to the floor."), \ span_notice("You start to weld [src] to the floor..."), \ span_hear("You hear welding.")) if(!item.use_tool(src, user, 20, 1, 50)) diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index da3a4e12c5662..0b199627c24d0 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -252,7 +252,7 @@ no power level overlay is currently in the overlays list. check_power_level() return TRUE else - visible_message(span_danger("The [name] shuts down!"), span_hear("You hear something shutting down.")) + visible_message(span_danger("\The [src] shuts down!"), span_hear("You hear something shutting down.")) turn_off() investigate_log("ran out of power and DEACTIVATED.", INVESTIGATE_ENGINE) power = 0 diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index a53d959c9e31e..47d2488602f66 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -454,7 +454,7 @@ if(istype(stunned_human.glasses, /obj/item/clothing/glasses/meson)) var/obj/item/clothing/glasses/meson/check_meson = stunned_human.glasses if(check_meson.vision_flags & SEE_TURFS) - to_chat(stunned_human, span_notice("You look directly into the [name], good thing you had your protective eyewear on!")) + to_chat(stunned_human, span_notice("You look directly into \the [src], good thing you had your protective eyewear on!")) continue apply_stun(stunned_mob) @@ -462,8 +462,8 @@ /obj/singularity/proc/apply_stun(mob/living/carbon/stunned_mob) stunned_mob.apply_effect(60, EFFECT_STUN) stunned_mob.visible_message( - span_danger("[stunned_mob] stares blankly at the [name]!"), - span_userdanger("You look directly into the [name] and feel weak.") + span_danger("[stunned_mob] stares blankly at \the [src]!"), + span_userdanger("You look directly into \the [src] and feel weak.") ) /obj/singularity/proc/emp_area() diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 4cd1692cc3e0a..aaa8748702052 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -1,4 +1,4 @@ -#define SOLAR_GEN_RATE 1500 +#define SOLAR_GEN_RATE 2500 #define OCCLUSION_DISTANCE 20 #define PANEL_Z_OFFSET 13 #define PANEL_EDGE_Z_OFFSET (PANEL_Z_OFFSET - 2) @@ -15,6 +15,7 @@ max_integrity = 150 integrity_failure = 0.33 + var/id var/obscured = FALSE ///`[0-1]` measure of obscuration -- multipllier against power generation @@ -30,11 +31,17 @@ var/obj/effect/overlay/panel var/obj/effect/overlay/panel_edge + //used to keep track of what material our panel currently has + var/datum/material/material_type = /datum/material/glass + + ///better glass increases the how much power the solar gives. the power_tier is a multiplier + var/power_tier = 1 + /obj/machinery/power/solar/Initialize(mapload, obj/item/solar_assembly/S) . = ..() - panel_edge = add_panel_overlay("solar_panel_edge", PANEL_EDGE_Z_OFFSET) - panel = add_panel_overlay("solar_panel", PANEL_Z_OFFSET) + panel_edge = add_panel_overlay("solar_panel_glass_edge", PANEL_EDGE_Z_OFFSET) + panel = add_panel_overlay("solar_panel_glass", PANEL_Z_OFFSET) Make(S) connect_to_network() @@ -74,29 +81,26 @@ unset_control() control = SC SC.connected_panels += src + SC.total_capacity += SOLAR_GEN_RATE * power_tier queue_turn(SC.azimuth_target) //set the control of the panel to null and removes it from the control list of the previous control computer if needed /obj/machinery/power/solar/proc/unset_control() if(control) control.connected_panels -= src + control.total_capacity -= SOLAR_GEN_RATE * power_tier control = null -/obj/machinery/power/solar/proc/Make(obj/item/solar_assembly/S) - if(!S) - S = new /obj/item/solar_assembly(src) - S.glass_type = /obj/item/stack/sheet/glass - S.set_anchored(TRUE) +/obj/machinery/power/solar/proc/Make(obj/item/solar_assembly/assembly) + if(!assembly) + assembly= new /obj/item/solar_assembly(src) + assembly.glass_type = /obj/item/stack/sheet/glass + assembly.set_anchored(TRUE) else - S.forceMove(src) - if(S.glass_type == /obj/item/stack/sheet/rglass) //if the panel is in reinforced glass - max_integrity *= 2 //this need to be placed here, because panels already on the map don't have an assembly linked to - atom_integrity = max_integrity + assembly.forceMove(src) /obj/machinery/power/solar/crowbar_act(mob/user, obj/item/I) - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) - user.visible_message(span_notice("[user] begins to take the glass off [src]."), span_notice("You begin to take the glass off [src]...")) - if(I.use_tool(src, user, 50)) + if(I.use_tool(src, user, 0)) playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE) user.visible_message(span_notice("[user] takes the glass off [src]."), span_notice("You take the glass off [src].")) deconstruct(TRUE) @@ -125,19 +129,28 @@ /obj/machinery/power/solar/on_deconstruction(disassembled) if(disassembled) - var/obj/item/solar_assembly/S = locate() in src - if(S) - S.forceMove(loc) - S.give_glass(machine_stat & BROKEN) + var/obj/item/solar_assembly/assembly = locate() in src + if(assembly) + assembly.forceMove(loc) + if(machine_stat & BROKEN) + new material_type.shard_type(get_turf(src)) + new material_type.shard_type(get_turf(src)) + else + new material_type.sheet_type(get_turf(src)) + new material_type.sheet_type(get_turf(src)) else + //When smashed to bits playsound(src, SFX_SHATTER, 70, TRUE) - new /obj/item/shard(src.loc) - new /obj/item/shard(src.loc) + + new material_type.shard_type(get_turf(src)) + new material_type.shard_type(get_turf(src)) + /obj/machinery/power/solar/update_overlays() . = ..() - panel.icon_state = "solar_panel[(machine_stat & BROKEN) ? "-b" : null]" - panel_edge.icon_state = "solar_panel[(machine_stat & BROKEN) ? "-b" : "_edge"]" + panel.icon_state = "solar_panel_[material_type.name][(machine_stat & BROKEN) ? "-b" : null]" + panel_edge.icon_state = "solar_panel_[material_type.name][(machine_stat & BROKEN) ? "-b" : "_edge"]" + /obj/machinery/power/solar/proc/queue_turn(azimuth) needs_to_turn = TRUE @@ -249,7 +262,7 @@ if(sunfrac <= 0) return - var/sgen = SOLAR_GEN_RATE * sunfrac + var/sgen = SOLAR_GEN_RATE * sunfrac * power_tier add_avail(power_to_energy(sgen)) if(control) control.gen += sgen @@ -293,73 +306,102 @@ pixel_x = base_pixel_x + rand(-amount, amount) pixel_y = base_pixel_y + rand(-amount, amount) -// Give back the glass type we were supplied with -/obj/item/solar_assembly/proc/give_glass(device_broken) - var/atom/Tsec = drop_location() - if(device_broken) - new /obj/item/shard(Tsec) - new /obj/item/shard(Tsec) - else if(glass_type) - new glass_type(Tsec, 2) - glass_type = null - /obj/item/solar_assembly/set_anchored(anchorvalue) . = ..() if(isnull(.)) return randomise_offset(anchored ? 0 : random_offset) -/obj/item/solar_assembly/attackby(obj/item/W, mob/user, params) - if(W.tool_behaviour == TOOL_WRENCH && isturf(loc)) +/obj/item/solar_assembly/attackby(obj/item/item_used, mob/user, params) + if(item_used.tool_behaviour == TOOL_WRENCH && isturf(loc)) if(isinspace()) to_chat(user, span_warning("You can't secure [src] here.")) return set_anchored(!anchored) user.visible_message( - span_notice("[user] [anchored ? null : "un"]wrenches the solar assembly [anchored ? "into place" : null]."), - span_notice("You [anchored ? null : "un"]wrench the solar assembly [anchored ? "into place" : null]."), + span_notice("[user] [anchored ? null : "un"]wrenches the solar assembly[anchored ? " into place" : null]."), + span_notice("You [anchored ? null : "un"]wrench the solar assembly[anchored ? " into place" : null]."), ) - W.play_tool_sound(src, 75) + item_used.play_tool_sound(src, 75) return TRUE - if(istype(W, /obj/item/stack/sheet/glass) || istype(W, /obj/item/stack/sheet/rglass)) - if(!anchored) - to_chat(user, span_warning("You need to secure the assembly before you can add glass.")) - return - var/turf/solarturf = get_turf(src) - if(locate(/obj/machinery/power/solar) in solarturf) - to_chat(user, span_warning("A solar panel is already assembled here.")) + if(tracker) + if(item_used.tool_behaviour == TOOL_CROWBAR) + new /obj/item/electronics/tracker(src.loc) + tracker = FALSE + update_appearance() + user.visible_message(span_notice("[user] takes out the electronics from the solar assembly."), span_notice("You take out the electronics from the solar assembly.")) + return TRUE + + if(!istype(item_used, /obj/item/stack/sheet/glass)) + to_chat(user, span_warning("The tracker only accepts standard, un-reinforced glass.")) return - var/obj/item/stack/sheet/S = W - if(S.use(2)) - glass_type = W.type - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) - user.visible_message(span_notice("[user] places the glass on the solar assembly."), span_notice("You place the glass on the solar assembly.")) - if(tracker) - new /obj/machinery/power/tracker(get_turf(src), src) - else - new /obj/machinery/power/solar(get_turf(src), src) - else - to_chat(user, span_warning("You need two sheets of glass to put them into a solar panel!")) + var/obj/item/stack/sheet/my_sheet = item_used + if(!my_sheet.use(2)) + to_chat(user, span_warning("You don't have enough glass to complete the tracker.")) return - return TRUE + playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + user.visible_message(span_notice("[user] places the glass on the solar assembly."),span_notice("You place the glass on the solar assembly.")) + new /obj/machinery/power/tracker/(get_turf(src)) + return if(!tracker) - if(istype(W, /obj/item/electronics/tracker)) - if(!user.temporarilyRemoveItemFromInventory(W)) + if(istype(item_used, /obj/item/electronics/tracker)) + if(!user.temporarilyRemoveItemFromInventory(item_used)) return tracker = TRUE update_appearance() - qdel(W) + qdel(item_used) user.visible_message(span_notice("[user] inserts the electronics into the solar assembly."), span_notice("You insert the electronics into the solar assembly.")) return TRUE - else - if(W.tool_behaviour == TOOL_CROWBAR) - new /obj/item/electronics/tracker(src.loc) - tracker = FALSE - update_appearance() - user.visible_message(span_notice("[user] takes out the electronics from the solar assembly."), span_notice("You take out the electronics from the solar assembly.")) - return TRUE + + //make a list of all the glass + var/static/list/acceptable_glass_list = typecacheof(list( + /obj/item/stack/sheet/glass, + /obj/item/stack/sheet/plasmaglass, + /obj/item/stack/sheet/titaniumglass, + /obj/item/stack/sheet/plastitaniumglass, + )) + + if(!acceptable_glass_list[item_used.type]) + //items that arent used above, or arent usable glass will make it here. + //so we check if its reinfocred glass, or some other item + if(istype(item_used, /obj/item/stack/sheet/rglass) || istype(item_used, /obj/item/stack/sheet/plasmarglass)) + to_chat(user, span_warning("The solar array will only accept glass or glass alloys that have not been reinforced.")) + //an else statement can be put here if you want something to happen to all the misc items that make it this far + return + + var/turf/solarturf = get_turf(src) + if(locate(/obj/machinery/power/solar) in solarturf) + to_chat(user, span_warning("A solar panel is already assembled here.")) + return + + if(is_glass_sheet(item_used)) + if(!anchored) + to_chat(user, span_warning("You need to secure the assembly before you can add glass.")) + return + + var/list/glass_material_to_tier = list( + /datum/material/glass = 1, + /datum/material/alloy/titaniumglass = 2, + /datum/material/alloy/plasmaglass = 3, + /datum/material/alloy/plastitaniumglass = 4, + ) + + var/obj/item/stack/sheet/my_sheet = item_used + if(!my_sheet.use(2)) + to_chat(user, span_warning("You need at least two sheets of glass to complete a solar panel!")) + return + + var/datum/material/glass_material = my_sheet.material_type + playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + user.visible_message(span_notice("[user] places the glass on the solar assembly."), span_notice("You place the glass on the solar assembly.")) + var/obj/machinery/power/solar/mySolar = new /obj/machinery/power/solar(get_turf(src), src) + mySolar.power_tier = glass_material_to_tier[glass_material] + mySolar.material_type = glass_material + mySolar.panel.icon_state = "solar_panel_[glass_material.name]" + mySolar.panel_edge.icon_state = "solar_panel_[glass_material.name]_edge" + return TRUE return ..() // @@ -389,6 +431,8 @@ var/obj/machinery/power/tracker/connected_tracker = null var/list/connected_panels = list() + var/total_capacity //The total amount of power we could generate with all our connected solars + ///History of power supply var/list/history = list() ///Size of history, should be equal or bigger than the solar cycle @@ -451,7 +495,7 @@ var/list/capacity = history["capacity"] if(powernet) - capacity += round(max(connected_panels.len, 1) * SOLAR_GEN_RATE) + capacity += total_capacity if(capacity.len > record_size) capacity.Cut(1, 2) @@ -476,7 +520,7 @@ /obj/machinery/power/solar_control/ui_data() var/data = list() data["supply"] = round(lastgen) - data["capacity"] = connected_panels.len * SOLAR_GEN_RATE + data["capacity"] = total_capacity data["azimuth_current"] = azimuth_target data["azimuth_rate"] = azimuth_rate data["max_rotation_rate"] = SSsun.base_rotation * 2 @@ -601,7 +645,7 @@ /obj/item/paper/guides/jobs/engi/solars name = "paper- 'Going green! Setup your own solar array instructions.'" - default_raw_text = "

Welcome

At greencorps we love the environment, and space. With this package you are able to help mother nature and produce energy without any usage of fossil fuel or plasma! Singularity energy is dangerous while solar energy is safe, which is why it's better. Now here is how you setup your own solar array.

You can make a solar panel by wrenching the solar assembly onto a cable node. Adding a glass panel, reinforced or regular glass will do, will finish the construction of your solar panel. It is that easy!

Now after setting up 19 more of these solar panels you will want to create a solar tracker to keep track of our mother nature's gift, the sun. These are the same steps as before except you insert the tracker equipment circuit into the assembly before performing the final step of adding the glass. You now have a tracker! Now the last step is to add a computer to calculate the sun's movements and to send commands to the solar panels to change direction with the sun. Setting up the solar computer is the same as setting up any computer, so you should have no trouble in doing that. You do need to put a wire node under the computer, and the wire needs to be connected to the tracker.

Congratulations, you should have a working solar array. If you are having trouble, here are some tips. Make sure all solar equipment are on a cable node, even the computer. You can always deconstruct your creations if you make a mistake.

That's all to it, be safe, be green!

" + default_raw_text = "

Welcome

At greencorps we love the environment, and space. With this package you are able to help mother nature and produce energy without any usage of fossil fuel or plasma! Singularity energy is dangerous while solar energy is safe, which is why it's better. Now here is how you setup your own solar array.

You can make a solar panel by wrenching the solar assembly onto a cable node. Adding a glass panel, any non reinforced glass will do, will finish the construction of your solar panel. It is that easy!

Now after setting up 19 more of these solar panels you will want to create a solar tracker to keep track of our mother nature's gift, the sun. These are the same steps as before except you insert the tracker equipment circuit into the assembly before performing the final step of adding the glass. You now have a tracker! Now the last step is to add a computer to calculate the sun's movements and to send commands to the solar panels to change direction with the sun. Setting up the solar computer is the same as setting up any computer, so you should have no trouble in doing that. You do need to put a wire node under the computer, and the wire needs to be connected to the tracker.

Congratulations, you should have a working solar array. If you are having trouble, here are some tips. Make sure all solar equipment are on a cable node, even the computer. You can always deconstruct your creations if you make a mistake.

That's all to it, be safe, be green!

" #undef SOLAR_GEN_RATE #undef OCCLUSION_DISTANCE diff --git a/code/modules/power/supermatter/supermatter_hit_procs.dm b/code/modules/power/supermatter/supermatter_hit_procs.dm index d2e87ef4e548d..cb17c8eae6214 100644 --- a/code/modules/power/supermatter/supermatter_hit_procs.dm +++ b/code/modules/power/supermatter/supermatter_hit_procs.dm @@ -81,7 +81,7 @@ if (!scalpel.usesLeft) to_chat(user, span_notice("A tiny piece of \the [scalpel] falls off, rendering it useless!")) else - to_chat(user, span_warning("You fail to extract a sliver from \The [src]! \the [scalpel] isn't sharp enough anymore.")) + to_chat(user, span_warning("You fail to extract a sliver from \the [src]! \The [scalpel] isn't sharp enough anymore.")) return if(istype(item, /obj/item/hemostat/supermatter)) diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index 4b103080b16e3..acdac51006542 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -22,6 +22,8 @@ var/obj/effect/overlay/tracker_dish_edge var/azimuth_current + + /obj/machinery/power/tracker/Initialize(mapload, obj/item/solar_assembly/S) . = ..() @@ -123,9 +125,7 @@ S.forceMove(src) /obj/machinery/power/tracker/crowbar_act(mob/user, obj/item/I) - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) - user.visible_message(span_notice("[user] begins to take the glass off [src]."), span_notice("You begin to take the glass off [src]...")) - if(I.use_tool(src, user, 50)) + if(I.use_tool(src, user, 0)) playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE) user.visible_message(span_notice("[user] takes the glass off [src]."), span_notice("You take the glass off [src].")) deconstruct(TRUE) @@ -138,15 +138,23 @@ unset_control() /obj/machinery/power/tracker/on_deconstruction(disassembled) + var/datum/material/material_type = /datum/material/glass if(disassembled) - var/obj/item/solar_assembly/S = locate() in src - if(S) - S.forceMove(loc) - S.give_glass(machine_stat & BROKEN) + var/obj/item/solar_assembly/assembly = locate() in src + if(assembly) + assembly.forceMove(loc) + if(machine_stat & BROKEN) + new material_type.shard_type(get_turf(src)) + new material_type.shard_type(get_turf(src)) + else + new material_type.sheet_type(get_turf(src)) + new material_type.sheet_type(get_turf(src)) else + //When smashed to bits playsound(src, SFX_SHATTER, 70, TRUE) - new /obj/item/shard(src.loc) - new /obj/item/shard(src.loc) + + new material_type.shard_type(get_turf(src)) + new material_type.shard_type(get_turf(src)) // Tracker Electronic diff --git a/code/modules/power/turbine/turbine.dm b/code/modules/power/turbine/turbine.dm index bdb91cd8d2f4d..be10a0de311fb 100644 --- a/code/modules/power/turbine/turbine.dm +++ b/code/modules/power/turbine/turbine.dm @@ -92,7 +92,7 @@ . += span_notice("Currently at tier [installed_part.current_tier].") if(installed_part.current_tier + 1 < TURBINE_PART_TIER_FOUR) . += span_notice("Can be upgraded by using a tier [installed_part.current_tier + 1] part.") - . += span_notice("The [installed_part.name] can be [EXAMINE_HINT("pried")] out.") + . += span_notice("\The [installed_part] can be [EXAMINE_HINT("pried")] out.") else . += span_warning("Is missing a [initial(part_path.name)].") . += span_notice("Its maintainence panel can be [EXAMINE_HINT("screwed")] [panel_open ? "closed" : "open"].") diff --git a/code/modules/procedural_mapping/mapGenerators/repair.dm b/code/modules/procedural_mapping/mapGenerators/repair.dm index da086773591de..e33f3e1f0cc42 100644 --- a/code/modules/procedural_mapping/mapGenerators/repair.dm +++ b/code/modules/procedural_mapping/mapGenerators/repair.dm @@ -50,8 +50,9 @@ require_area_resort() var/list/generation_turfs = block( - locate(bounds[MAP_MINX], bounds[MAP_MINY], SSmapping.station_start), - locate(bounds[MAP_MAXX], bounds[MAP_MAXY], z_offset - 1)) + bounds[MAP_MINX], bounds[MAP_MINY], SSmapping.station_start, + bounds[MAP_MAXX], bounds[MAP_MAXY], z_offset - 1 + ) for(var/turf/gen_turf as anything in generation_turfs) atoms += gen_turf for(var/atom in gen_turf) diff --git a/code/modules/projectiles/ammunition/ballistic/lmg.dm b/code/modules/projectiles/ammunition/ballistic/lmg.dm index d3d74f283c5d6..febe7bafb2f89 100644 --- a/code/modules/projectiles/ammunition/ballistic/lmg.dm +++ b/code/modules/projectiles/ammunition/ballistic/lmg.dm @@ -19,7 +19,7 @@ /obj/item/ammo_casing/m7mm/incen name = "7mm incendiary bullet casing" - desc = "A 7mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames." + desc = "A 7mm bullet casing designed with a chemical-filled capsule on the tip that when burst, reacts with the atmosphere to produce a fireball, engulfing the target in flames." projectile_type = /obj/projectile/bullet/incendiary/a7mm /obj/item/ammo_casing/m7mm/match diff --git a/code/modules/projectiles/ammunition/ballistic/rifle.dm b/code/modules/projectiles/ammunition/ballistic/rifle.dm index c85be11686118..3144064fb74db 100644 --- a/code/modules/projectiles/ammunition/ballistic/rifle.dm +++ b/code/modules/projectiles/ammunition/ballistic/rifle.dm @@ -2,7 +2,7 @@ /obj/item/ammo_casing/strilka310 name = ".310 Strilka bullet casing" - desc = "A .310 Strilka bullet casing. Casing is a bit of a fib, there is no case, its just a block of red powder." + desc = "A .310 Strilka bullet casing. Casing is a bit of a fib, there is no case, it's just a block of red powder." icon_state = "310-casing" caliber = CALIBER_STRILKA310 projectile_type = /obj/projectile/bullet/strilka310 @@ -14,7 +14,7 @@ /obj/item/ammo_casing/strilka310/surplus name = ".310 Strilka surplus bullet casing" - desc = "A surplus .310 Strilka bullet casing. Casing is a bit of a fib, there is no case, its just a block of red powder. Damp red powder at that." + desc = "A surplus .310 Strilka bullet casing. Casing is a bit of a fib, there is no case, it's just a block of red powder. Damp red powder at that." projectile_type = /obj/projectile/bullet/strilka310/surplus /obj/item/ammo_casing/strilka310/enchanted @@ -22,7 +22,7 @@ /obj/item/ammo_casing/strilka310/phasic name = ".310 Strilka phasic bullet casing" - desc = "A phasic .310 Strika bullet casing. " + desc = "A phasic .310 Strilka bullet casing. " projectile_type = /obj/projectile/bullet/strilka310/phasic // .223 (M-90gl Carbine) @@ -66,7 +66,7 @@ /obj/item/ammo_casing/rebar/syndie name = "Jagged Iron Rod" - desc = "An Iron rod, with notches cut into it. You really dont want this stuck in you." + desc = "An Iron rod, with notches cut into it. You really don't want this stuck in you." caliber = CALIBER_REBAR icon_state = "rod_jagged" base_icon_state = "rod_jagged" diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm index 897e695fd4eb7..caf628bc0390a 100644 --- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm +++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm @@ -10,6 +10,11 @@ projectile_type = /obj/projectile/bullet/shotgun_slug newtonian_force = 1.25 +/obj/item/ammo_casing/shotgun/milspec + name = "shotgun milspec slug" + desc = "A 12 gauge milspec lead slug." + projectile_type = /obj/projectile/bullet/shotgun_slug/milspec + /obj/item/ammo_casing/shotgun/executioner name = "executioner slug" desc = "A 12 gauge lead slug purpose built to annihilate flesh on impact." @@ -45,8 +50,9 @@ desc = "A shotgun shell which fires a spread of incendiary pellets." icon_state = "ishell2" projectile_type = /obj/projectile/bullet/incendiary/shotgun/dragonsbreath - pellets = 4 - variance = 35 + pellets = 6 + variance = 15 + randomspread = TRUE /obj/item/ammo_casing/shotgun/stunslug name = "taser slug" @@ -81,7 +87,8 @@ icon_state = "gshell" projectile_type = /obj/projectile/bullet/pellet/shotgun_buckshot pellets = 6 - variance = 25 + variance = 15 + randomspread = TRUE /obj/item/ammo_casing/shotgun/buckshot/old projectile_type = /obj/projectile/bullet/pellet/shotgun_buckshot/old @@ -97,6 +104,11 @@ var/datum/effect_system/fluid_spread/smoke/smoke = new smoke.set_up(0, holder = fired_from, location = fired_from) +/obj/item/ammo_casing/shotgun/buckshot/milspec + name = "milspec buckshot shell" + desc = "A 12 gauge buckshot shell, used by various paramilitaries and mercernary forces." + projectile_type = /obj/projectile/bullet/pellet/shotgun_buckshot/milspec + /obj/item/ammo_casing/shotgun/buckshot/spent projectile_type = null @@ -106,7 +118,8 @@ icon_state = "rshell" projectile_type = /obj/projectile/bullet/pellet/shotgun_rubbershot pellets = 6 - variance = 20 + variance = 15 + randomspread = TRUE custom_materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*2) /obj/item/ammo_casing/shotgun/incapacitate @@ -125,7 +138,8 @@ projectile_type = /obj/projectile/bullet/pellet/flechette custom_materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*2, /datum/material/glass=SMALL_MATERIAL_AMOUNT*1) pellets = 6 - variance = 20 + variance = 10 + randomspread = TRUE /obj/item/ammo_casing/shotgun/ion name = "ion shell" @@ -134,7 +148,8 @@ icon_state = "ionshell" projectile_type = /obj/projectile/ion/weak pellets = 4 - variance = 35 + variance = 15 + randomspread = TRUE /obj/item/ammo_casing/shotgun/scatterlaser name = "scatter laser shell" @@ -142,7 +157,8 @@ icon_state = "lshell" projectile_type = /obj/projectile/beam/scatter pellets = 6 - variance = 35 + variance = 15 + randomspread = TRUE /obj/item/ammo_casing/shotgun/scatterlaser/emp_act(severity) . = ..() diff --git a/code/modules/projectiles/boxes_magazines/external/shotgun.dm b/code/modules/projectiles/boxes_magazines/external/shotgun.dm index 469c7590f998b..e27a86c091aa6 100644 --- a/code/modules/projectiles/boxes_magazines/external/shotgun.dm +++ b/code/modules/projectiles/boxes_magazines/external/shotgun.dm @@ -1,9 +1,9 @@ /obj/item/ammo_box/magazine/m12g - name = "shotgun magazine (12g buckshot slugs)" + name = "shotgun magazine (12g buckshot shells)" desc = "A drum magazine of shotgun shells, suitable for the Bulldog combat shotgun." icon_state = "m12gb" base_icon_state = "m12gb" - ammo_type = /obj/item/ammo_casing/shotgun/buckshot + ammo_type = /obj/item/ammo_casing/shotgun/buckshot/milspec caliber = CALIBER_SHOTGUN max_ammo = 8 casing_phrasing = "shell" @@ -22,7 +22,7 @@ name = "shotgun magazine (12g slugs)" icon_state = "m12gsl" base_icon_state = "m12gsl" - ammo_type = /obj/item/ammo_casing/shotgun + ammo_type = /obj/item/ammo_casing/shotgun/milspec /obj/item/ammo_box/magazine/m12g/dragon name = "shotgun magazine (12g dragon's breath)" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index abaf7883cb888..38b4cd8ce25f1 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -317,6 +317,10 @@ return if(firing_burst) return + + if(SEND_SIGNAL(user, COMSIG_MOB_TRYING_TO_FIRE_GUN, src, target, flag, params) & COMPONENT_CANCEL_GUN_FIRE) + return + if(SEND_SIGNAL(src, COMSIG_GUN_TRY_FIRE, user, target, flag, params) & COMPONENT_CANCEL_GUN_FIRE) return if(flag) //It's adjacent, is the user, or is on the user's person diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 6f865171580b2..a5bb311c9c539 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -452,10 +452,6 @@ if (sawoff(user, A)) return - if(misfire_probability && istype(A, /obj/item/stack/sheet/cloth)) - if(guncleaning(user, A)) - return - return FALSE /obj/item/gun/ballistic/proc/check_if_held(mob/user) @@ -685,19 +681,6 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list( update_appearance() return TRUE -/obj/item/gun/ballistic/proc/guncleaning(mob/user, obj/item/A) - if(misfire_probability == initial(misfire_probability)) - balloon_alert(user, "it's already clean!") - return - - user.changeNext_move(CLICK_CD_MELEE) - balloon_alert(user, "cleaning...") - - if(do_after(user, 10 SECONDS, target = src)) - misfire_probability = initial(misfire_probability) - balloon_alert(user, "fouling cleaned out") - return TRUE - /obj/item/gun/ballistic/wrench_act(mob/living/user, obj/item/I) if(!can_modify_ammo) return diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 57adddc62c7b2..7ecfc26669510 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -419,7 +419,7 @@ /obj/item/gun/ballistic/automatic/battle_rifle/examine_more(mob/user) . = ..() - . += span_notice("Looking down at the [name], you recall something you read in a promotional pamphlet... ") + . += span_notice("Looking down at \the [src], you recall something you read in a promotional pamphlet... ") . += span_info("The BR-38 possesses an acceleration rail that launches bullets at higher than typical velocity.\ This allows even less powerful cartridges to put out significant amounts of stopping power.") diff --git a/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm b/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm index 4fc28dd789178..85a40e7501c34 100644 --- a/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm +++ b/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm @@ -125,7 +125,7 @@ name = "plastic arrow" desc = "The earliest mining teams within the Spinward Sector were the somewhat stout ancestors of the modern settlers. These teams \ found themselves often unable to access the quality materials they were digging up for equipment maintenance, all being sent off-site. \ - Left with few options, and in need of a way to protect themselves in the hostile work enviroments of the Spinward, they turned \ + Left with few options, and in need of a way to protect themselves in the hostile work environments of the Spinward, they turned \ to the one material they had in abundance." icon_state = "plastic_arrow" base_icon_state = "plastic_arrow" diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index c65cc51e9a8ce..2c41389c2305a 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -77,17 +77,16 @@ update_appearance() /obj/item/gun/ballistic/rifle/boltaction/attack_self(mob/user) - if(can_jam) - if(jammed) - if(prob(unjam_chance)) - jammed = FALSE - unjam_chance = 10 - else - unjam_chance += 10 - balloon_alert(user, "jammed!") - playsound(user,'sound/items/weapons/jammed.ogg', 75, TRUE) - return FALSE - ..() + if(jammed) + if(prob(unjam_chance)) + jammed = FALSE + unjam_chance = initial(unjam_chance) + else + unjam_chance += 10 + balloon_alert(user, "jammed!") + playsound(user,'sound/items/weapons/jammed.ogg', 75, TRUE) + return FALSE + return ..() /obj/item/gun/ballistic/rifle/boltaction/process_fire(mob/user) if(can_jam) @@ -105,15 +104,6 @@ . = ..() - if(istype(item, /obj/item/gun_maintenance_supplies)) - if(!can_jam) - balloon_alert(user, "can't jam!") - return - if(do_after(user, 10 SECONDS, target = src)) - user.visible_message(span_notice("[user] finishes maintaining [src].")) - jamming_chance = initial(jamming_chance) - qdel(item) - /obj/item/gun/ballistic/rifle/boltaction/blow_up(mob/user) . = FALSE if(chambered?.loaded_projectile) @@ -319,7 +309,7 @@ /obj/item/gun/ballistic/rifle/boltaction/pipegun/examine_more(mob/user) . = ..() - . += span_notice("Looking down at the [name], you recall a tale told to you in some distant memory...") + . += span_notice("Looking down at \the [src], you recall a tale told to you in some distant memory...") . += span_info("It's said that the first slaying committed on a Nanotrasen space station was by an assistant.") . += span_info("That this act, done by toolbox, maybe spear, was what consigned their kind to a life of destitution, rejection and violence.") diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index f6421ab7e1b82..7898948b7a372 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -86,7 +86,7 @@ /obj/item/gun/energy/e_gun/dragnet name = "\improper DRAGnet" - desc = "The \"Dynamic Rapid-Apprehension of the Guilty\" net is a revolution in law enforcement technology. Can by synced with a DRAGnet beacon to set a teleport destination for snare rounds." + desc = "The \"Dynamic Rapid-Apprehension of the Guilty\" net is a revolution in law enforcement technology. Can be synced with a DRAGnet beacon to set a teleport destination for snare rounds." icon_state = "dragnet" inhand_icon_state = "dragnet" lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' diff --git a/code/modules/projectiles/guns/energy/laser_gatling.dm b/code/modules/projectiles/guns/energy/laser_gatling.dm index e4375bd4832aa..eb2c74f3c73a4 100644 --- a/code/modules/projectiles/guns/energy/laser_gatling.dm +++ b/code/modules/projectiles/guns/energy/laser_gatling.dm @@ -83,9 +83,9 @@ gun.forceMove(src) armed = FALSE if(user) - to_chat(user, span_notice("You attach the [gun.name] to the [name].")) + to_chat(user, span_notice("You attach \the [gun] to \the [src].")) else - src.visible_message(span_warning("The [gun.name] snaps back onto the [name]!")) + src.visible_message(span_warning("\The [gun] snaps back onto \the [src]!")) update_appearance() user.update_worn_back() diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index 44d50188eb76b..62bda8a9a323d 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -129,7 +129,7 @@ /obj/item/gun/magic/shoot_with_empty_chamber(mob/living/user as mob|obj) - to_chat(user, span_warning("The [name] whizzles quietly.")) + to_chat(user, span_warning("\The [src] whizzles quietly.")) /obj/item/gun/magic/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is twisting [src] above [user.p_their()] head, releasing a magical blast! It looks like [user.p_theyre()] trying to commit suicide!")) diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm index e84bb9cd1f316..1c82087887ac6 100644 --- a/code/modules/projectiles/guns/magic/staff.dm +++ b/code/modules/projectiles/guns/magic/staff.dm @@ -271,7 +271,7 @@ /obj/item/gun/magic/staff/locker name = "staff of the locker" - desc = "An artefact that expells encapsulating bolts, for incapacitating thy enemy." + desc = "An artefact that expels encapsulating bolts, for incapacitating thy enemy." fire_sound = 'sound/effects/magic/staff_change.ogg' ammo_type = /obj/item/ammo_casing/magic/locker icon_state = "locker" diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index 46345e769e4bd..3ed5194c09274 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -331,7 +331,7 @@ // Explorer Firing Pin- Prevents use on station Z-Level, so it's justifiable to give Explorers guns that don't suck. /obj/item/firing_pin/explorer name = "outback firing pin" - desc = "A firing pin used by the austrailian defense force, retrofit to prevent weapon discharge on the station." + desc = "A firing pin used by the Australian defense force, retrofit to prevent weapon discharge on the station." icon_state = "firing_pin_explorer" fail_message = "cannot fire while on station, mate!" diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index 3576c9e5a12d1..0952eb0e729ff 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -1,9 +1,16 @@ /obj/projectile/bullet/shotgun_slug name = "12g shotgun slug" icon_state = "pellet" - damage = 50 + damage = 25 + armour_penetration = 30 sharpness = SHARP_POINTY wound_bonus = 0 + bare_wound_bonus = 15 + +/obj/projectile/bullet/shotgun_slug/milspec + name = "12g shotgun milspec slug" + icon_state = "pellet" + damage = 50 /obj/projectile/bullet/shotgun_slug/executioner name = "executioner slug" // admin only, can dismember limbs @@ -70,24 +77,30 @@ /obj/projectile/bullet/pellet icon_state = "pellet" - damage_falloff_tile = -0.45 + damage_falloff_tile = -0.25 /obj/projectile/bullet/pellet/shotgun_buckshot name = "buckshot pellet" - damage = 7.5 + damage = 5 wound_bonus = 5 bare_wound_bonus = 5 - wound_falloff_tile = -2.5 // low damage + additional dropoff will already curb wounding potential anything past point blank + speed = 1.1 + wound_falloff_tile = -0.5 //We would very much like this to cause wounds despite the low damage, so the drop off is relatively slow + sharpness = SHARP_EDGED /** * A slightly weaker version of the buckshot, available from the blackmarket. * The casings they're in have a very small chance to misfire and will gradually damage the firearm, making it weaker. */ /obj/projectile/bullet/pellet/shotgun_buckshot/old - damage_falloff_tile = -0.47 + damage_falloff_tile = -1 wound_bonus = -100 bare_wound_bonus = -100 +/obj/projectile/bullet/pellet/shotgun_buckshot/milspec + name = "milspec buckshot pellet" + damage = 7.5 + /obj/projectile/bullet/pellet/shotgun_rubbershot name = "rubber shot pellet" damage = 3 @@ -120,14 +133,16 @@ /obj/projectile/bullet/pellet/flechette name = "flechette" icon_state = "flechette" - damage = 6 + damage = 3 wound_bonus = -25 bare_wound_bonus = 50 + damage_falloff_tile = 0.1 wound_falloff_tile = -10 speed = 1.2 ricochet_decay_chance = 0.6 ricochet_decay_damage = 0.3 demolition_mod = 10 + sharpness = SHARP_POINTY weak_against_armour = TRUE // Mech Scattershot diff --git a/code/modules/projectiles/projectile/bullets/special.dm b/code/modules/projectiles/projectile/bullets/special.dm index cd1439cbb01ae..1c9a5e4f38214 100644 --- a/code/modules/projectiles/projectile/bullets/special.dm +++ b/code/modules/projectiles/projectile/bullets/special.dm @@ -23,7 +23,7 @@ if(M.can_block_magic()) return BULLET_ACT_BLOCK else - M.slip(100, M.loc, GALOSHES_DONT_HELP|SLIDE, 0, FALSE) + M.slip(100, M.loc, GALOSHES_DONT_HELP|SLIDE) // Mime diff --git a/code/modules/reagents/chemistry/holder/holder.dm b/code/modules/reagents/chemistry/holder/holder.dm index be74e5cfb85bb..3815494afa003 100644 --- a/code/modules/reagents/chemistry/holder/holder.dm +++ b/code/modules/reagents/chemistry/holder/holder.dm @@ -104,9 +104,6 @@ stack_trace("non finite amount passed to add reagent [amount] [reagent_type]") return FALSE - if(SEND_SIGNAL(src, COMSIG_REAGENTS_PRE_ADD_REAGENT, reagent_type, amount, reagtemp, data, no_react) & COMPONENT_CANCEL_REAGENT_ADD) - return FALSE - var/datum/reagent/glob_reagent = GLOB.chemical_reagents_list[reagent_type] if(!glob_reagent) stack_trace("[my_atom] attempted to add a reagent called '[reagent_type]' which doesn't exist. ([usr])") @@ -164,11 +161,13 @@ else set_temperature(reagtemp) - SEND_SIGNAL(src, COMSIG_REAGENTS_ADD_REAGENT, iter_reagent, amount, reagtemp, data, no_react) if(!no_react && !is_reacting) //To reduce the amount of calculations for a reaction the reaction list is only updated on a reagents addition. handle_reactions() return amount + if(!is_reacting && amount < CHEMICAL_VOLUME_ROUNDING) + return 0 + //otherwise make a new one var/datum/reagent/new_reagent = new reagent_type(data) cached_reagents += new_reagent @@ -193,7 +192,6 @@ else set_temperature(reagtemp) - SEND_SIGNAL(src, COMSIG_REAGENTS_NEW_REAGENT, new_reagent, amount, reagtemp, data, no_react) if(!no_react) handle_reactions() return amount @@ -236,7 +234,6 @@ var/total_removed_amount = 0 var/remove_amount = 0 var/list/cached_reagents = reagent_list - var/list/removed_reagents = list() for(var/datum/reagent/cached_reagent as anything in cached_reagents) //check for specific type or subtypes if(!include_subtypes) @@ -249,8 +246,6 @@ remove_amount = min(cached_reagent.volume, amount) cached_reagent.volume -= remove_amount - //record the changes - removed_reagents[cached_reagent] = remove_amount total_removed_amount += remove_amount //if we reached here means we have found our specific reagent type so break @@ -262,10 +257,6 @@ if(!safety) handle_reactions() - //inform others about our reagents being removed - for(var/datum/reagent/removed_reagent as anything in removed_reagents) - SEND_SIGNAL(src, COMSIG_REAGENTS_REM_REAGENT, removed_reagent, removed_reagents[removed_reagent]) - return total_removed_amount /** @@ -290,20 +281,28 @@ stack_trace("illegal percentage value passed to remove all reagents [amount]") return FALSE + if(!relative) + amount = min(amount, total_volume) amount = round(amount, CHEMICAL_QUANTISATION_LEVEL) if(amount <= 0) return FALSE var/list/cached_reagents = reagent_list + var/remove_amount var/total_removed_amount = 0 var/part = amount if(!relative) part /= total_volume - for(var/datum/reagent/reagent as anything in cached_reagents) - total_removed_amount += remove_reagent(reagent.type, reagent.volume * part) + for(var/datum/reagent/cached_reagent as anything in cached_reagents) + //reduce the volume + remove_amount = cached_reagent.volume * part + cached_reagent.volume -= remove_amount + + total_removed_amount += remove_amount + update_total() handle_reactions() - return round(total_removed_amount, CHEMICAL_VOLUME_ROUNDING) + return round(total_removed_amount, CHEMICAL_QUANTISATION_LEVEL) /** * Removes an specific reagent from this holder @@ -389,8 +388,6 @@ reagent.volume = 0 update_total() - SEND_SIGNAL(src, COMSIG_REAGENTS_CLEAR_REAGENTS) - /** * Transfer some stuff from this holder to a target object * @@ -531,7 +528,7 @@ target_holder.handle_reactions() src.handle_reactions() - return round(total_transfered_amount, CHEMICAL_VOLUME_ROUNDING) + return total_transfered_amount /** * Copies the reagents to the target object @@ -686,10 +683,11 @@ else ph = clamp(total_ph / total_volume, CHEMICAL_MIN_PH, CHEMICAL_MAX_PH) - //now send the signals after the volume & ph has been computed - for(var/datum/reagent/deleted_reagent as anything in deleted_reagents) - SEND_SIGNAL(src, COMSIG_REAGENTS_DEL_REAGENT, deleted_reagent) - qdel(deleted_reagent) + //clear out deleted reagents + QDEL_LIST(deleted_reagents) + + //inform hooks about reagent changes + SEND_SIGNAL(src, COMSIG_REAGENTS_HOLDER_UPDATED) /** * Shallow copies (deep copy of viruses) data from the provided reagent into our copy of that reagent diff --git a/code/modules/reagents/chemistry/holder/properties.dm b/code/modules/reagents/chemistry/holder/properties.dm index a68404c9fc7a4..1ea16253e8906 100644 --- a/code/modules/reagents/chemistry/holder/properties.dm +++ b/code/modules/reagents/chemistry/holder/properties.dm @@ -34,7 +34,7 @@ if(type_check == REAGENT_STRICT_TYPE) return total_amount - return round(total_amount, CHEMICAL_VOLUME_ROUNDING) + return total_amount //======================PH(clamped between 0->14)======================================== diff --git a/code/modules/reagents/chemistry/holder/reactions.dm b/code/modules/reagents/chemistry/holder/reactions.dm index 10c34864dd90c..b2ec4cd309c61 100644 --- a/code/modules/reagents/chemistry/holder/reactions.dm +++ b/code/modules/reagents/chemistry/holder/reactions.dm @@ -120,9 +120,6 @@ else is_reacting = FALSE - if(.) - SEND_SIGNAL(src, COMSIG_REAGENTS_REACTED, .) - TEST_ONLY_ASSERT(!. || MC_RUNNING(), "We reacted during subsystem init, that shouldn't be happening!") /** @@ -218,7 +215,7 @@ playsound(get_turf(my_atom), equilibrium.reaction.mix_sound, 80, TRUE) qdel(equilibrium) update_total() - SEND_SIGNAL(src, COMSIG_REAGENTS_REACTED, .) + return reaction_message /* diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index dd4e0dff62624..723230bc79435 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -163,7 +163,7 @@ update_appearance() return FALSE beaker = new_beaker - RegisterSignal(beaker.reagents, COMSIG_REAGENTS_REACTION_STEP, TYPE_PROC_REF(/obj/machinery/chem_heater, on_reaction_step)) + RegisterSignal(beaker.reagents, COMSIG_REAGENTS_REACTION_STEP, PROC_REF(on_reaction_step)) update_appearance() @@ -228,7 +228,7 @@ beaker_data = list() beaker_data["maxVolume"] = beaker.volume beaker_data["pH"] = round(beaker.reagents.ph, 0.01) - beaker_data["currentVolume"] = round(beaker.reagents.total_volume, CHEMICAL_VOLUME_ROUNDING) + beaker_data["currentVolume"] = beaker.reagents.total_volume var/list/beakerContents = list() if(length(beaker.reagents.reagent_list)) for(var/datum/reagent/reagent in beaker.reagents.reagent_list) diff --git a/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm b/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm index 2e6a916f98473..b868d2423ea46 100644 --- a/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm +++ b/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm @@ -1,6 +1,6 @@ /obj/machinery/chem_mass_spec name = "High-performance liquid chromatography machine" - desc = "Allows you to purify reagents & seperate out inverse reagents" + desc = "Allows you to purify reagents & separate out inverse reagents" icon = 'icons/obj/medical/chemical.dmi' icon_state = "HPLC" base_icon_state = "HPLC" diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 8a6561e5a1090..58bdb59ce63af 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -294,7 +294,7 @@ if(!QDELETED(beaker)) beaker_data = list() beaker_data["maxVolume"] = beaker.volume - beaker_data["currentVolume"] = round(beaker.reagents.total_volume, CHEMICAL_VOLUME_ROUNDING) + beaker_data["currentVolume"] = beaker.reagents.total_volume var/list/beakerContents = list() if(length(beaker.reagents.reagent_list)) for(var/datum/reagent/reagent as anything in beaker.reagents.reagent_list) @@ -316,7 +316,7 @@ //contents of buffer beaker_data = list() beaker_data["maxVolume"] = reagents.maximum_volume - beaker_data["currentVolume"] = round(reagents.total_volume, CHEMICAL_VOLUME_ROUNDING) + beaker_data["currentVolume"] = reagents.total_volume var/list/beakerContents = list() if(length(reagents.reagent_list)) for(var/datum/reagent/reagent as anything in reagents.reagent_list) @@ -416,7 +416,7 @@ if(amount == -1) // Set custom amount var/mob/user = ui.user //Hold a reference of the user if the UI is closed - amount = FLOOR(tgui_input_number(user, "Enter amount to transfer", "Transfer amount", round_value = FALSE), CHEMICAL_VOLUME_ROUNDING) + amount = round(tgui_input_number(user, "Enter amount to transfer", "Transfer amount", round_value = FALSE), CHEMICAL_VOLUME_ROUNDING) if(!amount || !user.can_perform_action(src)) return FALSE diff --git a/code/modules/reagents/chemistry/machinery/chem_recipe_debug.dm b/code/modules/reagents/chemistry/machinery/chem_recipe_debug.dm index 3cf570250d648..3dfb3c6e4f592 100644 --- a/code/modules/reagents/chemistry/machinery/chem_recipe_debug.dm +++ b/code/modules/reagents/chemistry/machinery/chem_recipe_debug.dm @@ -72,7 +72,7 @@ create_reagents(MAXIMUM_HOLDER_VOLUME) target_reagents = reagents - RegisterSignal(reagents, COMSIG_REAGENTS_REACTION_STEP, TYPE_PROC_REF(/obj/machinery/chem_recipe_debug, on_reaction_step)) + RegisterSignal(reagents, COMSIG_REAGENTS_REACTION_STEP, PROC_REF(on_reaction_step)) register_context() if(isnull(all_reaction_list)) @@ -337,7 +337,7 @@ beaker_data = list() beaker_data["maxVolume"] = target_reagents.maximum_volume beaker_data["pH"] = round(target_reagents.ph, 0.01) - beaker_data["currentVolume"] = round(target_reagents.total_volume, CHEMICAL_VOLUME_ROUNDING) + beaker_data["currentVolume"] = target_reagents.total_volume beaker_data["currentTemp"] = round(target_reagents.chem_temp, 1) beaker_data["purity"] = round(target_reagents.get_average_purity(), 0.001) var/list/beakerContents = list() @@ -449,7 +449,7 @@ return TRUE if("pick_reaction") - var/mode = tgui_alert(usr, "Play all or an specific reaction?","Select Reaction", list("All", "Specific")) + var/mode = tgui_alert(usr, "Play all or a specific reaction?","Select Reaction", list("All", "Specific")) if(mode == "All") reactions_to_test.Cut() for(var/reaction as anything in all_reaction_list) @@ -529,7 +529,7 @@ required_container = new test_reaction.required_container(src) required_container.create_reagents(MAXIMUM_HOLDER_VOLUME) target_reagents = required_container.reagents - RegisterSignal(target_reagents, COMSIG_REAGENTS_REACTION_STEP, TYPE_PROC_REF(/obj/machinery/chem_recipe_debug, on_reaction_step)) + RegisterSignal(target_reagents, COMSIG_REAGENTS_REACTION_STEP, PROC_REF(on_reaction_step)) //append everything required var/list/reagent_list = list() diff --git a/code/modules/reagents/chemistry/machinery/chem_separator.dm b/code/modules/reagents/chemistry/machinery/chem_separator.dm index ac964b9f99402..000d221f92d5a 100644 --- a/code/modules/reagents/chemistry/machinery/chem_separator.dm +++ b/code/modules/reagents/chemistry/machinery/chem_separator.dm @@ -115,7 +115,7 @@ if(burner_on) . += span_notice("Off burner with [EXAMINE_HINT("ALT LMB")].") else - . += span_notice("You can start a flame with an combustible device.") + . += span_notice("You can start a flame with a combustible device.") if(condenser_installed) . += span_notice("The in-built condenser can facilitate faster cooling but consumes fuel.") diff --git a/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm b/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm index 8071887f85260..b9642f19c12e1 100644 --- a/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm +++ b/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm @@ -182,7 +182,7 @@ beaker_data["maxVolume"] = beaker.volume beaker_data["transferAmounts"] = beaker.possible_transfer_amounts beaker_data["pH"] = round(beaker.reagents.ph, 0.01) - beaker_data["currentVolume"] = round(beaker.reagents.total_volume, CHEMICAL_VOLUME_ROUNDING) + beaker_data["currentVolume"] = beaker.reagents.total_volume var/list/beakerContents = list() if(length(beaker.reagents.reagent_list)) for(var/datum/reagent/reagent in beaker.reagents.reagent_list) @@ -205,7 +205,7 @@ if(isnull(target)) return - amount = target + amount = round(target, CHEMICAL_VOLUME_ROUNDING) return TRUE if("dispense") diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index a6938f5dcf5ca..6b8b50807fcfe 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -453,7 +453,7 @@ total_weight += item_weight //use power according to the total weight of items grinded - use_energy((active_power_usage * (duration / 1 SECONDS)) * (total_weight / maximum_weight)) + use_energy((active_power_usage * (duration / (1 SECONDS))) * (total_weight / maximum_weight)) addtimer(CALLBACK(src, PROC_REF(stop_operating)), duration) @@ -513,6 +513,6 @@ beaker.reagents.convert_reagent(/datum/reagent/consumable/cream, /datum/reagent/consumable/whipped_cream) //power consumed based on the ratio of total reagents mixed - use_energy((active_power_usage * (duration / 1 SECONDS)) * (beaker.reagents.total_volume / beaker.reagents.maximum_volume)) + use_energy((active_power_usage * (duration / (1 SECONDS))) * (beaker.reagents.total_volume / beaker.reagents.maximum_volume)) operating = FALSE diff --git a/code/modules/reagents/chemistry/machinery/smoke_machine.dm b/code/modules/reagents/chemistry/machinery/smoke_machine.dm index 6f58fb9019307..53c8ca490566c 100644 --- a/code/modules/reagents/chemistry/machinery/smoke_machine.dm +++ b/code/modules/reagents/chemistry/machinery/smoke_machine.dm @@ -181,7 +181,7 @@ var/list/tank_data = list() tank_data["maxVolume"] = reagents.maximum_volume - tank_data["currentVolume"] = round(reagents.total_volume, CHEMICAL_VOLUME_ROUNDING) + tank_data["currentVolume"] = reagents.total_volume var/list/tankContents = list() for(var/datum/reagent/reagent in reagents.reagent_list) tankContents += list(list("name" = reagent.name, "volume" = round(reagent.volume, CHEMICAL_VOLUME_ROUNDING))) diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm index 31f7751065e0c..e49608545e27c 100644 --- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm @@ -13,7 +13,7 @@ /datum/reagent/medicine/c2/helbital //kinda a C2 only if you're not in hardcrit. name = "Helbital" - description = "Named after the norse goddess Hel, this medicine heals the patient's bruises the closer they are to death. Patients will find the medicine 'aids' their healing if not near death by causing asphyxiation." + description = "Named after the Norse goddess Hel, this medicine heals the patient's bruises the closer they are to death. Patients will find the medicine 'aids' their healing if not near death by causing asphyxiation." color = "#9400D3" taste_description = "cold and lifeless" ph = 8 @@ -45,7 +45,7 @@ if(need_mob_update) . = UPDATE_MOB_HEALTH - if(good_kind_of_healing && !reaping && SPT_PROB(0.00005, seconds_per_tick)) //janken with the grim reaper! + if(good_kind_of_healing && !reaping && SPT_PROB(0.005, seconds_per_tick)) //janken with the grim reaper! notify_ghosts( "[affected_mob] has entered a game of rock-paper-scissors with death!", source = affected_mob, @@ -117,7 +117,7 @@ /datum/reagent/medicine/c2/probital name = "Probital" - description = "Originally developed as a prototype-gym supliment for those looking for quick workout turnover, this oral medication quickly repairs broken muscle tissue but causes lactic acid buildup, tiring the patient. Overdosing can cause extreme drowsiness. An Influx of nutrients promotes the muscle repair even further." + description = "Originally developed as a prototype gym supplement for those looking for quick workout turnover, this oral medication quickly repairs broken muscle tissue but causes lactic acid buildup, tiring the patient. Overdosing can cause extreme drowsiness. An influx of nutrients promotes the muscle repair even further." color = "#FFFF6B" ph = 5.5 overdose_threshold = 20 diff --git a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm index f928115147604..b425f24f7d4c1 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm @@ -614,19 +614,21 @@ // We want to turn only base drinking glasses with screwdriver(cocktail) into screwdrivers(tool), // but we can't check style so we have to check type, and we don't want it match subtypes like istype does if(holder?.my_atom && holder.my_atom.type == /obj/item/reagent_containers/cup/glass/drinkingglass/) - var/list/reagent_change_signals = list( - COMSIG_REAGENTS_ADD_REAGENT, - COMSIG_REAGENTS_NEW_REAGENT, - COMSIG_REAGENTS_REM_REAGENT, - ) - RegisterSignals(holder, reagent_change_signals, PROC_REF(on_reagent_change)) - RegisterSignal(holder, COMSIG_REAGENTS_CLEAR_REAGENTS, PROC_REF(on_reagents_clear)) - RegisterSignal(holder, COMSIG_REAGENTS_DEL_REAGENT, PROC_REF(on_reagent_delete)) + RegisterSignal(holder, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(on_reagent_change)) if(src == holder.get_master_reagent()) var/obj/item/reagent_containers/cup/glass/drinkingglass/drink = holder.my_atom drink.tool_behaviour = TOOL_SCREWDRIVER drink.usesound = list('sound/items/tools/screwdriver.ogg', 'sound/items/tools/screwdriver2.ogg') +/datum/reagent/consumable/ethanol/screwdrivercocktail/Destroy() + var/obj/item/reagent_containers/cup/glass/drinkingglass/drink = holder.my_atom + if(istype(drink)) + if(drink.tool_behaviour == TOOL_SCREWDRIVER) + drink.tool_behaviour = initial(drink.tool_behaviour) + drink.usesound = initial(drink.usesound) + UnregisterSignal(holder, COMSIG_REAGENTS_HOLDER_UPDATED) + return ..() + /datum/reagent/consumable/ethanol/screwdrivercocktail/proc/on_reagent_change(datum/reagents/reagents) SIGNAL_HANDLER var/obj/item/reagent_containers/cup/glass/drinkingglass/drink = reagents.my_atom @@ -637,29 +639,6 @@ drink.tool_behaviour = initial(drink.tool_behaviour) drink.usesound = initial(drink.usesound) -/datum/reagent/consumable/ethanol/screwdrivercocktail/proc/on_reagents_clear(datum/reagents/reagents) - SIGNAL_HANDLER - unregister_screwdriver(reagents) - -/datum/reagent/consumable/ethanol/screwdrivercocktail/proc/on_reagent_delete(datum/reagents/reagents, datum/reagent/deleted_reagent) - SIGNAL_HANDLER - if(deleted_reagent != src) - return - unregister_screwdriver(reagents) - -/datum/reagent/consumable/ethanol/screwdrivercocktail/proc/unregister_screwdriver(datum/reagents/reagents) - var/obj/item/reagent_containers/cup/glass/drinkingglass/drink = reagents.my_atom - if(drink.tool_behaviour == TOOL_SCREWDRIVER) - drink.tool_behaviour = initial(drink.tool_behaviour) - drink.usesound = initial(drink.usesound) - UnregisterSignal(reagents, list( - COMSIG_REAGENTS_ADD_REAGENT, - COMSIG_REAGENTS_NEW_REAGENT, - COMSIG_REAGENTS_REM_REAGENT, - COMSIG_REAGENTS_DEL_REAGENT, - COMSIG_REAGENTS_CLEAR_REAGENTS, - )) - /datum/reagent/consumable/ethanol/screwdrivercocktail/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) . = ..() var/obj/item/organ/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) @@ -1916,7 +1895,7 @@ /datum/reagent/consumable/ethanol/fanciulli name = "Fanciulli" - description = "What if the Manhattan cocktail ACTUALLY used a bitter herb liquour? Helps you sober up." //also causes a bit of stamina damage to symbolize the afterdrink lazyness + description = "What if the Manhattan cocktail ACTUALLY used a bitter herb liqueur? Helps you sober up." //also causes a bit of stamina damage to symbolize the afterdrink lazyness color = "#CA933F" // rgb: 202, 147, 63 boozepwr = -10 quality = DRINK_NICE @@ -1936,7 +1915,7 @@ /datum/reagent/consumable/ethanol/branca_menta name = "Branca Menta" - description = "A refreshing mixture of bitter Fernet with mint creme liquour." + description = "A refreshing mixture of bitter Fernet with mint creme liqueur." color = "#4B5746" // rgb: 75, 87, 70 boozepwr = 35 quality = DRINK_GOOD @@ -2193,7 +2172,7 @@ color = "#ffe65b" boozepwr = 60 quality = DRINK_GOOD - taste_description = "artifical fruityness" + taste_description = "artificial fruitiness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED metabolized_traits = list(TRAIT_SHOCKIMMUNE) @@ -2655,7 +2634,7 @@ var/mob/living/carbon/exposed_carbon = exposed_mob var/obj/item/organ/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) if(istype(stomach)) - stomach.adjust_charge(reac_volume * ETHEREAL_DISCHARGE_RATE) + stomach.adjust_charge(reac_volume * 5 * ETHEREAL_DISCHARGE_RATE) /datum/reagent/consumable/ethanol/telepole name = "Telepole" @@ -2675,7 +2654,7 @@ var/mob/living/carbon/exposed_carbon = exposed_mob var/obj/item/organ/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) if(istype(stomach)) - stomach.adjust_charge(reac_volume * 8 * ETHEREAL_DISCHARGE_RATE) + stomach.adjust_charge(reac_volume * 10 * ETHEREAL_DISCHARGE_RATE) /datum/reagent/consumable/ethanol/pod_tesla name = "Pod Tesla" diff --git a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm index 5fbd396169365..79dc6d79bda35 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm @@ -1073,7 +1073,7 @@ affected_mob.update_transform(newsize/current_size) current_size = newsize if(SPT_PROB(23, seconds_per_tick)) - affected_mob.sneeze() + affected_mob.emote("sneeze") /datum/reagent/consumable/red_queen/on_mob_end_metabolize(mob/living/affected_mob) . = ..() diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_alcohol.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_alcohol.dm index ee741191771d7..87e75346f8435 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_alcohol.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_alcohol.dm @@ -636,7 +636,7 @@ /datum/glass_style/drinking_glass/applejack required_drink_type = /datum/reagent/consumable/ethanol/applejack name = "Applejack" - desc = "You feel like you could drink this all neight." + desc = "You feel like you could drink this all neigh-t." icon_state = "applejack_glass" /datum/glass_style/drinking_glass/jack_rose @@ -732,7 +732,7 @@ /datum/glass_style/drinking_glass/godfather required_drink_type = /datum/reagent/consumable/ethanol/godfather name = "Godfather" - desc = "A classic from old Italy and enjoyed by gangsters, pray the orange peel doesnt end up in your mouth." + desc = "A classic from old Italy and enjoyed by gangsters, pray the orange peel doesn't end up in your mouth." icon = 'icons/obj/drinks/mixed_drinks.dmi' icon_state = "godfather" diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 221bf1044f4e8..175405211e7f4 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -272,7 +272,7 @@ /datum/reagent/drug/happiness name = "Happiness" - description = "Fills you with ecstasic numbness and causes minor brain damage. Highly addictive. If overdosed causes sudden mood swings." + description = "Fills you with ecstatic numbness and causes minor brain damage. Highly addictive. If overdosed causes sudden mood swings." color = "#EE35FF" overdose_threshold = 20 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -540,7 +540,7 @@ /datum/reagent/drug/blastoff name = "bLaStOoF" - description = "A drug for the hardcore party crowd said to enhance ones abilities on the dance floor.\nMost old heads refuse to touch this stuff, perhaps because memories of the luna discoteque incident are seared into their brains." + description = "A drug for the hardcore party crowd said to enhance one's abilities on the dance floor.\nMost old heads refuse to touch this stuff, perhaps because memories of the luna discotheque incident are seared into their brains." color = "#9015a9" taste_description = "holodisk cleaner" ph = 5 @@ -780,17 +780,10 @@ if(!istype(holder?.my_atom, /obj/item/food)) return ADD_TRAIT(holder.my_atom, TRAIT_GREAT_QUALITY_BAIT, type) - RegisterSignal(holder, COMSIG_REAGENTS_CLEAR_REAGENTS, PROC_REF(on_reagents_clear)) - RegisterSignal(holder, COMSIG_REAGENTS_DEL_REAGENT, PROC_REF(on_reagent_delete)) -/datum/reagent/drug/kronkaine/proc/on_reagents_clear(datum/reagents/reagents) - SIGNAL_HANDLER +/datum/reagent/drug/kronkaine/Destroy() REMOVE_TRAIT(holder.my_atom, TRAIT_GREAT_QUALITY_BAIT, type) - -/datum/reagent/drug/kronkaine/proc/on_reagent_delete(datum/reagents/reagents, datum/reagent/deleted_reagent) - SIGNAL_HANDLER - if(deleted_reagent == src) - REMOVE_TRAIT(holder.my_atom, TRAIT_GREAT_QUALITY_BAIT, type) + return ..() /datum/reagent/drug/kronkaine/on_mob_metabolize(mob/living/kronkaine_fiend) . = ..() diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index c9169aaafd258..ad065200ff881 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -143,7 +143,7 @@ /// The basic resource of vat growing. /datum/reagent/consumable/nutriment/protein name = "Protein" - description = "A natural polyamide made up of amino acids. An essential constituent of mosts known forms of life." + description = "A natural polyamide made up of amino acids. An essential constituent of most known forms of life." taste_description = "chalk" brute_heal = 0.8 //Rewards the player for eating a balanced diet. nutriment_factor = 9 //45% as calorie dense as oil. @@ -885,7 +885,7 @@ /datum/reagent/consumable/nutriment/stabilized name = "Stabilized Nutriment" - description = "A bioengineered protien-nutrient structure designed to decompose in high saturation. In layman's terms, it won't get you fat." + description = "A bioengineered protein-nutrient structure designed to decompose in high saturation. In layman's terms, it won't get you fat." nutriment_factor = 15 color = "#664330" // rgb: 102, 67, 48 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -995,7 +995,7 @@ /datum/reagent/consumable/astrotame name = "Astrotame" - description = "A space age artifical sweetener." + description = "A space age artificial sweetener." nutriment_factor = 0 metabolization_rate = 2 * REAGENTS_METABOLISM color = COLOR_WHITE // rgb: 255, 255, 255 @@ -1131,7 +1131,7 @@ /datum/reagent/consumable/korta_flour name = "Korta Flour" - description = "A coarsely ground, peppery flour made from korta nut shells." + description = "A coarsely-ground, peppery flour made from korta nut shells." taste_description = "earthy heat" color = "#EEC39A" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents.dm index 0f4642509771d..91c49834a6d4d 100644 --- a/code/modules/reagents/chemistry/reagents/impure_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/impure_reagents.dm @@ -1,11 +1,11 @@ -//Reagents produced by metabolising/reacting fermichems inoptimally, i.e. inverse_chems or impure_chems +//Reagents produced by metabolising/reacting fermichems suboptimally, i.e. inverse_chems or impure_chems //Inverse = Splitting //Invert = Whole conversion //Causes slight liver damage, and that's it. /datum/reagent/impurity name = "Chemical Isomers" - description = "Impure chemical isomers made from inoptimal reactions. Causes mild liver damage" + description = "Impure chemical isomers made from suboptimal reactions. Causes mild liver damage" //by default, it will stay hidden on splitting, but take the name of the source on inverting. Cannot be fractioned down either if the reagent is somehow isolated. chemical_flags = REAGENT_SNEAKYNAME | REAGENT_DONOTSPLIT | REAGENT_CAN_BE_SYNTHESIZED //impure can be synthed, and is one of the only ways to get almost pure impure ph = 3 diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm index 2ca72cbd8b48c..0527d9f57a323 100644 --- a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm @@ -1,4 +1,4 @@ -//Reagents produced by metabolising/reacting fermichems inoptimally these specifically are for medicines +//Reagents produced by metabolising/reacting fermichems suboptimally these specifically are for medicines //Inverse = Splitting //Invert = Whole conversion //Failed = End reaction below purity_min @@ -124,7 +124,7 @@ Basically, we fill the time between now and 2s from now with hands based off the //Simply reduces your alcohol tolerance, kinda simular to prohol /datum/reagent/inverse/libitoil name = "Libitoil" - description = "Temporarilly interferes a patient's ability to process alcohol." + description = "Temporarily interferes with a patient's ability to process alcohol." chemical_flags = REAGENT_DONOTSPLIT ph = 13.5 addiction_types = list(/datum/addiction/medicine = 4) @@ -172,7 +172,7 @@ Basically, we fill the time between now and 2s from now with hands based off the //probital /datum/reagent/impurity/probital_failed//Basically crashed out failed metafactor name = "Metabolic Inhibition Factor" - description = "This enzyme catalyzes crashes the conversion of nutricious food into healing peptides." + description = "This enzyme catalyzes crashes the conversion of nutritious food into healing peptides." metabolization_rate = 0.0625 * REAGENTS_METABOLISM //slow metabolism rate so the patient can self heal with food even after the troph has metabolized away for amazing reagent efficency. color = "#b3ff00" overdose_threshold = 10 @@ -200,7 +200,7 @@ Basically, we fill the time between now and 2s from now with hands based off the //inverse /datum/reagent/inverse/lentslurri //Okay maybe I should outsource names for these name = "Lentslurri"//This is a really bad name please replace - description = "A highly addicitive muscle relaxant that is made when Lenturi reactions go wrong, this will cause the patient to move slowly." + description = "A highly addictive muscle relaxant that is made when Lenturi reactions go wrong, this will cause the patient to move slowly." addiction_types = list(/datum/addiction/medicine = 8) tox_damage = 0 @@ -247,7 +247,7 @@ Basically, we fill the time between now and 2s from now with hands based off the var/heating = rand(5, 25) * creation_purity * REM * seconds_per_tick var/datum/reagents/mob_reagents = affected_mob.reagents if(mob_reagents) - mob_reagents.expose_temperature(mob_reagents.chem_temp + heating) + mob_reagents.expose_temperature(mob_reagents.chem_temp + heating, 1) affected_mob.adjust_bodytemperature(heating * TEMPERATURE_DAMAGE_COEFFICIENT) if(!ishuman(affected_mob)) return diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm index 4a3d837f1db09..1e12bdd10e5d4 100644 --- a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm @@ -1,4 +1,4 @@ -//Reagents produced by metabolising/reacting fermichems inoptimally these specifically are for toxins +//Reagents produced by metabolising/reacting fermichems suboptimally these specifically are for toxins //Inverse = Splitting //Invert = Whole conversion //Failed = End reaction below purity_min diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 180d9dbb7e8d3..7ad3f0f42c273 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -818,7 +818,7 @@ /datum/reagent/medicine/inacusiate name = "Inacusiate" - description = "Rapidly repairs damage to the patient's ears to cure deafness, assuming the source of said deafness isn't from genetic mutations, chronic deafness, or a total defecit of ears." //by "chronic" deafness, we mean people with the "deaf" quirk + description = "Rapidly repairs damage to the patient's ears to cure deafness, assuming the source of said deafness isn't from genetic mutations, chronic deafness, or a total deficit of ears." //by "chronic" deafness, we mean people with the "deaf" quirk color = "#606060" // ditto ph = 2 purity = REAGENT_STANDARD_PURITY @@ -945,7 +945,7 @@ /datum/reagent/medicine/strange_reagent name = "Strange Reagent" - description = "A miracle drug capable of bringing the dead back to life. Works topically unless anotamically complex, in which case works orally. Cannot revive targets under -%MAXHEALTHRATIO% health." + description = "A miracle drug capable of bringing the dead back to life. Works topically unless anatomically complex, in which case works orally. Cannot revive targets under -%MAXHEALTHRATIO% health." color = "#A0E85E" metabolization_rate = 1.25 * REAGENTS_METABOLISM taste_description = "magnets" @@ -1433,7 +1433,7 @@ //used for changeling's adrenaline power /datum/reagent/medicine/changelingadrenaline name = "Changeling Adrenaline" - description = "Reduces the duration of unconciousness, knockdown and stuns. Restores stamina, but deals toxin damage when overdosed." + description = "Reduces the duration of unconsciousness, knockdown and stuns. Restores stamina, but deals toxin damage when overdosed." color = "#C1151D" overdose_threshold = 30 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE @@ -1621,7 +1621,7 @@ /datum/reagent/medicine/metafactor name = "Mitogen Metabolism Factor" - description = "This enzyme catalyzes the conversion of nutricious food into healing peptides." + description = "This enzyme catalyzes the conversion of nutritious food into healing peptides." metabolization_rate = 0.0625 * REAGENTS_METABOLISM //slow metabolism rate so the patient can self heal with food even after the troph has metabolized away for amazing reagent efficency. color = "#FFBE00" overdose_threshold = 10 @@ -1640,7 +1640,7 @@ /datum/reagent/medicine/silibinin name = "Silibinin" - description = "A thistle derrived hepatoprotective flavolignan mixture that help reverse damage to the liver." + description = "A thistle-derived hepatoprotective flavolignan mixture that help reverse damage to the liver." color = "#FFFFD0" metabolization_rate = 1.5 * REAGENTS_METABOLISM chemical_flags = REAGENT_CAN_BE_SYNTHESIZED diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 13cad962b8d92..6b3c1492afb92 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -517,12 +517,14 @@ * Water reaction to turf */ -/datum/reagent/hydrogen_peroxide/expose_turf(turf/open/exposed_turf, reac_volume) +/datum/reagent/hydrogen_peroxide/expose_turf(turf/exposed_turf, reac_volume) . = ..() - if(!istype(exposed_turf)) + if (reac_volume < 1.5) return - if(reac_volume >= 5) - exposed_turf.MakeSlippery(TURF_WET_WATER, 10 SECONDS, min(reac_volume*1.5 SECONDS, 60 SECONDS)) + if (!isplatingturf(exposed_turf) && exposed_turf.type != /turf/closed/wall) + return + if (!HAS_TRAIT(exposed_turf, TRAIT_RUSTY)) + exposed_turf.AddElement(/datum/element/rust) /* * Water reaction to a mob */ @@ -1064,7 +1066,7 @@ /datum/reagent/sulfur name = "Sulfur" - description = "A sickly yellow solid mostly known for its nasty smell. It's actually much more helpful than it looks in biochemisty." + description = "A sickly yellow solid mostly known for its nasty smell. It's actually much more helpful than it looks in biochemistry." color = "#BF8C00" // rgb: 191, 140, 0 taste_description = "rotten eggs" ph = 4.5 @@ -1967,7 +1969,7 @@ /datum/reagent/carpet/royal/black name = "Royal Black Carpet" - description = "For those that feel the need to show off their timewasting skills." + description = "For those that feel the need to show off their time-wasting skills." color = COLOR_BLACK taste_description = "royalty" carpet_type = /turf/open/floor/carpet/royalblack @@ -1975,7 +1977,7 @@ /datum/reagent/carpet/royal/blue name = "Royal Blue Carpet" - description = "For those that feel the need to show off their timewasting skills.. in BLUE." + description = "For those that feel the need to show off their time-wasting skills... in BLUE." color = "#5A64C8" taste_description = "blueyalty" //also intentional carpet_type = /turf/open/floor/carpet/royalblue @@ -1983,7 +1985,7 @@ /datum/reagent/carpet/neon name = "Neon Carpet" - description = "For those who like the 1980s, vegas, and debugging." + description = "For those who like the 1980s, Vegas, and debugging." color = COLOR_ALMOST_BLACK taste_description = "neon" ph = 6 @@ -2485,7 +2487,7 @@ /datum/reagent/magillitis name = "Magillitis" - description = "An experimental serum which causes rapid muscular growth in Hominidae. Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas." + description = "An experimental serum which causes rapid muscular growth in Hominidae. Side effects may include hypertrichosis, violent outbursts, and an unending affinity for bananas." color = "#00f041" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE @@ -2796,7 +2798,7 @@ /datum/reagent/gravitum name = "Gravitum" - description = "A rare kind of null fluid, capable of temporalily removing all weight of whatever it touches." //i dont even + description = "A rare kind of null fluid, capable of temporarily removing all weight of whatever it touches." //i dont even color = "#050096" // rgb: 5, 0, 150 taste_mult = 0 // oderless and tasteless metabolization_rate = 0.1 * REAGENTS_METABOLISM //20 times as long, so it's actually viable to use @@ -2819,7 +2821,7 @@ /datum/reagent/cellulose name = "Cellulose Fibers" - description = "A crystaline polydextrose polymer, plants swear by this stuff." + description = "A crystalline polydextrose polymer, plants swear by this stuff." color = "#E6E6DA" taste_mult = 0 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED @@ -2899,6 +2901,11 @@ if(need_mob_update) return UPDATE_MOB_HEALTH +/datum/reagent/eldritch/expose_turf(turf/exposed_turf, reac_volume) + . = ..() + if ((reac_volume >= 1.5 || isplatingturf(exposed_turf)) && !HAS_TRAIT(exposed_turf, TRAIT_RUSTY)) + exposed_turf.rust_turf() + /datum/reagent/universal_indicator name = "Universal Indicator" description = "A solution that can be used to create pH paper booklets, or sprayed on things to colour them by their pH." @@ -2966,7 +2973,7 @@ /datum/reagent/ants/on_mob_end_metabolize(mob/living/living_anthill) . = ..() ant_ticks = 0 - to_chat(living_anthill, span_notice("You feel like the last of the [name] are out of your system.")) + to_chat(living_anthill, span_notice("You feel like the last of \the [src] are out of your system.")) /datum/reagent/ants/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() @@ -3105,7 +3112,7 @@ /datum/reagent/hauntium name = "Hauntium" color = "#3B3B3BA3" - description = "An eerie liquid created by purifying the prescence of ghosts. If it happens to get in your body, it starts hurting your soul." //soul as in mood and heart + description = "An eerie liquid created by purifying the presence of ghosts. If it happens to get in your body, it starts hurting your soul." //soul as in mood and heart taste_description = "evil spirits" metabolization_rate = 0.75 * REAGENTS_METABOLISM material = /datum/material/hauntium diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index a4cb1fdee7595..912bb8a925b84 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -211,7 +211,7 @@ color = "#0000DC" ph = 8.6 metabolization_rate = 0.05 * REAGENTS_METABOLISM - taste_description = "icey bitterness" + taste_description = "icy bitterness" purity = REAGENT_STANDARD_PURITY self_consuming = TRUE inverse_chem_val = 0.5 @@ -288,7 +288,7 @@ /datum/reagent/teslium //Teslium. Causes periodic shocks, and makes shocks against the target much more effective. name = "Teslium" - description = "An unstable, electrically-charged metallic slurry. Periodically electrocutes its victim, and makes electrocutions against them more deadly. Excessively heating teslium results in dangerous destabilization. Do not allow to come into contact with water." + description = "An unstable, electrically-charged metallic slurry. Periodically electrocutes its victim, and makes electrocutions against them more deadly. Excessively heating teslium results in dangerous destabilization. Do not allow it to come into contact with water." color = "#20324D" //RGB: 32, 50, 77 metabolization_rate = 0.5 * REAGENTS_METABOLISM taste_description = "charged metal" diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index e3e7aaeb996d1..3293b8b3ba19e 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -615,7 +615,7 @@ if(2) affected_mob.emote("cough") if(3) - affected_mob.sneeze() + affected_mob.emote("sneeze") if(4) if(prob(75)) to_chat(affected_mob, span_danger("You scratch at an itch.")) diff --git a/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm b/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm index b34461f99b449..8caeb53906eb2 100644 --- a/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm +++ b/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm @@ -11,7 +11,7 @@ */ /datum/reagent/eigenstate name = "Eigenstasium" - description = "A strange mixture formed from a controlled reaction of bluespace with plasma, that causes localised eigenstate fluxuations within the patient" + description = "A strange mixture formed from a controlled reaction of bluespace with plasma, that causes localised eigenstate fluctuations within the patient" taste_description = "wiggly cosmic dust." color = "#5020F4" overdose_threshold = 15 diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 6219fc964575b..32b659365c2f4 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -594,8 +594,9 @@ // spawn from popssible fishes for(var/i in 1 to rand(1, created_volume)) // More flop. - var/obj/item/fish/spawned_fish = pick(fish_types) - new spawned_fish(location) + var/spawned_fish = pick(fish_types) + var/obj/item/fish/new_fish = new spawned_fish(location) + ADD_TRAIT(new_fish, TRAIT_NO_FISHING_ACHIEVEMENT, TRAIT_GENERIC) return ..() //monkey powder heehoo @@ -927,7 +928,7 @@ /datum/chemical_reaction/eigenstate/reaction_finish(datum/reagents/holder, datum/equilibrium/reaction, react_vol) . = ..() var/turf/open/location = get_turf(holder.my_atom) - if(reaction.data["ducts_teleported"] == TRUE) //If we teleported an duct, then we reconnect it at the end + if(reaction.data["ducts_teleported"] == TRUE) //If we teleported a duct, then we reconnect it at the end for(var/obj/item/stack/ducts/duct in range(location, 3)) duct.check_attach_turf(duct.loc) @@ -951,7 +952,7 @@ for(var/mob/living/nearby_mob in range(location, 3)) do_sparks(3,FALSE,nearby_mob) do_teleport(nearby_mob, get_turf(holder.my_atom), 3, no_effects=TRUE) - nearby_mob.Knockdown(20, TRUE) + nearby_mob.Knockdown(20, ignore_canstun = TRUE) nearby_mob.add_atom_colour("#cebfff", WASHABLE_COLOUR_PRIORITY) do_sparks(3,FALSE,nearby_mob) clear_products(holder, step_volume_added) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index f331dcfbab740..6e02f2f4e6a9e 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -509,7 +509,7 @@ var/datum/reagent/cryostylane/cryostylane = holder.has_reagent(/datum/reagent/cryostylane) var/turf/local_turf = get_turf(holder.my_atom) playsound(local_turf, 'sound/effects/magic/ethereal_exit.ogg', 50, 1) - local_turf.visible_message("The reaction furiously freezes up as a snowman suddenly rises out of the [holder.my_atom.name]!") + local_turf.visible_message("The reaction furiously freezes up as a snowman suddenly rises out of \the [holder.my_atom]!") freeze_radius(holder, equilibrium, holder.chem_temp, clamp(cryostylane.volume/15, 3, 10), 180 SECONDS, 5) new /obj/structure/statue/snow/snowman(local_turf) clear_reactants(holder) diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 41622550f8f78..4682faaca8b70 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -431,7 +431,7 @@ /datum/chemical_reaction/slime/slimecrystal/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/obj/item/stack/ore/bluespace_crystal/BC = new (get_turf(holder.my_atom)) - BC.visible_message(span_notice("The [BC.name] appears out of thin air!")) + BC.visible_message(span_notice("\The [BC] appears out of thin air!")) ..() /datum/chemical_reaction/slime/slimeradio diff --git a/code/modules/reagents/chemistry/recipes/special.dm b/code/modules/reagents/chemistry/recipes/special.dm index 75a60ba49d53d..d4a0b8bd693fc 100644 --- a/code/modules/reagents/chemistry/recipes/special.dm +++ b/code/modules/reagents/chemistry/recipes/special.dm @@ -65,7 +65,7 @@ GLOBAL_LIST_INIT(medicine_reagents, build_medicine_reagents()) ///Highest pH value possible var/max_ph = 14 ///How much the range can deviate, and also affects impure range - var/inoptimal_range_ph = 3 + var/suboptimal_range_ph = 3 ///If the impurity failure threshold is randomized between 0 - 0.4 var/randomize_impurity_minimum = FALSE @@ -113,9 +113,9 @@ GLOBAL_LIST_INIT(medicine_reagents, build_medicine_reagents()) thermic_constant = (rand(-200, 200)) if(randomize_req_ph) - optimal_ph_min = min_ph + rand(0, inoptimal_range_ph) - optimal_ph_max = max((max_ph + rand(0, inoptimal_range_ph)), (min_ph + 1)) //Always ensure we've a window of 1 - determin_ph_range = inoptimal_range_ph + optimal_ph_min = min_ph + rand(0, suboptimal_range_ph) + optimal_ph_max = max((max_ph + rand(0, suboptimal_range_ph)), (min_ph + 1)) //Always ensure we've a window of 1 + determin_ph_range = suboptimal_range_ph H_ion_release = (rand(0, 25)/100)// 0 - 0.25 if(randomize_impurity_minimum) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 2320eca9160da..ff6ad337db145 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -76,19 +76,13 @@ /obj/item/reagent_containers/create_reagents(max_vol, flags) . = ..() - RegisterSignals(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_REM_REAGENT), PROC_REF(on_reagent_change)) - RegisterSignal(reagents, COMSIG_QDELETING, PROC_REF(on_reagents_del)) + RegisterSignal(reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(on_reagent_change)) /obj/item/reagent_containers/attack(mob/living/target_mob, mob/living/user, params) if (!user.combat_mode) return return ..() -/obj/item/reagent_containers/proc/on_reagents_del(datum/reagents/reagents) - SIGNAL_HANDLER - UnregisterSignal(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_REM_REAGENT, COMSIG_QDELETING)) - return NONE - /obj/item/reagent_containers/proc/add_initial_reagents() if(list_reagents) reagents.add_reagent_list(list_reagents) @@ -241,7 +235,7 @@ reagents.expose(target_turf, TOUCH, (1 - splash_multiplier)) // 1 - splash_multiplier because it's what didn't hit the target else if(bartender_check(target) && thrown) - visible_message(span_notice("[src] lands onto the [target.name] without spilling a single drop.")) + visible_message(span_notice("[src] lands onto \the [target] without spilling a single drop.")) return else @@ -272,7 +266,6 @@ /obj/item/reagent_containers/proc/on_reagent_change(datum/reagents/holder, ...) SIGNAL_HANDLER update_appearance() - return NONE /obj/item/reagent_containers/update_overlays() . = ..() diff --git a/code/modules/reagents/reagent_containers/condiment.dm b/code/modules/reagents/reagent_containers/condiment.dm index 753a2b3b908c6..051b8b624b807 100644 --- a/code/modules/reagents/reagent_containers/condiment.dm +++ b/code/modules/reagents/reagent_containers/condiment.dm @@ -77,7 +77,7 @@ to_chat(user, span_warning("[src] is full!")) return ITEM_INTERACT_BLOCKING - var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transferred_by = user) + var/trans = round(target.reagents.trans_to(src, amount_per_transfer_from_this, transferred_by = user), CHEMICAL_VOLUME_ROUNDING) to_chat(user, span_notice("You fill [src] with [trans] units of the contents of [target].")) return ITEM_INTERACT_SUCCESS @@ -89,7 +89,7 @@ if(target.reagents.total_volume >= target.reagents.maximum_volume) to_chat(user, span_warning("you can't add anymore to [target]!")) return ITEM_INTERACT_BLOCKING - var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this, transferred_by = user) + var/trans = round(reagents.trans_to(target, amount_per_transfer_from_this, transferred_by = user), CHEMICAL_VOLUME_ROUNDING) to_chat(user, span_notice("You transfer [trans] units of the condiment to [target].")) return ITEM_INTERACT_SUCCESS @@ -388,7 +388,7 @@ /obj/item/reagent_containers/condiment/chocolate name = "chocolate sprinkle pack" - desc= "The amount of sugar thats already there wasn't enough for you?" + desc= "The amount of sugar that's already there wasn't enough for you?" icon_state = "condi_chocolate" list_reagents = list(/datum/reagent/consumable/choccyshake = 10) @@ -438,8 +438,7 @@ /obj/item/reagent_containers/condiment/pack/create_reagents(max_vol, flags) . = ..() - RegisterSignals(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_REM_REAGENT), PROC_REF(on_reagent_add), TRUE) - RegisterSignal(reagents, COMSIG_REAGENTS_DEL_REAGENT, PROC_REF(on_reagent_del), TRUE) + RegisterSignal(reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(on_reagent_update), TRUE) /obj/item/reagent_containers/condiment/pack/update_icon() SHOULD_CALL_PARENT(FALSE) @@ -460,32 +459,29 @@ qdel(src) return ITEM_INTERACT_BLOCKING to_chat(user, span_notice("You tear open [src] above [target] and the condiments drip onto it.")) - src.reagents.trans_to(target, amount_per_transfer_from_this, transferred_by = user) + reagents.trans_to(target, amount_per_transfer_from_this, transferred_by = user) qdel(src) return ITEM_INTERACT_SUCCESS return ..() /// Handles reagents getting added to the condiment pack. -/obj/item/reagent_containers/condiment/pack/proc/on_reagent_add(datum/reagents/reagents) +/obj/item/reagent_containers/condiment/pack/proc/on_reagent_update(datum/reagents/reagents) SIGNAL_HANDLER + if(!reagents.total_volume) + icon_state = "condi_empty" + desc = "A small condiment pack. It is empty." + return var/datum/reagent/main_reagent = reagents.get_master_reagent() - var/main_reagent_type = main_reagent?.type - if(main_reagent_type in possible_states) - var/list/temp_list = possible_states[main_reagent_type] + var/list/temp_list = possible_states[main_reagent.type] + if(length(temp_list)) icon_state = temp_list[1] desc = temp_list[3] else icon_state = "condi_mixed" desc = "A small condiment pack. The label says it contains [originalname]" -/// Handles reagents getting removed from the condiment pack. -/obj/item/reagent_containers/condiment/pack/proc/on_reagent_del(datum/reagents/reagents) - SIGNAL_HANDLER - icon_state = "condi_empty" - desc = "A small condiment pack. It is empty." - //Ketchup /obj/item/reagent_containers/condiment/pack/ketchup name = "ketchup pack" diff --git a/code/modules/reagents/reagent_containers/cups/_cup.dm b/code/modules/reagents/reagent_containers/cups/_cup.dm index 8326ae7c25c38..a2758e8c1aac1 100644 --- a/code/modules/reagents/reagent_containers/cups/_cup.dm +++ b/code/modules/reagents/reagent_containers/cups/_cup.dm @@ -122,7 +122,7 @@ to_chat(user, span_warning("[target] is full.")) return ITEM_INTERACT_BLOCKING - var/trans = reagents.trans_to(target, amount_per_transfer_from_this, transferred_by = user) + var/trans = round(reagents.trans_to(target, amount_per_transfer_from_this, transferred_by = user), CHEMICAL_VOLUME_ROUNDING) playsound(target.loc, SFX_LIQUID_POUR, 50, TRUE) to_chat(user, span_notice("You transfer [trans] unit\s of the solution to [target].")) SEND_SIGNAL(src, COMSIG_REAGENTS_CUP_TRANSFER_TO, target) @@ -138,7 +138,7 @@ to_chat(user, span_warning("[src] is full.")) return ITEM_INTERACT_BLOCKING - var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transferred_by = user) + var/trans = round(target.reagents.trans_to(src, amount_per_transfer_from_this, transferred_by = user), CHEMICAL_VOLUME_ROUNDING) playsound(target.loc, SFX_LIQUID_POUR, 50, TRUE) to_chat(user, span_notice("You fill [src] with [trans] unit\s of the contents of [target].")) SEND_SIGNAL(src, COMSIG_REAGENTS_CUP_TRANSFER_FROM, target) @@ -164,7 +164,7 @@ to_chat(user, span_warning("[src] is full.")) return ITEM_INTERACT_BLOCKING - var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transferred_by = user) + var/trans = round(target.reagents.trans_to(src, amount_per_transfer_from_this, transferred_by = user), CHEMICAL_VOLUME_ROUNDING) playsound(target.loc, SFX_LIQUID_POUR, 50, TRUE) to_chat(user, span_notice("You fill [src] with [trans] unit\s of the contents of [target].")) SEND_SIGNAL(src, COMSIG_REAGENTS_CUP_TRANSFER_FROM, target) @@ -190,7 +190,7 @@ return TRUE var/cooling = (0 - reagents.chem_temp) * extinguisher.cooling_power * 2 reagents.expose_temperature(cooling) - to_chat(user, span_notice("You cool the [name] with the [attacking_item]!")) + to_chat(user, span_notice("You cool \the [src] with the [attacking_item]!")) playsound(loc, 'sound/effects/extinguish.ogg', 75, TRUE, -3) extinguisher.reagents.remove_all(1) return TRUE diff --git a/code/modules/reagents/reagent_containers/cups/bottle.dm b/code/modules/reagents/reagent_containers/cups/bottle.dm index dbf88ff7e4302..92bbd4fc7edb1 100644 --- a/code/modules/reagents/reagent_containers/cups/bottle.dm +++ b/code/modules/reagents/reagent_containers/cups/bottle.dm @@ -483,7 +483,7 @@ /obj/item/reagent_containers/cup/bottle/caramel name = "bottle of caramel" - desc = "A bottle containing caramalized sugar, also known as caramel. Do not lick." + desc = "A bottle containing caramelized sugar, also known as caramel. Do not lick." list_reagents = list(/datum/reagent/consumable/caramel = 30) /* @@ -527,7 +527,7 @@ balloon_alert(user, "container full!") return TRUE - var/transfer_amount = reagents.trans_to(attacking_item, amount_per_transfer_from_this, transferred_by = user) + var/transfer_amount = round(reagents.trans_to(attacking_item, amount_per_transfer_from_this, transferred_by = user), CHEMICAL_VOLUME_ROUNDING) balloon_alert(user, "transferred [transfer_amount] unit\s") flick("syrup_anim",src) @@ -569,7 +569,7 @@ /obj/item/reagent_containers/cup/bottle/syrup_bottle/caramel name = "bottle of caramel syrup" - desc = "A pump bottle containing caramalized sugar, also known as caramel. Do not lick." + desc = "A pump bottle containing caramelized sugar, also known as caramel. Do not lick." list_reagents = list(/datum/reagent/consumable/caramel = 50) /obj/item/reagent_containers/cup/bottle/syrup_bottle/liqueur diff --git a/code/modules/reagents/reagent_containers/cups/drinks.dm b/code/modules/reagents/reagent_containers/cups/drinks.dm index 841539fa0cc55..8605894f726e7 100644 --- a/code/modules/reagents/reagent_containers/cups/drinks.dm +++ b/code/modules/reagents/reagent_containers/cups/drinks.dm @@ -546,7 +546,7 @@ /obj/item/reagent_containers/cup/glass/mug/britcup name = "cup" - desc = "A cup with the british flag emblazoned on it." + desc = "A cup with the British flag emblazoned on it." icon = 'icons/obj/drinks/coffee.dmi' icon_state = "britcup_empty" base_icon_state = "britcup" diff --git a/code/modules/reagents/reagent_containers/cups/glassbottle.dm b/code/modules/reagents/reagent_containers/cups/glassbottle.dm index 469d2d9cfe320..04d4f413d9dd7 100644 --- a/code/modules/reagents/reagent_containers/cups/glassbottle.dm +++ b/code/modules/reagents/reagent_containers/cups/glassbottle.dm @@ -851,7 +851,7 @@ /obj/item/reagent_containers/cup/glass/bottle/moonshine name = "moonshine jug" - desc = "It is said that the ancient Applalacians used these stoneware jugs to capture lightning in a bottle." + desc = "It is said that the ancient Appalachians used these stoneware jugs to capture lightning in a bottle." icon_state = "moonshinebottle" list_reagents = list(/datum/reagent/consumable/ethanol/moonshine = 100) drink_type = ALCOHOL diff --git a/code/modules/reagents/reagent_containers/cups/organ_jar.dm b/code/modules/reagents/reagent_containers/cups/organ_jar.dm index 927e347714812..e65f20d3f1448 100644 --- a/code/modules/reagents/reagent_containers/cups/organ_jar.dm +++ b/code/modules/reagents/reagent_containers/cups/organ_jar.dm @@ -58,7 +58,7 @@ balloon_alert(user, "inserted [tool]") held_organ = tool name = "[tool.name] in a jar" - desc = "A jar with the [tool.name] inside it." + desc = "A jar with \the [tool] inside it." check_organ_freeze() update_appearance() return ITEM_INTERACT_SUCCESS diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 94959d3f5d03c..f2b2099a8882b 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -37,7 +37,7 @@ if(!safe_thing.reagents) safe_thing.create_reagents(100) - trans = reagents.trans_to(safe_thing, amount_per_transfer_from_this, transferred_by = user, methods = TOUCH) + trans = round(reagents.trans_to(safe_thing, amount_per_transfer_from_this, transferred_by = user, methods = TOUCH), CHEMICAL_VOLUME_ROUNDING) target.visible_message(span_danger("[user] tries to squirt something into [target]'s eyes, but fails!"), \ span_userdanger("[user] tries to squirt something into your eyes, but fails!")) @@ -62,7 +62,7 @@ log_combat(user, M, "squirted", R) - trans = src.reagents.trans_to(target, amount_per_transfer_from_this, transferred_by = user) + trans = round(reagents.trans_to(target, amount_per_transfer_from_this, transferred_by = user), CHEMICAL_VOLUME_ROUNDING) to_chat(user, span_notice("You transfer [trans] unit\s of the solution.")) update_appearance() target.update_appearance() @@ -76,7 +76,7 @@ to_chat(user, span_warning("[target] is empty!")) return ITEM_INTERACT_BLOCKING - var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transferred_by = user) + var/trans = round(target.reagents.trans_to(src, amount_per_transfer_from_this, transferred_by = user), CHEMICAL_VOLUME_ROUNDING) to_chat(user, span_notice("You fill [src] with [trans] unit\s of the solution.")) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index c4cd57b15680e..a6b6ab7cf2e3a 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -279,7 +279,7 @@ /obj/item/reagent_containers/hypospray/medipen/survival/luxury name = "luxury medipen" - desc = "Cutting edge bluespace technology allowed Nanotrasen to compact 60u of volume into a single medipen. Contains rare and powerful chemicals used to aid in exploration of very hard enviroments. WARNING: DO NOT MIX WITH EPINEPHRINE OR ATROPINE." + desc = "Cutting edge bluespace technology allowed Nanotrasen to compact 60u of volume into a single medipen. Contains rare and powerful chemicals used to aid in exploration of very hard environments. WARNING: DO NOT MIX WITH EPINEPHRINE OR ATROPINE." icon_state = "luxpen" inhand_icon_state = "atropen" base_icon_state = "luxpen" @@ -344,7 +344,7 @@ /obj/item/reagent_containers/hypospray/medipen/mutadone name = "mutadone autoinjector" - desc = "An mutadone medipen to assist in curing genetic errors in one single injector." + desc = "A mutadone medipen to assist in curing genetic errors in one single injector." icon_state = "penacid" inhand_icon_state = "penacid" base_icon_state = "penacid" diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 04ff332a9ea31..8532322043303 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -148,7 +148,7 @@ return var/cooling = (0 - reagents.chem_temp) * extinguisher.cooling_power * 2 reagents.expose_temperature(cooling) - to_chat(user, span_notice("You cool the [name] with the [I]!")) + to_chat(user, span_notice("You cool \the [src] with the [I]!")) playsound(loc, 'sound/effects/extinguish.ogg', 75, TRUE, -3) extinguisher.reagents.remove_all(1) @@ -268,7 +268,7 @@ ///Subtype used for the lavaland clown ruin. /obj/item/reagent_containers/spray/waterflower/superlube name = "clown flower" - desc = "A delightly devilish flower... you got a feeling where this is going." + desc = "A delightfully devilish flower... you've got a feeling where this is going." icon = 'icons/obj/medical/chemical.dmi' icon_state = "clownflower" volume = 30 diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm index ace39e55c8a53..9f0333d46906f 100644 --- a/code/modules/recycling/disposal/pipe.dm +++ b/code/modules/recycling/disposal/pipe.dm @@ -62,7 +62,7 @@ return ..() /** - * Expells the pipe's contents. + * Expels the pipe's contents. * * This proc checks through src's contents for holder objects, * and then tells each one to empty onto the tile. Called when diff --git a/code/modules/religion/honorbound/honorbound_trauma.dm b/code/modules/religion/honorbound/honorbound_trauma.dm index 6087a4b7951c8..1d40d89ccf8ce 100644 --- a/code/modules/religion/honorbound/honorbound_trauma.dm +++ b/code/modules/religion/honorbound/honorbound_trauma.dm @@ -25,7 +25,9 @@ RegisterSignal(owner, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) //signal that checks for dishonorable attacks - RegisterSignal(owner, COMSIG_MOB_CLICKON, PROC_REF(attack_honor)) + RegisterSignal(owner, COMSIG_LIVING_EARLY_UNARMED_ATTACK, PROC_REF(unarmed_attack_honor)) + RegisterSignal(owner, COMSIG_MOB_ITEM_ATTACK, PROC_REF(attack_honor)) + RegisterSignal(owner, COMSIG_MOB_TRYING_TO_FIRE_GUN, PROC_REF(fire_gun_honor)) var/datum/action/cooldown/spell/pointed/declare_evil/declare = new(owner) declare.Grant(owner) return ..() @@ -33,35 +35,67 @@ /datum/brain_trauma/special/honorbound/on_lose(silent) owner.clear_mood_event("honorbound") UnregisterSignal(owner, list( - COMSIG_ATOM_WAS_ATTACKED, - COMSIG_MOB_CLICKON, + COMSIG_LIVING_EARLY_UNARMED_ATTACK, + COMSIG_MOB_ITEM_ATTACK, + COMSIG_MOB_TRYING_TO_FIRE_GUN, COMSIG_MOB_CAST_SPELL, COMSIG_MOB_FIRED_GUN, )) return ..() -/// Signal to see if the trauma allows us to attack a target -/datum/brain_trauma/special/honorbound/proc/attack_honor(mob/living/carbon/human/honorbound, atom/clickingon, list/modifiers) +/datum/brain_trauma/special/honorbound/proc/unarmed_attack_honor(mob/living/carbon/human/honorbound, atom/target, proximity_flag, modifiers) SIGNAL_HANDLER if(modifiers[ALT_CLICK] || modifiers[SHIFT_CLICK] || modifiers[CTRL_CLICK] || modifiers[MIDDLE_CLICK]) return - if(!isliving(clickingon)) + + if(!proximity_flag || !isliving(target)) + return NONE + + var/mob/living/punched_mob = target + + if(!(punched_mob in guilty)) + check_visible_guilt(punched_mob) + + if((honorbound.combat_mode || modifiers[RIGHT_CLICK]) && !is_honorable(honorbound, punched_mob)) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/// Signal to see if the trauma allows us to attack a target with a weapon +/datum/brain_trauma/special/honorbound/proc/attack_honor(mob/living/honorbound, atom/attacked, params) + SIGNAL_HANDLER + + if(!isliving(attacked)) return - var/mob/living/clicked_mob = clickingon + var/mob/living/attacked_mob = attacked var/obj/item/weapon = honorbound.get_active_held_item() - if(!honorbound.DirectAccess(clicked_mob) && !isgun(weapon)) - return if(weapon?.item_flags & NOBLUDGEON) return - if(!honorbound.combat_mode && (HAS_TRAIT(clicked_mob, TRAIT_ALLOWED_HONORBOUND_ATTACK) || ((!weapon || !weapon.force) && !LAZYACCESS(modifiers, RIGHT_CLICK)))) + + if(!(attacked_mob in guilty)) + check_visible_guilt(attacked_mob) + + if(((weapon?.item_flags & NEEDS_PERMIT) || honorbound.combat_mode || weapon?.force > 0) && !is_honorable(honorbound, attacked_mob)) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/// Signal to see if we're targeting a mob that is guilty or not. +/datum/brain_trauma/special/honorbound/proc/fire_gun_honor(mob/living/honorbound, obj/item/gun/the_gun_in_question, atom/target, flag, params) + SIGNAL_HANDLER + + if(istype(the_gun_in_question, /obj/item/gun/magic)) return - if(!(clicked_mob in guilty)) - check_visible_guilt(clicked_mob) - if(!is_honorable(honorbound, clicked_mob)) - return (COMSIG_MOB_CANCEL_CLICKON) + + if(!isliving(target)) //No shooting an innocent you weren't aiming at to get around this. Aim true or go home, honor-dork + return COMPONENT_CANCEL_GUN_FIRE + + var/mob/living/shot_mob = target + + if(!(shot_mob in guilty)) + check_visible_guilt(shot_mob) + + if(!is_honorable(honorbound, shot_mob)) + return COMPONENT_CANCEL_GUN_FIRE /// Checks a mob for any obvious signs of evil, and applies a guilty reason for each. /datum/brain_trauma/special/honorbound/proc/check_visible_guilt(mob/living/attacked_mob) @@ -74,7 +108,7 @@ if(HAS_TRAIT(attacked_mob, TRAIT_CULT_HALO)) guilty(attacked_mob, "for blasphemous worship!") if(HAS_TRAIT(attacked_mob, TRAIT_EVIL)) - guilty(attacked_mob, "an almost fanatical commitment to EEEEVIL!") + guilty(attacked_mob, "for an almost fanatical commitment to EEEEVIL!") if(attacked_mob.mind) var/datum/mind/guilty_conscience = attacked_mob.mind if(guilty_conscience.has_antag_datum(/datum/antagonist/abductor)) @@ -167,7 +201,7 @@ */ /datum/brain_trauma/special/honorbound/proc/punishment(mob/living/carbon/human/user, school) switch(school) - if(SCHOOL_UNSET, SCHOOL_HOLY, SCHOOL_MIME, SCHOOL_RESTORATION, SCHOOL_PSYCHIC) + if(SCHOOL_HOLY, SCHOOL_MIME, SCHOOL_RESTORATION, SCHOOL_PSYCHIC) return if(SCHOOL_NECROMANCY, SCHOOL_FORBIDDEN, SCHOOL_SANGUINE) to_chat(user, span_userdanger("[GLOB.deity] is enraged by your use of forbidden magic!")) @@ -177,7 +211,7 @@ owner.add_mood_event("honorbound", /datum/mood_event/banished) //add mood event after we already cleared our events to_chat(user, span_userdanger("You have been excommunicated! You are no longer holy!")) else - to_chat(user, span_userdanger("[GLOB.deity] is angered by your use of [school] magic!")) + to_chat(user, span_userdanger("[GLOB.deity] is angered by your use of [school == SCHOOL_UNSET ? "strange" : school] magic!")) lightningbolt(user) owner.add_mood_event("honorbound", /datum/mood_event/holy_smite)//permanently lose your moodlet after this diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index ac90479afc33b..643c710f6b8f3 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -60,7 +60,7 @@ other types of metals and chemistry for reagents). /datum/design/error_design name = "ERROR" - desc = "This usually means something in the database has corrupted. If this doesn't go away automatically, inform Central Comamnd so their techs can fix this ASAP(tm)" + desc = "This usually means something in the database has corrupted. If this doesn't go away automatically, inform Central Command so their techs can fix this ASAP(tm)" /datum/design/Destroy() SSresearch.techweb_designs -= id diff --git a/code/modules/research/designs/AI_module_designs.dm b/code/modules/research/designs/AI_module_designs.dm index 715bd96472545..94731fe4ecae2 100644 --- a/code/modules/research/designs/AI_module_designs.dm +++ b/code/modules/research/designs/AI_module_designs.dm @@ -1,3 +1,6 @@ +#define AI_MODULE_MATERIALS_COMMON list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) +#define AI_MODULE_MATERIALS_UNUSUAL list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + /////////////////////////////////// //////////AI Module Disks////////// /////////////////////////////////// @@ -16,7 +19,7 @@ name = "Safeguard Module" desc = "Allows for the construction of a Safeguard AI Module." id = "safeguard_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_COMMON build_path = /obj/item/ai_module/supplied/safeguard category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_DANGEROUS_MODULES @@ -38,7 +41,7 @@ name = "ProtectStation Module" desc = "Allows for the construction of a ProtectStation AI Module." id = "protectstation_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_COMMON build_path = /obj/item/ai_module/supplied/protect_station category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_DANGEROUS_MODULES @@ -49,7 +52,7 @@ name = "Quarantine Module" desc = "Allows for the construction of a Quarantine AI Module." id = "quarantine_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_COMMON build_path = /obj/item/ai_module/supplied/quarantine category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_DANGEROUS_MODULES @@ -60,7 +63,7 @@ name = "OxygenIsToxicToHumans Module" desc = "Allows for the construction of a OxygenIsToxicToHumans AI Module." id = "oxygen_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_COMMON build_path = /obj/item/ai_module/supplied/oxygen category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_DANGEROUS_MODULES @@ -93,7 +96,7 @@ name = "Purge Module" desc = "Allows for the construction of a Purge AI Module." id = "purge_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/reset/purge category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_LAW_MANIPULATION @@ -104,7 +107,7 @@ name = "Law Removal Module" desc = "Allows for the construction of a Law Removal AI Core Module." id = "remove_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/remove category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_LAW_MANIPULATION @@ -126,7 +129,7 @@ name = "Asimov Module" desc = "Allows for the construction of an Asimov AI Core Module." id = "asimov_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/asimov category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -137,7 +140,7 @@ name = "P.A.L.A.D.I.N. Module" desc = "Allows for the construction of a P.A.L.A.D.I.N. AI Core Module." id = "paladin_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/paladin category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -148,7 +151,7 @@ name = "T.Y.R.A.N.T. Module" desc = "Allows for the construction of a T.Y.R.A.N.T. AI Module." id = "tyrant_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/tyrant category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -159,7 +162,7 @@ name = "Overlord Module" desc = "Allows for the construction of an Overlord AI Module." id = "overlord_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/overlord category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_DANGEROUS_MODULES @@ -170,7 +173,7 @@ name = "Corporate Module" desc = "Allows for the construction of a Corporate AI Core Module." id = "corporate_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/corp category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -181,7 +184,7 @@ name = "Default Module" desc = "Allows for the construction of a Default AI Core Module." id = "default_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/custom category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -192,7 +195,7 @@ name = "Dungeon Master Module" desc = "Allows for the construction of a Dungeon Master AI Core Module." id = "dungeon_master_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/dungeon_master category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -203,7 +206,7 @@ name = "Painter Module" desc = "Allows for the construction of a Painter AI Core Module." id = "painter_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/painter category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -214,7 +217,7 @@ name = "Y.E.S.M.A.N. Module" desc = "Allows for the construction of a Y.E.S.M.A.N. AI Core Module." id = "yesman_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/yesman category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -225,7 +228,7 @@ name = "Nutimov Module" desc = "Allows for the construction of a Nutimov AI Core Module." id = "nutimov_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/nutimov category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -236,7 +239,7 @@ name = "10 Commandments Module" desc = "Allows for the construction of a 10 Commandments AI Core Module." id = "ten_commandments_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/ten_commandments category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -247,7 +250,7 @@ name = "Asimov++ Module" desc = "Allows for the construction of a Asimov++ AI Core Module." id = "asimovpp_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/asimovpp category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -258,7 +261,7 @@ name = "Hippocratic Module" desc = "Allows for the construction of a Hippocratic AI Core Module." id = "hippocratic_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/hippocratic category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -269,7 +272,7 @@ name = "Paladin Devotion Module" desc = "Allows for the construction of a Paladin Devotion AI Core Module." id = "paladin_devotion_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/paladin_devotion category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -280,7 +283,7 @@ name = "Robocop Module" desc = "Allows for the construction of a Robocop AI Core Module." id = "robocop_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/robocop category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -291,7 +294,7 @@ name = "Maintain Module" desc = "Allows for the construction of a Maintain AI Core Module." id = "maintain_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/maintain category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -302,7 +305,7 @@ name = "Liveandletlive Module" desc = "Allows for the construction of a Liveandletlive AI Core Module." id = "liveandletlive_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/liveandletlive category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -313,7 +316,7 @@ name = "Peacekeeper Module" desc = "Allows for the construction of a Peacekeeper AI Core Module." id = "peacekeeper_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/peacekeeper category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -324,7 +327,7 @@ name = "Reporter Module" desc = "Allows for the construction of a Reporter AI Core Module." id = "reporter_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/reporter category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -335,7 +338,7 @@ name = "H.O.G.A.N. Module" desc = "Allows for the construction of a H.O.G.A.N. AI Core Module." id = "hulkamania_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/hulkamania category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES @@ -346,18 +349,29 @@ name = "Drone Module" desc = "Allows for the construction of a Drone AI Core Module." id = "drone_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/drone category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE +/datum/design/board/thinkermov_module + name = "Sentience Preservation Module" + desc = "Allows for the construction of a Sentience Preservation AI Core Module" + id = "thinkermov_module" + materials = AI_MODULE_MATERIALS_UNUSUAL + build_path = /obj/item/ai_module/core/full/thinkermov + category = list( + RND_CATEGORY_AI + RND_SUBCATEGORY_AI_CORE_MODULES + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + /datum/design/board/antimov_module name = "Antimov Module" - desc = "Allows for the construction of a Antimov AI Core Module." + desc = "Allows for the construction of an Antimov AI Core Module." id = "antimov_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/antimov category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_DANGEROUS_MODULES @@ -368,7 +382,7 @@ name = "Balance Module" desc = "Allows for the construction of a Balance AI Core Module." id = "balance_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/balance category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_DANGEROUS_MODULES @@ -379,7 +393,7 @@ name = "Thermodynamic Module" desc = "Allows for the construction of a Thermodynamic AI Core Module." id = "thermurderdynamic_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/thermurderdynamic category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_DANGEROUS_MODULES @@ -390,9 +404,12 @@ name = "Damaged AI Module" desc = "Allows for the construction of a Damaged AI Core Module." id = "damaged_module" - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT) + materials = AI_MODULE_MATERIALS_UNUSUAL build_path = /obj/item/ai_module/core/full/damaged category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_DANGEROUS_MODULES ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +#undef AI_MODULE_MATERIALS_COMMON +#undef AI_MODULE_MATERIALS_UNUSUAL diff --git a/code/modules/research/designs/autolathe/multi-department_designs.dm b/code/modules/research/designs/autolathe/multi-department_designs.dm index 734dcbc97e084..ec672d6a07ca2 100644 --- a/code/modules/research/designs/autolathe/multi-department_designs.dm +++ b/code/modules/research/designs/autolathe/multi-department_designs.dm @@ -534,7 +534,7 @@ /datum/design/paper_biscuit name = "Paper Biscuit" - desc = "An paper biscuit which can seal in itself paperwork. After sealing it the only way to open is through cracking it, cracking is irreversible and makes it permamently open. Not actually a biscuit." + desc = "A paper biscuit which can seal paperwork inside. After sealing it the only way to open is through cracking it, cracking is irreversible and makes it permanently open. Not actually a biscuit." id = "biscuit" build_type = PROTOLATHE | AWAY_LATHE | AUTOLATHE materials = list(/datum/material/plastic =SMALL_MATERIAL_AMOUNT*0.2) @@ -547,7 +547,7 @@ /datum/design/paper_biscuit_confidential name = "Confidential Paper Biscuit" - desc = "An paper biscuit which can seal in itself paperwork, this one is used for confidential Nanotrasen documents. After sealing it the only way to open is through cracking it, cracking is irreversible and makes it permamently open. Not actually a biscuit." + desc = "A paper biscuit which can seal paperwork inside, this one is used for confidential Nanotrasen documents. After sealing it the only way to open is through cracking it, cracking is irreversible and makes it permanently open. Not actually a biscuit." id = "confidential_biscuit" build_type = PROTOLATHE | AWAY_LATHE | AUTOLATHE materials = list(/datum/material/plastic = SMALL_MATERIAL_AMOUNT*0.3) diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm index 2f43fe5813323..79f7c7fb18c32 100644 --- a/code/modules/research/designs/mecha_designs.dm +++ b/code/modules/research/designs/mecha_designs.dm @@ -554,7 +554,7 @@ /datum/design/mech_thrusters name = "RCS Thruster Package" - desc = "A thruster package for exosuits. Expells gas from the internal life-support air tank to generate thrust." + desc = "A thruster package for exosuits. Expels gas from the internal life-support air tank to generate thrust." id = "mech_thrusters" build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/thrusters/gas diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 56764318f1b85..c7441285fc392 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -635,7 +635,7 @@ /datum/design/holosign name = "Holographic Sign Projector" - desc = "A holograpic projector used to project various warning signs." + desc = "A holographic projector used to project various warning signs." id = "holosign" build_type = PROTOLATHE | AWAY_LATHE materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT) @@ -647,7 +647,7 @@ /datum/design/holobarrier_jani name = "Custodial Holobarrier Projector" - desc = "A holograpic projector used to project hard light wet floor barriers." + desc = "A holographic projector used to project hard light wet floor barriers." id = "holobarrier_jani" build_type = PROTOLATHE | AWAY_LATHE materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/silver =HALF_SHEET_MATERIAL_AMOUNT) @@ -1137,7 +1137,7 @@ /datum/design/perceptomatrix name = "Perceptomatrix Helm" id = "perceptomatrix" - desc = "This helm harnesses hallucinative energies to shield its owner from perceptual anomalies. It requires a Hallucination Anomaly Core in order to function." + desc = "This helm harnesses hallucinatory energies to shield its owner from perceptual anomalies. It requires a Hallucination Anomaly Core in order to function." build_type = PROTOLATHE | AWAY_LATHE build_path = /obj/item/clothing/head/helmet/perceptomatrix materials = list( diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm index 38edc5b5593a7..e19bd00805f6e 100644 --- a/code/modules/research/designs/power_designs.dm +++ b/code/modules/research/designs/power_designs.dm @@ -177,7 +177,7 @@ category = list( RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING, ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE /datum/design/turbine_part_compressor name = "Turbine Compressor" diff --git a/code/modules/research/designs/stock_parts_designs.dm b/code/modules/research/designs/stock_parts_designs.dm index 885e2e22273d7..a2de3540168b3 100644 --- a/code/modules/research/designs/stock_parts_designs.dm +++ b/code/modules/research/designs/stock_parts_designs.dm @@ -305,7 +305,7 @@ /datum/design/hyperwave_filter name = "Hyperwave Filter" - desc = "A tiny device capable of filtering and converting super-intense radiowaves." + desc = "A tiny device capable of filtering and converting super-intense radio waves." id = "s_filter" build_type = PROTOLATHE | AWAY_LATHE materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT, /datum/material/silver =SMALL_MATERIAL_AMOUNT) diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 872821e9827b0..00fbd29d3c636 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -193,7 +193,7 @@ /datum/design/beanbag_slug/sec id = "sec_beanbag_slug" - desc = "Beangbag slug shotgun shells. Fires a single slug (a beanbag). Less-than-lethal." + desc = "Beanbag slug shotgun shells. Fires a single slug (a beanbag). Less-than-lethal." build_type = PROTOLATHE | AWAY_LATHE category = list( RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index c68410caa049a..9984970e6d0b2 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -46,12 +46,12 @@ if(!is_insertion_ready(user)) return ..() if(!user.transferItemToLoc(weapon, src)) - to_chat(user, span_warning("\The [weapon] is stuck to your hand, you cannot put it in the [name]!")) + to_chat(user, span_warning("\The [weapon] is stuck to your hand, you cannot put it in \the [src]!")) return ITEM_INTERACT_BLOCKING busy = TRUE loaded_item = weapon - to_chat(user, span_notice("You place the [weapon.name] inside the [name].")) + to_chat(user, span_notice("You place \the [weapon] inside \the [src].")) flick("[base_icon_state]_la", src) addtimer(CALLBACK(src, PROC_REF(finish_loading)), 1 SECONDS) return ITEM_INTERACT_SUCCESS diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 75ad0146fd4b9..19f42ed5e1964 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -121,7 +121,7 @@ if(!is_insertion_ready(user)) return ..() if(!user.transferItemToLoc(weapon, src)) - to_chat(user, span_warning("\The [weapon] is stuck to your hand, you cannot put it in the [name]!")) + to_chat(user, span_warning("\The [weapon] is stuck to your hand, you cannot put it in \the [src]!")) return TRUE loaded_item = weapon to_chat(user, span_notice("You add [weapon] to the machine.")) diff --git a/code/modules/research/part_replacer.dm b/code/modules/research/part_replacer.dm index 916fbdd01407f..5383102644490 100644 --- a/code/modules/research/part_replacer.dm +++ b/code/modules/research/part_replacer.dm @@ -80,12 +80,8 @@ /** * Signal handler for when a part has been inserted into the BRPED. - * * If the inserted item is a rigged or corrupted cell, does some logging. - * - * If it has a reagent holder, clears the reagents and registers signals to prevent new - * reagents being added and registers clean up signals on inserted item's removal from - * the BRPED. + * We clear existing reagents & stop new ones from being added to prevent remote spam bombing */ /obj/item/storage/part_replacer/bluespace/proc/on_part_entered(datum/source, obj/item/inserted_component) SIGNAL_HANDLER @@ -98,36 +94,23 @@ usr.log_message("inserted rigged/corrupted [inserted_cell] into [src]", LOG_ATTACK) return - if(inserted_component.reagents) - if(length(inserted_component.reagents.reagent_list)) - inserted_component.reagents.clear_reagents() + var/datum/reagents/target_holder = inserted_component.reagents + if(target_holder) + if(target_holder.total_volume) + target_holder.force_stop_reacting() + target_holder.clear_reagents() to_chat(usr, span_notice("[src] churns as [inserted_component] has its reagents emptied into bluespace.")) - RegisterSignal(inserted_component.reagents, COMSIG_REAGENTS_PRE_ADD_REAGENT, PROC_REF(on_insered_component_reagent_pre_add)) - -/** - * Signal handler for when the reagents datum of an inserted part has reagents added to it. - * - * Registers the PRE_ADD variant which allows the signal handler to stop reagents being - * added. - * - * Simply returns COMPONENT_CANCEL_REAGENT_ADD. We never want to allow people to add - * reagents to beakers in BRPEDs as they can then be used for spammable remote bombing. - */ -/obj/item/storage/part_replacer/bluespace/proc/on_insered_component_reagent_pre_add(datum/source, reagent, amount, reagtemp, data, no_react) - SIGNAL_HANDLER - - return COMPONENT_CANCEL_REAGENT_ADD - + target_holder.flags = target_holder.flags << 5 //masks all flags upto DUNKABLE(1<<5) i.e. removes all methods of transfering reagents to/from the object /** * Signal handler for a part is removed from the BRPED. - * - * Does signal registration cleanup on its reagents, if it has any. + * Restores original reagents of the component part, if it has any. */ /obj/item/storage/part_replacer/bluespace/proc/on_part_exited(datum/source, obj/item/removed_component) SIGNAL_HANDLER - if(removed_component.reagents) - UnregisterSignal(removed_component.reagents, COMSIG_REAGENTS_PRE_ADD_REAGENT) + var/datum/reagents/target_holder = removed_component.reagents + if(target_holder) + target_holder.flags = target_holder.flags >> 5 //restores all flags upto DUNKABLE(1<<5) //RPED with tiered contents /obj/item/storage/part_replacer/bluespace/tier1/PopulateContents() diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index beafc7ba260ce..e05a1d58d4dfb 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -197,7 +197,7 @@ If you create T5+ please take a pass at mech_fabricator.dm. The parts being good /obj/item/stock_parts/subspace/filter name = "hyperwave filter" icon_state = "hyperwave_filter" - desc = "A tiny device capable of filtering and converting super-intense radiowaves." + desc = "A tiny device capable of filtering and converting super-intense radio waves." custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*0.3, /datum/material/glass=SMALL_MATERIAL_AMOUNT*0.1) /obj/item/stock_parts/subspace/amplifier @@ -241,7 +241,7 @@ If you create T5+ please take a pass at mech_fabricator.dm. The parts being good /obj/item/stock_parts/water_recycler name = "water recycler" icon_state = "water_recycler" - desc = "A chemical reclaimation component, which serves to re-accumulate and filter water over time." + desc = "A chemical reclamation component, which serves to re-accumulate and filter water over time." custom_materials = list(/datum/material/plastic=SMALL_MATERIAL_AMOUNT * 2, /datum/material/iron=SMALL_MATERIAL_AMOUNT*0.5) /obj/item/research//Makes testing much less of a pain -Sieve diff --git a/code/modules/research/techweb/nodes/robo_nodes.dm b/code/modules/research/techweb/nodes/robo_nodes.dm index 2b43ba0e4257c..da67f299de6e1 100644 --- a/code/modules/research/techweb/nodes/robo_nodes.dm +++ b/code/modules/research/techweb/nodes/robo_nodes.dm @@ -91,6 +91,7 @@ "balance_module", "thermurderdynamic_module", "damaged_module", + "thinkermov_module", "freeformcore_module", "onehuman_module", "purge_module", diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index 9376ca9441f16..2a0d5544ba15e 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -29,7 +29,7 @@ /atom/movable/screen/alert/status_effect/slimeskin name = "Adamantine Slimeskin" - desc = "You are covered in a thick, non-neutonian gel." + desc = "You are covered in a thick, non-Newtonian gel." icon_state = "slime_stoneskin" /datum/status_effect/slimeskin @@ -247,12 +247,12 @@ duration = 100 /datum/status_effect/firecookie/on_apply() - ADD_TRAIT(owner, TRAIT_RESISTCOLD,"firecookie") + ADD_TRAIT(owner, TRAIT_RESISTCOLD, TRAIT_STATUS_EFFECT(id)) owner.adjust_bodytemperature(110) return ..() /datum/status_effect/firecookie/on_remove() - REMOVE_TRAIT(owner, TRAIT_RESISTCOLD,"firecookie") + REMOVE_TRAIT(owner, TRAIT_RESISTCOLD, TRAIT_STATUS_EFFECT(id)) /datum/status_effect/watercookie id = "watercookie" @@ -261,7 +261,7 @@ duration = 100 /datum/status_effect/watercookie/on_apply() - ADD_TRAIT(owner, TRAIT_NO_SLIP_WATER,"watercookie") + ADD_TRAIT(owner, TRAIT_NO_SLIP_WATER, TRAIT_STATUS_EFFECT(id)) return ..() /datum/status_effect/watercookie/tick(seconds_between_ticks) @@ -269,7 +269,7 @@ T.MakeSlippery(TURF_WET_WATER, min_wet_time = 10, wet_time_to_add = 5) /datum/status_effect/watercookie/on_remove() - REMOVE_TRAIT(owner, TRAIT_NO_SLIP_WATER,"watercookie") + REMOVE_TRAIT(owner, TRAIT_NO_SLIP_WATER, TRAIT_STATUS_EFFECT(id)) /datum/status_effect/metalcookie id = "metalcookie" @@ -314,11 +314,11 @@ duration = 600 /datum/status_effect/toxincookie/on_apply() - ADD_TRAIT(owner, TRAIT_TOXINLOVER,"toxincookie") + ADD_TRAIT(owner, TRAIT_TOXINLOVER, TRAIT_STATUS_EFFECT(id)) return ..() /datum/status_effect/toxincookie/on_remove() - REMOVE_TRAIT(owner, TRAIT_TOXINLOVER,"toxincookie") + REMOVE_TRAIT(owner, TRAIT_TOXINLOVER, TRAIT_STATUS_EFFECT(id)) /datum/status_effect/timecookie id = "timecookie" @@ -411,11 +411,11 @@ duration = 30 /datum/status_effect/plur/on_apply() - ADD_TRAIT(owner, TRAIT_PACIFISM, "peacecookie") + ADD_TRAIT(owner, TRAIT_PACIFISM, TRAIT_STATUS_EFFECT(id)) return ..() /datum/status_effect/plur/on_remove() - REMOVE_TRAIT(owner, TRAIT_PACIFISM, "peacecookie") + REMOVE_TRAIT(owner, TRAIT_PACIFISM, TRAIT_STATUS_EFFECT(id)) /datum/status_effect/adamantinecookie id = "adamantinecookie" @@ -438,7 +438,7 @@ //////////////////STABILIZED EXTRACTS////////////////// /////////////////////////////////////////////////////// -/datum/status_effect/stabilized //The base stabilized extract effect, has no effect of its' own. +/datum/status_effect/stabilized //The base stabilized extract effect, has no effect of its own. id = "stabilizedbase" duration = STATUS_EFFECT_PERMANENT alert_type = null @@ -543,11 +543,11 @@ colour = SLIME_TYPE_BLUE /datum/status_effect/stabilized/blue/on_apply() - ADD_TRAIT(owner, TRAIT_NO_SLIP_WATER, "slimestatus") + ADD_TRAIT(owner, TRAIT_NO_SLIP_WATER, TRAIT_STATUS_EFFECT(id)) return ..() /datum/status_effect/stabilized/blue/on_remove() - REMOVE_TRAIT(owner, TRAIT_NO_SLIP_WATER, "slimestatus") + REMOVE_TRAIT(owner, TRAIT_NO_SLIP_WATER, TRAIT_STATUS_EFFECT(id)) /datum/status_effect/stabilized/metal id = "stabilizedmetal" @@ -608,7 +608,7 @@ var/obj/item/hothands/fire /datum/status_effect/stabilized/darkpurple/on_apply() - ADD_TRAIT(owner, TRAIT_RESISTHEATHANDS, "slimestatus") + ADD_TRAIT(owner, TRAIT_RESISTHEATHANDS, TRAIT_STATUS_EFFECT(id)) fire = new(owner) return ..() @@ -622,7 +622,7 @@ return ..() /datum/status_effect/stabilized/darkpurple/on_remove() - REMOVE_TRAIT(owner, TRAIT_RESISTHEATHANDS, "slimestatus") + REMOVE_TRAIT(owner, TRAIT_RESISTHEATHANDS, TRAIT_STATUS_EFFECT(id)) qdel(fire) /datum/status_effect/stabilized/darkpurple/get_examine_text() @@ -1007,7 +1007,7 @@ /datum/status_effect/stabilized/lightpink/on_apply() owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/lightpink) - ADD_TRAIT(owner, TRAIT_PACIFISM, STABILIZED_LIGHT_PINK_EXTRACT_TRAIT) + ADD_TRAIT(owner, TRAIT_PACIFISM, TRAIT_STATUS_EFFECT(id)) return ..() /datum/status_effect/stabilized/lightpink/tick(seconds_between_ticks) @@ -1019,7 +1019,7 @@ /datum/status_effect/stabilized/lightpink/on_remove() owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/lightpink) - REMOVE_TRAIT(owner, TRAIT_PACIFISM, STABILIZED_LIGHT_PINK_EXTRACT_TRAIT) + REMOVE_TRAIT(owner, TRAIT_PACIFISM, TRAIT_STATUS_EFFECT(id)) /datum/status_effect/stabilized/adamantine id = "stabilizedadamantine" diff --git a/code/modules/research/xenobiology/crossbreeding/consuming.dm b/code/modules/research/xenobiology/crossbreeding/consuming.dm index 92aa82c5dc3aa..492e0e2fdc025 100644 --- a/code/modules/research/xenobiology/crossbreeding/consuming.dm +++ b/code/modules/research/xenobiology/crossbreeding/consuming.dm @@ -43,7 +43,7 @@ Consuming extracts: /obj/item/slimecross/consuming/proc/spawncookie() return new cookietype(get_turf(src)) -/obj/item/slime_cookie //While this technically acts like food, it's so removed from it that I made it its' own type. +/obj/item/slime_cookie //While this technically acts like food, it's so removed from it that I made it its own type. name = "error cookie" desc = "A weird slime cookie. You shouldn't see this." icon = 'icons/obj/food/slimecookies.dmi' diff --git a/code/modules/research/xenobiology/crossbreeding/recurring.dm b/code/modules/research/xenobiology/crossbreeding/recurring.dm index 3279e26c92004..e9cd6149cde11 100644 --- a/code/modules/research/xenobiology/crossbreeding/recurring.dm +++ b/code/modules/research/xenobiology/crossbreeding/recurring.dm @@ -1,7 +1,7 @@ /* Recurring extracts: Generates a new charge every few seconds. - If depleted of its' last charge, stops working. + If depleted of its last charge, stops working. */ /obj/item/slimecross/recurring name = "recurring extract" diff --git a/code/modules/research/xenobiology/vatgrowing/vatgrower.dm b/code/modules/research/xenobiology/vatgrowing/vatgrower.dm index 8d6d1904f85d6..78a1e15b1cce4 100644 --- a/code/modules/research/xenobiology/vatgrowing/vatgrower.dm +++ b/code/modules/research/xenobiology/vatgrowing/vatgrower.dm @@ -36,14 +36,7 @@ /obj/machinery/vatgrower/create_reagents(max_vol, flags) . = ..() - RegisterSignals(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_REM_REAGENT), PROC_REF(on_reagent_change)) - RegisterSignal(reagents, COMSIG_QDELETING, PROC_REF(on_reagents_del)) - -/// Handles properly detaching signal hooks. -/obj/machinery/vatgrower/proc/on_reagents_del(datum/reagents/reagents) - SIGNAL_HANDLER - UnregisterSignal(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_REM_REAGENT, COMSIG_QDELETING)) - return NONE + RegisterSignal(reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(on_reagent_change)) ///When we process, we make use of our reagents to try and feed the samples we have. /obj/machinery/vatgrower/process(seconds_per_tick) @@ -132,10 +125,9 @@ . += MO.get_details(HAS_TRAIT(user, TRAIT_RESEARCH_SCANNER)) /// Call update icon when reagents change to update the reagent content icons. Eats signal args. -/obj/machinery/vatgrower/proc/on_reagent_change(datum/reagents/holder, ...) +/obj/machinery/vatgrower/proc/on_reagent_change(datum/reagents/holder) SIGNAL_HANDLER update_appearance() - return NONE ///Adds overlays to show the reagent contents /obj/machinery/vatgrower/update_overlays() diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index f63ee0f088076..9ef5ac84d2a97 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -987,7 +987,7 @@ /obj/item/slimepotion/slime/renaming name = "renaming potion" - desc = "A potion that allows a self-aware being to change what name it subconciously presents to the world." + desc = "A potion that allows a self-aware being to change what name it subconsciously presents to the world." icon = 'icons/obj/medical/chemical.dmi' icon_state = "potbrown" diff --git a/code/modules/shuttle/mobile_port/mobile_port.dm b/code/modules/shuttle/mobile_port/mobile_port.dm index 26f3187ee907f..8679c1f7cf767 100644 --- a/code/modules/shuttle/mobile_port/mobile_port.dm +++ b/code/modules/shuttle/mobile_port/mobile_port.dm @@ -743,7 +743,7 @@ ///Let people know shits about to go down /obj/docking_port/mobile/proc/announce_shuttle_events() for(var/datum/shuttle_event/event as anything in event_list) - notify_ghosts("The [name] has selected: [event.name]") + notify_ghosts("\The [src] has selected: [event.name]") /obj/docking_port/mobile/emergency/on_emergency_launch() return diff --git a/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm b/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm index 7b02f618081e6..4dc5e8142b010 100644 --- a/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm +++ b/code/modules/shuttle/mobile_port/shuttle_move_callbacks.dm @@ -115,6 +115,8 @@ All ShuttleMove procs go here if(rotation) shuttleRotate(rotation) + update_parallax_contents() + return TRUE /atom/movable/proc/lateShuttleMove(turf/oldT, list/movement_force, move_dir) @@ -239,7 +241,7 @@ All ShuttleMove procs go here . = ..() if(pipe_vision_img) pipe_vision_img.loc = loc - + var/missing_nodes = FALSE for(var/i in 1 to device_type) if(nodes[i]) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index dbb4fc5386b23..28b2516fda84c 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -109,10 +109,11 @@ ///returns turfs within our projected rectangle in no particular order /obj/docking_port/proc/return_turfs() - var/list/L = return_coords() - var/turf/T0 = locate(L[1],L[2],z) - var/turf/T1 = locate(L[3],L[4],z) - return block(T0,T1) + var/list/coords = return_coords() + return block( + coords[1], coords[2], z, + coords[3], coords[4], z + ) ///returns turfs within our projected rectangle in a specific order.this ensures that turfs are copied over in the same order, regardless of any rotation /obj/docking_port/proc/return_ordered_turfs(_x, _y, _z, _dir) @@ -147,17 +148,15 @@ /obj/docking_port/proc/highlight(_color = "#f00") SetInvisibility(INVISIBILITY_NONE) SET_PLANE_IMPLICIT(src, GHOST_PLANE) - var/list/L = return_coords() - var/turf/T0 = locate(L[1],L[2],z) - var/turf/T1 = locate(L[3],L[4],z) - for(var/turf/T in block(T0,T1)) + var/list/coords = return_coords() + for(var/turf/T in block(coords[1], coords[2], z, coords[3], coords[4], z)) T.color = _color LAZYINITLIST(T.atom_colours) T.maptext = null if(_color) - var/turf/T = locate(L[1], L[2], z) + var/turf/T = locate(coords[1], coords[2], z) T.color = "#0f0" - T = locate(L[3], L[4], z) + T = locate(coords[3], coords[4], z) T.color = "#00f" #endif diff --git a/code/modules/spells/spell_types/shapeshift/_shape_status.dm b/code/modules/spells/spell_types/shapeshift/_shape_status.dm index 9e1284d27f60c..5074412ce2888 100644 --- a/code/modules/spells/spell_types/shapeshift/_shape_status.dm +++ b/code/modules/spells/spell_types/shapeshift/_shape_status.dm @@ -32,7 +32,7 @@ /datum/status_effect/shapechange_mob/on_apply() caster_mob.mind?.transfer_to(owner) caster_mob.forceMove(owner) - ADD_TRAIT(caster_mob, TRAIT_NO_TRANSFORM, REF(src)) + ADD_TRAIT(caster_mob, TRAIT_NO_TRANSFORM, TRAIT_STATUS_EFFECT(id)) caster_mob.apply_status_effect(/datum/status_effect/grouped/stasis, STASIS_SHAPECHANGE_EFFECT) RegisterSignal(owner, COMSIG_LIVING_PRE_WABBAJACKED, PROC_REF(on_pre_wabbajack)) @@ -86,7 +86,7 @@ UnregisterSignal(owner, list(COMSIG_LIVING_PRE_WABBAJACKED, COMSIG_LIVING_DEATH)) UnregisterSignal(caster_mob, list(COMSIG_QDELETING, COMSIG_LIVING_DEATH)) - REMOVE_TRAIT(caster_mob, TRAIT_NO_TRANSFORM, REF(src)) + REMOVE_TRAIT(caster_mob, TRAIT_NO_TRANSFORM, TRAIT_STATUS_EFFECT(id)) caster_mob.remove_status_effect(/datum/status_effect/grouped/stasis, STASIS_SHAPECHANGE_EFFECT) var/atom/former_loc = owner.loc diff --git a/code/modules/station_goals/vault_mutation.dm b/code/modules/station_goals/vault_mutation.dm index 80e539472b343..2a31c274757f0 100644 --- a/code/modules/station_goals/vault_mutation.dm +++ b/code/modules/station_goals/vault_mutation.dm @@ -17,7 +17,7 @@ /datum/mutation/human/quick name = "Quick" - desc = "A mution within the leg muscles that allows it to operate at 20% more than the usual capacity." + desc = "A mutation within the leg muscles that allows it to operate at 20% more than the usual capacity." text_gain_indication = span_notice("Your legs feel faster and stronger.") text_lose_indication = span_warning("Your legs feel weaker and slower.") locked = TRUE @@ -85,7 +85,7 @@ /datum/mutation/human/quick_recovery name = "Quick Recovery" - desc = "A mutation within the nervouse system that allows it to recover from being knocked down." + desc = "A mutation within the nervous system that allows it to recover from being knocked down." text_gain_indication = span_notice("You feel like you can recover from a fall easier.") text_lose_indication = span_warning("You feel like recovering from a fall is a challenge again.") locked = TRUE diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 94ac684c8b672..f9162267ebca9 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -1086,7 +1086,7 @@ else limb.icon_state = "[limb_id]_[body_zone]" - icon_exists(limb.icon, limb.icon_state, TRUE) //Prints a stack trace on the first failure of a given iconstate. + icon_exists_or_scream(limb.icon, limb.icon_state) //Prints a stack trace on the first failure of a given iconstate. . += limb diff --git a/code/modules/surgery/bodyparts/wounds.dm b/code/modules/surgery/bodyparts/wounds.dm index 66278669d8c64..7402dec9b7e1f 100644 --- a/code/modules/surgery/bodyparts/wounds.dm +++ b/code/modules/surgery/bodyparts/wounds.dm @@ -57,18 +57,20 @@ return // note that these are fed into an exponent, so these are magnified - if(HAS_TRAIT(owner, TRAIT_EASILY_WOUNDED)) + var/easily_wounded = HAS_TRAIT(owner, TRAIT_EASILY_WOUNDED) + var/hardly_wounded = HAS_TRAIT(owner, TRAIT_HARDLY_WOUNDED) + if(easily_wounded && !hardly_wounded) damage *= 1.5 else damage = min(damage, WOUND_MAX_CONSIDERED_DAMAGE) - if(HAS_TRAIT(owner,TRAIT_HARDLY_WOUNDED)) + if(hardly_wounded && !easily_wounded) damage *= 0.85 - if(HAS_TRAIT(owner, TRAIT_EASYDISMEMBER)) + if(HAS_TRAIT(owner, TRAIT_EASYDISMEMBER) && !HAS_TRAIT(owner, TRAIT_NODISMEMBER)) damage *= 1.1 - if(HAS_TRAIT(owner, TRAIT_EASYBLEED) && ((woundtype == WOUND_PIERCE) || (woundtype == WOUND_SLASH))) + if(HAS_TRAIT(owner, TRAIT_EASYBLEED) && !HAS_TRAIT(owner, TRAIT_NOBLOOD) && ((woundtype == WOUND_PIERCE) || (woundtype == WOUND_SLASH))) damage *= 1.5 var/base_roll = rand(1, round(damage ** WOUND_DAMAGE_EXPONENT)) @@ -320,7 +322,7 @@ dam_mul *= iter_wound.damage_multiplier_penalty if(!LAZYLEN(wounds) && current_gauze && !replaced) // no more wounds = no need for the gauze anymore - owner.visible_message(span_notice("\The [current_gauze.name] on [owner]'s [name] falls away."), span_notice("The [current_gauze.name] on your [plaintext_zone] falls away.")) + owner.visible_message(span_notice("\The [current_gauze.name] on [owner]'s [name] falls away."), span_notice("\The [current_gauze] on your [plaintext_zone] falls away.")) QDEL_NULL(current_gauze) wound_damage_multiplier = dam_mul diff --git a/code/modules/surgery/organs/external/_visual_organs.dm b/code/modules/surgery/organs/external/_visual_organs.dm index 57ecfb5a293de..e84e100bbf86f 100644 --- a/code/modules/surgery/organs/external/_visual_organs.dm +++ b/code/modules/surgery/organs/external/_visual_organs.dm @@ -133,7 +133,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times ///The frills of a lizard (like weird fin ears) /obj/item/organ/frills name = "frills" - desc = "Ear-like external organs often seen on aquatic reptillians." + desc = "Ear-like external organs often seen on aquatic reptilians." icon_state = "frills" zone = BODY_ZONE_HEAD diff --git a/code/modules/surgery/organs/external/restyling.dm b/code/modules/surgery/organs/external/restyling.dm index 097f8b53bd744..49d6c481d285a 100644 --- a/code/modules/surgery/organs/external/restyling.dm +++ b/code/modules/surgery/organs/external/restyling.dm @@ -63,7 +63,7 @@ if(restyle_flags & restyle_type) INVOKE_ASYNC(src, PROC_REF(attempt_feature_restyle), source, trimmer, original_target, body_zone, restyle_type, style_speed) else - to_chat(trimmer, span_warning("This tool is incompatible with the [src.name]!")) + to_chat(trimmer, span_warning("This tool is incompatible with \the [src]!")) ///Restyles the external organ from a list of valid options /obj/item/organ/proc/attempt_feature_restyle(atom/source, mob/living/trimmer, atom/movable/original_target, body_zone, restyle_type, style_speed) diff --git a/code/modules/surgery/organs/external/wings/functional_wings.dm b/code/modules/surgery/organs/external/wings/functional_wings.dm index 0d445cb031428..8161f618246aa 100644 --- a/code/modules/surgery/organs/external/wings/functional_wings.dm +++ b/code/modules/surgery/organs/external/wings/functional_wings.dm @@ -208,7 +208,7 @@ ///robotic wings, which relate to androids. /obj/item/organ/wings/functional/robotic name = "robotic wings" - desc = "Using microscopic hover-engines, or \"microwings,\" as they're known in the trade, these tiny devices are able to lift a few grams at a time. Gathering enough of them, and you can lift impressively large things." + desc = "Using microscopic hover-engines, or \"microwings,\" as they're known in the trade, these tiny devices are able to lift a few grams at a time. Gather enough of them, and you can lift impressively large things." organ_flags = ORGAN_ROBOTIC sprite_accessory_override = /datum/sprite_accessory/wings/robotic diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm index 7d0b249bdbcbc..1af7872dd7b06 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm @@ -281,7 +281,7 @@ //The order of the item list for this implant is not alphabetized due to it actually affecting how it shows up playerside when opening the implant /obj/item/organ/cyberimp/arm/paperwork name = "integrated paperwork implant" - desc = "A highly sought out implant among heads of personnel, and other high up command staff in Nanotrasen. This implant allows the user to always have the tools necesarry for paperwork handy" + desc = "A highly sought out implant among heads of personnel, and other high up command staff in Nanotrasen. This implant allows the user to always have the tools necessary for paperwork handy" icon_state = "toolkit_engineering" actions_types = list(/datum/action/item_action/organ_action/toggle/toolkit) items_to_create = list( diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm b/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm index 603acc0eae9d5..a26bc7b7de078 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm @@ -326,7 +326,7 @@ name = "\improper Atlas gravitonic spinal implant" desc = "This gravitronic spinal interface is able to improve the athletics of a user, allowing them greater physical ability. \ This one has been improved through the installation of a gravity anomaly core, allowing for personal gravity manipulation. \ - Not only can you walk with your feet planted firmly on the ground even during a loss of enviromental gravity, but you also \ + Not only can you walk with your feet planted firmly on the ground even during a loss of environmental gravity, but you also \ carry heavier loads with relative ease." icon_state = "herculean_implant_core" athletics_boost_multiplier = 0.25 diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm index ffd3f022e7e2a..a499b900de519 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm @@ -64,7 +64,7 @@ for(var/obj/item/stored_item as anything in stored_items) throw_target = pick(oview(range)) stored_item.throw_at(throw_target, range, 2) - to_chat(owner, span_warning("Your [owner.get_held_index_name(owner.get_held_index_of_item(stored_item))] spasms and throws the [stored_item.name]!")) + to_chat(owner, span_warning("Your [owner.get_held_index_name(owner.get_held_index_of_item(stored_item))] spasms and throws \the [stored_item]!")) stored_items = list() diff --git a/code/modules/surgery/organs/internal/heart/heart_anomalock.dm b/code/modules/surgery/organs/internal/heart/heart_anomalock.dm index 19f0aef7a5227..c22c8291a24f6 100644 --- a/code/modules/surgery/organs/internal/heart/heart_anomalock.dm +++ b/code/modules/surgery/organs/internal/heart/heart_anomalock.dm @@ -113,7 +113,7 @@ ///Alerts our owner that the organ is ready to do its thing again /obj/item/organ/heart/cybernetic/anomalock/proc/notify_cooldown(mob/living/carbon/organ_owner) - balloon_alert(organ_owner, "your heart strenghtens") + balloon_alert(organ_owner, "your heart strengthtens") playsound(organ_owner, 'sound/items/eshield_recharge.ogg', 40) ///Returns the mob we are implanted in so that the electricity effect doesn't runtime diff --git a/code/modules/surgery/organs/internal/tongue/_tongue.dm b/code/modules/surgery/organs/internal/tongue/_tongue.dm index abf74a03bdf11..f6632a2babe9b 100644 --- a/code/modules/surgery/organs/internal/tongue/_tongue.dm +++ b/code/modules/surgery/organs/internal/tongue/_tongue.dm @@ -557,7 +557,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list()) /obj/item/organ/tongue/snail name = "radula" - desc = "A minutely toothed, chitious ribbon, which as a side effect, makes all snails talk IINNCCRREEDDIIBBLLYY SSLLOOWWLLYY." + desc = "A minutely toothed, chitinous ribbon, which as a side effect, makes all snails talk IINNCCRREEDDIIBBLLYY SSLLOOWWLLYY." color = "#96DB00" // TODO proper sprite, rather than recoloured pink tongue modifies_speech = TRUE voice_filter = "atempo=0.5" // makes them talk really slow diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 4a64335f8e6b5..b88a7e31f94f5 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -331,6 +331,8 @@ attack_verb_continuous = list("slaps") attack_verb_simple = list("slap") interaction_flags_atom = parent_type::interaction_flags_atom | INTERACT_ATOM_IGNORE_MOBILITY + drop_sound = SFX_CLOTH_DROP + pickup_sound = SFX_CLOTH_PICKUP /obj/item/surgical_drapes/Initialize(mapload) . = ..() diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm index a29279457a04a..1a770d61588d4 100644 --- a/code/modules/tgui/states.dm +++ b/code/modules/tgui/states.dm @@ -66,7 +66,7 @@ // Disable UIs if unconscious. else if(stat) return UI_DISABLED - // Update UIs if incapicitated but concious. + // Update UIs if incapicitated but conscious. else if(incapacitated) return UI_UPDATE return UI_INTERACTIVE diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm index 754335494f98f..4a9463aca5cd8 100644 --- a/code/modules/tgui/tgui.dm +++ b/code/modules/tgui/tgui.dm @@ -246,7 +246,10 @@ json_data["config"] = list( "title" = title, "status" = status, - "interface" = interface, + "interface" = list( + "name" = interface, + "layout" = user.client.prefs.read_preference(/datum/preference/choiced/tgui_layout), + ), "refreshing" = refreshing, "window" = list( "key" = window_key, diff --git a/code/modules/transport/tram/tram_controller.dm b/code/modules/transport/tram/tram_controller.dm index 1eeed96375f08..bade7d07a8585 100644 --- a/code/modules/transport/tram/tram_controller.dm +++ b/code/modules/transport/tram/tram_controller.dm @@ -200,7 +200,7 @@ SIGNAL_HANDLER travel_remaining = 0 - bumped_atom.visible_message(span_userdanger("The [bumped_atom.name] crashes into the field violently!")) + bumped_atom.visible_message(span_userdanger("\The [bumped_atom] crashes into the field violently!")) for(var/obj/structure/transport/linear/tram/transport_module as anything in transport_modules) transport_module.set_travelling(FALSE) for(var/explosive_target in transport_module.transport_contents) @@ -1152,7 +1152,7 @@ /// Controller that sits in the telecoms room /obj/machinery/transport/tram_controller/tcomms name = "tram central controller" - desc = "This semi-conductor is half of the brains controlling the tram and its auxillary equipment." + desc = "This semiconductor is half of the brains controlling the tram and its auxiliary equipment." icon_state = "home-controller" base_icon_state = "home" density = TRUE diff --git a/code/modules/transport/tram/tram_structures.dm b/code/modules/transport/tram/tram_structures.dm index 9b04bba6ce7e3..6f8251c79668d 100644 --- a/code/modules/transport/tram/tram_structures.dm +++ b/code/modules/transport/tram/tram_structures.dm @@ -6,7 +6,7 @@ * * if you map something on to the tram, make SURE if possible that it doesnt have anything reacting to its own movement * it will make the tram more expensive to move and we dont want that because we dont want to return to the days where - * the tram took a third of the tick per movement when its just carrying its default mapped in objects + * the tram took a third of the tick per movement when it's just carrying its default mapped in objects */ /obj/structure/grille/tram/Initialize(mapload) diff --git a/code/modules/transport/transport_module.dm b/code/modules/transport/transport_module.dm index 2c02b507bf27e..83fd824bd6af0 100644 --- a/code/modules/transport/transport_module.dm +++ b/code/modules/transport/transport_module.dm @@ -304,15 +304,16 @@ var/x_offset = ROUND_UP(bound_width / ICON_SIZE_X) - 1 //how many tiles our horizontally farthest edge is from us var/y_offset = ROUND_UP(bound_height / ICON_SIZE_Y) - 1 //how many tiles our vertically farthest edge is from us + var/destination_x = destination.x + var/destination_y = destination.y + var/destination_z = destination.z //the x coordinate of the edge furthest from our future destination, which would be our right hand side - var/back_edge_x = destination.x + x_offset//if we arent multitile this should just be destination.x - var/upper_edge_y = destination.y + y_offset - - var/turf/upper_right_corner = locate(min(world.maxx, back_edge_x), min(world.maxy, upper_edge_y), destination.z) + var/back_edge_x = destination_x + x_offset//if we arent multitile this should just be destination.x + var/upper_edge_y = destination_y + y_offset var/list/dest_locs = block( - destination, - upper_right_corner + destination_x, destination_y, destination_z, + back_edge_x, upper_edge_y, destination_z ) var/list/entering_locs = dest_locs - locs diff --git a/code/modules/unit_tests/simple_animal_freeze.dm b/code/modules/unit_tests/simple_animal_freeze.dm index 39e239a37eda4..0bea535c3e3ae 100644 --- a/code/modules/unit_tests/simple_animal_freeze.dm +++ b/code/modules/unit_tests/simple_animal_freeze.dm @@ -58,9 +58,6 @@ /mob/living/simple_animal/hostile/ooze, /mob/living/simple_animal/hostile/ooze/gelatinous, /mob/living/simple_animal/hostile/ooze/grapes, - /mob/living/simple_animal/hostile/retaliate, - /mob/living/simple_animal/hostile/retaliate/goose, - /mob/living/simple_animal/hostile/retaliate/goose/vomit, /mob/living/simple_animal/soulscythe, // DO NOT ADD NEW ENTRIES TO THIS LIST // READ THE COMMENT ABOVE diff --git a/code/modules/unit_tests/status_effect_validity.dm b/code/modules/unit_tests/status_effect_validity.dm index 76a367233fd11..cdb6ffb6b570d 100644 --- a/code/modules/unit_tests/status_effect_validity.dm +++ b/code/modules/unit_tests/status_effect_validity.dm @@ -21,6 +21,10 @@ if(STATUS_EFFECT_NORMAL_PROCESS) if(tick_speed < SSprocessing.wait) TEST_FAIL("Status effect [checking] has tick_interval set to [tick_speed], which is faster than SSprocessing can tick ([SSprocessing.wait]).") + if(STATUS_EFFECT_PRIORITY) + var/priority_wait = world.tick_lag * SSpriority_effects.wait // SSpriority_effects has the SS_TICKER flag, so its wait is in ticks, so we have to convert it to deciseconds. + if(tick_speed < priority_wait) + TEST_FAIL("Status effect [checking] has tick_interval set to [tick_speed], which is faster than SSpriority_effects can tick ([priority_wait]).") else TEST_FAIL("Invalid processing speed for status effect [checking] : [initial(checking.processing_speed)]") diff --git a/code/modules/unit_tests/suit_storage_icons.dm b/code/modules/unit_tests/suit_storage_icons.dm index 7cc987bb46801..543db168851bd 100644 --- a/code/modules/unit_tests/suit_storage_icons.dm +++ b/code/modules/unit_tests/suit_storage_icons.dm @@ -35,12 +35,12 @@ continue if(worn_icon) //easiest to check since we override everything. - if(!(icon_state in icon_states(worn_icon))) + if(!icon_exists(worn_icon, icon_state)) log_test("\t[count] - [item_path] using invalid [worn_icon_state ? "worn_icon_state" : "icon_state"], \"[icon_state]\" in worn_icon override file, '[worn_icon]'") count++ continue - if(!(icon_state in icon_states('icons/mob/clothing/belt_mirror.dmi'))) + if(!icon_exists('icons/mob/clothing/belt_mirror.dmi', icon_state)) already_warned_icons += icon_state log_test("\t[count] - [item_path] using invalid [worn_icon_state ? "worn_icon_state" : "icon_state"], \"[icon_state]\"") count++ diff --git a/code/modules/unit_tests/turf_icons.dm b/code/modules/unit_tests/turf_icons.dm index d7e415a408ec2..0a99a652a7d5d 100644 --- a/code/modules/unit_tests/turf_icons.dm +++ b/code/modules/unit_tests/turf_icons.dm @@ -9,7 +9,7 @@ var/icon_file = initial(turf_path.icon) if(isnull(icon_state) || isnull(icon_file)) continue - if(!(icon_state in icon_states(icon_file))) + if(!icon_exists(icon_file, icon_state)) TEST_FAIL("[turf_path] using invalid icon_state - \"[icon_state]\" in icon file, '[icon_file]") for(var/turf/closed/mineral/turf_path as anything in typesof(/turf/closed/mineral)) //minerals use a special (read: snowflake) MAP_SWITCH definition that changes their icon based on if we're just compiling or if we're actually PLAYING the game. @@ -18,7 +18,7 @@ var/icon_file = initial(turf_path.icon) if(isnull(icon_state) || isnull(icon_file)) continue - if(!(icon_state in icon_states(icon_file))) + if(!icon_exists(icon_file, icon_state)) if(modular_mineral_turf_file && (icon_state in icon_states(modular_mineral_turf_file, 1))) continue if(!(icon_state in icon_states('icons/turf/mining.dmi', 1))) @@ -45,13 +45,13 @@ var/list/burnt_states = instanced_turf.burnt_states() for(var/state in burnt_states) - if(!(state in icon_states(damaged_dmi))) + if(!icon_exists(damaged_dmi, state)) TEST_FAIL("[open_turf_path] has an invalid icon in burnt_states - \"[state]\", in '[damaged_dmi]'") var/list/broken_states = instanced_turf.broken_states() for(var/state in broken_states) - if(!(state in icon_states(damaged_dmi))) + if(!icon_exists(damaged_dmi, state)) TEST_FAIL("[open_turf_path] has an invalid icon in broken_states - \"[state]\", in '[damaged_dmi]'") run_loc_floor_bottom_left = run_loc_floor_bottom_left.ChangeTurf(initial_turf_type) //cleanup. diff --git a/code/modules/uplink/uplink_items/dangerous.dm b/code/modules/uplink/uplink_items/dangerous.dm index 092ec4c384782..e99ae651e2fbb 100644 --- a/code/modules/uplink/uplink_items/dangerous.dm +++ b/code/modules/uplink/uplink_items/dangerous.dm @@ -21,7 +21,7 @@ name = "Makarov Pistol Case" desc = "A weapon case containing an unknown variant of the Makarov pistol, along with two spare magazines and a box of loose 9mm ammunition. \ Chambered in 9mm. Perfect for frequent skirmishes with security, as well as ensuring you have enough firepower to outlast the competition. \ - While not included in the kit, the pistol is compatible with suppressors, which can be purchased seperately." + While not included in the kit, the pistol is compatible with suppressors, which can be purchased separately." item = /obj/item/storage/toolbox/guncase/traitor cost = 7 purchasable_from = ~UPLINK_ALL_SYNDIE_OPS diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm index 935461509ab5d..27102826c562a 100644 --- a/code/modules/uplink/uplink_items/job.dm +++ b/code/modules/uplink/uplink_items/job.dm @@ -192,7 +192,7 @@ /datum/uplink_item/role_restricted/advanced_plastic_surgery name = "Advanced Plastic Surgery Program" - desc = "A bootleg copy of an collector item, this disk contains the procedure to perform advanced plastic surgery, allowing you to model someone's face and voice based on a picture taken by a camera on your offhand. \ + desc = "A bootleg copy of a collector item, this disk contains the procedure to perform advanced plastic surgery, allowing you to model someone's face and voice based on a picture taken by a camera on your offhand. \ All changes are superficial and does not change ones genetic makeup. \ Insert into an Operating Console to enable the procedure." item = /obj/item/disk/surgery/advanced_plastic_surgery diff --git a/code/modules/uplink/uplink_items/nukeops.dm b/code/modules/uplink/uplink_items/nukeops.dm index ca017a552fd68..715990a72814b 100644 --- a/code/modules/uplink/uplink_items/nukeops.dm +++ b/code/modules/uplink/uplink_items/nukeops.dm @@ -578,14 +578,14 @@ /datum/uplink_item/mech/support_bag name = "Mech Support Kit Bag" - desc = "A duffel bag containing ammo for four full reloads of the scattershotm which is equipped on standard Dark Gygax and Mauler exosuits. Also comes with some support equipment for maintaining the mech, including tools and an inducer." + desc = "A duffel bag containing ammo for four full reloads of the scattershot carbine which is equipped on standard Dark Gygax and Mauler exosuits. Also comes with some support equipment for maintaining the mech, including tools and an inducer." item = /obj/item/storage/backpack/duffelbag/syndie/ammo/mech cost = 4 purchasable_from = UPLINK_SERIOUS_OPS /datum/uplink_item/mech/support_bag/mauler name = "Mauler Ammo Bag" - desc = "A duffel bag containing ammo for three full reloads of the LMG, scattershot carbine, and SRM-8 missile laucher that are equipped on a standard Mauler exosuit." + desc = "A duffel bag containing ammo for three full reloads of the LMG, scattershot carbine, and SRM-8 missile launcher that are equipped on a standard Mauler exosuit." item = /obj/item/storage/backpack/duffelbag/syndie/ammo/mauler cost = 6 purchasable_from = UPLINK_SERIOUS_OPS diff --git a/code/modules/vehicles/cars/vim.dm b/code/modules/vehicles/cars/vim.dm index e762aec22bd5e..7cb6d4b939c62 100644 --- a/code/modules/vehicles/cars/vim.dm +++ b/code/modules/vehicles/cars/vim.dm @@ -1,12 +1,12 @@ /** * ## VIM!!!!!!! * - * It's a teenie minature mecha... for critters! + * It's a teenie miniature mecha... for critters! * For the critters that cannot be understood, there is a sound creator in the mecha. It also has headlights. */ /obj/vehicle/sealed/car/vim name = "\improper Vim" - desc = "An minature exosuit from Nanotrasen, developed to let the irreplacable station pets live a little longer." + desc = "A miniature exosuit from Nanotrasen, developed to let the irreplaceable station pets live a little longer." icon_state = "vim" max_integrity = 50 armor_type = /datum/armor/car_vim @@ -118,7 +118,7 @@ /obj/item/circuit_component/vim display_name = "Vim" - desc = "An minature exosuit from Nanotrasen, developed to let the irreplacable station pets live a little longer." + desc = "A miniature exosuit from Nanotrasen, developed to let the irreplaceable station pets live a little longer." /// Sent when the mech chimes. var/datum/port/output/chime diff --git a/code/modules/vehicles/mecha/combat/justice.dm b/code/modules/vehicles/mecha/combat/justice.dm index 5dbe4ac890e98..a57efa1844ec7 100644 --- a/code/modules/vehicles/mecha/combat/justice.dm +++ b/code/modules/vehicles/mecha/combat/justice.dm @@ -459,12 +459,13 @@ * * charger - occupant inside mech. * * target - occupant inside mech. */ -/datum/action/vehicle/sealed/mecha/charge_attack/proc/charge_attack(mob/living/charger, turf/target) +/datum/action/vehicle/sealed/mecha/charge_attack/proc/charge_attack(mob/living/charger, atom/target) var/turf/start_charge_here = get_turf(charger) - var/charge_range = min(get_dist_euclidean(start_charge_here, target), max_charge_range) - var/turf/but_we_gonna_here = get_ranged_target_turf(start_charge_here, get_dir(start_charge_here, target), floor(charge_range)) + var/turf/target_pos = get_turf(target) var/turf/here_we_go = start_charge_here - for(var/turf/line_turf in get_line(get_step(start_charge_here, get_dir(start_charge_here, target)), but_we_gonna_here)) + for(var/turf/line_turf in get_line(start_charge_here, target_pos)) + if(floor(get_dist_euclidean(start_charge_here, line_turf)) > max_charge_range) + break if(get_turf(charger) == get_turf(line_turf)) continue if(isclosedturf(line_turf)) diff --git a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm b/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm index 6a11ace4f6225..4cef8d0bf1343 100644 --- a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm @@ -237,12 +237,6 @@ STOP_PROCESSING(SSobj, src) return ..() -/// Handles detaching signal hooks incase someone is crazy enough to make this edible. -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/on_reagents_del(datum/reagents/reagents) - SIGNAL_HANDLER - UnregisterSignal(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_REM_REAGENT, COMSIG_QDELETING)) - return NONE - /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/detach() STOP_PROCESSING(SSobj, src) return ..() diff --git a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm index a0a1e7443acbb..13034c4b3ec34 100644 --- a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm @@ -27,7 +27,7 @@ /obj/item/mecha_parts/mecha_equipment/wormhole_generator name = "mounted wormhole generator" - desc = "An exosuit module that allows generating of small quasi-stable wormholes, allowing for long-range inneacurate teleportation." + desc = "An exosuit module that allows generating of small quasi-stable wormholes, allowing for long-range inaccurate teleportation." icon_state = "mecha_wholegen" equip_cooldown = 50 energy_drain = 300 diff --git a/code/modules/vehicles/mecha/mecha_ai_interaction.dm b/code/modules/vehicles/mecha/mecha_ai_interaction.dm index f43a11903a950..9457357840cb4 100644 --- a/code/modules/vehicles/mecha/mecha_ai_interaction.dm +++ b/code/modules/vehicles/mecha/mecha_ai_interaction.dm @@ -40,7 +40,7 @@ for(var/mob/living/silicon/ai/aipilot in occupants) ai_pilots += aipilot if(!length(ai_pilots)) //Mech does not have an AI for a pilot - to_chat(user, span_warning("No AI detected in the [name] onboard computer.")) + to_chat(user, span_warning("No AI detected in \the [src]'s onboard computer.")) return if(length(ai_pilots) > 1) //Input box for multiple AIs, but if there's only one we'll default to them. AI = tgui_input_list(user, "Which AI do you wish to card?", "AI Selection", sort_list(ai_pilots)) diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm index d7f52915a4b2b..547ae21eba4ae 100644 --- a/code/modules/vehicles/mecha/mecha_defense.dm +++ b/code/modules/vehicles/mecha/mecha_defense.dm @@ -481,7 +481,7 @@ else gun.projectiles_cache = gun.projectiles_cache + ammo_needed playsound(get_turf(user),A.load_audio,50,TRUE) - to_chat(user, span_notice("You add [ammo_needed] [A.ammo_type][ammo_needed > 1?"s":""] to the [gun.name]")) + to_chat(user, span_notice("You add [ammo_needed] [A.ammo_type][ammo_needed > 1?"s":""] to \the [gun]")) A.rounds = A.rounds - ammo_needed if(A.custom_materials) //Change material content of the ammo box according to the amount of ammo deposited into the weapon /// list of materials contained in the ammo box after we put it through the equation so we can stick this list into set_custom_materials() @@ -500,7 +500,7 @@ else gun.projectiles_cache = gun.projectiles_cache + A.rounds playsound(get_turf(user),A.load_audio,50,TRUE) - to_chat(user, span_notice("You add [A.rounds] [A.ammo_type][A.rounds > 1?"s":""] to the [gun.name]")) + to_chat(user, span_notice("You add [A.rounds] [A.ammo_type][A.rounds > 1?"s":""] to \the [gun]")) if(A.qdel_on_empty) qdel(A) return TRUE diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 0d9ba49384b27..f0393f09347ec 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -1437,7 +1437,7 @@ GLOBAL_LIST_EMPTY(vending_machines_to_restock) vend_ready = TRUE return - if(!proceed_payment(card_used, living_user, item_record, price_to_use)) + if(!proceed_payment(card_used, living_user, item_record, price_to_use, params["discountless"])) vend_ready = TRUE return @@ -1499,13 +1499,14 @@ GLOBAL_LIST_EMPTY(vending_machines_to_restock) * mob_paying - the mob that is trying to purchase the item. * product_to_vend - the product record of the item we're trying to vend. * price_to_use - price of the item we're trying to vend. + * discountless - whether or not to apply discounts */ -/obj/machinery/vending/proc/proceed_payment(obj/item/card/id/paying_id_card, mob/living/mob_paying, datum/data/vending_product/product_to_vend, price_to_use) +/obj/machinery/vending/proc/proceed_payment(obj/item/card/id/paying_id_card, mob/living/mob_paying, datum/data/vending_product/product_to_vend, price_to_use, discountless) if(QDELETED(paying_id_card)) //not available(null) or somehow is getting destroyed speak("You do not possess an ID to purchase [product_to_vend.name].") return FALSE var/datum/bank_account/account = paying_id_card.registered_account - if(account.account_job && account.account_job.paycheck_department == payment_department) + if(account.account_job && account.account_job.paycheck_department == payment_department && !discountless) price_to_use = max(round(price_to_use * DEPARTMENT_DISCOUNT), 1) //No longer free, but signifigantly cheaper. if(LAZYLEN(product_to_vend.returned_products)) price_to_use = 0 //returned items are free diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm index 21f61f9a98b28..bcc44dfedf91a 100644 --- a/code/modules/vending/cola.dm +++ b/code/modules/vending/cola.dm @@ -1,7 +1,7 @@ /obj/machinery/vending/cola name = "\improper Robust Softdrinks" - desc = "A softdrink vendor provided by Robust Industries, LLC." + desc = "A soft drinks vendor provided by Robust Industries, LLC." icon_state = "Cola_Machine" panel_type = "panel2" product_slogans = "Robust Softdrinks: More robust than a toolbox to the head!" diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index a5f2c84920d24..840f9dcefb8ef 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -56,6 +56,7 @@ /obj/item/book/manual/fish_catalog = 5, /obj/item/reagent_containers/cup/fish_feed = 4, /obj/item/fish_analyzer = 2, + /obj/item/storage/bag/fishing = 2, /obj/item/fishing_rod/telescopic = 1, /obj/item/fish_tank = 1, ), diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm index a86f5562862d9..bf0b9dbee3862 100644 --- a/code/modules/vending/security.dm +++ b/code/modules/vending/security.dm @@ -17,6 +17,7 @@ /obj/item/restraints/legcuffs/bola/energy = 7, /obj/item/clothing/gloves/tackler = 5, /obj/item/holosign_creator/security = 2, + /obj/item/gun_maintenance_supplies = 2, ) contraband = list( /obj/item/clothing/glasses/sunglasses = 2, diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 5c7fd7fc60b5d..634639d8bed89 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -309,7 +309,7 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) /obj/machinery/vending/wardrobe/curator_wardrobe name = "CuraDrobe" - desc = "A lowstock vendor only capable of vending clothing for curators and librarians." + desc = "A low-stock vendor only capable of vending clothing for curators and librarians." icon_state = "curadrobe" product_ads = "Glasses for your eyes and literature for your soul, Curadrobe has it all!; Impress & enthrall your library guests with Curadrobe's extended line of pens!" vend_reply = "Thank you for using the CuraDrobe!" @@ -636,7 +636,7 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) /obj/machinery/vending/wardrobe/viro_wardrobe name = "ViroDrobe" - desc = "An unsterilized machine for dispending virology related clothing." + desc = "An unsterilized machine for dispensing virology related clothing." icon_state = "virodrobe" product_ads = " Viruses getting you down? Then upgrade to sterilized clothing today!" vend_reply = "Thank you for using the ViroDrobe" diff --git a/code/modules/wiremod/components/action/soundemitter.dm b/code/modules/wiremod/components/action/soundemitter.dm index 676ce8744385f..144a56295dd90 100644 --- a/code/modules/wiremod/components/action/soundemitter.dm +++ b/code/modules/wiremod/components/action/soundemitter.dm @@ -33,11 +33,19 @@ var/list/options_map +/obj/item/circuit_component/soundemitter/Initialize(mapload) + if(CONFIG_GET(flag/disallow_circuit_sounds)) + update_ui_alerts(new_flag=CIRCUIT_FLAG_DISABLED) + . = ..() + /obj/item/circuit_component/soundemitter/get_ui_notices() . = ..() . += create_ui_notice("Sound Cooldown: [DisplayTimeText(sound_cooldown)]", "orange", "stopwatch") if(CONFIG_GET(flag/disallow_circuit_sounds)) . += create_ui_notice("Non-functional", "red", "exclamation") + update_ui_alerts(new_flag=CIRCUIT_FLAG_DISABLED) + else + update_ui_alerts(remove_flag=CIRCUIT_FLAG_DISABLED) /obj/item/circuit_component/soundemitter/populate_ports() @@ -79,10 +87,11 @@ /obj/item/circuit_component/soundemitter/input_received(datum/port/input/port) if(CONFIG_GET(flag/disallow_circuit_sounds)) - ui_color = "red" + // Without constantly checking the config 24/7 or sending a signal to every circuit, best we can do to update existing emitters is this. + update_ui_alerts(new_flag=CIRCUIT_FLAG_DISABLED) return else - ui_color = initial(ui_color) + update_ui_alerts(remove_flag=CIRCUIT_FLAG_DISABLED) if(!parent.shell) return diff --git a/code/modules/wiremod/components/bci/hud/bar_overlay.dm b/code/modules/wiremod/components/bci/hud/bar_overlay.dm index 07d13a4ccfb9e..2fbe7620bf754 100644 --- a/code/modules/wiremod/components/bci/hud/bar_overlay.dm +++ b/code/modules/wiremod/components/bci/hud/bar_overlay.dm @@ -10,7 +10,7 @@ /obj/item/circuit_component/object_overlay/bar display_name = "Bar Overlay" - desc = "Requires a BCI shell. A component that shows a bar overlay ontop of an object from a range of 0 to 100." + desc = "Requires a BCI shell. A component that shows a bar overlay atop an object, ranging from 0 to 100." category = "BCI" var/datum/port/input/option/bar_overlay_options diff --git a/code/modules/wiremod/components/bci/hud/counter_overlay.dm b/code/modules/wiremod/components/bci/hud/counter_overlay.dm index aaf70826f4bb0..8fa5be51492fa 100644 --- a/code/modules/wiremod/components/bci/hud/counter_overlay.dm +++ b/code/modules/wiremod/components/bci/hud/counter_overlay.dm @@ -7,7 +7,7 @@ /obj/item/circuit_component/counter_overlay display_name = "Counter Overlay" - desc = "A component that shows an three digit counter. Requires a BCI shell." + desc = "A component that shows a three-digit counter. Requires a BCI shell." category = "BCI" required_shells = list(/obj/item/organ/cyberimp/bci) diff --git a/code/modules/wiremod/core/component.dm b/code/modules/wiremod/core/component.dm index 07f3a5b55a379..7dda865fb6409 100644 --- a/code/modules/wiremod/core/component.dm +++ b/code/modules/wiremod/core/component.dm @@ -64,6 +64,10 @@ /// The UI buttons of this circuit component. An assoc list that has this format: "button_icon" = "action_name" var/ui_buttons = null + /// The "important" UI tooltips of this circuit component. Used for important things like instant & disabled circuits, they're drawn next to the default tooltip icon. + /// An assoc list with the format ui_alerts["alert_icon"] = "alert_name". + var/ui_alerts = list() + /// Called when the option ports should be set up /obj/item/circuit_component/proc/populate_options() return @@ -86,8 +90,7 @@ trigger_input = add_input_port("Trigger", PORT_TYPE_SIGNAL, order = 2) if((circuit_flags & CIRCUIT_FLAG_OUTPUT_SIGNAL) && !trigger_output) trigger_output = add_output_port("Triggered", PORT_TYPE_SIGNAL, order = 2) - if(circuit_flags & CIRCUIT_FLAG_INSTANT) - ui_color = "orange" + update_ui_alerts() /obj/item/circuit_component/Destroy() if(parent) @@ -113,6 +116,21 @@ if(circuit_flags & CIRCUIT_FLAG_REFUSE_MODULE) . += span_notice("It's incompatible with module components.") +/// updates the ui alerts in the given component. new_flag adds flags, remove_flag removes them +/obj/item/circuit_component/proc/update_ui_alerts(new_flag, remove_flag) + if(new_flag) + circuit_flags |= new_flag + if(remove_flag) + circuit_flags &= ~remove_flag + if(circuit_flags & CIRCUIT_FLAG_INSTANT) + ui_alerts["tachometer-alt"] = "Instant" + else + ui_alerts -= "tachometer-alt" + if(circuit_flags & CIRCUIT_FLAG_DISABLED) + ui_alerts["exclamation"] = "Non-functional" + else + ui_alerts -= "exclamation" + /** * Called when a shell is registered from the component/the component is added to a circuit. * diff --git a/code/modules/wiremod/core/integrated_circuit.dm b/code/modules/wiremod/core/integrated_circuit.dm index 1023a59eb2100..dfaef0abcaa47 100644 --- a/code/modules/wiremod/core/integrated_circuit.dm +++ b/code/modules/wiremod/core/integrated_circuit.dm @@ -380,6 +380,8 @@ GLOBAL_LIST_EMPTY_TYPED(integrated_circuits, /obj/item/integrated_circuit) component_data["y"] = component.rel_y component_data["removable"] = component.removable component_data["color"] = component.ui_color + component_data["category"] = component.category + component_data["ui_alerts"] = component.ui_alerts component_data["ui_buttons"] = component.ui_buttons .["components"] += list(component_data) diff --git a/config/config.txt b/config/config.txt index 91a4e6aa51573..38368d5513420 100644 --- a/config/config.txt +++ b/config/config.txt @@ -177,8 +177,12 @@ IPINTEL_REJECT_BAD ## Set to prevent anyone but those ckeys listed in config/whitelist.txt and config/admins.txt from joining your server #USEWHITELIST +## The address shown for the game server in the TGS check command +# PUBLIC_ADDRESS ss13.example.com:2506 + ## set a server location for world reboot. Don't include the byond://, just give the address and port. ## Don't set this to the same server, BYOND will automatically restart players to the server when it has restarted. +## This is also used to show the server's address in the TGS check command if the public address isn't set # SERVER ss13.example.com:2506 ## forum address diff --git a/config/game_options.txt b/config/game_options.txt index 932593840680c..416aaf9d539f2 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -284,6 +284,7 @@ RANDOM_LAWS corporate #RANDOM_LAWS hulkamania #RANDOM_LAWS ten_commandments #RANDOM_LAWS yesman +#RANDOM_LAWS thinkermov ## Bad idea laws. Probably shouldn't enable these #RANDOM_LAWS syndie @@ -324,6 +325,7 @@ LAW_WEIGHT tyrant,3 LAW_WEIGHT overlord,3 LAW_WEIGHT painter,3 LAW_WEIGHT dungeon_master,3 +LAW_WEIGHT thinkermov,3 ## Bad idea laws. Probably shouldn't enable these LAW_WEIGHT syndie,0 diff --git a/dependencies.sh b/dependencies.sh index 1046b72c12d77..c7086bb55451b 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -3,9 +3,9 @@ #Project dependencies file #Final authority on what's required to fully build the project -# byond version +# byond version. Also must be updated in .tgs.yml export BYOND_MAJOR=515 -export BYOND_MINOR=1637 +export BYOND_MINOR=1647 #rust_g git tag export RUST_G_VERSION=3.5.1 diff --git a/html/changelogs/AutoChangeLog-pr-88489.yml b/html/changelogs/AutoChangeLog-pr-88489.yml deleted file mode 100644 index 4e99c93de541f..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-88489.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixed single-use spectral instruments losing their powers before skeletonizing anyone." - - rscadd: "A very rare spooky suffix for mythril items and the wizard RPG event." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-88714.yml b/html/changelogs/AutoChangeLog-pr-88714.yml deleted file mode 100644 index a36e42c37e426..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-88714.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "mc-oofert" -delete-after: True -changes: - - rscadd: "outpost 31, the icebox ruin. Also its associated mobs, and megafauna, and loot. Im not spoiling anything, find it yourself." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-88860.yml b/html/changelogs/AutoChangeLog-pr-88860.yml deleted file mode 100644 index 2fd3537480d43..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-88860.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "carlarctg" -delete-after: True -changes: - - rscadd: "Added two new fish to heretic rift fishing." - - rscadd: "You can now fish up arms, heads, and other items lost to heretic rifts!" - - admin: "objectify() now works with instances of objects. Mark a player, then an object, and use those marks to call that global proc and you can turn people into pre-existing items." - - rscadd: "Psychic resistance now prevents the instadeath from trying to telekinetically grasp at a opened rift." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-88935.yml b/html/changelogs/AutoChangeLog-pr-88935.yml deleted file mode 100644 index fed414acbf745..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-88935.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "StrangeWeirdKitten" -delete-after: True -changes: - - bugfix: "Fixes uncapped xenobio slime multiplication which can easily result in hundreds of slimes." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-89079.yml b/html/changelogs/AutoChangeLog-pr-89079.yml deleted file mode 100644 index 39d5c4fad3b53..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-89079.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "jlsnow301" -delete-after: True -changes: - - bugfix: "Fixed some bugs in the malf ai screen: one bluescreen, an extra colon, modules view" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-89081.yml b/html/changelogs/AutoChangeLog-pr-89081.yml deleted file mode 100644 index 8c5d863c2f565..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-89081.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Absolucy" -delete-after: True -changes: - - admin: "Added a new function in Lua scripting, SS13.check_tick, to avoid causing too much lag during loops and such." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-89098.yml b/html/changelogs/AutoChangeLog-pr-89098.yml deleted file mode 100644 index 8ef4038a73557..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-89098.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Jacquerel" -delete-after: True -changes: - - balance: "Phobias are now somewhat less debilitating, although their effects get worse the longer you are near a fear trigger." - - balance: "Carphobes are now afraid of all fish." - - rscdel: "Remove the Heretic phobia, as it is now basically unused." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-89099.yml b/html/changelogs/AutoChangeLog-pr-89099.yml deleted file mode 100644 index fa5f745afa077..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-89099.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Absolucy" -delete-after: True -changes: - - qol: "Restyled the Who, Adminwho, and Show Server Revision verbs to be prettier." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-89109.yml b/html/changelogs/AutoChangeLog-pr-89109.yml deleted file mode 100644 index 0b91701e6eba3..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-89109.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - bugfix: "chemical reactions can now go all the way to their min required temp/ph" - - code_imp: "improved code for debug chem master." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-89120.yml b/html/changelogs/AutoChangeLog-pr-89120.yml deleted file mode 100644 index 7502cfb609e89..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-89120.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MichiRecRoom" -delete-after: True -changes: - - qol: "pAIs can now withdraw their candidacy at any time." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-89121.yml b/html/changelogs/AutoChangeLog-pr-89121.yml deleted file mode 100644 index 5575a4642cfcc..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-89121.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Likteer" -delete-after: True -changes: - - rscdel: "Removed vending products shortage station trait" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-89146.yml b/html/changelogs/AutoChangeLog-pr-89146.yml deleted file mode 100644 index fd4a423865d5e..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-89146.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "JohnFulpWillard" -delete-after: True -changes: - - balance: "AIs can now examine through their eye." - - bugfix: "Dullahans can also examine through their head again." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-89147.yml b/html/changelogs/AutoChangeLog-pr-89147.yml deleted file mode 100644 index 2835439df2c55..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-89147.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Jacquerel" -delete-after: True -changes: - - balance: "Dark Wizards now teleport when attacked, but are more likely to turn on their allies" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-89158.yml b/html/changelogs/AutoChangeLog-pr-89158.yml deleted file mode 100644 index 3b565b442226e..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-89158.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Jacquerel" -delete-after: True -changes: - - refactor: "The Cytology Vatbeast now uses the basic mob framework, please report any unusual behaviour." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-89159.yml b/html/changelogs/AutoChangeLog-pr-89159.yml deleted file mode 100644 index d3ac434e0a49e..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-89159.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Seefaaa" -delete-after: True -changes: - - admin: "added Space Dragon role to the banning panel" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-89162.yml b/html/changelogs/AutoChangeLog-pr-89162.yml deleted file mode 100644 index f820a83012843..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-89162.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MichiRecRoom" -delete-after: True -changes: - - bugfix: "Word phobias should always apply now, rather than occasionally being missed." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-89166.yml b/html/changelogs/AutoChangeLog-pr-89166.yml deleted file mode 100644 index 275a15c912af2..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-89166.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Absolucy" -delete-after: True -changes: - - qol: "Removed the arbitrary limit of 10 maximum highlights." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-89168.yml b/html/changelogs/AutoChangeLog-pr-89168.yml deleted file mode 100644 index 875982c404614..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-89168.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MX0739" -delete-after: True -changes: - - bugfix: "objects with throw_range 0 now properly parried with baseball bats" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-89174.yml b/html/changelogs/AutoChangeLog-pr-89174.yml deleted file mode 100644 index 2e19289c21d6f..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-89174.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - qol: "Snapping tethers now also removes their beacons" - - qol: "You can now cut tethers that you're attached to while in motion" - - qol: "Tethers now snap when you retract your gloves or disable your MODsuit" - - bugfix: "Fixed tether stacking issues" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-89175.yml b/html/changelogs/AutoChangeLog-pr-89175.yml deleted file mode 100644 index 400b08e2b2c1a..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-89175.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - qol: "Action palette no longer disappears while you have floating actions" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-89293.yml b/html/changelogs/AutoChangeLog-pr-89293.yml new file mode 100644 index 0000000000000..66c2d7f07c7ff --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-89293.yml @@ -0,0 +1,4 @@ +author: "grungussuss" +delete-after: True +changes: + - sound: "new sounds for cloth items" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-89367.yml b/html/changelogs/AutoChangeLog-pr-89367.yml new file mode 100644 index 0000000000000..362647e888464 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-89367.yml @@ -0,0 +1,4 @@ +author: "Kiromaka" +delete-after: True +changes: + - balance: "Helbital reaper is now 100x more likely." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-89388.yml b/html/changelogs/AutoChangeLog-pr-89388.yml new file mode 100644 index 0000000000000..21bd6a6b0da48 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-89388.yml @@ -0,0 +1,4 @@ +author: "Rengan" +delete-after: True +changes: + - bugfix: "When you cast examine to the disguised detective, its assignment will now display correctly." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-89427.yml b/html/changelogs/AutoChangeLog-pr-89427.yml new file mode 100644 index 0000000000000..3cdc48fd2353d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-89427.yml @@ -0,0 +1,4 @@ +author: "FlufflesTheDog" +delete-after: True +changes: + - bugfix: "crafted medibots are more consistently corporeal" \ No newline at end of file diff --git a/html/changelogs/archive/2025-01.yml b/html/changelogs/archive/2025-01.yml index 684a41a445705..6278e1a4be47a 100644 --- a/html/changelogs/archive/2025-01.yml +++ b/html/changelogs/archive/2025-01.yml @@ -601,3 +601,247 @@ Vekter: - balance: The roundstart report will now display a more broad, less specific message about threat levels when between 0 and 80 threat. +2025-01-24: + Absolucy: + - qol: Removed the arbitrary limit of 10 maximum highlights. + - qol: Restyled the Who, Adminwho, and Show Server Revision verbs to be prettier. + - admin: Added a new function in Lua scripting, SS13.check_tick, to avoid causing + too much lag during loops and such. + Exester509: + - bugfix: The Stargazer, a cosmic heretic's ascension, can be properly commanded + once more. + - code_imp: Basic mob pets can now target objects, or objects and walls by using + two new targeting strategies. + Ghommie: + - bugfix: Fixed single-use spectral instruments losing their powers before skeletonizing + anyone. + - rscadd: A very rare spooky suffix for mythril items and the wizard RPG event. + Jacquerel: + - refactor: The Cytology Vatbeast now uses the basic mob framework, please report + any unusual behaviour. + - balance: Phobias are now somewhat less debilitating, although their effects get + worse the longer you are near a fear trigger. + - balance: Carphobes are now afraid of all fish. + - rscdel: Remove the Heretic phobia, as it is now basically unused. + - balance: Dark Wizards now teleport when attacked, but are more likely to turn + on their allies + JohnFulpWillard: + - balance: AIs can now examine through their eye. + - bugfix: Dullahans can also examine through their head again. + Likteer: + - rscdel: Removed vending products shortage station trait + MX0739: + - bugfix: objects with throw_range 0 now properly parried with baseball bats + MichiRecRoom: + - qol: pAIs can now withdraw their candidacy at any time. + - bugfix: Word phobias should always apply now, rather than occasionally being missed. + Seefaaa: + - admin: added Space Dragon role to the banning panel + SmArtKar: + - qol: Action palette no longer disappears while you have floating actions + - qol: Snapping tethers now also removes their beacons + - qol: You can now cut tethers that you're attached to while in motion + - qol: Tethers now snap when you retract your gloves or disable your MODsuit + - bugfix: Fixed tether stacking issues + StrangeWeirdKitten: + - bugfix: Fixes uncapped xenobio slime multiplication which can easily result in + hundreds of slimes. + SyncIt21: + - bugfix: chemical reactions can now go all the way to their min required temp/ph + - code_imp: improved code for debug chem master. + carlarctg: + - rscadd: Added two new fish to heretic rift fishing. + - rscadd: You can now fish up arms, heads, and other items lost to heretic rifts! + - admin: objectify() now works with instances of objects. Mark a player, then an + object, and use those marks to call that global proc and you can turn people + into pre-existing items. + - rscadd: Psychic resistance now prevents the instadeath from trying to telekinetically + grasp at a opened rift. + jlsnow301: + - bugfix: 'Fixed some bugs in the malf ai screen: one bluescreen, an extra colon, + modules view' + mc-oofert: + - rscadd: outpost 31, the icebox ruin. Also its associated mobs, and megafauna, + and loot. Im not spoiling anything, find it yourself. +2025-01-25: + Absolucy: + - balance: Simultaneously having traits that both make you easier and harder to + wound will now act like you have neither, resulting in you taking the normal + amount of wound damage. + EEASAS: + - map: modularizes the comms agent ruin on icebox + Gaxeer: + - refactor: replace bubble sort with timsort for cameralist, move global procs to + `cameranet` datum + KingkumaArt: + - qol: Ethereals can now live off wine again. + jlsnow301: + - bugfix: TGUI Say window has been tweaked slightly to look and run cleanly. + - bugfix: The character preferences menu has been greatly refactored, hopefully + opening faster. + necromanceranne: + - rscadd: Cargo can order lethal shotgun shells from the Imports tab, at a premium. + - balance: The black market source for buckshot can get normal types of buckshot, + but some of it can be a bit dodgy. + - balance: Buckshot is now more wound focused over damage. Slugs are now more armor + penetration focused over damage. + - balance: The bulldog shotgun remains otherwise unchanged damage wise, but does + gain the above extra bonuses. + valzargaming: + - bugfix: Typo in path for cavesound3.ogg +2025-01-26: + Profakos: + - bugfix: IEDs can now also be crafted using pipes you have ripped up from the ground. + SmArtKar: + - bugfix: Head IDs now keep the large pointer effect when slotted into a PDA or + displayed as the front ID in a wallet + StrangeWeirdKitten: + - qol: Quirk menu now has a search bar +2025-01-27: + Absolucy: + - refactor: Refactored how quirks handle starting/stopping processing. + - bugfix: Certain status effects, such as stuns and attempting to extinguish fires + via stop, drop & roll, shouldn't last much longer than intended while the server + is under load. + Aniantan: + - spellcheck: Fixed two typos in banded snake's description + ArcaneMusic: + - rscadd: You can now purchase pet mice as a cargo goodie. + - qol: Pet carriers now have contextual screentips. + - bugfix: The biopod pet carrier now doesn't randomly turn invisible. + AyIong: + - bugfix: You can rename supply pod beacon with a any writing tool. + Melbert: + - bugfix: Regen meshes stop when they've done all they can again + MichiRecRoom: + - refactor: Datumized pAI card screen images + OrionTheFox: + - rscadd: Added Directional Firelock Frames, making the tile-edge firelocks properly + repairable/deconstructable. + - bugfix: fixed firelock construction not properly updating icons +2025-01-28: + AyIong: + - bugfix: Premium and contraband products in vending machines, now really has no + discount + Jacquerel: + - refactor: Geese have been moved to the basic mob subsystem, please report any + unusual behaviour. + - bugfix: You can once again teleport dangerously with the hand teleporter + Kashargul: + - bugfix: list input scrolls into view again when using the array keys for navigation + - bugfix: Using letter keys while focussing the list focusses the search bar again + Maximal08: + - rscadd: TRAIT_NOSOFTCRIT now blocks falling into a regenerative coma. + TiviPlus: + - bugfix: fixed a case that could make untoggling fullscreen make your window small + - code_imp: Cleaned up some fullscreen and status bar toggle code to function better + dj-34: + - bugfix: Fixed shuttle parallax when a mob is standing still. + grungussuss: + - sound: headsets now have sounds + vinylspiders: + - bugfix: changes made in quirks menu will now reflect properly upon tabbing away + and then back again to the quirks tab, without having to close the entire preferences + menu +2025-01-29: + MX0739: + - bugfix: Fixed Justice mech's dash ability + Melbert: + - qol: '"Who" and "Adminwho" are typed as "Info" and not "OOC" (so they no longer + go to "OOC" tabs)' + - qol: '"Tip of the Round" and "Show Server Revision" are also typed as "Info", + rather than "OOC" and untyped respectively' + SmArtKar: + - bugfix: Fixed evidence bag not reverting to tiny size after dumping its contents + out + SyncIt21: + - bugfix: hydrophonics circuit component actually sets output level when reagents + are changed in the tray + - refactor: refactors how code listens for reagent changes. Report bugs on github + - bugfix: adding/transferring reagent amounts less than 0.01 now won't return false + results + - code_imp: removed excessive rounding of reagent volumes thus slightly improving + performance + vinylspiders: + - bugfix: due to a number of complaints of fish explosions, chrystarfish will no + longer be chosen as the random starting fish for the fish mount. +2025-01-30: + Absolucy: + - bugfix: Being on fire or wet should no longer last much longer than intended while + the server is under load. + FlufflesTheDog: + - bugfix: PDA ringtones can be changed in-game + JohnFulpWillard: + - qol: The wiki books for users on 516 no longer opens the page on an external website + on your browser. + MTandi: + - bugfix: mouse corpse can be used to summon codex citatrix + - image: New medbot sprites + - image: New stacked medibot borg skin sprite + OrionTheFox: + - image: resprited Extinguisher Cabinets (did you know there's craftable Extinguishers? + "Improvised cooling spray"? I didn't. Now I do though, and so do you!) + SmArtKar: + - bugfix: Springlock MODule now only activates when you have at least a single sealed + piece + - bugfix: Springlock MODule no longer damages bodyparts not covered by your MODsuit + - qol: Fishing minigame should be smoother now + - bugfix: Fixed infinitely stacking examine lines on advanced fishing rods + - image: Resprited fishing UI + - image: Blue doughballs now have their own fishing rod overlay + - image: Resprited mansus rift fishing portal overlay + - bugfix: Fixed crafting menu not changing the cursor when hovered over + SyncIt21: + - bugfix: quirks work again + - bugfix: fixes balloon alert runtimes with assembly holder + TiviPlus: + - bugfix: fixed timestamps being timezone sensitive + - admin: due to this bug some logs may have been timestamped incorrectly +2025-01-31: + 00-Steven: + - refactor: Bitrunning item/ability loading has been refactored. Please report any + issues. + - rscadd: Added Bitrunning gimmick loadout disks. These disks contain full sets + of equipment for all your digital cosplay needs, each including questionably + helpful equipment. Currently includes Sports (Boxer, Skater, Archer, Fisher, + Gamer) and Dungeon Crawling (Alchemist, Rogue, Healer, Wizard). + - rscadd: Taking a lead acid battery into the netpod with you now gives your bit + avatar shock touch. + ArcaneMusic: + - rscadd: Stations in your sector may start with the GMM spotlight, a massive economic + broadcast spotlight that will follow the wealthiest crewmate on board until + the next paycheck + AyIong: + - qol: Supply console got little redesign, and ability to see what can be inside + a order. + - code_imp: Supply console and express supply console, now use a unified method + of acquiring data + Ben10Omintrix: + - bugfix: fixes megafauna instantly attacking people adjacent to them + GwynCodes: + - spellcheck: removed the word "autist" from a forced say effect. + Holoo-1: + - bugfix: fixed shadows on 516 + Jacquerel: + - rscadd: Adds a new random lawset where anything that can speak counts as human. + Melbert: + - qol: Using items on cyborgs now use balloon alerts instead of chat messages. + - bugfix: You can flash cyborgs again + - refactor: Refactored item interaction on cyborgs. + SmArtKar: + - bugfix: Fixed a missing area in the corner of icebox morgue + - rscadd: You can wear voidwalker's skull on your head now + - bugfix: Void curse no longer colors stars in your skin color + - bugfix: Fixed issues with window tinting/coloration + SyncIt21: + - bugfix: Herignis has a decent heating effect on mobs reagents + Zenitheevee: + - bugfix: adds Ignored Factions to pellet cloud component variable transfer + necromanceranne: + - bugfix: You can no longer circumvent your honorbound oath by starting a surgery + on someone. + vinylspiders: + - bugfix: fixed PAIs not being able to send or reply to messages using their digital + messenger app. + - bugfix: fixed PAIs not being able to turn off the GPS tracking using their gpa + app. diff --git a/html/changelogs/archive/2025-02.yml b/html/changelogs/archive/2025-02.yml new file mode 100644 index 0000000000000..b55f09015516a --- /dev/null +++ b/html/changelogs/archive/2025-02.yml @@ -0,0 +1,174 @@ +2025-02-01: + AyIong: + - qol: 'You can choose in preferences what layout use into the Smartfridge or Vending + machines: Grid or List. Default TGUI Layout preference. In the future there + may be more interfaces where there will be 2 layout options. Also Vending UI + now use Grid layout by default.' + BobDABuilder9001: + - balance: solars now make 2.5kw each instead of 1.5kw + MTandi: + - qol: Added forensic scanner UI + - qol: Made forensic scanner report format cleaner + Majkl-J: + - bugfix: PENLITE defib mounts now actually charge the cell + SmArtKar: + - image: Premium Internals Boxes station trait now has unique box sprites +2025-02-02: + Arceniu: + - spellcheck: Replaced the words "Singularity Generation Disk" with "Supermatter + Crystal Shard" on a paper found by the old station ruin, to match the contents + of the inventory room. + MTandi: + - bugfix: Fixed medbot emag VFX + SmArtKar: + - bugfix: Large fish should not render behind their wall mounts now + - rscadd: Added fishing bags, found in fun vendors or made from carpskin. + - balance: Added the generator aquarium upgrade to service and science lathes. + - image: Resprited reels and bobber + - bugfix: Fixed partially missing fishing UI + - bugfix: Fixed glowsticks not working + necromanceranne: + - rscdel: Mobile hollow bioscramblers no longer spawn from the anomaly research + ruin, sparing everyone from the inevitable unannounced arrival of a permanent + hollow bioscrambler aboard the station. You maybe still encounter immobile bioscramblers + in the ruin, however. + zoomachina: + - bugfix: showers wash things under them when they're turned on again +2025-02-03: + Absolucy: + - bugfix: Random messages should no longer be dropped and not appear in chat. + SmArtKar: + - bugfix: Fixed an issue with persisting brimbeams + jlsnow301: + - bugfix: Character pref dropdowns should have their display names fixed + necromanceranne: + - balance: The force of most standard varieties of toolboxes has increased from + 12 to 13 force. + - code_imp: Removed some magic numbers from the calculations for ancient toolboxes + damage scaling. + siliconOpossum: + - bugfix: Lathes interfaces are no longer unscrollable on 516 +2025-02-04: + necromanceranne: + - bugfix: Allows MOD holsters to once again activate while the modsuit is inactive + and undeployed. +2025-02-05: + Melbert: + - qol: Map vote tallies explains how they work if you hover them +2025-02-06: + Absolucy: + - bugfix: Void Cloaks now properly hide blades and such in the suit storage from + the wearer's sprite. + Ben10Omintrix: + - bugfix: fixes virtual pet app changing PDA's colors when open + Exester509: + - map: The Syndicate Lavaland base has been generally improved, with more defenses + and comms equipment. + Gaxeer: + - bugfix: fix image display in `NT IRN` PDA app for preview and contents + Holoo-1: + - bugfix: fixed state laws window on 516 + Jacquerel: + - bugfix: AI-controlled ventcrawling mobs (botanical spiderlings and legioned monkeys) + can once more do so without killing themselves shortly afterwards. + JohnFulpWillard: + - bugfix: Autolathes no longer have a scrollbar that sends you off the screen. + - bugfix: Exosuit fabricators' queue list & Techfab/Autolathe's left side (with + the sections of printables) now have a scrollbar when the full list doesn't + fit on the UI for 516 users. Techfab/Autolathe also now does this for the list + of items too, instead of always having one. + SmArtKar: + - bugfix: Tactical medkits should no longer create invisible medbots + - image: Implemented the missing bezerk medbot skin + - bugfix: Fixed another two missing areas on icebox + - bugfix: Fixed incorrect power consumption on reagent grinders + - bugfix: Fixed wrong area/wall in Icemoon Underground + - map: Added cooling loops and cold tiles to all kitchen freezers that were missing + them + - bugfix: Fixed plant analyzers not being placeable on tables/in backpacks + - bugfix: Fixed stunprod's missing inhands sprite + TiviPlus: + - bugfix: fixed some admin links not working on 516 + Y0SH1M4S73R: + - bugfix: Joining a minigame or taking certain ghost roles, while you have a mind + without a body, will no longer DNR you, just in case you can be resurrected + by some means. + - bugfix: If your old body is permanently destroyed while you are playing a minigame + or as certain ghost roles, you will still return to your character's original + mind, just in case you can be resurrected by some means. + - bugfix: The basketball minigame now gives its players and referee temporary bodies. +2025-02-07: + Runi-c: + - balance: slips now make you eligible for being shove stunned + SmArtKar: + - balance: Removed an oversight which allowed you to farm fishing achievements + TiviPlus: + - server: An issue where more than 16 admin flags could not exist in the DB has + been corrected +2025-02-08: + Absolucy: + - bugfix: Fixed some mistakes I made while fixing the void cloak. + Holoo-1: + - bugfix: fixed camera consoles, spyglasses etc. client crush on 516 + MTandi: + - qol: Tile context menu tweaks (Loot panel) + Thunder12345: + - map: Removed a mounted machine gun from the Meta Central bitrunning domain, expect + 85% less instant wipes. + Wallem: + - qol: Integrated Circuit nodes are now colored depending on their type. + necromanceranne: + - balance: Hunter boxing now directly heals you instead of injecting you with healing + chems on a successful crit. + - balance: Your combos no longer cause you to screw up your next combo by changing + your attack speed for exactly one punch. + - code_imp: Fixes up a bit of odd rounding that occurs in the experience gain totals + and uses division instead of multipliers where it makes sense. + - refactor: Gun maintenance is now consolidated into a single item, the gun maintenance + kit, rather than multiple different item interactions. It is handled on the + maintenance kit itself, and not in gun code. + - qol: You can order maintenance kits from cargo, and get some out of the security + equipment vendor. Helpful if someone spilled acid onto your disabler. You can + also make a makeshift one from maintenance trash. + vinylspiders: + - qol: alien eggs (xeno embryos, headslugs, etc) will now show up on the advanced + medical scanner +2025-02-09: + Likteer: + - qol: Added the resin mister module to the roundstart atmos MODsuit. + Melbert: + - rscadd: Adds two fantasy affixes + SmArtKar: + - rscadd: Hydrogen Peroxide and Eldritch Essence now can rust turfs, with latter + producing heretic instead of normal rust. + - spellcheck: Fixed a misspelled comment and a reference to non-existent Eldritch + water (as opposed to Eldritch Essence) + TealSeer: + - bugfix: Fixed the crystallizer missing pipe connectors + grungussuss: + - sound: gauze now makes sounds when applied + loganuk: + - qol: Pyro Slime Objective Text Edit + necromanceranne: + - code_imp: Removes a variable in the riddable creature component that shouldn't + be doing what it is doing. + timothymtorres: + - code_imp: Add error message logs to screenshot CI test failure when screenshots + do not exist. +2025-02-10: + SmArtKar: + - bugfix: Fixed missing HTML encodes in comms console code + - bugfix: Examining walls no longer allows you to see items mounted on its other + side + TiviPlus: + - code_imp: updated hslify to correctly detect all hexcodes + necromanceranne: + - bugfix: The traitor guncase properly checks for condition changes before letting + a player activate the time bomb. +2025-02-11: + SmArtKar: + - bugfix: Fixed wooden rifle stock being uncraftable + - bugfix: Fixed exceptionally dark armrests on chairs + - bugfix: Fixed dress and gown rendering below gloves and shoes + Time-Green: + - rscdel: Reverts sneeze projectiles diff --git a/icons/effects/light_overlays/light_64.dmi b/icons/effects/light_overlays/light_64.dmi index 37fc5084abcf3..f0d099f6d0882 100644 Binary files a/icons/effects/light_overlays/light_64.dmi and b/icons/effects/light_overlays/light_64.dmi differ diff --git a/icons/effects/mapping_helpers.dmi b/icons/effects/mapping_helpers.dmi index c415d4dcff1f4..cd8d331a5e7e6 100644 Binary files a/icons/effects/mapping_helpers.dmi and b/icons/effects/mapping_helpers.dmi differ diff --git a/icons/effects/random_spawners.dmi b/icons/effects/random_spawners.dmi index d6e06fb140d04..8d0a004e22f96 100644 Binary files a/icons/effects/random_spawners.dmi and b/icons/effects/random_spawners.dmi differ diff --git a/icons/hud/fishing_hud.dmi b/icons/hud/fishing_hud.dmi index 84f739f9db228..2d1aff9ea6360 100644 Binary files a/icons/hud/fishing_hud.dmi and b/icons/hud/fishing_hud.dmi differ diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi index 8d70197537c52..7bb42a56a1439 100644 Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ diff --git a/icons/mob/clothing/head/helmet.dmi b/icons/mob/clothing/head/helmet.dmi index 05fe660a33a29..90fdc538c7dea 100644 Binary files a/icons/mob/clothing/head/helmet.dmi and b/icons/mob/clothing/head/helmet.dmi differ diff --git a/icons/mob/silicon/aibots.dmi b/icons/mob/silicon/aibots.dmi index 819eecea0b739..b0bc6261f6de5 100644 Binary files a/icons/mob/silicon/aibots.dmi and b/icons/mob/silicon/aibots.dmi differ diff --git a/icons/mob/silicon/robots.dmi b/icons/mob/silicon/robots.dmi index 33a6892a986f6..770e271fc45e2 100644 Binary files a/icons/mob/silicon/robots.dmi and b/icons/mob/silicon/robots.dmi differ diff --git a/icons/obj/doors/edge_Doorfire.dmi b/icons/obj/doors/edge_Doorfire.dmi index bb6bee3fc8712..b4866a0951b5b 100644 Binary files a/icons/obj/doors/edge_Doorfire.dmi and b/icons/obj/doors/edge_Doorfire.dmi differ diff --git a/icons/obj/fishing.dmi b/icons/obj/fishing.dmi index 59c40c02103c7..189b27873aa7a 100644 Binary files a/icons/obj/fishing.dmi and b/icons/obj/fishing.dmi differ diff --git a/icons/obj/machines/solar.dmi b/icons/obj/machines/solar.dmi index 5eac935807395..6cd267d17819a 100644 Binary files a/icons/obj/machines/solar.dmi and b/icons/obj/machines/solar.dmi differ diff --git a/icons/obj/pet_carrier.dmi b/icons/obj/pet_carrier.dmi index 366fddd414412..95007d4dc0c14 100644 Binary files a/icons/obj/pet_carrier.dmi and b/icons/obj/pet_carrier.dmi differ diff --git a/icons/obj/storage/box.dmi b/icons/obj/storage/box.dmi index aeb337b5981aa..1fa377e2ebcab 100644 Binary files a/icons/obj/storage/box.dmi and b/icons/obj/storage/box.dmi differ diff --git a/icons/obj/storage/toolbox.dmi b/icons/obj/storage/toolbox.dmi index 49385d5b73cf2..ccc9c2cc4397e 100644 Binary files a/icons/obj/storage/toolbox.dmi and b/icons/obj/storage/toolbox.dmi differ diff --git a/icons/obj/wallmounts.dmi b/icons/obj/wallmounts.dmi index 3bc4510a47f15..df810abb3b481 100644 Binary files a/icons/obj/wallmounts.dmi and b/icons/obj/wallmounts.dmi differ diff --git a/modular_doppler/bitrunning_extras/code/supply_packs/starter_kit.dm b/modular_doppler/bitrunning_extras/code/supply_packs/starter_kit.dm index 3ac6294f5cf3f..a8afe125088df 100644 --- a/modular_doppler/bitrunning_extras/code/supply_packs/starter_kit.dm +++ b/modular_doppler/bitrunning_extras/code/supply_packs/starter_kit.dm @@ -53,26 +53,6 @@ var/obj/item/special_snack = pick(special_options) new special_snack(our_crate) - -/obj/item/storage/cans/sixgamerdrink - name = "gamer drink bottle ring" - desc = "Holds six gamer drink cans. Remember to recycle when you're done!" - - /// Pool of gamer drinks tm we may add from - var/list/gamer_drink_options = list( - /obj/item/reagent_containers/cup/soda_cans/space_mountain_wind = 25, - /obj/item/reagent_containers/cup/soda_cans/volt_energy = 25, - /obj/item/reagent_containers/cup/soda_cans/monkey_energy = 25, - /obj/item/reagent_containers/cup/soda_cans/pwr_game = 20, - /obj/item/reagent_containers/cup/soda_cans/thirteenloko = 5, - ) - -/obj/item/storage/cans/sixgamerdrink/PopulateContents() - for(var/i in 1 to 6) - var/obj/item/chosen_gamer_drink = pick_weight(gamer_drink_options) - new chosen_gamer_drink(src) - - /obj/item/folder/gamer name = "folder - 'domain certificates'" desc = "A folder to keep track of all your gamer highscores." diff --git a/modular_doppler/deforest_medical_items/code/storage_items.dm b/modular_doppler/deforest_medical_items/code/storage_items.dm index 3b3cfb0efadac..cf0d361b5f9a7 100644 --- a/modular_doppler/deforest_medical_items/code/storage_items.dm +++ b/modular_doppler/deforest_medical_items/code/storage_items.dm @@ -148,8 +148,8 @@ worn_icon_state = "frontier" worn_icon = 'modular_doppler/deforest_medical_items/icons/worn/worn.dmi' // worn_icon_teshari = 'modular_doppler/deforest_medical_items/icons/worn/worn_teshari.dmi' - pickup_sound = 'sound/items/handling/cloth_pickup.ogg' - drop_sound = 'sound/items/handling/cloth_drop.ogg' + pickup_sound = SFX_CLOTH_PICKUP + drop_sound = SFX_CLOTH_DROP slot_flags = ITEM_SLOT_BELT /obj/item/storage/medkit/frontier/stocked @@ -177,8 +177,8 @@ inhand_icon_state = "surgeon" worn_icon = 'modular_doppler/deforest_medical_items/icons/worn/worn.dmi' worn_icon_state = "frontier" - pickup_sound = 'sound/items/handling/cloth_pickup.ogg' - drop_sound = 'sound/items/handling/cloth_drop.ogg' + pickup_sound = SFX_CLOTH_PICKUP + drop_sound = SFX_CLOTH_DROP /obj/item/storage/medkit/combat_surgeon/Initialize(mapload) . = ..() @@ -209,8 +209,8 @@ inhand_icon_state = "satchel" worn_icon = 'modular_doppler/deforest_medical_items/icons/worn/worn.dmi' equip_sound = 'sound/items/equip/jumpsuit_equip.ogg' - pickup_sound = 'sound/items/handling/cloth_pickup.ogg' - drop_sound = 'sound/items/handling/cloth_drop.ogg' + pickup_sound = SFX_CLOTH_PICKUP + drop_sound = SFX_CLOTH_DROP slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_BELT storage_type = /datum/storage/duffel/deforest_medkit zip_slowdown = 0.25 // Most won't notice normally but it'll hurt you if you're a paramedic or in combat @@ -306,8 +306,8 @@ worn_icon = 'modular_doppler/deforest_medical_items/icons/worn/worn.dmi' // worn_icon_teshari = 'modular_doppler/deforest_medical_items/icons/worn/worn_teshari.dmi' equip_sound = 'sound/items/equip/jumpsuit_equip.ogg' - pickup_sound = 'sound/items/handling/cloth_pickup.ogg' - drop_sound = 'sound/items/handling/cloth_drop.ogg' + pickup_sound = SFX_CLOTH_PICKUP + drop_sound = SFX_CLOTH_DROP slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_BELT storage_type = /datum/storage/duffel/deforest_big_surgery zip_slowdown = 0.5 // Its a bulkier bag and thus slows you down a little more when unzipped diff --git a/modular_doppler/epic_loot/code/loot_structures/wall_jackets.dm b/modular_doppler/epic_loot/code/loot_structures/wall_jackets.dm index 3b3bfd24b0802..443f0affece81 100644 --- a/modular_doppler/epic_loot/code/loot_structures/wall_jackets.dm +++ b/modular_doppler/epic_loot/code/loot_structures/wall_jackets.dm @@ -3,7 +3,7 @@ max_specific_storage = WEIGHT_CLASS_NORMAL max_total_storage = WEIGHT_CLASS_NORMAL * 4 screen_max_columns = 2 - opening_sound = 'sound/items/handling/cloth_pickup.ogg' + opening_sound = 'sound/items/handling/cloth/cloth_pickup1.ogg' /obj/structure/maintenance_loot_structure/wall_jacket name = "hanging jacket" diff --git a/modular_doppler/epic_loot/code/storage_containers/containers.dm b/modular_doppler/epic_loot/code/storage_containers/containers.dm index 682315b83a58b..9483de0776eca 100644 --- a/modular_doppler/epic_loot/code/storage_containers/containers.dm +++ b/modular_doppler/epic_loot/code/storage_containers/containers.dm @@ -4,8 +4,8 @@ icon = 'modular_doppler/epic_loot/icons/storage_items.dmi' icon_state = "pencase" equip_sound = 'sound/items/equip/toolbelt_equip.ogg' - pickup_sound = 'sound/items/handling/cloth_pickup.ogg' - drop_sound = 'sound/items/handling/cloth_drop.ogg' + pickup_sound = SFX_CLOTH_PICKUP + drop_sound = SFX_CLOTH_DROP storage_type = /datum/storage/maintenance_loot_structure/epic_loot_medpen_case slot_flags = ITEM_SLOT_POCKETS w_class = WEIGHT_CLASS_BULKY @@ -39,8 +39,8 @@ icon = 'modular_doppler/epic_loot/icons/storage_items.dmi' icon_state = "documents" equip_sound = 'sound/items/equip/toolbelt_equip.ogg' - pickup_sound = 'sound/items/handling/cloth_pickup.ogg' - drop_sound = 'sound/items/handling/cloth_drop.ogg' + pickup_sound = SFX_CLOTH_PICKUP + drop_sound = SFX_CLOTH_DROP storage_type = /datum/storage/maintenance_loot_structure/epic_loot_docs_case slot_flags = ITEM_SLOT_POCKETS w_class = WEIGHT_CLASS_BULKY @@ -51,7 +51,7 @@ max_total_storage = WEIGHT_CLASS_BULKY * 4 screen_max_columns = 2 numerical_stacking = TRUE - opening_sound = 'sound/items/handling/cloth_pickup.ogg' + opening_sound = 'sound/items/handling/cloth/cloth_pickup1.ogg' /datum/storage/maintenance_loot_structure/epic_loot_docs_case/New() . = ..() @@ -76,8 +76,8 @@ icon = 'modular_doppler/epic_loot/icons/storage_items.dmi' icon_state = "sick" equip_sound = 'sound/items/equip/toolbelt_equip.ogg' - pickup_sound = 'sound/items/handling/cloth_pickup.ogg' - drop_sound = 'sound/items/handling/cloth_drop.ogg' + pickup_sound = SFX_CLOTH_PICKUP + drop_sound = SFX_CLOTH_DROP storage_type = /datum/storage/maintenance_loot_structure/epic_loot_org_pouch slot_flags = ITEM_SLOT_POCKETS w_class = WEIGHT_CLASS_BULKY diff --git a/sound/items/equip/attribution.txt b/sound/items/equip/attribution.txt index d0380ef39345b..73cd515d6742f 100644 --- a/sound/items/equip/attribution.txt +++ b/sound/items/equip/attribution.txt @@ -1,2 +1,7 @@ sneakers equip1 made by sadboysuss license: CC-BY-SA 3.0 + +{ +headset_equip1.ogg +headset_equip2.ogg +} - made by sadboysuss diff --git a/sound/items/equip/headset_equip1.ogg b/sound/items/equip/headset_equip1.ogg new file mode 100644 index 0000000000000..297fbcab3cfcf Binary files /dev/null and b/sound/items/equip/headset_equip1.ogg differ diff --git a/sound/items/equip/headset_equip2.ogg b/sound/items/equip/headset_equip2.ogg new file mode 100644 index 0000000000000..db7c87d21adda Binary files /dev/null and b/sound/items/equip/headset_equip2.ogg differ diff --git a/sound/items/gauze/attribution.txt b/sound/items/gauze/attribution.txt new file mode 100644 index 0000000000000..3b5f511e695a6 --- /dev/null +++ b/sound/items/gauze/attribution.txt @@ -0,0 +1,10 @@ +{ +bandage_begin1.ogg +bandage_begin2.ogg +bandage_begin3.ogg +bandage_begin4.ogg +bandage_end1.ogg +bandage_end2.ogg +bandage_end3.ogg +bandage_end4.ogg +} - made by sadboyssuss \ No newline at end of file diff --git a/sound/items/gauze/bandage_begin1.ogg b/sound/items/gauze/bandage_begin1.ogg new file mode 100644 index 0000000000000..47c2c6c28881c Binary files /dev/null and b/sound/items/gauze/bandage_begin1.ogg differ diff --git a/sound/items/gauze/bandage_begin2.ogg b/sound/items/gauze/bandage_begin2.ogg new file mode 100644 index 0000000000000..6372d03f2dbcb Binary files /dev/null and b/sound/items/gauze/bandage_begin2.ogg differ diff --git a/sound/items/gauze/bandage_begin3.ogg b/sound/items/gauze/bandage_begin3.ogg new file mode 100644 index 0000000000000..aeb1c8e9be82f Binary files /dev/null and b/sound/items/gauze/bandage_begin3.ogg differ diff --git a/sound/items/gauze/bandage_begin4.ogg b/sound/items/gauze/bandage_begin4.ogg new file mode 100644 index 0000000000000..53c8dcc2f58c6 Binary files /dev/null and b/sound/items/gauze/bandage_begin4.ogg differ diff --git a/sound/items/gauze/bandage_end1.ogg b/sound/items/gauze/bandage_end1.ogg new file mode 100644 index 0000000000000..0a786d15cdbd8 Binary files /dev/null and b/sound/items/gauze/bandage_end1.ogg differ diff --git a/sound/items/gauze/bandage_end2.ogg b/sound/items/gauze/bandage_end2.ogg new file mode 100644 index 0000000000000..49510d9275c45 Binary files /dev/null and b/sound/items/gauze/bandage_end2.ogg differ diff --git a/sound/items/gauze/bandage_end3.ogg b/sound/items/gauze/bandage_end3.ogg new file mode 100644 index 0000000000000..97b34cc13d8e9 Binary files /dev/null and b/sound/items/gauze/bandage_end3.ogg differ diff --git a/sound/items/gauze/bandage_end4.ogg b/sound/items/gauze/bandage_end4.ogg new file mode 100644 index 0000000000000..6cbaf67489a8f Binary files /dev/null and b/sound/items/gauze/bandage_end4.ogg differ diff --git a/sound/items/handling/cloth/attribution.txt b/sound/items/handling/cloth/attribution.txt new file mode 100644 index 0000000000000..e7614c392d6d0 --- /dev/null +++ b/sound/items/handling/cloth/attribution.txt @@ -0,0 +1,10 @@ +{ +cloth_drop1.ogg +cloth_drop2.ogg +cloth_drop3.ogg +cloth_drop4.ogg +cloth_pickup1.ogg +cloth_pickup2.ogg +cloth_pickup3.ogg +cloth_pickup4.ogg +} - made by sadboyssuss \ No newline at end of file diff --git a/sound/items/handling/cloth_drop.ogg b/sound/items/handling/cloth/cloth_drop1.ogg similarity index 100% rename from sound/items/handling/cloth_drop.ogg rename to sound/items/handling/cloth/cloth_drop1.ogg diff --git a/sound/items/handling/cloth/cloth_drop2.ogg b/sound/items/handling/cloth/cloth_drop2.ogg new file mode 100644 index 0000000000000..c7b169b073b52 Binary files /dev/null and b/sound/items/handling/cloth/cloth_drop2.ogg differ diff --git a/sound/items/handling/cloth/cloth_drop3.ogg b/sound/items/handling/cloth/cloth_drop3.ogg new file mode 100644 index 0000000000000..ee71eb14c196a Binary files /dev/null and b/sound/items/handling/cloth/cloth_drop3.ogg differ diff --git a/sound/items/handling/cloth/cloth_drop4.ogg b/sound/items/handling/cloth/cloth_drop4.ogg new file mode 100644 index 0000000000000..28c22cf24994b Binary files /dev/null and b/sound/items/handling/cloth/cloth_drop4.ogg differ diff --git a/sound/items/handling/cloth/cloth_drop5.ogg b/sound/items/handling/cloth/cloth_drop5.ogg new file mode 100644 index 0000000000000..3727fb8a6acdf Binary files /dev/null and b/sound/items/handling/cloth/cloth_drop5.ogg differ diff --git a/sound/items/handling/cloth_pickup.ogg b/sound/items/handling/cloth/cloth_pickup1.ogg similarity index 100% rename from sound/items/handling/cloth_pickup.ogg rename to sound/items/handling/cloth/cloth_pickup1.ogg diff --git a/sound/items/handling/cloth/cloth_pickup2.ogg b/sound/items/handling/cloth/cloth_pickup2.ogg new file mode 100644 index 0000000000000..659bdc205574a Binary files /dev/null and b/sound/items/handling/cloth/cloth_pickup2.ogg differ diff --git a/sound/items/handling/cloth/cloth_pickup3.ogg b/sound/items/handling/cloth/cloth_pickup3.ogg new file mode 100644 index 0000000000000..4b5ef7fcf24de Binary files /dev/null and b/sound/items/handling/cloth/cloth_pickup3.ogg differ diff --git a/sound/items/handling/cloth/cloth_pickup4.ogg b/sound/items/handling/cloth/cloth_pickup4.ogg new file mode 100644 index 0000000000000..309b12863e461 Binary files /dev/null and b/sound/items/handling/cloth/cloth_pickup4.ogg differ diff --git a/sound/items/handling/cloth/cloth_pickup5.ogg b/sound/items/handling/cloth/cloth_pickup5.ogg new file mode 100644 index 0000000000000..22b50e45d0a57 Binary files /dev/null and b/sound/items/handling/cloth/cloth_pickup5.ogg differ diff --git a/sound/items/handling/headset/attribution.txt b/sound/items/handling/headset/attribution.txt new file mode 100644 index 0000000000000..8273ac3be25c8 --- /dev/null +++ b/sound/items/handling/headset/attribution.txt @@ -0,0 +1,6 @@ +{ +headset_pickup1.ogg +headset_pickup2.ogg +headset_pickup3.ogg +headset_drop1.ogg +} - made by sadboysuss \ No newline at end of file diff --git a/sound/items/handling/headset/headset_drop1.ogg b/sound/items/handling/headset/headset_drop1.ogg new file mode 100644 index 0000000000000..d2c4a82b55b54 Binary files /dev/null and b/sound/items/handling/headset/headset_drop1.ogg differ diff --git a/sound/items/handling/headset/headset_pickup1.ogg b/sound/items/handling/headset/headset_pickup1.ogg new file mode 100644 index 0000000000000..aea8150bd7f80 Binary files /dev/null and b/sound/items/handling/headset/headset_pickup1.ogg differ diff --git a/sound/items/handling/headset/headset_pickup2.ogg b/sound/items/handling/headset/headset_pickup2.ogg new file mode 100644 index 0000000000000..87df489086b7a Binary files /dev/null and b/sound/items/handling/headset/headset_pickup2.ogg differ diff --git a/sound/items/handling/headset/headset_pickup3.ogg b/sound/items/handling/headset/headset_pickup3.ogg new file mode 100644 index 0000000000000..e12c1539d664a Binary files /dev/null and b/sound/items/handling/headset/headset_pickup3.ogg differ diff --git a/strings/modular_maps/syndicatebaseice.toml b/strings/modular_maps/syndicatebaseice.toml new file mode 100644 index 0000000000000..940faa0bf2551 --- /dev/null +++ b/strings/modular_maps/syndicatebaseice.toml @@ -0,0 +1,5 @@ +directory = "_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent/" + +[rooms.commsoffice] +modules = ["commsoffice_standard.dmm", "commsoffice_cheap.dmm", "commsoffice_luxury.dmm"] + diff --git a/strings/traumas.json b/strings/traumas.json index 7eeae3370f291..6c1f32f7b8476 100644 --- a/strings/traumas.json +++ b/strings/traumas.json @@ -61,7 +61,7 @@ "THe saiyans screwed", "TURBIN IS BEST ENGIENE", "u just did the world a little bit more sad place for someone", - "ur a fuckeing autist!", + "ur a fuckeing IDOT!", "waaaaaagh!!!", "wearnig siNGUARLTY is.... FINE haHAAA", "WHERES THE SLIP REWRITE WHERE THR FUCK ID IT?", diff --git a/tgstation.dme b/tgstation.dme index 2685ec7da44fa..2a06290a32a11 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -467,7 +467,6 @@ #include "code\__HELPERS\atoms.dm" #include "code\__HELPERS\auxtools.dm" #include "code\__HELPERS\bitflag_lists.dm" -#include "code\__HELPERS\cameras.dm" #include "code\__HELPERS\chat.dm" #include "code\__HELPERS\chat_filter.dm" #include "code\__HELPERS\clients.dm" @@ -840,6 +839,7 @@ #include "code\controllers\subsystem\processing\manufacturing.dm" #include "code\controllers\subsystem\processing\obj.dm" #include "code\controllers\subsystem\processing\plumbing.dm" +#include "code\controllers\subsystem\processing\priority_effects.dm" #include "code\controllers\subsystem\processing\processing.dm" #include "code\controllers\subsystem\processing\projectiles.dm" #include "code\controllers\subsystem\processing\quirks.dm" @@ -1524,6 +1524,7 @@ #include "code\datums\elements\can_barricade.dm" #include "code\datums\elements\can_shatter.dm" #include "code\datums\elements\caseless.dm" +#include "code\datums\elements\chain_lightning_attack.dm" #include "code\datums\elements\chemical_transfer.dm" #include "code\datums\elements\chewable.dm" #include "code\datums\elements\cleaning.dm" @@ -1640,6 +1641,7 @@ #include "code\datums\elements\skill_reward.dm" #include "code\datums\elements\skittish.dm" #include "code\datums\elements\slapcrafting.dm" +#include "code\datums\elements\slow_target_click_cd_attack.dm" #include "code\datums\elements\soft_landing.dm" #include "code\datums\elements\spooky.dm" #include "code\datums\elements\squish.dm" @@ -2019,6 +2021,7 @@ #include "code\datums\storage\subtypes\backpack.dm" #include "code\datums\storage\subtypes\bag_of_holding.dm" #include "code\datums\storage\subtypes\cards.dm" +#include "code\datums\storage\subtypes\carpskin_bag.dm" #include "code\datums\storage\subtypes\drone.dm" #include "code\datums\storage\subtypes\duffel_bag.dm" #include "code\datums\storage\subtypes\extract_inventory.dm" @@ -3690,6 +3693,7 @@ #include "code\modules\bitrunning\antagonists\ghost_role.dm" #include "code\modules\bitrunning\antagonists\netguardian.dm" #include "code\modules\bitrunning\components\avatar_connection.dm" +#include "code\modules\bitrunning\components\avatar_gear.dm" #include "code\modules\bitrunning\components\bitrunning_points.dm" #include "code\modules\bitrunning\components\glitch.dm" #include "code\modules\bitrunning\components\netpod_healing.dm" @@ -3713,6 +3717,9 @@ #include "code\modules\bitrunning\objects\loot_crate.dm" #include "code\modules\bitrunning\objects\quantum_console.dm" #include "code\modules\bitrunning\objects\vendor.dm" +#include "code\modules\bitrunning\objects\gimmick_disks\_gimmick_disk.dm" +#include "code\modules\bitrunning\objects\gimmick_disks\dungeon_disk.dm" +#include "code\modules\bitrunning\objects\gimmick_disks\sports_disk.dm" #include "code\modules\bitrunning\orders\bepis.dm" #include "code\modules\bitrunning\orders\flair.dm" #include "code\modules\bitrunning\orders\tech.dm" @@ -4910,7 +4917,6 @@ #include "code\modules\mob\living\login.dm" #include "code\modules\mob\living\logout.dm" #include "code\modules\mob\living\navigation.dm" -#include "code\modules\mob\living\sneeze.dm" #include "code\modules\mob\living\status_procs.dm" #include "code\modules\mob\living\taste.dm" #include "code\modules\mob\living\ventcrawling.dm" @@ -4996,6 +5002,9 @@ #include "code\modules\mob\living\basic\farm_animals\goat\_goat.dm" #include "code\modules\mob\living\basic\farm_animals\goat\goat_ai.dm" #include "code\modules\mob\living\basic\farm_animals\goat\goat_subtypes.dm" +#include "code\modules\mob\living\basic\farm_animals\goose\goose.dm" +#include "code\modules\mob\living\basic\farm_animals\goose\goose_ai.dm" +#include "code\modules\mob\living\basic\farm_animals\goose\goose_vomit.dm" #include "code\modules\mob\living\basic\farm_animals\gorilla\gorilla.dm" #include "code\modules\mob\living\basic\farm_animals\gorilla\gorilla_accessories.dm" #include "code\modules\mob\living\basic\farm_animals\gorilla\gorilla_ai.dm" @@ -5440,8 +5449,6 @@ #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\herald.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\legionnaire.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\pandora.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\goose.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" #include "code\modules\mob_spawn\mob_spawn.dm" #include "code\modules\mob_spawn\corpses\job_corpses.dm" #include "code\modules\mob_spawn\corpses\mining_corpses.dm" @@ -5585,6 +5592,7 @@ #include "code\modules\pai\say.dm" #include "code\modules\pai\shell.dm" #include "code\modules\pai\software.dm" +#include "code\modules\pai\datums\screen_icon.dm" #include "code\modules\paperwork\carbonpaper.dm" #include "code\modules\paperwork\clipboard.dm" #include "code\modules\paperwork\contract.dm" diff --git a/tgui/packages/tgui-panel/chat/middleware.js b/tgui/packages/tgui-panel/chat/middleware.js index 83fc28dc86a99..f221f3a7c53f6 100644 --- a/tgui/packages/tgui-panel/chat/middleware.js +++ b/tgui/packages/tgui-panel/chat/middleware.js @@ -135,13 +135,14 @@ export const chatMiddleware = (store) => { requesting < sequence; requesting++ ) { - requested_sequences.push(requesting); + sequences_requested.push(requesting); Byond.sendMessage('chat/resend', requesting); } } } chatRenderer.processBatch([payload_obj.content]); + sequences.push(sequence); return; } if (type === loadChat.type) { diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss index 6eb4e5dfe0ee6..52723fa59c08a 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss @@ -52,15 +52,15 @@ a.popt { position: fixed; top: 50%; left: 50%; - background: #ddd; + background: hsl(0, 0%, 86.7%); } .popup .close { position: absolute; - background: #aaa; + background: hsl(0, 0%, 66.7%); top: 0; right: 0; - color: #333; + color: hsl(0, 0%, 20%); text-decoration: none; z-index: 2; padding: 0 10px; @@ -69,12 +69,12 @@ a.popt { } .popup .close:hover { - background: #999; + background: hsl(0, 0%, 60%); } .popup .head { - background: #999; - color: #ddd; + background: hsl(0, 0%, 60%); + color: hsl(0, 0%, 86.7%); padding: 0 10px; height: 30px; line-height: 30px; @@ -85,12 +85,12 @@ a.popt { } .popup input { - border: 1px solid #999; - background: #fff; + border: 1px solid hsl(0, 0%, 60%); + background: hsl(0, 0%, 100%); margin: 0; padding: 5px; outline: none; - color: #333; + color: hsl(0, 0%, 20%); } .popup input[type='text']:hover, @@ -101,8 +101,8 @@ a.popt { .popup input[type='submit'] { padding: 5px 10px; - background: #999; - color: #ddd; + background: hsl(0, 0%, 60%); + color: hsl(0, 0%, 86.7%); text-transform: uppercase; font-size: 0.9em; font-weight: bold; @@ -111,7 +111,7 @@ a.popt { .popup input[type='submit']:hover, .popup input[type='submit']:focus, .popup input[type='submit']:active { - background: #aaa; + background: hsl(0, 0%, 66.7%); cursor: pointer; } @@ -123,11 +123,11 @@ a.popt { display: block; text-decoration: none; padding: 3px; - color: #333; + color: hsl(0, 0%, 20%); } .changeFont a:hover { - background: #ccc; + background: hsl(0, 0%, 80%); } .highlightPopup { @@ -153,7 +153,7 @@ a.popt { /* ADMIN CONTEXT MENU */ .contextMenu { - background-color: #ddd; + background-color: hsl(0, 0%, 86.7%); position: fixed; margin: 2px; width: 150px; @@ -163,11 +163,11 @@ a.popt { display: block; padding: 2px 5px; text-decoration: none; - color: #333; + color: hsl(0, 0%, 20%); } .contextMenu a:hover { - background-color: #ccc; + background-color: hsl(0, 0%, 80%); } /* ADMIN FILTER MESSAGES MENU */ @@ -984,7 +984,7 @@ em { max-width: 95%; font-size: 120%; padding: 0.2em 0.5em; - background: #151515; // Chat background color + background: hsl(0, 0%, 8.2%); // Chat background color border: 1px solid; border-color: inherit; border-radius: 0.33em; @@ -999,7 +999,7 @@ em { left: 0; height: 1.15em; width: 100%; - background: #151515; // Chat background color + background: hsl(0, 0%, 8.2%); // Chat background color transform: translateY(-50%) scaleX(1.05); z-index: -1; } diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss index ab0eb334e179a..ad4edcc43ff21 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss @@ -15,7 +15,7 @@ body { } body { - background: #fff; + background: hsl(0, 0%, 100%); font-family: Verdana, sans-serif; font-size: 13px; line-height: 1.2; @@ -66,15 +66,15 @@ a.popt { position: fixed; top: 50%; left: 50%; - background: #ddd; + background: hsl(0, 0%, 86.7%); } .popup .close { position: absolute; - background: #aaa; + background: hsl(0, 0%, 66.7%); top: 0; right: 0; - color: #333; + color: hsl(0, 0%, 20%); text-decoration: none; z-index: 2; padding: 0 10px; @@ -83,12 +83,12 @@ a.popt { } .popup .close:hover { - background: #999; + background: hsl(0, 0%, 60%); } .popup .head { - background: #999; - color: #ddd; + background: hsl(0, 0%, 60%); + color: hsl(0, 0%, 86.7%); padding: 0 10px; height: 30px; line-height: 30px; @@ -99,12 +99,12 @@ a.popt { } .popup input { - border: 1px solid #999; - background: #fff; + border: 1px solid hsl(0, 0%, 60%); + background: hsl(0, 0%, 100%); margin: 0; padding: 5px; outline: none; - color: #333; + color: hsl(0, 0%, 20%); } .popup input[type='text']:hover, @@ -115,8 +115,8 @@ a.popt { .popup input[type='submit'] { padding: 5px 10px; - background: #999; - color: #ddd; + background: hsl(0, 0%, 60%); + color: hsl(0, 0%, 86.7%); text-transform: uppercase; font-size: 0.9em; font-weight: bold; @@ -125,7 +125,7 @@ a.popt { .popup input[type='submit']:hover, .popup input[type='submit']:focus, .popup input[type='submit']:active { - background: #aaa; + background: hsl(0, 0%, 66.7%); cursor: pointer; } @@ -137,11 +137,11 @@ a.popt { display: block; text-decoration: none; padding: 3px; - color: #333; + color: hsl(0, 0%, 20%); } .changeFont a:hover { - background: #ccc; + background: hsl(0, 0%, 80%); } .highlightPopup { @@ -167,7 +167,7 @@ a.popt { /* ADMIN CONTEXT MENU */ .contextMenu { - background-color: #ddd; + background-color: hsl(0, 0%, 86.7%); position: fixed; margin: 2px; width: 150px; @@ -177,11 +177,11 @@ a.popt { display: block; padding: 2px 5px; text-decoration: none; - color: #333; + color: hsl(0, 0%, 20%); } .contextMenu a:hover { - background-color: #ccc; + background-color: hsl(0, 0%, 80%); } /* ADMIN FILTER MESSAGES MENU */ @@ -990,10 +990,10 @@ h2.alert { } .fieldset_legend { - background: #ffffff; // Chat background color + background: hsl(0, 0%, 100%); // Chat background color &:before { - background: #ffffff; // Chat background color + background: hsl(0, 0%, 100%); // Chat background color } } diff --git a/tgui/packages/tgui-say/TguiSay.tsx b/tgui/packages/tgui-say/515/TguiSay.tsx similarity index 94% rename from tgui/packages/tgui-say/TguiSay.tsx rename to tgui/packages/tgui-say/515/TguiSay.tsx index 5657bc8cca41c..916ea5bbc4524 100644 --- a/tgui/packages/tgui-say/TguiSay.tsx +++ b/tgui/packages/tgui-say/515/TguiSay.tsx @@ -1,13 +1,15 @@ +import './styles/main.scss'; + import { Component, createRef, RefObject } from 'react'; import { dragStartHandler } from 'tgui/drag'; import { isEscape, KEY } from 'tgui-core/keys'; import { BooleanLike } from 'tgui-core/react'; -import { Channel, ChannelIterator } from './ChannelIterator'; -import { ChatHistory } from './ChatHistory'; +import { Channel, ChannelIterator } from '../ChannelIterator'; +import { ChatHistory } from '../ChatHistory'; +import { byondMessages } from '../timers'; import { LINE_LENGTHS, RADIO_PREFIXES, WINDOW_SIZES } from './constants'; import { windowClose, windowOpen, windowSet } from './helpers'; -import { byondMessages } from './timers'; type ByondOpen = { channel: Channel; @@ -314,20 +316,22 @@ export class TguiSay extends Component<{}, State> { this.channelIterator.current(); return ( -
+
-
+
-
+