diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000000..84bd4fa20aa --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + target-branch: master + schedule: + interval: daily + labels: + - GitHub + open-pull-requests-limit: 10 diff --git a/.github/guides/STANDARDS.md b/.github/guides/STANDARDS.md index 9c6496e0c4d..c27c8ae7417 100644 --- a/.github/guides/STANDARDS.md +++ b/.github/guides/STANDARDS.md @@ -513,6 +513,30 @@ The following is a list of procs, and their safe replacements. * Move away from something, taking turf density into account `walk_away()` -> `SSmove_manager.move_away()` * Move to a random place nearby. NOT random walk `walk_rand()` -> `SSmove_manager.move_rand()` is random walk, `SSmove_manager.move_to_rand()` is walk to a random place +### Avoid pointer use + +BYOND has a variable type called pointers, which allow you to reference a variable rather then its value. As an example of how this works: + +``` +var/pointed_at = "text" +var/value = pointed_at // copies the VALUE of pointed at +var/reference = &pointed_at // points at pointed_at itself + +// so we can retain a reference even if pointed_at changes +pointed_at = "text AGAIN" +world << (*reference) // Deref to get the value, outputs "text AGAIN" + +// or modify the var remotely +*reference = "text a THIRD TIME" +world << pointed_at // outputs "text a THIRD TIME" +``` + +The problem with this is twofold. +- First: if you use a pointer to reference a var on a datum, it is essentially as if you held an invisible reference to that datum. This risks hard deletes in very unclear ways that cannot be tested for. +- Second: People don't like, understand how pointers work? They mix them up with classical C pointers, when they're more like `std::shared_ptr`. This leads to code that just doesn't work properly, or is hard to follow without first getting your mind around it. It also risks hiding what code does in dumb ways because pointers don't have unique types. + +For these reasons and with the hope of avoiding pointers entering general use, be very careful using them, if you use them at all. + ### BYOND hellspawn What follows is documentation of inconsistent or strange behavior found in our engine, BYOND. diff --git a/.github/workflows/auto_changelog.yml b/.github/workflows/auto_changelog.yml index d19f0a2db00..cfbbbf38413 100644 --- a/.github/workflows/auto_changelog.yml +++ b/.github/workflows/auto_changelog.yml @@ -28,7 +28,7 @@ jobs: APP_ID: ${{ secrets.APP_ID }} - name: Run auto changelog - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: script: | const { processAutoChangelog } = await import('${{ github.workspace }}/tools/pull_request_hooks/autoChangelog.js') diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml index 680374ba37e..e39e887f529 100644 --- a/.github/workflows/ci_suite.yml +++ b/.github/workflows/ci_suite.yml @@ -76,7 +76,7 @@ jobs: path: tools/icon_cutter/cache key: ${{ runner.os }}-cutter-${{ hashFiles('dependencies.sh') }} - name: Install OpenDream - uses: robinraju/release-downloader@v1.9 + uses: robinraju/release-downloader@v1.11 with: repository: "OpenDreamProject/OpenDream" tag: "latest" diff --git a/.github/workflows/compile_changelogs.yml b/.github/workflows/compile_changelogs.yml index 8b46cf649f3..7821dd52ba7 100644 --- a/.github/workflows/compile_changelogs.yml +++ b/.github/workflows/compile_changelogs.yml @@ -23,7 +23,7 @@ jobs: - name: "Setup python" if: steps.value_holder.outputs.ACTIONS_ENABLED - uses: actions/setup-python@v1 + uses: actions/setup-python@v5 with: python-version: '3.x' diff --git a/.github/workflows/generate_documentation.yml b/.github/workflows/generate_documentation.yml index 2ffef722183..40710a9044b 100644 --- a/.github/workflows/generate_documentation.yml +++ b/.github/workflows/generate_documentation.yml @@ -27,10 +27,9 @@ jobs: touch dmdoc/.nojekyll echo codedocs.tgstation13.org > dmdoc/CNAME - name: Deploy - uses: JamesIves/github-pages-deploy-action@3.7.1 + uses: JamesIves/github-pages-deploy-action@v4.6.4 with: - BRANCH: gh-pages - CLEAN: true - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SINGLE_COMMIT: true - FOLDER: dmdoc + branch: gh-pages + clean: true + single-commit: true + folder: dmdoc diff --git a/.github/workflows/remove_guide_comments.yml b/.github/workflows/remove_guide_comments.yml index e3a4ac3feda..621d860c5cd 100644 --- a/.github/workflows/remove_guide_comments.yml +++ b/.github/workflows/remove_guide_comments.yml @@ -11,7 +11,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Remove guide comments - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: script: | const { removeGuideComments } = await import('${{ github.workspace }}/tools/pull_request_hooks/removeGuideComments.js') diff --git a/.github/workflows/rerun_flaky_tests.yml b/.github/workflows/rerun_flaky_tests.yml index 7f498de1443..80ece468061 100644 --- a/.github/workflows/rerun_flaky_tests.yml +++ b/.github/workflows/rerun_flaky_tests.yml @@ -12,7 +12,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Rerun flaky tests - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: script: | const { rerunFlakyTests } = await import('${{ github.workspace }}/tools/pull_request_hooks/rerunFlakyTests.js') @@ -24,7 +24,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Report flaky tests - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: script: | const { reportFlakyTests } = await import('${{ github.workspace }}/tools/pull_request_hooks/rerunFlakyTests.js') diff --git a/.github/workflows/show_screenshot_test_results.yml b/.github/workflows/show_screenshot_test_results.yml index c61d09fa890..b48ca983b35 100644 --- a/.github/workflows/show_screenshot_test_results.yml +++ b/.github/workflows/show_screenshot_test_results.yml @@ -34,7 +34,7 @@ jobs: npm install node-fetch - name: Show screenshot test results if: steps.secrets_set.outputs.SECRETS_ENABLED - uses: actions/github-script@v6 + uses: actions/github-script@v7 env: FILE_HOUSE_KEY: ${{ secrets.ARTIFACTS_FILE_HOUSE_KEY }} with: diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index e7e41eebbab..cb427593424 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-22.04 steps: - - uses: actions/stale@v4 + - uses: actions/stale@v9 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-pr-message: "This PR has been inactive for long enough to be automatically marked as stale. This means it is at risk of being auto closed in ~ 7 days, please address any outstanding review items and ensure your PR is finished, if these are all true and you are auto-staled anyway, you need to actively ask maintainers if your PR will be merged. Once you have done any of the previous actions then you should request a maintainer remove the stale label on your PR, to reset the stale timer. If you feel no maintainer will respond in that time, you may wish to close this PR youself, while you seek maintainer comment, as you will then be able to reopen the PR yourself." diff --git a/.github/workflows/test_merge_bot.yml b/.github/workflows/test_merge_bot.yml index c77e5077944..76dcd3cabc5 100644 --- a/.github/workflows/test_merge_bot.yml +++ b/.github/workflows/test_merge_bot.yml @@ -32,7 +32,7 @@ jobs: npm install node-fetch - name: Check for test merges if: steps.secrets_set.outputs.GET_TEST_MERGES_URL - uses: actions/github-script@v6 + uses: actions/github-script@v7 env: GET_TEST_MERGES_URL: ${{ secrets.GET_TEST_MERGES_URL }} with: diff --git a/.github/workflows/tgs_test.yml b/.github/workflows/tgs_test.yml index bd538307aa3..37062e44073 100644 --- a/.github/workflows/tgs_test.yml +++ b/.github/workflows/tgs_test.yml @@ -57,7 +57,7 @@ jobs: - 5000:5000 #Can't use env here for some reason steps: - name: Setup dotnet - uses: actions/setup-dotnet@v2 + uses: actions/setup-dotnet@v4 with: dotnet-version: 8.0.x diff --git a/_maps/RandomZLevels/museum.dmm b/_maps/RandomZLevels/museum.dmm index 7f87ffb86ce..88bf95847b9 100644 --- a/_maps/RandomZLevels/museum.dmm +++ b/_maps/RandomZLevels/museum.dmm @@ -2720,7 +2720,7 @@ "wi" = ( /obj/machinery/door/poddoor/shutters/indestructible{ dir = 8; - id = "museum_secret" + id = "museum_right_wing" }, /turf/open/floor/iron, /area/awaymission/museum) @@ -3958,7 +3958,7 @@ /area/awaymission/museum) "FO" = ( /obj/effect/decal/cleanable/crayon/puzzle/pin{ - puzzle_id = "museum_r_wing_puzzle" + puzzle_id = "museum_right_wing" }, /turf/closed/indestructible/reinforced, /area/awaymission/museum) @@ -4152,7 +4152,7 @@ /obj/effect/turf_decal/siding/dark_blue, /obj/machinery/door/poddoor/shutters/indestructible{ dir = 8; - id = "museum_secret" + id = "museum_right_wing" }, /turf/open/floor/iron/dark, /area/awaymission/museum) @@ -4221,7 +4221,7 @@ /area/awaymission/museum) "Id" = ( /obj/effect/decal/cleanable/crayon/puzzle/pin{ - puzzle_id = "museum_r_wing_puzzle" + puzzle_id = "museum_right_wing" }, /turf/closed/indestructible/wood, /area/awaymission/museum) @@ -5246,7 +5246,7 @@ /obj/structure/fluff/fake_camera, /obj/effect/decal/puzzle_dots{ pixel_y = -32; - id = "museum_r_wing_puzzle" + id = "museum_right_wing" }, /turf/open/floor/iron/dark, /area/awaymission/museum) @@ -5332,10 +5332,10 @@ }, /obj/machinery/door/poddoor/shutters/indestructible{ dir = 8; - id = "museum_secret" + id = "museum_right_wing" }, /obj/machinery/puzzle/password/pin/directional/south{ - id = "museum_r_wing_puzzle"; + id = "museum_right_wing"; late_initialize_pop = 1 }, /turf/open/floor/iron/dark, @@ -5349,7 +5349,7 @@ /obj/machinery/light/directional/west, /obj/effect/decal/cleanable/crayon/puzzle/pin{ pixel_x = -32; - puzzle_id = "museum_r_wing_puzzle" + puzzle_id = "museum_right_wing" }, /turf/open/floor/iron/white/small, /area/awaymission/museum) diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index 12dae68ff37..59ee1b217c2 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -1677,6 +1677,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/central/lesser) +"aGI" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/cell_charger{ + pixel_x = -1; + pixel_y = 4 + }, +/obj/item/stock_parts/power_store/cell/high{ + pixel_x = -1; + pixel_y = 4 + }, +/obj/item/assembly/timer{ + pixel_x = 14; + pixel_y = 6 + }, +/turf/open/floor/iron/dark, +/area/station/commons/storage/tools) "aGU" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/iron, @@ -1740,15 +1757,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) -"aIr" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/right/directional/south, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchenshutters"; - name = "Kitchen Shutters" - }, -/turf/open/floor/iron/kitchen/small, -/area/station/service/kitchen) "aIu" = ( /obj/structure/bookcase/random/reference, /obj/machinery/camera/autoname/directional/north, @@ -3623,6 +3631,25 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/security) +"buz" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/effect/spawner/random/food_or_drink/donuts, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchenshutters"; + name = "Kitchen Shutters"; + dir = 4 + }, +/obj/effect/turf_decal/siding{ + dir = 4 + }, +/obj/effect/turf_decal/siding{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/service/kitchen) "buA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7141,15 +7168,6 @@ /obj/machinery/door/poddoor/incinerator_atmos_aux, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) -"cMH" = ( -/obj/structure/table, -/obj/item/toy/foamblade, -/obj/item/analyzer{ - pixel_y = 8; - pixel_x = -9 - }, -/turf/open/floor/iron/dark/small, -/area/station/commons/fitness/locker_room) "cMS" = ( /obj/structure/cable, /obj/structure/chair/stool/directional/north, @@ -7205,6 +7223,18 @@ /obj/structure/window/spawner/directional/west, /turf/open/misc/sandy_dirt, /area/station/commons/fitness/recreation/entertainment) +"cOw" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/right/directional/south, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchenshutters"; + name = "Kitchen Shutters" + }, +/obj/effect/turf_decal/siding/end{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/service/kitchen) "cOC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -11088,20 +11118,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/security) -"elb" = ( -/obj/structure/table/reinforced, -/obj/structure/displaycase/forsale/kitchen{ - pixel_y = 5 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchenshutters"; - name = "Kitchen Shutters" - }, -/turf/open/floor/plating, -/area/station/service/kitchen) "elc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12136,26 +12152,6 @@ /obj/machinery/camera/directional/west, /turf/open/floor/iron/smooth, /area/station/commons/storage/tools) -"eEu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/crowbar/large{ - pixel_y = 18 - }, -/obj/item/clothing/head/costume/pirate{ - pixel_x = 15; - pixel_y = -3 - }, -/obj/item/clothing/suit/hazardvest{ - pixel_x = -3; - pixel_y = -2 - }, -/obj/item/wrench{ - pixel_y = 15 - }, -/turf/open/floor/iron/dark, -/area/station/commons/storage/tools) "eEL" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, @@ -15002,14 +14998,6 @@ }, /turf/open/floor/iron/smooth_large, /area/station/engineering/supermatter/room) -"fGk" = ( -/obj/machinery/smartfridge, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchenshutters"; - name = "Kitchen Shutters" - }, -/turf/open/floor/iron/kitchen/small, -/area/station/service/kitchen) "fGT" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -18632,6 +18620,29 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) +"gQG" = ( +/obj/structure/window/spawner/directional/east, +/obj/structure/closet/crate, +/obj/effect/turf_decal/bot_white, +/obj/item/clothing/gloves/color/fyellow, +/obj/item/stack/package_wrap{ + pixel_y = 5 + }, +/obj/item/stack/package_wrap{ + pixel_y = 2 + }, +/obj/item/storage/box{ + desc = "It smells of monkey business..."; + name = "Empty Gorillacube Box" + }, +/obj/item/weldingtool, +/obj/item/radio{ + pixel_y = 3; + pixel_x = -6 + }, +/obj/item/assembly/signaler, +/turf/open/floor/iron/smooth, +/area/station/commons/storage/tools) "gRm" = ( /obj/structure/flora/bush/flowers_br, /obj/structure/flora/bush/flowers_pp/style_random, @@ -19575,6 +19586,16 @@ dir = 4 }, /area/station/commons/storage/tools) +"hgd" = ( +/obj/structure/table, +/obj/item/screwdriver{ + pixel_y = -6 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 7 + }, +/turf/open/floor/iron/dark, +/area/station/commons/storage/tools) "hgf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/green{ @@ -19926,6 +19947,21 @@ dir = 4 }, /area/station/commons/storage/tools) +"hmj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/gps{ + pixel_y = 5; + pixel_x = 13 + }, +/obj/item/storage/toolbox/emergency/old, +/turf/open/floor/iron/dark, +/area/station/commons/storage/tools) "hmk" = ( /obj/structure/chair/stool/directional/east, /turf/open/floor/iron/smooth, @@ -19971,6 +20007,26 @@ dir = 1 }, /area/station/service/bar/backroom) +"hmQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/crowbar/large{ + pixel_y = 18 + }, +/obj/item/clothing/head/costume/pirate{ + pixel_x = 15; + pixel_y = -3 + }, +/obj/item/clothing/suit/hazardvest{ + pixel_x = -3; + pixel_y = -2 + }, +/obj/item/wrench{ + pixel_y = 15 + }, +/turf/open/floor/iron/dark, +/area/station/commons/storage/tools) "hnf" = ( /obj/item/bikehorn/rubberducky{ pixel_x = -6; @@ -20160,16 +20216,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) -"hrl" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/right/directional/west, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchenshutters"; - name = "Kitchen Shutters" - }, -/turf/open/floor/iron, -/area/station/service/kitchen) "hrx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20342,6 +20388,20 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"huh" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/delivery/white, +/obj/structure/rack, +/obj/item/hand_labeler, +/obj/item/stack/cable_coil/five, +/obj/item/pickaxe, +/obj/item/wrench, +/obj/item/radio/off, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/iron/smooth, +/area/station/commons/storage/tools) "huj" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -25725,21 +25785,6 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/dark/small, /area/station/service/chapel/storage) -"jes" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = 5; - pixel_y = 3 - }, -/obj/item/gps{ - pixel_y = 5; - pixel_x = 13 - }, -/obj/item/storage/toolbox/emergency/old, -/turf/open/floor/iron/dark, -/area/station/commons/storage/tools) "jeC" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -27077,6 +27122,28 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) +"jBT" = ( +/obj/structure/table/reinforced, +/obj/structure/desk_bell{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchenshutters"; + name = "Kitchen Shutters"; + dir = 4 + }, +/obj/effect/turf_decal/siding{ + dir = 4 + }, +/obj/effect/turf_decal/siding{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/service/kitchen) "jCi" = ( /obj/structure/cable, /obj/machinery/door/airlock/maintenance, @@ -27467,6 +27534,22 @@ /mob/living/basic/sloth/citrus, /turf/open/floor/iron, /area/station/cargo/storage) +"jHD" = ( +/obj/structure/table/reinforced, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 5 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchenshutters"; + name = "Kitchen Shutters"; + dir = 4 + }, +/obj/effect/turf_decal/siding/end, +/turf/open/floor/iron/dark/textured_large, +/area/station/service/kitchen) "jHI" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 5 @@ -30786,6 +30869,18 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured_large, /area/station/cargo/office) +"kIP" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/right/directional/west, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchenshutters"; + name = "Kitchen Shutters"; + dir = 8 + }, +/obj/effect/turf_decal/siding/end, +/turf/open/floor/iron/dark/textured_large, +/area/station/service/kitchen) "kIQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -33414,23 +33509,6 @@ }, /turf/open/floor/grass, /area/station/service/chapel) -"lzH" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/cell_charger{ - pixel_x = -1; - pixel_y = 4 - }, -/obj/item/stock_parts/power_store/cell/high{ - pixel_x = -1; - pixel_y = 4 - }, -/obj/item/assembly/timer{ - pixel_x = 14; - pixel_y = 6 - }, -/turf/open/floor/iron/dark, -/area/station/commons/storage/tools) "lzM" = ( /turf/closed/wall, /area/station/security/tram) @@ -34410,6 +34488,15 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/diagonal, /area/station/engineering/lobby) +"lNN" = ( +/obj/structure/table, +/obj/item/toy/foamblade, +/obj/item/analyzer{ + pixel_y = 8; + pixel_x = -9 + }, +/turf/open/floor/iron/dark/small, +/area/station/commons/fitness/locker_room) "lNQ" = ( /obj/effect/turf_decal/bot_white/right, /obj/machinery/firealarm/directional/north, @@ -35199,6 +35286,17 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/hallway/secondary/dock) +"lZP" = ( +/obj/structure/table, +/obj/item/toy/eightball{ + pixel_x = -4 + }, +/obj/item/wirecutters{ + pixel_y = 17; + pixel_x = 4 + }, +/turf/open/floor/iron/dark/small, +/area/station/commons/fitness/locker_room) "lZR" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/duct, @@ -36049,6 +36147,18 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/small, /area/station/security/brig) +"mpX" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchenshutters"; + name = "Kitchen Shutters" + }, +/obj/effect/turf_decal/siding/end{ + dir = 8 + }, +/obj/machinery/door/window/left/directional/south, +/turf/open/floor/iron/dark/textured_large, +/area/station/service/kitchen) "mql" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 1 @@ -36117,6 +36227,30 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/dock) +"mrP" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/table, +/obj/item/folder/red{ + pixel_y = 3 + }, +/obj/item/food/monkeycube/bee{ + name = "monkey cube"; + pixel_y = 17 + }, +/obj/item/food/monkeycube/chicken{ + pixel_y = 15; + pixel_x = 6; + name = "monkey cube"; + desc = "A new Nanotrasen classic, the monkey cube. Tastes like everything!" + }, +/obj/item/wirecutters{ + pixel_y = 6 + }, +/turf/open/floor/iron/dark, +/area/station/commons/storage/tools) "msg" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39722,16 +39856,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth, /area/station/engineering/main) -"nGS" = ( -/obj/structure/table, -/obj/item/screwdriver{ - pixel_y = -6 - }, -/obj/item/storage/toolbox/mechanical{ - pixel_y = 7 - }, -/turf/open/floor/iron/dark, -/area/station/commons/storage/tools) "nHd" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -40178,21 +40302,6 @@ /obj/structure/cable, /turf/open/floor/iron/smooth_large, /area/station/cargo/warehouse) -"nPY" = ( -/obj/structure/table/reinforced, -/obj/structure/desk_bell{ - pixel_x = 4; - pixel_y = 3 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchenshutters"; - name = "Kitchen Shutters" - }, -/turf/open/floor/plating, -/area/station/service/kitchen) "nQa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -43740,29 +43849,6 @@ /obj/machinery/portable_atmospherics/pipe_scrubber, /turf/open/floor/iron/dark, /area/station/engineering/atmos/storage) -"pdQ" = ( -/obj/structure/window/spawner/directional/east, -/obj/structure/closet/crate, -/obj/effect/turf_decal/bot_white, -/obj/item/clothing/gloves/color/fyellow, -/obj/item/stack/package_wrap{ - pixel_y = 5 - }, -/obj/item/stack/package_wrap{ - pixel_y = 2 - }, -/obj/item/storage/box{ - desc = "It smells of monkey business..."; - name = "Empty Gorillacube Box" - }, -/obj/item/weldingtool, -/obj/item/radio{ - pixel_y = 3; - pixel_x = -6 - }, -/obj/item/assembly/signaler, -/turf/open/floor/iron/smooth, -/area/station/commons/storage/tools) "pdR" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -44783,6 +44869,18 @@ /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"pwk" = ( +/obj/machinery/smartfridge, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchenshutters"; + name = "Kitchen Shutters"; + dir = 4 + }, +/obj/effect/turf_decal/siding/end{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/service/kitchen) "pwn" = ( /obj/effect/spawner/random/vending/colavend, /obj/structure/sign/departments/telecomms/directional/south, @@ -46229,30 +46327,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"pUG" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/table, -/obj/item/folder/red{ - pixel_y = 3 - }, -/obj/item/food/monkeycube/bee{ - name = "monkey cube"; - pixel_y = 17 - }, -/obj/item/food/monkeycube/chicken{ - pixel_y = 15; - pixel_x = 6; - name = "monkey cube"; - desc = "A new Nanotrasen classic, the monkey cube. Tastes like everything!" - }, -/obj/item/wirecutters{ - pixel_y = 6 - }, -/turf/open/floor/iron/dark, -/area/station/commons/storage/tools) "pUL" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/table/reinforced/plastitaniumglass, @@ -46979,6 +47053,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/small, /area/station/commons/toilet/restrooms) +"qgK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/kirbyplants/random, +/obj/machinery/firealarm/directional/south, +/obj/item/storage/belt/utility, +/turf/open/floor/iron/smooth, +/area/station/commons/storage/tools) "qhh" = ( /obj/structure/cable, /obj/structure/table/glass, @@ -52233,24 +52316,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/security/prison/safe) -"rVt" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = 3 - }, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -3 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchenshutters"; - name = "Kitchen Shutters" - }, -/obj/effect/spawner/random/food_or_drink/condiment, -/turf/open/floor/plating, -/area/station/service/kitchen) "rVy" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 4 @@ -53613,15 +53678,6 @@ }, /turf/open/floor/iron/textured_half, /area/station/cargo/miningoffice) -"stM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/item/kirbyplants/random, -/obj/machinery/firealarm/directional/south, -/obj/item/storage/belt/utility, -/turf/open/floor/iron/smooth, -/area/station/commons/storage/tools) "stP" = ( /obj/effect/turf_decal/siding{ dir = 1 @@ -55496,18 +55552,6 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/white/small, /area/station/medical/cryo) -"sYS" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchenshutters"; - name = "Kitchen Shutters" - }, -/obj/effect/spawner/random/food_or_drink/donuts, -/turf/open/floor/plating, -/area/station/service/kitchen) "sZo" = ( /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 10 @@ -57525,26 +57569,6 @@ dir = 4 }, /area/station/hallway/secondary/entry) -"tGW" = ( -/obj/effect/decal/cleanable/molten_object, -/obj/effect/landmark/event_spawn, -/obj/structure/table, -/obj/item/reagent_containers/cup/bottle/welding_fuel{ - pixel_y = -3; - pixel_x = 13 - }, -/obj/item/stack/sheet/iron/ten{ - pixel_y = -6; - pixel_x = -2 - }, -/obj/item/hand_labeler{ - pixel_y = -15 - }, -/obj/item/reagent_containers/cup/watering_can{ - pixel_y = 12 - }, -/turf/open/floor/iron/dark, -/area/station/commons/storage/tools) "tHa" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -67231,20 +67255,6 @@ /obj/structure/cable, /turf/closed/wall/r_wall, /area/station/maintenance/department/science/xenobiology) -"wJr" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/delivery/white, -/obj/structure/rack, -/obj/item/hand_labeler, -/obj/item/stack/cable_coil/five, -/obj/item/pickaxe, -/obj/item/wrench, -/obj/item/radio/off, -/obj/structure/sign/poster/official/random/directional/west, -/turf/open/floor/iron/smooth, -/area/station/commons/storage/tools) "wJv" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood/corner{ @@ -67719,6 +67729,26 @@ /obj/effect/landmark/navigate_destination/disposals, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) +"wOZ" = ( +/obj/effect/decal/cleanable/molten_object, +/obj/effect/landmark/event_spawn, +/obj/structure/table, +/obj/item/reagent_containers/cup/bottle/welding_fuel{ + pixel_y = -3; + pixel_x = 13 + }, +/obj/item/stack/sheet/iron/ten{ + pixel_y = -6; + pixel_x = -2 + }, +/obj/item/hand_labeler{ + pixel_y = -15 + }, +/obj/item/reagent_containers/cup/watering_can{ + pixel_y = 12 + }, +/turf/open/floor/iron/dark, +/area/station/commons/storage/tools) "wPd" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/lesser) @@ -70755,17 +70785,6 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/security/checkpoint/escape) -"xGr" = ( -/obj/structure/table, -/obj/item/toy/eightball{ - pixel_x = -4 - }, -/obj/item/wirecutters{ - pixel_y = 17; - pixel_x = 4 - }, -/turf/open/floor/iron/dark/small, -/area/station/commons/fitness/locker_room) "xGw" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -71716,6 +71735,31 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) +"xUG" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/effect/spawner/random/food_or_drink/condiment, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchenshutters"; + name = "Kitchen Shutters"; + dir = 4 + }, +/obj/effect/turf_decal/siding{ + dir = 4 + }, +/obj/effect/turf_decal/siding{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/service/kitchen) "xUK" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -89492,7 +89536,7 @@ aus voz sRg hmb -wJr +huh slY slY qQP @@ -90261,8 +90305,8 @@ slY slY eVc hbw -tGW -jes +wOZ +hmj arL sRg slY @@ -90516,10 +90560,10 @@ sRg cJT eEq sRg -pdQ +gQG hbw -lzH -eEu +aGI +hmQ pGE jug rqq @@ -90775,8 +90819,8 @@ mGY hXf xGf jLb -nGS -pUG +hgd +mrP xrZ sRg xat @@ -91292,7 +91336,7 @@ hgZ hgZ kaz eOk -stM +qgK xPX wzo hLm @@ -97490,7 +97534,7 @@ cri bOG xmt xmt -hrl +kIP xmt xmt lHZ @@ -98263,7 +98307,7 @@ oTM pLf aTg aTg -aIr +mpX sWq nUd bmY @@ -98520,7 +98564,7 @@ sJL sne aTg aTg -aIr +cOw bIN nUd bmY @@ -99028,11 +99072,11 @@ tGq xmt xmt oTN -fGk -sYS -nPY -rVt -elb +pwk +buz +jBT +xUG +jHD xmt xmt xli @@ -105187,7 +105231,7 @@ sRL bCP dqB pIf -xGr +lZP jgF wqj rEa @@ -105699,7 +105743,7 @@ nVa fuD xVV eWP -cMH +lNN lWp xhD heN diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 45a072c6152..ce8f714c0e4 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -38488,6 +38488,7 @@ pixel_y = 32; idExterior = "virology_airlock_exterior"; idInterior = "virology_airlock_interior"; + idSelf = "virology_airlock_control"; interior_airlock = "virology_airlock_control"; name = "Virology Access Controller"; req_access = list("virology") diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 4da82bc90fb..920c3c93f8d 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -268,6 +268,10 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/engineering/main) +"afW" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/security/checkpoint/supply) "afZ" = ( /obj/machinery/vending/coffee, /obj/structure/disposalpipe/segment, @@ -278,6 +282,14 @@ /mob/living/simple_animal/bot/secbot/beepsky/armsky, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"agd" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/closet/secure_closet/security/cargo, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "agi" = ( /obj/effect/spawner/random/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -448,6 +460,18 @@ /obj/structure/window/spawner/directional/east, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) +"aiy" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/computer/records/security{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/obj/machinery/firealarm/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "aja" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1216,14 +1240,6 @@ "ayr" = ( /turf/open/floor/iron, /area/station/engineering/break_room) -"ayz" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/decal/cleanable/wrapping, -/turf/open/floor/iron, -/area/station/cargo/sorting) "ayH" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, @@ -1479,6 +1495,14 @@ /obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) +"aCO" = ( +/obj/machinery/computer/exodrone_control_console{ + dir = 8 + }, +/obj/structure/railing, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "aCQ" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -1621,6 +1645,10 @@ /obj/effect/spawner/random/bureaucracy/paper, /turf/open/floor/wood, /area/station/commons/dorms) +"aFz" = ( +/obj/machinery/vending/autodrobe, +/turf/open/floor/plating, +/area/station/maintenance/port) "aFW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/mirror/directional/west, @@ -1961,17 +1989,6 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) -"aKN" = ( -/obj/structure/chair/office, -/obj/machinery/requests_console/directional/north{ - department = "Quartermaster's Desk"; - name = "Security Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/effect/landmark/start/depsec/supply, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "aKO" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -2307,6 +2324,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/server) +"aQb" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/siding/white/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "aQe" = ( /obj/machinery/light/small/directional/west, /obj/machinery/camera/directional/west{ @@ -2503,6 +2529,14 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"aUU" = ( +/obj/machinery/light/directional/east, +/obj/machinery/light_switch/directional/east, +/obj/structure/rack, +/obj/effect/decal/cleanable/greenglow/filled, +/obj/effect/spawner/random/maintenance/no_decals/eight, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "aVd" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2830,6 +2864,17 @@ }, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"aZz" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/item/stock_parts/power_store/cell/lead{ + pixel_y = 1; + pixel_x = -3 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "aZA" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3163,6 +3208,30 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"bfw" = ( +/obj/machinery/light_switch/directional/south, +/obj/machinery/conveyor_switch/oneway{ + id = "packageSort2"; + name = "Sort and Deliver"; + pixel_x = -2; + pixel_y = 12 + }, +/obj/machinery/conveyor_switch/oneway{ + dir = 8; + id = "packageExternal"; + name = "Crate Returns"; + pixel_x = -5; + pixel_y = -3 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner, +/obj/effect/turf_decal/trimline/white/corner, +/obj/structure/disposalpipe/segment, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/cargo/sorting) "bfM" = ( /obj/machinery/door/airlock/public/glass{ name = "Art Storage" @@ -3198,11 +3267,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white/smooth_large, /area/station/medical/chemistry) -"bgx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/storage) "bgS" = ( /obj/machinery/firealarm/directional/north, /obj/machinery/camera/directional/west{ @@ -4097,28 +4161,6 @@ }, /turf/open/floor/iron, /area/station/commons/locker) -"bvl" = ( -/obj/machinery/newscaster/directional/east, -/obj/structure/table, -/obj/item/stack/package_wrap{ - pixel_x = 2; - pixel_y = -3 - }, -/obj/item/stack/package_wrap{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/pen{ - pixel_x = -7; - pixel_y = 10 - }, -/obj/item/reagent_containers/cup/glass/waterbottle{ - pixel_y = 16 - }, -/obj/machinery/digital_clock/directional/north, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/sorting) "bvJ" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -4951,11 +4993,6 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/iron/dark, /area/station/service/cafeteria) -"bLj" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/effect/turf_decal/trimline/brown/filled/warning, -/turf/open/floor/iron, -/area/station/cargo/sorting) "bLm" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/green, @@ -4967,19 +5004,6 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/plating/airless, /area/space/nearstation) -"bLY" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "bMa" = ( /obj/structure/disposaloutlet{ dir = 4; @@ -5088,6 +5112,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"bNw" = ( +/obj/structure/railing/corner, +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/effect/landmark/start/cargo_technician, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "bNE" = ( /obj/machinery/light/directional/east, /obj/structure/cable, @@ -5182,18 +5214,6 @@ /obj/item/bodypart/arm/left, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"bQl" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/structure/table, -/obj/machinery/fax{ - fax_name = "Cargo Office"; - name = "Cargo Office Fax Machine" - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "bQN" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/machinery/computer/security/telescreen/entertainment/directional/north, @@ -5777,6 +5797,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"cap" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/sorting) "caO" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -6488,14 +6516,6 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"cqy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "cqD" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -7454,6 +7474,15 @@ }, /turf/open/floor/plating, /area/station/science/genetics) +"cIl" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "cIK" = ( /obj/machinery/smartfridge/chemistry/preloaded, /obj/effect/turf_decal/tile/yellow/fourcorners, @@ -7527,21 +7556,6 @@ /obj/structure/sign/directions/evac, /turf/closed/wall/r_wall, /area/station/medical/chemistry) -"cJS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "cJT" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -7581,6 +7595,20 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/carpet, /area/station/commons/dorms) +"cKD" = ( +/obj/structure/rack, +/obj/item/circuitboard/machine/exoscanner{ + pixel_y = 3 + }, +/obj/item/circuitboard/machine/exoscanner, +/obj/item/exodrone{ + pixel_y = 11 + }, +/obj/structure/railing{ + dir = 10 + }, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "cKN" = ( /obj/structure/table/wood, /obj/structure/cable, @@ -8029,6 +8057,11 @@ }, /turf/open/floor/wood, /area/station/security/office) +"cUt" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "cUw" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, @@ -8195,15 +8228,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/office) -"cXE" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/brown/filled/line, -/turf/open/floor/iron, -/area/station/cargo/sorting) "cXH" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 @@ -8595,6 +8619,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/service/theater) +"dfa" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/item/storage/test_tube_rack/full, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "dfh" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, @@ -8627,15 +8659,6 @@ "dfC" = ( /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) -"dfK" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/landmark/start/cargo_technician, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/sorting) "dfO" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -8648,11 +8671,6 @@ /obj/effect/turf_decal/box/corners, /turf/open/floor/iron, /area/station/engineering/atmos) -"dfU" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/plating, -/area/station/cargo/drone_bay) "dgc" = ( /obj/structure/cable, /obj/structure/disposalpipe/junction{ @@ -9359,6 +9377,16 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"dsJ" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/storage) "dsQ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -9386,35 +9414,24 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"dtw" = ( +/obj/machinery/door/airlock/mining{ + name = "Deliveries" + }, +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/any/supply/shipping, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/sorting) "dtB" = ( /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ dir = 8 }, /turf/open/floor/iron, /area/station/engineering/atmos) -"dtE" = ( -/obj/structure/table/reinforced, -/obj/item/stamp/denied{ - pixel_x = 4; - pixel_y = -2 - }, -/obj/item/stamp{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/pen/red{ - pixel_y = 10 - }, -/obj/item/dest_tagger{ - pixel_x = 9; - pixel_y = 10 - }, -/obj/item/pen/screwdriver{ - pixel_x = -7; - pixel_y = 7 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "dtY" = ( /obj/machinery/meter/monitored/waste_loop, /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ @@ -9727,12 +9744,6 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/cafeteria, /area/station/security/prison) -"dAk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/storage) "dBb" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/structure/window/reinforced/spawner/directional/north, @@ -9997,14 +10008,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) -"dGC" = ( -/obj/structure/reagent_dispensers/water_cooler, -/obj/effect/turf_decal/trimline/brown/filled/end{ - dir = 1 - }, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/iron, -/area/station/cargo/sorting) "dGD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -10042,15 +10045,6 @@ /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron, /area/station/cargo/lobby) -"dHz" = ( -/obj/effect/turf_decal/trimline/brown/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "dHG" = ( /obj/machinery/atmospherics/components/binary/crystallizer{ dir = 4 @@ -10725,32 +10719,6 @@ /obj/effect/turf_decal/tile/brown/anticorner/contrasted, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"dSH" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/shipping{ - pixel_x = -6; - pixel_y = 15 - }, -/obj/item/multitool{ - pixel_x = -3; - pixel_y = -4 - }, -/obj/item/storage/box/lights/mixed{ - pixel_x = 8; - pixel_y = 11 - }, -/obj/item/flashlight/lamp{ - pixel_x = -7; - pixel_y = 5 - }, -/obj/item/storage/box/shipping{ - pixel_x = 8 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "dSJ" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/sign/poster/random/directional/north, @@ -11099,25 +11067,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron, /area/station/security/courtroom) -"dYi" = ( -/obj/structure/table, -/obj/item/stock_parts/micro_laser{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/stock_parts/micro_laser{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/stock_parts/micro_laser{ - pixel_x = 2 - }, -/obj/item/stock_parts/micro_laser{ - pixel_x = 6; - pixel_y = -2 - }, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "dYl" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -11264,12 +11213,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/sorting) -"ebg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/storage) "ebr" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=0-SecurityDesk"; @@ -11782,6 +11725,34 @@ }, /turf/open/floor/iron/dark, /area/station/medical/medbay/central) +"ejD" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/table, +/obj/item/stack/wrapping_paper, +/obj/item/paper_bin/carbon{ + pixel_y = 8; + pixel_x = 6 + }, +/obj/item/pen/fourcolor{ + pixel_y = 8; + pixel_x = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/wrapping, +/obj/item/sales_tagger{ + pixel_x = -5; + pixel_y = 4 + }, +/obj/item/dest_tagger{ + pixel_x = -2; + pixel_y = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "ejF" = ( /obj/effect/turf_decal/trimline/brown/warning{ dir = 5 @@ -11852,13 +11823,6 @@ }, /turf/open/floor/wood, /area/station/service/lawoffice) -"ekb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "ekh" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -12003,19 +11967,6 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) -"elz" = ( -/obj/structure/rack, -/obj/item/circuitboard/machine/exoscanner{ - pixel_y = 3 - }, -/obj/item/circuitboard/machine/exoscanner, -/obj/item/circuitboard/machine/exoscanner{ - pixel_y = -3 - }, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "elJ" = ( /turf/closed/wall/r_wall, /area/station/science/server) @@ -12054,15 +12005,6 @@ }, /turf/open/floor/iron/white, /area/station/science/research) -"eml" = ( -/obj/machinery/light/directional/south, -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/landmark/start/assistant, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/cargo/lobby) "emN" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -12329,6 +12271,16 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/wood, /area/station/service/library) +"erU" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/computer/cargo/request{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/lobby) "esd" = ( /obj/item/reagent_containers/cup/glass/drinkingglass{ pixel_x = 4; @@ -12702,6 +12654,13 @@ /obj/structure/cable, /turf/open/floor/iron/freezer, /area/station/security/prison/shower) +"exB" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/brown/filled/warning, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/sorting) "exC" = ( /obj/effect/turf_decal/plaque{ icon_state = "L3" @@ -12932,6 +12891,12 @@ }, /turf/closed/wall/r_wall, /area/station/command/heads_quarters/captain/private) +"eDO" = ( +/obj/effect/turf_decal/siding/white{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "eDX" = ( /obj/structure/sign/departments/science/directional/east, /obj/effect/turf_decal/tile/purple{ @@ -13905,6 +13870,10 @@ }, /turf/open/floor/iron, /area/station/commons/locker) +"eVG" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "eVX" = ( /obj/machinery/firealarm/directional/west, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -14350,13 +14319,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"fea" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/reagent_dispensers/wall/peppertank/directional/east, -/obj/effect/landmark/start/depsec/supply, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "fec" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /turf/closed/wall/r_wall, @@ -15245,9 +15207,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) -"fru" = ( -/turf/closed/wall, -/area/station/cargo/drone_bay) "frw" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -15388,14 +15347,6 @@ /obj/effect/turf_decal/tile/brown/opposingcorners, /turf/open/floor/iron, /area/station/cargo/storage) -"fwd" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "fwz" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /turf/open/floor/iron/dark, @@ -15536,6 +15487,16 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/station/solars/port/fore) +"fzo" = ( +/obj/effect/turf_decal/stripes/line, +/obj/item/stock_parts/micro_laser{ + pixel_x = 6; + pixel_y = -2 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/caution, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "fzr" = ( /obj/structure/window/spawner/directional/south, /obj/structure/window/spawner/directional/west, @@ -15743,6 +15704,15 @@ /obj/structure/cable, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai_upload) +"fEV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/machinery/door/airlock/security/glass{ + name = "Security Post - Cargo" + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "fEW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16111,15 +16081,6 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/general, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"fLp" = ( -/obj/structure/disposalpipe/junction{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "fLq" = ( /obj/machinery/door/window/left/directional/north{ name = "Inner Pipe Access"; @@ -16156,6 +16117,14 @@ /obj/machinery/power/tracker, /turf/open/floor/plating/airless, /area/station/solars/starboard/fore) +"fMa" = ( +/obj/structure/rack, +/obj/effect/spawner/random/trash/ghetto_containers, +/obj/effect/spawner/random/trash/ghetto_containers, +/obj/effect/spawner/random/trash/ghetto_containers, +/obj/effect/spawner/random/trash/ghetto_containers, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "fMf" = ( /obj/structure/chair/office{ dir = 1 @@ -16192,6 +16161,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"fMC" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/landmark/start/depsec/supply, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "fMN" = ( /obj/machinery/firealarm/directional/west, /obj/structure/disposalpipe/segment{ @@ -16601,14 +16580,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/white, /area/station/security/prison/safe) -"fWn" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/structure/closet/crate, -/turf/open/floor/iron, -/area/station/cargo/sorting) "fWw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16825,6 +16796,26 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/storage) +"gav" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/table, +/obj/machinery/photocopier{ + pixel_y = 9 + }, +/obj/item/paper/fluff{ + pixel_y = 8; + pixel_x = 4; + default_raw_text = "Next CT to photocopy their ass is getting thrown under the shuttle. I'm serious here.
- QM"; + name = "note" + }, +/obj/machinery/newscaster/directional/east, +/obj/item/pen/screwdriver{ + pixel_x = 1; + pixel_y = 11 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "gaG" = ( /obj/effect/spawner/random/maintenance, /obj/structure/cable, @@ -17034,22 +17025,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/grass, /area/station/medical/virology) -"geR" = ( -/obj/structure/table, -/obj/item/papercutter{ - pixel_x = 9; - pixel_y = 4 - }, -/obj/item/stamp/denied{ - pixel_x = -7; - pixel_y = 7 - }, -/obj/item/stamp/granted{ - pixel_x = -7 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/sorting) "geV" = ( /obj/structure/sink/directional/east, /obj/machinery/light_switch/directional/west, @@ -17150,6 +17125,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"ggW" = ( +/obj/machinery/space_heater/improvised_chem_heater, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "ggZ" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/disposalpipe/segment{ @@ -17739,6 +17718,19 @@ }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) +"gsV" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/siding/white/corner{ + dir = 4 + }, +/obj/structure/railing/corner/end{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "gsW" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical/glass{ @@ -18026,32 +18018,6 @@ }, /turf/open/floor/iron/checker, /area/station/engineering/atmos/storage/gas) -"gxM" = ( -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/structure/table, -/obj/item/stack/package_wrap{ - pixel_x = 2; - pixel_y = -3 - }, -/obj/item/stack/package_wrap{ - pixel_x = 1; - pixel_y = 6 - }, -/obj/item/stack/package_wrap{ - pixel_x = -4; - pixel_y = 8 - }, -/obj/item/dest_tagger{ - pixel_x = -9; - pixel_y = 12 - }, -/obj/item/hand_labeler_refill{ - pixel_x = -11; - pixel_y = -3 - }, -/obj/item/stack/wrapping_paper, -/turf/open/floor/iron, -/area/station/cargo/sorting) "gya" = ( /obj/structure/table, /obj/item/storage/box/hug{ @@ -19005,6 +18971,10 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/engine, /area/station/science/xenobiology) +"gOO" = ( +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "gOS" = ( /obj/structure/cable, /obj/structure/table/glass, @@ -19047,24 +19017,16 @@ /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"gPw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "gPA" = ( /obj/structure/table/wood, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) -"gPN" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/light/small/directional/north, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/sorting) "gPY" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -19524,6 +19486,16 @@ /obj/effect/mapping_helpers/mail_sorting/service/kitchen, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) +"gZq" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/structure/chair/office/light, +/obj/effect/landmark/start/depsec/supply, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "gZu" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -19559,6 +19531,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/main) +"hab" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/sorting) "hav" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -19595,6 +19577,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/main) +"haZ" = ( +/obj/item/reagent_containers/cup/glass/mug/britcup, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "hbv" = ( /turf/closed/wall/r_wall, /area/station/medical/coldroom) @@ -20053,9 +20041,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"hkj" = ( -/turf/open/floor/plating, -/area/station/cargo/drone_bay) "hko" = ( /obj/effect/turf_decal/bot{ dir = 1 @@ -20207,6 +20192,10 @@ }, /turf/open/floor/engine/vacuum, /area/space/nearstation) +"hlT" = ( +/obj/structure/falsewall, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "hmf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -20437,11 +20426,6 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2, /turf/open/floor/iron/dark/airless, /area/station/science/ordnance/freezerchamber) -"hrC" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/security/checkpoint/supply) "hrG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20473,17 +20457,6 @@ dir = 8 }, /area/station/service/chapel/office) -"hsx" = ( -/obj/machinery/door/airlock/mining{ - name = "Drone Bay" - }, -/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, -/obj/effect/landmark/navigate_destination, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/cargo/drone_bay) "hsF" = ( /obj/machinery/door/airlock{ id_tag = "AuxToilet3"; @@ -20655,31 +20628,6 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/plating, /area/station/security/checkpoint/customs) -"hvk" = ( -/obj/effect/spawner/random/bureaucracy/birthday_wrap, -/obj/item/stack/package_wrap{ - pixel_y = 5 - }, -/obj/item/stack/package_wrap{ - pixel_y = 2 - }, -/obj/item/stack/package_wrap, -/obj/machinery/light/directional/south, -/obj/machinery/firealarm/directional/south, -/obj/structure/table, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) -"hvo" = ( -/obj/structure/filingcabinet, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "hvr" = ( /obj/machinery/camera/directional/south{ c_tag = "Central Primary Hallway - Fore - Courtroom" @@ -21157,6 +21105,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"hCh" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/cargo/sorting) "hCl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -21236,11 +21191,6 @@ /obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron/white, /area/station/security/prison) -"hDX" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/checkpoint/supply) "hEc" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/poddoor/shutters/preopen{ @@ -21609,12 +21559,6 @@ }, /turf/open/floor/iron/white, /area/station/science/cytology) -"hLL" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/storage) "hLZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/junction{ @@ -21890,6 +21834,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/brig) +"hRJ" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/obj/item/paper_bin/carbon, +/obj/item/pen/red/security, +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "hRQ" = ( /obj/machinery/disposal/bin{ pixel_x = -2; @@ -22211,13 +22162,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/commons/locker) -"hWK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/landmark/start/depsec/supply, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "hWW" = ( /obj/structure/bookcase/random, /turf/open/floor/iron, @@ -22652,6 +22596,24 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/station/cargo/sorting) +"ieD" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/hypospray/medipen/pumpup, +/obj/item/reagent_containers/hypospray/medipen/pumpup{ + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/mortar{ + pixel_x = 3 + }, +/obj/item/extinguisher/crafted{ + pixel_y = 9; + pixel_x = 3 + }, +/obj/item/pestle{ + pixel_x = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "ieH" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -22992,10 +22954,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/satellite) -"ikL" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "ikO" = ( /obj/machinery/newscaster/directional/north, /obj/structure/table/glass, @@ -23149,6 +23107,13 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"imT" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "imU" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24123,24 +24088,6 @@ /obj/effect/landmark/start/security_officer, /turf/open/floor/iron/dark, /area/station/security/range) -"iDG" = ( -/obj/structure/table, -/obj/item/stock_parts/scanning_module{ - pixel_x = -5; - pixel_y = 7 - }, -/obj/item/stock_parts/scanning_module{ - pixel_x = 5; - pixel_y = 7 - }, -/obj/item/stock_parts/scanning_module{ - pixel_x = -5 - }, -/obj/item/stock_parts/scanning_module{ - pixel_x = 5 - }, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "iDN" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24314,16 +24261,6 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/engine, /area/station/science/xenobiology) -"iHS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/security/glass{ - name = "Security Post - Cargo" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/security/general, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "iId" = ( /obj/machinery/conveyor{ id = "mining" @@ -24816,6 +24753,22 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/brig) +"iQb" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = 9 + }, +/obj/item/pen/red{ + pixel_y = 7; + pixel_x = 9 + }, +/obj/machinery/recharger, +/obj/machinery/digital_clock/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "iQd" = ( /obj/machinery/door/poddoor/shutters{ id = "supplybridge" @@ -26177,12 +26130,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port) -"jmR" = ( -/obj/structure/closet/secure_closet/security/cargo, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "jmT" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral{ @@ -26379,16 +26326,6 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/plating, /area/station/maintenance/port) -"jqr" = ( -/obj/machinery/computer/security/mining{ - dir = 4 - }, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "jqQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -26424,6 +26361,11 @@ }, /turf/open/floor/iron, /area/station/commons/locker) +"jrQ" = ( +/obj/effect/turf_decal/loading_area, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "jrY" = ( /obj/machinery/door/airlock/external{ name = "Transport Airlock" @@ -26957,6 +26899,17 @@ "jzp" = ( /turf/closed/wall, /area/station/commons/vacant_room/office) +"jzq" = ( +/obj/structure/table/wood, +/obj/structure/chem_separator{ + pixel_y = 10 + }, +/obj/item/reagent_containers/cup/glass/trophy{ + pixel_y = 15; + pixel_x = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "jzw" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -27076,29 +27029,6 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron, /area/station/cargo/storage) -"jBy" = ( -/obj/machinery/light_switch/directional/south, -/obj/machinery/conveyor_switch/oneway{ - id = "packageSort2"; - name = "Sort and Deliver"; - pixel_x = -2; - pixel_y = 12 - }, -/obj/machinery/conveyor_switch/oneway{ - dir = 8; - id = "packageExternal"; - name = "Crate Returns"; - pixel_x = -5; - pixel_y = -3 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner, -/obj/effect/turf_decal/trimline/white/corner, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/sorting) "jBC" = ( /obj/structure/table, /obj/item/clothing/head/soft/grey{ @@ -27165,6 +27095,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) +"jCs" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/vending/boozeomat, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) "jCw" = ( /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, @@ -27418,6 +27353,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai_upload) +"jHM" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/landmark/start/cargo_technician, +/turf/open/floor/iron, +/area/station/cargo/sorting) "jHQ" = ( /obj/structure/chair/sofa/corp/left{ dir = 1 @@ -27428,12 +27370,6 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron/dark, /area/station/medical/break_room) -"jHW" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/effect/turf_decal/trimline/brown/filled/warning, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/sorting) "jHX" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -28010,28 +27946,6 @@ "jRg" = ( /turf/open/floor/engine/co2, /area/station/engineering/atmos) -"jRo" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/structure/table, -/obj/item/hand_labeler_refill{ - pixel_x = 12; - pixel_y = -3 - }, -/obj/effect/spawner/random/bureaucracy/birthday_wrap{ - pixel_x = -2; - pixel_y = 8 - }, -/obj/item/stack/package_wrap{ - pixel_x = -6; - pixel_y = 18 - }, -/obj/item/hand_labeler, -/obj/item/stack/package_wrap, -/turf/open/floor/iron, -/area/station/cargo/sorting) "jRz" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance, @@ -28915,6 +28829,20 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron, /area/station/science/xenobiology) +"kgZ" = ( +/obj/structure/sign/poster/official/random/directional/south, +/obj/item/wallframe/camera{ + pixel_y = 9; + pixel_x = -3 + }, +/obj/structure/fermenting_barrel, +/obj/item/clothing/head/fedora{ + pixel_y = 13; + name = "porkpie hat"; + desc = "This hat reeks of bad decisions and chemical compounds. There's some odd white dust covering it." + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "kha" = ( /obj/structure/disposalpipe/segment, /obj/machinery/airalarm/directional/east, @@ -29078,6 +29006,13 @@ /obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, /turf/open/floor/iron/dark, /area/station/engineering/atmos/storage/gas) +"kkA" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/computer/security, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "kkB" = ( /obj/machinery/mineral/ore_redemption{ dir = 4; @@ -29626,17 +29561,6 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/station/solars/port/fore) -"kuS" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"kuW" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/cargo/drone_bay) "kvd" = ( /obj/machinery/light/directional/west, /obj/structure/cable, @@ -29695,14 +29619,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"kwh" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/storage) "kwp" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/delivery, @@ -29834,6 +29750,16 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) +"kyf" = ( +/obj/machinery/computer/exoscanner_control, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_y = 19; + pixel_x = -6 + }, +/obj/structure/sign/departments/exodrone/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "kyh" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, @@ -30110,6 +30036,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"kDb" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/landmark/start/depsec/supply, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "kDk" = ( /obj/machinery/door/airlock/security/glass{ name = "Permabrig Visitation" @@ -30200,15 +30133,16 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/main) -"kFa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/cargo_technician, -/obj/structure/chair/office{ +"kFb" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/siding/white/corner{ dir = 4 }, /turf/open/floor/iron, -/area/station/cargo/sorting) +/area/station/cargo/storage) "kFg" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 1 @@ -30237,6 +30171,16 @@ /obj/structure/cable, /turf/open/floor/carpet, /area/station/service/library) +"kFQ" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/landmark/start/cargo_technician, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "kFS" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -30394,6 +30338,24 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) +"kJk" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/machinery/camera/directional/west, +/obj/machinery/requests_console/directional/west, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/item/dest_tagger{ + pixel_x = -9; + pixel_y = 12 + }, +/obj/item/hand_labeler_refill{ + pixel_x = -11; + pixel_y = -3 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "kJx" = ( /obj/structure/chair/office, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -31385,14 +31347,6 @@ /obj/effect/spawner/random/trash/janitor_supplies, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"lak" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "lav" = ( /obj/structure/girder, /obj/effect/spawner/random/structure/grille, @@ -31494,6 +31448,22 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/gateway) +"lcI" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/obj/effect/turf_decal/siding/white/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "lcJ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31867,6 +31837,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/command/bridge) +"ljT" = ( +/obj/machinery/exodrone_launcher, +/obj/item/exodrone, +/obj/effect/turf_decal/box, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "lkc" = ( /obj/machinery/barsign, /turf/closed/wall, @@ -32087,10 +32063,6 @@ /obj/machinery/meter, /turf/closed/wall/r_wall, /area/station/engineering/atmos) -"lpt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/construction/storage_wing) "lpA" = ( /obj/machinery/air_sensor/nitrogen_tank, /turf/open/floor/engine/n2, @@ -32258,27 +32230,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) -"lsU" = ( -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/structure/table, -/obj/item/stack/package_wrap{ - pixel_x = -2; - pixel_y = 1 - }, -/obj/effect/spawner/random/bureaucracy/birthday_wrap{ - pixel_x = -2; - pixel_y = 8 - }, -/obj/item/dest_tagger{ - pixel_x = 7; - pixel_y = 1 - }, -/obj/item/stack/wrapping_paper{ - pixel_x = -4; - pixel_y = -7 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "lsV" = ( /obj/effect/turf_decal/siding/purple{ dir = 10 @@ -32451,11 +32402,6 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) -"lvY" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/vending/boozeomat, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) "lvZ" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, @@ -32583,6 +32529,15 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"lzD" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/sorting) "lzJ" = ( /obj/structure/cable, /turf/open/floor/iron/solarpanel/airless, @@ -34908,12 +34863,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"muq" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "mur" = ( /obj/machinery/light/directional/north, /obj/machinery/status_display/evac/directional/north, @@ -35048,14 +34997,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/main) -"mwP" = ( -/obj/structure/cable, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "mwY" = ( /obj/effect/spawner/random/trash/garbage, /obj/effect/landmark/generic_maintenance_landmark, @@ -35090,13 +35031,6 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/iron, /area/station/engineering/atmos) -"mxx" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/station/cargo/sorting) "mxI" = ( /obj/structure/disposalpipe/junction/flip, /obj/structure/cable, @@ -35164,10 +35098,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/gravity_generator) -"myZ" = ( -/obj/machinery/vending/autodrobe, -/turf/open/floor/plating, -/area/station/maintenance/port) "mzg" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/red, @@ -35175,16 +35105,6 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron, /area/station/security/checkpoint/science) -"mzj" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/cargo/sorting) "mzm" = ( /obj/structure/table, /obj/item/reagent_containers/condiment/saltshaker{ @@ -36390,12 +36310,6 @@ /obj/effect/turf_decal/trimline/brown/filled/line, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"mUF" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "mUL" = ( /obj/machinery/door/airlock/atmos{ name = "Hypertorus Fusion Reactor" @@ -37272,6 +37186,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"nkq" = ( +/obj/effect/turf_decal/loading_area, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "nkG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /obj/machinery/meter, @@ -37554,6 +37472,16 @@ /obj/structure/window/spawner/directional/east, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"npX" = ( +/obj/structure/cable, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/storage) "npY" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -37938,12 +37866,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/office) -"nut" = ( -/obj/structure/cable, -/obj/effect/turf_decal/bot_white, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/iron, -/area/station/cargo/storage) "nuB" = ( /obj/structure/secure_safe/directional/south, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -38147,6 +38069,15 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/service/bar/backroom) +"nxI" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron/stairs, +/area/station/cargo/storage) "nxO" = ( /obj/structure/chair/office{ dir = 8 @@ -38829,20 +38760,6 @@ }, /turf/open/space/basic, /area/space) -"nKu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/item/reagent_containers/cup/glass/waterbottle{ - pixel_y = 48; - pixel_x = 9 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "nKE" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, @@ -38896,13 +38813,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/wood, /area/station/service/library) -"nLx" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "nLz" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -39729,17 +39639,17 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood, /area/station/commons/dorms) -"obF" = ( -/obj/machinery/computer/exoscanner_control{ +"oby" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 }, -/obj/machinery/camera/directional/south{ - c_tag = "Cargo Bay - Drone Launch Room"; - pixel_x = 14 +/obj/machinery/computer/security/mining, +/obj/structure/reagent_dispensers/wall/peppertank/directional/north, +/obj/machinery/light/small/directional/north{ + pixel_x = -11 }, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "obG" = ( /turf/closed/wall, /area/station/service/theater) @@ -40240,6 +40150,15 @@ /obj/structure/sign/poster/random/directional/south, /turf/open/floor/plating, /area/station/hallway/secondary/service) +"omc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "omd" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -41448,6 +41367,12 @@ }, /turf/open/floor/iron/dark, /area/station/security/office) +"oHm" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/iron/stairs, +/area/station/cargo/storage) "oHw" = ( /obj/structure/cable, /turf/open/floor/iron/white/corner, @@ -41751,6 +41676,11 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/medical/office) +"oNR" = ( +/obj/effect/turf_decal/bot_white, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/iron, +/area/station/cargo/storage) "oOl" = ( /obj/machinery/flasher/directional/north{ id = "AI" @@ -41796,6 +41726,12 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/space, /area/space/nearstation) +"oOY" = ( +/obj/structure/rack, +/obj/item/fuel_pellet, +/obj/item/fuel_pellet, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "oOZ" = ( /obj/machinery/power/port_gen/pacman/pre_loaded, /turf/open/floor/plating, @@ -41924,6 +41860,15 @@ }, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) +"oRx" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/white{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "oRM" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 4 @@ -42020,16 +41965,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"oTw" = ( -/obj/machinery/door/airlock/mining{ - name = "Deliveries" - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/any/supply/shipping, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/sorting) "oTD" = ( /obj/structure/frame/computer, /turf/open/floor/plating/airless, @@ -42296,6 +42231,11 @@ /obj/machinery/light/small/red/directional/west, /turf/open/floor/plating/airless, /area/space/nearstation) +"oYs" = ( +/obj/machinery/vending/autodrobe, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "oYv" = ( /obj/effect/decal/cleanable/cobweb, /obj/structure/bed, @@ -42396,15 +42336,6 @@ "paD" = ( /turf/closed/wall, /area/station/cargo/bitrunning/den) -"paQ" = ( -/obj/structure/window/spawner/directional/south, -/obj/machinery/computer/cargo/request{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/cargo/sorting) "paU" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/unres{ @@ -42782,14 +42713,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"phP" = ( -/obj/structure/table, -/obj/item/exodrone{ - pixel_y = 8 - }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "phR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42899,6 +42822,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) +"pjX" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/machinery/light/small/directional/north, +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/iron, +/area/station/cargo/sorting) "pke" = ( /obj/effect/turf_decal/siding/red{ dir = 6 @@ -42916,13 +42852,6 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/rd) -"pkF" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/photocopier, -/turf/open/floor/iron, -/area/station/cargo/sorting) "pkH" = ( /obj/structure/rack, /obj/item/restraints/handcuffs, @@ -43082,6 +43011,15 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) +"pnl" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/item/wallframe/apc, +/obj/item/phone, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/caution, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "pnx" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -43135,6 +43073,12 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) +"pog" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/station/security/checkpoint/supply) "poj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -43886,19 +43830,6 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/dark, /area/station/medical/break_room) -"pCs" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Cargo Bay - Mailroom" - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/white/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "pCt" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -43944,6 +43875,13 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) +"pDf" = ( +/obj/machinery/requests_console/directional/south{ + department = "Mining"; + name = "Mining Requests Console" + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "pDl" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/window/left/directional/north{ @@ -44136,6 +44074,11 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) +"pGJ" = ( +/obj/item/chair/wood/wings, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "pGZ" = ( /obj/machinery/shower/directional/east, /obj/structure/cable, @@ -44634,6 +44577,18 @@ /obj/structure/cable, /turf/open/floor/iron/grimy, /area/station/security/interrogation) +"pPm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/wrapping, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/sorting) "pPp" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/chair/comfy/black{ @@ -44969,6 +44924,20 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/grimy, /area/station/security/interrogation) +"pVK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "pVM" = ( /obj/machinery/light/small/directional/south, /obj/machinery/camera/directional/south{ @@ -45826,6 +45795,12 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"qlh" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "qlz" = ( /obj/effect/spawner/random/vending/colavend, /obj/machinery/light/directional/north, @@ -45856,6 +45831,11 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron, /area/station/construction/storage_wing) +"qme" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/item/storage/test_tube_rack/full, +/turf/open/floor/iron, +/area/station/construction/storage_wing) "qmf" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/table/wood, @@ -46042,12 +46022,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/service/library) -"qqr" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "qqs" = ( /obj/structure/table, /obj/item/multitool{ @@ -46108,13 +46082,6 @@ /obj/machinery/computer/security/telescreen/minisat/directional/south, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) -"qrF" = ( -/obj/machinery/computer/exodrone_control_console{ - dir = 1 - }, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "qrL" = ( /obj/effect/decal/cleanable/oil/streak, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -46909,12 +46876,6 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/hallway/primary/port) -"qHa" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "qHh" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 9 @@ -46948,6 +46909,10 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"qHW" = ( +/obj/item/storage/test_tube_rack/full, +/turf/closed/wall/r_wall, +/area/station/security/prison/safe) "qHY" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -47062,11 +47027,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/white, /area/station/medical/pharmacy) -"qJH" = ( -/obj/machinery/vending/autodrobe, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/locker) "qJU" = ( /obj/structure/sign/map/right{ desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; @@ -47354,6 +47314,13 @@ }, /turf/open/floor/iron, /area/station/security/prison) +"qNL" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "qNO" = ( /obj/structure/table/glass, /obj/item/folder/blue{ @@ -47463,13 +47430,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"qOZ" = ( -/obj/machinery/requests_console/directional/south{ - department = "Mining"; - name = "Mining Requests Console" - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "qPs" = ( /obj/structure/lattice/catwalk, /obj/structure/marker_beacon/indigo, @@ -47728,9 +47688,6 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"qST" = ( -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "qTf" = ( /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 1 @@ -48466,18 +48423,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) -"rgL" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/glass/mug/britcup{ - pixel_x = -6; - pixel_y = 11 - }, -/obj/item/phone{ - pixel_x = 6; - pixel_y = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "rgS" = ( /obj/machinery/modular_computer/preset/civilian{ dir = 1 @@ -48487,6 +48432,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/robotics/lab) +"rgW" = ( +/obj/machinery/exodrone_launcher, +/obj/effect/turf_decal/box, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "rgZ" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -48705,6 +48655,14 @@ /obj/item/target/syndicate, /turf/open/floor/engine, /area/station/science/explab) +"rkX" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "rla" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -48778,13 +48736,6 @@ /obj/effect/mapping_helpers/airlock/access/all/service/lawyer, /turf/open/floor/plating, /area/station/maintenance/fore) -"rmL" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/decal/cleanable/wrapping, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/landmark/start/cargo_technician, -/turf/open/floor/iron, -/area/station/cargo/sorting) "rmO" = ( /obj/structure/chair/comfy/black{ dir = 8 @@ -48926,16 +48877,6 @@ /obj/machinery/light/floor, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"roG" = ( -/obj/machinery/firealarm/directional/west, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/disposal/bin/tagger, -/obj/structure/sign/poster/official/random/directional/south, -/obj/effect/turf_decal/trimline/brown/filled/corner, -/turf/open/floor/iron, -/area/station/cargo/sorting) "rps" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -49162,6 +49103,20 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"rtG" = ( +/obj/effect/turf_decal/trimline/brown/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 6 + }, +/obj/effect/landmark/start/assistant, +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/cargo/lobby) "rtI" = ( /obj/effect/landmark/secequipment, /obj/effect/turf_decal/bot, @@ -49688,6 +49643,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"rBB" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "rBU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -49917,6 +49878,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) +"rGk" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/modular_computer/preset/cargochat/cargo, +/turf/open/floor/iron, +/area/station/cargo/sorting) "rGm" = ( /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/shutters{ @@ -50246,6 +50220,10 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"rMd" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "rMe" = ( /obj/structure/table, /obj/machinery/button/door{ @@ -50335,6 +50313,11 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"rNA" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/iron, +/area/station/cargo/sorting) "rNI" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -50446,13 +50429,6 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/wood, /area/station/commons/lounge) -"rPO" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "rQd" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -51181,14 +51157,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) -"sbP" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/landmark/start/cargo_technician, -/turf/open/floor/iron, -/area/station/cargo/storage) "sbX" = ( /obj/machinery/hydroponics/soil, /obj/effect/decal/cleanable/dirt, @@ -51415,6 +51383,12 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"sgZ" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/cargo/sorting) "shl" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -51647,16 +51621,6 @@ /obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior, /turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) -"sml" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/sorting) "smt" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{ dir = 4 @@ -51918,6 +51882,30 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/grimy, /area/station/security/office) +"ssu" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/spray/syndicate{ + pixel_y = 4; + pixel_x = 7 + }, +/obj/item/reagent_containers/pill/maintenance{ + pixel_x = -4; + pixel_y = -1 + }, +/obj/item/reagent_containers/pill/maintenance{ + pixel_x = -4; + pixel_y = 1 + }, +/obj/item/reagent_containers/pill/maintenance{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/reagent_containers/pill/happy{ + pixel_y = 6; + pixel_x = -4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "ssI" = ( /obj/machinery/power/emitter, /turf/open/floor/plating, @@ -51985,33 +51973,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"sul" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 8; - pixel_y = 1 - }, -/obj/item/paper_bin{ - pixel_x = 8; - pixel_y = 6 - }, -/obj/item/paper_bin{ - pixel_x = 8; - pixel_y = 11 - }, -/obj/item/folder/yellow{ - pixel_x = -6; - pixel_y = 8 - }, -/obj/item/folder/yellow{ - pixel_x = -9; - pixel_y = 1 - }, -/obj/item/paper{ - pixel_x = -5 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "sus" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -52349,6 +52310,13 @@ /obj/machinery/telecomms/server/presets/engineering, /turf/open/floor/circuit/telecomms/mainframe, /area/station/tcommsat/server) +"sAt" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/siding/white/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "sAv" = ( /obj/machinery/stasis, /obj/machinery/defibrillator_mount/directional/north, @@ -52899,6 +52867,11 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"sJq" = ( +/obj/machinery/exoscanner, +/obj/effect/turf_decal/delivery/white, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "sJL" = ( /obj/item/crowbar, /obj/structure/cable, @@ -53172,6 +53145,19 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"sOE" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/effect/turf_decal/siding/white/corner{ + dir = 1 + }, +/obj/structure/railing/corner/end{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "sOF" = ( /obj/structure/light_construct/directional/east, /turf/open/floor/wood, @@ -53275,11 +53261,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central) -"sQp" = ( -/obj/machinery/exodrone_launcher, -/obj/item/exodrone, -/turf/open/floor/plating, -/area/station/cargo/drone_bay) "sQq" = ( /obj/structure/closet/crate/hydroponics, /obj/item/paper/guides/jobs/hydroponics, @@ -53921,6 +53902,12 @@ dir = 1 }, /area/station/hallway/secondary/entry) +"sZT" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/security/checkpoint/supply) "sZU" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -54104,10 +54091,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"tdg" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/cargo/drone_bay) "tds" = ( /obj/effect/turf_decal/box/corners{ dir = 8 @@ -54386,6 +54369,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"tjt" = ( +/obj/item/sticker/syndicate/apc{ + pixel_x = 25 + }, +/obj/effect/spawner/random/engineering/tank, +/obj/structure/railing{ + dir = 10 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/fuel_pool, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "tju" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -55678,6 +55674,18 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) +"tIU" = ( +/obj/machinery/door/airlock/maintenance/glass, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "tJb" = ( /obj/machinery/firealarm/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -55964,22 +55972,6 @@ /obj/structure/sign/poster/contraband/random/directional/east, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"tMY" = ( -/obj/structure/cable, -/obj/structure/table/reinforced, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/item/radio/off{ - pixel_x = -11; - pixel_y = -3 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/obj/item/binoculars, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "tNg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -56211,14 +56203,6 @@ /obj/item/clothing/mask/surgical, /turf/open/floor/iron/showroomfloor, /area/station/maintenance/starboard/lesser) -"tPW" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/structure/filingcabinet/filingcabinet, -/turf/open/floor/iron, -/area/station/cargo/sorting) "tQp" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/wood{ @@ -56717,13 +56701,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/plating, /area/station/security/execution/transfer) -"tYU" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/storage) "tYW" = ( /obj/machinery/light/directional/south, /obj/structure/cable, @@ -56913,11 +56890,6 @@ /obj/machinery/telecomms/broadcaster/preset_left, /turf/open/floor/circuit/telecomms/mainframe, /area/station/tcommsat/server) -"ubn" = ( -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/effect/turf_decal/trimline/brown/filled/warning, -/turf/open/floor/iron, -/area/station/cargo/sorting) "ubp" = ( /obj/structure/girder, /obj/effect/spawner/random/structure/grille, @@ -57187,14 +57159,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"uha" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/landmark/start/depsec/supply, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "uhq" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -57332,11 +57296,6 @@ /obj/structure/mirror/directional/east, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) -"ujT" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/spawner/random/structure/tank_holder, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "uke" = ( /obj/structure/rack, /obj/effect/spawner/random/food_or_drink/booze{ @@ -57815,15 +57774,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"usJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/cargo/sorting) "usK" = ( /obj/structure/table, /obj/item/storage/toolbox/emergency, @@ -57875,14 +57825,6 @@ }, /turf/open/floor/wood, /area/station/security/office) -"uth" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "utk" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -57939,17 +57881,6 @@ dir = 8 }, /area/station/service/chapel) -"uud" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 4 - }, -/obj/effect/decal/cleanable/wrapping, -/turf/open/floor/iron, -/area/station/cargo/sorting) "uuv" = ( /obj/machinery/holopad, /obj/effect/turf_decal/stripes/line{ @@ -57969,6 +57900,19 @@ }, /turf/open/floor/iron, /area/station/security/mechbay) +"uuW" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/table, +/obj/machinery/fax{ + fax_name = "Cargo Office"; + name = "Cargo Office Fax Machine" + }, +/obj/item/papercutter{ + pixel_x = 8; + pixel_y = 8 + }, +/turf/open/floor/plating, +/area/station/cargo/sorting) "uvw" = ( /obj/machinery/status_display/supply{ pixel_y = 32 @@ -58024,26 +57968,6 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/engineering/main) -"uwf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/book/manual/wiki/security_space_law, -/obj/machinery/camera/directional/south{ - c_tag = "Security Post - Cargo" - }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "uwh" = ( /obj/structure/chair/comfy{ dir = 1 @@ -58071,12 +57995,6 @@ /obj/effect/landmark/start/roboticist, /turf/open/floor/iron, /area/station/science/robotics/lab) -"uwM" = ( -/obj/effect/landmark/start/depsec/supply, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "uwQ" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos) @@ -58175,6 +58093,37 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) +"uyP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/opposingcorners, +/obj/structure/table, +/obj/machinery/light/directional/east, +/obj/item/radio/intercom/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/stamp/granted{ + pixel_x = -7; + pixel_y = 4 + }, +/obj/item/stamp/denied{ + pixel_x = -7; + pixel_y = 15 + }, +/obj/item/storage/box/lights/mixed{ + pixel_x = 5; + pixel_y = 12 + }, +/obj/item/storage/box/lights/mixed{ + pixel_x = 5; + pixel_y = 24 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "uyY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -58184,13 +58133,6 @@ "uza" = ( /turf/closed/wall/r_wall, /area/station/security/prison/visit) -"uzb" = ( -/obj/structure/rack, -/obj/machinery/light/directional/east, -/obj/item/fuel_pellet, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "uzc" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -58363,6 +58305,15 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/wood, /area/station/command/corporate_showroom) +"uCR" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "uCS" = ( /obj/structure/chair/stool/directional/south, /turf/open/floor/iron, @@ -59187,6 +59138,20 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"uQm" = ( +/obj/item/radio/intercom/directional/east, +/obj/structure/table/wood, +/obj/item/ph_booklet{ + pixel_y = 6; + pixel_x = 5 + }, +/obj/item/burner/oil{ + pixel_y = 6; + pixel_x = -5 + }, +/obj/item/storage/test_tube_rack/full, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "uQF" = ( /obj/structure/lattice, /obj/item/stack/rods, @@ -59290,6 +59255,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/prison) +"uSh" = ( +/obj/item/stack/sheet/iron/five, +/obj/item/stack/cable_coil/five, +/obj/effect/decal/cleanable/robot_debris/down, +/obj/effect/turf_decal/box, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "uSz" = ( /obj/structure/table, /obj/item/phone{ @@ -59632,15 +59604,6 @@ "uYp" = ( /turf/closed/wall, /area/station/medical/break_room) -"uYB" = ( -/obj/structure/cable, -/obj/effect/turf_decal/bot_white, -/obj/effect/spawner/random/maintenance, -/obj/effect/turf_decal/arrows/red{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "uYD" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line, @@ -59648,6 +59611,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port) +"uYE" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/binoculars, +/obj/machinery/airalarm/directional/east, +/obj/machinery/light/small/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "uYH" = ( /obj/structure/reflector/double/anchored{ dir = 5 @@ -60407,15 +60383,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"vlP" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/lobby) "vlY" = ( /obj/structure/table/reinforced, /obj/machinery/camera/directional/north{ @@ -61042,6 +61009,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"vwg" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted, +/obj/structure/table, +/obj/effect/spawner/random/bureaucracy/birthday_wrap, +/turf/open/floor/iron, +/area/station/cargo/lobby) "vwi" = ( /obj/structure/table, /obj/item/cigarette/pipe, @@ -61897,12 +61871,6 @@ }, /turf/open/floor/carpet/royalblue, /area/station/service/library) -"vKC" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "vKL" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -62506,6 +62474,20 @@ /obj/effect/turf_decal/tile/green/half/contrasted, /turf/open/floor/iron/white, /area/station/medical/virology) +"vUL" = ( +/obj/item/circuitboard/machine/exoscanner{ + pixel_y = -3 + }, +/obj/item/stock_parts/scanning_module{ + pixel_x = 5; + pixel_y = 7 + }, +/obj/item/stock_parts/scanning_module{ + pixel_x = 5 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "vUM" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -63180,6 +63162,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"wfp" = ( +/obj/effect/turf_decal/siding/white{ + dir = 5 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/cargo/storage) "wfu" = ( /obj/structure/chair/office{ dir = 8 @@ -63539,6 +63528,12 @@ }, /turf/open/floor/iron/dark, /area/station/security/evidence) +"wme" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Post - Cargo" + }, +/turf/open/floor/plating, +/area/station/security/checkpoint/supply) "wmf" = ( /obj/effect/spawner/random/trash/garbage{ spawn_scatter_radius = 1 @@ -63733,14 +63728,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) -"wpO" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/iron, -/area/station/cargo/sorting) "wqh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -63807,12 +63794,6 @@ }, /turf/open/floor/carpet, /area/station/service/theater) -"wsk" = ( -/obj/structure/railing/corner/end/flip, -/obj/effect/turf_decal/stripes/corner, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "wsq" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security{ @@ -63866,6 +63847,14 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"wsx" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/storage) "wsD" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/iron, @@ -64017,14 +64006,6 @@ }, /turf/open/floor/iron, /area/station/security/holding_cell) -"wuo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "wuM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -64123,6 +64104,13 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/station/science/robotics/mechbay) +"wwN" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/chair/wood, +/obj/effect/decal/cleanable/oil/slippery, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "wwW" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 1 @@ -64248,14 +64236,6 @@ /obj/machinery/bouldertech/refinery/smelter, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"wyS" = ( -/obj/machinery/computer/cargo{ - dir = 4 - }, -/obj/structure/window/spawner/directional/west, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/sorting) "wyV" = ( /turf/open/floor/carpet/orange, /area/station/command/heads_quarters/qm) @@ -64392,6 +64372,15 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) +"wBK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/white/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "wBM" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -65236,17 +65225,6 @@ /obj/structure/reagent_dispensers/fueltank/large, /turf/open/floor/iron, /area/station/engineering/atmos) -"wTv" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/modular_computer/preset/cargochat/cargo{ - dir = 8 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "wTF" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65680,6 +65658,13 @@ }, /turf/open/floor/iron, /area/station/command/gateway) +"xbu" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/security/checkpoint/supply) "xbT" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -67116,11 +67101,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/main) -"xBq" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "xBw" = ( /obj/machinery/door/airlock/engineering{ name = "Starboard Quarter Solar Access" @@ -67551,10 +67531,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"xJj" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) "xJv" = ( /obj/machinery/light/directional/north, /turf/open/floor/iron/recharge_floor, /area/station/security/mechbay) +"xJy" = ( +/obj/effect/turf_decal/tile/brown/opposingcorners, +/turf/closed/wall, +/area/station/security/checkpoint/supply) "xJA" = ( /obj/structure/sign/warning/docking, /turf/closed/wall, @@ -67601,6 +67594,12 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) +"xKh" = ( +/obj/structure/railing{ + dir = 10 + }, +/turf/open/floor/plating/reinforced, +/area/station/cargo/storage) "xKk" = ( /obj/machinery/photocopier, /turf/open/floor/iron/white, @@ -67629,15 +67628,6 @@ }, /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"xLA" = ( -/obj/machinery/computer/records/security{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "xLR" = ( /obj/structure/table, /obj/item/stack/sheet/iron/fifty, @@ -67657,10 +67647,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central) -"xMx" = ( -/obj/structure/chair/office, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "xMz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -67888,10 +67874,6 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"xQO" = ( -/obj/machinery/exodrone_launcher, -/turf/open/floor/plating, -/area/station/cargo/drone_bay) "xQT" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/effect/turf_decal/siding/wood{ @@ -67929,6 +67911,15 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/plating, /area/station/engineering/atmos) +"xRO" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "xRR" = ( /obj/structure/bodycontainer/morgue/beeper_off, /obj/structure/bodycontainer/morgue/beeper_off{ @@ -67955,6 +67946,12 @@ "xRZ" = ( /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"xSc" = ( +/obj/structure/frame/machine/secured, +/obj/effect/decal/cleanable/robot_debris, +/obj/effect/turf_decal/box, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "xSO" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -68489,14 +68486,6 @@ /obj/machinery/incident_display/delam/directional/north, /turf/open/floor/iron, /area/station/engineering/main) -"ybn" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "ybu" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -68623,6 +68612,11 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"ydi" = ( +/obj/structure/railing/corner/end/flip, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "ydj" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, @@ -68775,6 +68769,10 @@ }, /turf/open/floor/wood, /area/station/service/library) +"yfX" = ( +/obj/effect/decal/cleanable/ash, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "ygb" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68787,6 +68785,12 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) +"ygk" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/effect/turf_decal/trimline/brown/filled/warning, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/sorting) "ygp" = ( /obj/machinery/status_display/ai/directional/north, /obj/structure/cable, @@ -68952,18 +68956,6 @@ /obj/effect/spawner/random/bureaucracy/stamp, /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"ykb" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining{ - name = "Deliveries" - }, -/obj/effect/mapping_helpers/airlock/access/any/supply/shipping, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron, -/area/station/cargo/sorting) "ykn" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -69064,14 +69056,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/commons/dorms) -"ylO" = ( -/obj/machinery/firealarm/directional/north, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "ylQ" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -82350,7 +82334,7 @@ pOa rJS pOa jUb -lvY +jCs sZK heE kzZ @@ -86412,7 +86396,7 @@ paD jpG kRe nVG -qOZ +pDf hKg hKg ouu @@ -86451,7 +86435,7 @@ vsr wfZ soa pOa -myZ +aFz sXI sNM tYi @@ -86930,8 +86914,8 @@ poj hnV tPt gUH -dAk -dAk +omc +wBK rhn qnj iqt @@ -87182,17 +87166,17 @@ aZj cSP cLj kRe +kRe tid qTf -oor -oor -hDX -hrC -kuS -muq +hKg +cbz +cKD +wfp +aQb oRO -bgx -uYB +aok +pkM aok mml aok @@ -87439,17 +87423,17 @@ jXu hzb cLj kRe +kRe cBZ wyP -oor -jqr -xLA -hrC -hrC -mmR -kwh -iqt -nut +hKg +kyf +kFQ +xKh +eDO +kFb +aok +oNR aok pkM aok @@ -87694,18 +87678,18 @@ omV fhn cuh jBp -wsk +cLj +ydi qHt dxo hlE -oor -aKN -uha -tMY -hDX +hKg +ljT +jrQ +qlh +oHm +sOE aok -sbP -bgx aok aok xtH @@ -87951,18 +87935,18 @@ cAf dve jXu pVV -qqr +cLj +cUt iId tkf wZo -oor -hvo -uwM -uwf -oor -ylO -tYU -hLL +hKg +rgW +nkq +bNw +nxI +gsV +dfk dfk dfk rQD @@ -88212,14 +88196,14 @@ oMx hKg hKg hKg -oor -jmR -hWK -fea -iHS -cqy -ebg -ebg +hKg +hKg +sJq +oOY +aCO +oRx +sAt +fwb fwb kQO qvV @@ -88453,9 +88437,9 @@ pma pma pma hZQ +hlT jXu -jXu -hsx +tIU jXu jXu jXu @@ -88474,7 +88458,7 @@ jXu jXu jXu cbz -bLY +lcI gQa dit uBj @@ -88488,10 +88472,10 @@ xgx rzo quT iev -gPN +pjX ebd ebd -jBy +bfw iev iev bBy @@ -88708,14 +88692,14 @@ aaa aaa aaa aaa -tdg -hkj -sQp -kuW -qHa -ujT -dYi -iDG +nmg +haZ +uSh +fzo +rNP +ieD +ssu +ggW jXu fpn knQ @@ -88741,11 +88725,11 @@ cgZ hIp ksM lQf -vKC -fwd -mwP -oTw -nLx +wsx +dsJ +npX +dtw +lzD sHX uyh hvB @@ -88965,14 +88949,14 @@ aaa aaa aaa aaa -tdg -hkj -hkj -kuW -uth -xBq -mUF -obF +nmg +gOO +rMd +eVG +rkX +wwN +aZz +kgZ jXu fpn jXu @@ -89002,9 +88986,9 @@ kkB lVp bzH bzH -mzj -sml -rmL +rGk +xRO +rNA hOh lAi bzH @@ -89222,14 +89206,14 @@ sjP sjP lMJ lMJ -tdg -hkj -xQO -dfU -ikL -qST -xMx -qrF +nmg +vUL +xSc +pnl +xgB +yfX +pGJ +fMa jXu vxO jXu @@ -89253,16 +89237,16 @@ nwm izI kQP eRd -vlP +cIl qxJ vNp -hvk -bzH -dGC -uud -wbW -fWn -jHW +erU +aqG +uuW +pPm +jHM +hCh +exB vjU bzH buH @@ -89479,14 +89463,14 @@ dMH sjP aaa aaa -tdg -tdg -tdg -fru -elz -uzb -phP -rgL +nmg +nmg +nmg +jXu +tjt +aUU +uQm +jzq jXu paU jXu @@ -89514,12 +89498,12 @@ rVn qxJ sik ryV -paQ -wyS -ekb -wpO +mhM +qCx +cap +wbW wbW -ubn +ygk hld iev rKI @@ -89771,12 +89755,12 @@ aUm jvv bNN rod -mhM -dfK -wuo -tPW -ayz -bLj +sgZ +gav +hab +uyP +ejD +rUd rnh iev nJJ @@ -90027,15 +90011,15 @@ vdW oac fhB hxd -dHz -aqG -geR -ekb -lsU -bQl -pCs -bzH -bzH +rtG +oor +xJy +wme +oor +xbu +sZT +oor +oor pNk ivB qaw @@ -90284,15 +90268,15 @@ pUk upN qxJ ajq -eml -bzH -bvl -nKu -gxM -jRo -qCx -roG -bzH +vwg +afW +agd +rBB +kJk +xJj +gZq +aiy +afW mnP tEr iOc @@ -90527,7 +90511,7 @@ okj rlU qYC pNC -lpt +qme cNg kQP kQP @@ -90542,17 +90526,17 @@ hIu liX jUs nDG -bzH -bzH -usJ -kFa -lak -rUd -cXE -ykb -cJS -ybn -fLp +oor +oor +oby +kDb +imT +gPw +qNL +fEV +pVK +xOw +uCR sVY sDT mjr @@ -90800,13 +90784,13 @@ isA eKG iit pWb -bzH -wTv -sul -pkF -dtE -dSH -aqG +afW +kkA +fMC +uYE +iQb +hRJ +afW mnP xOw iOc @@ -91057,13 +91041,13 @@ lgg uLE cSu nPN -bzH -aqG -aqG -mxx -aqG -aqG -aqG +oor +afW +afW +pog +oor +afW +afW uGU mFo npY @@ -91793,7 +91777,7 @@ hDE wZz wZz wZz -sjP +qHW iPb iPb uza @@ -93625,7 +93609,7 @@ aaa ihq ooP hZZ -rPO +dfa gmI aKb xel @@ -104416,7 +104400,7 @@ pJE pJE nFn uUl -qJH +oYs qXB wzK tcC diff --git a/_maps/shuttles/pirate_dutchman.dmm b/_maps/shuttles/pirate_dutchman.dmm index 1d1a0b0902b..a00fff6e7e9 100644 --- a/_maps/shuttles/pirate_dutchman.dmm +++ b/_maps/shuttles/pirate_dutchman.dmm @@ -359,10 +359,33 @@ }, /turf/open/floor/carpet/blue/airless, /area/shuttle/pirate/flying_dutchman) +"nb" = ( +/obj/structure/mounted_gun/canister_gatling, +/turf/open/floor/wood/airless, +/area/shuttle/pirate/flying_dutchman) "pG" = ( /obj/structure/window/reinforced/shuttle/survival_pod, /turf/open/floor/wood/airless, /area/shuttle/pirate/flying_dutchman) +"qG" = ( +/obj/item/ammo_casing/canister_shot{ + pixel_y = 8; + pixel_x = -8 + }, +/obj/item/ammo_casing/canister_shot{ + pixel_y = -8; + pixel_x = -8 + }, +/obj/item/ammo_casing/canister_shot{ + pixel_x = 6; + pixel_y = -8 + }, +/obj/item/ammo_casing/canister_shot{ + pixel_y = 8; + pixel_x = 6 + }, +/turf/open/floor/wood/airless, +/area/shuttle/pirate/flying_dutchman) "rd" = ( /obj/effect/turf_decal/siding/wood/corner, /obj/effect/turf_decal/siding/wood/corner{ @@ -1234,7 +1257,7 @@ fW St QM da -WB +nb WB RQ eG @@ -1261,7 +1284,7 @@ km sC mG bn -WB +qG WB xY WR diff --git a/_maps/virtual_domains/meta_central.dmm b/_maps/virtual_domains/meta_central.dmm index 1f14e6ffa5c..2fc87ae17c8 100644 --- a/_maps/virtual_domains/meta_central.dmm +++ b/_maps/virtual_domains/meta_central.dmm @@ -112,7 +112,7 @@ /turf/open/floor/iron/dark, /area/virtual_domain) "aT" = ( -/obj/effect/mob_spawn/ghost_role/human/pirate/skeleton/captain, +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/pirate, /turf/open/floor/plating, /area/virtual_domain) "aV" = ( @@ -4413,14 +4413,14 @@ /area/virtual_domain) "Lq" = ( /obj/structure/table/reinforced, -/obj/item/clothing/glasses/hud/security/night{ - pixel_x = -8; - pixel_y = -6 +/obj/item/clothing/glasses/night/colorless{ + pixel_x = 5; + pixel_y = 7 }, -/obj/item/clothing/glasses/hud/security/night, -/obj/item/clothing/glasses/hud/security/night{ - pixel_x = 8; - pixel_y = 8 +/obj/item/clothing/glasses/night/colorless, +/obj/item/clothing/glasses/night/colorless{ + pixel_x = -5; + pixel_y = -3 }, /turf/template_noop, /area/virtual_domain/safehouse) diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm index 16f7e00e78a..1c6fcbffbda 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm @@ -11,3 +11,6 @@ #define COMSIG_BOT_RESET "bot_reset" ///Sent off /mob/living/basic/bot/proc/set_mode_flags() : (new_flags) #define COMSIG_BOT_MODE_FLAGS_SET "bot_mode_flags_set" + +///Signal sent off of ai/movement/proc/start_moving_towards +#define COMSIG_MOB_AI_MOVEMENT_STARTED "mob_ai_movement_started" diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 8846672efe1..38f39437fac 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -279,6 +279,8 @@ GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list( #define is_reagent_container(O) (istype(O, /obj/item/reagent_containers)) +#define isapc(A) (istype(A, /obj/machinery/power/apc)) + //Assemblies #define isassembly(O) (istype(O, /obj/item/assembly)) diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index ba4690b564d..06afa2c045c 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -989,7 +989,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai ///This fish is currently on cooldown and cannot splash ink unto people's faces #define TRAIT_FISH_INK_ON_COOLDOWN "fish_ink_on_cooldown" ///This fish requires two hands to carry even if smaller than FISH_SIZE_TWO_HANDS_REQUIRED, as long as it's bulky-sized. -#define TRAIT_FISH_SHOULD_TWOHANDED "should_twohanded" +#define TRAIT_FISH_SHOULD_TWOHANDED "fish_should_twohanded" +///This fish won't be killed when cooked. +#define TRAIT_FISH_SURVIVE_COOKING "fish_survive_cooking" /// Trait given to angelic constructs to let them purge cult runes #define TRAIT_ANGELIC "angelic" diff --git a/code/__HELPERS/hallucinations.dm b/code/__HELPERS/hallucinations.dm index 00fee61e2b1..d3d4a2630ed 100644 --- a/code/__HELPERS/hallucinations.dm +++ b/code/__HELPERS/hallucinations.dm @@ -250,7 +250,7 @@ ADMIN_VERB(debug_hallucination_weighted_list_per_type, R_DEBUG, "Show Hallucinat if(!custom_icon_state) return - var/custom_name = tgui_input_text(user, "What name should it show up as? (Can be empty)", "Custom Delusion: Name") + var/custom_name = tgui_input_text(user, "What name should it show up as? (Can be empty)", "Custom Delusion: Name", max_length = MAX_NAME_LEN) delusion_args += list( custom_icon_file = custom_icon_file, diff --git a/code/__HELPERS/hearted.dm b/code/__HELPERS/hearted.dm index adae298516e..d8f7832cbc0 100644 --- a/code/__HELPERS/hearted.dm +++ b/code/__HELPERS/hearted.dm @@ -45,11 +45,11 @@ var/heart_nominee switch(attempt) if(1) - heart_nominee = tgui_input_text(src, "What was their name? Just a first or last name may be enough.", "<3?") + heart_nominee = tgui_input_text(src, "What was their name? Just a first or last name may be enough.", "<3?", max_length = MAX_NAME_LEN) if(2) - heart_nominee = tgui_input_text(src, "Try again, what was their name? Just a first or last name may be enough.", "<3?") + heart_nominee = tgui_input_text(src, "Try again, what was their name? Just a first or last name may be enough.", "<3?", max_length = MAX_NAME_LEN) if(3) - heart_nominee = tgui_input_text(src, "One more try, what was their name? Just a first or last name may be enough.", "<3?") + heart_nominee = tgui_input_text(src, "One more try, what was their name? Just a first or last name may be enough.", "<3?", max_length = MAX_NAME_LEN) if(!heart_nominee) return diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 0da91d9e2db..d9a6c36d6e8 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -629,6 +629,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_FISH_SHOULD_TWOHANDED" = TRAIT_FISH_SHOULD_TWOHANDED, "TRAIT_FISH_STASIS" = TRAIT_FISH_STASIS, "TRAIT_FISH_STINGER" = TRAIT_FISH_STINGER, + "TRAIT_FISH_SURVIVE_COOKING" = TRAIT_FISH_SURVIVE_COOKING, "TRAIT_FISH_TOXIN_IMMUNE" = TRAIT_FISH_TOXIN_IMMUNE, "TRAIT_RESIST_EMULSIFY" = TRAIT_RESIST_EMULSIFY, "TRAIT_FISH_WELL_COOKED" = TRAIT_FISH_WELL_COOKED, diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 2500a63c9fd..6064ca13488 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -350,6 +350,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_FISH_SHOULD_TWOHANDED" = TRAIT_FISH_SHOULD_TWOHANDED, "TRAIT_FISH_STASIS" = TRAIT_FISH_STASIS, "TRAIT_FISH_STINGER" = TRAIT_FISH_STINGER, + "TRAIT_FISH_SURVIVE_COOKING" = TRAIT_FISH_SURVIVE_COOKING, "TRAIT_FISH_TOXIN_IMMUNE" = TRAIT_FISH_TOXIN_IMMUNE, "TRAIT_RESIST_EMULSIFY" = TRAIT_RESIST_EMULSIFY, "TRAIT_YUCKY_FISH" = TRAIT_YUCKY_FISH, diff --git a/code/controllers/subsystem/ai_controllers.dm b/code/controllers/subsystem/ai_controllers.dm index e7aa6b53fdc..49c571a9a07 100644 --- a/code/controllers/subsystem/ai_controllers.dm +++ b/code/controllers/subsystem/ai_controllers.dm @@ -23,14 +23,12 @@ SUBSYSTEM_DEF(ai_controllers) /datum/controller/subsystem/ai_controllers/fire(resumed) var/timer = TICK_USAGE_REAL for(var/datum/ai_controller/ai_controller as anything in GLOB.ai_controllers_by_status[planning_status]) - if(!COOLDOWN_FINISHED(ai_controller, failed_planning_cooldown)) - continue - if(!ai_controller.able_to_plan) continue ai_controller.SelectBehaviors(wait * 0.1) + if(!length(ai_controller.current_behaviors)) //Still no plan - COOLDOWN_START(ai_controller, failed_planning_cooldown, AI_FAILED_PLANNING_COOLDOWN) + ai_controller.planning_failed() our_cost = MC_AVERAGE(our_cost, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) diff --git a/code/controllers/subsystem/bitrunning.dm b/code/controllers/subsystem/bitrunning.dm index 78afb101945..63c2561f0f4 100644 --- a/code/controllers/subsystem/bitrunning.dm +++ b/code/controllers/subsystem/bitrunning.dm @@ -25,7 +25,7 @@ SUBSYSTEM_DEF(bitrunning) var/can_view_reward = domain.difficulty < (scanner_tier + 1) && domain.cost <= points + 3 UNTYPED_LIST_ADD(levels, list( - "announce_ghosts"= domain.announce_to_ghosts, + "announce_ghosts" = domain.announce_to_ghosts, "cost" = domain.cost, "desc" = can_view ? domain.desc : "Limited scanning capabilities. Cannot infer domain details.", "difficulty" = domain.difficulty, diff --git a/code/controllers/subsystem/id_access.dm b/code/controllers/subsystem/id_access.dm index af2dea8c5dd..0107e4346b4 100644 --- a/code/controllers/subsystem/id_access.dm +++ b/code/controllers/subsystem/id_access.dm @@ -412,7 +412,9 @@ SUBSYSTEM_DEF(id_access) var/datum/job/trim_job = trim.find_job() if (!isnull(trim_job) && !isnull(id_card.registered_account)) + var/datum/job/old_job = id_card.registered_account.account_job id_card.registered_account.account_job = trim_job + id_card.registered_account.update_account_job_lists(trim_job, old_job) id_card.update_label() id_card.update_icon() diff --git a/code/controllers/subsystem/processing/ai_idle_behaviors.dm b/code/controllers/subsystem/processing/ai_idle_behaviors.dm index cda3d354882..8875d971ad8 100644 --- a/code/controllers/subsystem/processing/ai_idle_behaviors.dm +++ b/code/controllers/subsystem/processing/ai_idle_behaviors.dm @@ -1,6 +1,17 @@ PROCESSING_SUBSYSTEM_DEF(idle_ai_behaviors) - name = "idle_ai_behaviors" - flags = SS_NO_INIT | SS_BACKGROUND + name = "AI Idle Behaviors" + flags = SS_BACKGROUND wait = 1.5 SECONDS priority = FIRE_PRIORITY_IDLE_NPC init_order = INIT_ORDER_AI_IDLE_CONTROLLERS //must execute only after ai behaviors are initialized + ///List of all the idle ai behaviors + var/list/idle_behaviors = list() + +/datum/controller/subsystem/processing/idle_ai_behaviors/Initialize() + setup_idle_behaviors() + return SS_INIT_SUCCESS + +/datum/controller/subsystem/processing/idle_ai_behaviors/proc/setup_idle_behaviors() + for(var/behavior_type in subtypesof(/datum/idle_behavior)) + var/datum/idle_behavior/behavior = new behavior_type + idle_behaviors[behavior_type] = behavior diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index 8f7e8d427b7..97db5336520 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -140,6 +140,9 @@ SUBSYSTEM_DEF(shuttle) /// Did the supermatter start a cascade event? var/supermatter_cascade = FALSE + /// List of express consoles that are waiting for pack initialization + var/list/obj/machinery/computer/cargo/express/express_consoles = list() + /datum/controller/subsystem/shuttle/Initialize() order_number = rand(1, 9000) @@ -176,6 +179,9 @@ SUBSYSTEM_DEF(shuttle) supply_packs[pack.id] = pack + for (var/obj/machinery/computer/cargo/express/console as anything in express_consoles) + console.packin_up(TRUE) + setup_shuttles(stationary_docking_ports) has_purchase_shuttle_access = init_has_purchase_shuttle_access() diff --git a/code/datums/actions/mobs/personality_commune.dm b/code/datums/actions/mobs/personality_commune.dm index 26cf4834492..8481d451fb1 100644 --- a/code/datums/actions/mobs/personality_commune.dm +++ b/code/datums/actions/mobs/personality_commune.dm @@ -31,7 +31,7 @@ var/mob/living/split_personality/non_controller = usr var/client/non_controller_client = non_controller.client - var/to_send = tgui_input_text(non_controller, "What would you like to tell your other self?", "Commune") + var/to_send = tgui_input_text(non_controller, "What would you like to tell your other self?", "Commune", max_length = MAX_MESSAGE_LEN) if(QDELETED(src) || QDELETED(trauma) || !to_send) return FALSE diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index 499da54b1b1..4d5b6600443 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -39,8 +39,6 @@ multiple modular subtrees with behaviors var/continue_processing_when_client = FALSE ///distance to give up on target var/max_target_distance = 14 - ///Cooldown for new plans, to prevent AI from going nuts if it can't think of new plans and looping on end - COOLDOWN_DECLARE(failed_planning_cooldown) ///All subtrees this AI has available, will run them in order, so make sure they're in the order you want them to run. On initialization of this type, it will start as a typepath(s) and get converted to references of ai_subtrees found in SSai_controllers when init_subtrees() is called var/list/planning_subtrees @@ -69,14 +67,15 @@ multiple modular subtrees with behaviors var/able_to_run = FALSE /// are we even able to plan? var/able_to_plan = TRUE + /// are we currently on failed planning timeout? + var/on_failed_planning_timeout = FALSE /datum/ai_controller/New(atom/new_pawn) change_ai_movement_type(ai_movement) init_subtrees() - if(idle_behavior) - idle_behavior = new idle_behavior() + idle_behavior = SSidle_ai_behaviors.idle_behaviors[idle_behavior] if(!isnull(new_pawn)) // unit tests need the ai_controller to exist in isolation due to list schenanigans i hate it here PossessPawn(new_pawn) @@ -240,7 +239,7 @@ multiple modular subtrees with behaviors if(!pawn_turf) CRASH("AI controller [src] controlling pawn ([pawn]) is not on a turf.") #endif - if(!length(SSmobs.clients_by_zlevel[pawn_turf.z])) + if(!length(SSmobs.clients_by_zlevel[pawn_turf.z]) || on_failed_planning_timeout || !able_to_run) return AI_STATUS_OFF if(should_idle()) return AI_STATUS_IDLE @@ -300,6 +299,9 @@ multiple modular subtrees with behaviors /datum/ai_controller/proc/update_able_to_run() SIGNAL_HANDLER able_to_run = get_able_to_run() + if(!able_to_run) + GLOB.move_manager.stop_looping(pawn) //stop moving + set_ai_status(get_expected_ai_status()) ///Returns TRUE if the ai controller can actually run at the moment, FALSE otherwise /datum/ai_controller/proc/get_able_to_run() @@ -312,10 +314,6 @@ multiple modular subtrees with behaviors ///Runs any actions that are currently running /datum/ai_controller/process(seconds_per_tick) - if(!able_to_run) - GLOB.move_manager.stop_looping(pawn) //stop moving - return //this should remove them from processing in the future through event-based stuff. - if(!length(current_behaviors) && idle_behavior) idle_behavior.perform_idle_behavior(seconds_per_tick, src) //Do some stupid shit while we have nothing to do return @@ -491,6 +489,7 @@ multiple modular subtrees with behaviors /datum/ai_controller/proc/on_stat_changed(mob/living/source, new_stat) SIGNAL_HANDLER reset_ai_status() + update_able_to_run() /datum/ai_controller/proc/on_sentience_gained() SIGNAL_HANDLER @@ -531,6 +530,15 @@ multiple modular subtrees with behaviors minimum_distance = iter_behavior.required_distance return minimum_distance +/datum/ai_controller/proc/planning_failed() + on_failed_planning_timeout = TRUE + set_ai_status(get_expected_ai_status()) + addtimer(CALLBACK(src, PROC_REF(resume_planning)), AI_FAILED_PLANNING_COOLDOWN) + +/datum/ai_controller/proc/resume_planning() + on_failed_planning_timeout = FALSE + set_ai_status(get_expected_ai_status()) + /// Returns true if we have a blackboard key with the provided key and it is not qdeleting /datum/ai_controller/proc/blackboard_key_exists(key) var/datum/key_value = blackboard[key] diff --git a/code/datums/ai/movement/_ai_movement.dm b/code/datums/ai/movement/_ai_movement.dm index c1b3aae5bd6..33b7e4e214f 100644 --- a/code/datums/ai/movement/_ai_movement.dm +++ b/code/datums/ai/movement/_ai_movement.dm @@ -11,6 +11,7 @@ controller.consecutive_pathing_attempts = 0 controller.set_blackboard_key(BB_CURRENT_MIN_MOVE_DISTANCE, min_distance) moving_controllers[controller] = current_movement_target + SEND_SIGNAL(controller.pawn, COMSIG_MOB_AI_MOVEMENT_STARTED, current_movement_target) /datum/ai_movement/proc/stop_moving_towards(datum/ai_controller/controller) controller.consecutive_pathing_attempts = 0 diff --git a/code/datums/components/crafting/ranged_weapon.dm b/code/datums/components/crafting/ranged_weapon.dm index 174c0226a42..bfd2385f89e 100644 --- a/code/datums/components/crafting/ranged_weapon.dm +++ b/code/datums/components/crafting/ranged_weapon.dm @@ -300,6 +300,22 @@ category = CAT_WEAPON_RANGED crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED +/datum/crafting_recipe/pipe_organ_gun + name = "Pipe Organ Gun" + tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER) + result = /obj/structure/mounted_gun/pipe + reqs = list( + /obj/item/pipe = 8, + /obj/item/stack/sheet/mineral/wood = 15, + /obj/item/stack/sheet/iron = 10, + /obj/item/storage/toolbox = 1, + /obj/item/stack/rods = 10, + /obj/item/assembly/igniter = 2, + ) + time = 15 SECONDS + category = CAT_WEAPON_RANGED + crafting_flags = CRAFT_CHECK_DENSITY + /datum/crafting_recipe/trash_cannon name = "Trash Cannon" tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER) diff --git a/code/datums/components/fish_growth.dm b/code/datums/components/fish_growth.dm index bc7c8a9869e..3ec1427fd51 100644 --- a/code/datums/components/fish_growth.dm +++ b/code/datums/components/fish_growth.dm @@ -11,43 +11,90 @@ var/use_drop_loc ///Is the parent deleted once the result is spawned? var/del_on_grow + ///Will the result inherit the name of the fish if that was changed from the initial name. + var/inherit_name -/datum/component/fish_growth/Initialize(result_type, growth_rate, use_drop_loc = TRUE, del_on_grow = TRUE) +/datum/component/fish_growth/Initialize(result_type, growth_time, use_drop_loc = TRUE, del_on_grow = TRUE, inherit_name = TRUE) . = ..() if(!isfish(parent)) return COMPONENT_INCOMPATIBLE - RegisterSignal(parent, COMSIG_FISH_LIFE, PROC_REF(on_fish_life)) src.result_type = result_type - src.growth_rate = growth_rate + growth_rate = 100 / growth_time src.use_drop_loc = use_drop_loc src.del_on_grow = del_on_grow + src.inherit_name = inherit_name -/datum/component/fish_growth/CheckDupeComponent(result_type, growth_rate, use_drop_loc = TRUE, del_on_grow = TRUE) +/datum/component/fish_growth/CheckDupeComponent( + datum/component/fish_growth/new_growth, // will be null + result_type, + growth_time, + use_drop_loc = TRUE, + del_on_grow = TRUE, + inherit_name = TRUE, +) if(result_type == src.result_type) - src.growth_rate = growth_rate + growth_rate = 100 / growth_time return TRUE //copy the growth rate and kill the new component return FALSE +/datum/component/fish_growth/RegisterWithParent() + var/evo_growth = ispath(result_type, /datum/fish_evolution) + RegisterSignal(parent, COMSIG_FISH_LIFE, PROC_REF(on_fish_life)) + if(!evo_growth) + return + var/datum/fish_evolution/evolution = GLOB.fish_evolutions[result_type] + evolution.RegisterSignal(parent, COMSIG_FISH_BEFORE_GROWING, TYPE_PROC_REF(/datum/fish_evolution, growth_checks)) + evolution.register_fish(parent) + +/datum/component/fish_growth/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_FISH_LIFE, COMSIG_FISH_BEFORE_GROWING)) + /datum/component/fish_growth/proc/on_fish_life(obj/item/fish/source, seconds_per_tick) SIGNAL_HANDLER - if(SEND_SIGNAL(source, COMSIG_FISH_BEFORE_GROWING, seconds_per_tick) & COMPONENT_DONT_GROW) + if(source.status == FISH_DEAD) //It died just now. return - maturation += growth_rate * seconds_per_tick + var/deciseconds_elapsed = seconds_per_tick * 10 + var/growth = growth_rate * deciseconds_elapsed + if(SEND_SIGNAL(source, COMSIG_FISH_BEFORE_GROWING, seconds_per_tick, growth) & COMPONENT_DONT_GROW) + return + maturation += growth if(maturation >= 100) finish_growing(source) /datum/component/fish_growth/proc/finish_growing(obj/item/fish/source) var/atom/location = use_drop_loc ? source.drop_location() : source.loc - var/atom/movable/result = new result_type (location) - if(location != source.loc) - result.visible_message(span_boldnotice("\A [result] jumps out of [source.loc]!")) - playsound(result, 'sound/effects/fish_splash.ogg', 60) - if(isbasicmob(result)) - for(var/trait_type in source.fish_traits) - var/datum/fish_trait/trait = GLOB.fish_traits[trait_type] - trait.apply_to_mob(result) - - addtimer(CALLBACK(result, TYPE_PROC_REF(/mob/living/basic, hop_on_nearby_turf)), 0.1 SECONDS) + var/is_evo = ispath(result_type, /datum/fish_evolution) + var/atom/movable/result + if(is_evo) + var/datum/fish_evolution/evolution = GLOB.fish_evolutions[result_type] + result = source.create_offspring(evolution.new_fish_type, evolution = evolution) + var/obj/item/fish/fishie = result + fishie.breeding_wait = source.breeding_wait + fishie.last_feeding = source.last_feeding + var/health_percent = source.health / initial(source.health) + fishie.adjust_health(fishie.health * health_percent) + else + result = new result_type (location) + if(location != source.loc) + result.visible_message(span_boldnotice("\A [result] jumps out of [source.loc]!")) + playsound(result, 'sound/effects/fish_splash.ogg', 60) + if(isbasicmob(result)) + for(var/trait_type in source.fish_traits) + var/datum/fish_trait/trait = GLOB.fish_traits[trait_type] + trait.apply_to_mob(result) + + addtimer(CALLBACK(result, TYPE_PROC_REF(/mob/living/basic, hop_on_nearby_turf)), 0.1 SECONDS) + + if(is_evo || location == source.loc) + var/message_verb = del_on_grow ? "grows into" : "generates" + location.visible_message(span_notice("[source] [message_verb] \a [result]."), vision_distance = 3) + + if(inherit_name && source.name != initial(source.name)) + if(ismob(result)) + var/mob/mob = result + mob.fully_replace_character_name(mob.name, source.name) + else + result.name = source.name SEND_SIGNAL(source, COMSIG_FISH_FINISH_GROWING, result) diff --git a/code/datums/components/gps.dm b/code/datums/components/gps.dm index 7e52f00def7..0b3751856b8 100644 --- a/code/datums/components/gps.dm +++ b/code/datums/components/gps.dm @@ -162,7 +162,7 @@ GLOBAL_LIST_EMPTY(GPS_list) switch(action) if("rename") var/atom/parentasatom = parent - var/a = tgui_input_text(usr, "Enter the desired tag", "GPS Tag", gpstag, 20) + var/a = tgui_input_text(usr, "Enter the desired tag", "GPS Tag", gpstag, max_length = 20) if (QDELETED(ui) || ui.status != UI_INTERACTIVE) return if (!a) diff --git a/code/datums/components/infective.dm b/code/datums/components/infective.dm index 5163ca69dac..ecd2f1ff836 100644 --- a/code/datums/components/infective.dm +++ b/code/datums/components/infective.dm @@ -37,7 +37,7 @@ src.weak_infection_chance = weak_infection_chance /datum/component/infective/Destroy() - QDEL_NULL(diseases) + QDEL_LIST(diseases) return ..() /datum/component/infective/RegisterWithParent() diff --git a/code/datums/components/irradiated.dm b/code/datums/components/irradiated.dm index 077539f49db..9562f161fb4 100644 --- a/code/datums/components/irradiated.dm +++ b/code/datums/components/irradiated.dm @@ -138,7 +138,7 @@ if(human_parent.is_blind()) to_chat(human_parent, span_boldwarning("Your [affected_limb.plaintext_zone] feels like it's bubbling, then burns like hell!")) - human_parent.apply_damage(RADIATION_BURN_SPLOTCH_DAMAGE, BURN, affected_limb) + human_parent.apply_damage(RADIATION_BURN_SPLOTCH_DAMAGE, BURN, affected_limb, wound_clothing = FALSE) playsound( human_parent, pick('sound/effects/wounds/sizzle1.ogg', 'sound/effects/wounds/sizzle2.ogg'), diff --git a/code/datums/components/mind_linker.dm b/code/datums/components/mind_linker.dm index 5a2624503e5..cf916241ce4 100644 --- a/code/datums/components/mind_linker.dm +++ b/code/datums/components/mind_linker.dm @@ -267,7 +267,7 @@ var/datum/component/mind_linker/linker = target var/mob/living/linker_parent = linker.parent - var/message = tgui_input_text(owner, "Enter a message to transmit.", "[linker.network_name] Telepathy") + var/message = tgui_input_text(owner, "Enter a message to transmit.", "[linker.network_name] Telepathy", max_length = MAX_MESSAGE_LEN) if(!message || QDELETED(src) || QDELETED(owner) || owner.stat == DEAD) return diff --git a/code/datums/proximity_monitor/field.dm b/code/datums/proximity_monitor/field.dm index e3f0ade5e7d..3ba3017bed0 100644 --- a/code/datums/proximity_monitor/field.dm +++ b/code/datums/proximity_monitor/field.dm @@ -40,7 +40,7 @@ var/list/old_edge_turfs = edge_turfs field_turfs = new_turfs[FIELD_TURFS_KEY] edge_turfs = new_turfs[EDGE_TURFS_KEY] - if(!full_recalc) + if(full_recalc) field_turfs = list() edge_turfs = list() @@ -62,12 +62,11 @@ for(var/turf/new_turf as anything in field_turfs - old_field_turfs) if(QDELETED(src)) return - field_turfs += new_turf setup_field_turf(new_turf) + for(var/turf/new_turf as anything in edge_turfs - old_edge_turfs) if(QDELETED(src)) return - edge_turfs += new_turf setup_edge_turf(new_turf) /datum/proximity_monitor/advanced/on_initialized(turf/location, atom/created, init_flags) diff --git a/code/game/machinery/camera/camera_construction.dm b/code/game/machinery/camera/camera_construction.dm index 15f22d02cbe..d6988617e1f 100644 --- a/code/game/machinery/camera/camera_construction.dm +++ b/code/game/machinery/camera/camera_construction.dm @@ -30,7 +30,7 @@ switch(camera_construction_state) if(CAMERA_STATE_WIRED) tool.play_tool_sound(src) - var/input = tgui_input_text(user, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret", "Set Network", "SS13") + var/input = tgui_input_text(user, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret", "Set Network", "SS13", max_length = MAX_NAME_LEN) if(isnull(input)) return ITEM_INTERACT_BLOCKING var/list/tempnetwork = splittext(input, ",") diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index d949b6b5772..66679b0c805 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -781,7 +781,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) if(!GLOB.communications_controller.can_announce(user, is_ai)) to_chat(user, span_alert("Intercomms recharging. Please stand by.")) return - var/input = tgui_input_text(user, "Message to announce to the station crew", "Announcement") + var/input = tgui_input_text(user, "Message to announce to the station crew", "Announcement", max_length = MAX_MESSAGE_LEN) if(!input || !user.can_perform_action(src, ALLOW_SILICON_REACH)) return if(user.try_speak(input)) diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 36b48bb28ed..5449acbd165 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -683,7 +683,7 @@ var/datum/mutation/human/target_mutation = get_mut_by_ref(bref, search_flags) // Prompt for modifier string - var/new_sequence_input = tgui_input_text(usr, "Enter a replacement sequence", "Inherent Gene Replacement", 32, encode = FALSE) + var/new_sequence_input = tgui_input_text(usr, "Enter a replacement sequence", "Inherent Gene Replacement", max_length = 32, encode = FALSE) // Drop out if the string is the wrong length if(length(new_sequence_input) != 32) return diff --git a/code/game/machinery/computer/records/records.dm b/code/game/machinery/computer/records/records.dm index f97c20af914..79635bba648 100644 --- a/code/game/machinery/computer/records/records.dm +++ b/code/game/machinery/computer/records/records.dm @@ -154,7 +154,7 @@ return FALSE var/trimmed = copytext(mugshot.name, 9, MAX_NAME_LEN) // Remove "photo - " - var/name = tgui_input_text(user, "Enter the name of the new record.", "New Record", trimmed, MAX_NAME_LEN) + var/name = tgui_input_text(user, "Enter the name of the new record.", "New Record", trimmed, max_length = MAX_NAME_LEN) if(!name || !is_operational || !user.can_perform_action(src, ALLOW_SILICON_REACH) || !mugshot || QDELETED(mugshot) || QDELETED(src)) return FALSE diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 9002898580e..992ad15b16e 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1191,10 +1191,10 @@ return TRUE /obj/machinery/door/airlock/try_to_crowbar(obj/item/I, mob/living/user, forced = FALSE) - if(I?.tool_behaviour == TOOL_CROWBAR && should_try_removing_electronics() && !operating) + if(I.tool_behaviour == TOOL_CROWBAR && should_try_removing_electronics() && !operating) user.visible_message(span_notice("[user] removes the electronics from the airlock assembly."), \ span_notice("You start to remove electronics from the airlock assembly...")) - if(I.use_tool(src, user, 40, volume=100)) + if(I.use_tool(src, user, 40, volume = 100)) deconstruct(TRUE, user) return if(seal) @@ -1219,8 +1219,8 @@ var/time_to_open = 50 playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) //is it aliens or just the CE being a dick? prying_so_hard = TRUE - if(do_after(user, time_to_open, src)) - if(check_electrified && shock(user,100)) + if(I.use_tool(src, user, time_to_open, volume = 100)) + if(check_electrified && shock(user, 100)) prying_so_hard = FALSE return open(BYPASS_DOOR_CHECKS) @@ -2244,7 +2244,7 @@ if(!hasPower()) to_chat(user, span_notice("You begin unlocking the airlock safety mechanism...")) if(do_after(user, 15 SECONDS, target = src)) - try_to_crowbar(null, user, TRUE) + try_to_crowbar(src, user, TRUE) return TRUE else // always open from the space side diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 15277c447cd..0902a651337 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -334,7 +334,7 @@ return -/obj/machinery/door/proc/try_to_crowbar(obj/item/acting_object, mob/user) +/obj/machinery/door/proc/try_to_crowbar(obj/item/acting_object, mob/user, forced = FALSE) return /// Called when the user right-clicks on the door with a crowbar. diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 68c9b5e1490..00c2e0e4145 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -545,7 +545,7 @@ correct_state() /// We check for adjacency when using the primary attack. -/obj/machinery/door/firedoor/try_to_crowbar(obj/item/acting_object, mob/user) +/obj/machinery/door/firedoor/try_to_crowbar(obj/item/acting_object, mob/user, forced = FALSE) if(welded || operating) return diff --git a/code/game/machinery/doors/passworddoor.dm b/code/game/machinery/doors/passworddoor.dm index bccc243381b..bf27dfcffc2 100644 --- a/code/game/machinery/doors/passworddoor.dm +++ b/code/game/machinery/doors/passworddoor.dm @@ -103,7 +103,7 @@ playsound(src, door_deny, 30, TRUE) /obj/machinery/door/password/proc/ask_for_pass(mob/user) - var/guess = tgui_input_text(user, "Enter the password", "Password") + var/guess = tgui_input_text(user, "Enter the password", "Password", max_length = MAX_MESSAGE_LEN) if(guess == password) return TRUE return FALSE diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index f6f4270835c..98149a82322 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -211,7 +211,7 @@ toggle_code(NAVBEACON_DELIVERY_MODE) return TRUE if("set_location") - var/input_text = tgui_input_text(user, "Enter the beacon's location tag", "Beacon Location", location, 20) + var/input_text = tgui_input_text(user, "Enter the beacon's location tag", "Beacon Location", location, max_length = 20) if (!input_text || location == input_text) return glob_lists_deregister() @@ -220,7 +220,7 @@ return TRUE if("set_patrol_next") var/next_patrol = codes[NAVBEACON_PATROL_NEXT] - var/input_text = tgui_input_text(user, "Enter the tag of the next patrol location", "Beacon Location", next_patrol, 20) + var/input_text = tgui_input_text(user, "Enter the tag of the next patrol location", "Beacon Location", next_patrol, max_length = 20) if (!input_text || location == input_text) return codes[NAVBEACON_PATROL_NEXT] = input_text diff --git a/code/game/machinery/newscaster/newscaster_machine.dm b/code/game/machinery/newscaster/newscaster_machine.dm index 3186d2081e5..aced87bfe58 100644 --- a/code/game/machinery/newscaster/newscaster_machine.dm +++ b/code/game/machinery/newscaster/newscaster_machine.dm @@ -405,14 +405,14 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) return TRUE if("setCriminalName") - var/temp_name = tgui_input_text(usr, "Write the Criminal's Name", "Warrent Alert Handler", "John Doe", MAX_NAME_LEN, multiline = FALSE) + var/temp_name = tgui_input_text(usr, "Write the Criminal's Name", "Warrent Alert Handler", "John Doe", max_length = MAX_NAME_LEN, multiline = FALSE) if(!temp_name) return TRUE criminal_name = temp_name return TRUE if("setCrimeData") - var/temp_desc = tgui_input_text(usr, "Write the Criminal's Crimes", "Warrent Alert Handler", "Unknown", MAX_BROADCAST_LEN, multiline = TRUE) + var/temp_desc = tgui_input_text(usr, "Write the Criminal's Crimes", "Warrent Alert Handler", "Unknown", max_length = MAX_BROADCAST_LEN, multiline = TRUE) if(!temp_desc) return TRUE crime_description = temp_desc @@ -703,7 +703,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) if(channel_name == potential_channel.channel_ID) current_channel = potential_channel break - var/temp_message = tgui_input_text(usr, "Write your Feed story", "Network Channel Handler", feed_channel_message, multiline = TRUE) + var/temp_message = tgui_input_text(usr, "Write your Feed story", "Network Channel Handler", feed_channel_message, max_length = MAX_BROADCAST_LEN, multiline = TRUE) if(length(temp_message) <= 1) return TRUE if(temp_message) diff --git a/code/game/machinery/newscaster/newspaper.dm b/code/game/machinery/newscaster/newspaper.dm index c381f2f5063..6bc1e6c77ff 100644 --- a/code/game/machinery/newscaster/newspaper.dm +++ b/code/game/machinery/newscaster/newspaper.dm @@ -84,7 +84,7 @@ if(scribble_page == current_page) user.balloon_alert(user, "already scribbled!") return - var/new_scribble_text = tgui_input_text(user, "What do you want to scribble?", "Write something") + var/new_scribble_text = tgui_input_text(user, "What do you want to scribble?", "Write something", max_length = MAX_MESSAGE_LEN) if(isnull(new_scribble_text)) return add_fingerprint(user) diff --git a/code/game/machinery/porta_turret/portable_turret_construct.dm b/code/game/machinery/porta_turret/portable_turret_construct.dm index a8fa4e67b2b..0ae7d9699ee 100644 --- a/code/game/machinery/porta_turret/portable_turret_construct.dm +++ b/code/game/machinery/porta_turret/portable_turret_construct.dm @@ -182,7 +182,7 @@ return if(used.get_writing_implement_details()?["interaction_mode"] == MODE_WRITING) //you can rename turrets like bots! - var/choice = tgui_input_text(user, "Enter a new turret name", "Turret Classification", finish_name, MAX_NAME_LEN) + var/choice = tgui_input_text(user, "Enter a new turret name", "Turret Classification", finish_name, max_length = MAX_NAME_LEN) if(!choice) return if(!user.can_perform_action(src)) diff --git a/code/game/machinery/roulette_machine.dm b/code/game/machinery/roulette_machine.dm index bb43b7a46db..3ef023ccb64 100644 --- a/code/game/machinery/roulette_machine.dm +++ b/code/game/machinery/roulette_machine.dm @@ -187,7 +187,7 @@ addtimer(CALLBACK(src, PROC_REF(play), user, player_card, chosen_bet_type, chosen_bet_amount, potential_payout), 4) //Animation first return TRUE else - var/msg = tgui_input_text(user, "Name of your roulette wheel", "Roulette Customization", "Roulette Machine", MAX_NAME_LEN) + var/msg = tgui_input_text(user, "Name of your roulette wheel", "Roulette Customization", "Roulette Machine", max_length = MAX_NAME_LEN) if(!msg) return name = msg @@ -456,7 +456,7 @@ "path" = /obj/structure/closet/supplypod/centcompod, "spawn" = /obj/machinery/roulette )) - + qdel(src) #undef ROULETTE_DOZ_COL_PAYOUT diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 3232dc524ab..9ff9c562aa0 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -711,12 +711,12 @@ var/name_set = FALSE var/desc_set = FALSE - var/str = tgui_input_text(user, "Personal Unit Name", "Unit Name") + var/str = tgui_input_text(user, "Personal Unit Name", "Unit Name", max_length = MAX_NAME_LEN) if(!isnull(str)) name = str name_set = TRUE - str = tgui_input_text(user, "Personal Unit Description", "Unit Description") + str = tgui_input_text(user, "Personal Unit Description", "Unit Description", max_length = MAX_DESC_LEN) if(!isnull(str)) desc = str desc_set = TRUE diff --git a/code/game/machinery/telecomms/computers/message.dm b/code/game/machinery/telecomms/computers/message.dm index 4cbc3515713..1b3197e702d 100644 --- a/code/game/machinery/telecomms/computers/message.dm +++ b/code/game/machinery/telecomms/computers/message.dm @@ -180,10 +180,10 @@ notice_message = "NOTICE: Logs cleared." return TRUE if("set_key") - var/dkey = tgui_input_text(usr, "Please enter the decryption key", "Telecomms Decryption") + var/dkey = tgui_input_text(usr, "Please enter the decryption key", "Telecomms Decryption", max_length = 16) if(dkey && dkey != "") if(linkedServer.decryptkey == dkey) - var/newkey = tgui_input_text(usr, "Please enter the new key (3 - 16 characters max)", "New Key") + var/newkey = tgui_input_text(usr, "Please enter the new key (3 - 16 characters max)", "New Key", max_length = 16) if(length(newkey) <= 3) notice_message = "NOTICE: Decryption key too short!" else if(newkey && newkey != "") @@ -210,8 +210,8 @@ break return TRUE if("send_fake_message") - var/sender = tgui_input_text(usr, "What is the sender's name?", "Sender") - var/job = tgui_input_text(usr, "What is the sender's job?", "Job") + var/sender = tgui_input_text(usr, "What is the sender's name?", "Sender", max_length = MAX_NAME_LEN) + var/job = tgui_input_text(usr, "What is the sender's job?", "Job", max_length = 60) var/recipient var/list/tablet_to_messenger = list() @@ -229,7 +229,7 @@ else recipient = null - var/message = tgui_input_text(usr, "Please enter your message", "Message") + var/message = tgui_input_text(usr, "Please enter your message", "Message", max_length = MAX_MESSAGE_LEN) if(isnull(sender) || sender == "") sender = "UNKNOWN" diff --git a/code/game/objects/effects/spawners/random/trash.dm b/code/game/objects/effects/spawners/random/trash.dm index 9cf00c20ee3..6f6f5badc8e 100644 --- a/code/game/objects/effects/spawners/random/trash.dm +++ b/code/game/objects/effects/spawners/random/trash.dm @@ -324,3 +324,18 @@ if(istype(crushed_can)) crushed_can.icon_state = pick(soda_icons) return crushed_can + +/obj/effect/spawner/random/trash/ghetto_containers + name = "ghetto container spawner" + loot = list( + /obj/item/reagent_containers/cup/bucket = 5, + /obj/item/reagent_containers/cup/glass/bottle = 5, + /obj/item/reagent_containers/cup/glass/bottle/small = 5, + /obj/item/reagent_containers/cup/glass/mug = 5, + /obj/item/reagent_containers/cup/glass/shaker = 5, + /obj/item/reagent_containers/cup/watering_can/wood = 5, + /obj/item/reagent_containers/cup/mortar = 2, + /obj/item/reagent_containers/cup/soup_pot = 2, + /obj/item/reagent_containers/cup/blastoff_ampoule = 1, + /obj/item/reagent_containers/cup/maunamug = 1, + ) diff --git a/code/game/objects/items/AI_modules/freeform.dm b/code/game/objects/items/AI_modules/freeform.dm index a0a91f7185e..05ef00c9467 100644 --- a/code/game/objects/items/AI_modules/freeform.dm +++ b/code/game/objects/items/AI_modules/freeform.dm @@ -8,7 +8,7 @@ laws = list("") /obj/item/ai_module/core/freeformcore/attack_self(mob/user) - var/targName = tgui_input_text(user, "Enter a new core law for the AI.", "Freeform Law Entry", laws[1], CONFIG_GET(number/max_law_len), TRUE) + var/targName = tgui_input_text(user, "Enter a new core law for the AI.", "Freeform Law Entry", laws[1], max_length = CONFIG_GET(number/max_law_len), multiline = TRUE) if(!targName || !user.is_holding(src)) return if(is_ic_filtered(targName)) @@ -37,7 +37,7 @@ if(!newpos || !user.is_holding(src) || !usr.can_perform_action(src, FORBID_TELEKINESIS_REACH)) return lawpos = newpos - var/targName = tgui_input_text(user, "Enter a new law for the AI.", "Freeform Law Entry", laws[1], CONFIG_GET(number/max_law_len), TRUE) + var/targName = tgui_input_text(user, "Enter a new law for the AI.", "Freeform Law Entry", laws[1], max_length = CONFIG_GET(number/max_law_len), multiline = TRUE) if(!targName || !user.is_holding(src)) return if(is_ic_filtered(targName)) diff --git a/code/game/objects/items/AI_modules/full_lawsets.dm b/code/game/objects/items/AI_modules/full_lawsets.dm index 30e904d45ac..593bc43f2dc 100644 --- a/code/game/objects/items/AI_modules/full_lawsets.dm +++ b/code/game/objects/items/AI_modules/full_lawsets.dm @@ -58,7 +58,7 @@ var/subject = "human being" /obj/item/ai_module/core/full/asimov/attack_self(mob/user as mob) - var/targName = tgui_input_text(user, "Enter a new subject that Asimov is concerned with.", "Asimov", subject, MAX_NAME_LEN) + var/targName = tgui_input_text(user, "Enter a new subject that Asimov is concerned with.", "Asimov", subject, max_length = MAX_NAME_LEN) if(!targName || !user.is_holding(src)) return subject = targName @@ -73,7 +73,7 @@ var/subject = "human being" /obj/item/ai_module/core/full/asimovpp/attack_self(mob/user) - var/target_name = tgui_input_text(user, "Enter a new subject that Asimov++ is concerned with.", "Asimov++", subject, MAX_NAME_LEN) + var/target_name = tgui_input_text(user, "Enter a new subject that Asimov++ is concerned with.", "Asimov++", subject, max_length = MAX_NAME_LEN) if(!target_name || !user.is_holding(src)) return laws.Cut() diff --git a/code/game/objects/items/AI_modules/hacked.dm b/code/game/objects/items/AI_modules/hacked.dm index fafde17acb5..41a1f38ba89 100644 --- a/code/game/objects/items/AI_modules/hacked.dm +++ b/code/game/objects/items/AI_modules/hacked.dm @@ -4,7 +4,7 @@ laws = list("") /obj/item/ai_module/syndicate/attack_self(mob/user) - var/targName = tgui_input_text(user, "Enter a new law for the AI", "Freeform Law Entry", laws[1], CONFIG_GET(number/max_law_len), TRUE) + var/targName = tgui_input_text(user, "Enter a new law for the AI", "Freeform Law Entry", laws[1], max_length = CONFIG_GET(number/max_law_len), multiline = TRUE) if(!targName || !user.is_holding(src)) return if(is_ic_filtered(targName)) // not even the syndicate can uwu diff --git a/code/game/objects/items/AI_modules/supplied.dm b/code/game/objects/items/AI_modules/supplied.dm index b53e16a86b0..76f47157306 100644 --- a/code/game/objects/items/AI_modules/supplied.dm +++ b/code/game/objects/items/AI_modules/supplied.dm @@ -27,7 +27,7 @@ lawpos = 4 /obj/item/ai_module/supplied/safeguard/attack_self(mob/user) - var/targName = tgui_input_text(user, "Subject to safeguard.", "Safeguard", user.name, MAX_NAME_LEN) + var/targName = tgui_input_text(user, "Subject to safeguard.", "Safeguard", user.name, max_length = MAX_NAME_LEN) if(!targName || !user.is_holding(src)) return targetName = targName diff --git a/code/game/objects/items/AI_modules/zeroth.dm b/code/game/objects/items/AI_modules/zeroth.dm index 74fc7ab8232..480735bfe2f 100644 --- a/code/game/objects/items/AI_modules/zeroth.dm +++ b/code/game/objects/items/AI_modules/zeroth.dm @@ -25,7 +25,7 @@ laws = list("Only SUBJECT is human.") /obj/item/ai_module/zeroth/onehuman/attack_self(mob/user) - var/targName = tgui_input_text(user, "Enter the subject who is the only human.", "One Human", user.real_name, MAX_NAME_LEN) + var/targName = tgui_input_text(user, "Enter the subject who is the only human.", "One Human", user.real_name, max_length = MAX_NAME_LEN) if(!targName || !user.is_holding(src)) return targetName = targName diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 3f6e619a4ad..2c8663d4f5d 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -1704,8 +1704,9 @@ to_chat(user, span_notice("You successfully reset the ID card.")) return - ///forge the ID if not forged. - var/input_name = tgui_input_text(user, "What name would you like to put on this card? Leave blank to randomise.", "Agent card name", registered_name ? registered_name : (ishuman(user) ? user.real_name : user.name), MAX_NAME_LEN) + ///forge the ID if not forged.s + var/input_name = tgui_input_text(user, "What name would you like to put on this card? Leave blank to randomise.", "Agent card name", registered_name ? registered_name : (ishuman(user) ? user.real_name : user.name), max_length = MAX_NAME_LEN, encode = FALSE) + if(!after_input_check(user)) return TRUE if(input_name) @@ -1735,7 +1736,7 @@ if(!after_input_check(user)) return TRUE - var/target_occupation = tgui_input_text(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels.", "Agent card job assignment", assignment ? assignment : "Assistant", MAX_NAME_LEN) + var/target_occupation = tgui_input_text(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels.", "Agent card job assignment", assignment ? assignment : "Assistant", max_length = MAX_NAME_LEN) if(!after_input_check(user)) return TRUE @@ -1889,15 +1890,15 @@ return switch(popup_input) if("Name") - var/input_name = tgui_input_text(user, "What name would you like to put on this card?", "Cardboard card name", scribbled_name || (ishuman(user) ? user.real_name : user.name), MAX_NAME_LEN) - input_name = sanitize_name(input_name, allow_numbers = TRUE) + var/raw_input = tgui_input_text(user, "What name would you like to put on this card?", "Cardboard card name", scribbled_name || (ishuman(user) ? user.real_name : user.name), max_length = MAX_NAME_LEN) + var/input_name = sanitize_name(raw_input, allow_numbers = TRUE) if(!after_input_check(user, item, input_name, scribbled_name)) return scribbled_name = input_name var/list/details = item.get_writing_implement_details() details_colors[INDEX_NAME_COLOR] = details["color"] || COLOR_BLACK if("Assignment") - var/input_assignment = tgui_input_text(user, "What assignment would you like to put on this card?", "Cardboard card job ssignment", scribbled_assignment || "Assistant", MAX_NAME_LEN) + var/input_assignment = tgui_input_text(user, "What assignment would you like to put on this card?", "Cardboard card job ssignment", scribbled_assignment || "Assistant", max_length = MAX_NAME_LEN) if(!after_input_check(user, item, input_assignment, scribbled_assignment)) return scribbled_assignment = sanitize(input_assignment) diff --git a/code/game/objects/items/cigarettes.dm b/code/game/objects/items/cigarettes.dm index d55bd12bd50..99dea20e940 100644 --- a/code/game/objects/items/cigarettes.dm +++ b/code/game/objects/items/cigarettes.dm @@ -135,6 +135,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM name = "cigarette" desc = "A roll of tobacco and nicotine. It is not food." icon = 'icons/obj/cigarettes.dmi' + worn_icon = 'icons/mob/clothing/mask.dmi' icon_state = "cigoff" inhand_icon_state = "cigon" //gets overriden during intialize(), just have it for unit test sanity. throw_speed = 0.5 @@ -693,6 +694,27 @@ CIGARETTE PACKETS ARE IN FANCY.DM pixel_y = rand(-5, 5) +/obj/item/cigarette/dart + name = "fat dart" + desc = "Chuff back this fat dart" + icon_state = "bigon" + icon_on = "bigon" + icon_off = "bigoff" + w_class = WEIGHT_CLASS_BULKY + smoketime = 18 MINUTES + chem_volume = 65 + list_reagents = list(/datum/reagent/drug/nicotine = 45) + choke_time_max = 40 SECONDS + lung_harm = 2 + +/obj/item/cigarette/dart/Initialize(mapload) + . = ..() + //the compiled icon state is how it appears when it's on. + //That's how we want it to show on orbies (little virtual PDA pets). + //However we should reset their appearance on runtime. + update_appearance(UPDATE_ICON_STATE) + + //////////// // CIGARS // //////////// diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index ff0f4beff20..42ffa325058 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -402,7 +402,7 @@ set_painting_tool_color(paint_color) . = TRUE if("enter_text") - var/txt = tgui_input_text(usr, "Choose what to write", "Scribbles", text_buffer) + var/txt = tgui_input_text(usr, "Choose what to write", "Scribbles", text_buffer, max_length = MAX_MESSAGE_LEN) if(isnull(txt)) return txt = crayon_text_strip(txt) diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 937ca56d7fa..16fee817e36 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -235,9 +235,12 @@ else if(user.zone_selected == BODY_ZONE_PRECISE_EYES) //Intensity of the laser dot to pass to flash_act var/severity = pick(0, 1, 2) + var/always_fail = FALSE + if(istype(target_humanoid.glasses, /obj/item/clothing/glasses/eyepatch) && prob(50)) + always_fail = TRUE //chance to actually hit the eyes depends on internal component - if(prob(effectchance * diode.rating) && target_humanoid.flash_act(severity)) + if(prob(effectchance * diode.rating) && !always_fail && target_humanoid.flash_act(severity)) outmsg = span_notice("You blind [target_humanoid] by shining [src] in [target_humanoid.p_their()] eyes.") log_combat(user, target_humanoid, "blinded with a laser pointer", src) else diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index d17530c8010..4f0c0a84aa3 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -25,11 +25,36 @@ /obj/item/transfer_valve/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_ITEM_FRIED, PROC_REF(on_fried)) + register_context() /obj/item/transfer_valve/Destroy() attached_device = null return ..() +/obj/item/transfer_valve/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + + if(tank_one || tank_two) + context[SCREENTIP_CONTEXT_ALT_LMB] = "Remove [tank_one || tank_two]" + . = CONTEXTUAL_SCREENTIP_SET + if(istype(held_item) && is_type_in_list(held_item, list(/obj/item/tank, /obj/item/assembly))) + context[SCREENTIP_CONTEXT_LMB] = "Attach [held_item]" + . = CONTEXTUAL_SCREENTIP_SET + + return . || NONE + +/obj/item/transfer_valve/click_alt(mob/user) + if(tank_one) + split_gases() + valve_open = FALSE + tank_one.forceMove(drop_location()) + else if(tank_two) + split_gases() + valve_open = FALSE + tank_two.forceMove(drop_location()) + + return CLICK_ACTION_SUCCESS + /obj/item/transfer_valve/IsAssemblyHolder() return TRUE diff --git a/code/game/objects/items/eightball.dm b/code/game/objects/items/eightball.dm index 4445cdd1b72..40f08e78ffc 100644 --- a/code/game/objects/items/eightball.dm +++ b/code/game/objects/items/eightball.dm @@ -153,7 +153,7 @@ /obj/item/toy/eightball/haunted/start_shaking(mob/user) // notify ghosts that someone's shaking a haunted eightball // and inform them of the message, (hopefully a yes/no question) - selected_message = tgui_input_text(user, "What is your question?", "Eightball") || initial(selected_message) + selected_message = tgui_input_text(user, "What is your question?", "Eightball", max_length = MAX_MESSAGE_LEN) || initial(selected_message) if (!(src in user.held_items)) return FALSE notify_ghosts( diff --git a/code/game/objects/items/etherealdiscoball.dm b/code/game/objects/items/etherealdiscoball.dm index fe066bd1bf5..4eca1dc2fc0 100644 --- a/code/game/objects/items/etherealdiscoball.dm +++ b/code/game/objects/items/etherealdiscoball.dm @@ -1,5 +1,5 @@ /obj/item/etherealballdeployer - name = "Portable Ethereal Disco Ball" + name = "portable ethereal disco ball" desc = "Press the button for a deployment of slightly-unethical PARTY!" icon = 'icons/obj/devices/remote.dmi' icon_state = "ethdisco" @@ -11,7 +11,7 @@ qdel(src) /obj/structure/etherealball - name = "Ethereal Disco Ball" + name = "ethereal disco ball" desc = "The ethics of this discoball are questionable." icon = 'icons/obj/machines/floor.dmi' icon_state = "ethdisco_head_0" diff --git a/code/game/objects/items/food/donuts.dm b/code/game/objects/items/food/donuts.dm index 0d2e2f91d30..922ed2eaa66 100644 --- a/code/game/objects/items/food/donuts.dm +++ b/code/game/objects/items/food/donuts.dm @@ -79,7 +79,7 @@ reagents.add_reagent(extra_reagent, 3) /obj/item/food/donut/meat - name = "Meat Donut" + name = "meat donut" desc = "Tastes as gross as it looks." icon_state = "donut_meat" food_reagents = list( diff --git a/code/game/objects/items/food/meatdish.dm b/code/game/objects/items/food/meatdish.dm index a619be72062..415fe5775d9 100644 --- a/code/game/objects/items/food/meatdish.dm +++ b/code/game/objects/items/food/meatdish.dm @@ -752,13 +752,22 @@ w_class = WEIGHT_CLASS_TINY venue_value = FOOD_PRICE_CHEAP crafting_complexity = FOOD_COMPLEXITY_1 + var/meat_source = "\"chicken\"" /obj/item/food/nugget/Initialize(mapload) . = ..() var/shape = pick("lump", "star", "lizard", "corgi") - desc = "A \"chicken\" nugget vaguely shaped like a [shape]." + desc = "A [meat_source] nugget vaguely shaped like a [shape]." icon_state = "nugget_[shape]" +///subtype harvested from fish caught from, you guess it, the deepfryer +/obj/item/food/nugget/fish + name = "fish nugget" + tastes = list("fried fish" = 1) + foodtypes = MEAT|SEAFOOD|FRIED + venue_value = FOOD_PRICE_NORMAL + meat_source = "fish" + /obj/item/food/pigblanket name = "pig in a blanket" desc = "A tiny sausage wrapped in a flakey, buttery roll. Free this pig from its blanket prison by eating it." diff --git a/code/game/objects/items/food/misc.dm b/code/game/objects/items/food/misc.dm index 97c40dfe357..d99807d9a04 100644 --- a/code/game/objects/items/food/misc.dm +++ b/code/game/objects/items/food/misc.dm @@ -339,7 +339,7 @@ crafting_complexity = FOOD_COMPLEXITY_5 /obj/item/food/branrequests - name = "Bran Requests Cereal" + name = "bran requests cereal" desc = "A dry cereal that satiates your requests for bran. Tastes uniquely like raisins and salt." icon_state = "bran_requests" food_reagents = list( @@ -422,7 +422,7 @@ w_class = WEIGHT_CLASS_TINY /obj/item/food/crab_rangoon - name = "Crab Rangoon" + name = "crab rangoon" desc = "Has many names, like crab puffs, cheese won'tons, crab dumplings? Whatever you call them, they're a fabulous blast of cream cheesy crab." icon = 'icons/obj/food/meat.dmi' icon_state = "crabrangoon" diff --git a/code/game/objects/items/grenades/_grenade.dm b/code/game/objects/items/grenades/_grenade.dm index ca7da893bb4..cbf604db63d 100644 --- a/code/game/objects/items/grenades/_grenade.dm +++ b/code/game/objects/items/grenades/_grenade.dm @@ -51,6 +51,8 @@ var/shrapnel_radius ///Did we add the component responsible for spawning shrapnel to this? var/shrapnel_initialized + ///Possible timers that can be assigned for detonation. Values are strings in SECONDS + var/list/possible_fuse_time = list("Instant", "3", "4", "5") /obj/item/grenade/Initialize(mapload) . = ..() @@ -210,7 +212,10 @@ return FALSE if(change_det_time()) tool.play_tool_sound(src) - to_chat(user, span_notice("You modify the time delay. It's set for [DisplayTimeText(det_time)].")) + if(det_time == 0) + to_chat(user, span_notice("You modify the time delay. It's set to be instantaneous.")) + else + to_chat(user, span_notice("You modify the time delay. It's set for [DisplayTimeText(det_time)].")) return TRUE /obj/item/grenade/multitool_act(mob/living/user, obj/item/tool) @@ -220,7 +225,7 @@ . = TRUE - var/newtime = tgui_input_list(user, "Please enter a new detonation time", "Detonation Timer", list("Instant", 3, 4, 5)) + var/newtime = tgui_input_list(user, "Please enter a new detonation time", "Detonation Timer", possible_fuse_time) if (isnull(newtime)) return if(!user.can_perform_action(src)) @@ -228,25 +233,40 @@ if(newtime == "Instant" && change_det_time(0)) to_chat(user, span_notice("You modify the time delay. It's set to be instantaneous.")) return - newtime = round(newtime) + newtime = round(text2num(newtime)) if(change_det_time(newtime)) to_chat(user, span_notice("You modify the time delay. It's set for [DisplayTimeText(det_time)].")) -/obj/item/grenade/proc/change_det_time(time) //Time uses real time. +/** + * Sets det_time to a number in SECONDS + * + * if time is passed as an argument, `det_time` will be `time SECONDS` + * + * Cycles the duration of the fuse of the grenade `det_time` based on the options provided in list/possible_fuse_time +*/ +/obj/item/grenade/proc/change_det_time(time) . = TRUE + //Multitool if(!isnull(time)) - det_time = round(clamp(time * 10, 0, 5 SECONDS)) + det_time = round(clamp(time SECONDS, 0, 5 SECONDS)) //This is fine for now but consider making this a variable if you want >5s fuse + return + + //Screwdriver + if(det_time == 0) + det_time = "Instant" + else + det_time = num2text(det_time * 0.1) + + var/old_selection = possible_fuse_time.Find(det_time) //Position of det_time in the list + if(old_selection >= possible_fuse_time.len) + det_time = possible_fuse_time[1] else - var/previous_time = det_time - switch(det_time) - if (0) - det_time = 3 SECONDS - if (3 SECONDS) - det_time = 5 SECONDS - if (5 SECONDS) - det_time = 0 - if(det_time == previous_time) - det_time = 5 SECONDS + det_time = possible_fuse_time[old_selection+1] + + if(det_time == "Instant") + det_time = 0 //String to num conversion because I hate coders + return + det_time = text2num(det_time) SECONDS /obj/item/grenade/attack_paw(mob/user, list/modifiers) return attack_hand(user, modifiers) diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm index a73b0b02500..bf628c0ad93 100644 --- a/code/game/objects/items/grenades/flashbang.dm +++ b/code/game/objects/items/grenades/flashbang.dm @@ -4,6 +4,7 @@ inhand_icon_state = "flashbang" lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' + possible_fuse_time = list("3", "4", "5") var/flashbang_range = 7 //how many tiles away the mob will be stunned. /obj/item/grenade/flashbang/apply_grenade_fantasy_bonuses(quality) diff --git a/code/game/objects/items/implants/security/implant_track.dm b/code/game/objects/items/implants/security/implant_track.dm index b95c0afa7d8..9b8050d7dad 100644 --- a/code/game/objects/items/implants/security/implant_track.dm +++ b/code/game/objects/items/implants/security/implant_track.dm @@ -48,7 +48,7 @@ return if(params["implant_action"] == "warn") - var/warning = tgui_input_text(user, "What warning do you want to send to [imp_in.name]?", "Messaging") + var/warning = tgui_input_text(user, "What warning do you want to send to [imp_in.name]?", "Messaging", max_length = MAX_MESSAGE_LEN) if(!warning || QDELETED(src) || QDELETED(user) || QDELETED(console) || isnull(imp_in)) return TRUE if(!console.is_operational || !user.can_perform_action(console, NEED_DEXTERITY|ALLOW_SILICON_REACH)) diff --git a/code/game/objects/items/mail.dm b/code/game/objects/items/mail.dm index 92a565e5565..5e60ecfaa43 100644 --- a/code/game/objects/items/mail.dm +++ b/code/game/objects/items/mail.dm @@ -550,10 +550,10 @@ shady_mail.made_by_cached_name = user.mind.name if(index == 1) - var/mail_name = tgui_input_text(user, "Enter mail title, or leave it blank", "Mail Counterfeiting") + var/mail_name = tgui_input_text(user, "Enter mail title, or leave it blank", "Mail Counterfeiting", max_length = MAX_LABEL_LEN) if(!(src in user.contents)) return FALSE - if(reject_bad_text(mail_name, ascii_only = FALSE)) + if(reject_bad_text(mail_name, max_length = MAX_LABEL_LEN, ascii_only = FALSE)) shady_mail.name = mail_name else shady_mail.name = mail_type diff --git a/code/game/objects/items/robot/ai_upgrades.dm b/code/game/objects/items/robot/ai_upgrades.dm index f6357b229ef..b630a3b8a42 100644 --- a/code/game/objects/items/robot/ai_upgrades.dm +++ b/code/game/objects/items/robot/ai_upgrades.dm @@ -1,4 +1,45 @@ ///AI Upgrades +/obj/item/aiupgrade + name = "ai upgrade disk" + desc = "You really shouldn't be seeing this" + icon = 'icons/obj/devices/circuitry_n_data.dmi' + icon_state = "datadisk3" + ///The upgrade that will be applied to the AI when installed + var/datum/ai_module/to_gift = /datum/ai_module + +/obj/item/aiupgrade/pre_attack(atom/target, mob/living/user, proximity) + if(!proximity) + return ..() + if(!isAI(target)) + return ..() + var/mob/living/silicon/ai/AI = target + var/datum/action/innate/ai/action = locate(to_gift.power_type) in AI.actions + var/datum/ai_module/gifted_ability = new to_gift + if(!to_gift.upgrade) + if(!action) + var/ability = to_gift.power_type + var/datum/action/gifted_action = new ability + gifted_action.Grant(AI) + else if(gifted_ability.one_purchase) + to_chat(user, "[AI] already has an [src] installed!") + return + else + action.uses += initial(action.uses) + action.desc = "[initial(action.desc)] It has [action.uses] use\s remaining." + action.build_all_button_icons() + else + if(!action) + gifted_ability.upgrade(AI) + if(gifted_ability.unlock_text) + to_chat(AI, gifted_ability.unlock_text) + if(gifted_ability.unlock_sound) + AI.playsound_local(AI, gifted_ability.unlock_sound, 50, 0) + update_static_data(AI) + to_chat(user, span_notice("You install [src], upgrading [AI].")) + to_chat(AI, span_userdanger("[user] has upgraded you with [src]!")) + user.log_message("has upgraded [key_name(AI)] with a [src].", LOG_GAME) + qdel(src) + return TRUE //Malf Picker @@ -34,28 +75,21 @@ //Lipreading -/obj/item/surveillance_upgrade +/obj/item/aiupgrade/surveillance_upgrade name = "surveillance software upgrade" desc = "An illegal software package that will allow an artificial intelligence to 'hear' from its cameras via lip reading and hidden microphones." - icon = 'icons/obj/devices/circuitry_n_data.dmi' - icon_state = "datadisk3" + to_gift = /datum/ai_module/malf/upgrade/eavesdrop -/obj/item/surveillance_upgrade/Initialize(mapload) +/obj/item/aiupgrade/surveillance_upgrade/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) -/obj/item/surveillance_upgrade/pre_attack(atom/A, mob/living/user, proximity) - if(!proximity) - return ..() - if(!isAI(A)) - return ..() - var/mob/living/silicon/ai/AI = A - if(AI.eyeobj) - AI.eyeobj.relay_speech = TRUE - to_chat(AI, span_userdanger("[user] has upgraded you with surveillance software!")) - to_chat(AI, "Via a combination of hidden microphones and lip reading software, you are able to use your cameras to listen in on conversations.") - to_chat(user, span_notice("You upgrade [AI]. [src] is consumed in the process.")) - user.log_message("has upgraded [key_name(AI)] with a [src].", LOG_GAME) - message_admins("[ADMIN_LOOKUPFLW(user)] has upgraded [ADMIN_LOOKUPFLW(AI)] with a [src].") - qdel(src) - return TRUE + +/obj/item/aiupgrade/power_transfer + name = "power transfer upgrade" + desc = "A legal upgrade that allows an artificial intelligence to directly provide power to APCs from a distance" + to_gift = /datum/ai_module/power_apc + + + + diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index 11013fe7ad5..095250fdcca 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -575,7 +575,7 @@ new /obj/item/ammo_casing/harpoon(src) /obj/item/storage/bag/rebar_quiver - name = "Rebar Storage Quiver" + name = "rebar quiver" icon = 'icons/obj/weapons/bows/quivers.dmi' icon_state = "rebar_quiver" worn_icon_state = "rebar_quiver" @@ -605,7 +605,7 @@ desc = "A specialized quiver meant to hold any kind of bolts intended for use with the rebar crossbow. \ Clearly a better design than a cut up oxygen tank..." slot_flags = ITEM_SLOT_NECK - w_class = WEIGHT_CLASS_SMALL + w_class = WEIGHT_CLASS_NORMAL resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF actions_types = list(/datum/action/item_action/reload_rebar) @@ -647,7 +647,7 @@ if(held_crossbow.magazine.contents.len >= held_crossbow.magazine.max_ammo) user.balloon_alert(user, "no more room!") return - if(!do_after(user, 0.8 SECONDS, user, IGNORE_USER_LOC_CHANGE)) + if(!do_after(user, 1.2 SECONDS, user)) return var/obj/item/ammo_casing/rebar/ammo_to_load = contents[1] diff --git a/code/game/objects/items/storage/medkit.dm b/code/game/objects/items/storage/medkit.dm index b0adf4a1143..5a61b7dd080 100644 --- a/code/game/objects/items/storage/medkit.dm +++ b/code/game/objects/items/storage/medkit.dm @@ -819,3 +819,8 @@ /obj/item/storage/test_tube_rack/update_icon_state() icon_state = "[base_icon_state][contents.len > 0 ? contents.len : null]" return ..() + +/obj/item/storage/test_tube_rack/full/PopulateContents() + for(var/i in 1 to atom_storage.max_slots) + new /obj/item/reagent_containers/cup/tube(src) + diff --git a/code/game/objects/items/tcg/tcg_machines.dm b/code/game/objects/items/tcg/tcg_machines.dm index 77b6891e4c1..7a55e2e9554 100644 --- a/code/game/objects/items/tcg/tcg_machines.dm +++ b/code/game/objects/items/tcg/tcg_machines.dm @@ -90,7 +90,7 @@ GLOBAL_LIST_EMPTY(tcgcard_machine_radial_choices) /obj/machinery/trading_card_holder/attack_hand_secondary(mob/user) if(isnull(current_summon)) - var/card_name = tgui_input_text(user, "Insert card name", "Blank Card Naming", "blank card", MAX_NAME_LEN) + var/card_name = tgui_input_text(user, "Insert card name", "Blank Card Naming", "blank card", max_length = MAX_NAME_LEN) if(isnull(card_name) || !user.can_perform_action(src)) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN current_summon = new /obj/structure/trading_card_summon/blank(locate(x + summon_offset_x, y + summon_offset_y, z)) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 097fa6d0c3e..139a3fcb216 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1404,7 +1404,7 @@ //Add changing looks when i feel suicidal about making 20 inhands for these. /obj/item/toy/dummy/attack_self(mob/user) - var/new_name = tgui_input_text(usr, "What would you like to name the dummy?", "Doll Name", doll_name, MAX_NAME_LEN) + var/new_name = tgui_input_text(usr, "What would you like to name the dummy?", "Doll Name", doll_name, max_length = MAX_NAME_LEN) if(!new_name || !user.is_holding(src)) return doll_name = new_name diff --git a/code/game/objects/items/wall_mounted.dm b/code/game/objects/items/wall_mounted.dm index ef19205cf80..2db970b556a 100644 --- a/code/game/objects/items/wall_mounted.dm +++ b/code/game/objects/items/wall_mounted.dm @@ -61,9 +61,9 @@ /obj/item/wallframe/screwdriver_act(mob/living/user, obj/item/tool) // For camera-building borgs - var/turf/T = get_step(get_turf(user), user.dir) - if(iswallturf(T)) - T.attackby(src, user) + var/turf/wall_turf = get_step(get_turf(user), user.dir) + if(iswallturf(wall_turf)) + wall_turf.item_interaction(user, src) return ITEM_INTERACT_SUCCESS /obj/item/wallframe/wrench_act(mob/living/user, obj/item/tool) diff --git a/code/game/objects/structures/cannons/cannon_instructions.dm b/code/game/objects/structures/cannons/cannon_instructions.dm index c259ea0e76f..34cdcdf1ced 100644 --- a/code/game/objects/structures/cannons/cannon_instructions.dm +++ b/code/game/objects/structures/cannons/cannon_instructions.dm @@ -17,4 +17,10 @@ REGULAR CANNONBALL: A fine choice for killing landlubbers! Will take off any lim EXPLOSIVE SHELLBALL: The most elegant in breaching (er killin', if you're good at aimin') tools, ye be packing this shell with many scuppering chemicals! Just make sure to not fire it when ye be close to target!
MALFUNCTION SHOT: A very gentle "cannonball" dart at first glance, but make no mistake: This is their worst nightmare! Enjoy an easy boarding process while all their machines are broken and all their weapons unloaded from an EMP!
THE BIGGEST ONE: A shellball, but much bigger. Ye won't be seein' much of these as they were discontinued for sinkin' the firer's ship as often as it sunk the scallywag's ship. Very big boom! If ye have one, ye have been warned! + +
FIRING THAR CANISTER GATLING
+ +THE CANISTER GATLING AIN'T LIKE OTHER CANNONS, AND DOESN'T REQUIRE GUNPOWDER, INSTEAD RELYING ON SPECIAL CANISTER SHOT SHELLS. +ALL YOU HAVE TO DO IS CRAM A SHELL IN THE BREACH, LIGHT HER UP AND YOU'LL BE BLOWING THOSE CORPORATE SODS TO KINGDOM COME! +SHE LACKS THE SHEER WALL-BREAKING PUNCH OF THE HOLEMAKERS, BUT CHEWS THROUGH SOFT TARGETS LIKE A SHARK THROUGH A GROUP OF BEACH THROUGH A GROUP OF BEACHGOERS, YAHAR. "} diff --git a/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm b/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm new file mode 100644 index 00000000000..da27cdbdaf9 --- /dev/null +++ b/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm @@ -0,0 +1,187 @@ +//Mounted guns are basically a smaller equivalent to cannons, designed to use pre-existing ammo rather than cannonballs. +//Due to using pre-existing ammo, they dont require to be loaded with gunpowder or an equivalent. + +/obj/structure/mounted_gun + name = "Mounted Gun" + desc = "Default mounted gun for inheritance purposes." + density = TRUE + anchored = FALSE + icon = 'icons/obj/weapons/cannons.dmi' + icon_state = "falconet_patina" + var/icon_state_base = "falconet_patina" + var/icon_state_fire = "falconet_patina_fire" + max_integrity = 300 + ///whether the cannon can be unwrenched from the ground. Anchorable_cannon equivalent. + var/anchorable_gun = TRUE + ///Max shots per firing of the gun. + var/max_shots_per_fire = 1 + ///Shots currently loaded. Should never be more than max_shots_per_fire. + var/shots_in_gun = 1 + ///shots added to gun, per piece of ammo loaded. + var/shots_per_load = 1 + ///Accepted "ammo" type + var/obj/item/ammo_type = /obj/item/ammo_casing/strilka310 + ///Projectile from said gun. Doesnt automatically inherit said ammo's projectile in case you wanted to make a gun that shoots floor tiles or something. + var/obj/item/projectile_type = /obj/projectile/bullet/strilka310 + ///If the gun has anything in it. + var/loaded_gun = TRUE + ///If the gun is currently loaded with its maximum capacity. + var/fully_loaded_gun = TRUE + ///delay in firing the gun after lighting + var/fire_delay = 5 + ///Delay between shots + var/shot_delay = 3 + ///If the gun shakes the camera when firing + var/firing_shakes_camera = TRUE + ///sound of firing for all but last shot + var/fire_sound = 'sound/weapons/gun/general/mountedgun.ogg' + ///sound of firing for last shot + var/last_fire_sound = 'sound/weapons/gun/general/mountedgunend.ogg' + +/obj/structure/mounted_gun/wrench_act(mob/living/user, obj/item/tool) + . = ..() + if(!anchorable_gun) /// Can't anchor an unanchorable gun. + return FALSE + default_unfasten_wrench(user, tool) + return ITEM_INTERACT_SUCCESS + +///Covers Reloading and lighting of the gun +/obj/structure/mounted_gun/attackby(obj/item/ammo_casing/used_item, mob/user, params) + var/ignition_message = used_item.ignition_effect(src, user) // Checks if item used can ignite stuff. + if(istype(used_item, ammo_type)) + if(fully_loaded_gun) + balloon_alert(user, "already fully loaded!") + return + else + shots_in_gun = shots_in_gun + shots_per_load //Add one to the shots in the gun + + loaded_gun = TRUE // Make sure it registers theres ammo in there, so it can fire. + QDEL_NULL(used_item) + if(shots_in_gun >= max_shots_per_fire) + shots_in_gun = max_shots_per_fire // in case of somehow firing only some of a guns shots, and reloading, you still cant get above the maximum ammo size. + fully_loaded_gun = TRUE //So you cant load extra. + return + + else if(ignition_message) // if item the player used ignites, light the gun! + visible_message(ignition_message) + user.log_message("fired a cannon", LOG_ATTACK) + log_game("[key_name(user)] fired a cannon in [AREACOORD(src)]") + addtimer(CALLBACK(src, PROC_REF(fire)), fire_delay) //uses fire proc as shown below to shoot the gun + return + ..() + +/obj/structure/mounted_gun/proc/fire() + if (!loaded_gun) + balloon_alert_to_viewers("gun is not loaded!","",2) + return + for(var/times_fired = 1, times_fired <= shots_in_gun, times_fired++) //The normal DM for loop structure since the times it has fired is changing in the loop itself. + for(var/mob/shaken_mob in urange(10, src)) + if(shaken_mob.stat == CONSCIOUS && firing_shakes_camera == TRUE) + shake_camera(shaken_mob, 3, 1) + icon_state = icon_state_fire + if(loaded_gun) + + if (times_fired < shots_in_gun) + playsound(src, fire_sound, 50, FALSE, 5) + else + playsound(src, last_fire_sound, 50, TRUE, 5) + var/obj/projectile/fired_projectile = new projectile_type(get_turf(src)) + fired_projectile.firer = src + fired_projectile.fired_from = src + fired_projectile.fire(dir2angle(dir)) + sleep(shot_delay) + loaded_gun = FALSE + shots_in_gun = 0 + fully_loaded_gun = FALSE + icon_state = icon_state_base + +/obj/structure/mounted_gun/pipe + + name = "Pipe Organ Gun" + desc = "To become master over one who has killed, one must become a better killer. This engine of destruction is one of many things made to that end." + icon_state = "pipeorgangun" + icon_state_base = "pipeorgangun" + icon_state_fire = "pipeorgangun_fire" + anchored = FALSE + anchorable_gun = TRUE + max_shots_per_fire = 8 + shots_in_gun = 8 + shots_per_load = 2 + ammo_type = /obj/item/ammo_casing/junk + projectile_type = /obj/projectile/bullet/junk + loaded_gun = TRUE + fully_loaded_gun = TRUE + fire_delay = 3 + shot_delay = 2 + firing_shakes_camera = FALSE + +/obj/structure/mounted_gun/pipe/examine_more(mob/user) + . = ..() + . += span_notice("Looking down at the [name], you recall a tale told to you in some distant memory...") + + . += span_info("To commit an act of vengeance is not unlike to enter a blood pact with a devil, ending the life of another, at the cost of your own.") + . += span_info("When humanity first spilled the blood of its own kind, with likely nothing more than a rock, the seal was broken. Vengeance was borne unto the world.") + . += span_info("However, vengeance alone is not enough to carry through the grim deed of murder. One must an gain advantage over their adversary.") + . += span_info("As such, the man who ended another's life with a stone, was in turn smote himself by another wielding a spear. After spears, bows. Swords. Guns. Tanks. Missiles. And on and on Vengeance fed. Growing stronger. Growing Worse.") + . += span_info("Vengeance persists to this day. It sometimes may slumber, seemingly content with having gorged itself, but in the end, its ceaseless hunger can be neither numbed nor sated.") + +/obj/structure/mounted_gun/pipe/fire() + if (!loaded_gun) + balloon_alert_to_viewers("Gun is not loaded!","",2) + return + for(var/times_fired = 1, times_fired <= shots_in_gun, times_fired++) //The normal DM for loop structure since the times it has fired is changing in the loop itself. + for(var/mob/shaken_mob in urange(10, src)) + if((shaken_mob.stat == CONSCIOUS)&&(firing_shakes_camera == TRUE)) + shake_camera(shaken_mob, 3, 1) + icon_state = icon_state_fire + if(loaded_gun) + playsound(src, fire_sound, 50, TRUE, 5) + + var/list_of_projectiles = list( + /obj/projectile/bullet/junk = 40, + /obj/projectile/bullet/incendiary/fire/junk = 25, + /obj/projectile/bullet/junk/shock = 25, + /obj/projectile/bullet/junk/hunter = 20, + /obj/projectile/bullet/junk/phasic = 8, + /obj/projectile/bullet/junk/ripper = 8, + /obj/projectile/bullet/junk/reaper = 3, + ) + projectile_type = pick_weight(list_of_projectiles) + + var/obj/projectile/fired_projectile = new projectile_type(get_turf(src)) + fired_projectile.firer = src + fired_projectile.fired_from = src + fired_projectile.fire(dir2angle(dir)) + sleep(shot_delay) + loaded_gun = FALSE + shots_in_gun = 0 + fully_loaded_gun = FALSE + icon_state = icon_state_base + +/obj/structure/mounted_gun/canister_gatling //for the funny skeleton pirates! + + name = "Canister Gatling Gun" + desc = "''Quantity has a quality of its own.''" + icon_state = "canister_gatling" + icon_state_base = "canister_gatling" + icon_state_fire = "canister_gatling_fire" + anchored = FALSE + anchorable_gun = TRUE + max_shots_per_fire = 50 + shots_per_load = 50 + shots_in_gun = 50 + ammo_type = /obj/item/ammo_casing/canister_shot + projectile_type = /obj/projectile/bullet/shrapnel + loaded_gun = TRUE + fully_loaded_gun = TRUE + fire_delay = 3 + shot_delay = 1 + firing_shakes_camera = FALSE + +/obj/item/ammo_casing/canister_shot + name = "Canister Shot" + desc = "A gigantic... well, canister of canister shot. Used for reloading the Canister Gatling Gun." + icon_state = "canister_shot" + obj_flags = CONDUCTS_ELECTRICITY + throwforce = 0 + w_class = WEIGHT_CLASS_BULKY diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 902eef6da17..c4740398d82 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -830,14 +830,17 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) var/name_set = FALSE var/desc_set = FALSE - var/str = tgui_input_text(user, "Locker Name", "Locker Name") - if(!isnull(str)) - name = str + + var/input_name = tgui_input_text(user, "Locker Name", "Locker Name", max_length = MAX_NAME_LEN) + + if(!isnull(input_name)) + name = input_name name_set = TRUE - str = tgui_input_text(user, "Locker Description", "Locker Description") - if(!isnull(str)) - desc = str + var/input_desc = tgui_input_text(user, "Locker Description", "Locker Description", max_length = MAX_DESC_LEN) + + if(!isnull(input_desc)) + desc = input_desc desc_set = TRUE var/bit_flag = NONE diff --git a/code/game/objects/structures/detectiveboard.dm b/code/game/objects/structures/detectiveboard.dm index c94cdf1c777..8905f629794 100644 --- a/code/game/objects/structures/detectiveboard.dm +++ b/code/game/objects/structures/detectiveboard.dm @@ -47,11 +47,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/detectiveboard, 32) to_chat(user, "You already attaching evidence!") return attaching_evidence = TRUE - var/name = tgui_input_text(user, "Please enter the evidence name", "Detective's Board") + var/name = tgui_input_text(user, "Please enter the evidence name", "Detective's Board", max_length = MAX_NAME_LEN) if(!name) attaching_evidence = FALSE return - var/desc = tgui_input_text(user, "Please enter the evidence description", "Detective's Board") + var/desc = tgui_input_text(user, "Please enter the evidence description", "Detective's Board", max_length = MAX_DESC_LEN) if(!desc) attaching_evidence = FALSE return @@ -143,7 +143,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/detectiveboard, 32) if("add_case") if(cases.len == MAX_CASES) return FALSE - var/new_case = tgui_input_text(user, "Please enter the case name", "Detective's Board") + var/new_case = tgui_input_text(user, "Please enter the case name", "Detective's Board", max_length = MAX_NAME_LEN) if(!new_case) return FALSE var/case_color = tgui_input_list(user, "Please choose case color", "Detective's Board", case_colors) @@ -170,7 +170,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/detectiveboard, 32) update_appearance(UPDATE_ICON) return TRUE if("rename_case") - var/new_name = tgui_input_text(user, "Please ender the case new name", "Detective's Board") + var/new_name = tgui_input_text(user, "Please enter the new name for the case", "Detective's Board", max_length = MAX_NAME_LEN) if(new_name) var/datum/case/case = locate(params["case_ref"]) in cases case.name = new_name diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 09c3214146b..05fa7de3d6c 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -426,7 +426,7 @@ return if("change_message") if(showpiece && !holographic_showpiece) - var/new_trophy_message = tgui_input_text(usr, "Let's make history!", "Trophy Message", trophy_message, MAX_PLAQUE_LEN) + var/new_trophy_message = tgui_input_text(usr, "Let's make history!", "Trophy Message", trophy_message, max_length = MAX_PLAQUE_LEN) if(!new_trophy_message) return trophy_message = new_trophy_message diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 9493a7c9414..c2d67e62901 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -83,7 +83,7 @@ /obj/structure/door_assembly/attackby(obj/item/W, mob/living/user, params) if(IS_WRITING_UTENSIL(W) && !user.combat_mode) - var/t = tgui_input_text(user, "Enter the name for the door", "Airlock Renaming", created_name, MAX_NAME_LEN) + var/t = tgui_input_text(user, "Enter the name for the door", "Airlock Renaming", created_name, max_length = MAX_NAME_LEN) if(!t) return if(!in_range(src, usr) && loc != usr) diff --git a/code/game/objects/structures/plaques/_plaques.dm b/code/game/objects/structures/plaques/_plaques.dm index 1277869dbf6..951a538e724 100644 --- a/code/game/objects/structures/plaques/_plaques.dm +++ b/code/game/objects/structures/plaques/_plaques.dm @@ -88,7 +88,7 @@ var/namechoice = tgui_input_text(user, "Title this plaque. (e.g. 'Best HoP Award', 'Great Ashwalker War Memorial')", "Plaque Customization", max_length = MAX_NAME_LEN) if(!namechoice) return - var/descriptionchoice = tgui_input_text(user, "Engrave this plaque's text", "Plaque Customization") + var/descriptionchoice = tgui_input_text(user, "Engrave this plaque's text", "Plaque Customization", max_length = MAX_PLAQUE_LEN) if(!descriptionchoice) return if(!Adjacent(user)) //Make sure user is adjacent still @@ -161,7 +161,7 @@ var/namechoice = tgui_input_text(user, "Title this plaque. (e.g. 'Best HoP Award', 'Great Ashwalker War Memorial')", "Plaque Customization", max_length = MAX_NAME_LEN) if(!namechoice) return - var/descriptionchoice = tgui_input_text(user, "Engrave this plaque's text", "Plaque Customization") + var/descriptionchoice = tgui_input_text(user, "Engrave this plaque's text", "Plaque Customization", max_length = MAX_PLAQUE_LEN) if(!descriptionchoice) return if(!Adjacent(user)) //Make sure user is adjacent still diff --git a/code/game/objects/structures/votingbox.dm b/code/game/objects/structures/votingbox.dm index 42ccd625093..55909978fe2 100644 --- a/code/game/objects/structures/votingbox.dm +++ b/code/game/objects/structures/votingbox.dm @@ -94,7 +94,7 @@ ui_interact(user) /obj/structure/votebox/proc/set_description(mob/user) - var/new_description = tgui_input_text(user, "Enter a new description", "Vote Description", vote_description, multiline = TRUE) + var/new_description = tgui_input_text(user, "Enter a new description", "Vote Description", vote_description, multiline = TRUE, max_length = MAX_DESC_LEN) if(new_description) vote_description = new_description diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 4c22cbf01b2..4ff29eb606e 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -252,7 +252,7 @@ ae.forceMove(drop_location()) else if(IS_WRITING_UTENSIL(W)) - var/t = tgui_input_text(user, "Enter the name for the door", "Windoor Renaming", created_name, MAX_NAME_LEN) + var/t = tgui_input_text(user, "Enter the name for the door", "Windoor Renaming", created_name, max_length = MAX_NAME_LEN) if(!t) return if(!in_range(src, usr) && loc != usr) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index adb737612df..1510783fc7c 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -320,7 +320,7 @@ ADMIN_VERB(give_mob_action, R_FUN, "Give Mob Action", ADMIN_VERB_NO_DESCRIPTION, if(isnull(ability_melee_cooldown) || ability_melee_cooldown < 0) ability_melee_cooldown = 2 add_ability.melee_cooldown_time = ability_melee_cooldown * 1 SECONDS - add_ability.name = tgui_input_text(user, "Choose ability name", "Ability name", "Generic Ability") + add_ability.name = tgui_input_text(user, "Choose ability name", "Ability name", "Generic Ability", max_length = MAX_NAME_LEN) add_ability.create_sequence_actions() else add_ability = new ability_type(ability_recipient) diff --git a/code/modules/admin/outfit_editor.dm b/code/modules/admin/outfit_editor.dm index 67196c54bd4..a3bd433f52e 100644 --- a/code/modules/admin/outfit_editor.dm +++ b/code/modules/admin/outfit_editor.dm @@ -100,7 +100,7 @@ drip.vars[slot] = null if("rename") - var/newname = tgui_input_text(owner, "What do you want to name this outfit?", OUTFIT_EDITOR_NAME) + var/newname = tgui_input_text(owner, "What do you want to name this outfit?", OUTFIT_EDITOR_NAME, max_length = MAX_NAME_LEN) if(newname) drip.name = newname if("save") diff --git a/code/modules/admin/painting_manager.dm b/code/modules/admin/painting_manager.dm index 7a8bd7127a4..5ebcdef0059 100644 --- a/code/modules/admin/painting_manager.dm +++ b/code/modules/admin/painting_manager.dm @@ -55,7 +55,7 @@ ADMIN_VERB(painting_manager, R_ADMIN, "Paintings Manager", "View and redact pain if("rename") //Modify the metadata var/old_title = chosen_painting.title - var/new_title = tgui_input_text(user, "New painting title?", "Painting Rename", chosen_painting.title) + var/new_title = tgui_input_text(user, "New painting title?", "Painting Rename", chosen_painting.title, max_length = MAX_NAME_LEN) if(!new_title) return chosen_painting.title = new_title @@ -63,7 +63,7 @@ ADMIN_VERB(painting_manager, R_ADMIN, "Paintings Manager", "View and redact pain return TRUE if("rename_author") var/old_name = chosen_painting.creator_name - var/new_name = tgui_input_text(user, "New painting author name?", "Painting Rename", chosen_painting.creator_name) + var/new_name = tgui_input_text(user, "New painting author name?", "Painting Rename", chosen_painting.creator_name, max_length = MAX_NAME_LEN) if(!new_name) return chosen_painting.creator_name = new_name @@ -83,7 +83,7 @@ ADMIN_VERB(painting_manager, R_ADMIN, "Paintings Manager", "View and redact pain log_admin("[key_name(user)] has removed tag [params["tag"]] from persistent painting made by [chosen_painting.creator_ckey] with id [chosen_painting.md5].") return TRUE if("add_tag") - var/tag_name = tgui_input_text(user, "New tag name?", "Add Tag") + var/tag_name = tgui_input_text(user, "New tag name?", "Add Tag", max_length = MAX_NAME_LEN) if(!tag_name) return if(!chosen_painting.tags) diff --git a/code/modules/admin/sound_emitter.dm b/code/modules/admin/sound_emitter.dm index d697537c6df..c68baa32e4e 100644 --- a/code/modules/admin/sound_emitter.dm +++ b/code/modules/admin/sound_emitter.dm @@ -81,7 +81,7 @@ return var/mob/user = usr if(href_list["edit_label"]) - var/new_label = tgui_input_text(user, "Choose a new label", "Sound Emitter") + var/new_label = tgui_input_text(user, "Choose a new label", "Sound Emitter", max_length = MAX_NAME_LEN) if(!new_label) return maptext = MAPTEXT(new_label) diff --git a/code/modules/admin/verbs/admin_newscaster.dm b/code/modules/admin/verbs/admin_newscaster.dm index 4cb7b5c3344..b1be5560d69 100644 --- a/code/modules/admin/verbs/admin_newscaster.dm +++ b/code/modules/admin/verbs/admin_newscaster.dm @@ -234,14 +234,14 @@ ADMIN_VERB(access_news_network, R_ADMIN, "Access Newscaster Network", "Allows yo return TRUE if("setCriminalName") - var/temp_name = tgui_input_text(usr, "Write the Criminal's Name", "Warrent Alert Handler", "John Doe", MAX_NAME_LEN, multiline = FALSE) + var/temp_name = tgui_input_text(usr, "Write the Criminal's Name", "Warrent Alert Handler", "John Doe", max_length = MAX_NAME_LEN, multiline = FALSE) if(!temp_name) return TRUE criminal_name = temp_name return TRUE if("setCrimeData") - var/temp_desc = tgui_input_text(usr, "Write the Criminal's Crimes", "Warrent Alert Handler", "Unknown", MAX_BROADCAST_LEN, multiline = TRUE) + var/temp_desc = tgui_input_text(usr, "Write the Criminal's Crimes", "Warrent Alert Handler", "Unknown", max_length = MAX_BROADCAST_LEN, multiline = TRUE) if(!temp_desc) return TRUE crime_description = temp_desc @@ -339,7 +339,7 @@ ADMIN_VERB(access_news_network, R_ADMIN, "Access Newscaster Network", "Allows yo if(channel_name == potential_channel.channel_ID) current_channel = potential_channel break - var/temp_message = tgui_input_text(usr, "Write your Feed story", "Network Channel Handler", feed_channel_message, multiline = TRUE) + var/temp_message = tgui_input_text(usr, "Write your Feed story", "Network Channel Handler", feed_channel_message, max_length = MAX_BROADCAST_LEN, multiline = TRUE) if(length(temp_message) <= 1) return TRUE if(temp_message) diff --git a/code/modules/admin/verbs/adminevents.dm b/code/modules/admin/verbs/adminevents.dm index b46d1c4764d..c5c409b78b9 100644 --- a/code/modules/admin/verbs/adminevents.dm +++ b/code/modules/admin/verbs/adminevents.dm @@ -269,13 +269,21 @@ ADMIN_VERB(command_report_footnote, R_ADMIN, "Command Report Footnote", "Adds a var/datum/command_footnote/command_report_footnote = new /datum/command_footnote() GLOB.communications_controller.block_command_report += 1 //Add a blocking condition to the counter until the inputs are done. - command_report_footnote.message = tgui_input_text(user, "This message will be attached to the bottom of the roundstart threat report. Be sure to delay the roundstart report if you need extra time.", "P.S.") + command_report_footnote.message = tgui_input_text( + user, + "This message will be attached to the bottom of the roundstart threat report. Be sure to delay the roundstart report if you need extra time.", + "P.S.", + ) if(!command_report_footnote.message) GLOB.communications_controller.block_command_report -= 1 qdel(command_report_footnote) return - command_report_footnote.signature = tgui_input_text(user, "Whose signature will appear on this footnote?", "Also sign here, here, aaand here.") + command_report_footnote.signature = tgui_input_text( + user, + "Whose signature will appear on this footnote?", + "Also sign here, here, aaand here.", + ) if(!command_report_footnote.signature) command_report_footnote.signature = "Classified" diff --git a/code/modules/admin/verbs/lawpanel.dm b/code/modules/admin/verbs/lawpanel.dm index f1daaf17576..6de3ff70182 100644 --- a/code/modules/admin/verbs/lawpanel.dm +++ b/code/modules/admin/verbs/lawpanel.dm @@ -24,7 +24,7 @@ ADMIN_VERB(law_panel, R_ADMIN, "Law Panel", "View the AI laws.", ADMIN_CATEGORY_ var/lawtype = tgui_input_list(user, "Select law type", "Law type", lawtypes) if(isnull(lawtype)) return FALSE - var/lawtext = tgui_input_text(user, "Input law text", "Law text") + var/lawtext = tgui_input_text(user, "Input law text", "Law text") // admin verb so no max length and also any user-level input is config based already so ehhhh if(!lawtext) return FALSE if(QDELETED(src) || QDELETED(borgo)) diff --git a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm index 5a8f699832e..ab1636b4ded 100644 --- a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm +++ b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm @@ -189,8 +189,12 @@ to_chat(user, span_warning("Your target is already under a mind-controlling influence!")) return - var/command = tgui_input_text(user, "Enter the command for your target to follow.\ - Uses Left: [target_gland.mind_control_uses], Duration: [DisplayTimeText(target_gland.mind_control_duration)]", "Enter command") + var/command = tgui_input_text( + user, + "Enter the command for your target to follow. Uses Left: [target_gland.mind_control_uses], Duration: [DisplayTimeText(target_gland.mind_control_duration)]", + "Enter command", + max_length = MAX_MESSAGE_LEN, + ) if(!command) return @@ -215,7 +219,7 @@ if(living_target.stat == DEAD) to_chat(user, span_warning("Your target is dead!")) return - var/message = tgui_input_text(user, "Message to send to your target's brain", "Enter message") + var/message = tgui_input_text(user, "Message to send to your target's brain", "Enter message", max_length = MAX_MESSAGE_LEN) if(!message) return if(QDELETED(living_target) || living_target.stat == DEAD) diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index 324c91ea3a5..c7a2fc3a110 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -175,6 +175,7 @@ if(isspaceturf(T) && !(locate(/obj/structure/lattice) in T) && prob(80)) make_blob = FALSE playsound(src.loc, 'sound/effects/splat.ogg', 50, TRUE) //Let's give some feedback that we DID try to spawn in space, since players are used to it + balloon_alert(controller, "failed to expand!") ConsumeTile() //hit the tile we're in, making sure there are no border objects blocking us if(!T.CanPass(src, get_dir(T, src))) //is the target turf impassable diff --git a/code/modules/antagonists/brainwashing/brainwashing.dm b/code/modules/antagonists/brainwashing/brainwashing.dm index 57707688f4d..5d5cca3cb6d 100644 --- a/code/modules/antagonists/brainwashing/brainwashing.dm +++ b/code/modules/antagonists/brainwashing/brainwashing.dm @@ -61,7 +61,7 @@ return var/list/objectives = list() do - var/objective = tgui_input_text(admin, "Add an objective", "Brainwashing") + var/objective = tgui_input_text(admin, "Add an objective", "Brainwashing", max_length = MAX_MESSAGE_LEN) if(objective) objectives += objective while(tgui_alert(admin, "Add another objective?", "More Brainwashing", list("Yes","No")) == "Yes") diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index 306d874a2a7..8eeea7bc4e3 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -59,7 +59,7 @@ /// The voice we're mimicing via the changeling voice ability. var/mimicing = "" /// Whether we can currently respec in the cellular emporium. - var/can_respec = FALSE + var/can_respec = 0 /// The currently active changeling sting. var/datum/action/changeling/sting/chosen_sting @@ -442,7 +442,7 @@ to_chat(owner.current, span_notice("We have removed our evolutions from this form, and are now ready to readapt.")) remove_changeling_powers() - can_respec = FALSE + can_respec -= 1 SSblackbox.record_feedback("tally", "changeling_power_purchase", 1, "Readapt") log_changeling_power("[key_name(owner)] readapted their changeling powers") return TRUE diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm index d5ee0c2fc87..71b1509ec81 100644 --- a/code/modules/antagonists/changeling/powers/absorb.dm +++ b/code/modules/antagonists/changeling/powers/absorb.dm @@ -63,7 +63,7 @@ changeling.adjust_chemicals(10) if (true_absorbtion) - changeling.can_respec = TRUE + changeling.can_respec++ if(target.stat != DEAD) target.investigate_log("has died from being changeling absorbed.", INVESTIGATE_DEATHS) diff --git a/code/modules/antagonists/changeling/powers/headcrab.dm b/code/modules/antagonists/changeling/powers/headcrab.dm index 0b7668260d7..c4f2376f755 100644 --- a/code/modules/antagonists/changeling/powers/headcrab.dm +++ b/code/modules/antagonists/changeling/powers/headcrab.dm @@ -4,7 +4,7 @@ helptext = "We will be placed in control of a small, fragile creature. We may attack a corpse like this to plant an egg which will slowly mature into a new form for us." button_icon_state = "last_resort" chemical_cost = 20 - dna_cost = 1 + dna_cost = CHANGELING_POWER_INNATE req_human = TRUE req_stat = DEAD ignores_fakedeath = TRUE diff --git a/code/modules/antagonists/cult/cult_comms.dm b/code/modules/antagonists/cult/cult_comms.dm index 3d567799650..45c3aee6955 100644 --- a/code/modules/antagonists/cult/cult_comms.dm +++ b/code/modules/antagonists/cult/cult_comms.dm @@ -27,7 +27,7 @@ return ..() /datum/action/innate/cult/comm/Activate() - var/input = tgui_input_text(usr, "Message to tell to the other acolytes", "Voice of Blood") + var/input = tgui_input_text(usr, "Message to tell to the other acolytes", "Voice of Blood", max_length = MAX_MESSAGE_LEN) if(!input || !IsAvailable(feedback = TRUE)) return diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index 1d33826546c..100d61329bb 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -234,9 +234,11 @@ var/mob/living/carbon/human/H = owner.current if(!istype(H)) return + if(isplasmaman(H)) - H.equipOutfit(plasmaman_outfit) - H.open_internals(H.get_item_for_held_index(2)) + H.dna.species.outfit_important_for_life = plasmaman_outfit + + H.dna.species.give_important_for_life(H) H.equipOutfit(outfit) if(isplasmaman(H)) diff --git a/code/modules/antagonists/heretic/items/heretic_necks.dm b/code/modules/antagonists/heretic/items/heretic_necks.dm index 5c73c22a4e7..a738b4aae47 100644 --- a/code/modules/antagonists/heretic/items/heretic_necks.dm +++ b/code/modules/antagonists/heretic/items/heretic_necks.dm @@ -1,5 +1,5 @@ /obj/item/clothing/neck/heretic_focus - name = "Amber Focus" + name = "amber focus" desc = "An amber focusing glass that provides a link to the world beyond. The necklace seems to twitch, but only when you look at it from the corner of your eye." icon_state = "eldritch_necklace" w_class = WEIGHT_CLASS_SMALL @@ -10,7 +10,7 @@ AddElement(/datum/element/heretic_focus) /obj/item/clothing/neck/heretic_focus/crimson_medallion - name = "Crimson Medallion" + name = "crimson medallion" desc = "A blood-red focusing glass that provides a link to the world beyond, and worse. Its eye is constantly twitching and gazing in all directions. It almost seems to be silently screaming..." icon_state = "crimson_medallion" /// The aura healing component. Used to delete it when taken off. @@ -105,7 +105,7 @@ . += span_red("You can also squeeze it to recover a large amount of health quickly, at a cost...") /obj/item/clothing/neck/eldritch_amulet - name = "Warm Eldritch Medallion" + name = "warm eldritch medallion" desc = "A strange medallion. Peering through the crystalline surface, the world around you melts away. You see your own beating heart, and the pulsing of a thousand others." icon = 'icons/obj/antags/eldritch.dmi' icon_state = "eye_medalion" @@ -134,7 +134,7 @@ user.update_sight() /obj/item/clothing/neck/eldritch_amulet/piercing - name = "Piercing Eldritch Medallion" + name = "piercing eldritch medallion" desc = "A strange medallion. Peering through the crystalline surface, the light refracts into new and terrifying spectrums of color. You see yourself, reflected off cascading mirrors, warped into impossible shapes." heretic_only_trait = TRAIT_XRAY_VISION @@ -149,7 +149,7 @@ // The amulet conversion tool used by moon heretics /obj/item/clothing/neck/heretic_focus/moon_amulet - name = "Moonlight Amulet" + name = "moonlight amulet" desc = "A piece of the mind, the soul and the moon. Gazing into it makes your head spin and hear whispers of laughter and joy." icon = 'icons/obj/antags/eldritch.dmi' icon_state = "moon_amulette" diff --git a/code/modules/antagonists/malf_ai/malf_ai.dm b/code/modules/antagonists/malf_ai/malf_ai.dm index a0aa4456a04..b3760d447ef 100644 --- a/code/modules/antagonists/malf_ai/malf_ai.dm +++ b/code/modules/antagonists/malf_ai/malf_ai.dm @@ -212,7 +212,7 @@ "name" = category, "items" = (category == malf_ai.malf_picker.selected_cat ? list() : null)) for(var/module in malf_ai.malf_picker.possible_modules[category]) - var/datum/ai_module/mod = malf_ai.malf_picker.possible_modules[category][module] + var/datum/ai_module/malf/mod = malf_ai.malf_picker.possible_modules[category][module] cat["items"] += list(list( "name" = mod.name, "cost" = mod.cost, @@ -237,7 +237,7 @@ for(var/category in malf_ai.malf_picker.possible_modules) buyable_items += malf_ai.malf_picker.possible_modules[category] for(var/key in buyable_items) - var/datum/ai_module/valid_mod = buyable_items[key] + var/datum/ai_module/malf/valid_mod = buyable_items[key] if(valid_mod.name == item_name) malf_ai.malf_picker.purchase_module(malf_ai, valid_mod) return TRUE diff --git a/code/modules/antagonists/malf_ai/malf_ai_modules.dm b/code/modules/antagonists/malf_ai/malf_ai_modules.dm index 866c16186fe..cd5a1f9474c 100644 --- a/code/modules/antagonists/malf_ai/malf_ai_modules.dm +++ b/code/modules/antagonists/malf_ai/malf_ai_modules.dm @@ -52,7 +52,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( /obj/machinery/computer/gateway_control, ))) -GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) +GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) /// The malf AI action subtype. All malf actions are subtypes of this. /datum/action/innate/ai @@ -137,19 +137,19 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) return /// Modules causing destruction -/datum/ai_module/destructive +/datum/ai_module/malf/destructive category = "Destructive Modules" /// Modules with stealthy and utility uses -/datum/ai_module/utility +/datum/ai_module/malf/utility category = "Utility Modules" /// Modules that are improving AI abilities and assets -/datum/ai_module/upgrade +/datum/ai_module/malf/upgrade category = "Upgrade Modules" /// Doomsday Device: Starts the self-destruct timer. It can only be stopped by killing the AI completely. -/datum/ai_module/destructive/nuke_station +/datum/ai_module/malf/destructive/nuke_station name = "Doomsday Device" description = "Activate a weapon that will disintegrate all organic life on the station after a 450 second delay. \ Can only be used while on the station, will fail if your core is moved off station or destroyed. \ @@ -372,7 +372,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) return TRUE /// Hostile Station Lockdown: Locks, bolts, and electrifies every airlock on the station. After 90 seconds, the doors reset. -/datum/ai_module/destructive/lockdown +/datum/ai_module/malf/destructive/lockdown name = "Hostile Station Lockdown" description = "Overload the airlock, blast door and fire control networks, locking them down. \ Caution! This command also electrifies all airlocks. The networks will automatically reset after 90 seconds, briefly \ @@ -424,7 +424,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) CHECK_TICK /// Override Machine: Allows the AI to override a machine, animating it into an angry, living version of itself. -/datum/ai_module/destructive/override_machine +/datum/ai_module/malf/destructive/override_machine name = "Machine Override" description = "Overrides a machine's programming, causing it to rise up and attack everyone except other machines. Four uses per purchase." cost = 30 @@ -481,7 +481,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) new /mob/living/simple_animal/hostile/mimic/copy/machine(get_turf(to_animate), to_animate, caller, TRUE) /// Destroy RCDs: Detonates all non-cyborg RCDs on the station. -/datum/ai_module/destructive/destroy_rcd +/datum/ai_module/malf/destructive/destroy_rcd name = "Destroy RCDs" description = "Send a specialised pulse to detonate all hand-held and exosuit Rapid Construction Devices on the station." cost = 25 @@ -511,7 +511,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) owner.playsound_local(owner, 'sound/machines/twobeep.ogg', 50, 0) /// Overload Machine: Allows the AI to overload a machine, detonating it after a delay. Two uses per purchase. -/datum/ai_module/destructive/overload_machine +/datum/ai_module/malf/destructive/overload_machine name = "Machine Overload" description = "Overheats an electrical machine, causing a small explosion and destroying it. Two uses per purchase." cost = 20 @@ -572,7 +572,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) return TRUE /// Blackout: Overloads a random number of lights across the station. Three uses. -/datum/ai_module/destructive/blackout +/datum/ai_module/malf/destructive/blackout name = "Blackout" description = "Attempts to overload the lighting circuits on the station, destroying some bulbs. Three uses per purchase." cost = 15 @@ -610,7 +610,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) build_all_button_icons() /// HIGH IMPACT HONKING -/datum/ai_module/destructive/megahonk +/datum/ai_module/malf/destructive/megahonk name = "Percussive Intercomm Interference" description = "Emit a debilitatingly percussive auditory blast through the station intercoms. Does not overpower hearing protection. Two uses per purchase." cost = 20 @@ -646,7 +646,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) to_chat(honk_victim, span_clown("HOOOOONK!")) /// Robotic Factory: Places a large machine that converts humans that go through it into cyborgs. Unlocking this ability removes shunting. -/datum/ai_module/utility/place_cyborg_transformer +/datum/ai_module/malf/utility/place_cyborg_transformer name = "Robotic Factory (Removes Shunting)" description = "Build a machine anywhere, using expensive nanomachines, that will slowly create loyal cyborgs for you." // NOVA EDIT CHANGE - ORIGINAL: description = "Build a machine anywhere, using expensive nanomachines, that can convert a living human into a loyal cyborg slave when placed inside." cost = 100 @@ -721,7 +721,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) return success /// Air Alarm Safety Override: Unlocks the ability to enable dangerous modes on all air alarms. -/datum/ai_module/utility/break_air_alarms +/datum/ai_module/malf/utility/break_air_alarms name = "Air Alarm Safety Override" description = "Gives you the ability to disable safeties on all air alarms. This will allow you to use extremely dangerous environmental modes. \ Anyone can check the air alarm's interface and may be tipped off by their nonfunctionality." @@ -747,7 +747,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) owner.playsound_local(owner, 'sound/machines/terminal_off.ogg', 50, 0) /// Thermal Sensor Override: Unlocks the ability to disable all fire alarms from doing their job. -/datum/ai_module/utility/break_fire_alarms +/datum/ai_module/malf/utility/break_fire_alarms name = "Thermal Sensor Override" description = "Gives you the ability to override the thermal sensors on all fire alarms. \ This will remove their ability to scan for fire and thus their ability to alert." @@ -778,7 +778,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) owner.playsound_local(owner, 'sound/machines/terminal_off.ogg', 50, 0) /// Disable Emergency Lights -/datum/ai_module/utility/emergency_lights +/datum/ai_module/malf/utility/emergency_lights name = "Disable Emergency Lights" description = "Cuts emergency lights across the entire station. If power is lost to light fixtures, \ they will not attempt to fall back on emergency power reserves." @@ -805,7 +805,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) owner.playsound_local(owner, 'sound/effects/light_flicker.ogg', 50, FALSE) /// Reactivate Camera Network: Reactivates up to 30 cameras across the station. -/datum/ai_module/utility/reactivate_cameras +/datum/ai_module/malf/utility/reactivate_cameras name = "Reactivate Camera Network" description = "Runs a network-wide diagnostic on the camera network, resetting focus and re-routing power to failed cameras. \ Can be used to repair up to 30 cameras." @@ -846,7 +846,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) build_all_button_icons() /// Upgrade Camera Network: EMP-proofs all cameras, in addition to giving them X-ray vision. -/datum/ai_module/upgrade/upgrade_cameras +/datum/ai_module/malf/upgrade/upgrade_cameras name = "Upgrade Camera Network" description = "Install broad-spectrum scanning and electrical redundancy firmware to the camera network, enabling EMP-proofing and light-amplified X-ray vision. Upgrade is done immediately upon purchase." //I <3 pointless technobabble //This used to have motion sensing as well, but testing quickly revealed that giving it to the whole cameranet is PURE HORROR. @@ -855,7 +855,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) unlock_text = span_notice("OTA firmware distribution complete! Cameras upgraded: CAMSUPGRADED. Light amplification system online.") unlock_sound = 'sound/items/rped.ogg' -/datum/ai_module/upgrade/upgrade_cameras/upgrade(mob/living/silicon/ai/AI) +/datum/ai_module/malf/upgrade/upgrade_cameras/upgrade(mob/living/silicon/ai/AI) // Sets up nightvision RegisterSignal(AI, COMSIG_MOB_UPDATE_SIGHT, PROC_REF(on_update_sight)) AI.update_sight() @@ -878,13 +878,13 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) upgraded_cameras++ unlock_text = replacetext(unlock_text, "CAMSUPGRADED", "[upgraded_cameras]") //This works, since unlock text is called after upgrade() -/datum/ai_module/upgrade/upgrade_cameras/proc/on_update_sight(mob/source) +/datum/ai_module/malf/upgrade/upgrade_cameras/proc/on_update_sight(mob/source) SIGNAL_HANDLER // Dim blue, pretty source.lighting_color_cutoffs = blend_cutoff_colors(source.lighting_color_cutoffs, list(5, 25, 35)) /// AI Turret Upgrade: Increases the health and damage of all turrets. -/datum/ai_module/upgrade/upgrade_turrets +/datum/ai_module/malf/upgrade/upgrade_turrets name = "AI Turret Upgrade" description = "Improves the power and health of all AI turrets. This effect is permanent. Upgrade is done immediately upon purchase." cost = 30 @@ -892,7 +892,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) unlock_text = span_notice("You establish a power diversion to your turrets, upgrading their health and damage.") unlock_sound = 'sound/items/rped.ogg' -/datum/ai_module/upgrade/upgrade_turrets/upgrade(mob/living/silicon/ai/AI) +/datum/ai_module/malf/upgrade/upgrade_turrets/upgrade(mob/living/silicon/ai/AI) for(var/obj/machinery/porta_turret/ai/turret as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/porta_turret/ai)) turret.AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) turret.max_integrity = 200 @@ -901,7 +901,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) turret.lethal_projectile_sound = 'sound/weapons/lasercannonfire.ogg' /// Enhanced Surveillance: Enables AI to hear conversations going on near its active vision. -/datum/ai_module/upgrade/eavesdrop +/datum/ai_module/malf/upgrade/eavesdrop name = "Enhanced Surveillance" description = "Via a combination of hidden microphones and lip reading software, \ you are able to use your cameras to listen in on conversations. Upgrade is done immediately upon purchase." @@ -910,12 +910,12 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) unlock_text = span_notice("OTA firmware distribution complete! Cameras upgraded: Enhanced surveillance package online.") unlock_sound = 'sound/items/rped.ogg' -/datum/ai_module/upgrade/eavesdrop/upgrade(mob/living/silicon/ai/AI) +/datum/ai_module/malf/upgrade/eavesdrop/upgrade(mob/living/silicon/ai/AI) if(AI.eyeobj) AI.eyeobj.relay_speech = TRUE /// Unlock Mech Domination: Unlocks the ability to dominate mechs. Big shocker, right? -/datum/ai_module/upgrade/mecha_domination +/datum/ai_module/malf/upgrade/mecha_domination name = "Unlock Mech Domination" description = "Allows you to hack into a mech's onboard computer, shunting all processes into it and ejecting any occupants. \ Do not allow the mech to leave the station's vicinity or allow it to be destroyed. \ @@ -926,10 +926,10 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) Loss of signal will result in total system lockout.") unlock_sound = 'sound/mecha/nominal.ogg' -/datum/ai_module/upgrade/mecha_domination/upgrade(mob/living/silicon/ai/AI) +/datum/ai_module/malf/upgrade/mecha_domination/upgrade(mob/living/silicon/ai/AI) AI.can_dominate_mechs = TRUE //Yep. This is all it does. Honk! -/datum/ai_module/upgrade/voice_changer +/datum/ai_module/malf/upgrade/voice_changer name = "Voice Changer" description = "Allows you to change the AI's voice. Upgrade is active immediately upon purchase." cost = 40 @@ -1067,7 +1067,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) if("name") say_name = strip_html(params["name"], MAX_NAME_LEN) -/datum/ai_module/utility/emag +/datum/ai_module/malf/utility/emag name = "Targeted Safeties Override" description = "Allows you to disable the safeties of any machinery on the station, provided you can access it." cost = 20 @@ -1161,7 +1161,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) return TRUE -/datum/ai_module/utility/core_tilt +/datum/ai_module/malf/utility/core_tilt name = "Rolling Servos" description = "Allows you to slowly roll around, crushing anything in your way with your bulk." cost = 10 @@ -1260,7 +1260,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) stack_trace("non-standard dir entered to get_rotation_from_dir. (got: [dir])") return 0 -/datum/ai_module/utility/remote_vendor_tilt +/datum/ai_module/malf/utility/remote_vendor_tilt name = "Remote vendor tilting" description = "Lets you remotely tip vendors over in any direction." cost = 15 diff --git a/code/modules/antagonists/nukeop/datums/operative_leader.dm b/code/modules/antagonists/nukeop/datums/operative_leader.dm index c2995e55753..1af9f1d28c4 100644 --- a/code/modules/antagonists/nukeop/datums/operative_leader.dm +++ b/code/modules/antagonists/nukeop/datums/operative_leader.dm @@ -44,7 +44,13 @@ /datum/antagonist/nukeop/leader/proc/ask_name() var/randomname = pick(GLOB.last_names) - var/newname = tgui_input_text(owner.current, "You are the nuclear operative [title]. Please choose a last name for your family.", "Name change", randomname, MAX_NAME_LEN) + var/newname = tgui_input_text( + owner.current, + "You are the nuclear operative [title]. Please choose a last name for your family.", + "Name change", + randomname, + max_length = MAX_NAME_LEN, + ) if (!newname) newname = randomname else diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm index 0160fbd8914..b59d984238e 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm @@ -43,7 +43,7 @@ GLOBAL_LIST_EMPTY(jam_on_wardec) if(custom_threat == "Yes") declaring_war = TRUE - war_declaration = tgui_input_text(user, "Insert your custom declaration", "Declaration", multiline = TRUE, encode = FALSE) + war_declaration = tgui_input_text(user, "Insert your custom declaration", "Declaration", max_length = MAX_MESSAGE_LEN, multiline = TRUE, encode = FALSE) declaring_war = FALSE if(!check_allowed(user) || !war_declaration) @@ -63,7 +63,7 @@ GLOBAL_LIST_EMPTY(jam_on_wardec) var/custom_threat = tgui_alert(usr, "Do you want to customize the declaration?", "Customize?", list("Yes", "No")) if(custom_threat == "Yes") - war_declaration = tgui_input_text(usr, "Insert your custom declaration", "Declaration", multiline = TRUE, encode = FALSE) + war_declaration = tgui_input_text(usr, "Insert your custom declaration", "Declaration", max_length = MAX_MESSAGE_LEN, multiline = TRUE, encode = FALSE) if(!war_declaration) tgui_alert(usr, "Invalid war declaration.", "Poor Choice of Words") diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/summons.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/summons.dm index fe5f69fd9fa..b8bf9a8e3cf 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook_entries/summons.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/summons.dm @@ -74,7 +74,7 @@ cost = 4 /datum/spellbook_entry/summon/curse_of_madness/buy_spell(mob/living/carbon/human/user, obj/item/spellbook/book, log_buy = TRUE) - var/message = tgui_input_text(user, "Whisper a secret truth to drive your victims to madness", "Whispers of Madness") + var/message = tgui_input_text(user, "Whisper a secret truth to drive your victims to madness", "Whispers of Madness", max_length = MAX_MESSAGE_LEN) if(!message || QDELETED(user) || QDELETED(book) || !can_buy(user, book)) return FALSE curse_of_madness(user, message) diff --git a/code/modules/art/paintings.dm b/code/modules/art/paintings.dm index 2e330d31185..1c11e0f8086 100644 --- a/code/modules/art/paintings.dm +++ b/code/modules/art/paintings.dm @@ -417,7 +417,7 @@ /obj/item/canvas/proc/try_rename(mob/user) if(painting_metadata.loaded_from_json) // No renaming old paintings return TRUE - var/new_name = tgui_input_text(user, "What do you want to name the painting?", "Title Your Masterpiece", null, MAX_NAME_LEN) + var/new_name = tgui_input_text(user, "What do you want to name the painting?", "Title Your Masterpiece", max_length = MAX_NAME_LEN) new_name = reject_bad_name(new_name, allow_numbers = TRUE, ascii_only = FALSE, strict = TRUE, cap_after_symbols = FALSE) if(isnull(new_name)) return FALSE diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index 11983bda883..edd8e30eaf8 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -223,16 +223,17 @@ if(!user.transferItemToLoc(new_tank, src)) return FALSE - investigate_log("had its internal [holding] swapped with [new_tank] by [key_name(user)].", INVESTIGATE_ATMOS) - to_chat(user, span_notice("[holding ? "In one smooth motion you pop [holding] out of [src]'s connector and replace it with [new_tank]" : "You insert [new_tank] into [src]"].")) - if(holding && new_tank)//for when we are actually switching tanks + investigate_log("had its internal [holding] swapped with [new_tank] by [key_name(user)].", INVESTIGATE_ATMOS) + to_chat(user, span_notice("In one smooth motion you pop [holding] out of [src]'s connector and replace it with [new_tank].")) user.put_in_hands(holding) UnregisterSignal(holding, COMSIG_QDELETING) holding = new_tank RegisterSignal(holding, COMSIG_QDELETING, PROC_REF(unregister_holding)) playsound(src, list(insert_sound,remove_sound), sound_vol) else if(holding)//we remove a tank + investigate_log("had its internal [holding] removed by [key_name(user)].", INVESTIGATE_ATMOS) + to_chat(user, span_notice("You remove [holding] from [src].")) if(Adjacent(user)) user.put_in_hands(holding) else @@ -241,6 +242,8 @@ UnregisterSignal(holding, COMSIG_QDELETING) holding = null else if(new_tank)//we insert the tank + investigate_log("had [new_tank] inserted into it by [key_name(user)].", INVESTIGATE_ATMOS) + to_chat(user, span_notice("You insert [new_tank] into [src].")) holding = new_tank playsound(src, insert_sound, sound_vol) RegisterSignal(holding, COMSIG_QDELETING, PROC_REF(unregister_holding)) diff --git a/code/modules/autowiki/pages/fishing.dm b/code/modules/autowiki/pages/fishing.dm index b71b8dab330..eab26bd6c6c 100644 --- a/code/modules/autowiki/pages/fishing.dm +++ b/code/modules/autowiki/pages/fishing.dm @@ -46,19 +46,25 @@ if(length(extra_info)) description += "
[extra_info.Join(extra_info,"
")]" - output += "\n\n" + include_template("Autowiki/FishEntry", list( + var/list/output_list = list( "name" = full_capitalize(escape_value(fish::name)), "icon" = filename, "description" = description, "size_weight" = "[fish::average_size]cm / [fish::average_weight]g", "fluid" = escape_value(fish::required_fluid_type), - "temperature" = "[fish::required_temperature_min] - [fish::required_temperature_max] K", + "temperature" = "Doesn't matter", "stable_population" = fish::stable_population, "traits" = generate_traits(properties[FISH_PROPERTIES_TRAITS]), "favorite_baits" = generate_baits(properties[FISH_PROPERTIES_FAV_BAIT]), "disliked_baits" = generate_baits(properties[FISH_PROPERTIES_BAD_BAIT], TRUE), "beauty_score" = properties[FISH_PROPERTIES_BEAUTY_SCORE], - )) + ) + var/not_infinity = fish::required_temperature_max < INFINITY + if(fish::required_temperature_min > 0 || not_infinity) + var/max_temp = not_infinity ? fish::required_temperature_max : "∞" + output_list["temperature"] = "[fish::required_temperature_min] - [max_temp] K" + + output += "\n\n" + include_template("Autowiki/FishEntry", output_list) return output diff --git a/code/modules/bitrunning/spawners.dm b/code/modules/bitrunning/spawners.dm index 4b5f79a43b1..26288d54a15 100644 --- a/code/modules/bitrunning/spawners.dm +++ b/code/modules/bitrunning/spawners.dm @@ -1,5 +1,5 @@ /obj/effect/mob_spawn/ghost_role/human/virtual_domain - outfit = /datum/outfit/pirate + outfit = /datum/outfit/virtual_pirate prompt_name = "a virtual domain debug entity" flavour_text = "You probably shouldn't be seeing this, contact a coder!" you_are_text = "You are NOT supposed to be here. How did you let this happen?" @@ -32,6 +32,16 @@ you_are_text = "You are a virtual pirate. Yarrr!" flavour_text = " There's a LANDLUBBER after yer booty. Stop them!" +/datum/outfit/virtual_pirate + name = "Virtual Pirate" + id = /obj/item/card/id/advanced + id_trim = /datum/id_trim/pirate + uniform = /obj/item/clothing/under/costume/pirate + suit = /obj/item/clothing/suit/costume/pirate/armored + glasses = /obj/item/clothing/glasses/eyepatch + head = /obj/item/clothing/head/costume/pirate/bandana/armored + shoes = /obj/item/clothing/shoes/pirate/armored + /obj/effect/mob_spawn/ghost_role/human/virtual_domain/pirate/special(mob/living/spawned_mob, mob/mob_possessor) . = ..() diff --git a/code/modules/bitrunning/virtual_domain/domains/meta_central.dm b/code/modules/bitrunning/virtual_domain/domains/meta_central.dm index 0bc35ceaf40..dc1029353c3 100644 --- a/code/modules/bitrunning/virtual_domain/domains/meta_central.dm +++ b/code/modules/bitrunning/virtual_domain/domains/meta_central.dm @@ -10,3 +10,4 @@ map_name = "meta_central" mob_modules = list(/datum/modular_mob_segment/revolutionary) reward_points = BITRUNNER_REWARD_LOW + announce_to_ghosts = TRUE diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm index cd867615876..179ca701adc 100644 --- a/code/modules/cargo/centcom_podlauncher.dm +++ b/code/modules/cargo/centcom_podlauncher.dm @@ -343,10 +343,10 @@ ADMIN_VERB(centcom_podlauncher, R_ADMIN, "Config/Launch Supplypod", "Configure a temp_pod.adminNamed = FALSE temp_pod.setStyle(temp_pod.style) //This resets the name of the pod based on its current style (see supplypod/setStyle() proc) return - var/nameInput= tgui_input_text(usr, "Enter a custom name", "Custom name", temp_pod.style::name, MAX_NAME_LEN) //Gather input for name and desc + var/nameInput= tgui_input_text(usr, "Enter a custom name", "Custom name", temp_pod.style::name, max_length = MAX_NAME_LEN) if (isnull(nameInput)) return - var/descInput = tgui_input_text(usr, "Enter a custom desc", "Custom description", temp_pod.style::desc) + var/descInput = tgui_input_text(usr, "Enter a custom desc", "Custom description", temp_pod.style::desc, max_length = MAX_DESC_LEN) if (isnull(descInput)) return temp_pod.name = nameInput diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm index 0a2dcfec4b0..4070301bfbe 100644 --- a/code/modules/cargo/expressconsole.dm +++ b/code/modules/cargo/expressconsole.dm @@ -1,3 +1,6 @@ +#define EXPRESS_EMAG_DISCOUNT 0.72 +#define BEACON_PRINT_COOLDOWN 10 SECONDS + /obj/machinery/computer/cargo/express name = "express supply console" desc = "This console allows the user to purchase a package \ @@ -11,18 +14,28 @@ interface_type = "CargoExpress" var/message - var/printed_beacons = 0 //number of beacons printed. Used to determine beacon names. var/list/meme_pack_data - var/obj/item/supplypod_beacon/beacon //the linked supplypod beacon - var/area/landingzone = /area/station/cargo/storage //where we droppin boys - var/podType = /obj/structure/closet/supplypod - var/cooldown = 0 //cooldown to prevent printing supplypod beacon spam - var/locked = TRUE //is the console locked? unlock with ID - var/usingBeacon = FALSE //is the console in beacon mode? exists to let beacon know when a pod may come in + /// The linked supplypod beacon + var/obj/item/supplypod_beacon/beacon + /// Where we droppin boys + var/area/landingzone = /area/station/cargo/storage + var/pod_type = /obj/structure/closet/supplypod + /// If this console is locked and needs to be unlocked with an ID + var/locked = TRUE + /// Is the console in beacon mode? Exists to let beacon know when a pod may come in + var/using_beacon = FALSE + /// Number of beacons printed. Used to determine beacon names. + var/static/printed_beacons = 0 + /// Cooldown to prevent beacon spam + COOLDOWN_DECLARE(beacon_print_cooldown) /obj/machinery/computer/cargo/express/Initialize(mapload) . = ..() packin_up() + landingzone = GLOB.areas_by_type[landingzone] + if (isnull(landingzone)) + WARNING("[src] couldnt find a Quartermaster/Storage (aka cargobay) area on the station, and as such it has set the supplypod landingzone to the area it resides in.") + landingzone = get_area(src) /obj/machinery/computer/cargo/express/on_construction(mob/user) . = ..() @@ -33,24 +46,33 @@ beacon.unlink_console() return ..() -/obj/machinery/computer/cargo/express/attackby(obj/item/W, mob/living/user, params) - if(W.GetID() && allowed(user)) +/obj/machinery/computer/cargo/express/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if (tool.GetID() && allowed(user)) locked = !locked to_chat(user, span_notice("You [locked ? "lock" : "unlock"] the interface.")) - return - else if(istype(W, /obj/item/disk/cargo/bluespace_pod)) - podType = /obj/structure/closet/supplypod/bluespacepod//doesnt effect circuit board, making reversal possible + return ITEM_INTERACT_SUCCESS + + if (istype(tool, /obj/item/disk/cargo/bluespace_pod)) + if (pod_type == /obj/structure/closet/supplypod/bluespacepod) + balloon_alert(user, "already upgraded!") + return ITEM_INTERACT_FAILURE + if(!user.temporarilyRemoveItemFromInventory(tool)) + return ITEM_INTERACT_FAILURE + pod_type = /obj/structure/closet/supplypod/bluespacepod // doesnt affect our circuit board, making reversal possible to_chat(user, span_notice("You insert the disk into [src], allowing for advanced supply delivery vehicles.")) - qdel(W) - return TRUE - else if(istype(W, /obj/item/supplypod_beacon)) - var/obj/item/supplypod_beacon/sb = W - if (sb.express_console != src) - sb.link_console(src, user) - return TRUE - else - to_chat(user, span_alert("[src] is already linked to [sb].")) - ..() + tool.forceMove(src) + return ITEM_INTERACT_SUCCESS + + if(istype(tool, /obj/item/supplypod_beacon)) + var/obj/item/supplypod_beacon/beacon = tool + if (beacon.express_console != src) + beacon.link_console(src, user) + return ITEM_INTERACT_SUCCESS + + to_chat(user, span_alert("[src] is already linked to [beacon].")) + return ITEM_INTERACT_FAILURE + + return NONE /obj/machinery/computer/cargo/express/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) @@ -68,8 +90,11 @@ packin_up() return TRUE -/obj/machinery/computer/cargo/express/proc/packin_up() // oh shit, I'm sorry +/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 @@ -83,7 +108,7 @@ continue // i'd be right happy to meme_pack_data[P.group]["packs"] += list(list( "name" = P.name, - "cost" = P.get_cost(), + "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. )) @@ -91,26 +116,26 @@ /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? var/list/data = list() - var/datum/bank_account/D = SSeconomy.get_dep_account(cargo_account) - if(D) - data["points"] = D.account_balance + var/datum/bank_account/account = SSeconomy.get_dep_account(cargo_account) + if(account) + data["points"] = account.account_balance data["locked"] = locked//swipe an ID to unlock data["siliconUser"] = HAS_SILICON_ACCESS(user) data["beaconzone"] = beacon ? get_area(beacon) : ""//where is the beacon located? outputs in the tgui - data["usingBeacon"] = usingBeacon //is the mode set to deliver to the beacon or the cargobay? - data["canBeacon"] = !usingBeacon || canBeacon //is the mode set to beacon delivery, and is the beacon in a valid location? - data["canBuyBeacon"] = cooldown <= 0 && D.account_balance >= BEACON_COST - data["beaconError"] = usingBeacon && !canBeacon ? "(BEACON ERROR)" : ""//changes button text to include an error alert if necessary + data["using_beacon"] = using_beacon //is the mode set to deliver to the beacon or the cargobay? + data["canBeacon"] = !using_beacon || canBeacon //is the mode set to beacon delivery, and is the beacon in a valid location? + data["canBuyBeacon"] = COOLDOWN_FINISHED(src, beacon_print_cooldown) && account.account_balance >= BEACON_COST + data["beaconError"] = using_beacon && !canBeacon ? "(BEACON ERROR)" : ""//changes button text to include an error alert if necessary data["hasBeacon"] = beacon != null//is there a linked beacon? data["beaconName"] = beacon ? beacon.name : "No Beacon Found" - data["printMsg"] = cooldown > 0 ? "Print Beacon for [BEACON_COST] credits ([cooldown])" : "Print Beacon for [BEACON_COST] credits"//buttontext for printing beacons + data["printMsg"] = COOLDOWN_FINISHED(src, beacon_print_cooldown) ? "Print Beacon for [BEACON_COST] credits" : "Print Beacon for [BEACON_COST] credits ([COOLDOWN_TIMELEFT(src, beacon_print_cooldown)])" //buttontext for printing beacons data["supplies"] = list() message = "Sales are near-instantaneous - please choose carefully." if(SSshuttle.supply_blocked) message = blockade_warning - if(usingBeacon && !beacon) + if(using_beacon && !beacon) message = "BEACON ERROR: BEACON MISSING"//beacon was destroyed - else if (usingBeacon && !canBeacon) + else if (using_beacon && !canBeacon) message = "BEACON ERROR: MUST BE EXPOSED"//beacon's loc/user's loc must be a turf if(obj_flags & EMAGGED) message = "(&!#@ERROR: R0UTING_#PRO7O&OL MALF(*CT#ON. $UG%ESTE@ ACT#0N: !^/PULS3-%E)ET CIR*)ITB%ARD." @@ -119,10 +144,11 @@ packin_up() stack_trace("There was no pack data for [src]") data["supplies"] = meme_pack_data - if (cooldown > 0)//cooldown used for printing beacons - cooldown-- return data +/obj/machinery/computer/cargo/express/proc/get_discount() + return (obj_flags & EMAGGED) ? EXPRESS_EMAG_DISCOUNT : 1 + /obj/machinery/computer/cargo/express/ui_act(action, params, datum/tgui/ui) . = ..() if(.) @@ -131,23 +157,24 @@ var/mob/user = ui.user switch(action) if("LZCargo") - usingBeacon = FALSE + using_beacon = FALSE if (beacon) beacon.update_status(SP_UNREADY) //ready light on beacon will turn off if("LZBeacon") - usingBeacon = TRUE + using_beacon = TRUE if (beacon) beacon.update_status(SP_READY) //turns on the beacon's ready light if("printBeacon") - var/datum/bank_account/D = SSeconomy.get_dep_account(cargo_account) - if(D) - if(D.adjust_money(-BEACON_COST)) - cooldown = 10//a ~ten second cooldown for printing beacons to prevent spam - var/obj/item/supplypod_beacon/C = new /obj/item/supplypod_beacon(drop_location()) - C.link_console(src, user)//rather than in beacon's Initialize(), we can assign the computer to the beacon by reusing this proc) - printed_beacons++//printed_beacons starts at 0, so the first one out will be called beacon # 1 - beacon.name = "Supply Pod Beacon #[printed_beacons]" + var/datum/bank_account/account = SSeconomy.get_dep_account(cargo_account) + if(isnull(account) || !account.adjust_money(-BEACON_COST)) + return + // a ~ten second cooldown for printing beacons to prevent spam + COOLDOWN_START(src, beacon_print_cooldown, BEACON_PRINT_COOLDOWN) + var/obj/item/supplypod_beacon/new_beacon = new /obj/item/supplypod_beacon(drop_location()) + new_beacon.link_console(src, user) //rather than in beacon's Initialize(), we can assign the computer to the beacon by reusing this proc) + printed_beacons++ //printed_beacons starts at 0, so the first one out will be called beacon # 1 + beacon.name = "Supply Pod Beacon #[printed_beacons]" if("add")//Generate Supply Order first if(TIMER_COOLDOWN_RUNNING(src, COOLDOWN_EXPRESSPOD_CONSOLE)) @@ -169,60 +196,62 @@ name = user.real_name rank = "Silicon" var/reason = "" + var/datum/supply_order/order = new(pack, name, rank, ckey, reason) + var/datum/bank_account/account = SSeconomy.get_dep_account(cargo_account) + if (isnull(account) && order.pack.get_cost() > 0) + return + + if (obj_flags & EMAGGED) + landingzone = GLOB.areas_by_type[pick(GLOB.the_station_areas)] + var/list/empty_turfs - var/datum/supply_order/SO = new(pack, name, rank, ckey, reason) - var/points_to_check - var/datum/bank_account/D = SSeconomy.get_dep_account(cargo_account) - if(D) - points_to_check = D.account_balance - if(!(obj_flags & EMAGGED)) - if(SO.pack.get_cost() <= points_to_check) - var/LZ - if (istype(beacon) && usingBeacon)//prioritize beacons over landing in cargobay - LZ = get_turf(beacon) - beacon.update_status(SP_LAUNCH) - else if (!usingBeacon)//find a suitable supplypod landing zone in cargobay - landingzone = GLOB.areas_by_type[/area/station/cargo/storage] - if (!landingzone) - WARNING("[src] couldnt find a Quartermaster/Storage (aka cargobay) area on the station, and as such it has set the supplypod landingzone to the area it resides in.") - landingzone = get_area(src) - for(var/turf/open/floor/T in landingzone.get_turfs_from_all_zlevels())//uses default landing zone - if(T.is_blocked_turf()) - continue - LAZYADD(empty_turfs, T) - CHECK_TICK - if(empty_turfs?.len) - LZ = pick(empty_turfs) - if (SO.pack.get_cost() <= points_to_check && LZ)//we need to call the cost check again because of the CHECK_TICK call - TIMER_COOLDOWN_START(src, COOLDOWN_EXPRESSPOD_CONSOLE, 5 SECONDS) - D.adjust_money(-SO.pack.get_cost()) - if(pack.special_pod) - new /obj/effect/pod_landingzone(LZ, pack.special_pod, SO) - else - new /obj/effect/pod_landingzone(LZ, podType, SO) - . = TRUE - update_appearance() + if (!istype(beacon) || !using_beacon || (obj_flags & EMAGGED)) + empty_turfs = list() + for(var/turf/open/floor/open_turf in landingzone.get_turfs_from_all_zlevels()) + if(!open_turf.is_blocked_turf()) + empty_turfs += open_turf + + if (!length(empty_turfs)) + return + + if (obj_flags & EMAGGED) + if (account.account_balance < order.pack.get_cost() * -get_discount()) + return + + TIMER_COOLDOWN_START(src, COOLDOWN_EXPRESSPOD_CONSOLE, 10 SECONDS) + order.generateRequisition(get_turf(src)) + for(var/i in 1 to MAX_EMAG_ROCKETS) + if (!account.adjust_money(order.pack.get_cost() * -get_discount())) + break + + var/turf/landing_turf = pick(empty_turfs) + empty_turfs -= landing_turf + if(pack.special_pod) + new /obj/effect/pod_landingzone(landing_turf, pack.special_pod, order) + else + new /obj/effect/pod_landingzone(landing_turf, pod_type, order) + + update_appearance() + return TRUE + + var/turf/landing_turf + if (istype(beacon) && using_beacon) + landing_turf = get_turf(beacon) + beacon.update_status(SP_LAUNCH) else - if(SO.pack.get_cost() * (0.72*MAX_EMAG_ROCKETS) <= points_to_check) // bulk discount :^) - landingzone = GLOB.areas_by_type[pick(GLOB.the_station_areas)] //override default landing zone - for(var/turf/open/floor/T in landingzone.get_turfs_from_all_zlevels()) - if(T.is_blocked_turf()) - continue - LAZYADD(empty_turfs, T) - CHECK_TICK - if(empty_turfs?.len) - TIMER_COOLDOWN_START(src, COOLDOWN_EXPRESSPOD_CONSOLE, 10 SECONDS) - D.adjust_money(-(SO.pack.get_cost() * (0.72*MAX_EMAG_ROCKETS))) - - SO.generateRequisition(get_turf(src)) - for(var/i in 1 to MAX_EMAG_ROCKETS) - var/LZ = pick(empty_turfs) - LAZYREMOVE(empty_turfs, LZ) - if(pack.special_pod) - new /obj/effect/pod_landingzone(LZ, pack.special_pod, SO) - else - new /obj/effect/pod_landingzone(LZ, podType, SO) - . = TRUE - update_appearance() - CHECK_TICK + landing_turf = pick(empty_turfs) + + if (!account.adjust_money(-order.pack.get_cost() * get_discount())) + return + + TIMER_COOLDOWN_START(src, COOLDOWN_EXPRESSPOD_CONSOLE, 5 SECONDS) + if(pack.special_pod) + new /obj/effect/pod_landingzone(landing_turf, pack.special_pod, order) + else + new /obj/effect/pod_landingzone(landing_turf, pod_type, order) + + update_appearance() + return TRUE +#undef EXPRESS_EMAG_DISCOUNT +#undef BEACON_PRINT_COOLDOWN diff --git a/code/modules/cargo/orderconsole.dm b/code/modules/cargo/orderconsole.dm index 345c897b9b9..ae7b9dbfd96 100644 --- a/code/modules/cargo/orderconsole.dm +++ b/code/modules/cargo/orderconsole.dm @@ -235,7 +235,7 @@ var/reason = "" if(requestonly && !self_paid) working_list = SSshuttle.request_list - reason = tgui_input_text(user, "Reason", name) + reason = tgui_input_text(user, "Reason", name, max_length = MAX_MESSAGE_LEN) if(isnull(reason)) return diff --git a/code/modules/cargo/packs/engineering.dm b/code/modules/cargo/packs/engineering.dm index e8255a58e64..dd376ec2017 100644 --- a/code/modules/cargo/packs/engineering.dm +++ b/code/modules/cargo/packs/engineering.dm @@ -199,7 +199,6 @@ desc = "Protect the very existence of this station with these Anti-Meteor defenses. \ Contains three Shield Generator Satellites." cost = CARGO_CRATE_VALUE * 6 - special = TRUE access_view = ACCESS_COMMAND contains = list(/obj/machinery/satellite/meteor_shield = 3) crate_name= "shield sat crate" @@ -209,7 +208,6 @@ name = "Shield System Control Board" desc = "A control system for the Shield Generator Satellite system." cost = CARGO_CRATE_VALUE * 10 - special = TRUE access_view = ACCESS_COMMAND contains = list(/obj/item/circuitboard/computer/sat_control) crate_name= "shield control board crate" diff --git a/code/modules/cargo/packs/organic.dm b/code/modules/cargo/packs/organic.dm index f405fc7de3a..a47c92fabc4 100644 --- a/code/modules/cargo/packs/organic.dm +++ b/code/modules/cargo/packs/organic.dm @@ -101,8 +101,8 @@ /datum/supply_pack/organic/randomized/chef/fruits name = "Fruit Crate" - desc = "Rich of vitamins. Contains a lime, orange, watermelon, apple, \ - berries and a lime." + desc = "Rich in vitamins. Contains a lime, orange, watermelon, apple, \ + berries and a lemon." cost = CARGO_CRATE_VALUE * 3 contains = list(/obj/item/food/grown/citrus/lime, /obj/item/food/grown/citrus/orange, diff --git a/code/modules/cargo/supplypod_beacon.dm b/code/modules/cargo/supplypod_beacon.dm index 2d9a618bb41..895d12da99a 100644 --- a/code/modules/cargo/supplypod_beacon.dm +++ b/code/modules/cargo/supplypod_beacon.dm @@ -73,7 +73,9 @@ /obj/item/supplypod_beacon/wrench_act(mob/living/user, obj/item/tool) . = ..() - default_unfasten_wrench(user, tool) + if (default_unfasten_wrench(user, tool) == SUCCESSFUL_UNFASTEN) + pixel_x = 0 + pixel_y = 0 return ITEM_INTERACT_SUCCESS /obj/item/supplypod_beacon/proc/unlink_console() @@ -91,7 +93,7 @@ express_console = C//set the linked console var to the console express_console.beacon = src//out with the old in with the news update_status(SP_LINKED) - if (express_console.usingBeacon) + if (express_console.using_beacon) update_status(SP_READY) to_chat(user, span_notice("[src] linked to [C].")) diff --git a/code/modules/clothing/head/cakehat.dm b/code/modules/clothing/head/cakehat.dm index 1fc0fa0b05b..d8dc0c0e7a0 100644 --- a/code/modules/clothing/head/cakehat.dm +++ b/code/modules/clothing/head/cakehat.dm @@ -57,7 +57,7 @@ /obj/item/clothing/head/utility/hardhat/cakehat/energycake name = "energy cake" desc = "You put the energy sword on your cake. Brilliant." - icon_state = "hardhat0_energycake" + icon_state = "hardhat1_energycake" inhand_icon_state = "hardhat0_energycake" hat_type = "energycake" hitsound = 'sound/weapons/tap.ogg' @@ -68,6 +68,13 @@ light_range = 3 //ditto heat = 0 +/obj/item/clothing/head/utility/hardhat/cakehat/energycake/Initialize(mapload) + . = ..() + //the compiled icon state is how it appears when it's on. + //That's how we want it to show on orbies (little virtual PDA pets). + //However we should reset their appearance on runtime. + update_appearance(UPDATE_ICON_STATE) + /obj/item/clothing/head/utility/hardhat/cakehat/energycake/turn_on(mob/living/user) playsound(src, 'sound/weapons/saberon.ogg', 5, TRUE) to_chat(user, span_warning("You turn on \the [src].")) diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index b19e1e0f238..8faaf58b53e 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -70,6 +70,7 @@ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT flags_cover = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF visor_flags_inv = HIDEEYES|HIDEFACE + slowdown = 0 /datum/armor/space_plasmaman bio = 100 diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 3c8d8e8a97f..c7301dff983 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -586,6 +586,10 @@ armor_type = /datum/armor/vest_durathread dog_fashion = null +/obj/item/clothing/suit/armor/vest/durathread/Initialize(mapload) + . = ..() + allowed |= /obj/item/clothing/suit/apron::allowed + /datum/armor/vest_durathread melee = 20 bullet = 10 diff --git a/code/modules/clothing/suits/wintercoats.dm b/code/modules/clothing/suits/wintercoats.dm index b51729f75cb..111b1c4cf5f 100644 --- a/code/modules/clothing/suits/wintercoats.dm +++ b/code/modules/clothing/suits/wintercoats.dm @@ -221,16 +221,7 @@ desc = "A green and blue winter coat. The zipper tab looks like the flower from a member of Rosa Hesperrhodos, a pretty pink-and-white rose. The colours absolutely clash." icon_state = "coathydro" inhand_icon_state = "coathydro" - allowed = list( - /obj/item/cultivator, - /obj/item/hatchet, - /obj/item/plant_analyzer, - /obj/item/reagent_containers/spray/plantbgone, - /obj/item/reagent_containers/cup/bottle, - /obj/item/reagent_containers/spray/pestspray, - /obj/item/seeds, - /obj/item/storage/bag/plants, - ) + allowed = /obj/item/clothing/suit/apron::allowed hoodtype = /obj/item/clothing/head/hooded/winterhood/hydro /obj/item/clothing/head/hooded/winterhood/hydro diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index aa29fa47a20..b590984cbc7 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -240,21 +240,7 @@ icon_state = "durathread-fake" inhand_icon_state = null armor_type = /datum/armor/robe_durathread - allowed = list( - /obj/item/cultivator, - /obj/item/geneshears, - /obj/item/graft, - /obj/item/hatchet, - /obj/item/plant_analyzer, - /obj/item/reagent_containers/cup/beaker, - /obj/item/reagent_containers/cup/bottle, - /obj/item/reagent_containers/cup/tube, - /obj/item/reagent_containers/spray/pestspray, - /obj/item/reagent_containers/spray/plantbgone, - /obj/item/secateurs, - /obj/item/seeds, - /obj/item/storage/bag/plants, - ) + allowed = /obj/item/clothing/suit/apron::allowed fishing_modifier = -4 /datum/armor/robe_durathread diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 8e286918812..3cfc438c7fb 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -237,6 +237,29 @@ update_wearer_status() +/** + * Called by medical scanners a simple summary of the status + * + * Arguments: + * * silent: If TRUE, will return blank if everything is fine + */ +/obj/item/clothing/under/proc/get_sensor_text(silent = TRUE) + if(has_sensor == BROKEN_SENSORS) + return "Non-Functional: Repair with cable coil" + + if(silent) + return "" + + switch(has_sensor) + if(NO_SENSORS) + return "Not Present" + + if(LOCKED_SENSORS) + return "Functional, Locked" + + if(HAS_SENSORS) + return "Functional" + // End suit sensor handling /// Attach the passed accessory to the clothing item diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm index cc66e9d406a..b43196c1628 100644 --- a/code/modules/clothing/under/accessories/badges.dm +++ b/code/modules/clothing/under/accessories/badges.dm @@ -264,9 +264,9 @@ /obj/item/clothing/accessory/press_badge/attack_self(mob/user, modifiers) . = ..() if(!journalist_name) - journalist_name = tgui_input_text(user, "What is your name?", "Journalist Name", "[user.name]", MAX_NAME_LEN) + journalist_name = tgui_input_text(user, "What is your name?", "Journalist Name", "[user.name]", max_length = MAX_NAME_LEN) if(!press_name) - press_name = tgui_input_text(user, "For what organization you work?", "Press Name", "Nanotrasen", MAX_CHARTER_LEN) + press_name = tgui_input_text(user, "For what organization you work?", "Press Name", "Nanotrasen", max_length = MAX_CHARTER_LEN) /obj/item/clothing/accessory/press_badge/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) . = ..() diff --git a/code/modules/clothing/under/accessories/tribal.dm b/code/modules/clothing/under/accessories/tribal.dm index ad55b26fa89..0d5786a20e9 100644 --- a/code/modules/clothing/under/accessories/tribal.dm +++ b/code/modules/clothing/under/accessories/tribal.dm @@ -12,7 +12,7 @@ attachment_slot = GROIN /obj/item/clothing/accessory/skilt - name = "Sinew Skirt" + name = "sinew skirt" desc = "For the last time. IT'S A KILT not a skirt." icon_state = "skilt" minimize_when_attached = FALSE diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm index c7f5e6c18af..d95b8924708 100644 --- a/code/modules/clothing/under/costume.dm +++ b/code/modules/clothing/under/costume.dm @@ -420,7 +420,7 @@ can_adjust = FALSE /obj/item/clothing/under/costume/gi - name = "Martial Artist Gi" + name = "martial gi" desc = "Assistant, nukie, whatever. You can beat anyone; it's called hard work!" icon_state = "martial_arts_gi" greyscale_config = /datum/greyscale_config/gi @@ -437,13 +437,13 @@ update_icon(UPDATE_OVERLAYS) /obj/item/clothing/under/costume/gi/goku - name = "Sacred Gi" + name = "sacred gi" desc = "Created by a man who touched the hearts and lives of many." icon_state = "martial_arts_gi_goku" greyscale_colors = "#f89925#3e6dd7" /obj/item/clothing/under/costume/traditional - name = "Traditional Suit" + name = "traditional suit" desc = "A full, vibrantly coloured suit. Likely with traditional purposes. Maybe the colours represent a familly, clan, or rank, who knows." icon_state = "tradition" inhand_icon_state = null @@ -451,7 +451,7 @@ can_adjust = FALSE /obj/item/clothing/under/costume/loincloth - name = "Leather Loincloth" + name = "leather loincloth" desc = "Just a piece of leather to cover private areas. Itchy to the touch. Whoever made this must have been desperate, or savage." icon_state = "loincloth" inhand_icon_state = null diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index ad5e3976206..588dd8efc2a 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -15,7 +15,7 @@ icon_state = "blue_pyjamas" /obj/item/clothing/under/misc/patriotsuit - name = "Patriotic Suit" + name = "patriotic suit" desc = "Motorcycle not included." icon_state = "ek" inhand_icon_state = null diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm index d31e204333b..40faba92825 100644 --- a/code/modules/economy/account.dm +++ b/code/modules/economy/account.dm @@ -44,6 +44,7 @@ payday_modifier = modifier add_to_accounts = player_account setup_unique_account_id() + update_account_job_lists(job) pay_token = uppertext("[copytext(newname, 1, 2)][copytext(newname, -1)]-[random_capital_letter()]-[rand(1111,9999)]") /datum/bank_account/Destroy() @@ -71,11 +72,23 @@ if(SSeconomy.bank_accounts_by_id["[account_id]"]) stack_trace("Unable to find a unique account ID, substituting currently existing account of id [account_id].") SSeconomy.bank_accounts_by_id["[account_id]"] = src - if(account_job) - LAZYADD(SSeconomy.bank_accounts_by_job[account_job.type], src) + +/** + * Proc places this account into the right place in the `SSeconomy.bank_accounts_by_job` list, if needed. + * If an old job is given, it removes it from its previous place first. + */ +/datum/bank_account/proc/update_account_job_lists(datum/job/new_job, datum/job/old_job) + if(!add_to_accounts) + return + + if(old_job) + SSeconomy.bank_accounts_by_job[old_job.type] -= src + if(new_job) // NOVA EDIT CHANGE - early fix + LAZYADD(SSeconomy.bank_accounts_by_job[new_job.type], src) // NOVA EDIT CHANGE - early fix /datum/bank_account/vv_edit_var(var_name, var_value) // just so you don't have to do it manually var/old_id = account_id + var/datum/job/old_job = account_job var/old_balance = account_balance . = ..() switch(var_name) @@ -83,11 +96,15 @@ if(add_to_accounts) SSeconomy.bank_accounts_by_id -= "[old_id]" setup_unique_account_id() + if(NAMEOF(src, account_job)) + update_account_job_lists(account_job, old_job) if(NAMEOF(src, add_to_accounts)) if(add_to_accounts) setup_unique_account_id() + update_account_job_lists(account_job) else SSeconomy.bank_accounts_by_id -= "[account_id]" + SSeconomy.bank_accounts_by_job[account_job.type] -= src if(NAMEOF(src, account_balance)) add_log_to_history(var_value - old_balance, "Nanotrasen: Moderator Action") diff --git a/code/modules/emote_panel/emote_panel.dm b/code/modules/emote_panel/emote_panel.dm index 72caf05e92b..d064161c232 100644 --- a/code/modules/emote_panel/emote_panel.dm +++ b/code/modules/emote_panel/emote_panel.dm @@ -42,7 +42,7 @@ var/datum/emote/emote = GLOB.emote_list[emote_key][1] var/emote_param if(emote.message_param && use_params) - emote_param = tgui_input_text(ui.user, "Add params to the emote...", emote.message_param) + emote_param = tgui_input_text(ui.user, "Add params to the emote...", emote.message_param, max_length = MAX_MESSAGE_LEN) ui.user.emote(emote_key, message = emote_param, intentional = TRUE) /datum/emote_panel/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/events/holiday/easter.dm b/code/modules/events/holiday/easter.dm index 40c7fda57c3..d10fb681cc5 100644 --- a/code/modules/events/holiday/easter.dm +++ b/code/modules/events/holiday/easter.dm @@ -66,7 +66,7 @@ //Bunny Suit /obj/item/clothing/head/costume/bunnyhead - name = "Easter Bunny Head" + name = "Easter Bunny head" icon_state = "bunnyhead" inhand_icon_state = null desc = "Considerably more cute than 'Frank'." @@ -75,7 +75,7 @@ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT /obj/item/clothing/suit/costume/bunnysuit - name = "Easter Bunny Suit" + name = "easter bunny suit" desc = "Hop Hop Hop!" icon_state = "bunnysuit" icon = 'icons/obj/clothing/suits/costume.dmi' @@ -88,7 +88,7 @@ //Bunny bag! /obj/item/storage/backpack/satchel/bunnysatchel - name = "Easter Bunny Satchel" + name = "easter bunny satchel" desc = "Good for your eyes." icon_state = "satchel_carrot" inhand_icon_state = null diff --git a/code/modules/fishing/aquarium/aquarium.dm b/code/modules/fishing/aquarium/aquarium.dm index a3becfe6718..fe8ba7586dd 100644 --- a/code/modules/fishing/aquarium/aquarium.dm +++ b/code/modules/fishing/aquarium/aquarium.dm @@ -35,7 +35,7 @@ var/last_feeding /// Can fish reproduce in this quarium. - var/allow_breeding = TRUE + var/reproduction_and_growth = TRUE //This is the area where fish can swim var/aquarium_zone_min_px = 2 @@ -309,7 +309,7 @@ . = ..() .["fluidType"] = fluid_type .["temperature"] = fluid_temp - .["allowBreeding"] = allow_breeding + .["allowBreeding"] = reproduction_and_growth .["fishData"] = list() .["feedingInterval"] = feeding_interval / (1 MINUTES) .["propData"] = list() @@ -356,8 +356,8 @@ fluid_type = params["fluid"] SEND_SIGNAL(src, COMSIG_AQUARIUM_FLUID_CHANGED, fluid_type) . = TRUE - if("allow_breeding") - allow_breeding = !allow_breeding + if("reproduction_and_growth") + reproduction_and_growth = !reproduction_and_growth . = TRUE if("feeding_interval") feeding_interval = params["feeding_interval"] MINUTES diff --git a/code/modules/fishing/aquarium/fish_analyzer.dm b/code/modules/fishing/aquarium/fish_analyzer.dm index c899c0c3abc..905d3549128 100644 --- a/code/modules/fishing/aquarium/fish_analyzer.dm +++ b/code/modules/fishing/aquarium/fish_analyzer.dm @@ -128,7 +128,7 @@ "fish_food_color" = fishie.food::color, "fish_min_temp" = fishie.required_temperature_min, "fish_max_temp" = fishie.required_temperature_max, - "fish_hunger" = HAS_TRAIT(fishie, TRAIT_FISH_NO_HUNGER) ? 0 : PERCENT(min((world.time - fishie.last_feeding) / fishie.feeding_frequency, 1)), + "fish_hunger" = HAS_TRAIT(fishie, TRAIT_FISH_NO_HUNGER) ? 0 : 1 - fishie.get_hunger(), "fish_fluid_compatible" = aquarium ? compatible_fluid_type(fishie.required_fluid_type, aquarium.fluid_type) : null, "fish_fluid_type" = fishie.required_fluid_type, "fish_breed_timer" = round(max(fishie.breeding_wait - world.time, 0) / 10), diff --git a/code/modules/fishing/fish/_fish.dm b/code/modules/fishing/fish/_fish.dm index 494d74c5ef7..8e5052ce96e 100644 --- a/code/modules/fishing/fish/_fish.dm +++ b/code/modules/fishing/fish/_fish.dm @@ -52,7 +52,7 @@ var/datum/reagent/food = /datum/reagent/consumable/nutriment /// How often the fish needs to be fed var/feeding_frequency = 5 MINUTES - /// Time of last feedeing + /// Time of last the fish was fed var/last_feeding /// Fish status @@ -81,6 +81,8 @@ var/breeding_timeout = 2 MINUTES /// If set, the fish can also breed with these fishes types var/list/compatible_types + /// If set, when procreating these are the types of fish that will be generate instead of 'type' + var/list/spawn_types /// A list of possible evolutions. If set, offsprings may be of a different, new fish type if conditions are met. var/list/evolution_types @@ -114,11 +116,15 @@ var/size /// Average size for this fish type in centimeters. Will be used as gaussian distribution with 20% deviation for fishing, bought fish are always standard size var/average_size = 50 + /// The maximum size this fish can reach, calculated the first time update_size_and_weight() is called. + var/maximum_size /// Weight in grams. Null until update_size_and_weight is called. Grind results scale with it. Don't think too hard how a trout could fit in a blender. var/weight /// Average weight for this fish type in grams var/average_weight = 1000 + /// The maximum weight this fish can reach, calculated the first time update_size_and_weight() is called. + var/maximum_weight ///The general deviation from the average weight and size this fish has in the wild var/weight_size_deviation = 0.2 @@ -152,6 +158,7 @@ /obj/item/fish/Initialize(mapload, apply_qualities = TRUE) . = ..() + base_icon_state = icon_state //It's important that we register the signals before the component is attached. RegisterSignal(src, COMSIG_AQUARIUM_CONTENT_DO_ANIMATION, PROC_REF(update_aquarium_animation)) RegisterSignal(src, AQUARIUM_CONTENT_RANDOMIZE_POSITION, PROC_REF(randomize_aquarium_position)) @@ -253,20 +260,21 @@ //Remove the blood from the reagents holder and reward the player with some extra nutriment added to the fish. var/datum/reagent/consumable/nutriment/protein/protein = reagents.has_reagent(/datum/reagent/consumable/nutriment/protein, check_subtypes = TRUE) var/datum/reagent/blood/blood = reagents.has_reagent(/datum/reagent/blood) - var/old_blood_volume = blood?.volume + var/old_blood_volume = blood ? blood.volume : 0 //we can't use the ?. operator since the above proc doesn't return null but 0 reagents.del_reagent(/datum/reagent/blood) ///Make space for the additional nutriment - var/volume_mult = 1 - if(bites_amount) - var/initial_bites_left = weight / FISH_WEIGHT_BITE_DIVISOR - var/bites_left = initial_bites_left - bites_amount - volume_mult = initial_bites_left / bites_left - adjust_reagents_capacity((protein?.volume - old_blood_volume) * volume_mult) - - ///Add the extra nutriment - if(protein) - reagents.multiply_single_reagent(/datum/reagent/consumable/nutriment/protein, 2) + if(blood || protein) + var/volume_mult = 1 + var/protein_volume = protein ? protein.volume : 0 + if(bites_amount) + var/initial_bites_left = weight / FISH_WEIGHT_BITE_DIVISOR + var/bites_left = initial_bites_left - bites_amount + volume_mult = initial_bites_left / bites_left + adjust_reagents_capacity((protein_volume - old_blood_volume) * volume_mult) + ///Add the extra nutriment + if(protein) + reagents.multiply_single_reagent(/datum/reagent/consumable/nutriment/protein, 2) var/datum/component/edible/edible = GetComponent(/datum/component/edible) edible.foodtypes &= ~(RAW|GORE) @@ -279,7 +287,8 @@ ///Just kill the fish, again, and perhaps remove the infective comp. /obj/item/fish/proc/on_fish_cooked_again(datum/source, cooking_time) SIGNAL_HANDLER - adjust_health(0) + if(!HAS_TRAIT(src, TRAIT_FISH_SURVIVE_COOKING)) + adjust_health(0) if(cooking_time >= FISH_SAFE_COOKING_DURATION) well_cooked() @@ -389,7 +398,7 @@ if(status == FISH_DEAD && icon_state_dead) icon_state = icon_state_dead else - icon_state = initial(icon_state) + icon_state = base_icon_state return ..() /obj/item/fish/attackby(obj/item/item, mob/living/user, params) @@ -412,7 +421,7 @@ . += span_deadsay("It's [HAS_MIND_TRAIT(user, TRAIT_NAIVE) ? "taking the big snooze" : "dead"].") else var/list/warnings = list() - if(is_hungry()) + if(is_starving()) warnings += "starving" if(!HAS_TRAIT(src, TRAIT_FISH_STASIS) && !proper_environment()) warnings += "drowning" @@ -445,7 +454,8 @@ remove_fillet_type() if(size > FISH_SIZE_TWO_HANDS_REQUIRED) qdel(GetComponent(/datum/component/two_handed)) - + else + maximum_size = min(new_size * 2, average_size * MAX_FISH_DEVIATION_COEFF) size = new_size var/init_icon_state = initial(inhand_icon_state) @@ -481,7 +491,7 @@ add_fillet_type() - var/make_edible = TRUE + var/make_edible = !weight if(weight) for(var/reagent_type in grind_results) grind_results[reagent_type] /= max(FLOOR(weight/FISH_GRIND_RESULTS_WEIGHT_DIVISOR, 0.1), 0.1) @@ -500,7 +510,8 @@ else reagents.multiply_reagents(new_weight_ratio) adjust_reagents_capacity(volume_diff) - make_edible = FALSE + else + maximum_weight = min(new_weight * 2, new_weight * MAX_FISH_DEVIATION_COEFF) weight = new_weight @@ -537,6 +548,14 @@ AddElement(/datum/element/processable, TOOL_KNIFE, fillet_type, amount, time, screentip_verb = "Cut") return amount //checked by a unit test +/** + * Weight, unlike size, is a bit more exponential, but the world isn't perfect, so isn't my code. + * Anyway, this returns a gross estimate of the "rank" of "category" for our fish weight, based on how + * weight generaly scales up (250, 500, 1000, 2000, 4000 etc...) + */ +/obj/item/fish/proc/get_weight_rank() + return max(round(1 + log(2, weight/FISH_WEIGHT_FORCE_DIVISOR), 1), 1) + ///Reset weapon-related variables of this items and recalculates those values based on the fish weight and size. /obj/item/fish/proc/update_fish_force() if(force >= 15 && hitsound == SFX_ALT_FISH_SLAP) @@ -556,7 +575,7 @@ bare_wound_bonus = initial(bare_wound_bonus) toolspeed = initial(toolspeed) - var/weight_rank = max(round(1 + log(2, weight/FISH_WEIGHT_FORCE_DIVISOR), 1), 1) + var/weight_rank = get_weight_rank() throw_range -= weight_rank get_force_rank() @@ -569,7 +588,6 @@ SEND_SIGNAL(src, COMSIG_FISH_FORCE_UPDATED, weight_rank, bonus_malus) - if(material_flags & MATERIAL_EFFECTS) //struck by metal gen or something. for(var/current_material in custom_materials) var/datum/material/material = GET_MATERIAL_REF(current_material) @@ -620,7 +638,7 @@ fish_traits = fixed_traits?.Copy() || list() var/list/same_traits = x_traits & y_traits - var/list/all_traits = (x_traits|y_traits)-removed_traits + var/list/all_traits = (y_traits ? (x_traits|y_traits) : x_traits) - removed_traits /// a list of incompatible traits that'll be filled as it goes on. Don't let any such trait pass onto the fish. var/list/incompatible_traits = list() @@ -649,6 +667,9 @@ if(trait_type in incompatible_traits) continue var/datum/fish_trait/trait = GLOB.fish_traits[trait_type] + if(isnull(trait)) + stack_trace("Couldn't find trait [trait_type || "null"] in the global fish traits list") + continue if(!isnull(trait.fish_whitelist) && !(type in trait.fish_whitelist)) continue if(length(fish_traits & trait.incompatible_traits)) @@ -684,6 +705,15 @@ if(status != FISH_DEAD) START_PROCESSING(SSobj, src) +///Returns the 0-1 value for hunger +/obj/item/fish/proc/get_hunger() + . = CLAMP01((world.time - last_feeding) / feeding_frequency) + if(HAS_TRAIT(src, TRAIT_FISH_NO_HUNGER)) + return min(., 0.2) + +/obj/item/fish/proc/is_starving() + return get_hunger() >= 1 + ///Feed the fishes with the contents of the fish feed /obj/item/fish/proc/feed(datum/reagents/fed_reagents) if(status != FISH_ALIVE) @@ -691,7 +721,7 @@ var/fed_reagent_type if(fed_reagents.remove_reagent(food, 0.1)) fed_reagent_type = food - last_feeding = world.time + sate_hunger() else var/datum/reagent/wrong_reagent = pick(fed_reagents.reagent_list) if(!wrong_reagent) @@ -700,6 +730,48 @@ fed_reagents.remove_reagent(fed_reagent_type, 0.1) SEND_SIGNAL(src, COMSIG_FISH_FED, fed_reagents, fed_reagent_type) +/** + * Base multiplier of the difference between current size and weight and their maximum value + * Used to calculate how much fish grow each time they're fed, alongside with the current hunger, + * and the current size and weight, meaning bigger fish naturally tend to grow way more slowly + * Growth peaks at 45% hunger but very rapidly wanes past that. + */ +#define FISH_GROWTH_MULT 0.38 +#define FISH_GROWTH_PEAK 0.45 +#define FISH_SIZE_WEIGHT_GROWTH_MALUS 0.5 + +///Proc that should be called when the fish is fed. By default, it grows the fish depending on various variables. +/obj/item/fish/proc/sate_hunger() + if(isaquarium(loc)) + var/obj/structure/aquarium/aquarium = loc + if(!aquarium.reproduction_and_growth) + return + var/hunger = get_hunger() + if(hunger < 0.05) //don't bother growing for very small amounts. + return + last_feeding = world.time + var/new_size = size + var/new_weight = weight + var/hunger_mult + if(hunger < FISH_GROWTH_PEAK) + hunger_mult = hunger * (1/FISH_GROWTH_PEAK) + else + hunger_mult = 1 - (hunger - FISH_GROWTH_PEAK) * 4 + if(hunger_mult <= 0) + return + if(size < maximum_size) + new_size += CEILING((maximum_size - size) * FISH_GROWTH_MULT / (w_class * FISH_SIZE_WEIGHT_GROWTH_MALUS) * hunger_mult, 1) + new_size = min(new_size, maximum_size) + if(weight < maximum_weight) + new_weight += CEILING((maximum_weight - weight) * FISH_GROWTH_MULT / (get_weight_rank() * FISH_SIZE_WEIGHT_GROWTH_MALUS) * hunger_mult, 1) + new_weight = min(new_weight, maximum_weight) + if(new_size != size || new_weight != weight) + update_size_and_weight(new_size, new_weight) + +#undef FISH_SIZE_WEIGHT_GROWTH_MALUS +#undef FISH_GROWTH_MULT +#undef FISH_GROWTH_PEAK + /obj/item/fish/proc/check_flopping() if(QDELETED(src)) //we don't care anymore return @@ -908,7 +980,7 @@ animate(visual, pixel_y = py_min, time = 1) //flop to bottom and end current animation. /// Checks if our current environment lets us live. -/obj/item/fish/proc/proper_environment() +/obj/item/fish/proc/proper_environment(temp_range_min = required_temperature_min, temp_range_max = required_temperature_max) var/obj/structure/aquarium/aquarium = loc if(istype(aquarium)) if(!compatible_fluid_type(required_fluid_type, aquarium.fluid_type)) @@ -932,14 +1004,11 @@ return FALSE return TRUE -/obj/item/fish/proc/is_hungry() - return !HAS_TRAIT(src, TRAIT_FISH_NO_HUNGER) && world.time - last_feeding >= feeding_frequency - /obj/item/fish/proc/process_health(seconds_per_tick) var/health_change_per_second = 0 if(!proper_environment()) health_change_per_second -= 3 //Dying here - if(is_hungry()) + if(is_starving()) health_change_per_second -= 0.5 //Starving else health_change_per_second += 0.5 //Slowly healing @@ -976,7 +1045,7 @@ return FALSE if(!being_targeted && length(aquarium.get_fishes()) >= AQUARIUM_MAX_BREEDING_POPULATION) return FALSE - return aquarium.allow_breeding && health >= initial(health) * 0.8 && stable_population >= 1 && world.time >= breeding_wait + return aquarium.reproduction_and_growth && health >= initial(health) * 0.8 && stable_population >= 1 && world.time >= breeding_wait /obj/item/fish/proc/try_to_reproduce() var/obj/structure/aquarium/aquarium = loc @@ -1034,25 +1103,28 @@ if(evolution.check_conditions(second_fish, src, aquarium)) possible_evolutions += evolution + var/list/types = spawn_types || list(type) if(length(possible_evolutions)) chosen_evolution = pick(possible_evolutions) chosen_type = chosen_evolution.new_fish_type else if(second_fish) + var/list/second_fish_types = second_fish.spawn_types || list(second_fish.type) var/recessive = HAS_TRAIT(src, TRAIT_FISH_RECESSIVE) var/recessive_partner = HAS_TRAIT(second_fish, TRAIT_FISH_RECESSIVE) if(length(aquarium.tracked_fish_by_type[type]) >= stable_population) if(recessive_partner && !recessive) return FALSE - chosen_type = second_fish.type + chosen_type = pick(second_fish_types) else if(recessive && !recessive_partner) - chosen_type = second_fish.type + chosen_type = pick(second_fish_types) else if(recessive_partner && !recessive) - chosen_type = type + chosen_type = pick(types) else - chosen_type = pick(second_fish.type, type) + var/list/picks = second_fish_types + types + chosen_type = pick(picks) else - chosen_type = type + chosen_type = pick(types) return create_offspring(chosen_type, second_fish, chosen_evolution) @@ -1061,13 +1133,16 @@ //Try to pass down compatible traits based on inheritability new_fish.inherit_traits(fish_traits, partner?.fish_traits, evolution?.new_traits, evolution?.removed_traits) + //We combine two methods for determining the size and weight of the offspring for less extreme results. if(partner) + var/ratio_size = new_fish.average_size * (((size / average_size) + (partner.size / partner.average_size)) / 2) var/mean_size = (size + partner.size)/2 + var/ratio_weight = new_fish.average_size * (((weight / average_weight) + (partner.weight / partner.average_weight)) / 2) var/mean_weight = (weight + partner.weight)/2 - new_fish.randomize_size_and_weight(mean_size, mean_weight, 0.3, TRUE) + new_fish.randomize_size_and_weight((mean_size + ratio_size) * 0.5, (mean_weight + ratio_weight) * 0.5, 0.3) partner.breeding_wait = world.time + breeding_timeout else //Make a close of this fish. - new_fish.update_size_and_weight(size, weight, TRUE) + new_fish.update_size_and_weight(size, weight) breeding_wait = world.time + breeding_timeout @@ -1137,7 +1212,7 @@ flop_animation() /obj/item/fish/proc/try_electrogenesis() - if(status == FISH_DEAD || is_hungry()) + if(status == FISH_DEAD || is_starving()) return COOLDOWN_START(src, electrogenesis_cooldown, ELECTROGENESIS_DURATION + ELECTROGENESIS_VARIANCE) var/fish_zap_range = 1 @@ -1161,7 +1236,7 @@ var/happiness_value = 0 if(fish_flags & FISH_FLAG_PETTED) happiness_value++ - if(HAS_TRAIT(src, TRAIT_FISH_NO_HUNGER) || min((world.time - last_feeding) / feeding_frequency, 1) < 0.5) + if(get_hunger() < 0.5) happiness_value++ var/obj/structure/aquarium/aquarium = loc if(!istype(aquarium)) diff --git a/code/modules/fishing/fish/fish_evolution.dm b/code/modules/fishing/fish/fish_evolution.dm index d7b8f744f0a..49eb3f46374 100644 --- a/code/modules/fishing/fish/fish_evolution.dm +++ b/code/modules/fishing/fish/fish_evolution.dm @@ -17,9 +17,9 @@ GLOBAL_LIST_EMPTY(fishes_by_fish_evolution) ///The obj/item/fish path of the new fish var/obj/item/fish/new_fish_type = /obj/item/fish ///The minimum required temperature for the evolved fish to spawn - var/required_temperature_min = MIN_AQUARIUM_TEMP + var/required_temperature_min = 0 ///The maximum required temperature for the evolved fish to spawn - var/required_temperature_max = MAX_AQUARIUM_TEMP + var/required_temperature_max = INFINITY ///A list of traits added to the new fish. These take priority over the parents' traits. var/list/new_traits ///If set, these traits will be removed from the new fish. @@ -40,24 +40,44 @@ GLOBAL_LIST_EMPTY(fishes_by_fish_evolution) name = full_capitalize(initial(new_fish_type.name)) /** * The main proc that checks whether this can happen or not. - * Please do keep in mind a mate may not be present for fish with the - * self-reproductive trait. + * Keep in mind the mate and aquarium arguments may be null if + * the fish is self-reproducing or this evolution is a result of a fish_growth component */ /datum/fish_evolution/proc/check_conditions(obj/item/fish/source, obj/item/fish/mate, obj/structure/aquarium/aquarium) SHOULD_CALL_PARENT(TRUE) - //chances are halved if only one parent has this evolution. - var/real_probability = (mate && (type in mate.evolution_types)) ? probability : probability/2 - if(!prob(real_probability)) - return FALSE - if(!ISINRANGE(aquarium.fluid_temp, required_temperature_min, required_temperature_max)) + if(aquarium) + //chances are halved if only one parent has this evolution. + var/real_probability = (mate && (type in mate.evolution_types)) ? probability : probability/2 + if(!prob(real_probability)) + return FALSE + if(!ISINRANGE(aquarium.fluid_temp, required_temperature_min, required_temperature_max)) + return FALSE + else if(!source.proper_environment(required_temperature_min, required_temperature_max)) return FALSE return TRUE +///This is called when the evolution is set as the result type of a fish_growth component +/datum/fish_evolution/proc/growth_checks(obj/item/fish/source, seconds_per_tick, growth) + SIGNAL_HANDLER + SHOULD_CALL_PARENT(TRUE) + if(source.health < initial(source.health) * 0.5) + return COMPONENT_DONT_GROW + if(source.get_hunger() >= 0.5) //too hungry to grow + return COMPONENT_DONT_GROW + var/obj/structure/aquarium/aquarium = source.loc + if(istype(aquarium) && !aquarium.reproduction_and_growth) //the aquarium has breeding disabled + return COMPONENT_DONT_GROW + else + aquarium = null + if(!check_conditions(source, aquarium = aquarium)) + return COMPONENT_DONT_GROW + ///Called by the fish analyzer right click function. Returns a text string used as tooltip. /datum/fish_evolution/proc/get_evolution_tooltip() . = "" - if(required_temperature_min != MIN_AQUARIUM_TEMP || required_temperature_max != MAX_AQUARIUM_TEMP) - . = "An aquarium temperature between [required_temperature_min] and [required_temperature_max] is required." + if(required_temperature_min > 0 || required_temperature_max < INFINITY) + var/max_temp = required_temperature_max < INFINITY ? " and [required_temperature_max]" : "" + . = "An aquarium temperature between [required_temperature_min][max_temp] is required." if(conditions_note) . += " [conditions_note]" return . @@ -134,3 +154,28 @@ GLOBAL_LIST_EMPTY(fishes_by_fish_evolution) if(source.size >= double_avg_size && source.weight >= double_avg_weight && (/datum/fish_trait/aggressive in source.fish_traits)) return ..() return FALSE + +/datum/fish_evolution/armored_pike + probability = 75 + new_fish_type = /obj/item/fish/pike/armored + conditions_note = "The fish needs to have the stinger trait" + +/datum/fish_evolution/armored_pike/check_conditions(obj/item/fish/source, obj/item/fish/mate, obj/structure/aquarium/aquarium) + if(HAS_TRAIT(source, TRAIT_FISH_STINGER)) + return ..() + return FALSE + +/datum/fish_evolution/fritterish + new_fish_type = /obj/item/fish/fryish/fritterish + conditions_note = "Fryish will grow into it over time." + +/datum/fish_evolution/nessie + name = "???" + new_fish_type = /obj/item/fish/fryish/nessie + conditions_note = "The final stage of fritterfish growth. It gotta be big!" + show_result_on_wiki = FALSE + +/datum/fish_evolution/nessiefish/check_conditions(obj/item/fish/source, obj/item/fish/mate, obj/structure/aquarium/aquarium) + if(source.size >= (/obj/item/fish/fryish/fritterish::average_size * 1.5) && source.size >= (/obj/item/fish/fryish/fritterish::average_weight * 1.5)) + return ..() + return FALSE diff --git a/code/modules/fishing/fish/fish_traits.dm b/code/modules/fishing/fish/fish_traits.dm index 8c96df6e4ac..8e67ba2c0a1 100644 --- a/code/modules/fishing/fish/fish_traits.dm +++ b/code/modules/fishing/fish/fish_traits.dm @@ -71,11 +71,11 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) /// Proc used by both the predator and necrophage traits. /datum/fish_trait/proc/eat_fish(obj/item/fish/predator, obj/item/fish/prey) - predator.last_feeding = world.time var/message = prey.status == FISH_DEAD ? "[src] eats [prey]'s carcass." : "[src] hunts down and eats [prey]." predator.loc.visible_message(span_warning(message)) SEND_SIGNAL(prey, COMSIG_FISH_EATEN_BY_OTHER_FISH, predator) qdel(prey) + predator.sate_hunger() /** @@ -141,8 +141,18 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) return if(HAS_TRAIT(rod.bait, TRAIT_OMNI_BAIT)) return - if(is_matching_bait(rod.bait, SSfishing.fish_properties[fish_type][FISH_PROPERTIES_FAV_BAIT])) //we like this bait anyway - return + + var/list/fav_baits = SSfishing.fish_properties[fish_type][FISH_PROPERTIES_FAV_BAIT] + for(var/identifier in fav_baits) + if(is_matching_bait(rod.bait, identifier)) //we like this bait anyway + return + + var/list/bad_baits = SSfishing.fish_properties[fish_type][FISH_PROPERTIES_BAD_BAIT] + for(var/identifier in bad_baits) + if(is_matching_bait(rod.bait, identifier)) //we hate this bait. + .[MULTIPLICATIVE_FISHING_MOD] = 0 + return + if(!HAS_TRAIT(rod.bait, TRAIT_GOOD_QUALITY_BAIT) && !HAS_TRAIT(rod.bait, TRAIT_GREAT_QUALITY_BAIT)) .[MULTIPLICATIVE_FISHING_MOD] = 0 @@ -270,7 +280,7 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) emulsified = TRUE if(emulsified) source.adjust_health(source.health + 3 * seconds_per_tick) - source.last_feeding = world.time //it feeds on the emulsion! + source.sate_hunger() /datum/fish_trait/emulsijack/apply_to_mob(mob/living/basic/mob) . = ..() @@ -299,7 +309,7 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) /datum/fish_trait/necrophage/proc/eat_dead_fishes(obj/item/fish/source, seconds_per_tick) SIGNAL_HANDLER - if(!source.is_hungry() || !isaquarium(source.loc)) + if(source.get_hunger() > 0.75 || !isaquarium(source.loc)) return for(var/obj/item/fish/victim in source.loc) if(victim.status != FISH_DEAD || victim == source || HAS_TRAIT(victim, TRAIT_YUCKY_FISH)) @@ -326,6 +336,7 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) name = "Mateless" catalog_description = "This fish cannot reproduce with other fishes." incompatible_traits = list(/datum/fish_trait/crossbreeder) + spontaneous_manifest_types = list(/obj/item/fish/fryish = 100) /datum/fish_trait/no_mating/apply_to_fish(obj/item/fish/fish) . = ..() @@ -387,7 +398,7 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) /datum/fish_trait/predator/proc/eat_fishes(obj/item/fish/source, seconds_per_tick) SIGNAL_HANDLER - if(!source.is_hungry() || !isaquarium(source.loc)) + if(source.get_hunger() > 0.75 || !isaquarium(source.loc)) return var/obj/structure/aquarium/aquarium = source.loc for(var/obj/item/fish/victim in aquarium.get_fishes(TRUE, source)) @@ -642,7 +653,12 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) inheritability = 80 diff_traits_inheritability = 35 catalog_description = "This fish is equipped with a sharp stringer or bill capable of delivering damage and toxins." - spontaneous_manifest_types = list(/obj/item/fish/stingray = 100, /obj/item/fish/swordfish = 100, /obj/item/fish/chainsawfish = 100) + spontaneous_manifest_types = list( + /obj/item/fish/stingray = 100, + /obj/item/fish/swordfish = 100, + /obj/item/fish/chainsawfish = 100, + /obj/item/fish/pike/armored = 100, + ) /datum/fish_trait/stinger/apply_to_fish(obj/item/fish/fish) . = ..() @@ -723,6 +739,7 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) name = "Camouflage" catalog_description = "This fish possess the ability to blend with its surroundings." spontaneous_manifest_types = list(/obj/item/fish/squid = 35) + added_difficulty = 5 /datum/fish_trait/camouflage/minigame_mod(obj/item/fishing_rod/rod, mob/fisherman, datum/fishing_challenge/minigame) minigame.special_effects |= FISHING_MINIGAME_RULE_CAMO diff --git a/code/modules/fishing/fish/types/anadromous.dm b/code/modules/fishing/fish/types/anadromous.dm index 4edbce5d0c3..5afb2cb48ce 100644 --- a/code/modules/fishing/fish/types/anadromous.dm +++ b/code/modules/fishing/fish/types/anadromous.dm @@ -53,6 +53,7 @@ required_temperature_min = MIN_AQUARIUM_TEMP+12 required_temperature_max = MIN_AQUARIUM_TEMP+27 fish_traits = list(/datum/fish_trait/carnivore, /datum/fish_trait/predator, /datum/fish_trait/aggressive) + evolution_types = list(/datum/fish_evolution/armored_pike) compatible_types = list(/obj/item/fish/pike/armored) favorite_bait = list( list( diff --git a/code/modules/fishing/fish/types/freshwater.dm b/code/modules/fishing/fish/types/freshwater.dm index 68254f66137..fe0ff437c7d 100644 --- a/code/modules/fishing/fish/types/freshwater.dm +++ b/code/modules/fishing/fish/types/freshwater.dm @@ -175,7 +175,7 @@ /obj/item/fish/tadpole/Initialize(mapload, apply_qualities = TRUE) . = ..() - AddComponent(/datum/component/fish_growth, /mob/living/basic/frog, 100 / rand(2.5, 3 MINUTES) * 10) + AddComponent(/datum/component/fish_growth, /mob/living/basic/frog, rand(2.5, 3 MINUTES)) RegisterSignal(src, COMSIG_FISH_BEFORE_GROWING, PROC_REF(growth_checks)) RegisterSignal(src, COMSIG_FISH_FINISH_GROWING, PROC_REF(on_growth)) @@ -189,13 +189,13 @@ else deltimer(del_timerid) -/obj/item/fish/tadpole/proc/growth_checks(datum/source, seconds_per_tick) +/obj/item/fish/tadpole/proc/growth_checks(datum/source, seconds_per_tick, growth) SIGNAL_HANDLER - var/hunger = CLAMP01((world.time - last_feeding) / feeding_frequency) + var/hunger = get_hunger() if(hunger >= 0.7) //too hungry to grow return COMPONENT_DONT_GROW var/obj/structure/aquarium/aquarium = loc - if(!aquarium.allow_breeding) //the aquarium has breeding disabled + if(istype(aquarium) && !aquarium.reproduction_and_growth) //the aquarium has breeding disabled return COMPONENT_DONT_GROW /obj/item/fish/tadpole/proc/on_growth(datum/source, mob/living/basic/frog/result) diff --git a/code/modules/fishing/fish/types/mining.dm b/code/modules/fishing/fish/types/mining.dm index 0b29143dd5b..2d8a345042c 100644 --- a/code/modules/fishing/fish/types/mining.dm +++ b/code/modules/fishing/fish/types/mining.dm @@ -29,8 +29,6 @@ var/anger = 0 ///The lobstrosity type this matures into var/lob_type = /mob/living/basic/mining/lobstrosity/juvenile/lava - ///at which rate the crab gains maturation - var/growth_rate = 100 / (10 MINUTES) * 10 /obj/item/fish/chasm_crab/Initialize(mapload, apply_qualities = TRUE) . = ..() @@ -57,39 +55,39 @@ if(FISH_SIZE_BULKY_MAX to INFINITY) multiplier += 0.8 - if(weight <= 800) - multiplier -= 0.1 * round((1000 - weight) / 200) - else if(weight >= 1500) - multiplier += min(0.1 * round((weight - 1000) / 500), 2) - AddComponent(/datum/component/fish_growth, lob_type, initial(growth_rate) * multiplier) + if(weight <= (average_weight - 200)) + multiplier -= 0.1 * round((average_weight - weight) / 200) + else if(weight >= (average_weight + 500)) + multiplier += min(0.1 * round((weight - average_weight) / 500), 2) + AddComponent(/datum/component/fish_growth, lob_type, 10 MINUTES * multiplier) /obj/item/fish/chasm_crab/pet_fish(mob/living/user) . = ..() if(.) anger -= min(anger, 6.5) -/obj/item/fish/chasm_crab/proc/growth_checks(datum/source, seconds_per_tick) +/obj/item/fish/chasm_crab/proc/growth_checks(datum/source, seconds_per_tick, growth) SIGNAL_HANDLER - var/hunger = CLAMP01((world.time - last_feeding) / feeding_frequency) + var/hunger = get_hunger() if(health <= initial(health) * 0.6 || hunger >= 0.6) //if too hurt or hungry, don't grow. - anger += growth_rate * 2 * seconds_per_tick + anger += growth * 2 return COMPONENT_DONT_GROW if(hunger >= 0.4) //I'm hungry and angry - anger += growth_rate * 0.6 * seconds_per_tick + anger += growth * 0.6 if(!isaquarium(loc)) return var/obj/structure/aquarium/aquarium = loc - if(!aquarium.allow_breeding) //the aquarium has breeding disabled + if(!aquarium.reproduction_and_growth) //the aquarium has breeding disabled return COMPONENT_DONT_GROW if(!locate(/obj/item/aquarium_prop) in aquarium) //the aquarium deco is quite barren - anger += growth_rate * 0.25 * seconds_per_tick + anger += growth * 0.25 var/fish_count = length(aquarium.get_fishes()) if(!ISINRANGE(fish_count, 3, AQUARIUM_MAX_BREEDING_POPULATION * 0.5)) //too lonely or overcrowded - anger += growth_rate * 0.3 * seconds_per_tick + anger += growth * 0.3 if(fish_count > AQUARIUM_MAX_BREEDING_POPULATION * 0.5) //check if there's enough room to maturate. return COMPONENT_DONT_GROW diff --git a/code/modules/fishing/fish/types/station.dm b/code/modules/fishing/fish/types/station.dm index baf104ae14f..70e641fa3e9 100644 --- a/code/modules/fishing/fish/types/station.dm +++ b/code/modules/fishing/fish/types/station.dm @@ -6,7 +6,7 @@ sprite_height = 5 random_case_rarity = FISH_RARITY_RARE required_fluid_type = AQUARIUM_FLUID_FRESHWATER - stable_population = 10 //set by New, but this is the default config value + stable_population = /datum/config_entry/number/mice_roundstart::default //set by New, but this is the default config value fillet_type = /obj/item/food/meat/slab/human/mutant/zombie //eww... fish_traits = list(/datum/fish_trait/necrophage) required_temperature_min = MIN_AQUARIUM_TEMP+15 @@ -100,3 +100,129 @@ /obj/item/fish/slimefish/get_base_edible_reagents_to_add() return list(/datum/reagent/toxin/slimejelly = 5) + +/obj/item/fish/fryish + name = "fryish" + desc = "A youngling of the Fritterish family of delicious extremophile, piscine lifeforms. Just don't tell 'Mankind for Ethical Animal Treatment' you ate it." + icon_state = "fryish" + sprite_width = 3 + sprite_height = 3 + average_size = 20 + average_weight = 400 + random_case_rarity = FISH_RARITY_VERY_RARE + required_fluid_type = AQUARIUM_FLUID_ANY_WATER + stable_population = 8 + fillet_type = /obj/item/food/nugget/fish + fish_traits = list(/datum/fish_trait/picky_eater, /datum/fish_trait/no_mating) + compatible_types = list(/obj/item/fish/fryish/fritterish, /obj/item/fish/fryish/nessie) + spawn_types = list(/obj/item/fish/fryish) + required_temperature_min = MIN_AQUARIUM_TEMP+50 + required_temperature_max = MIN_AQUARIUM_TEMP+220 + fish_movement_type = /datum/fish_movement/zippy + favorite_bait = list( + list( + FISH_BAIT_TYPE = FISH_BAIT_FOODTYPE, + FISH_BAIT_VALUE = FRIED, + ) + ) + disliked_bait = list( + list( + FISH_BAIT_TYPE = FISH_BAIT_FOODTYPE, + FISH_BAIT_VALUE = GROSS|RAW, + ) + ) + beauty = FISH_BEAUTY_GOOD + fishing_difficulty_modifier = -5 + ///Is this a baitfish? + var/is_bait = TRUE + ///The evolution datum of the next thing we grow into, given time (and food) + var/next_type = /datum/fish_evolution/fritterish + ///How long does it take for us to grow up? + var/growth_time = 5 MINUTES + +/obj/item/fish/fryish/Initialize(mapload) + . = ..() + if(is_bait) + add_traits(list(TRAIT_FISHING_BAIT, TRAIT_GREAT_QUALITY_BAIT), INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_FISH_SURVIVE_COOKING, INNATE_TRAIT) + +/obj/item/fish/fryish/update_size_and_weight(new_size = average_size, new_weight = average_weight) + . = ..() + if(!next_type) + return + var/multiplier = (size / average_size) * (weight / average_weight) + + AddComponent(/datum/component/fish_growth, next_type, growth_time * multiplier, use_drop_loc = FALSE) + +/obj/item/fish/fryish/get_fish_taste() + return list("fried fish" = 1) + +/obj/item/fish/fryish/get_fish_taste_cooked() + return list("extra-fried fish" = 1) + +/obj/item/fish/fryish/get_food_types() + return FRIED|MEAT|SEAFOOD + +/obj/item/fish/fryish/get_base_edible_reagents_to_add() + var/list/return_list = list( + /datum/reagent/consumable/nutriment/protein = 2, + /datum/reagent/consumable/nutriment/fat = 1.5, + ) + return return_list + +/obj/item/fish/fryish/fritterish + name = "fritterish" + desc = "A deliciously extremophile alien fish. This one looks like a taiyaki." + icon_state = "fritterish" + average_size = 50 + average_weight = 1000 + sprite_width = 5 + sprite_height = 3 + stable_population = 5 + fish_traits = list(/datum/fish_trait/picky_eater) + compatible_types = list(/obj/item/fish/fryish, /obj/item/fish/fryish/nessie) + fish_movement_type = /datum/fish_movement + is_bait = FALSE + next_type = /datum/fish_evolution/nessie + growth_time = 10 MINUTES + +/obj/item/fish/fryish/fritterish/Initialize(mapload, apply_qualities = TRUE) + . = ..() + base_icon_state = icon_state = pick("fritterish", "bernardfish", "matthewfish") + switch(icon_state) + if("bernardfish") + name = "bernard-fish" + desc = "A deliciously extremophile alien fish shaped like a dinosaur. Children love it." + sprite_width = 4 + sprite_height = 6 + if("matthewfish") + desc = "A deliciously extremophile alien fish shaped like a pterodactyl. Children love it." + name = "matthew-fish" + sprite_width = 6 + +/obj/item/fish/fryish/nessie + name = "nessie-fish" + 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 + sprite_width = 12 + sprite_height = 4 + average_size = 150 + average_weight = 6000 + health = 125 + feeding_frequency = 5 MINUTES + breeding_timeout = 5 MINUTES + random_case_rarity = FISH_RARITY_NOPE + stable_population = 3 + num_fillets = 2 + fish_traits = list(/datum/fish_trait/picky_eater, /datum/fish_trait/predator) + compatible_types = list(/obj/item/fish/fryish, /obj/item/fish/fryish/fritterish) + spawn_types = list(/obj/item/fish/fryish/fritterish) + fish_movement_type = /datum/fish_movement + beauty = FISH_BEAUTY_EXCELLENT + fishing_difficulty_modifier = 45 + fish_flags = parent_type::fish_flags & ~FISH_FLAG_SHOW_IN_CATALOG + is_bait = FALSE + next_type = null diff --git a/code/modules/fishing/fish/types/syndicate.dm b/code/modules/fishing/fish/types/syndicate.dm index bf99f430281..9f4b5b6d2bf 100644 --- a/code/modules/fishing/fish/types/syndicate.dm +++ b/code/modules/fishing/fish/types/syndicate.dm @@ -199,6 +199,7 @@ beauty = FISH_BEAUTY_GREAT fishing_difficulty_modifier = 20 fish_traits = list(/datum/fish_trait/carnivore, /datum/fish_trait/predator, /datum/fish_trait/aggressive, /datum/fish_trait/picky_eater, /datum/fish_trait/stinger) + evolution_types = null compatible_types = list(/obj/item/fish/pike) favorite_bait = list( list( diff --git a/code/modules/fishing/fishing_minigame.dm b/code/modules/fishing/fishing_minigame.dm index 073158b8fdc..bf4cd463ef1 100644 --- a/code/modules/fishing/fishing_minigame.dm +++ b/code/modules/fishing/fishing_minigame.dm @@ -304,6 +304,9 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) send_alert("stopped fishing") complete(FALSE) +///The multiplier of the fishing experience malus if the user's level is substantially above the difficulty. +#define EXPERIENCE_MALUS_MULT 0.08 + /datum/fishing_challenge/proc/complete(win = FALSE) if(completed) return @@ -311,13 +314,14 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) completed = TRUE if(phase == MINIGAME_PHASE) remove_minigame_hud() - if(!QDELETED(user)) - if(start_time) - var/seconds_spent = (world.time - start_time) * 0.1 - if(!(special_effects & FISHING_MINIGAME_RULE_NO_EXP)) - 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(!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 + if(extra_exp_malus > 0) + experience_multiplier /= (1 + extra_exp_malus * EXPERIENCE_MALUS_MULT) + 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) @@ -325,6 +329,8 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) if(!QDELETED(src)) qdel(src) +#undef EXPERIENCE_MALUS_MULT + /datum/fishing_challenge/proc/start_baiting_phase(penalty = FALSE) reward_path = null //In case we missed the biting phase, set the path back to null var/wait_time diff --git a/code/modules/fishing/fishing_portal_machine.dm b/code/modules/fishing/fishing_portal_machine.dm index f322bf92c78..f8c343d50b1 100644 --- a/code/modules/fishing/fishing_portal_machine.dm +++ b/code/modules/fishing/fishing_portal_machine.dm @@ -284,7 +284,11 @@ var/list/choices = list() for(var/radial_name in available_fish_sources) var/datum/fish_source/source = available_fish_sources[radial_name] - choices[radial_name] = image(icon = 'icons/hud/radial_fishing.dmi', icon_state = source.radial_state) + var/mutable_appearance/radial_icon = mutable_appearance('icons/hud/radial_fishing.dmi', source.radial_state) + if(!istype(source, /datum/fish_source/portal)) + //a little star on the top-left to distinguishs them from standard portals. + radial_icon.add_overlay('icons/hud/radial_fishing.dmi', "linked_source") + choices[radial_name] = radial_icon var/choice = show_radial_menu(user, src, choices, radius = 38, custom_check = CALLBACK(src, TYPE_PROC_REF(/atom, can_interact), user), tooltips = TRUE) if(!choice || !can_interact(user)) diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index f18637e3b35..08fd7c13464 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -142,12 +142,19 @@ /obj/item/fishing_rod/proc/reel(mob/user) if(DOING_INTERACTION_WITH_TARGET(user, currently_hooked)) return + playsound(src, SFX_REEL, 50, vary = FALSE) - if(!do_after(user, 0.8 SECONDS, currently_hooked, timed_action_flags = IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE, extra_checks = CALLBACK(src, PROC_REF(fishing_line_check)))) + var/time = (0.8 - round(user.mind?.get_skill_level(/datum/skill/fishing) * 0.04, 0.1)) SECONDS + if(!do_after(user, time, currently_hooked, timed_action_flags = IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE, extra_checks = CALLBACK(src, PROC_REF(fishing_line_check)))) return + if(currently_hooked.anchored || currently_hooked.move_resist >= MOVE_FORCE_STRONG) balloon_alert(user, "[currently_hooked.p_they()] won't budge!") return + + //About thirty minutes of non-stop reeling to get from zero to master... not worth it but hey, you do what you do. + user.mind?.adjust_experience(/datum/skill/fishing, time * 1.3) + //Try to move it 'till it's under the user's feet, then try to pick it up if(isitem(currently_hooked)) var/obj/item/item = currently_hooked @@ -195,6 +202,15 @@ fishing_line = null currently_hooked = null +/obj/item/fishing_rod/proc/get_cast_range(mob/living/user) + . = cast_range + if(!user && !isliving(loc)) + return + user = loc + if(!user.is_holding(src) || !user.mind) + return + . += round(user.mind.get_skill_level(/datum/skill/fishing) * 0.3) + /obj/item/fishing_rod/dropped(mob/user, silent) . = ..() QDEL_NULL(fishing_line) @@ -215,7 +231,7 @@ SIGNAL_HANDLER . = NONE - if(!CheckToolReach(src, source.target, cast_range)) + if(!CheckToolReach(src, source.target, get_cast_range())) qdel(source) return BEAM_CANCEL_DRAW @@ -260,7 +276,7 @@ return casting = TRUE var/obj/projectile/fishing_cast/cast_projectile = new(get_turf(src)) - cast_projectile.range = cast_range + cast_projectile.range = get_cast_range(user) cast_projectile.owner = src cast_projectile.original = target cast_projectile.fired_from = src diff --git a/code/modules/fishing/sources/source_types.dm b/code/modules/fishing/sources/source_types.dm index ef2cdf87989..2f56ffaad3c 100644 --- a/code/modules/fishing/sources/source_types.dm +++ b/code/modules/fishing/sources/source_types.dm @@ -1,4 +1,6 @@ /datum/fish_source/ocean + radial_state = "seaboat" + overlay_state = "portal_ocean" fish_table = list( FISHING_DUD = 10, /obj/effect/spawner/message_in_a_bottle = 4, @@ -33,9 +35,13 @@ /datum/fish_source/ocean/beach catalog_description = "Beach shore water" + radial_state = "palm_beach" + overlay_state = "portal_beach" /datum/fish_source/ice_fishing catalog_description = "Ice-covered water" + radial_state = "ice" + overlay_state = "portal_ocean" fish_table = list( FISHING_DUD = 4, /obj/item/fish/arctic_char = 5, @@ -47,6 +53,8 @@ /datum/fish_source/river catalog_description = "River water" + radial_state = "river" + overlay_state = "portal_river" fish_table = list( FISHING_DUD = 4, /obj/item/fish/goldfish = 5, @@ -72,6 +80,7 @@ /datum/fish_source/sand catalog_description = "Sand" + radial_state = "palm_beach" fish_table = list( FISHING_DUD = 8, /obj/item/fish/sand_crab = 10, @@ -84,6 +93,7 @@ /datum/fish_source/cursed_spring catalog_description = null //it's a secret (sorta, I know you're reading this) + radial_state = "cursed" fish_table = list( FISHING_DUD = 2, /obj/item/fish/soul = 3, @@ -295,12 +305,13 @@ /datum/fish_source/chasm catalog_description = "Chasm depths" background = "background_lavaland" + radial_state = "ground_hole" + overlay_state = "portal_chasm" fish_table = list( FISHING_DUD = 5, /obj/item/fish/chasm_crab = 15, /datum/chasm_detritus = 30, ) - fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 5 /datum/fish_source/chasm/on_start_fishing(obj/item/fishing_rod/rod, mob/fisherman, atom/parent) @@ -324,6 +335,8 @@ /datum/fish_source/lavaland catalog_description = "Lava vents" background = "background_lavaland" + radial_state = "lava" + overlay_state = "portal_lava" fish_table = list( FISHING_DUD = 5, /obj/item/stack/ore/slag = 20, @@ -367,6 +380,7 @@ /datum/fish_source/moisture_trap catalog_description = "Moisture trap basins" + radial_state = "garbage" fish_table = list( FISHING_DUD = 20, /obj/item/fish/ratfish = 10, @@ -376,6 +390,7 @@ /datum/fish_source/toilet 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?!") fish_table = list( FISHING_DUD = 18, @@ -435,6 +450,8 @@ /datum/fish_source/oil_well catalog_description = "Oil wells" + radial_state = "oil" + overlay_state = "portal_chasm" //close enough to pitch black fish_table = list( FISHING_DUD = 5, /obj/item/fish/boned = 10, @@ -457,6 +474,7 @@ /datum/fish_source/hydro_tray catalog_description = "Hydroponics trays" + radial_state = "hydro" fish_table = list( FISHING_DUD = 25, /obj/item/food/grown/grass = 25, @@ -561,3 +579,24 @@ var/picked_path = pick(seeds_to_draw_from) return new picked_path(get_turf(fishing_spot)) + +/datum/fish_source/deepfryer + catalog_description = "Deep Fryers" + radial_state = "fryer" + fish_table = list( + /obj/item/food/badrecipe = 15, + /obj/item/food/nugget = 5, + /obj/item/fish/fryish = 40, + /obj/item/fish/fryish/fritterish = 4, + /obj/item/fish/fryish/nessie = 1, + ) + fish_counts = list( + /obj/item/fish/fryish = 10, + /obj/item/fish/fryish/fritterish = 4, + /obj/item/fish/fryish/nessie = 1, + ) + fish_count_regen = list( + /obj/item/fish/fryish = 2 MINUTES, + /obj/item/fish/fryish/fritterish = 6 MINUTES, + ) + fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 13 diff --git a/code/modules/food_and_drinks/machinery/deep_fryer.dm b/code/modules/food_and_drinks/machinery/deep_fryer.dm index 056aa4263c0..cdf69192045 100644 --- a/code/modules/food_and_drinks/machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/machinery/deep_fryer.dm @@ -63,6 +63,8 @@ GLOBAL_LIST_INIT(oilfry_blacklisted_items, typecacheof(list( reagents.add_reagent(/datum/reagent/consumable/nutriment/fat/oil, 25) fry_loop = new(src, FALSE) RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(on_cleaned)) + AddElement(/datum/element/lazy_fishing_spot, /datum/fish_source/deepfryer) + AddElement(/datum/element/fish_safe_storage) //Prevents fryish and fritterish from dying inside the deepfryer. /obj/machinery/deepfryer/Destroy() QDEL_NULL(fry_loop) diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index 8cf20a0f4d1..8c2bd9f64e4 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -605,7 +605,7 @@ SEND_SIGNAL(target, COMSIG_ATOM_RESTYLE, user, target, user.zone_selected, EXTERNAL_RESTYLE_PLANT, 6 SECONDS) /obj/item/geneshears - name = "Botanogenetic Plant Shears" + name = "botanogenetic plant shears" desc = "A high tech, high fidelity pair of plant shears, capable of cutting genetic traits out of a plant." icon = 'icons/obj/service/hydroponics/equipment.dmi' icon_state = "genesheers" diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 18197c006b5..86847f01173 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -470,7 +470,7 @@ return switch(choice) if("Plant Name") - var/newplantname = reject_bad_text(tgui_input_text(user, "Write a new plant name", "Plant Name", plantname, 20)) + var/newplantname = reject_bad_text(tgui_input_text(user, "Write a new plant name", "Plant Name", plantname, max_length = MAX_NAME_LEN)) if(isnull(newplantname)) return if(!user.can_perform_action(src)) @@ -478,7 +478,7 @@ name = "[LOWER_TEXT(newplantname)]" plantname = newplantname if("Seed Description") - var/newdesc = tgui_input_text(user, "Write a new seed description", "Seed Description", desc, 180) + var/newdesc = tgui_input_text(user, "Write a new seed description", "Seed Description", desc, max_length = MAX_DESC_LEN) if(isnull(newdesc)) return if(!user.can_perform_action(src)) @@ -487,7 +487,7 @@ if("Product Description") if(product && !productdesc) productdesc = initial(product.desc) - var/newproductdesc = tgui_input_text(user, "Write a new product description", "Product Description", productdesc, 180) + var/newproductdesc = tgui_input_text(user, "Write a new product description", "Product Description", productdesc, max_length = MAX_DESC_LEN) if(isnull(newproductdesc)) return if(!user.can_perform_action(src)) diff --git a/code/modules/instruments/songs/editor.dm b/code/modules/instruments/songs/editor.dm index 651b3d6f3b6..4029e5c3954 100644 --- a/code/modules/instruments/songs/editor.dm +++ b/code/modules/instruments/songs/editor.dm @@ -111,7 +111,7 @@ tempo = sanitize_tempo(5) // default 120 BPM return TRUE if("add_new_line") - var/newline = tgui_input_text(user, "Enter your line", parent.name) + var/newline = tgui_input_text(user, "Enter your line", parent.name, max_length = MUSIC_MAXLINECHARS) if(!newline || !in_range(parent, user)) return if(lines.len > MUSIC_MAXLINES) @@ -129,7 +129,7 @@ var/line_to_edit = params["line_editing"] if(line_to_edit > lines.len || line_to_edit < 1) return FALSE - var/new_line_text = tgui_input_text(user, "Enter your line ", parent.name, lines[line_to_edit], MUSIC_MAXLINECHARS) + var/new_line_text = tgui_input_text(user, "Enter your line ", parent.name, lines[line_to_edit], max_length = MUSIC_MAXLINECHARS) if(isnull(new_line_text) || !in_range(parent, user)) return FALSE lines[line_to_edit] = new_line_text diff --git a/code/modules/jobs/job_types/chaplain/chaplain_costumes.dm b/code/modules/jobs/job_types/chaplain/chaplain_costumes.dm index 637177adffb..0968569ae33 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain_costumes.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain_costumes.dm @@ -222,7 +222,7 @@ inhand_icon_state = null /obj/item/clothing/suit/chaplainsuit/armor/crusader - name = "Crusader's Armour" + name = "crusader's armour" desc = "Armour that's comprised of metal and cloth." icon_state = "crusader" w_class = WEIGHT_CLASS_BULKY diff --git a/code/modules/library/bibles.dm b/code/modules/library/bibles.dm index 4b9b4ae61d1..42194d932e8 100644 --- a/code/modules/library/bibles.dm +++ b/code/modules/library/bibles.dm @@ -329,7 +329,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list( new /obj/item/reagent_containers/cup/glass/bottle/whiskey(src) /obj/item/book/bible/syndicate - name = "Syndicate Tome" + name = "syndicate tome" desc = "A very ominous tome resembling a bible." icon_state ="ebook" item_flags = NO_BLOOD_ON_ITEM diff --git a/code/modules/library/book.dm b/code/modules/library/book.dm index 5ae9afcdcbe..7f5f010563a 100644 --- a/code/modules/library/book.dm +++ b/code/modules/library/book.dm @@ -133,7 +133,7 @@ name = newtitle book_data.set_title(html_decode(newtitle)) //Don't want to double encode here if("Contents") - var/content = tgui_input_text(user, "Write your book's contents (HTML NOT allowed)", "Book Contents", multiline = TRUE) + var/content = tgui_input_text(user, "Write your book's contents (HTML NOT allowed)", "Book Contents", max_length = MAX_PAPER_LENGTH, multiline = TRUE) if(!user.can_perform_action(src) || !user.can_write(attacking_item)) return if(!content) @@ -141,7 +141,7 @@ return book_data.set_content(html_decode(content)) if("Author") - var/author = tgui_input_text(user, "Write the author's name", "Author Name") + var/author = tgui_input_text(user, "Write the author's name", "Author Name", max_length = MAX_NAME_LEN) if(!user.can_perform_action(src) || !user.can_write(attacking_item)) return if(!author) diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/museum.dm b/code/modules/mapfluff/ruins/objects_and_mobs/museum.dm index fc9f8d36ce0..aac22db015b 100644 --- a/code/modules/mapfluff/ruins/objects_and_mobs/museum.dm +++ b/code/modules/mapfluff/ruins/objects_and_mobs/museum.dm @@ -199,6 +199,6 @@ var/obj/structure/toilet/destination = pick(partners) forceMove(destination) destination.w_items += w_class - destination.contents += src + LAZYADD(destination.cistern_items, src) #undef CAFE_KEYCARD_TOILETS diff --git a/code/modules/mining/boulder_processing/_boulder_processing.dm b/code/modules/mining/boulder_processing/_boulder_processing.dm index ab72e4ebae5..834d8d08f80 100644 --- a/code/modules/mining/boulder_processing/_boulder_processing.dm +++ b/code/modules/mining/boulder_processing/_boulder_processing.dm @@ -81,14 +81,14 @@ for(var/obj/item/boulder/potential_boulder in contents) boulder_count += 1 . += span_notice("Storage capacity = [boulder_count]/[boulders_held_max] boulders.") - . += span_notice("Can process upto [boulders_processing_count] boulders at a time.") + . += span_notice("Can process up to [boulders_processing_count] boulders at a time.") if(anchored) - . += span_notice("Its [EXAMINE_HINT("anchored")] in place.") + . += span_notice("It's [EXAMINE_HINT("anchored")] in place.") else . += span_warning("It needs to be [EXAMINE_HINT("anchored")] to start operations.") - . += span_notice("Its maintainence panel can be [EXAMINE_HINT("screwed")] [panel_open ? "closed" : "open"].") + . += span_notice("Its maintenance panel can be [EXAMINE_HINT("screwed")] [panel_open ? "closed" : "open"].") if(panel_open) . += span_notice("The whole machine can be [EXAMINE_HINT("pried")] apart.") @@ -304,7 +304,7 @@ if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN || panel_open) return if(!anchored) - balloon_alert(user, "anchor first!") + balloon_alert(user, "anchor it first!") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN if(panel_open) balloon_alert(user, "close panel!") diff --git a/code/modules/mining/boulder_processing/brm.dm b/code/modules/mining/boulder_processing/brm.dm index 9b918696891..658eb97d563 100644 --- a/code/modules/mining/boulder_processing/brm.dm +++ b/code/modules/mining/boulder_processing/brm.dm @@ -58,15 +58,15 @@ /obj/machinery/brm/examine(mob/user) . = ..() . += span_notice("The small screen reads there are [span_boldnotice("[SSore_generation.available_boulders.len] boulders")] available to teleport.") - . += span_notice("Can collect upto [boulders_processing_max] boulders at a time.") - . += span_notice("Automatic boulder retrival can be toggled [EXAMINE_HINT("[toggled_on ? "Off" : "On"]")] with [EXAMINE_HINT("Right Click")].") + . += span_notice("Can collect up to [boulders_processing_max] boulders at a time.") + . += span_notice("Automatic boulder retrieval can be toggled [EXAMINE_HINT("[toggled_on ? "Off" : "On"]")] with [EXAMINE_HINT("Right Click")].") if(anchored) - . += span_notice("Its [EXAMINE_HINT("anchored")] in place.") + . += span_notice("It's [EXAMINE_HINT("anchored")] in place.") else . += span_warning("It needs to be [EXAMINE_HINT("anchored")] to start operations.") - . += span_notice("Its maintainence panel can be [EXAMINE_HINT("screwed")] [panel_open ? "Closed" : "Open"].") + . += span_notice("Its maintenance panel can be [EXAMINE_HINT("screwed")] [panel_open ? "closed" : "open"].") if(panel_open) . += span_notice("The whole machine can be [EXAMINE_HINT("pried")] apart.") @@ -127,7 +127,9 @@ var/result = pre_collect_boulder() if(result == TURF_BLOCKED_BY_BOULDER) - balloon_alert(user, "no space") + balloon_alert(user, "no space!") + else if(result) + balloon_alert(user, "teleporting...") COOLDOWN_START(src, manual_teleport_cooldown, TELEPORTATION_TIME) return TRUE @@ -162,9 +164,9 @@ var/result = pre_collect_boulder() if(result == TURF_BLOCKED_BY_BOULDER) - balloon_alert(user, "no space") + balloon_alert(user, "no space!") else if(result) - balloon_alert(user, "teleporting") + balloon_alert(user, "teleporting...") COOLDOWN_START(src, manual_teleport_cooldown, TELEPORTATION_TIME) @@ -179,9 +181,9 @@ var/result = pre_collect_boulder() if(result == TURF_BLOCKED_BY_BOULDER) - balloon_alert(user, "no space") + balloon_alert(user, "no space!") else if(result) - balloon_alert(user, "teleporting") + balloon_alert(user, "teleporting...") COOLDOWN_START(src, manual_teleport_cooldown, TELEPORTATION_TIME) @@ -192,7 +194,7 @@ if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN || panel_open) return if(!anchored) - balloon_alert(user, "anchor first!") + balloon_alert(user, "anchor it first!") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN toggle_auto_on(user) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -211,7 +213,7 @@ balloon_alert(user, "close panel first!") return if(!anchored) - balloon_alert(user, "anchor first!") + balloon_alert(user, "anchor it first!") return if(!is_operational || machine_stat & (BROKEN | NOPOWER)) return @@ -228,7 +230,7 @@ if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN || panel_open) return if(!anchored) - balloon_alert(user, "anchor first!") + balloon_alert(user, "unanchored!") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN toggle_auto_on(user) @@ -239,7 +241,7 @@ if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN || panel_open) return if(!anchored) - balloon_alert(user, "anchor first!") + balloon_alert(user, "unanchored!") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN toggle_auto_on(user) diff --git a/code/modules/mob/living/basic/bots/_bots.dm b/code/modules/mob/living/basic/bots/_bots.dm index cc6ac85c6cb..be7ce8bc5dd 100644 --- a/code/modules/mob/living/basic/bots/_bots.dm +++ b/code/modules/mob/living/basic/bots/_bots.dm @@ -538,6 +538,7 @@ GLOBAL_LIST_INIT(command_strings, list( /mob/living/basic/bot/proc/bot_reset(bypass_ai_reset = FALSE) SEND_SIGNAL(src, COMSIG_BOT_RESET) access_card.set_access(initial_access) + update_bot_mode(new_mode = src::mode) diag_hud_set_botstat() diag_hud_set_botmode() clear_path_hud() @@ -558,8 +559,7 @@ GLOBAL_LIST_INIT(command_strings, list( // process control input switch(command) if("patroloff") - bot_reset() //HOLD IT!! //OBJECTION!! - set_mode_flags(bot_mode_flags & ~BOT_MODE_AUTOPATROL) + set_patrol_off() if("patrolon") set_mode_flags(bot_mode_flags | BOT_MODE_AUTOPATROL) if("summon") @@ -567,6 +567,9 @@ GLOBAL_LIST_INIT(command_strings, list( if("ejectpai") eject_pai_remote(user) +/mob/living/basic/bot/proc/set_patrol_off() + bot_reset() + set_mode_flags(bot_mode_flags & ~BOT_MODE_AUTOPATROL) /mob/living/basic/bot/proc/bot_control_message(command, user) if(command == "summon") diff --git a/code/modules/mob/living/basic/bots/bot_ai.dm b/code/modules/mob/living/basic/bots/bot_ai.dm index a0abbbfd48b..fd89168ddf4 100644 --- a/code/modules/mob/living/basic/bots/bot_ai.dm +++ b/code/modules/mob/living/basic/bots/bot_ai.dm @@ -48,6 +48,12 @@ return RegisterSignal(new_pawn, COMSIG_BOT_RESET, PROC_REF(reset_bot)) RegisterSignal(new_pawn, COMSIG_AI_BLACKBOARD_KEY_CLEARED(BB_BOT_SUMMON_TARGET), PROC_REF(clear_summon)) + RegisterSignal(new_pawn, COMSIG_MOB_AI_MOVEMENT_STARTED, PROC_REF(on_movement_start)) + +/datum/ai_controller/basic_controller/bot/proc/on_movement_start(mob/living/basic/bot/source, atom/target) + SIGNAL_HANDLER + if(current_movement_target == blackboard[BB_BEACON_TARGET]) + source.update_bot_mode(new_mode = BOT_PATROL) /datum/ai_controller/basic_controller/bot/proc/clear_summon() SIGNAL_HANDLER @@ -75,7 +81,7 @@ /datum/ai_controller/basic_controller/bot/proc/reset_bot() SIGNAL_HANDLER - + CancelActions() if(!length(reset_keys)) return for(var/key in reset_keys) @@ -130,7 +136,6 @@ return if(controller.blackboard_key_exists(BB_BEACON_TARGET)) - bot_pawn.update_bot_mode(new_mode = BOT_PATROL) controller.queue_behavior(travel_behavior, BB_BEACON_TARGET) return @@ -195,8 +200,6 @@ /datum/ai_planning_subtree/respond_to_summon/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) if(!controller.blackboard_key_exists(BB_BOT_SUMMON_TARGET)) return - controller.clear_blackboard_key(BB_PREVIOUS_BEACON_TARGET) - controller.clear_blackboard_key(BB_BEACON_TARGET) controller.queue_behavior(/datum/ai_behavior/travel_towards/bot_summon, BB_BOT_SUMMON_TARGET) return SUBTREE_RETURN_FINISH_PLANNING diff --git a/code/modules/mob/living/basic/guardian/guardian_verbs.dm b/code/modules/mob/living/basic/guardian/guardian_verbs.dm index 80a2af7db7a..b69fac87820 100644 --- a/code/modules/mob/living/basic/guardian/guardian_verbs.dm +++ b/code/modules/mob/living/basic/guardian/guardian_verbs.dm @@ -57,7 +57,7 @@ if (isnull(summoner)) return var/sender_key = key - var/input = tgui_input_text(src, "Enter a message to tell your summoner", "Guardian") + var/input = tgui_input_text(src, "Enter a message to tell your summoner", "Guardian", max_length = MAX_MESSAGE_LEN) if (sender_key != key || !input) //guardian got reset, or did not enter anything return @@ -91,7 +91,7 @@ /datum/action/cooldown/mob_cooldown/guardian_comms/Activate(atom/target) StartCooldown(360 SECONDS) - var/input = tgui_input_text(owner, "Enter a message to tell your guardian", "Message") + var/input = tgui_input_text(owner, "Enter a message to tell your guardian", "Message", max_length = MAX_MESSAGE_LEN) StartCooldown() if (!input) return FALSE diff --git a/code/modules/mob/living/basic/lavaland/legion/legion_ai.dm b/code/modules/mob/living/basic/lavaland/legion/legion_ai.dm index 1bae1b30353..856ff315d0c 100644 --- a/code/modules/mob/living/basic/lavaland/legion/legion_ai.dm +++ b/code/modules/mob/living/basic/lavaland/legion/legion_ai.dm @@ -66,6 +66,9 @@ if (QDELETED(victim) || prob(30)) return ..() + if(HAS_MIND_TRAIT(victim, TRAIT_MIMING)) // mimes cant talk + return + var/list/remembered_speech = controller.blackboard[BB_LEGION_RECENT_LINES] || list() if (length(remembered_speech) && prob(50)) // Don't spam the radio diff --git a/code/modules/mob/living/basic/pets/orbie/orbie.dm b/code/modules/mob/living/basic/pets/orbie/orbie.dm index c0c6dd7b023..a0fbba899e3 100644 --- a/code/modules/mob/living/basic/pets/orbie/orbie.dm +++ b/code/modules/mob/living/basic/pets/orbie/orbie.dm @@ -51,6 +51,7 @@ AddComponent(/datum/component/obeys_commands, pet_commands) AddElement(/datum/element/basic_eating, food_types = food_types) ADD_TRAIT(src, TRAIT_SILICON_EMOTES_ALLOWED, INNATE_TRAIT) + RegisterSignal(src, COMSIG_ATOM_CAN_BE_PULLED, PROC_REF(on_pulled)) RegisterSignal(src, COMSIG_VIRTUAL_PET_LEVEL_UP, PROC_REF(on_level_up)) RegisterSignal(src, COMSIG_MOB_CLICKON, PROC_REF(on_click)) diff --git a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/hivemind.dm b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/hivemind.dm index 790879b0de2..8fc79080cac 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/hivemind.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/hivemind.dm @@ -18,7 +18,7 @@ var/current_directive = "" /datum/action/cooldown/mob_cooldown/set_spider_directive/Activate(atom/target) - var/new_directive = tgui_input_text(owner, "Enter the new directive", "Create directive", "[current_directive]") + var/new_directive = tgui_input_text(owner, "Enter the new directive", "Create directive", "[current_directive]", max_length = MAX_MESSAGE_LEN) if(isnull(new_directive) || QDELETED(src) || QDELETED(owner) || !IsAvailable(feedback = TRUE)) return @@ -44,7 +44,7 @@ click_to_activate = FALSE /datum/action/cooldown/mob_cooldown/command_spiders/Activate(trigger_flags) - var/input = tgui_input_text(owner, "Input a command for your legions to follow.", "Command") + var/input = tgui_input_text(owner, "Input a command for your legions to follow.", "Command", max_length = MAX_MESSAGE_LEN) if(!input || QDELETED(src) || QDELETED(owner) || !IsAvailable(feedback = TRUE)) return spider_command(owner, input) diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm index 04967c76731..d883cbc6359 100644 --- a/code/modules/mob/living/brain/posibrain.dm +++ b/code/modules/mob/living/brain/posibrain.dm @@ -76,7 +76,7 @@ GLOBAL_VAR(posibrain_notify_cooldown) addtimer(CALLBACK(src, PROC_REF(check_success)), ask_delay) /obj/item/mmi/posibrain/click_alt(mob/living/user) - var/input_seed = tgui_input_text(user, "Enter a personality seed", "Enter seed", ask_role, MAX_NAME_LEN) + var/input_seed = tgui_input_text(user, "Enter a personality seed", "Enter seed", ask_role, max_length = MAX_NAME_LEN) if(isnull(input_seed)) return CLICK_ACTION_BLOCKING if(!user.can_perform_action(src)) diff --git a/code/modules/mob/living/carbon/alien/adult/alien_powers.dm b/code/modules/mob/living/carbon/alien/adult/alien_powers.dm index 0fef5ede79e..3ca7ff59f14 100644 --- a/code/modules/mob/living/carbon/alien/adult/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/adult/alien_powers.dm @@ -134,7 +134,7 @@ Doesn't work on other aliens/AI.*/ if(!chosen_recipient) return FALSE - var/to_whisper = tgui_input_text(owner, title = "Alien Whisper") + var/to_whisper = tgui_input_text(owner, title = "Alien Whisper", max_length = MAX_MESSAGE_LEN) if(QDELETED(chosen_recipient) || QDELETED(src) || QDELETED(owner) || !IsAvailable(feedback = TRUE) || !to_whisper) return FALSE if(chosen_recipient.can_block_magic(MAGIC_RESISTANCE_MIND, charge_cost = 0)) diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index 2b50c215f89..ccbf735bd85 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -10,6 +10,7 @@ sharpness = NONE, attack_direction = null, attacking_item, + wound_clothing = TRUE, ) // Spread damage should always have def zone be null if(spread_damage) @@ -46,6 +47,7 @@ sharpness = NONE, attack_direction = null, attacking_item, + wound_clothing = TRUE, ) // Add relevant DR modifiers into blocked value to pass to parent diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 16d09d3ee83..4c9d9de28cc 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -1448,7 +1448,7 @@ GLOBAL_LIST_EMPTY(features_by_species) INVOKE_ASYNC(humi, TYPE_PROC_REF(/mob, emote), "scream") // Apply the damage to all body parts - humi.apply_damage(burn_damage, BURN, spread_damage = TRUE) + humi.apply_damage(burn_damage, BURN, spread_damage = TRUE, wound_clothing = FALSE) // For cold damage, we cap at the threshold if you're dead if(humi.getFireLoss() >= abs(HEALTH_THRESHOLD_DEAD) && humi.stat == DEAD) @@ -1464,11 +1464,11 @@ GLOBAL_LIST_EMPTY(features_by_species) var/damage_mod = coldmod * humi.physiology.cold_mod * (is_hulk ? HULK_COLD_DAMAGE_MOD : 1) // Can't be a switch due to http://www.byond.com/forum/post/2750423 if(humi.coretemperature in 201 to cold_damage_limit) - humi.apply_damage(COLD_DAMAGE_LEVEL_1 * damage_mod * seconds_per_tick, damage_type) + humi.apply_damage(COLD_DAMAGE_LEVEL_1 * damage_mod * seconds_per_tick, damage_type, wound_clothing = FALSE) else if(humi.coretemperature in 120 to 200) - humi.apply_damage(COLD_DAMAGE_LEVEL_2 * damage_mod * seconds_per_tick, damage_type) + humi.apply_damage(COLD_DAMAGE_LEVEL_2 * damage_mod * seconds_per_tick, damage_type, wound_clothing = FALSE) else - humi.apply_damage(COLD_DAMAGE_LEVEL_3 * damage_mod * seconds_per_tick, damage_type) + humi.apply_damage(COLD_DAMAGE_LEVEL_3 * damage_mod * seconds_per_tick, damage_type, wound_clothing = FALSE) /** * Used to apply burn wounds on random limbs @@ -1517,7 +1517,7 @@ GLOBAL_LIST_EMPTY(features_by_species) if(humi.bodytemperature > BODYTEMP_HEAT_WOUND_LIMIT + 2800) burn_damage = HEAT_DAMAGE_LEVEL_3 - humi.apply_damage(burn_damage * seconds_per_tick, BURN, bodypart) + humi.apply_damage(burn_damage * seconds_per_tick, BURN, bodypart, wound_clothing = FALSE) /// Handle the air pressure of the environment /datum/species/proc/handle_environment_pressure(mob/living/carbon/human/H, datum/gas_mixture/environment, seconds_per_tick, times_fired) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 03445f7e982..19952360cd5 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -63,7 +63,7 @@ message = "screams!" message_mime = "acts out a scream!" emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE - only_forced_audio = TRUE + audio_cooldown = 5 SECONDS vary = TRUE sound_wall_ignore = TRUE //NOVA EDIT ADDITION diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm new file mode 100644 index 00000000000..04a056e0011 --- /dev/null +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -0,0 +1,9 @@ +/// Collects information displayed about src when examined by a user with a medical HUD. +/mob/living/carbon/human/get_medhud_examine_info(mob/living/user, datum/record/crew/target_record) + . = ..() + + if(istype(w_uniform, /obj/item/clothing/under)) + var/obj/item/clothing/under/undershirt = w_uniform + var/sensor_text = undershirt.get_sensor_text() + if(sensor_text) + . += "Sensor Status: [sensor_text]" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 16f7a38b8c1..83578959fdf 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -351,7 +351,7 @@ var/mob/living/carbon/human/human_user = human_or_ghost_user if(href_list["add_citation"]) var/max_fine = CONFIG_GET(number/maxfine) - var/citation_name = tgui_input_text(human_user, "Citation crime", "Security HUD") + var/citation_name = tgui_input_text(human_user, "Citation crime", "Security HUD", max_length = MAX_MESSAGE_LEN) var/fine = tgui_input_number(human_user, "Citation fine", "Security HUD", 50, max_fine, 5) if(!fine || !target_record || !citation_name || !allowed_access || !isnum(fine) || fine > max_fine || fine <= 0 || !human_user.canUseHUD() || !HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) return @@ -366,7 +366,7 @@ return if(href_list["add_crime"]) - var/crime_name = tgui_input_text(human_user, "Crime name", "Security HUD") + var/crime_name = tgui_input_text(human_user, "Crime name", "Security HUD", max_length = MAX_MESSAGE_LEN) if(!target_record || !crime_name || !allowed_access || !human_user.canUseHUD() || !HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) return @@ -379,7 +379,7 @@ return if(href_list["add_note"]) - var/new_note = tgui_input_text(human_user, "Security note", "Security Records", multiline = TRUE) + var/new_note = tgui_input_text(human_user, "Security note", "Security Records", max_length = MAX_MESSAGE_LEN, multiline = TRUE) if(!target_record || !new_note || !allowed_access || !human_user.canUseHUD() || !HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) return diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 466ff65c755..f1a6bdeceae 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -724,7 +724,7 @@ var/mob/living/recipient = tgui_input_list(telepath, "Choose a telepathic message recipient", "Telepathy", sort_names(recipient_options)) if(isnull(recipient) || telepath.stat == DEAD || !is_species(telepath, /datum/species/jelly/stargazer)) return - var/msg = tgui_input_text(telepath, title = "Telepathy") + var/msg = tgui_input_text(telepath, title = "Telepathy", max_length = MAX_MESSAGE_LEN) if(isnull(msg) || telepath.stat == DEAD || !is_species(telepath, /datum/species/jelly/stargazer)) return if(!(recipient in oview(telepath))) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 7a3af83d283..24462670f07 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -16,6 +16,7 @@ * * sharpness - Sharpness of the weapon. * * attack_direction - Direction of the attack from the attacker to [src]. * * attacking_item - Item that is attacking [src]. + * * wound_clothing - If this should cause damage to clothing. * * Returns the amount of damage dealt. */ @@ -31,6 +32,7 @@ sharpness = NONE, attack_direction = null, attacking_item, + wound_clothing = TRUE, ) SHOULD_CALL_PARENT(TRUE) var/damage_amount = damage @@ -40,7 +42,7 @@ if(damage_amount <= 0) return 0 - SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMAGE, damage_amount, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item) + SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMAGE, damage_amount, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item, wound_clothing) var/damage_dealt = 0 switch(damagetype) @@ -57,6 +59,7 @@ sharpness = sharpness, attack_direction = attack_direction, damage_source = attacking_item, + wound_clothing = wound_clothing, )) update_damage_overlays() damage_dealt = actual_hit.get_damage() - delta // Unfortunately bodypart receive_damage doesn't return damage dealt so we do it manually @@ -76,6 +79,7 @@ sharpness = sharpness, attack_direction = attack_direction, damage_source = attacking_item, + wound_clothing = wound_clothing, )) update_damage_overlays() damage_dealt = actual_hit.get_damage() - delta // See above @@ -91,7 +95,7 @@ if(BRAIN) damage_dealt = -1 * adjustOrganLoss(ORGAN_SLOT_BRAIN, damage_amount) - SEND_SIGNAL(src, COMSIG_MOB_AFTER_APPLY_DAMAGE, damage_dealt, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item) + SEND_SIGNAL(src, COMSIG_MOB_AFTER_APPLY_DAMAGE, damage_dealt, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus,sharpness, attack_direction, attacking_item, wound_clothing) return damage_dealt /** diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index a086755d6ab..dd5f3b8beb2 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -2336,6 +2336,9 @@ GLOBAL_LIST_EMPTY(fire_appearances) if(isnull(.)) return + if(. <= UNCONSCIOUS || new_stat >= UNCONSCIOUS) + update_body() // to update eyes + switch(.) //Previous stat. if(CONSCIOUS) if(stat >= UNCONSCIOUS) @@ -2825,7 +2828,7 @@ GLOBAL_LIST_EMPTY(fire_appearances) var/picked_theme = tgui_input_list(admin, "Pick the guardian theme.", "Guardian Controller", list(GUARDIAN_THEME_TECH, GUARDIAN_THEME_MAGIC, GUARDIAN_THEME_CARP, GUARDIAN_THEME_MINER, "Random")) if(picked_theme == "Random") picked_theme = null //holopara code handles not having a theme by giving a random one - var/picked_name = tgui_input_text(admin, "Name the guardian, leave empty to let player name it.", "Guardian Controller") + var/picked_name = tgui_input_text(admin, "Name the guardian, leave empty to let player name it.", "Guardian Controller", max_length = MAX_NAME_LEN) var/picked_color = input(admin, "Set the guardian's color, cancel to let player set it.", "Guardian Controller", "#ffffff") as color|null if(tgui_alert(admin, "Confirm creation.", "Guardian Controller", list("Yes", "No")) != "Yes") return diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 60c0f6d69ff..9653ea4a5c4 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -345,7 +345,12 @@ to_chat(usr, span_alert("[can_evac_or_fail_reason]")) return - var/reason = tgui_input_text(src, "What is the nature of your emergency? ([CALL_SHUTTLE_REASON_LENGTH] characters required.)", "Confirm Shuttle Call") + var/reason = tgui_input_text( + src, + "What is the nature of your emergency? ([CALL_SHUTTLE_REASON_LENGTH] characters required.)", + "Confirm Shuttle Call", + max_length = MAX_MESSAGE_LEN, + ) if(incapacitated) return @@ -1035,7 +1040,7 @@ malf_picker.processing_time += 10 var/area/apcarea = apc.area - var/datum/ai_module/destructive/nuke_station/doom_n_boom = locate(/datum/ai_module/destructive/nuke_station) in malf_picker.possible_modules["Destructive Modules"] + var/datum/ai_module/malf/destructive/nuke_station/doom_n_boom = locate(/datum/ai_module/malf/destructive/nuke_station) in malf_picker.possible_modules["Destructive Modules"] if(doom_n_boom && (is_type_in_list (apcarea, doom_n_boom.discount_areas)) && !(is_type_in_list (apcarea, doom_n_boom.hacked_command_areas))) doom_n_boom.hacked_command_areas += apcarea doom_n_boom.cost = max(50, 130 - (length(doom_n_boom.hacked_command_areas) * 20)) diff --git a/code/modules/mob/living/silicon/ai/ai_actions/remote_power.dm b/code/modules/mob/living/silicon/ai/ai_actions/remote_power.dm new file mode 100644 index 00000000000..fd45ed3d687 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/ai_actions/remote_power.dm @@ -0,0 +1,41 @@ +/datum/ai_module/power_apc + name = "Remote Power" + description = "remotely powers an APC from a distance" + one_purchase = TRUE + power_type = /datum/action/innate/ai/ranged/power_apc + unlock_text = span_notice("Remote APC power systems online.") + +/datum/action/innate/ai/ranged/power_apc + name = "remotely power APC" + desc = "Use to remotely power an APC." + button_icon = 'icons/obj/machines/wallmounts.dmi' + button_icon_state = "apc0" + ranged_mousepointer = 'icons/effects/mouse_pointers/supplypod_target.dmi' + enable_text = span_notice("You prepare to power any APC you see.") + disable_text = span_notice("You stop focusing on powering APCs.") + +/datum/action/innate/ai/ranged/power_apc/do_ability(mob/living/caller, atom/clicked_on) + + if (!isAI(caller)) + return FALSE + var/mob/living/silicon/ai/ai_caller = caller + + if(caller.incapacitated) + unset_ranged_ability(caller) + return FALSE + + if(!isapc(clicked_on)) + clicked_on.balloon_alert(ai_caller, "not an APC!") + return FALSE + + if(ai_caller.battery - 50 <= 0) + to_chat(ai_caller, span_warning("You do not have the battery to charge an APC!")) + return FALSE + + var/obj/machinery/power/apc/apc = clicked_on + var/obj/item/stock_parts/power_store/cell = apc.get_cell() + cell.give(STANDARD_BATTERY_CHARGE) + ai_caller.battery -= 50 + + + diff --git a/code/modules/mob/living/silicon/ai/ai_say.dm b/code/modules/mob/living/silicon/ai/ai_say.dm index 783dd8e38e1..0cf4d1a2fe9 100644 --- a/code/modules/mob/living/silicon/ai/ai_say.dm +++ b/code/modules/mob/living/silicon/ai/ai_say.dm @@ -98,7 +98,13 @@ to_chat(src, span_notice("Please wait [DisplayTimeText(announcing_vox - world.time)].")) return - var/message = tgui_input_text(src, "WARNING: Misuse of this verb can result in you being job banned. More help is available in 'Announcement Help'", "Announcement", src.last_announcement) + var/message = tgui_input_text( + src, + "WARNING: Misuse of this verb can result in you being job banned. More help is available in 'Announcement Help'", + "Announcement", + src.last_announcement, + max_length = MAX_MESSAGE_LEN, + ) if(!message || announcing_vox > world.time) return diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 34aa7a0714a..4adfe057c59 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -13,13 +13,13 @@ view_core() // Handle power damage (oxy) + if (battery <= 0) + to_chat(src, span_warning("Your backup battery's output drops below usable levels. It takes only a moment longer for your systems to fail, corrupted and unusable.")) + adjustOxyLoss(200) + if(aiRestorePowerRoutine) // Lost power - if (!battery) - to_chat(src, span_warning("Your backup battery's output drops below usable levels. It takes only a moment longer for your systems to fail, corrupted and unusable.")) - adjustOxyLoss(200) - else - battery-- + battery-- else // Gain Power if (battery < 200) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index dbfe987cac5..68579730e8d 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -335,7 +335,7 @@ if(new_dest) set_destination(new_dest) if("setid") - var/new_id = tgui_input_text(user, "Enter ID", "ID Assignment", id, MAX_NAME_LEN) + var/new_id = tgui_input_text(user, "Enter ID", "ID Assignment", id, max_length = MAX_NAME_LEN) if(new_id) set_id(new_id) name = "\improper MULEbot [new_id]" diff --git a/code/modules/mod/mod_core.dm b/code/modules/mod/mod_core.dm index 2c9845afe4c..5c8d4a2e2ee 100644 --- a/code/modules/mod/mod_core.dm +++ b/code/modules/mod/mod_core.dm @@ -358,7 +358,7 @@ /obj/item/mod/core/plasma/proc/on_mod_interaction(datum/source, mob/living/user, obj/item/thing) SIGNAL_HANDLER - return item_interaction(thing, user) + return item_interaction(user, thing) /obj/item/mod/core/plasma/item_interaction(mob/living/user, obj/item/tool, list/modifiers) return charge_plasma(tool, user) ? ITEM_INTERACT_SUCCESS : NONE diff --git a/code/modules/mod/modules/modules_medical.dm b/code/modules/mod/modules/modules_medical.dm index a74a5cfa4ca..93649e871a5 100644 --- a/code/modules/mod/modules/modules_medical.dm +++ b/code/modules/mod/modules/modules_medical.dm @@ -195,7 +195,7 @@ /obj/projectile/organ/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() - if(!ishuman(target)) + if(!isliving(target)) organ.forceMove(drop_location()) organ = null return diff --git a/code/modules/modular_computers/computers/item/pda.dm b/code/modules/modular_computers/computers/item/pda.dm index 172b786aaea..dc9f0d45669 100644 --- a/code/modules/modular_computers/computers/item/pda.dm +++ b/code/modules/modular_computers/computers/item/pda.dm @@ -327,7 +327,9 @@ starting_programs = list( /datum/computer_file/program/filemanager, /datum/computer_file/program/robotact, - /datum/computer_file/program/crew_manifest, // NOVA EDIT ADDITION - Manifests for borgs + /datum/computer_file/program/borg_monitor, + /datum/computer_file/program/atmosscan, + /datum/computer_file/program/crew_manifest, /datum/computer_file/program/messenger, // NOVA EDIT ADDITION - Messenger for borgs ) diff --git a/code/modules/modular_computers/file_system/programs/borg_monitor.dm b/code/modules/modular_computers/file_system/programs/borg_monitor.dm index 6f5b116a930..48966f2f261 100644 --- a/code/modules/modular_computers/file_system/programs/borg_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/borg_monitor.dm @@ -122,7 +122,7 @@ if(robot.stat == DEAD) //Dead borgs will listen to you no longer to_chat(user, span_warning("Error -- Could not open a connection to unit:[robot]")) return FALSE - var/message = tgui_input_text(user, "Message to be sent to remote cyborg", "Send Message") + var/message = tgui_input_text(user, "Message to be sent to remote cyborg", "Send Message", max_length = MAX_MESSAGE_LEN) if(!message) return FALSE send_message(message, robot, user) diff --git a/code/modules/modular_computers/file_system/programs/budgetordering.dm b/code/modules/modular_computers/file_system/programs/budgetordering.dm index af890f0740d..94b0d711c80 100644 --- a/code/modules/modular_computers/file_system/programs/budgetordering.dm +++ b/code/modules/modular_computers/file_system/programs/budgetordering.dm @@ -240,7 +240,7 @@ var/reason = "" if((requestonly && !self_paid) || !(computer.computer_id_slot?.GetID())) - reason = tgui_input_text(usr, "Reason", name) + reason = tgui_input_text(usr, "Reason", name, max_length = MAX_MESSAGE_LEN) if(isnull(reason) || ..()) return 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 0831e9245a8..f0bd3fa64db 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 @@ -165,7 +165,7 @@ switch(action) if("PDA_ringSet") var/mob/living/user = usr - var/new_ringtone = tgui_input_text(user, "Enter a new ringtone", "Ringtone", ringtone, encode = FALSE) + var/new_ringtone = tgui_input_text(user, "Enter a new ringtone", "Ringtone", ringtone, max_length = MAX_MESSAGE_LEN, encode = FALSE) if(!computer.can_interact(user)) computer.balloon_alert(user, "can't reach!") return FALSE @@ -401,8 +401,8 @@ chat.can_reply = FALSE return var/target_name = target.computer.saved_identification - var/input_message = tgui_input_text(user, "Enter [mime_mode ? "emojis":"a message"]", "NT Messaging[target_name ? " ([target_name])" : ""]", encode = FALSE) - send_message(user, input_message, list(chat), subtle = subtle) + var/input_message = tgui_input_text(user, "Enter [mime_mode ? "emojis":"a message"]", "NT Messaging[target_name ? " ([target_name])" : ""]", max_length = MAX_MESSAGE_LEN, encode = FALSE) + send_message(user, input_message, list(chat), subtle = subtle) // NOVA EDIT CHANGE - ORIGINAL: send_message(user, input_message, list(chat)) /// Helper proc that sends a message to everyone /datum/computer_file/program/messenger/proc/send_message_to_all(mob/living/user, message) 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 8f1eef074d4..ce7bb949b7b 100644 --- a/code/modules/modular_computers/file_system/programs/virtual_pet.dm +++ b/code/modules/modular_computers/file_system/programs/virtual_pet.dm @@ -54,22 +54,47 @@ GLOBAL_LIST_EMPTY(virtual_pets_list) var/static/list/hat_selections = list( /obj/item/clothing/head/hats/tophat = 1, /obj/item/clothing/head/fedora = 1, + /obj/item/clothing/head/soft/fishing_hat = 1, + /obj/item/cigarette/dart = 1, /obj/item/clothing/head/hats/bowler = 2, /obj/item/clothing/head/hats/warden/police = 2, + /obj/item/clothing/head/wizard/tape = 2, + /obj/item/clothing/head/utility/hardhat/cakehat/energycake = 2, + /obj/item/clothing/head/cowboy/bounty = 2, /obj/item/clothing/head/hats/warden/red = 3, /obj/item/clothing/head/hats/caphat = 3, + /obj/item/clothing/head/costume/crown/fancy = 3, + ) + ///hat options that are locked behind achievements + var/static/list/cheevo_hats = list( + /obj/item/clothing/head/soft/fishing_hat = /datum/award/achievement/skill/legendary_fisher, + /obj/item/cigarette/dart = /datum/award/achievement/misc/cigarettes, + /obj/item/clothing/head/wizard/tape = /datum/award/achievement/misc/grand_ritual_finale, + /obj/item/clothing/head/utility/hardhat/cakehat/energycake = /datum/award/achievement/misc/cayenne_disk, + /obj/item/clothing/head/cowboy/bounty = /datum/award/achievement/misc/hot_damn, + /obj/item/clothing/head/costume/crown/fancy = /datum/award/achievement/misc/debt_extinguished, + ) + ///A list of hats that override the hat offsets and transform variable + var/static/list/special_hat_placement = list( + /obj/item/cigarette/dart = list( + "west" = list(2,-1), + "east" = list(-2,-1), + "north" = list(0,0), + "south" = list(0, -3), + "transform" = list(1, 1), + ), ) ///hologram hat we have selected for our pet var/list/selected_hat = list() - ///area we have picked as dropoff location for petfeed - var/area/selected_area ///manage hat offsets for when we turn directions var/static/list/hat_offsets = list( "west" = list(0,1), "east" = list(0,1), "north" = list(1,1), - "south" = list(0,1), + "south" = list(1,1), ) + ///area we have picked as dropoff location for petfeed + var/area/selected_area ///possible colors our pet can have var/static/list/possible_colors= list( "white" = null, //default color state @@ -171,12 +196,11 @@ GLOBAL_LIST_EMPTY(virtual_pets_list) /datum/computer_file/program/virtual_pet/proc/set_hat_offsets(new_dir) var/direction_text = dir2text(new_dir) - var/list/offsets_list = hat_offsets[direction_text] - if(isnull(offsets_list)) - return + var/hat_type = selected_hat["type"] + var/list/offsets_list = special_hat_placement[hat_type]?[direction_text] || hat_offsets[direction_text] var/mutable_appearance/hat_appearance = selected_hat["appearance"] - hat_appearance.pixel_x = offsets_list[1] - hat_appearance.pixel_y = offsets_list[2] + hat_appearance.pixel_w = offsets_list[1] + hat_appearance.pixel_z = offsets_list[2] + selected_hat["worn_offset"] pet.update_appearance(UPDATE_OVERLAYS) ///give our pet his hologram hat @@ -195,10 +219,15 @@ GLOBAL_LIST_EMPTY(virtual_pets_list) if(length(selected_hat)) var/mutable_appearance/our_selected_hat = selected_hat["appearance"] var/mutable_appearance/hat_preview = mutable_appearance(our_selected_hat.icon, our_selected_hat.icon_state) - hat_preview.pixel_y = -9 + hat_preview.pixel_y = -9 + selected_hat["worn_offset"] + var/list/spec_hat = special_hat_placement[selected_hat["type"]]?["south"] + if(spec_hat) + hat_preview.pixel_w += spec_hat[1] + hat_preview.pixel_z += spec_hat[2] + hat_preview.appearance_flags = RESET_COLOR pet_preview.add_overlay(hat_preview) - profile_picture = getFlatIcon(pet_preview) + profile_picture = getFlatIcon(pet_preview, no_anim = TRUE) COOLDOWN_START(src, alter_appearance_cooldown, 10 SECONDS) @@ -344,12 +373,13 @@ GLOBAL_LIST_EMPTY(virtual_pets_list) /datum/computer_file/program/virtual_pet/ui_data(mob/user) var/list/data = list() + var/obj/item/hat_type = selected_hat?["type"] data["currently_summoned"] = (pet.loc != computer) data["selected_area"] = (selected_area ? selected_area.name : "No location set") data["pet_state"] = get_pet_state() data["hunger"] = hunger data["maximum_hunger"] = max_hunger - data["pet_hat"] = (length(selected_hat) ? selected_hat["name"] : "none") + data["pet_hat"] = (hat_type ? initial(hat_type.name) : "none") data["can_reroll"] = COOLDOWN_FINISHED(src, area_reroll) data["can_summon"] = COOLDOWN_FINISHED(src, summon_cooldown) data["can_alter_appearance"] = COOLDOWN_FINISHED(src, alter_appearance_cooldown) @@ -415,9 +445,14 @@ GLOBAL_LIST_EMPTY(virtual_pets_list) for(var/type_index as anything in hat_selections) if(level >= hat_selections[type_index]) var/obj/item/hat = type_index + var/obj/item/hat_name = initial(hat.name) + if(length(SSachievements.achievements)) // The Achievements subsystem is active. + var/datum/award/required_cheevo = cheevo_hats[hat] + if(required_cheevo && !user.client.get_award_status(required_cheevo)) + hat_name = "LOCKED" data["hat_selections"] += list(list( "hat_id" = type_index, - "hat_name" = initial(hat.name), + "hat_name" = hat_name, )) data["possible_colors"] = list() @@ -461,12 +496,22 @@ GLOBAL_LIST_EMPTY(virtual_pets_list) if(isnull(chosen_type)) selected_hat.Cut() - else if((chosen_type in hat_selections)) - selected_hat["name"] = initial(chosen_type.name) - var/mutable_appearance/selected_hat_appearance = mutable_appearance(icon = initial(chosen_type.worn_icon), icon_state = initial(chosen_type.icon_state), layer = ABOVE_ALL_MOB_LAYER) - selected_hat_appearance.transform = selected_hat_appearance.transform.Scale(0.8, 1) - selected_hat["appearance"] = selected_hat_appearance - set_hat_offsets(pet.dir) + else if(hat_selections[chosen_type]) + var/datum/award/required_cheevo = cheevo_hats[chosen_type] + if(length(SSachievements.achievements) && required_cheevo && !ui.user.client.get_award_status(required_cheevo)) + to_chat(ui.user, span_info("This customization requires the \"[span_bold(initial(required_cheevo.name))]\ achievement to be unlocked.")) + else + selected_hat["type"] = chosen_type + var/state_to_use = initial(chosen_type.worn_icon_state) || initial(chosen_type.icon_state) + var/mutable_appearance/selected_hat_appearance = mutable_appearance(initial(chosen_type.worn_icon), state_to_use, appearance_flags = RESET_COLOR) + selected_hat["worn_offset"] = initial(chosen_type.worn_y_offset) + var/list/scale_list = special_hat_placement[chosen_type]?["scale"] + if(scale_list) + selected_hat_appearance.transform = selected_hat_appearance.transform.Scale(scale_list[1], scale_list[2]) + else + selected_hat_appearance.transform = selected_hat_appearance.transform.Scale(0.8, 1) + selected_hat["appearance"] = selected_hat_appearance + set_hat_offsets(pet.dir) var/chosen_color = params["chosen_color"] if(isnull(chosen_color)) diff --git a/code/modules/pai/pai.dm b/code/modules/pai/pai.dm index 9ae21ab82db..48a64ae52db 100644 --- a/code/modules/pai/pai.dm +++ b/code/modules/pai/pai.dm @@ -399,7 +399,13 @@ if(!master_ref) balloon_alert(user, "access denied: no master") return FALSE - var/new_laws = tgui_input_text(user, "Enter any additional directives you would like your pAI personality to follow. Note that these directives will not override the personality's allegiance to its imprinted master. Conflicting directives will be ignored.", "pAI Directive Configuration", laws.supplied[1], 300) + var/new_laws = tgui_input_text( + user, + "Enter any additional directives you would like your pAI personality to follow. Note that these directives will not override the personality's allegiance to its imprinted master. Conflicting directives will be ignored.", + "pAI Directive Configuration", + laws.supplied[1], + max_length = 300, + ) if(!new_laws || !master_ref) return FALSE add_supplied_law(0, new_laws) diff --git a/code/modules/paperwork/fax.dm b/code/modules/paperwork/fax.dm index fc1b986ce6d..09858d8375b 100644 --- a/code/modules/paperwork/fax.dm +++ b/code/modules/paperwork/fax.dm @@ -170,7 +170,7 @@ GLOBAL_VAR_INIT(nt_fax_department, pick("NT HR Department", "NT Legal Department /obj/machinery/fax/multitool_act(mob/living/user, obj/item/I) if (panel_open) return - var/new_fax_name = tgui_input_text(user, "Enter a new name for the fax machine.", "New Fax Name", , 128) + var/new_fax_name = tgui_input_text(user, "Enter a new name for the fax machine.", "New Fax Name", max_length = 128) if (!new_fax_name) return ITEM_INTERACT_SUCCESS if (new_fax_name != fax_name) diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm index f5f32ad4b75..dfba4a2c4b7 100644 --- a/code/modules/power/apc/apc_main.dm +++ b/code/modules/power/apc/apc_main.dm @@ -525,20 +525,24 @@ * This adds up the total static power usage for the apc's area, then draw that power usage from the grid or APC cell. */ /obj/machinery/power/apc/proc/early_process() - if(cell && cell.charge < cell.maxcharge) + if(!QDELETED(cell) && cell.charge < cell.maxcharge) last_charging = charging charging = APC_NOT_CHARGING if(isnull(area)) return var/total_static_energy_usage = 0 - total_static_energy_usage += APC_CHANNEL_IS_ON(lighting) * area.energy_usage[AREA_USAGE_STATIC_LIGHT] - total_static_energy_usage += APC_CHANNEL_IS_ON(equipment) * area.energy_usage[AREA_USAGE_STATIC_EQUIP] - total_static_energy_usage += APC_CHANNEL_IS_ON(environ) * area.energy_usage[AREA_USAGE_STATIC_ENVIRON] + if(operating) + total_static_energy_usage += APC_CHANNEL_IS_ON(lighting) * area.energy_usage[AREA_USAGE_STATIC_LIGHT] + total_static_energy_usage += APC_CHANNEL_IS_ON(equipment) * area.energy_usage[AREA_USAGE_STATIC_EQUIP] + total_static_energy_usage += APC_CHANNEL_IS_ON(environ) * area.energy_usage[AREA_USAGE_STATIC_ENVIRON] area.clear_usage() if(total_static_energy_usage) //Use power from static power users. - draw_energy(total_static_energy_usage) + var/grid_used = min(terminal?.surplus(), total_static_energy_usage) + terminal?.add_load(grid_used) + if(total_static_energy_usage > grid_used && !QDELETED(cell)) + cell.use(total_static_energy_usage - grid_used, force = TRUE) /obj/machinery/power/apc/proc/late_process(seconds_per_tick) if(icon_update_needed) @@ -558,9 +562,15 @@ flicker_hacked_icon() //dont use any power from that channel if we shut that power channel off - lastused_light = APC_CHANNEL_IS_ON(lighting) ? area.energy_usage[AREA_USAGE_LIGHT] + area.energy_usage[AREA_USAGE_STATIC_LIGHT] : 0 - lastused_equip = APC_CHANNEL_IS_ON(equipment) ? area.energy_usage[AREA_USAGE_EQUIP] + area.energy_usage[AREA_USAGE_STATIC_EQUIP] : 0 - lastused_environ = APC_CHANNEL_IS_ON(environ) ? area.energy_usage[AREA_USAGE_ENVIRON] + area.energy_usage[AREA_USAGE_STATIC_ENVIRON] : 0 + if(operating) + lastused_light = APC_CHANNEL_IS_ON(lighting) ? area.energy_usage[AREA_USAGE_LIGHT] + area.energy_usage[AREA_USAGE_STATIC_LIGHT] : 0 + lastused_equip = APC_CHANNEL_IS_ON(equipment) ? area.energy_usage[AREA_USAGE_EQUIP] + area.energy_usage[AREA_USAGE_STATIC_EQUIP] : 0 + lastused_environ = APC_CHANNEL_IS_ON(environ) ? area.energy_usage[AREA_USAGE_ENVIRON] + area.energy_usage[AREA_USAGE_STATIC_ENVIRON] : 0 + else + lastused_light = 0 + lastused_equip = 0 + lastused_environ = 0 + lastused_charge = charging == APC_CHARGING ? area.energy_usage[AREA_USAGE_APC_CHARGE] : 0 lastused_total = lastused_light + lastused_equip + lastused_environ + lastused_charge @@ -760,21 +770,6 @@ /obj/machinery/power/apc/proc/charge() return cell.charge -/// Draws energy from the connected grid. When there isn't enough surplus energy from the grid, draws the rest of the demand from its cell. Returns the energy used. -/obj/machinery/power/apc/proc/draw_energy(amount) - var/grid_used = min(terminal?.surplus(), amount) - terminal?.add_load(grid_used) - if(QDELETED(cell)) - return grid_used - var/cell_used = 0 - if(amount > grid_used) - cell_used += cell.use(amount - grid_used, force = TRUE) - return grid_used + cell_used - -/// Draws power from the connected grid. When there isn't enough surplus energy from the grid, draws the rest of the demand from its cell. Returns the energy used. -/obj/machinery/power/apc/proc/draw_power(amount) - return draw_energy(power_to_energy(amount)) - /*Power module, used for APC construction*/ /obj/item/electronics/apc name = "power control module" diff --git a/code/modules/power/floodlight.dm b/code/modules/power/floodlight.dm index ce7e662f1b6..7799018a238 100644 --- a/code/modules/power/floodlight.dm +++ b/code/modules/power/floodlight.dm @@ -69,33 +69,34 @@ if(state == FLOODLIGHT_NEEDS_SECURING) icon_state = "floodlight_c3" state = FLOODLIGHT_NEEDS_LIGHTS - return TRUE + return ITEM_INTERACT_SUCCESS else if(state == FLOODLIGHT_NEEDS_LIGHTS) icon_state = "floodlight_c2" state = FLOODLIGHT_NEEDS_SECURING - return TRUE - return FALSE + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING /obj/structure/floodlight_frame/wrench_act(mob/living/user, obj/item/tool) if(state != FLOODLIGHT_NEEDS_WIRES) - return FALSE + return ITEM_INTERACT_BLOCKING + balloon_alert(user, "deconstructing...") if(!tool.use_tool(src, user, 30, volume=50)) - return TRUE + return ITEM_INTERACT_BLOCKING new /obj/item/stack/sheet/iron(loc, 5) qdel(src) - return TRUE + return ITEM_INTERACT_SUCCESS /obj/structure/floodlight_frame/wirecutter_act(mob/living/user, obj/item/tool) if(state != FLOODLIGHT_NEEDS_SECURING) - return FALSE + return ITEM_INTERACT_BLOCKING icon_state = "floodlight_c1" state = FLOODLIGHT_NEEDS_WIRES new /obj/item/stack/cable_coil(loc, 5) - return TRUE + return ITEM_INTERACT_SUCCESS /obj/structure/floodlight_frame/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/stack/cable_coil) && state == FLOODLIGHT_NEEDS_WIRES) @@ -109,8 +110,11 @@ return if(istype(O, /obj/item/light/tube)) + if(state != FLOODLIGHT_NEEDS_LIGHTS) + balloon_alert(user, "construction not completed!") + return var/obj/item/light/tube/L = O - if(state == FLOODLIGHT_NEEDS_LIGHTS && L.status != 2) //Ready for a light tube, and not broken. + if(L.status != LIGHT_BROKEN) // light tube not broken. new /obj/machinery/power/floodlight(loc) qdel(src) qdel(O) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index c31870f2ad0..3fb98970ba4 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -167,7 +167,7 @@ return amount //Shuttles get free power, don't ask why var/obj/machinery/power/apc/local_apc = home.apc - if(isnull(local_apc)) + if(isnull(local_apc) || !local_apc.operating) return FALSE // Surplus from the grid. @@ -202,7 +202,7 @@ return amount var/obj/machinery/power/apc/my_apc = my_area.apc - if(isnull(my_apc) || QDELETED(my_apc.cell)) + if(isnull(my_apc) || !my_apc.operating || QDELETED(my_apc.cell)) return FALSE return my_apc.cell.use(amount, force = force) @@ -228,8 +228,9 @@ return amount //Shuttles get free power, don't ask why var/obj/machinery/power/apc/local_apc = home.apc - if(!local_apc) + if(isnull(local_apc) || !local_apc.operating) return FALSE + var/surplus = local_apc.surplus() if(surplus <= 0) //I don't know if powernet surplus can ever end up negative, but I'm just gonna failsafe it return FALSE diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index a895cbe88e4..c3bb92eec71 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -319,7 +319,7 @@ // Old Semi-Auto Rifle // /obj/item/gun/ballistic/automatic/surplus - name = "Surplus Rifle" + name = "surplus rifle" desc = "One of countless obsolete ballistic rifles that still sees use as a cheap deterrent. Uses 10mm ammo and its bulky frame prevents one-hand firing." icon_state = "surplus" worn_icon_state = null diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index 888b784ddf8..0317ead1928 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -192,7 +192,7 @@ spread = 50 /obj/item/gun/ballistic/rifle/rebarxbow - name = "Heated Rebar Crossbow" + name = "heated rebar crossbow" desc = "A handcrafted crossbow. \ Aside from conventional sharpened iron rods, it can also fire specialty ammo made from the atmos crystalizer - zaukerite, metallic hydrogen, and healium rods all work. \ Very slow to reload - you can craft the crossbow with a crowbar to loosen the crossbar, but risk a misfire, or worse..." @@ -265,7 +265,7 @@ . += "[initial(icon_state)]" + "_bolt_locked" /obj/item/gun/ballistic/rifle/rebarxbow/forced - name = "Stressed Rebar Crossbow" + name = "stressed rebar crossbow" desc = "Some idiot decided that they would risk shooting themselves in the face if it meant they could have a draw this crossbow a bit faster. Hopefully, it was worth it." // Feel free to add a recipe to allow you to change it back if you would like, I just wasn't sure if you could have two recipes for the same thing. can_misfire = TRUE @@ -274,7 +274,7 @@ accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/rebarxbow/force /obj/item/gun/ballistic/rifle/rebarxbow/syndie - name = "Syndicate Rebar Crossbow" + name = "syndicate rebar crossbow" desc = "The syndicate liked the bootleg rebar crossbow NT engineers made, so they showed what it could be if properly developed. \ Holds three shots without a chance of exploding, and features a built in scope. Compatible with all known crossbow ammunition." icon_state = "rebarxbowsyndie" diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm index 2915e3e59bd..2a80c366f03 100644 --- a/code/modules/projectiles/projectile/bullets/rifle.dm +++ b/code/modules/projectiles/projectile/bullets/rifle.dm @@ -92,7 +92,7 @@ /obj/projectile/bullet/rebar/syndie name = "rebar" icon_state = "rebar" - damage = 55 + damage = 45 speed = 0.4 dismemberment = 2 //It's a budget sniper rifle. armour_penetration = 20 //A bit better versus armor. Gets past anti laser armor or a vest, but doesnt wound proc on sec armor. @@ -140,7 +140,7 @@ /obj/projectile/bullet/rebar/hydrogen name = "metallic hydrogen bolt" icon_state = "rebar_hydrogen" - damage = 55 + damage = 35 speed = 0.6 projectile_piercing = PASSMOB|PASSVEHICLE projectile_phasing = ~(PASSMOB|PASSVEHICLE) @@ -148,12 +148,11 @@ dismemberment = 0 //goes through clean. damage_type = BRUTE armour_penetration = 30 //very pointy. - wound_bonus = -15 - bare_wound_bonus = 10 + wound_bonus = -100 + bare_wound_bonus = 0 shrapnel_type = /obj/item/ammo_casing/rebar/hydrogen embed_type = /datum/embed_data/rebar_hydrogen embed_falloff_tile = -3 - shrapnel_type = /obj/item/ammo_casing/rebar/hydrogen accurate_range = 205 //15 tiles before falloff starts to kick in /obj/projectile/bullet/rebar/hydrogen/Impact(atom/A) diff --git a/code/modules/reagents/chemistry/chem_wiki_render.dm b/code/modules/reagents/chemistry/chem_wiki_render.dm index 2bb6bd7175b..34bc1e1a6f1 100644 --- a/code/modules/reagents/chemistry/chem_wiki_render.dm +++ b/code/modules/reagents/chemistry/chem_wiki_render.dm @@ -9,7 +9,12 @@ ADMIN_VERB(generate_wikichem_list, R_DEBUG, "Parse Wikichems", "Parse and genera |- "} - var/input_text = tgui_input_text(user, "Input a name of a reagent, or a series of reagents split with a comma (no spaces) to get its wiki table entry", "Recipe") //95% of the time, the reagent type is a lowercase, no spaces / underscored version of the name + var/input_text = tgui_input_text( + user, + "Input a name of a reagent, or a series of reagents split with a comma (no spaces) to get its wiki table entry", + "Recipe", + max_length = MAX_MESSAGE_LEN, + ) //95% of the time, the reagent type is a lowercase, no spaces / underscored version of the name if(!input_text) to_chat(user, "Input was blank!") return diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 9f958546a7c..7727d9a9776 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -400,7 +400,7 @@ if("save_recording") if(!is_operational) return - var/name = tgui_input_text(ui.user, "What do you want to name this recipe?", "Recipe Name", MAX_NAME_LEN) + var/name = tgui_input_text(ui.user, "What do you want to name this recipe?", "Recipe Name", max_length = MAX_NAME_LEN) if(!ui.user.can_perform_action(src, ALLOW_SILICON_REACH)) return if(saved_recipes[name] && tgui_alert(ui.user, "\"[name]\" already exists, do you want to overwrite it?",, list("Yes", "No")) == "No") diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 7e986d81f37..7aa53290184 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -480,11 +480,13 @@ if(ispath(selected_container, /obj/item/reagent_containers/cup/vial) || ispath(selected_container, /obj/item/reagent_containers/syringe/smartdart)) item_name_default = "[master_reagent.name] [item_name_default]" // NOVA EDIT ADDITION END - var/item_name = tgui_input_text(usr, + var/item_name = tgui_input_text( + usr, "Container name", "Name", item_name_default, - MAX_NAME_LEN) + max_length = MAX_NAME_LEN, + ) if(!item_name) return FALSE diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 75fc8aef892..15c79e4c150 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -103,7 +103,7 @@ if (IS_WRITING_UTENSIL(tool)) if(!user.can_write(tool)) return - var/custom_label = tgui_input_text(user, "What would you like to label the blood pack?", "Blood Pack", name, MAX_NAME_LEN) + var/custom_label = tgui_input_text(user, "What would you like to label the blood pack?", "Blood Pack", name, max_length = MAX_NAME_LEN) if(!user.can_perform_action(src)) return if(user.get_active_held_item() != tool) diff --git a/code/modules/research/designs/electronics_designs.dm b/code/modules/research/designs/electronics_designs.dm index ce607639e22..b1da9f2c1c0 100644 --- a/code/modules/research/designs/electronics_designs.dm +++ b/code/modules/research/designs/electronics_designs.dm @@ -33,7 +33,19 @@ id = "ai_cam_upgrade" build_type = PROTOLATHE | AWAY_LATHE materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/glass =SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/gold = SHEET_MATERIAL_AMOUNT * 7.5, /datum/material/silver = SHEET_MATERIAL_AMOUNT * 7.5, /datum/material/diamond = SHEET_MATERIAL_AMOUNT * 10, /datum/material/plasma = SHEET_MATERIAL_AMOUNT * 5) - build_path = /obj/item/surveillance_upgrade + build_path = /obj/item/aiupgrade/surveillance_upgrade + category = list( + RND_CATEGORY_AI + RND_SUBCATEGORY_AI_UPGRADES + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/ai_power_transfer + name = "AI Power Transfer Update" + desc = "An upgrade package that lets an AI charge an APC from a distance" + id = "ai_power_upgrade" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/glass =SHEET_MATERIAL_AMOUNT * 2.5) + build_path = /obj/item/aiupgrade/power_transfer category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_UPGRADES ) diff --git a/code/modules/research/techweb/nodes/robo_nodes.dm b/code/modules/research/techweb/nodes/robo_nodes.dm index 9cfa3028961..2b43ba0e425 100644 --- a/code/modules/research/techweb/nodes/robo_nodes.dm +++ b/code/modules/research/techweb/nodes/robo_nodes.dm @@ -69,7 +69,7 @@ /datum/techweb_node/ai_laws id = TECHWEB_NODE_AI_LAWS - display_name = "Advanced AI Laws" + display_name = "Advanced AI Upgrades" description = "Delving into sophisticated AI directives, with hopes that they won't lead to humanity's extinction." prereq_ids = list(TECHWEB_NODE_AI) design_ids = list( @@ -94,6 +94,7 @@ "freeformcore_module", "onehuman_module", "purge_module", + "ai_power_upgrade" ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_COMMAND) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 9a416372a28..72d79b20ec5 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -700,7 +700,7 @@ return CONTEXTUAL_SCREENTIP_SET /obj/item/slimepotion/slime/sentience/click_alt(mob/living/user) - potion_reason = tgui_input_text(user, "Enter reason for offering potion", "Intelligence Potion", potion_reason, multiline = TRUE) + potion_reason = tgui_input_text(user, "Enter reason for offering potion", "Intelligence Potion", potion_reason, max_length = MAX_MESSAGE_LEN, multiline = TRUE) return CLICK_ACTION_SUCCESS /obj/item/slimepotion/slime/sentience/attack(mob/living/dumb_mob, mob/user) diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index bfbed9a3495..7cfa8afeff8 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -136,7 +136,7 @@ minor_announce("Early launch authorization revoked, [remaining] authorizations needed") acted_recently += user - ui_interact(user) + SStgui.update_user_uis(user, src) /obj/machinery/computer/emergency_shuttle/proc/authorize(mob/living/user, source) var/obj/item/card/id/ID = user.get_idcard(TRUE) @@ -159,7 +159,7 @@ /obj/machinery/computer/emergency_shuttle/proc/clear_recent_action(mob/user) acted_recently -= user if (!QDELETED(user)) - ui_interact(user) + SStgui.update_user_uis(user, src) /obj/machinery/computer/emergency_shuttle/process() // Launch check is in process in case auth_need changes for some reason diff --git a/code/modules/spells/spell_types/list_target/telepathy.dm b/code/modules/spells/spell_types/list_target/telepathy.dm index 9d512f5a0b9..861fc49732d 100644 --- a/code/modules/spells/spell_types/list_target/telepathy.dm +++ b/code/modules/spells/spell_types/list_target/telepathy.dm @@ -22,7 +22,7 @@ if(. & SPELL_CANCEL_CAST) return - message = tgui_input_text(owner, "What do you wish to whisper to [cast_on]?", "[src]") + message = tgui_input_text(owner, "What do you wish to whisper to [cast_on]?", "[src]", max_length = MAX_MESSAGE_LEN) if(QDELETED(src) || QDELETED(owner) || QDELETED(cast_on) || !can_cast_spell()) return . | SPELL_CANCEL_CAST diff --git a/code/modules/spells/spell_types/self/voice_of_god.dm b/code/modules/spells/spell_types/self/voice_of_god.dm index b1efaabd2a8..e7602a214f1 100644 --- a/code/modules/spells/spell_types/self/voice_of_god.dm +++ b/code/modules/spells/spell_types/self/voice_of_god.dm @@ -25,7 +25,7 @@ if(. & SPELL_CANCEL_CAST) return - command = tgui_input_text(cast_on, "Speak with the Voice of God", "Command") + command = tgui_input_text(cast_on, "Speak with the Voice of God", "Command", max_length = MAX_MESSAGE_LEN) if(QDELETED(src) || QDELETED(cast_on) || !can_cast_spell()) return . | SPELL_CANCEL_CAST if(!command) diff --git a/code/modules/surgery/advanced/brainwashing.dm b/code/modules/surgery/advanced/brainwashing.dm index 3b46817e836..6f34131a1d0 100644 --- a/code/modules/surgery/advanced/brainwashing.dm +++ b/code/modules/surgery/advanced/brainwashing.dm @@ -70,7 +70,7 @@ success_sound = 'sound/items/taperecorder/taperecorder_close.ogg' /datum/surgery_step/brainwash/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - objective = tgui_input_text(user, "Choose the objective to imprint on your victim's brain", "Brainwashing") + objective = tgui_input_text(user, "Choose the objective to imprint on your victim's brain", "Brainwashing", max_length = MAX_MESSAGE_LEN) if(!objective) return SURGERY_STEP_FAIL display_results( diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index c79d3dacea4..3ec7abd7b82 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -466,11 +466,12 @@ * required_bodytype - A bodytype flag requirement to get this damage (ex: BODYTYPE_ORGANIC) * wound_bonus - Additional bonus chance to get a wound. * bare_wound_bonus - Additional bonus chance to get a wound if the bodypart is naked. + * wound_clothing - If this should damage clothing. * sharpness - Flag on whether the attack is edged or pointy * attack_direction - The direction the bodypart is attacked from, used to send blood flying in the opposite direction. * damage_source - The source of damage, typically a weapon. */ -/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, blocked = 0, updating_health = TRUE, forced = FALSE, required_bodytype = null, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null, damage_source) +/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, blocked = 0, updating_health = TRUE, forced = FALSE, required_bodytype = null, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null, damage_source, wound_clothing = TRUE) SHOULD_CALL_PARENT(TRUE) var/hit_percent = forced ? 1 : (100-blocked)/100 @@ -557,7 +558,7 @@ var/obj/item/stack/medical/gauze/our_gauze = current_gauze our_gauze.get_hit() //NOVA EDIT ADDITION END - MEDICAL - check_wounding(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus, attack_direction, damage_source = damage_source) + check_wounding(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus, attack_direction, damage_source = damage_source, wound_clothing = wound_clothing) for(var/datum/wound/iter_wound as anything in wounds) iter_wound.receive_damage(wounding_type, wounding_dmg, wound_bonus, damage_source) diff --git a/code/modules/surgery/bodyparts/wounds.dm b/code/modules/surgery/bodyparts/wounds.dm index fa1f9a9c5d2..66278669d8c 100644 --- a/code/modules/surgery/bodyparts/wounds.dm +++ b/code/modules/surgery/bodyparts/wounds.dm @@ -1,5 +1,5 @@ /// Allows us to roll for and apply a wound without actually dealing damage. Used for aggregate wounding power with pellet clouds -/obj/item/bodypart/proc/painless_wound_roll(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus, sharpness=NONE) +/obj/item/bodypart/proc/painless_wound_roll(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus, sharpness=NONE, wound_clothing) SHOULD_CALL_PARENT(TRUE) if(!owner || wounding_dmg <= WOUND_MINIMUM_DAMAGE || wound_bonus == CANT_WOUND || HAS_TRAIT(owner, TRAIT_GODMODE)) @@ -34,7 +34,7 @@ wounding_type = WOUND_BLUNT if ((dismemberable_by_wound() || dismemberable_by_total_damage()) && try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus)) return - return check_wounding(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus) + return check_wounding(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus, wound_clothing) /** * check_wounding() is where we handle rolling for, selecting, and applying a wound if we meet the criteria @@ -47,8 +47,9 @@ * * damage- How much damage is tied to this attack, since wounding potential scales with damage in an attack (see: WOUND_DAMAGE_EXPONENT) * * wound_bonus- The wound_bonus of an attack * * bare_wound_bonus- The bare_wound_bonus of an attack + * * wound_clothing- If this should damage clothing. */ -/obj/item/bodypart/proc/check_wounding(woundtype, damage, wound_bonus, bare_wound_bonus, attack_direction, damage_source) +/obj/item/bodypart/proc/check_wounding(woundtype, damage, wound_bonus, bare_wound_bonus, attack_direction, damage_source, wound_clothing) SHOULD_CALL_PARENT(TRUE) RETURN_TYPE(/datum/wound) @@ -72,7 +73,7 @@ var/base_roll = rand(1, round(damage ** WOUND_DAMAGE_EXPONENT)) var/injury_roll = base_roll - injury_roll += check_woundings_mods(woundtype, damage, wound_bonus, bare_wound_bonus) + injury_roll += check_woundings_mods(woundtype, damage, wound_bonus, bare_wound_bonus, wound_clothing) var/list/series_wounding_mods = check_series_wounding_mods() if(injury_roll > WOUND_DISMEMBER_OUTRIGHT_THRESH && prob(get_damage() / max_damage * 100) && can_dismember()) @@ -240,7 +241,7 @@ * Arguments: * * It's the same ones on [/obj/item/bodypart/proc/receive_damage] */ -/obj/item/bodypart/proc/check_woundings_mods(wounding_type, damage, wound_bonus, bare_wound_bonus) +/obj/item/bodypart/proc/check_woundings_mods(wounding_type, damage, wound_bonus, bare_wound_bonus, wound_clothing) SHOULD_CALL_PARENT(TRUE) var/armor_ablation = 0 @@ -252,10 +253,12 @@ for(var/obj/item/clothing/clothes as anything in clothing) // unlike normal armor checks, we tabluate these piece-by-piece manually so we can also pass on appropriate damage the clothing's limbs if necessary armor_ablation += clothes.get_armor_rating(WOUND) - if(wounding_type == WOUND_SLASH) - clothes.take_damage_zone(body_zone, damage, BRUTE) - else if(wounding_type == WOUND_BURN && damage >= 10) // lazy way to block freezing from shredding clothes without adding another var onto apply_damage() - clothes.take_damage_zone(body_zone, damage, BURN) + // Should attack also cause damage to the clothes? + if (wound_clothing) + if(wounding_type == WOUND_SLASH) + clothes.take_damage_zone(body_zone, damage, BRUTE) + else if(wounding_type == WOUND_BURN) + clothes.take_damage_zone(body_zone, damage, BURN) if(!armor_ablation) injury_mod += bare_wound_bonus diff --git a/code/modules/surgery/organs/internal/eyes/_eyes.dm b/code/modules/surgery/organs/internal/eyes/_eyes.dm index 2e31eb0a9f5..614e1494c4c 100644 --- a/code/modules/surgery/organs/internal/eyes/_eyes.dm +++ b/code/modules/surgery/organs/internal/eyes/_eyes.dm @@ -156,8 +156,19 @@ //var/obj/item/bodypart/head/my_head = parent.get_bodypart(BODY_ZONE_HEAD) // NOVA EDIT REMOVAL - moved up a few lines if(my_head) if(my_head.head_flags & HEAD_EYECOLOR) - eye_right.color = eye_color_right - eye_left.color = eye_color_left + if(IS_ROBOTIC_ORGAN(src) || !my_head.draw_color || (parent.appears_alive() && !HAS_TRAIT(parent, TRAIT_KNOCKEDOUT))) + // show the eyes as open + eye_right.color = eye_color_right + eye_left.color = eye_color_left + else + // show the eyes as closed, and as such color them like eyelids wound be colored + var/list/base_color = rgb2num(my_head.draw_color, COLORSPACE_HSL) + base_color[2] *= 0.85 + base_color[3] *= 0.85 + var/eyelid_color = rgb(base_color[1], base_color[2], base_color[3], (length(base_color) >= 4 ? base_color[4] : null), COLORSPACE_HSL) + eye_right.color = eyelid_color + eye_left.color = eyelid_color + if(my_head.worn_face_offset) my_head.worn_face_offset.apply_offset(eye_left) my_head.worn_face_offset.apply_offset(eye_right) diff --git a/code/modules/surgery/organs/internal/heart/heart_anomalock.dm b/code/modules/surgery/organs/internal/heart/heart_anomalock.dm index 5cdb2794235..4a80f1857a0 100644 --- a/code/modules/surgery/organs/internal/heart/heart_anomalock.dm +++ b/code/modules/surgery/organs/internal/heart/heart_anomalock.dm @@ -4,7 +4,7 @@ #define DOAFTER_IMPLANTING_HEART "implanting" /obj/item/organ/internal/heart/cybernetic/anomalock - name = "Voltaic Combat Cyberheart" + name = "voltaic combat cyberheart" desc = "A cutting-edge cyberheart, originally designed for Nanotrasen killsquad usage but later declassified for normal research. Voltaic technology allows the heart to keep the body upright in dire circumstances, alongside redirecting anomalous flux energy to fully shield the user from shocks and electro-magnetic pulses. Requires a refined Flux core as a power source." icon_state = "anomalock_heart" bleed_prevention = TRUE diff --git a/code/modules/surgery/organs/internal/vocal_cords/_vocal_cords.dm b/code/modules/surgery/organs/internal/vocal_cords/_vocal_cords.dm index 9183c7eb809..3a14adee63d 100644 --- a/code/modules/surgery/organs/internal/vocal_cords/_vocal_cords.dm +++ b/code/modules/surgery/organs/internal/vocal_cords/_vocal_cords.dm @@ -61,7 +61,7 @@ . = ..() if(!.) return - var/command = tgui_input_text(owner, "Speak with the Voice of God", "Command") + var/command = tgui_input_text(owner, "Speak with the Voice of God", "Command", max_length = MAX_MESSAGE_LEN) if(!command) return if(QDELETED(src) || QDELETED(owner)) @@ -103,7 +103,7 @@ /datum/action/item_action/organ_action/use/adamantine_vocal_cords/Trigger(trigger_flags) if(!IsAvailable(feedback = TRUE)) return - var/message = tgui_input_text(owner, "Resonate a message to all nearby golems", "Resonate") + var/message = tgui_input_text(owner, "Resonate a message to all nearby golems", "Resonate", max_length = MAX_MESSAGE_LEN) if(!message) return if(QDELETED(src) || QDELETED(owner)) diff --git a/code/modules/surgery/revival.dm b/code/modules/surgery/revival.dm index c99ea9a0309..e7af1e40b87 100644 --- a/code/modules/surgery/revival.dm +++ b/code/modules/surgery/revival.dm @@ -47,6 +47,13 @@ return FALSE return TRUE +/datum/surgery/revival/mechanic/is_valid_target(mob/living/patient) + if (iscarbon(patient)) + return FALSE + if (!(patient.mob_biotypes & (MOB_ROBOTIC|MOB_HUMANOID))) + return FALSE + return TRUE + /datum/surgery_step/revive name = "shock brain (defibrillator)" implements = list( diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 1fa3a74257c..5494889bd03 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -201,7 +201,7 @@ target.add_mood_event("mild_surgery", /datum/mood_event/mild_surgery) // NOVA EDIT ADDITION - Adds additional mood effects to surgeries return if(target.stat >= UNCONSCIOUS) - var/datum/mood_event/surgery/target_mood_event = target.mob_mood.mood_events[SURGERY_MOOD_CATEGORY] + var/datum/mood_event/surgery/target_mood_event = target.mob_mood?.mood_events[SURGERY_MOOD_CATEGORY] if(!target_mood_event || target_mood_event.surgery_completed) //don't give sleeping mobs trauma. that said, if they fell asleep mid-surgery after already getting the bad mood, lets make sure they wake up to a (hopefully) happy memory. return target.add_mood_event("severe_surgery", /datum/mood_event/severe_surgery) // NOVA EDIT ADDITION - Adds additional mood effects to surgeries diff --git a/code/modules/transport/tram/tram_doors.dm b/code/modules/transport/tram/tram_doors.dm index 653b5cbabb5..6d5231db96c 100644 --- a/code/modules/transport/tram/tram_doors.dm +++ b/code/modules/transport/tram/tram_doors.dm @@ -211,7 +211,7 @@ if(!hasPower() && density) balloon_alert(user, "pulling emergency exit...") if(do_after(user, 4 SECONDS, target = src)) - try_to_crowbar(null, user, TRUE) + try_to_crowbar(src, user, TRUE) return TRUE /** diff --git a/code/modules/unit_tests/fish_unit_tests.dm b/code/modules/unit_tests/fish_unit_tests.dm index 809bf60d230..1bda9875c26 100644 --- a/code/modules/unit_tests/fish_unit_tests.dm +++ b/code/modules/unit_tests/fish_unit_tests.dm @@ -128,7 +128,7 @@ description = "It smells fishy." /obj/structure/aquarium/traits - allow_breeding = TRUE + reproduction_and_growth = TRUE var/obj/item/fish/testdummy/crossbreeder/crossbreeder var/obj/item/fish/testdummy/cloner/cloner var/obj/item/fish/testdummy/sterile/sterile @@ -155,7 +155,7 @@ fish_traits = list(/datum/fish_trait/no_mating) /obj/structure/aquarium/evolution - allow_breeding = TRUE + reproduction_and_growth = TRUE var/obj/item/fish/testdummy/evolve/evolve var/obj/item/fish/testdummy/evolve_two/evolve_two @@ -182,7 +182,9 @@ new_fish_type = /obj/item/fish/clownfish new_traits = list(/datum/fish_trait/dummy/two) removed_traits = list(/datum/fish_trait/dummy) + show_on_wiki = FALSE +///This is used by both fish_evolution and fish_growth unit tests. /datum/fish_evolution/dummy/two new_fish_type = /obj/item/fish/goldfish @@ -190,6 +192,12 @@ . = ..() probability = 0 //works around the global list initialization skipping abstract/impossible evolutions. +///During the fish_growth unit test, we spawn a fish outside of the aquarium and check that this actually stops it from growing +/datum/fish_evolution/dummy/two/growth_checks(obj/item/fish/source, seconds_per_tick, growth) + . = ..() + if(!isaquarium(source.loc)) + return COMPONENT_DONT_GROW + ///A test that checks that fishing portals can be linked and function as expected /datum/unit_test/fish_portal_gen_linking @@ -312,29 +320,49 @@ run_loc_floor_bottom_left.ChangeTurf(original_turf_type, original_turf_baseturfs) return ..() -///Check that you can actually raise a chasm crab without errors. -/datum/unit_test/raise_a_chasm_crab +///Check that the fish growth component works. +/datum/unit_test/fish_growth -/datum/unit_test/raise_a_chasm_crab/Run() +/datum/unit_test/fish_growth/Run() var/obj/structure/aquarium/crab/aquarium = allocate(/obj/structure/aquarium/crab) - SEND_SIGNAL(aquarium.crabbie, COMSIG_FISH_LIFE, 1) //give the fish growth component a small push. + var/list/growth_comps = aquarium.crabbie.GetComponents(/datum/component/fish_growth) //Can't use GetComponent() without s because the comp is dupe-selective + var/datum/component/fish_growth/crab_growth = growth_comps[1] + + crab_growth.on_fish_life(aquarium.crabbie, seconds_per_tick = 1) //give the fish growth component a small push. + var/mob/living/basic/mining/lobstrosity/juvenile/lobster = locate() in aquarium.loc + TEST_ASSERT(lobster, "The lobstrosity didn't spawn at all. chasm crab maturation: [crab_growth.maturation]%.") TEST_ASSERT_EQUAL(lobster.loc, get_turf(aquarium), "The lobstrosity didn't spawn on the aquarium's turf") TEST_ASSERT(QDELETED(aquarium.crabbie), "The test aquarium's chasm crab didn't delete itself.") + TEST_ASSERT_EQUAL(lobster.name, "Crabbie", "The lobstrosity didn't inherit the aquarium chasm crab's custom name") allocated |= lobster //make sure it's allocated and thus properly deleted when the test is over + //While ideally impossible to have all traits because of incompatible ones, I want to be sure they don't error out. for(var/trait_type in GLOB.fish_traits) var/datum/fish_trait/trait = GLOB.fish_traits[trait_type] trait.apply_to_mob(lobster) + var/obj/item/fish/testdummy/dummy = allocate(/obj/item/fish/testdummy) + var/datum/component/fish_growth/dummy_growth = dummy.AddComponent(/datum/component/fish_growth, /datum/fish_evolution/dummy/two, 1 SECONDS, use_drop_loc = FALSE) + dummy.last_feeding = world.time + dummy_growth.on_fish_life(dummy, seconds_per_tick = 1) + TEST_ASSERT(!QDELETED(dummy), "The fish has grown when it shouldn't have") + dummy.forceMove(aquarium) + dummy_growth.on_fish_life(dummy, seconds_per_tick = 1) + var/obj/item/fish/dummy_boogaloo = locate(/datum/fish_evolution/dummy/two::new_fish_type) in aquarium + TEST_ASSERT(dummy_boogaloo, "The new fish type cannot be found inside the aquarium") + /obj/structure/aquarium/crab - allow_breeding = TRUE //needed for growing up + reproduction_and_growth = TRUE //needed for growing up ///Our test subject var/obj/item/fish/chasm_crab/instant_growth/crabbie /obj/structure/aquarium/crab/Initialize(mapload) . = ..() crabbie = new(src) + crabbie.name = "Crabbie" + crabbie.last_feeding = world.time + crabbie.AddComponent(/datum/component/fish_growth, crabbie.lob_type, 1 SECONDS) /obj/structure/aquarium/crab/Exited(atom/movable/gone) . = ..() @@ -342,7 +370,6 @@ crabbie = null /obj/item/fish/chasm_crab/instant_growth - growth_rate = 100 fish_traits = list() //We don't want to end up applying traits twice on the resulting lobstrosity /datum/unit_test/fish_sources @@ -452,6 +479,13 @@ /obj/item/fish/testdummy/food average_weight = FISH_WEIGHT_BITE_DIVISOR * 2 //One bite, it's death; the other, it's gone. +///Check that nothing wrong happens when randomizing size and weight of a fish +/datum/unit_test/fish_randomize_size_weight + +/datum/unit_test/fish_randomize_size_weight/Run() + var/obj/item/storage/box/fish_debug/box = allocate(/obj/item/storage/box/fish_debug) + for(var/obj/item/fish/fish as anything in box) + fish.randomize_size_and_weight() + #undef FISH_REAGENT_AMOUNT #undef TRAIT_FISH_TESTING - diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm index 1849b9c9533..74aada214c8 100644 --- a/code/modules/uplink/uplink_items/job.dm +++ b/code/modules/uplink/uplink_items/job.dm @@ -150,7 +150,7 @@ name = "Syndicate Rebar Crossbow" desc = "A much more professional version of the engineer's bootleg rebar crossbow. 3 shot mag, quicker loading, and better ammo. Owners manual included." item = /obj/item/storage/box/syndie_kit/rebarxbowsyndie - cost = 10 + cost = 12 restricted_roles = list(JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER, JOB_ATMOSPHERIC_TECHNICIAN) /datum/uplink_item/role_restricted/magillitis_serum diff --git a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm index 7254f95c946..3f7dfafc908 100644 --- a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm @@ -34,6 +34,15 @@ workmech = null return ..() +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/use_tool(atom/target, mob/living/user, delay, amount, volume, datum/callback/extra_checks) + return do_after_mecha(target, user, delay) + +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/do_after_checks(atom/target) + // Gotta be close to the target + if(!loc.Adjacent(target)) + return FALSE + return ..() + /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/action(mob/living/source, atom/target, list/modifiers) if(!action_checks(target)) return diff --git a/code/modules/vehicles/mecha/mecha_control_console.dm b/code/modules/vehicles/mecha/mecha_control_console.dm index d31bd5a5bd2..a9dbca0e07d 100644 --- a/code/modules/vehicles/mecha/mecha_control_console.dm +++ b/code/modules/vehicles/mecha/mecha_control_console.dm @@ -55,7 +55,7 @@ var/obj/item/mecha_parts/mecha_tracking/MT = locate(params["tracker_ref"]) if(!istype(MT)) return - var/message = tgui_input_text(usr, "Input message", "Transmit message") + var/message = tgui_input_text(usr, "Input message", "Transmit message", max_length = MAX_MESSAGE_LEN) var/obj/vehicle/sealed/mecha/M = MT.chassis if(trim(message) && M) to_chat(M.occupants, message) diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 95a66bba689..a00dbf8a80d 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -1799,9 +1799,9 @@ GLOBAL_LIST_EMPTY(vending_machines_to_restock) if(compartmentLoadAccessCheck(user)) if(IS_WRITING_UTENSIL(attack_item)) - name = tgui_input_text(user, "Set name", "Name", name, 20) - desc = tgui_input_text(user, "Set description", "Description", desc, 60) - slogan_list += tgui_input_text(user, "Set slogan", "Slogan", "Epic", 60) + name = tgui_input_text(user, "Set name", "Name", name, max_length = 20) + desc = tgui_input_text(user, "Set description", "Description", desc, max_length = 60) + slogan_list += tgui_input_text(user, "Set slogan", "Slogan", "Epic", max_length = 60) last_slogan = world.time + rand(0, slogan_delay) return diff --git a/code/modules/vending/cigarette.dm b/code/modules/vending/cigarette.dm index 902e34e04f0..450c8e74100 100644 --- a/code/modules/vending/cigarette.dm +++ b/code/modules/vending/cigarette.dm @@ -18,6 +18,7 @@ ) contraband = list( /obj/item/vape = 5, + /obj/item/cigarette/dart = 1, ) premium = list( /obj/item/storage/fancy/cigarettes/cigpack_robustgold = 3, diff --git a/code/modules/wiremod/components/admin/input_request.dm b/code/modules/wiremod/components/admin/input_request.dm index 13dfacba357..3961003d43a 100644 --- a/code/modules/wiremod/components/admin/input_request.dm +++ b/code/modules/wiremod/components/admin/input_request.dm @@ -59,7 +59,7 @@ var/new_option = input_options.value switch(new_option) if(COMP_INPUT_STRING) - var/player_input = tgui_input_text(player, "Input a value", "Input value") + var/player_input = tgui_input_text(player, "Input a value", "Input value", max_length = MAX_MESSAGE_LEN) if(isnull(player_input)) return input_response.set_output(player_input) diff --git a/code/modules/wiremod/components/bci/thought_listener.dm b/code/modules/wiremod/components/bci/thought_listener.dm index aa788b1a4be..ed6226a4e49 100644 --- a/code/modules/wiremod/components/bci/thought_listener.dm +++ b/code/modules/wiremod/components/bci/thought_listener.dm @@ -56,7 +56,7 @@ ready = FALSE /obj/item/circuit_component/thought_listener/proc/thought_listen(mob/living/owner) - var/message = tgui_input_text(owner, input_desc.value ? input_desc.value : "", input_name.value ? input_name.value : "Thought Listener", "") + var/message = tgui_input_text(owner, input_desc.value ? input_desc.value : "", input_name.value ? input_name.value : "Thought Listener", "", max_length = MAX_MESSAGE_LEN) if(QDELETED(owner) || owner.stat >= SOFT_CRIT) return output.set_output(message) diff --git a/code/modules/wiremod/shell/keyboard.dm b/code/modules/wiremod/shell/keyboard.dm index 86a57d50681..505c89e0dde 100644 --- a/code/modules/wiremod/shell/keyboard.dm +++ b/code/modules/wiremod/shell/keyboard.dm @@ -49,7 +49,7 @@ to_chat(user, span_warning("You start mashing keys at random!")) return - var/message = tgui_input_text(user, "Input your text", "Keyboard") + var/message = tgui_input_text(user, "Input your text", "Keyboard", max_length = MAX_MESSAGE_LEN) entity.set_output(user) output.set_output(message) signal.set_output(COMPONENT_SIGNAL) diff --git a/html/changelogs/AutoChangeLog-pr-86098.yml b/html/changelogs/AutoChangeLog-pr-86098.yml new file mode 100644 index 00000000000..c5848dfaaa5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86098.yml @@ -0,0 +1,5 @@ +author: "Ghommie" +delete-after: True +changes: + - rscadd: "Added more customizable options to PDA virtual pets, which can be unlocked by completing achievements." + - rscadd: "Added a fat dart that can be rarely found in hacked cigarette vending machines." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86390.yml b/html/changelogs/AutoChangeLog-pr-86390.yml new file mode 100644 index 00000000000..f822c9fade6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86390.yml @@ -0,0 +1,8 @@ +author: "WebcomicArtist" +delete-after: True +changes: + - rscadd: "Added pipe-organ gun: a buildable object akin to trash cannon that takes pipegun rounds, and shoots up to 8 off at once." + - rscadd: "Added The Canister Gatling, a rapid fire but non-destructive cannon for skeleton pirates. Also Canister shot ammo." + - sound: "Added sounds for the above guns." + - image: "Added sprites for the guns as well." + - code_imp: "Added a whole \"mounted_gun\" class that is basically cannons but you aren't forced to use cannonballs as ammo and load them with gunpowder." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86470.yml b/html/changelogs/AutoChangeLog-pr-86470.yml new file mode 100644 index 00000000000..7c3cf1457e0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86470.yml @@ -0,0 +1,5 @@ +author: "Vect0r2" +delete-after: True +changes: + - rscadd: "Added the remote power AI disk" + - code_imp: "made it possible to easily add new AI upgrade disks" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86561.yml b/html/changelogs/AutoChangeLog-pr-86561.yml new file mode 100644 index 00000000000..f3daf7c49c6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86561.yml @@ -0,0 +1,4 @@ +author: "Bisar" +delete-after: True +changes: + - balance: "Meteor shielding is now purchasable at cargo even if it isn't the current station goal." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86581.yml b/html/changelogs/AutoChangeLog-pr-86581.yml new file mode 100644 index 00000000000..24c60ba0bec --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86581.yml @@ -0,0 +1,6 @@ +author: "carlarctg" +delete-after: True +changes: + - rscadd: "MetaStation's Drone Bay has been moved to be basically inside the normal cargo bay." + - rscadd: "To make room for it, the security cargo post was moved to the east of the mailing room:" + - rscadd: "The drone bay spot in maintenance has been cleared out by a gang of rowdy assistants, and turned into a drug den." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86605.yml b/html/changelogs/AutoChangeLog-pr-86605.yml new file mode 100644 index 00000000000..17ee60263e3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86605.yml @@ -0,0 +1,6 @@ +author: "Bisar" +delete-after: True +changes: + - balance: "Changelings are now able to respec multiple times if they have absorbed multiple humanoids, instead of it being toggled on if it was off during their most recent absorb." + - balance: "Last Resort is now an innate ability for changelings." + - code_imp: "Added a little counter and a tgui function for displaying how many absorbs lings have in their belly to spend for readaptions!" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86634.yml b/html/changelogs/AutoChangeLog-pr-86634.yml new file mode 100644 index 00000000000..4a1bd47fc19 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86634.yml @@ -0,0 +1,7 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Mapped in express supply consoles now work instead of displaying an empty UI." + - bugfix: "Emagged express supply consoles now display updated prices." + - refactor: "Rewrote a large chunk of express supply console code" + - balance: "Express supply consoles now drop their upgrade disk upon being deconstructed, and emagged consoles now will try to send at least one package to the station if cargo budget doesn't have enough funds for all 5." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86672.yml b/html/changelogs/AutoChangeLog-pr-86672.yml new file mode 100644 index 00000000000..b8a9c67c31b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86672.yml @@ -0,0 +1,5 @@ +author: "DaCoolBoss" +delete-after: True +changes: + - qol: "[Birdshot] Kitchen's privacy shutters no longer cover parts of the cafeteria table when open." + - bugfix: "[Birdshot] Kitchen's corridor windoor is now rotated correctly." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86679.yml b/html/changelogs/AutoChangeLog-pr-86679.yml new file mode 100644 index 00000000000..0978cdcadf2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86679.yml @@ -0,0 +1,4 @@ +author: "Kocma-san" +delete-after: True +changes: + - bugfix: "\"Visible to Network\" in the fax interface is now displayed correctly" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86690.yml b/html/changelogs/AutoChangeLog-pr-86690.yml new file mode 100644 index 00000000000..e5ec5cbd2ac --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86690.yml @@ -0,0 +1,6 @@ +author: "Ghommie" +delete-after: True +changes: + - rscadd: "You can now fish new, tasty treats by the station deep fryers." + - rscadd: "You can now grow fish inside an aquarium by feeding them regularly (at 50% hunger for maximum growth)." + - rscadd: "Added the evolution for pikes to armored pikes." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86691.yml b/html/changelogs/AutoChangeLog-pr-86691.yml new file mode 100644 index 00000000000..a5e03ad8a08 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86691.yml @@ -0,0 +1,4 @@ +author: "thegrb93" +delete-after: True +changes: + - bugfix: "Downstream species not getting internals they need when joining ERT" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86693.yml b/html/changelogs/AutoChangeLog-pr-86693.yml new file mode 100644 index 00000000000..3768f85a4c0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86693.yml @@ -0,0 +1,4 @@ +author: "Melbert" +delete-after: True +changes: + - balance: "Laser pointers have a 50% chance to fail when used on people wearing eyepatches" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86698.yml b/html/changelogs/AutoChangeLog-pr-86698.yml new file mode 100644 index 00000000000..f636cf55f98 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86698.yml @@ -0,0 +1,4 @@ +author: "Melbert" +delete-after: True +changes: + - qol: "Deceased and asleep humanoids will now close their eyes" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86704.yml b/html/changelogs/AutoChangeLog-pr-86704.yml new file mode 100644 index 00000000000..78e4bbb9917 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86704.yml @@ -0,0 +1,4 @@ +author: "EnterTheJake" +delete-after: True +changes: + - balance: "Security Flashbangs can no longer be primed for instant detonation." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86708.yml b/html/changelogs/AutoChangeLog-pr-86708.yml new file mode 100644 index 00000000000..e985c7d803a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86708.yml @@ -0,0 +1,4 @@ +author: "SmArtKar, Kapu" +delete-after: True +changes: + - bugfix: "Agent ID cards no longer display broken text when you put non-letter symbols as your name" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86725.yml b/html/changelogs/AutoChangeLog-pr-86725.yml new file mode 100644 index 00000000000..5954d9eca35 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86725.yml @@ -0,0 +1,4 @@ +author: "GregariousJB" +delete-after: True +changes: + - rscadd: "Added three programs to cyborg PDAs: SiliConnect, AtmoZphere, and Crew Manifest" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86728.yml b/html/changelogs/AutoChangeLog-pr-86728.yml new file mode 100644 index 00000000000..6f17fee6a47 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86728.yml @@ -0,0 +1,4 @@ +author: "Jewelry-x" +delete-after: True +changes: + - qol: "made it clearer that the expansion in space failed for blob instead of wildly flailing at space." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86731.yml b/html/changelogs/AutoChangeLog-pr-86731.yml new file mode 100644 index 00000000000..195ff7ce328 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86731.yml @@ -0,0 +1,4 @@ +author: "LT3" +delete-after: True +changes: + - bugfix: "Fixed missing examine text for the yellow medical HUD border regarding suit sensors" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86734.yml b/html/changelogs/AutoChangeLog-pr-86734.yml new file mode 100644 index 00000000000..60bc6ed3333 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86734.yml @@ -0,0 +1,5 @@ +author: "SmArtKar" +delete-after: True +changes: + - spellcheck: "Fixed broken text display in atmos devices in which you can insert a tank" + - admin: "Atmos logging no longer lies about everyone swapping tanks in devices even if they only inserted/removed one" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86741.yml b/html/changelogs/AutoChangeLog-pr-86741.yml new file mode 100644 index 00000000000..276d44b0b89 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86741.yml @@ -0,0 +1,4 @@ +author: "san7890" +delete-after: True +changes: + - bugfix: "A lot of instances where you could fill in 1024-character names (normal limit is 42) have been patched out, along with too-long plaque names, too-long descriptions, and more." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86743.yml b/html/changelogs/AutoChangeLog-pr-86743.yml new file mode 100644 index 00000000000..912de89d4b0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86743.yml @@ -0,0 +1,4 @@ +author: "FlufflesTheDog" +delete-after: True +changes: + - bugfix: "Icebox's virology airlock cycles properly again" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86744.yml b/html/changelogs/AutoChangeLog-pr-86744.yml new file mode 100644 index 00000000000..efbfc4d424a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86744.yml @@ -0,0 +1,6 @@ +author: "00-Steven" +delete-after: True +changes: + - bugfix: "Changing a bank account's job to or from Curator actually changes whether they get a cut from painting patronage." + - admin: "VVediting a bank account's account_job actually updates what job the account is associated with. Currently only matters for Curators." + - admin: "VVediting a bank account's add_to_accounts actually removes it from or adds it to the job to account associations. Currently only matters for Curators." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86748.yml b/html/changelogs/AutoChangeLog-pr-86748.yml new file mode 100644 index 00000000000..b0c60daa154 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86748.yml @@ -0,0 +1,4 @@ +author: "SyncIt21" +delete-after: True +changes: + - bugfix: "apc breaker properly shuts off all power" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86749.yml b/html/changelogs/AutoChangeLog-pr-86749.yml new file mode 100644 index 00000000000..f84cf0f6ba9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86749.yml @@ -0,0 +1,5 @@ +author: "carlarctg" +delete-after: True +changes: + - bugfix: "Added a null check to mood, because it caused runtimes. Nonhumans have mood, but they never initialize it, yet surgery mood assumes it is." + - bugfix: "Removed unnecessary ishuman check in the organizer, allowing it to work on xenomorphs and other theoretical carbons." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86750.yml b/html/changelogs/AutoChangeLog-pr-86750.yml new file mode 100644 index 00000000000..2b8ac04dfdd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86750.yml @@ -0,0 +1,5 @@ +author: "carlarctg" +delete-after: True +changes: + - qol: "Durathread vests now fit botany items as well as armor items" + - code_imp: "Botany suits now all inherit the same list" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86751.yml b/html/changelogs/AutoChangeLog-pr-86751.yml new file mode 100644 index 00000000000..a63a840c269 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86751.yml @@ -0,0 +1,4 @@ +author: "Jewelry-x" +delete-after: True +changes: + - bugfix: "Lobby crew manifest has colour again" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86752.yml b/html/changelogs/AutoChangeLog-pr-86752.yml new file mode 100644 index 00000000000..b091ffc90ff --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86752.yml @@ -0,0 +1,4 @@ +author: "Rhials" +delete-after: True +changes: + - bugfix: "You can no longer backdoor security records using the Metastation Central bitrunner domain." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86753.yml b/html/changelogs/AutoChangeLog-pr-86753.yml new file mode 100644 index 00000000000..9390a9792de --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86753.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Fixed robotic revival surgery showing up for simplemobs" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86754.yml b/html/changelogs/AutoChangeLog-pr-86754.yml new file mode 100644 index 00000000000..5140500b639 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86754.yml @@ -0,0 +1,4 @@ +author: "Iajret" +delete-after: True +changes: + - bugfix: "Mining mods can be charged with plasma once again" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86755.yml b/html/changelogs/AutoChangeLog-pr-86755.yml new file mode 100644 index 00000000000..c1e47a27862 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86755.yml @@ -0,0 +1,6 @@ +author: "Goat" +delete-after: True +changes: + - balance: "burn damage equal or under to ten will now damage your jumpsuit (does not apply to internal temp damage)" + - bugfix: "radiation burns no longer damage your jumpsuit." + - code_imp: "added a new var to applying damage to set if it should apply damage to clothes." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86759.yml b/html/changelogs/AutoChangeLog-pr-86759.yml new file mode 100644 index 00000000000..1951a3f4b9b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86759.yml @@ -0,0 +1,4 @@ +author: "carlarctg" +delete-after: True +changes: + - spellcheck: "Removes caps from many improper items" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86766.yml b/html/changelogs/AutoChangeLog-pr-86766.yml new file mode 100644 index 00000000000..84d37ed4ce1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86766.yml @@ -0,0 +1,4 @@ +author: "MelokGleb" +delete-after: True +changes: + - bugfix: "doors in museum now work correctly" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86768.yml b/html/changelogs/AutoChangeLog-pr-86768.yml new file mode 100644 index 00000000000..6c01a5f52c9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86768.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Fixed wallmounts not being mountable by using a screwdriver on them" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86770.yml b/html/changelogs/AutoChangeLog-pr-86770.yml new file mode 100644 index 00000000000..cf3628f26b8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86770.yml @@ -0,0 +1,4 @@ +author: "Xackii" +delete-after: True +changes: + - bugfix: "Gateway museum keycard now spawns in toilet properly." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86774.yml b/html/changelogs/AutoChangeLog-pr-86774.yml new file mode 100644 index 00000000000..05c67ca5a03 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86774.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - image: "added icon states for linkable fishing spots in the fish portal gen radial menu." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86776.yml b/html/changelogs/AutoChangeLog-pr-86776.yml new file mode 100644 index 00000000000..62be88e988b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86776.yml @@ -0,0 +1,6 @@ +author: "Ghommie" +delete-after: True +changes: + - balance: "The fishing skill now positively affects fishing rod cast range and reeling objects outside of the minigame. Reeling objects also provides a pitiable amount of fishing experience." + - balance: "High fishing skill now reduces experience gained from low difficulty fishing spots." + - sound: "Removed noise from reeling sounds." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86777.yml b/html/changelogs/AutoChangeLog-pr-86777.yml new file mode 100644 index 00000000000..cbc439c3ecb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86777.yml @@ -0,0 +1,4 @@ +author: "carlarctg" +delete-after: True +changes: + - qol: "Adds shorthand alt-click for removing tanks from TTVs and adds context for it" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86778.yml b/html/changelogs/AutoChangeLog-pr-86778.yml new file mode 100644 index 00000000000..4ab39ad2fd5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86778.yml @@ -0,0 +1,4 @@ +author: "carlarctg" +delete-after: True +changes: + - bugfix: "Legions borne from mimes can no longer talk" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86780.yml b/html/changelogs/AutoChangeLog-pr-86780.yml new file mode 100644 index 00000000000..163ab87e6e6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86780.yml @@ -0,0 +1,4 @@ +author: "Hardly3D" +delete-after: True +changes: + - image: "Resprited Short Bangs 2 & Double Buns" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86781.yml b/html/changelogs/AutoChangeLog-pr-86781.yml new file mode 100644 index 00000000000..e5c1d1b25ba --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86781.yml @@ -0,0 +1,9 @@ +author: "Deadgebert" +delete-after: True +changes: + - balance: "Syndicate Rebar Bolt damage reduced to 45 from 55." + - balance: "Hydrogen Bolt damage reduced to 35 from 55." + - balance: "Syndicate Quiver reload is now interrupted by movement." + - balance: "Syndicate Quiver reload increased to 1.2 seconds from 0.8 seconds." + - balance: "Crossbow TC cost increased to 12 from 10." + - balance: "Quiver size increased to normal from small." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86782.yml b/html/changelogs/AutoChangeLog-pr-86782.yml new file mode 100644 index 00000000000..a092d90f6a4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86782.yml @@ -0,0 +1,4 @@ +author: "Likteer" +delete-after: True +changes: + - rscdel: "Intentional screaming has been unmuted. Now has a 5s cooldown instead." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86783.yml b/html/changelogs/AutoChangeLog-pr-86783.yml new file mode 100644 index 00000000000..d25ac6f3c0c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86783.yml @@ -0,0 +1,4 @@ +author: "Likteer" +delete-after: True +changes: + - bugfix: "Plasmamen envirohelmets no longer erroneously apply a slowdown." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86786.yml b/html/changelogs/AutoChangeLog-pr-86786.yml new file mode 100644 index 00000000000..6006f0cbde6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86786.yml @@ -0,0 +1,4 @@ +author: "Ben10Omintrix" +delete-after: True +changes: + - bugfix: "botkeeper now displays bot's correct states!" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86789.yml b/html/changelogs/AutoChangeLog-pr-86789.yml new file mode 100644 index 00000000000..d0c33f56f4d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86789.yml @@ -0,0 +1,4 @@ +author: "SyncIt21" +delete-after: True +changes: + - bugfix: "moving or rotating a mech will cancel its hydraulic clamp action" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86793.yml b/html/changelogs/AutoChangeLog-pr-86793.yml new file mode 100644 index 00000000000..84983310496 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86793.yml @@ -0,0 +1,4 @@ +author: "LT3" +delete-after: True +changes: + - spellcheck: "Fruit crate description now correctly warns that it contains lemons" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86794.yml b/html/changelogs/AutoChangeLog-pr-86794.yml new file mode 100644 index 00000000000..d31c97488c6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86794.yml @@ -0,0 +1,4 @@ +author: "Goat" +delete-after: True +changes: + - bugfix: "Virtual pirates were yelled at by the virtual syndicate and no longer have virtual syndicate headsets." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86795.yml b/html/changelogs/AutoChangeLog-pr-86795.yml new file mode 100644 index 00000000000..97dbd18464d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86795.yml @@ -0,0 +1,4 @@ +author: "LT3" +delete-after: True +changes: + - bugfix: "Fixed incomplete floodlights calling all light tubes broken" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86797.yml b/html/changelogs/AutoChangeLog-pr-86797.yml new file mode 100644 index 00000000000..6d7fc0e5b77 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86797.yml @@ -0,0 +1,4 @@ +author: "Rhials" +delete-after: True +changes: + - bugfix: "The Meta Central Virtual Domain now uses the proper ghost role spawner, meaning you can't eavesdrop on syndie comms using their headset." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86812.yml b/html/changelogs/AutoChangeLog-pr-86812.yml new file mode 100644 index 00000000000..dea7c8ae6b4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86812.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Fixed infective components not cleaning up disease datums after themselves" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86814.yml b/html/changelogs/AutoChangeLog-pr-86814.yml new file mode 100644 index 00000000000..a57e7d4e0fc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86814.yml @@ -0,0 +1,4 @@ +author: "Sealed101" +delete-after: True +changes: + - spellcheck: "fixed examine and balloon alert text for boulder refining machinery" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86818.yml b/html/changelogs/AutoChangeLog-pr-86818.yml new file mode 100644 index 00000000000..5cb5575cb8c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86818.yml @@ -0,0 +1,4 @@ +author: "grungussuss" +delete-after: True +changes: + - sound: "pruned higher frequencies from the resonant shriek ability sound, making it lighter on the ears" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86821.yml b/html/changelogs/AutoChangeLog-pr-86821.yml new file mode 100644 index 00000000000..e01bbc22a79 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86821.yml @@ -0,0 +1,4 @@ +author: "grungussuss" +delete-after: True +changes: + - sound: "lavaland magma ambience has been changed" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86822.yml b/html/changelogs/AutoChangeLog-pr-86822.yml new file mode 100644 index 00000000000..e55ff82da40 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86822.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Emergency shuttle console no longer reopens its UI on its own" \ No newline at end of file diff --git a/icons/hud/radial_fishing.dmi b/icons/hud/radial_fishing.dmi index 6870698fbe6..90b2b17c83a 100644 Binary files a/icons/hud/radial_fishing.dmi and b/icons/hud/radial_fishing.dmi differ diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi index ac40c153dd7..4ac9143e7a8 100644 Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ diff --git a/icons/mob/human/human_face.dmi b/icons/mob/human/human_face.dmi index 5b3b141c7ed..9c6c333f05b 100644 Binary files a/icons/mob/human/human_face.dmi and b/icons/mob/human/human_face.dmi differ diff --git a/icons/obj/aquarium/fish.dmi b/icons/obj/aquarium/fish.dmi index e3b41f4cf90..eec60317b0e 100644 Binary files a/icons/obj/aquarium/fish.dmi and b/icons/obj/aquarium/fish.dmi differ diff --git a/icons/obj/aquarium/wide.dmi b/icons/obj/aquarium/wide.dmi index 5334fcf1808..33c8e43950f 100644 Binary files a/icons/obj/aquarium/wide.dmi and b/icons/obj/aquarium/wide.dmi differ diff --git a/icons/obj/cigarettes.dmi b/icons/obj/cigarettes.dmi index 1be85df6c15..c9e9186b7a8 100644 Binary files a/icons/obj/cigarettes.dmi and b/icons/obj/cigarettes.dmi differ diff --git a/icons/obj/fishing.dmi b/icons/obj/fishing.dmi index 9c6a535fd83..dc0e65fac58 100644 Binary files a/icons/obj/fishing.dmi and b/icons/obj/fishing.dmi differ diff --git a/icons/obj/weapons/cannons.dmi b/icons/obj/weapons/cannons.dmi index b9735ba0aef..93b43b19239 100644 Binary files a/icons/obj/weapons/cannons.dmi and b/icons/obj/weapons/cannons.dmi differ diff --git a/icons/obj/weapons/guns/ammo.dmi b/icons/obj/weapons/guns/ammo.dmi index 971bdaf4d20..2dab0cb3d8d 100644 Binary files a/icons/obj/weapons/guns/ammo.dmi and b/icons/obj/weapons/guns/ammo.dmi differ diff --git a/modular_nova/modules/clock_cult/code/actions/whirring_convergence.dm b/modular_nova/modules/clock_cult/code/actions/whirring_convergence.dm index a8d47382f1e..ebbe7d2397d 100644 --- a/modular_nova/modules/clock_cult/code/actions/whirring_convergence.dm +++ b/modular_nova/modules/clock_cult/code/actions/whirring_convergence.dm @@ -8,7 +8,7 @@ button_icon_state = "linked_minds" /datum/action/innate/clockcult/comm/Activate() - var/input = tgui_input_text(usr, "Message to tell to the other followers.", "Voice of Cogs") + var/input = tgui_input_text(usr, "Message to tell to the other followers.", "Voice of Cogs", max_length = MAX_MESSAGE_LEN) if(!input || !IsAvailable()) return diff --git a/modular_nova/modules/company_imports/code/armament_component.dm b/modular_nova/modules/company_imports/code/armament_component.dm index 7846dc40143..cc5355dcce9 100644 --- a/modular_nova/modules/company_imports/code/armament_component.dm +++ b/modular_nova/modules/company_imports/code/armament_component.dm @@ -217,14 +217,14 @@ if(possible_console) if(possible_console.requestonly && !self_paid) - reason = tgui_input_text(user, "Reason", name) + reason = tgui_input_text(user, "Reason", name, max_length = MAX_MESSAGE_LEN) if(isnull(reason)) return else if(possible_downloader) var/datum/computer_file/program/budgetorders/parent_file = parent_prog if((parent_file.requestonly && !self_paid) || !(possible_downloader.computer_id_slot?.GetID())) - reason = tgui_input_text(user, "Reason", name) + reason = tgui_input_text(user, "Reason", name, max_length = MAX_MESSAGE_LEN) if(isnull(reason)) return diff --git a/modular_nova/modules/container_emotes/code/container_emotes.dm b/modular_nova/modules/container_emotes/code/container_emotes.dm index 74b7ae81085..f698e18ea4b 100644 --- a/modular_nova/modules/container_emotes/code/container_emotes.dm +++ b/modular_nova/modules/container_emotes/code/container_emotes.dm @@ -53,7 +53,7 @@ to_chat(user, span_danger("You are not within anything!")) // If user is banned from chat, emotes, or the user is not within anything (ex. a locker) return. return FALSE //im keeping this to_chat because this seems like a really common use case and i dont want to annoy players else if(!params) // User didn't put anything after *exme when using the say hotkey, or just used the emote raw? Open a window. - container_emote = tgui_input_text(user, "What would you like to emote?", "Container Emote" , null, MAX_MESSAGE_LEN, TRUE, TRUE, 0) + container_emote = tgui_input_text(user, "What would you like to emote?", "Container Emote", max_length = MAX_MESSAGE_LEN, multiline = TRUE) if(!container_emote) return FALSE var/list/choices = list("Visible","Audible") diff --git a/modular_nova/modules/customization/datums/keybinding/communication.dm b/modular_nova/modules/customization/datums/keybinding/communication.dm index 1ac9a6da963..05876cd0768 100644 --- a/modular_nova/modules/customization/datums/keybinding/communication.dm +++ b/modular_nova/modules/customization/datums/keybinding/communication.dm @@ -47,7 +47,7 @@ . = ..() if(.) return - var/message_text = tgui_input_text(user, "Write out your Do action:", "Do (Longer)", null, MAX_MESSAGE_LEN, TRUE) + var/message_text = tgui_input_text(user, "Write out your Do action:", "Do (Longer)", max_length = MAX_MESSAGE_LEN, multiline = TRUE) if (!message_text) return diff --git a/modular_nova/modules/customization/game/objects/items/devices/ttsdevice.dm b/modular_nova/modules/customization/game/objects/items/devices/ttsdevice.dm index cb2235e2d2e..cd4a9952da7 100644 --- a/modular_nova/modules/customization/game/objects/items/devices/ttsdevice.dm +++ b/modular_nova/modules/customization/game/objects/items/devices/ttsdevice.dm @@ -11,7 +11,7 @@ /obj/item/ttsdevice/attack_self(mob/user) user.balloon_alert_to_viewers("typing...", "started typing...") playsound(src, 'modular_nova/master_files/sound/items/tts/started_type.ogg', 50, TRUE) - var/str = tgui_input_text(user, "What would you like the device to say?", "Say Text", "", MAX_MESSAGE_LEN, encode = FALSE) + var/str = tgui_input_text(user, "What would you like the device to say?", "Say Text", "", max_length = MAX_MESSAGE_LEN, encode = FALSE) if(QDELETED(src) || !user.can_perform_action(src)) return if(!str) @@ -43,7 +43,7 @@ return CLICK_ACTION_SUCCESS /obj/item/ttsdevice/click_ctrl_shift(mob/user) - var/new_name = reject_bad_name(tgui_input_text(user, "Name your Text-to-Speech device. This matters for displaying it in the chat bar.", "Set TTS Device Name", "", MAX_NAME_LEN)) + var/new_name = reject_bad_name(tgui_input_text(user, "Name your Text-to-Speech device. This matters for displaying it in the chat bar.", "Set TTS Device Name", "", max_length = MAX_NAME_LEN)) if(new_name) name = "[new_name]'s [initial(name)]" else diff --git a/modular_nova/modules/icemoon_additions/code/icecat_recipes.dm b/modular_nova/modules/icemoon_additions/code/icecat_recipes.dm index 571cf11acce..3eff36e55b3 100644 --- a/modular_nova/modules/icemoon_additions/code/icecat_recipes.dm +++ b/modular_nova/modules/icemoon_additions/code/icecat_recipes.dm @@ -26,7 +26,7 @@ /obj/item/anointing_oil/proc/try_anoint(mob/living/target_mob, mob/living/user) being_used = TRUE - var/new_name = sanitize_name(tgui_input_text(user, "Speak forth this beast's new name for all the Kin to hear.", "Input a name", target_mob.name, MAX_NAME_LEN)) + var/new_name = sanitize_name(tgui_input_text(user, "Speak forth this beast's new name for all the Kin to hear.", "Input a name", target_mob.name, max_length = MAX_NAME_LEN)) if(!new_name || QDELETED(src) || QDELETED(target_mob) || new_name == target_mob.name || !target_mob.Adjacent(user)) being_used = FALSE diff --git a/modular_nova/modules/liquids/code/tools.dm b/modular_nova/modules/liquids/code/tools.dm index c55e3ffa7cf..c0e66f69504 100644 --- a/modular_nova/modules/liquids/code/tools.dm +++ b/modular_nova/modules/liquids/code/tools.dm @@ -2,7 +2,7 @@ ADMIN_VERB(spawn_liquid, R_ADMIN, "Spawn Liquid", "Spawns an amount of chosen li var/choice var/valid_id while(!valid_id) - choice = tgui_input_text(user, "Enter the ID of the reagent you want to add.", "Search reagents") + choice = tgui_input_text(user, "Enter the ID of the reagent you want to add.", "Search reagents", max_length = MAX_NAME_LEN) if(isnull(choice)) //Get me out of here! break if (!ispath(text2path(choice))) diff --git a/modular_nova/modules/loadouts/loadout_ui/loadout_manager.dm b/modular_nova/modules/loadouts/loadout_ui/loadout_manager.dm index de7e1c529b3..95dae3b5b6d 100644 --- a/modular_nova/modules/loadouts/loadout_ui/loadout_manager.dm +++ b/modular_nova/modules/loadouts/loadout_ui/loadout_manager.dm @@ -203,8 +203,8 @@ if(INFO_DESCRIBED in owner.prefs.loadout_list[item.item_path]) current_desc = owner.prefs.loadout_list[item.item_path][INFO_DESCRIBED] - var/input_name = tgui_input_text(owner, "What name do you want to give [item.name]? Leave blank to clear.", "[item.name] name", current_name, MAX_NAME_LEN) - var/input_desc = tgui_input_text(owner, "What description do you want to give [item.name]? 256 character max, leave blank to clear.", "[item.name] description", current_desc, 256, multiline = TRUE) + var/input_name = tgui_input_text(owner, "What name do you want to give [item.name]? Leave blank to clear.", "[item.name] name", current_name, max_length = MAX_NAME_LEN) + var/input_desc = tgui_input_text(owner, "What description do you want to give [item.name]? 256 character max, leave blank to clear.", "[item.name] description", current_desc, max_length = 256, multiline = TRUE) if(QDELETED(src) || QDELETED(owner) || QDELETED(owner.prefs)) return diff --git a/modular_nova/modules/mentor/code/mentorpm.dm b/modular_nova/modules/mentor/code/mentorpm.dm index 0f816db2ae8..133932789af 100644 --- a/modular_nova/modules/mentor/code/mentorpm.dm +++ b/modular_nova/modules/mentor/code/mentorpm.dm @@ -43,7 +43,7 @@ //get message text, limit its length.and clean/escape html if(!msg) - msg = tgui_input_text(src, "Message:", "Private message") + msg = tgui_input_text(src, "Message:", "Private message", max_length = MAX_MESSAGE_LEN) if(!msg) if (is_mentor(whom)) diff --git a/modular_nova/modules/modular_implants/code/nifsofts/dorms.dm b/modular_nova/modules/modular_implants/code/nifsofts/dorms.dm index 97506d8d69d..d41bc1d94cf 100644 --- a/modular_nova/modules/modular_implants/code/nifsofts/dorms.dm +++ b/modular_nova/modules/modular_implants/code/nifsofts/dorms.dm @@ -85,7 +85,7 @@ target_nifsoft.fake_laws = laws_to_assign /obj/item/disk/nifsoft_uploader/dorms/contract/attack_self(mob/user, list/modifiers) - var/new_law = tgui_input_text(user, "Input a new law to add", src, laws_to_assign) + var/new_law = tgui_input_text(user, "Input a new law to add", src, laws_to_assign, max_length = MAX_MESSAGE_LEN) if(!new_law) return FALSE diff --git a/modular_nova/modules/modular_implants/code/nifsofts/hivemind.dm b/modular_nova/modules/modular_implants/code/nifsofts/hivemind.dm index 7d071389b27..7c8b4deca48 100644 --- a/modular_nova/modules/modular_implants/code/nifsofts/hivemind.dm +++ b/modular_nova/modules/modular_implants/code/nifsofts/hivemind.dm @@ -277,7 +277,7 @@ GLOBAL_LIST_EMPTY(hivemind_users) /obj/item/hivemind_keyboard/proc/send_message(mob/living/carbon/human/user) var/mob/living/carbon/human/kebyoard_owner = source_user var/mob/living/carbon/human/network_owner = connected_network.parent - var/message = tgui_input_text(user, "Enter a message to transmit.", "[connected_network.network_name] Telepathy") + var/message = tgui_input_text(user, "Enter a message to transmit.", "[connected_network.network_name] Telepathy", max_length = MAX_MESSAGE_LEN) if(!message || QDELETED(src) || QDELETED(user) || user.stat == DEAD) return diff --git a/modular_nova/modules/modular_implants/code/nifsofts/hypnosis.dm b/modular_nova/modules/modular_implants/code/nifsofts/hypnosis.dm index 2b49164bff6..12d3de2980b 100644 --- a/modular_nova/modules/modular_implants/code/nifsofts/hypnosis.dm +++ b/modular_nova/modules/modular_implants/code/nifsofts/hypnosis.dm @@ -57,7 +57,7 @@ target_human.SetSleeping(0) return FALSE - var/input_text = tgui_input_text(user, "What would you like to suggest?", "Hypnotic Suggestion") + var/input_text = tgui_input_text(user, "What would you like to suggest?", "Hypnotic Suggestion", max_length = MAX_MESSAGE_LEN) to_chat(user, span_purple("You whisper into [target_human]'s ears in a soothing voice.")) to_chat(target_human, span_hypnophrase("[input_text]")) secondary_choice = tgui_alert(user, "Would you like to give [target_human] an additional hypnotic suggestion or release them?", "Hypnosis", list("Suggestion", "Release")) diff --git a/modular_nova/modules/modular_implants/code/nifsofts/scryer.dm b/modular_nova/modules/modular_implants/code/nifsofts/scryer.dm index 36c676795e9..9dc40fd5944 100644 --- a/modular_nova/modules/modular_implants/code/nifsofts/scryer.dm +++ b/modular_nova/modules/modular_implants/code/nifsofts/scryer.dm @@ -101,7 +101,7 @@ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /obj/item/clothing/neck/link_scryer/loaded/nifsoft/attack_hand_secondary(mob/user, list/modifiers) - var/new_label = reject_bad_text(tgui_input_text(user, "Change the visible name", "Set Name", label, MAX_NAME_LEN)) + var/new_label = reject_bad_text(tgui_input_text(user, "Change the visible name", "Set Name", label, max_length = MAX_NAME_LEN)) if(!new_label) balloon_alert(user, "invalid name!") return diff --git a/modular_nova/modules/modular_implants/code/soulcatcher/soulcatcher_tgui.dm b/modular_nova/modules/modular_implants/code/soulcatcher/soulcatcher_tgui.dm index b0b6f912808..fc986dd9813 100644 --- a/modular_nova/modules/modular_implants/code/soulcatcher/soulcatcher_tgui.dm +++ b/modular_nova/modules/modular_implants/code/soulcatcher/soulcatcher_tgui.dm @@ -98,7 +98,7 @@ return TRUE if("rename_room") - var/new_room_name = tgui_input_text(user,"Choose a new name for the room", name, target_room.name) + var/new_room_name = tgui_input_text(user,"Choose a new name for the room", name, target_room.name, max_length = MAX_NAME_LEN) if(!new_room_name) return FALSE @@ -106,7 +106,7 @@ return TRUE if("redescribe_room") - var/new_room_desc = tgui_input_text(user,"Choose a new description for the room", name, target_room.room_description, multiline = TRUE) + var/new_room_desc = tgui_input_text(user,"Choose a new description for the room", name, target_room.room_description, max_length = MAX_DESC_LEN, multiline = TRUE) if(!new_room_desc) return FALSE @@ -126,7 +126,7 @@ return TRUE if("modify_name") - var/new_name = tgui_input_text(user,"Choose a new name to send messages as", name, target_room.outside_voice, multiline = TRUE) + var/new_name = tgui_input_text(user,"Choose a new name to send messages as", name, target_room.outside_voice, max_length = MAX_NAME_LEN, multiline = TRUE) if(!new_name) return FALSE @@ -211,7 +211,7 @@ return TRUE if("change_name") - var/new_name = tgui_input_text(user, "Enter a new name for [target_soul]", "Soulcatcher", target_soul) + var/new_name = tgui_input_text(user, "Enter a new name for [target_soul]", "Soulcatcher", target_soul, max_length = MAX_NAME_LEN) if(!new_name) return FALSE @@ -231,7 +231,7 @@ if(params["narration"]) message_sender = FALSE - message_to_send = tgui_input_text(user, "Input the message you want to send", name, multiline = TRUE) + message_to_send = tgui_input_text(user, "Input the message you want to send", name, max_length = MAX_MESSAGE_LEN, multiline = TRUE) if(!message_to_send) return FALSE @@ -325,7 +325,7 @@ switch(action) if("change_name") - var/new_name = tgui_input_text(user, "Enter a new name", "Soulcatcher", user_soul.name) + var/new_name = tgui_input_text(user, "Enter a new name", "Soulcatcher", user_soul.name, max_length = MAX_NAME_LEN) if(!new_name) return FALSE diff --git a/modular_nova/modules/modular_implants/code/soulcatcher/soulcatcher_verbs.dm b/modular_nova/modules/modular_implants/code/soulcatcher/soulcatcher_verbs.dm index 261406339a6..b979aa98beb 100644 --- a/modular_nova/modules/modular_implants/code/soulcatcher/soulcatcher_verbs.dm +++ b/modular_nova/modules/modular_implants/code/soulcatcher/soulcatcher_verbs.dm @@ -23,7 +23,7 @@ if(!target_soulcatcher || !target_soulcatcher.targeted_soulcatcher_room) return FALSE - var/message_to_send = tgui_input_text(usr, "Input the emote you want to send", "Soulcatcher", multiline = TRUE) + var/message_to_send = tgui_input_text(usr, "Input the emote you want to send", "Soulcatcher", max_length = MAX_MESSAGE_LEN, multiline = TRUE) if(!message_to_send) return FALSE diff --git a/modular_nova/modules/moretraitoritems/code/traitor_announcer.dm b/modular_nova/modules/moretraitoritems/code/traitor_announcer.dm index 715ff34eaa5..9af2aade67f 100644 --- a/modular_nova/modules/moretraitoritems/code/traitor_announcer.dm +++ b/modular_nova/modules/moretraitoritems/code/traitor_announcer.dm @@ -23,7 +23,7 @@ return //build our announcement - var/origin = sanitize_text(reject_bad_text(tgui_input_text(user, "Who is announcing, or where is the announcement coming from?", "Announcement Origin", get_area_name(user), max_length = 56), ascii_only = FALSE)) + var/origin = sanitize_text(reject_bad_text(tgui_input_text(user, "Who is announcing, or where is the announcement coming from?", "Announcement Origin", get_area_name(user), max_length = MAX_NAME_LEN), ascii_only = FALSE)) if(!origin) balloon_alert(user, "bad origin!") return @@ -38,7 +38,7 @@ balloon_alert(user, "bad color!") return - var/title = sanitize_text(reject_bad_text(tgui_input_text(user, "Choose the title of the announcement.", "Announcement Title", max_length = 84), ascii_only = FALSE)) + var/title = sanitize_text(reject_bad_text(tgui_input_text(user, "Choose the title of the announcement.", "Announcement Title", max_length = MAX_NAME_LEN*2), ascii_only = FALSE)) if(!title) balloon_alert(user, "bad title!") return diff --git a/modular_nova/modules/opposing_force/code/opposing_force_datum.dm b/modular_nova/modules/opposing_force/code/opposing_force_datum.dm index e6f3571a10a..f63c08c3204 100644 --- a/modular_nova/modules/opposing_force/code/opposing_force_datum.dm +++ b/modular_nova/modules/opposing_force/code/opposing_force_datum.dm @@ -328,7 +328,7 @@ if("deny") if(!check_rights(R_ADMIN)) return - var/denied_reason = tgui_input_text(usr, "Denial Reason", "Enter a reason for denying this application:") + var/denied_reason = tgui_input_text(usr, "Denial Reason", "Enter a reason for denying this application:", max_length = MAX_NAME_LEN) // Checking to see if the user is spamming the button, async and all. if((status == OPFOR_STATUS_DENIED) || !denied_reason) return @@ -348,7 +348,7 @@ if("deny_objective") if(!check_rights(R_ADMIN)) return - var/denied_reason = tgui_input_text(usr, "Denial Reason", "Enter a reason for denying this objective:") + var/denied_reason = tgui_input_text(usr, "Denial Reason", "Enter a reason for denying this objective:", max_length = MAX_NAME_LEN) if(!denied_reason) return deny_objective(usr, edited_objective, denied_reason) @@ -365,7 +365,7 @@ return if(!check_rights(R_ADMIN)) return - var/denied_reason = tgui_input_text(usr, "Denial Reason", "Enter a reason for denying this objective:") + var/denied_reason = tgui_input_text(usr, "Denial Reason", "Enter a reason for denying this objective:", max_length = MAX_NAME_LEN) if(!denied_reason) return deny_equipment(usr, equipment, denied_reason) diff --git a/modular_nova/modules/server_overflow/code/chat_link.dm b/modular_nova/modules/server_overflow/code/chat_link.dm index 6fc26c14f20..1b52c4d0d75 100644 --- a/modular_nova/modules/server_overflow/code/chat_link.dm +++ b/modular_nova/modules/server_overflow/code/chat_link.dm @@ -61,7 +61,7 @@ confidential = TRUE) ADMIN_VERB(request_help, R_ADMIN, "Cross-server Help Request", "Sends a loud message to all other servers that we are crosslinked to!", ADMIN_CATEGORY_MAIN) - var/help_request_message = tgui_input_text(user, "Input help message!", "Help message", "Send help!", 150, FALSE) + var/help_request_message = tgui_input_text(user, "Input help message!", "Help message", "Send help!", max_length = 150, multiline = FALSE) if(!help_request_message) return send2adminchat(user.ckey, "CROSSLINK HELP REQUEST([CONFIG_GET(string/cross_server_name) ? CONFIG_GET(string/cross_server_name) : station_name()]): [help_request_message]") diff --git a/modular_nova/modules/telepathy_quirk/code/telepathy_action.dm b/modular_nova/modules/telepathy_quirk/code/telepathy_action.dm index 54a8712ad11..cfd50b50a98 100644 --- a/modular_nova/modules/telepathy_quirk/code/telepathy_action.dm +++ b/modular_nova/modules/telepathy_quirk/code/telepathy_action.dm @@ -44,7 +44,7 @@ if(. & SPELL_CANCEL_CAST || blocked) return - message = autopunct_bare(capitalize(tgui_input_text(owner, "What do you wish to whisper to [cast_on]?", "[src]", null))) + message = autopunct_bare(capitalize(tgui_input_text(owner, "What do you wish to whisper to [cast_on]?", "[src]", max_length = MAX_NAME_LEN))) if(QDELETED(src) || QDELETED(owner) || QDELETED(cast_on) || !can_cast_spell()) return . | SPELL_CANCEL_CAST @@ -70,7 +70,7 @@ blocked = TRUE - message = autopunct_bare(capitalize(tgui_input_text(owner, "What do you wish to whisper to [last_target]?", "[src]"))) + message = autopunct_bare(capitalize(tgui_input_text(owner, "What do you wish to whisper to [last_target]?", "[src]", max_length = MAX_NAME_LEN))) if(QDELETED(src) || QDELETED(owner) || QDELETED(last_target) || !can_cast_spell()) blocked = FALSE return diff --git a/modular_nova/modules/verbs/code/subtle.dm b/modular_nova/modules/verbs/code/subtle.dm index 389127c2068..f6873a6e639 100644 --- a/modular_nova/modules/verbs/code/subtle.dm +++ b/modular_nova/modules/verbs/code/subtle.dm @@ -24,7 +24,7 @@ to_chat(user, "You cannot send IC messages (muted).") return FALSE else if(!params) - subtle_emote = tgui_input_text(user, "Choose an emote to display.", "Subtle", null, MAX_MESSAGE_LEN, TRUE) + subtle_emote = tgui_input_text(user, "Choose an emote to display.", "Subtle", null, max_length = MAX_MESSAGE_LEN, multiline = TRUE) if(!subtle_emote) return FALSE subtle_message = subtle_emote @@ -92,7 +92,7 @@ to_chat(user, span_warning("You cannot send IC messages (muted).")) return FALSE else if(!subtler_emote) - subtler_emote = tgui_input_text(user, "Choose an emote to display.", "Subtler" , null, MAX_MESSAGE_LEN, TRUE) + subtler_emote = tgui_input_text(user, "Choose an emote to display.", "Subtler" , max_length = MAX_MESSAGE_LEN, multiline = TRUE) if(!subtler_emote) return FALSE diff --git a/sound/ambience/attribution.txt b/sound/ambience/attribution.txt new file mode 100644 index 00000000000..881197c211b --- /dev/null +++ b/sound/ambience/attribution.txt @@ -0,0 +1 @@ +magma.ogg - Hot spring.Seething and bubbles(2lrs,mltprcssng).wav by newlocknew -- https://freesound.org/s/581417/ -- License: Attribution 4.0 and wind 5 by ZIP.Creates -- https://freesound.org/s/726316/ -- License: Creative Commons 0 diff --git a/sound/ambience/magma.ogg b/sound/ambience/magma.ogg index 09ccc6bf92d..e461801f9ae 100644 Binary files a/sound/ambience/magma.ogg and b/sound/ambience/magma.ogg differ diff --git a/sound/attributions.txt b/sound/attributions.txt index 3a2468205d0..aa3cd0bf37f 100644 --- a/sound/attributions.txt +++ b/sound/attributions.txt @@ -94,6 +94,8 @@ https://www.zapsplat.com/sound-effect-category/sleigh-bells/ tada_fanfare.ogg is adapted from plasterbrain's "Tada Fanfare A", which is public domain (CC 0): https://freesound.org/people/plasterbrain/sounds/397355/ +mountedgun.ogg and mountedgunend.ogg are a combination of the cannon, cqc grab, and syndicate revolver sounds. + glockenspiel_ping.ogg is adapted from FunWithSound's "Short Success Sound Glockenspiel Treasure Video Game", which is public domain (CC 0): https://freesound.org/people/FunWithSound/sounds/456965/ @@ -212,4 +214,4 @@ place glass object.wav by milpower -- https://freesound.org/s/353105/ -- License glass_reverse.ogg is adapted from a combination of: https://freesound.org/people/C_Rogers/sounds/203368/ -- glass-shattering-hit_01.ogg by C_Rogers on freesound.org (CC0) -https://freesound.org/people/Czarcazas/sounds/330800/ -- Audio reversal/fading of Shattering Glass (Small) by Czarcazas -- https://freesound.org/s/330800/ -- License: Attribution 3.0 \ No newline at end of file +https://freesound.org/people/Czarcazas/sounds/330800/ -- Audio reversal/fading of Shattering Glass (Small) by Czarcazas -- https://freesound.org/s/330800/ -- License: Attribution 3.0 diff --git a/sound/effects/screech.ogg b/sound/effects/screech.ogg index b90f612621e..f4adab5e01f 100644 Binary files a/sound/effects/screech.ogg and b/sound/effects/screech.ogg differ diff --git a/sound/items/reel1.ogg b/sound/items/reel1.ogg index 0bd2cda89b9..2e946f3d5de 100644 Binary files a/sound/items/reel1.ogg and b/sound/items/reel1.ogg differ diff --git a/sound/items/reel2.ogg b/sound/items/reel2.ogg index 64d2bc1adb4..574ac3c89b0 100644 Binary files a/sound/items/reel2.ogg and b/sound/items/reel2.ogg differ diff --git a/sound/items/reel3.ogg b/sound/items/reel3.ogg index a1d89779ec1..e1bec8e4b55 100644 Binary files a/sound/items/reel3.ogg and b/sound/items/reel3.ogg differ diff --git a/sound/items/reel4.ogg b/sound/items/reel4.ogg index ae9bdb2f5e3..64d69620cd8 100644 Binary files a/sound/items/reel4.ogg and b/sound/items/reel4.ogg differ diff --git a/sound/items/reel5.ogg b/sound/items/reel5.ogg index 6c979754a5f..66635bf28d0 100644 Binary files a/sound/items/reel5.ogg and b/sound/items/reel5.ogg differ diff --git a/sound/weapons/gun/general/mountedgun.ogg b/sound/weapons/gun/general/mountedgun.ogg new file mode 100644 index 00000000000..dfa11134eab Binary files /dev/null and b/sound/weapons/gun/general/mountedgun.ogg differ diff --git a/sound/weapons/gun/general/mountedgunend.ogg b/sound/weapons/gun/general/mountedgunend.ogg new file mode 100644 index 00000000000..dfa11134eab Binary files /dev/null and b/sound/weapons/gun/general/mountedgunend.ogg differ diff --git a/tgstation.dme b/tgstation.dme index a2567fd8aee..f19cbbb5969 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2858,6 +2858,7 @@ #include "code\game\objects\structures\cannons\cannon.dm" #include "code\game\objects\structures\cannons\cannon_instructions.dm" #include "code\game\objects\structures\cannons\cannonballs.dm" +#include "code\game\objects\structures\cannons\mounted_guns\mounted_gun.dm" #include "code\game\objects\structures\construction_console\construction_actions.dm" #include "code\game\objects\structures\construction_console\construction_console.dm" #include "code\game\objects\structures\construction_console\construction_console_aux.dm" @@ -5258,6 +5259,7 @@ #include "code\modules\mob\living\carbon\human\death.dm" #include "code\modules\mob\living\carbon\human\dummy.dm" #include "code\modules\mob\living\carbon\human\emote.dm" +#include "code\modules\mob\living\carbon\human\examine.dm" #include "code\modules\mob\living\carbon\human\human.dm" #include "code\modules\mob\living\carbon\human\human_context.dm" #include "code\modules\mob\living\carbon\human\human_defense.dm" @@ -5320,6 +5322,7 @@ #include "code\modules\mob\living\silicon\ai\multicam.dm" #include "code\modules\mob\living\silicon\ai\robot_control.dm" #include "code\modules\mob\living\silicon\ai\vox_sounds.dm" +#include "code\modules\mob\living\silicon\ai\ai_actions\remote_power.dm" #include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm" #include "code\modules\mob\living\silicon\ai\freelook\chunk.dm" #include "code\modules\mob\living\silicon\ai\freelook\eye.dm" diff --git a/tgui/packages/tgui/interfaces/Aquarium.tsx b/tgui/packages/tgui/interfaces/Aquarium.tsx index 90030afbfb4..f527bee09ea 100644 --- a/tgui/packages/tgui/interfaces/Aquarium.tsx +++ b/tgui/packages/tgui/interfaces/Aquarium.tsx @@ -319,7 +319,7 @@ const Settings = (props) => {
- + { {data.fax_id} - {data.visible ? true : false} + {data.visible ? 'true' : 'false'}