diff --git a/.github/guides/STANDARDS.md b/.github/guides/STANDARDS.md index c27c8ae7417ec..9c6496e0c4dc9 100644 --- a/.github/guides/STANDARDS.md +++ b/.github/guides/STANDARDS.md @@ -513,30 +513,6 @@ 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 45303ec0c92af..e08224dfb9a72 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@v7 + uses: actions/github-script@v6 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 d0c4c16784f8c..fcf44d00558ec 100644 --- a/.github/workflows/ci_suite.yml +++ b/.github/workflows/ci_suite.yml @@ -100,7 +100,6 @@ jobs: run: | tools/bootstrap/python tools/ticked_file_enforcement/ticked_file_enforcement.py < tools/ticked_file_enforcement/schemas/tgstation_dme.json tools/bootstrap/python tools/ticked_file_enforcement/ticked_file_enforcement.py < tools/ticked_file_enforcement/schemas/unit_tests.json - tools/bootstrap/python tools/ticked_file_enforcement/ticked_file_enforcement.py < tools/ticked_file_enforcement/schemas/modular_doppler.json # DOPPLER EDIT ADDITION - name: Check Define Sanity if: steps.linter-setup.conclusion == 'success' && !cancelled() run: tools/bootstrap/python -m define_sanity.check @@ -286,12 +285,9 @@ jobs: max-required-client-version: ${{needs.collect_data.outputs.max_required_byond_client}} completion_gate: # Serves as a non-moving target for branch rulesets - if: always() && !cancelled() name: Completion Gate needs: [ test_windows, compare_screenshots, compile_all_maps, run_linters ] runs-on: ubuntu-latest steps: - - name: Decide whether the needed jobs succeeded or failed - uses: re-actors/alls-green@release/v1 - with: - jobs: ${{ toJSON(needs) }} + - name: Mandatory Empty Step + run: exit 0 diff --git a/.github/workflows/remove_guide_comments.yml b/.github/workflows/remove_guide_comments.yml index 621d860c5cd47..e3a4ac3feda06 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@v7 + uses: actions/github-script@v6 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 80ece468061b4..7f498de144308 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@v7 + uses: actions/github-script@v6 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@v7 + uses: actions/github-script@v6 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 b48ca983b35e7..c61d09fa89057 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@v7 + uses: actions/github-script@v6 env: FILE_HOUSE_KEY: ${{ secrets.ARTIFACTS_FILE_HOUSE_KEY }} with: diff --git a/.github/workflows/test_merge_bot.yml b/.github/workflows/test_merge_bot.yml index 76dcd3cabc5b0..c77e507794413 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@v7 + uses: actions/github-script@v6 env: GET_TEST_MERGES_URL: ${{ secrets.GET_TEST_MERGES_URL }} with: diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_phonebooth.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_phonebooth.dmm index 905403954b67b..2e500943b6430 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_phonebooth.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_phonebooth.dmm @@ -70,7 +70,7 @@ /area/ruin/powered/icemoon_phone_booth) "W" = ( /obj/machinery/vending/cigarette{ - all_products_free = 0 + onstation_override = 1 }, /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/plating/icemoon, diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm index c9b3d35aa7264..121f9e4ea45d4 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm @@ -538,7 +538,9 @@ }, /area/ruin/pizzeria) "yP" = ( -/obj/machinery/vending/dinnerware, +/obj/machinery/vending/dinnerware{ + onstation = 0 + }, /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_phonebooth.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_phonebooth.dmm index 4cbf3478bc233..851cfe35548b6 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_phonebooth.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_phonebooth.dmm @@ -13,7 +13,7 @@ /area/ruin/powered/lavaland_phone_booth) "k" = ( /obj/machinery/vending/snack/green{ - all_products_free = 0 + onstation_override = 1 }, /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/plating/lavaland_atmos, @@ -66,7 +66,7 @@ /area/ruin/powered/lavaland_phone_booth) "W" = ( /obj/machinery/vending/cigarette{ - all_products_free = 0 + onstation_override = 1 }, /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/plating/lavaland_atmos, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index b73cf11fda63e..6df974f9ea279 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -18,19 +18,19 @@ "aj" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/medical/syndicate, +/obj/machinery/vending/medical/syndicate_access, /turf/open/floor/iron/white/side{ dir = 4 }, /area/ruin/syndicate_lava_base/virology) "ak" = ( -/obj/machinery/vending/boozeomat/syndicate, +/obj/machinery/vending/boozeomat/syndicate_access, /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/syndicate_lava_base/bar) "al" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/medical/syndicate, +/obj/machinery/vending/medical/syndicate_access, /turf/open/floor/iron/white, /area/ruin/syndicate_lava_base/medbay) "ap" = ( diff --git a/_maps/RandomRuins/SpaceRuins/forgottenship.dmm b/_maps/RandomRuins/SpaceRuins/forgottenship.dmm index cb2a35084f93e..7b12e87992c8a 100644 --- a/_maps/RandomRuins/SpaceRuins/forgottenship.dmm +++ b/_maps/RandomRuins/SpaceRuins/forgottenship.dmm @@ -613,7 +613,7 @@ /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/syndicate_forgotten_ship) "ct" = ( -/obj/machinery/vending/medical/syndicate/cybersun, +/obj/machinery/vending/medical/syndicate_access/cybersun, /turf/open/floor/plastic, /area/ruin/space/has_grav/syndicate_forgotten_ship) "cu" = ( diff --git a/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm b/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm index df3c3ca64277e..50e0bffd56727 100644 --- a/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm +++ b/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm @@ -139,7 +139,7 @@ "bq" = ( /obj/structure/cable/layer1, /obj/machinery/vending/sovietsoda{ - all_products_free = 0 + onstation_override = 1 }, /obj/structure/sign/poster/contraband/clown/directional/east, /obj/machinery/duct, @@ -527,7 +527,7 @@ "dU" = ( /obj/structure/cable/layer1, /obj/machinery/vending/cigarette/syndicate{ - all_products_free = 0 + onstation_override = 1 }, /obj/machinery/duct, /obj/effect/mapping_helpers/broken_machine, @@ -544,7 +544,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/duct, /obj/machinery/vending/clothing{ - all_products_free = 0 + onstation_override = 1 }, /obj/machinery/firealarm/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -1378,7 +1378,7 @@ /area/ruin/space/has_grav/hauntedtradingpost/office/meetingroom) "lT" = ( /obj/machinery/vending/cola/black{ - all_products_free = 0 + onstation_override = 1 }, /obj/machinery/duct, /obj/effect/mapping_helpers/broken_machine, @@ -1866,7 +1866,7 @@ /obj/structure/cable/layer1, /obj/machinery/duct, /obj/machinery/vending/assist{ - all_products_free = 0 + onstation_override = 1 }, /obj/machinery/camera/xray/directional/west, /turf/open/floor/catwalk_floor/iron_smooth, @@ -2475,7 +2475,7 @@ /obj/structure/cable/layer1, /obj/machinery/duct, /obj/machinery/vending/cola/shamblers{ - all_products_free = 0 + onstation_override = 1 }, /turf/open/floor/catwalk_floor/iron_smooth, /area/ruin/space/has_grav/hauntedtradingpost/public/corridor) @@ -4199,7 +4199,7 @@ "KH" = ( /obj/structure/cable/layer1, /obj/machinery/vending/donksnack{ - all_products_free = 0 + onstation_override = 1 }, /obj/machinery/duct, /obj/machinery/camera/autoname/directional/west{ @@ -4516,7 +4516,7 @@ "MO" = ( /obj/machinery/duct, /obj/machinery/vending/snack{ - all_products_free = 0 + onstation_override = 1 }, /turf/open/floor/catwalk_floor/iron_smooth, /area/ruin/space/has_grav/hauntedtradingpost/public/corridor) @@ -4616,7 +4616,7 @@ "NY" = ( /obj/structure/cable/layer1, /obj/machinery/vending/coffee{ - all_products_free = 0 + onstation_override = 1 }, /obj/machinery/duct, /turf/open/floor/catwalk_floor/iron_smooth, @@ -4755,7 +4755,7 @@ "Pk" = ( /obj/structure/cable/layer1, /obj/machinery/vending/tool{ - all_products_free = 0 + onstation_override = 1 }, /obj/structure/sign/poster/contraband/donk_co/directional/west, /obj/machinery/duct, @@ -4886,7 +4886,7 @@ "QM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/vending/sovietsoda{ - all_products_free = 0 + onstation_override = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ pipe_color = "#FF7B00"; @@ -5415,7 +5415,7 @@ /obj/structure/cable/layer1, /obj/machinery/duct, /obj/machinery/vending/medical{ - all_products_free = 0; + onstation_override = 1; name = "\improper CyberMed +" }, /turf/open/floor/catwalk_floor/iron_smooth, @@ -5635,7 +5635,7 @@ /area/ruin/space/has_grav/hauntedtradingpost/office) "Ww" = ( /obj/machinery/vending/coffee{ - all_products_free = 0 + onstation_override = 1 }, /obj/structure/cable/layer1, /obj/machinery/duct, @@ -5712,7 +5712,7 @@ "Xe" = ( /obj/structure/cable/layer1, /obj/machinery/vending/cola/shamblers{ - all_products_free = 0 + onstation_override = 1 }, /obj/machinery/duct, /obj/effect/overloader_trap, @@ -5802,7 +5802,7 @@ /area/ruin/space/has_grav/hauntedtradingpost/public) "XK" = ( /obj/machinery/vending/donksnack{ - all_products_free = 0 + onstation_override = 1 }, /obj/machinery/duct, /turf/open/floor/catwalk_floor/iron_smooth, diff --git a/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm b/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm index c925d017ad3a3..abccc6b550eb1 100644 --- a/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm +++ b/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm @@ -690,7 +690,7 @@ /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) "kw" = ( -/obj/machinery/vending/boozeomat/syndicate, +/obj/machinery/vending/boozeomat/syndicate_access, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/infested_frigate) "kS" = ( diff --git a/_maps/RandomRuins/SpaceRuins/interdyne.dmm b/_maps/RandomRuins/SpaceRuins/interdyne.dmm index 9c802b0be434c..cf8c7f8c0d408 100644 --- a/_maps/RandomRuins/SpaceRuins/interdyne.dmm +++ b/_maps/RandomRuins/SpaceRuins/interdyne.dmm @@ -140,7 +140,7 @@ /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) "fS" = ( -/obj/machinery/vending/medical/syndicate, +/obj/machinery/vending/medical/syndicate_access, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) "ga" = ( diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index 0c3c231b5f225..55f0f884f165a 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -1645,7 +1645,9 @@ /area/ruin/space/ancientstation/charlie/hall) "hr" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/dinnerware, +/obj/machinery/vending/dinnerware{ + onstation = 0 + }, /turf/open/floor/iron/cafeteria, /area/ruin/space/ancientstation/charlie/kitchen) "ht" = ( @@ -2366,7 +2368,9 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/coffee, +/obj/machinery/vending/coffee{ + onstation = 0 + }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/dorms) "ku" = ( @@ -2740,7 +2744,9 @@ /turf/open/floor/plating, /area/ruin/space/ancientstation/charlie/hall) "lU" = ( -/obj/machinery/vending/hydronutrients, +/obj/machinery/vending/hydronutrients{ + onstation = 0 + }, /obj/effect/turf_decal/tile/green/anticorner/contrasted, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hydro) diff --git a/_maps/RandomRuins/SpaceRuins/phonebooth.dmm b/_maps/RandomRuins/SpaceRuins/phonebooth.dmm index 1cf0f64e7ff0a..2eb0698ebbfd5 100644 --- a/_maps/RandomRuins/SpaceRuins/phonebooth.dmm +++ b/_maps/RandomRuins/SpaceRuins/phonebooth.dmm @@ -13,7 +13,7 @@ /area/ruin/space/has_grav/powered/space_phone_booth) "k" = ( /obj/machinery/vending/snack/green{ - all_products_free = 1 + onstation_override = 1 }, /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/plating/airless, @@ -66,7 +66,7 @@ /area/ruin/space/has_grav/powered/space_phone_booth) "W" = ( /obj/machinery/vending/cigarette{ - all_products_free = 0 + onstation_override = 1 }, /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/plating/airless, diff --git a/_maps/RandomRuins/SpaceRuins/spinwardsmoothies.dmm b/_maps/RandomRuins/SpaceRuins/spinwardsmoothies.dmm index 1ac14090b39ce..91f7771f0ea69 100644 --- a/_maps/RandomRuins/SpaceRuins/spinwardsmoothies.dmm +++ b/_maps/RandomRuins/SpaceRuins/spinwardsmoothies.dmm @@ -44,7 +44,9 @@ }, /area/ruin/space/has_grav/spinwardsmoothies) "ti" = ( -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access{ + onstation = 0 + }, /turf/open/floor/wood/tile, /area/ruin/space/has_grav/spinwardsmoothies) "wv" = ( diff --git a/_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm b/_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm index 12bc608bda910..602aa1a273b9d 100644 --- a/_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm +++ b/_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm @@ -1331,7 +1331,9 @@ /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 8 }, -/obj/machinery/vending/medical, +/obj/machinery/vending/medical{ + onstation = 0 + }, /turf/open/floor/iron/showroomfloor/airless, /area/ruin/space/has_grav/whiteship/box) "PV" = ( diff --git a/_maps/RandomZLevels/TheBeach.dmm b/_maps/RandomZLevels/TheBeach.dmm index d179a7dc5148c..41fcd3280d490 100644 --- a/_maps/RandomZLevels/TheBeach.dmm +++ b/_maps/RandomZLevels/TheBeach.dmm @@ -738,7 +738,7 @@ /turf/open/floor/iron/white/textured_large, /area/awaymission/beach) "jF" = ( -/obj/machinery/vending/boozeomat{ +/obj/machinery/vending/boozeomat/all_access{ desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one. May not work for bartenders that don't have Nanotrasen bank accounts." }, /turf/open/floor/wood/large, @@ -2766,7 +2766,7 @@ /turf/open/floor/iron/white/textured_large, /area/awaymission/beach) "Il" = ( -/obj/machinery/vending/autodrobe, +/obj/machinery/vending/autodrobe/all_access, /turf/open/misc/beach/sand, /area/awaymission/beach) "It" = ( diff --git a/_maps/RandomZLevels/museum.dmm b/_maps/RandomZLevels/museum.dmm index 88bf95847b9a4..afd0cd888fdcd 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_right_wing" + id = "museum_secret" }, /turf/open/floor/iron, /area/awaymission/museum) @@ -3128,7 +3128,7 @@ /turf/open/floor/bluespace, /area/awaymission/museum) "zC" = ( -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access, /turf/open/floor/wood/tile, /area/awaymission/museum) "zE" = ( @@ -3958,7 +3958,7 @@ /area/awaymission/museum) "FO" = ( /obj/effect/decal/cleanable/crayon/puzzle/pin{ - puzzle_id = "museum_right_wing" + puzzle_id = "museum_r_wing_puzzle" }, /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_right_wing" + id = "museum_secret" }, /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_right_wing" + puzzle_id = "museum_r_wing_puzzle" }, /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_right_wing" + id = "museum_r_wing_puzzle" }, /turf/open/floor/iron/dark, /area/awaymission/museum) @@ -5332,10 +5332,10 @@ }, /obj/machinery/door/poddoor/shutters/indestructible{ dir = 8; - id = "museum_right_wing" + id = "museum_secret" }, /obj/machinery/puzzle/password/pin/directional/south{ - id = "museum_right_wing"; + id = "museum_r_wing_puzzle"; 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_right_wing" + puzzle_id = "museum_r_wing_puzzle" }, /turf/open/floor/iron/white/small, /area/awaymission/museum) diff --git a/_maps/deathmatch/ragin_mages.dmm b/_maps/deathmatch/ragin_mages.dmm index 96249fcf6928d..1a3d307181d08 100644 --- a/_maps/deathmatch/ragin_mages.dmm +++ b/_maps/deathmatch/ragin_mages.dmm @@ -479,6 +479,9 @@ /turf/open/floor/engine/cult, /area/deathmatch) "DK" = ( +/obj/structure/railing{ + dir = 8 + }, /obj/structure/railing{ dir = 8 }, diff --git a/_maps/map_files/Basketball/stadium.dmm b/_maps/map_files/Basketball/stadium.dmm index c6b6901672553..bcbb91ce4b7ef 100644 --- a/_maps/map_files/Basketball/stadium.dmm +++ b/_maps/map_files/Basketball/stadium.dmm @@ -405,7 +405,7 @@ /turf/open/floor/wood, /area/centcom/basketball) "Ax" = ( -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access, /turf/open/floor/wood, /area/centcom/basketball) "AC" = ( diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index 06be9312ae9f9..09040a5d9031f 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -1680,17 +1680,17 @@ "aGI" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, +/obj/item/trash/can/food/pine_nuts{ + pixel_x = 16; + pixel_y = 6 + }, /obj/machinery/cell_charger{ pixel_x = -1; - pixel_y = 4 + pixel_y = 2 }, /obj/item/stock_parts/power_store/cell/high{ pixel_x = -1; - pixel_y = 4 - }, -/obj/item/assembly/timer{ - pixel_x = 14; - pixel_y = 6 + pixel_y = 1 }, /turf/open/floor/iron/dark, /area/station/commons/storage/tools) @@ -1759,15 +1759,12 @@ /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" }, -/obj/effect/turf_decal/siding/end{ - dir = 8 - }, -/obj/machinery/door/window/left/directional/south, -/turf/open/floor/iron/dark/textured_large, +/turf/open/floor/iron/kitchen/small, /area/station/service/kitchen) "aIu" = ( /obj/structure/bookcase/random/reference, @@ -8783,7 +8780,6 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/light_switch/directional/west, /obj/effect/landmark/event_spawn, -/obj/machinery/portable_atmospherics/pump/lil_pump, /turf/open/floor/iron/dark, /area/station/science/ordnance) "dpH" = ( @@ -11109,11 +11105,9 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ id = "kitchenshutters"; - name = "Kitchen Shutters"; - dir = 4 + name = "Kitchen Shutters" }, -/obj/effect/turf_decal/siding/end, -/turf/open/floor/iron/dark/textured_large, +/turf/open/floor/plating, /area/station/service/kitchen) "elc" = ( /obj/structure/cable, @@ -14999,13 +14993,9 @@ /obj/machinery/smartfridge, /obj/machinery/door/poddoor/shutters/preopen{ id = "kitchenshutters"; - name = "Kitchen Shutters"; - dir = 4 - }, -/obj/effect/turf_decal/siding/end{ - dir = 1 + name = "Kitchen Shutters" }, -/turf/open/floor/iron/dark/textured_large, +/turf/open/floor/iron/kitchen/small, /area/station/service/kitchen) "fGT" = ( /obj/effect/turf_decal/tile/neutral{ @@ -18633,7 +18623,6 @@ /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 }, @@ -18644,12 +18633,6 @@ 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" = ( @@ -19597,11 +19580,17 @@ /area/station/commons/storage/tools) "hgd" = ( /obj/structure/table, -/obj/item/screwdriver{ - pixel_y = -6 +/obj/item/clothing/head/collectable/paper{ + pixel_x = -6; + pixel_y = -2 }, -/obj/item/storage/toolbox/mechanical{ - pixel_y = 7 +/obj/item/paper/crumpled{ + pixel_x = 5; + pixel_y = 8 + }, +/obj/item/trash/candle{ + pixel_x = 7; + pixel_y = 1 }, /turf/open/floor/iron/dark, /area/station/commons/storage/tools) @@ -19964,10 +19953,6 @@ 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) @@ -20020,20 +20005,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/table, /obj/effect/decal/cleanable/dirt, +/obj/item/storage/toolbox/mechanical/old{ + pixel_x = 15; + pixel_y = 15 + }, /obj/item/crowbar/large{ pixel_y = 18 }, /obj/item/clothing/head/costume/pirate{ - pixel_x = 15; - pixel_y = -3 + pixel_x = 17; + pixel_y = -10 }, /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" = ( @@ -20231,11 +20217,9 @@ /obj/machinery/door/window/right/directional/west, /obj/machinery/door/poddoor/shutters/preopen{ id = "kitchenshutters"; - name = "Kitchen Shutters"; - dir = 8 + name = "Kitchen Shutters" }, -/obj/effect/turf_decal/siding/end, -/turf/open/floor/iron/dark/textured_large, +/turf/open/floor/iron, /area/station/service/kitchen) "hrx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -20415,7 +20399,6 @@ }, /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, @@ -34462,10 +34445,6 @@ "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" = ( @@ -34882,7 +34861,6 @@ dir = 1 }, /obj/effect/landmark/start/atmospheric_technician, -/obj/structure/cable, /turf/open/floor/wood, /area/station/engineering/break_room) "lVy" = ( @@ -35197,18 +35175,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) -"lZs" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/right/directional/south, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchenshutters"; - name = "Kitchen Shutters" - }, -/obj/effect/turf_decal/siding/end{ - dir = 4 - }, -/turf/open/floor/iron/dark/textured_large, -/area/station/service/kitchen) "lZt" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, @@ -35271,13 +35237,13 @@ /area/station/hallway/secondary/dock) "lZP" = ( /obj/structure/table, +/obj/item/clothing/head/fedora/det_hat/minor{ + pixel_x = 7; + pixel_y = 9 + }, /obj/item/toy/eightball{ pixel_x = -4 }, -/obj/item/wirecutters{ - pixel_y = 17; - pixel_x = 4 - }, /turf/open/floor/iron/dark/small, /area/station/commons/fitness/locker_room) "lZR" = ( @@ -36204,9 +36170,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/table, -/obj/item/folder/red{ - pixel_y = 3 - }, +/obj/item/folder/red, /obj/item/food/monkeycube/bee{ name = "monkey cube"; pixel_y = 17 @@ -36217,9 +36181,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" = ( @@ -36623,10 +36584,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"mzv" = ( -/obj/docking_port/stationary/syndicate/northeast, -/turf/open/space/basic, -/area/space) "mzx" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -39863,7 +39820,6 @@ pixel_x = 15; pixel_y = 7 }, -/obj/structure/cable, /turf/open/floor/wood, /area/station/engineering/break_room) "nHu" = ( @@ -40284,16 +40240,9 @@ }, /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 + name = "Kitchen Shutters" }, -/turf/open/floor/iron/dark/textured_large, +/turf/open/floor/plating, /area/station/service/kitchen) "nQa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40375,7 +40324,6 @@ }, /obj/machinery/holopad, /obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable, /turf/open/floor/iron/small, /area/station/engineering/break_room) "nQH" = ( @@ -47040,7 +46988,6 @@ }, /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" = ( @@ -47836,7 +47783,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/cable, /turf/open/floor/plating/elevatorshaft, /area/station/engineering/break_room) "qxN" = ( @@ -51265,7 +51211,6 @@ pixel_y = 6 }, /obj/structure/disposalpipe/segment, -/obj/structure/cable, /turf/open/floor/wood, /area/station/engineering/break_room) "rDj" = ( @@ -52308,19 +52253,12 @@ /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 + name = "Kitchen Shutters" }, -/turf/open/floor/iron/dark/textured_large, +/obj/effect/spawner/random/food_or_drink/condiment, +/turf/open/floor/plating, /area/station/service/kitchen) "rVy" = ( /obj/effect/turf_decal/stripes/red/line{ @@ -55563,19 +55501,12 @@ /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 + name = "Kitchen Shutters" }, -/turf/open/floor/iron/dark/textured_large, +/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{ @@ -59114,13 +59045,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) -"ugt" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/small, -/area/station/engineering/break_room) "ugA" = ( /obj/effect/turf_decal/siding/yellow{ dir = 1 @@ -63771,7 +63695,6 @@ "vDS" = ( /obj/structure/closet/secure_closet/engineering_personal, /obj/item/clothing/suit/hooded/wintercoat/engineering, -/obj/structure/cable, /turf/open/floor/iron/small, /area/station/engineering/break_room) "vDV" = ( @@ -65787,7 +65710,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/structure/cable, /turf/open/floor/iron/smooth_large, /area/station/engineering/supermatter/room) "wjG" = ( @@ -67749,20 +67671,6 @@ /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" = ( @@ -70123,7 +70031,6 @@ /area/station/maintenance/starboard/central) "xwn" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, -/obj/machinery/portable_atmospherics/pump, /turf/open/floor/iron/dark, /area/station/science/ordnance) "xwr" = ( @@ -72578,7 +72485,7 @@ /turf/closed/wall, /area/station/medical/surgery/theatre) "yfF" = ( -/obj/machinery/vending/autodrobe, +/obj/machinery/vending/autodrobe/all_access, /obj/effect/turf_decal/siding/wideplating/dark{ dir = 8 }, @@ -88451,9 +88358,9 @@ kMe kMe nDJ lWV -cYt +mWB wjw -gAV +kMe tDu ccA oPa @@ -91027,9 +90934,9 @@ awH gAV qkq wRy -urz +ayK vDS -ugt +aWA lVv nHq exQ @@ -98555,7 +98462,7 @@ sJL sne aTg aTg -lZs +aIr bIN nUd bmY @@ -118775,7 +118682,7 @@ dDB dDB dDB dDB -mzv +dDB dDB dDB dDB diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index da57feb278136..39d7cd24bdd2e 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -2842,9 +2842,6 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/landmark/event_spawn, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /turf/open/floor/iron/dark, /area/station/service/library/printer) "aII" = ( @@ -3236,15 +3233,15 @@ /area/station/ai_monitored/command/storage/eva) "aNM" = ( /obj/structure/cable, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, /obj/effect/decal/cleanable/dirt, /obj/machinery/duct, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, /turf/open/floor/iron, /area/station/maintenance/department/chapel) "aNP" = ( @@ -12212,6 +12209,9 @@ "cXb" = ( /obj/structure/cable, /obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/duct, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ @@ -16925,6 +16925,9 @@ /turf/open/floor/plating, /area/station/cargo/storage) "ehg" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /obj/machinery/newscaster/directional/west, /obj/structure/table/wood, /obj/item/clipboard, @@ -30875,6 +30878,7 @@ /turf/open/misc/sandy_dirt, /area/station/security/prison/garden) "hHo" = ( +/obj/structure/disposalpipe/trunk, /obj/machinery/chem_heater/withbuffer, /obj/effect/turf_decal/bot_red, /obj/effect/turf_decal/stripes/line{ @@ -32864,6 +32868,9 @@ "ifr" = ( /obj/structure/cable, /obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/duct, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -33697,6 +33704,9 @@ /area/station/hallway/primary/central/fore) "irx" = ( /obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/machinery/duct, @@ -39796,7 +39806,7 @@ /area/station/tcommsat/server) "jQx" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/machinery/vending/autodrobe, +/obj/machinery/vending/autodrobe/all_access, /turf/open/floor/plating, /area/station/maintenance/fore) "jQB" = ( @@ -42964,9 +42974,6 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /turf/open/floor/iron/dark, /area/station/service/library/printer) "kHp" = ( @@ -44578,13 +44585,13 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "ldl" = ( +/obj/structure/disposalpipe/segment, /obj/machinery/disposal/bin, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/stripes/line{ dir = 6 }, /obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/disposalpipe/trunk, /turf/open/floor/iron/dark, /area/station/medical/pharmacy) "ldm" = ( @@ -45380,6 +45387,9 @@ /area/station/engineering/atmos/storage/gas) "lni" = ( /obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/generic_maintenance_landmark, @@ -46654,9 +46664,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /turf/open/floor/iron/dark, /area/station/service/library/printer) "lDV" = ( @@ -47495,7 +47502,7 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) "lMF" = ( -/obj/machinery/vending/autodrobe, +/obj/machinery/vending/autodrobe/all_access, /obj/effect/turf_decal/siding/dark_blue{ dir = 8 }, @@ -52924,6 +52931,9 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 }, @@ -56023,6 +56033,9 @@ /obj/structure/sign/painting/library_private{ pixel_y = -32 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /obj/machinery/modular_computer/preset/curator{ dir = 1 }, @@ -64185,9 +64198,6 @@ dir = 8 }, /obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /turf/open/floor/iron/dark, /area/station/service/library/printer) "qaF" = ( @@ -66377,6 +66387,9 @@ /turf/open/floor/iron/white, /area/station/medical/medbay) "qEj" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /obj/machinery/light/small/directional/south, /obj/structure/table/wood, /obj/item/paper_bin{ @@ -67676,7 +67689,7 @@ "qVn" = ( /obj/machinery/light/small/directional/south, /obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access, /obj/structure/sign/poster/contraband/random/directional/south, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) @@ -72140,6 +72153,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/theater/abandoned) +"rZL" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/grille, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos) "rZU" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -80562,6 +80582,9 @@ /area/station/commons/toilet/locker) "ufz" = ( /obj/machinery/firealarm/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, /obj/effect/turf_decal/bot_white, /obj/structure/filingcabinet, /turf/open/floor/iron/dark, @@ -89948,10 +89971,8 @@ "wwN" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, +/obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, /turf/open/floor/iron/dark, /area/station/service/library/printer) "wwP" = ( @@ -90308,6 +90329,9 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "wAZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /obj/structure/table/wood, /obj/item/taperecorder, /obj/item/camera, @@ -96066,6 +96090,9 @@ dir = 4 }, /obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/duct, @@ -117120,7 +117147,7 @@ pxN yfC pxN pxN -pxN +rZL pxN pxN qYo diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index ce8f714c0e456..80c768e6a52a8 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -2371,6 +2371,12 @@ /obj/structure/fluff/shower_drain, /turf/open/floor/iron/freezer, /area/station/commons/toilet) +"aJj" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/station/service/library) "aJm" = ( /obj/structure/cable, /obj/machinery/door/window/left/directional/east{ @@ -21807,7 +21813,7 @@ /turf/open/floor/plating, /area/station/engineering/lobby) "gkN" = ( -/obj/machinery/vending/autodrobe, +/obj/machinery/vending/autodrobe/all_access, /turf/open/floor/iron/dark/textured, /area/station/security/prison) "gkP" = ( @@ -25798,7 +25804,7 @@ "hul" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/status_display/evac/directional/north, -/obj/machinery/vending/autodrobe, +/obj/machinery/vending/autodrobe/all_access, /turf/open/floor/iron, /area/station/commons/locker) "huq" = ( @@ -38488,7 +38494,6 @@ 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") @@ -40893,7 +40898,10 @@ /turf/open/floor/iron, /area/station/maintenance/department/electrical) "lOV" = ( -/obj/machinery/disposal/bin, +/obj/machinery/disposal/bin{ + desc = "A pneumatic waste disposal unit. This one leads to the morgue."; + name = "corpse disposal" + }, /obj/structure/disposalpipe/trunk{ dir = 4 }, @@ -42546,7 +42554,7 @@ }, /area/station/security/brig/entrance) "mqI" = ( -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access, /turf/open/floor/plating, /area/station/maintenance/port/aft) "mqL" = ( @@ -74188,7 +74196,7 @@ /area/station/security/prison/rec) "vwG" = ( /obj/machinery/vending/security{ - all_products_free = 0 + onstation_override = 1 }, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 @@ -257783,7 +257791,7 @@ qMm hUD pyJ lPh -hUD +aJj hUD ebb cYE diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 920c3c93f8d55..a3b90c665b221 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -268,10 +268,6 @@ /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, @@ -282,14 +278,6 @@ /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, @@ -460,18 +448,6 @@ /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, @@ -1240,6 +1216,14 @@ "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, @@ -1495,14 +1479,6 @@ /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 @@ -1645,10 +1621,6 @@ /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, @@ -1989,6 +1961,17 @@ }, /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, @@ -2324,15 +2307,6 @@ /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{ @@ -2529,14 +2503,6 @@ /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, @@ -2864,17 +2830,6 @@ }, /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, @@ -3208,30 +3163,6 @@ /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" @@ -3267,6 +3198,11 @@ /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{ @@ -4161,6 +4097,28 @@ }, /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, @@ -4993,6 +4951,11 @@ /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, @@ -5004,6 +4967,19 @@ /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; @@ -5112,14 +5088,6 @@ }, /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, @@ -5214,6 +5182,18 @@ /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, @@ -5797,14 +5777,6 @@ /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, @@ -6516,6 +6488,14 @@ /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 @@ -7474,15 +7454,6 @@ }, /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, @@ -7556,6 +7527,21 @@ /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, @@ -7595,20 +7581,6 @@ /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, @@ -8057,11 +8029,6 @@ }, /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, @@ -8228,6 +8195,15 @@ }, /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 @@ -8619,14 +8595,6 @@ /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, @@ -8659,6 +8627,15 @@ "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 @@ -8671,6 +8648,11 @@ /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{ @@ -9377,16 +9359,6 @@ }, /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{ @@ -9414,24 +9386,35 @@ }, /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{ @@ -9744,6 +9727,12 @@ /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, @@ -10008,6 +9997,14 @@ /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, @@ -10045,6 +10042,15 @@ /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 @@ -10719,6 +10725,32 @@ /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, @@ -11067,6 +11099,25 @@ /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, @@ -11213,6 +11264,12 @@ /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"; @@ -11725,34 +11782,6 @@ }, /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 @@ -11823,6 +11852,13 @@ }, /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{ @@ -11967,6 +12003,19 @@ }, /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) @@ -12005,6 +12054,15 @@ }, /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{ @@ -12271,16 +12329,6 @@ /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; @@ -12654,13 +12702,6 @@ /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" @@ -12891,12 +12932,6 @@ }, /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{ @@ -13870,10 +13905,6 @@ }, /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{ @@ -14319,6 +14350,13 @@ }, /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, @@ -15207,6 +15245,9 @@ /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, @@ -15347,6 +15388,14 @@ /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, @@ -15487,16 +15536,6 @@ /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, @@ -15704,15 +15743,6 @@ /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, @@ -16081,6 +16111,15 @@ /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"; @@ -16117,14 +16156,6 @@ /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 @@ -16161,16 +16192,6 @@ }, /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{ @@ -16580,6 +16601,14 @@ /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, @@ -16796,26 +16825,6 @@ }, /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, @@ -17025,6 +17034,22 @@ /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, @@ -17125,10 +17150,6 @@ }, /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{ @@ -17718,19 +17739,6 @@ }, /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{ @@ -18018,6 +18026,32 @@ }, /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{ @@ -18971,10 +19005,6 @@ /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, @@ -19017,16 +19047,24 @@ /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{ @@ -19486,16 +19524,6 @@ /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 @@ -19531,16 +19559,6 @@ /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, @@ -19577,12 +19595,6 @@ /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) @@ -20041,6 +20053,9 @@ }, /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 @@ -20192,10 +20207,6 @@ }, /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, @@ -20426,6 +20437,11 @@ /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, @@ -20457,6 +20473,17 @@ 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"; @@ -20628,6 +20655,31 @@ /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" @@ -21105,13 +21157,6 @@ }, /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, @@ -21191,6 +21236,11 @@ /obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron/white, /area/station/security/prison) +"hDX" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/security/checkpoint/supply) "hEc" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/poddoor/shutters/preopen{ @@ -21559,6 +21609,12 @@ }, /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{ @@ -21834,13 +21890,6 @@ /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; @@ -22162,6 +22211,13 @@ /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, @@ -22596,24 +22652,6 @@ /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 @@ -22954,6 +22992,10 @@ /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, @@ -23107,13 +23149,6 @@ }, /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, @@ -24088,6 +24123,24 @@ /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, @@ -24261,6 +24314,16 @@ /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" @@ -24753,22 +24816,6 @@ /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" @@ -26130,6 +26177,12 @@ }, /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{ @@ -26326,6 +26379,16 @@ /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, @@ -26361,11 +26424,6 @@ }, /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" @@ -26899,17 +26957,6 @@ "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, @@ -27029,6 +27076,29 @@ /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{ @@ -27095,11 +27165,6 @@ /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, @@ -27353,13 +27418,6 @@ /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 @@ -27370,6 +27428,12 @@ /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 @@ -27946,6 +28010,28 @@ "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, @@ -28829,20 +28915,6 @@ /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, @@ -29006,13 +29078,6 @@ /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; @@ -29561,6 +29626,17 @@ /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, @@ -29619,6 +29695,14 @@ /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, @@ -29750,16 +29834,6 @@ /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, @@ -30036,13 +30110,6 @@ }, /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" @@ -30133,16 +30200,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/main) -"kFb" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/opposingcorners, -/obj/effect/turf_decal/siding/white/corner{ +"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{ dir = 4 }, /turf/open/floor/iron, -/area/station/cargo/storage) +/area/station/cargo/sorting) "kFg" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 1 @@ -30171,16 +30237,6 @@ /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 @@ -30338,24 +30394,6 @@ /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, @@ -31347,6 +31385,14 @@ /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, @@ -31448,22 +31494,6 @@ /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, @@ -31837,12 +31867,6 @@ /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, @@ -32063,6 +32087,10 @@ /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, @@ -32230,6 +32258,27 @@ /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 @@ -32402,6 +32451,11 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) +"lvY" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/vending/boozeomat/all_access, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) "lvZ" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, @@ -32529,15 +32583,6 @@ }, /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, @@ -34863,6 +34908,12 @@ }, /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, @@ -34997,6 +35048,14 @@ /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, @@ -35031,6 +35090,13 @@ /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, @@ -35098,6 +35164,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/gravity_generator) +"myZ" = ( +/obj/machinery/vending/autodrobe/all_access, +/turf/open/floor/plating, +/area/station/maintenance/port) "mzg" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/red, @@ -35105,6 +35175,16 @@ /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{ @@ -36310,6 +36390,12 @@ /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" @@ -37186,10 +37272,6 @@ }, /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, @@ -37472,16 +37554,6 @@ /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{ @@ -37866,6 +37938,12 @@ }, /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{ @@ -38069,15 +38147,6 @@ /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 @@ -38760,6 +38829,20 @@ }, /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, @@ -38813,6 +38896,13 @@ /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, @@ -39639,17 +39729,17 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood, /area/station/commons/dorms) -"oby" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ +"obF" = ( +/obj/machinery/computer/exoscanner_control{ dir = 1 }, -/obj/machinery/computer/security/mining, -/obj/structure/reagent_dispensers/wall/peppertank/directional/north, -/obj/machinery/light/small/directional/north{ - pixel_x = -11 +/obj/machinery/camera/directional/south{ + c_tag = "Cargo Bay - Drone Launch Room"; + pixel_x = 14 }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/supply) +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron, +/area/station/cargo/drone_bay) "obG" = ( /turf/closed/wall, /area/station/service/theater) @@ -40150,15 +40240,6 @@ /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, @@ -41367,12 +41448,6 @@ }, /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, @@ -41676,11 +41751,6 @@ /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" @@ -41726,12 +41796,6 @@ /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, @@ -41860,15 +41924,6 @@ }, /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 @@ -41965,6 +42020,16 @@ }, /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, @@ -42231,11 +42296,6 @@ /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, @@ -42336,6 +42396,15 @@ "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{ @@ -42713,6 +42782,14 @@ /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, @@ -42822,19 +42899,6 @@ /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 @@ -42852,6 +42916,13 @@ }, /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, @@ -43011,15 +43082,6 @@ }, /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, @@ -43073,12 +43135,6 @@ /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, @@ -43830,6 +43886,19 @@ /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 @@ -43875,13 +43944,6 @@ /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{ @@ -44074,11 +44136,6 @@ }, /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, @@ -44577,18 +44634,6 @@ /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{ @@ -44924,20 +44969,6 @@ /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{ @@ -45795,12 +45826,6 @@ }, /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, @@ -45831,11 +45856,6 @@ /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, @@ -46022,6 +46042,12 @@ /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{ @@ -46082,6 +46108,13 @@ /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, @@ -46876,6 +46909,12 @@ /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 @@ -46909,10 +46948,6 @@ /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 @@ -47027,6 +47062,11 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/white, /area/station/medical/pharmacy) +"qJH" = ( +/obj/machinery/vending/autodrobe/all_access, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "qJU" = ( /obj/structure/sign/map/right{ desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; @@ -47314,13 +47354,6 @@ }, /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{ @@ -47430,6 +47463,16 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"qOZ" = ( +/obj/machinery/requests_console/directional/south{ + department = "Mining"; + name = "Mining Requests Console" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "qPs" = ( /obj/structure/lattice/catwalk, /obj/structure/marker_beacon/indigo, @@ -47688,6 +47731,9 @@ /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 @@ -48423,6 +48469,18 @@ }, /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 @@ -48432,11 +48490,6 @@ /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 @@ -48655,14 +48708,6 @@ /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 @@ -48736,6 +48781,13 @@ /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 @@ -48877,6 +48929,16 @@ /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 @@ -49103,20 +49165,6 @@ /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, @@ -49643,12 +49691,6 @@ /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, @@ -49878,19 +49920,6 @@ /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{ @@ -50220,10 +50249,6 @@ /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{ @@ -50313,11 +50338,6 @@ }, /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, @@ -50429,6 +50449,13 @@ /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{ @@ -51157,6 +51184,14 @@ /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, @@ -51383,12 +51418,6 @@ /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 @@ -51621,6 +51650,16 @@ /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 @@ -51882,30 +51921,6 @@ /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, @@ -51973,6 +51988,33 @@ }, /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, @@ -52310,13 +52352,6 @@ /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, @@ -52867,11 +52902,6 @@ }, /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, @@ -53145,19 +53175,6 @@ }, /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, @@ -53261,6 +53278,11 @@ /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, @@ -53902,12 +53924,6 @@ 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 @@ -54091,6 +54107,10 @@ /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 @@ -54369,19 +54389,6 @@ /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 @@ -55674,18 +55681,6 @@ /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{ @@ -55972,6 +55967,22 @@ /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, @@ -56203,6 +56214,14 @@ /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{ @@ -56701,6 +56720,13 @@ /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, @@ -56890,6 +56916,11 @@ /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, @@ -57159,6 +57190,14 @@ /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 @@ -57296,6 +57335,11 @@ /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{ @@ -57774,6 +57818,15 @@ }, /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, @@ -57825,6 +57878,14 @@ }, /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, @@ -57881,6 +57942,17 @@ 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{ @@ -57900,19 +57972,6 @@ }, /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 @@ -57968,6 +58027,26 @@ /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 @@ -57995,6 +58074,12 @@ /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) @@ -58093,37 +58178,6 @@ }, /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, @@ -58133,6 +58187,13 @@ "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, @@ -58305,15 +58366,6 @@ /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, @@ -59138,20 +59190,6 @@ /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, @@ -59255,13 +59293,6 @@ /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{ @@ -59604,6 +59635,15 @@ "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, @@ -59611,19 +59651,6 @@ /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 @@ -60383,6 +60410,15 @@ /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{ @@ -61009,13 +61045,6 @@ /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, @@ -61871,6 +61900,12 @@ }, /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 @@ -62474,20 +62509,6 @@ /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{ @@ -63162,13 +63183,6 @@ /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 @@ -63528,12 +63542,6 @@ }, /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 @@ -63728,6 +63736,14 @@ /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{ @@ -63794,6 +63810,12 @@ }, /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{ @@ -63847,14 +63869,6 @@ /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, @@ -64006,6 +64020,14 @@ }, /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, @@ -64104,13 +64126,6 @@ /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 @@ -64236,6 +64251,14 @@ /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) @@ -64372,15 +64395,6 @@ /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, @@ -65225,6 +65239,17 @@ /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, @@ -65658,13 +65683,6 @@ }, /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, @@ -67101,6 +67119,11 @@ /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" @@ -67531,23 +67554,10 @@ /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, @@ -67594,12 +67604,6 @@ }, /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, @@ -67628,6 +67632,15 @@ }, /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, @@ -67647,6 +67660,10 @@ /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, @@ -67874,6 +67891,10 @@ /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{ @@ -67911,15 +67932,6 @@ /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{ @@ -67946,12 +67958,6 @@ "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 @@ -68486,6 +68492,14 @@ /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{ @@ -68612,11 +68626,6 @@ }, /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, @@ -68769,10 +68778,6 @@ }, /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, @@ -68785,12 +68790,6 @@ }, /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, @@ -68956,6 +68955,18 @@ /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{ @@ -69056,6 +69067,14 @@ /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, @@ -82334,7 +82353,7 @@ pOa rJS pOa jUb -jCs +lvY sZK heE kzZ @@ -86396,7 +86415,7 @@ paD jpG kRe nVG -pDf +qOZ hKg hKg ouu @@ -86435,7 +86454,7 @@ vsr wfZ soa pOa -aFz +myZ sXI sNM tYi @@ -86914,8 +86933,8 @@ poj hnV tPt gUH -omc -wBK +dAk +dAk rhn qnj iqt @@ -87166,17 +87185,17 @@ aZj cSP cLj kRe -kRe tid qTf -hKg -cbz -cKD -wfp -aQb +oor +oor +hDX +hrC +kuS +muq oRO -aok -pkM +bgx +uYB aok mml aok @@ -87423,17 +87442,17 @@ jXu hzb cLj kRe -kRe cBZ wyP -hKg -kyf -kFQ -xKh -eDO -kFb -aok -oNR +oor +jqr +xLA +hrC +hrC +mmR +kwh +iqt +nut aok pkM aok @@ -87678,18 +87697,18 @@ omV fhn cuh jBp -cLj -ydi +wsk qHt dxo hlE -hKg -ljT -jrQ -qlh -oHm -sOE +oor +aKN +uha +tMY +hDX aok +sbP +bgx aok aok xtH @@ -87935,18 +87954,18 @@ cAf dve jXu pVV -cLj -cUt +qqr iId tkf wZo -hKg -rgW -nkq -bNw -nxI -gsV -dfk +oor +hvo +uwM +uwf +oor +ylO +tYU +hLL dfk dfk rQD @@ -88196,14 +88215,14 @@ oMx hKg hKg hKg -hKg -hKg -sJq -oOY -aCO -oRx -sAt -fwb +oor +jmR +hWK +fea +iHS +cqy +ebg +ebg fwb kQO qvV @@ -88437,9 +88456,9 @@ pma pma pma hZQ -hlT jXu -tIU +jXu +hsx jXu jXu jXu @@ -88458,7 +88477,7 @@ jXu jXu jXu cbz -lcI +bLY gQa dit uBj @@ -88472,10 +88491,10 @@ xgx rzo quT iev -pjX +gPN ebd ebd -bfw +jBy iev iev bBy @@ -88692,14 +88711,14 @@ aaa aaa aaa aaa -nmg -haZ -uSh -fzo -rNP -ieD -ssu -ggW +tdg +hkj +sQp +kuW +qHa +ujT +dYi +iDG jXu fpn knQ @@ -88725,11 +88744,11 @@ cgZ hIp ksM lQf -wsx -dsJ -npX -dtw -lzD +vKC +fwd +mwP +oTw +nLx sHX uyh hvB @@ -88949,14 +88968,14 @@ aaa aaa aaa aaa -nmg -gOO -rMd -eVG -rkX -wwN -aZz -kgZ +tdg +hkj +hkj +kuW +uth +xBq +mUF +obF jXu fpn jXu @@ -88986,9 +89005,9 @@ kkB lVp bzH bzH -rGk -xRO -rNA +mzj +sml +rmL hOh lAi bzH @@ -89206,14 +89225,14 @@ sjP sjP lMJ lMJ -nmg -vUL -xSc -pnl -xgB -yfX -pGJ -fMa +tdg +hkj +xQO +dfU +ikL +qST +xMx +qrF jXu vxO jXu @@ -89237,16 +89256,16 @@ nwm izI kQP eRd -cIl +vlP qxJ vNp -erU -aqG -uuW -pPm -jHM -hCh -exB +hvk +bzH +dGC +uud +wbW +fWn +jHW vjU bzH buH @@ -89463,14 +89482,14 @@ dMH sjP aaa aaa -nmg -nmg -nmg -jXu -tjt -aUU -uQm -jzq +tdg +tdg +tdg +fru +elz +uzb +phP +rgL jXu paU jXu @@ -89498,12 +89517,12 @@ rVn qxJ sik ryV -mhM -qCx -cap -wbW +paQ +wyS +ekb +wpO wbW -ygk +ubn hld iev rKI @@ -89755,12 +89774,12 @@ aUm jvv bNN rod -sgZ -gav -hab -uyP -ejD -rUd +mhM +dfK +wuo +tPW +ayz +bLj rnh iev nJJ @@ -90011,15 +90030,15 @@ vdW oac fhB hxd -rtG -oor -xJy -wme -oor -xbu -sZT -oor -oor +dHz +aqG +geR +ekb +lsU +bQl +pCs +bzH +bzH pNk ivB qaw @@ -90268,15 +90287,15 @@ pUk upN qxJ ajq -vwg -afW -agd -rBB -kJk -xJj -gZq -aiy -afW +eml +bzH +bvl +nKu +gxM +jRo +qCx +roG +bzH mnP tEr iOc @@ -90511,7 +90530,7 @@ okj rlU qYC pNC -qme +lpt cNg kQP kQP @@ -90526,17 +90545,17 @@ hIu liX jUs nDG -oor -oor -oby -kDb -imT -gPw -qNL -fEV -pVK -xOw -uCR +bzH +bzH +usJ +kFa +lak +rUd +cXE +ykb +cJS +ybn +fLp sVY sDT mjr @@ -90784,13 +90803,13 @@ isA eKG iit pWb -afW -kkA -fMC -uYE -iQb -hRJ -afW +bzH +wTv +sul +pkF +dtE +dSH +aqG mnP xOw iOc @@ -91041,13 +91060,13 @@ lgg uLE cSu nPN -oor -afW -afW -pog -oor -afW -afW +bzH +aqG +aqG +mxx +aqG +aqG +aqG uGU mFo npY @@ -91777,7 +91796,7 @@ hDE wZz wZz wZz -qHW +sjP iPb iPb uza @@ -93609,7 +93628,7 @@ aaa ihq ooP hZZ -dfa +rPO gmI aKb xel @@ -104400,7 +104419,7 @@ pJE pJE nFn uUl -oYs +qJH qXB wzK tcC diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index caa7913d2fc20..01234def93289 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -8836,7 +8836,7 @@ /area/mine/laborcamp/security) "Ya" = ( /obj/machinery/vending/security{ - all_products_free = 0 + onstation_override = 1 }, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index cafc8754cd887..0d591a0ea0e1b 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -52888,7 +52888,7 @@ /area/station/hallway/secondary/exit) "nDj" = ( /obj/machinery/door/firedoor, -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access, /turf/open/floor/plating, /area/station/medical/abandoned) "nDk" = ( @@ -55522,7 +55522,7 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) "omh" = ( -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/captain/private) "omj" = ( @@ -67719,7 +67719,7 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) "rtH" = ( -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index 280fcdfc858e7..dfab71ec7974e 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -2541,7 +2541,8 @@ "Xg" = ( /obj/machinery/light/directional/east, /obj/machinery/vending/syndichem{ - onstation = 0 + onstation = 0; + req_access = null }, /turf/open/floor/iron, /area/station/medical/chemistry) diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 9480252ff1386..bcf24651157e8 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -56951,7 +56951,7 @@ /turf/closed/wall, /area/station/maintenance/port/aft) "tdR" = ( -/obj/machinery/vending/autodrobe, +/obj/machinery/vending/autodrobe/all_access, /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index 59c71329b21fb..47ed0380935d8 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -15077,7 +15077,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "ftK" = ( -/obj/machinery/vending/autodrobe, +/obj/machinery/vending/autodrobe/all_access, /obj/effect/turf_decal/tile/red/half/contrasted, /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark, @@ -33124,7 +33124,7 @@ /area/station/hallway/secondary/exit/departure_lounge) "lIZ" = ( /obj/effect/turf_decal/sand/plating, -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access, /turf/open/floor/plating, /area/station/maintenance/central/greater) "lJo" = ( @@ -34147,7 +34147,7 @@ /turf/open/floor/iron, /area/station/cargo/lobby) "mds" = ( -/obj/machinery/vending/autodrobe, +/obj/machinery/vending/autodrobe/all_access, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/delivery, /obj/machinery/camera/autoname/directional/west, diff --git a/_maps/shuttles/emergency_cruise.dmm b/_maps/shuttles/emergency_cruise.dmm index 13b160b653190..c111505c14789 100644 --- a/_maps/shuttles/emergency_cruise.dmm +++ b/_maps/shuttles/emergency_cruise.dmm @@ -220,7 +220,7 @@ /turf/open/floor/iron, /area/shuttle/escape) "fL" = ( -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access, /turf/open/floor/carpet/executive, /area/shuttle/escape) "fY" = ( @@ -2262,7 +2262,7 @@ /turf/template_noop, /area/shuttle/escape) "Xu" = ( -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access, /obj/effect/turf_decal/siding/wood{ dir = 1 }, diff --git a/_maps/shuttles/emergency_humpback.dmm b/_maps/shuttles/emergency_humpback.dmm index 195f342cd3caa..f76d06925a343 100644 --- a/_maps/shuttles/emergency_humpback.dmm +++ b/_maps/shuttles/emergency_humpback.dmm @@ -115,7 +115,7 @@ /area/shuttle/escape/brig) "gW" = ( /obj/structure/window/reinforced/plasma/spawner/directional/east, -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "hd" = ( diff --git a/_maps/shuttles/emergency_imfedupwiththisworld.dmm b/_maps/shuttles/emergency_imfedupwiththisworld.dmm index cf53733c42351..6513f090c53c8 100644 --- a/_maps/shuttles/emergency_imfedupwiththisworld.dmm +++ b/_maps/shuttles/emergency_imfedupwiththisworld.dmm @@ -30,7 +30,9 @@ /area/shuttle/escape) "k" = ( /obj/machinery/light/directional/east, -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat{ + req_access = null + }, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_luxury.dmm b/_maps/shuttles/emergency_luxury.dmm index 1e1ae99d2ea5b..74b18ef61b4de 100644 --- a/_maps/shuttles/emergency_luxury.dmm +++ b/_maps/shuttles/emergency_luxury.dmm @@ -589,7 +589,7 @@ /turf/open/floor/carpet/green, /area/shuttle/escape/luxury) "zq" = ( -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access, /turf/closed/indestructible/riveted/plastinum/nodiagonal, /area/shuttle/escape/brig) "zt" = ( diff --git a/_maps/shuttles/emergency_tranquility.dmm b/_maps/shuttles/emergency_tranquility.dmm index ae3924becbc02..4563d89631cd6 100644 --- a/_maps/shuttles/emergency_tranquility.dmm +++ b/_maps/shuttles/emergency_tranquility.dmm @@ -453,7 +453,7 @@ /area/shuttle/escape) "jb" = ( /obj/machinery/barsign/all_access/directional/north, -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access, /turf/open/floor/stone, /area/shuttle/escape) "jl" = ( diff --git a/_maps/shuttles/hunter_mi13_foodtruck.dmm b/_maps/shuttles/hunter_mi13_foodtruck.dmm index 6ece8822d802a..5fe7324e8e83b 100644 --- a/_maps/shuttles/hunter_mi13_foodtruck.dmm +++ b/_maps/shuttles/hunter_mi13_foodtruck.dmm @@ -123,7 +123,7 @@ /turf/open/floor/circuit/red/off, /area/shuttle/hunter/mi13_foodtruck) "eA" = ( -/obj/machinery/vending/medical/syndicate/cybersun, +/obj/machinery/vending/medical/syndicate_access/cybersun, /obj/machinery/airalarm/directional/west, /obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/circuit/red/off, diff --git a/_maps/shuttles/infiltrator_advanced.dmm b/_maps/shuttles/infiltrator_advanced.dmm index 1800d638fc540..9f93df25b0479 100644 --- a/_maps/shuttles/infiltrator_advanced.dmm +++ b/_maps/shuttles/infiltrator_advanced.dmm @@ -710,7 +710,7 @@ /area/shuttle/syndicate/eva) "bP" = ( /obj/effect/turf_decal/bot, -/obj/machinery/vending/medical/syndicate, +/obj/machinery/vending/medical/syndicate_access, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/medical) "bQ" = ( diff --git a/_maps/shuttles/pirate_default.dmm b/_maps/shuttles/pirate_default.dmm index 182f51ad3b6a2..43c72a9d2bfa3 100644 --- a/_maps/shuttles/pirate_default.dmm +++ b/_maps/shuttles/pirate_default.dmm @@ -567,7 +567,9 @@ /turf/open/floor/iron, /area/shuttle/pirate) "bH" = ( -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access{ + onstation = 0 + }, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/shuttle/pirate) diff --git a/_maps/shuttles/pirate_dutchman.dmm b/_maps/shuttles/pirate_dutchman.dmm index a00fff6e7e9fb..1d1a0b0902b86 100644 --- a/_maps/shuttles/pirate_dutchman.dmm +++ b/_maps/shuttles/pirate_dutchman.dmm @@ -359,33 +359,10 @@ }, /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{ @@ -1257,7 +1234,7 @@ fW St QM da -nb +WB WB RQ eG @@ -1284,7 +1261,7 @@ km sC mG bn -qG +WB WB xY WR diff --git a/_maps/shuttles/pirate_ex_interdyne.dmm b/_maps/shuttles/pirate_ex_interdyne.dmm index 3896e755f85d9..4036972b7a87a 100644 --- a/_maps/shuttles/pirate_ex_interdyne.dmm +++ b/_maps/shuttles/pirate_ex_interdyne.dmm @@ -775,7 +775,7 @@ /area/shuttle/pirate) "OL" = ( /obj/effect/turf_decal/tile/dark_blue/half/contrasted, -/obj/machinery/vending/medical/syndicate, +/obj/machinery/vending/medical/syndicate_access, /turf/open/floor/iron/dark, /area/shuttle/pirate) "Po" = ( diff --git a/_maps/shuttles/pirate_grey.dmm b/_maps/shuttles/pirate_grey.dmm index 50594b83d9b59..db02acbdd48f5 100644 --- a/_maps/shuttles/pirate_grey.dmm +++ b/_maps/shuttles/pirate_grey.dmm @@ -183,7 +183,7 @@ /turf/open/floor/plating, /area/shuttle/pirate) "gQ" = ( -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access, /turf/closed/wall, /area/shuttle/pirate) "hk" = ( diff --git a/_maps/shuttles/pirate_irs.dmm b/_maps/shuttles/pirate_irs.dmm index c78c73a75380e..4fd5a8c357342 100644 --- a/_maps/shuttles/pirate_irs.dmm +++ b/_maps/shuttles/pirate_irs.dmm @@ -946,7 +946,9 @@ }, /area/shuttle/pirate) "Cf" = ( -/obj/machinery/vending/autodrobe, +/obj/machinery/vending/autodrobe{ + onstation = 0 + }, /obj/effect/turf_decal/siding/dark_green{ dir = 6 }, @@ -1640,7 +1642,9 @@ /turf/open/floor/wood, /area/shuttle/pirate) "QT" = ( -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access{ + onstation = 0 + }, /turf/closed/wall/mineral/titanium, /area/shuttle/pirate) "QV" = ( diff --git a/_maps/shuttles/pirate_silverscale.dmm b/_maps/shuttles/pirate_silverscale.dmm index b95c32be7d1e7..6d9c7537bde18 100644 --- a/_maps/shuttles/pirate_silverscale.dmm +++ b/_maps/shuttles/pirate_silverscale.dmm @@ -492,7 +492,9 @@ /turf/open/floor/iron/dark, /area/shuttle/pirate) "CW" = ( -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access{ + onstation = 0 + }, /turf/open/floor/iron/dark/textured, /area/shuttle/pirate) "DX" = ( @@ -965,7 +967,9 @@ /turf/open/floor/carpet/royalblack, /area/shuttle/pirate) "XB" = ( -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access{ + onstation = 0 + }, /obj/machinery/light/small/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 10 diff --git a/_maps/shuttles/whiteship_box.dmm b/_maps/shuttles/whiteship_box.dmm index ed2e2a17b9077..8aa60f4e93bd2 100644 --- a/_maps/shuttles/whiteship_box.dmm +++ b/_maps/shuttles/whiteship_box.dmm @@ -1272,7 +1272,9 @@ /area/shuttle/abandoned/medbay) "cL" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/medical, +/obj/machinery/vending/medical{ + req_access = null + }, /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/all_access, /turf/open/floor/iron/white, diff --git a/_maps/shuttles/whiteship_cere.dmm b/_maps/shuttles/whiteship_cere.dmm index fbcca99889a4e..df697dc1739c1 100644 --- a/_maps/shuttles/whiteship_cere.dmm +++ b/_maps/shuttles/whiteship_cere.dmm @@ -581,7 +581,7 @@ /turf/open/floor/pod/dark, /area/shuttle/abandoned/cargo) "CC" = ( -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access, /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/east, /obj/effect/mapping_helpers/airalarm/unlocked, diff --git a/_maps/shuttles/whiteship_delta.dmm b/_maps/shuttles/whiteship_delta.dmm index f75f87001b517..efc2302379730 100644 --- a/_maps/shuttles/whiteship_delta.dmm +++ b/_maps/shuttles/whiteship_delta.dmm @@ -101,7 +101,7 @@ /turf/open/floor/plating, /area/shuttle/abandoned/crew) "ap" = ( -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, diff --git a/_maps/shuttles/whiteship_obelisk.dmm b/_maps/shuttles/whiteship_obelisk.dmm index 9a680e80e2b08..0f1e07b1a213e 100644 --- a/_maps/shuttles/whiteship_obelisk.dmm +++ b/_maps/shuttles/whiteship_obelisk.dmm @@ -732,7 +732,9 @@ /turf/open/floor/mineral/titanium/white, /area/shuttle/abandoned/medbay) "Qp" = ( -/obj/machinery/vending/medical, +/obj/machinery/vending/medical{ + req_access = null + }, /turf/open/floor/mineral/titanium/white, /area/shuttle/abandoned/medbay) "RG" = ( diff --git a/_maps/templates/battlecruiser_starfury.dmm b/_maps/templates/battlecruiser_starfury.dmm index 15d7485c99bf3..59d6b325fdaac 100644 --- a/_maps/templates/battlecruiser_starfury.dmm +++ b/_maps/templates/battlecruiser_starfury.dmm @@ -1061,7 +1061,7 @@ }, /area/shuttle/sbc_starfury) "ea" = ( -/obj/machinery/vending/medical/syndicate/cybersun, +/obj/machinery/vending/medical/syndicate_access/cybersun, /turf/open/floor/iron, /area/shuttle/sbc_starfury) "ec" = ( @@ -1723,7 +1723,7 @@ /turf/open/floor/pod/light, /area/shuttle/sbc_starfury) "gH" = ( -/obj/machinery/vending/boozeomat/syndicate, +/obj/machinery/vending/boozeomat/syndicate_access, /obj/effect/turf_decal/siding/wood{ dir = 8 }, diff --git a/_maps/templates/lazy_templates/wizard_den.dmm b/_maps/templates/lazy_templates/wizard_den.dmm index a909cc94c23b2..887e1c0817639 100644 --- a/_maps/templates/lazy_templates/wizard_den.dmm +++ b/_maps/templates/lazy_templates/wizard_den.dmm @@ -665,6 +665,9 @@ /turf/open/floor/engine/cult, /area/centcom/wizard_station) "KL" = ( +/obj/structure/railing{ + dir = 8 + }, /obj/structure/railing{ dir = 8 }, diff --git a/_maps/templates/shelter_3.dmm b/_maps/templates/shelter_3.dmm index 2bae50e8ba790..d4681507a37e4 100644 --- a/_maps/templates/shelter_3.dmm +++ b/_maps/templates/shelter_3.dmm @@ -35,7 +35,9 @@ /turf/open/floor/pod/dark, /area/misc/survivalpod) "h" = ( -/obj/machinery/vending/boozeomat, +/obj/machinery/vending/boozeomat/all_access{ + onstation = 0 + }, /turf/open/floor/pod/dark, /area/misc/survivalpod) "i" = ( @@ -144,7 +146,9 @@ /turf/open/floor/carpet/black, /area/misc/survivalpod) "z" = ( -/obj/machinery/vending/cigarette, +/obj/machinery/vending/cigarette{ + onstation = 0 + }, /turf/open/floor/carpet/black, /area/misc/survivalpod) "A" = ( @@ -222,7 +226,10 @@ /turf/open/floor/carpet/black, /area/misc/survivalpod) "L" = ( -/obj/machinery/vending/snack/blue, +/obj/machinery/vending/snack/blue{ + req_access = null; + onstation = 0 + }, /turf/open/floor/carpet/black, /area/misc/survivalpod) "M" = ( diff --git a/_maps/virtual_domains/island_brawl.dmm b/_maps/virtual_domains/island_brawl.dmm index 62a63f81bab2e..c9010062f54b1 100644 --- a/_maps/virtual_domains/island_brawl.dmm +++ b/_maps/virtual_domains/island_brawl.dmm @@ -3416,7 +3416,7 @@ /turf/open/floor/wood/parquet, /area/virtual_domain) "QX" = ( -/obj/machinery/vending/boozeomat{ +/obj/machinery/vending/boozeomat/all_access{ desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one. May not work for bartenders that don't have Nanotrasen bank accounts." }, /turf/open/floor/wood/large, @@ -3808,7 +3808,7 @@ /turf/open/floor/iron/dark/diagonal, /area/virtual_domain) "Uk" = ( -/obj/machinery/vending/autodrobe, +/obj/machinery/vending/autodrobe/all_access, /turf/open/misc/beach/sand, /area/virtual_domain/fullbright) "Um" = ( diff --git a/_maps/virtual_domains/meta_central.dmm b/_maps/virtual_domains/meta_central.dmm index 2fc87ae17c818..bf821cc6e3433 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/virtual_domain/pirate, +/obj/effect/mob_spawn/ghost_role/human/pirate/skeleton/captain, /turf/open/floor/plating, /area/virtual_domain) "aV" = ( @@ -4413,14 +4413,14 @@ /area/virtual_domain) "Lq" = ( /obj/structure/table/reinforced, -/obj/item/clothing/glasses/night/colorless{ - pixel_x = 5; - pixel_y = 7 +/obj/item/clothing/glasses/hud/security/night{ + pixel_x = -8; + pixel_y = -6 }, -/obj/item/clothing/glasses/night/colorless, -/obj/item/clothing/glasses/night/colorless{ - pixel_x = -5; - pixel_y = -3 +/obj/item/clothing/glasses/hud/security/night, +/obj/item/clothing/glasses/hud/security/night{ + pixel_x = 8; + pixel_y = 8 }, /turf/template_noop, /area/virtual_domain/safehouse) @@ -5023,7 +5023,7 @@ /turf/open/floor/iron, /area/virtual_domain) "PR" = ( -/obj/machinery/vending/boozeomat/syndicate, +/obj/machinery/vending/boozeomat/syndicate_access, /obj/effect/turf_decal/tile/bar, /turf/open/floor/iron, /area/virtual_domain) diff --git a/_maps/virtual_domains/syndicate_assault.dmm b/_maps/virtual_domains/syndicate_assault.dmm index d8c63675d77b2..d825152e480e7 100644 --- a/_maps/virtual_domains/syndicate_assault.dmm +++ b/_maps/virtual_domains/syndicate_assault.dmm @@ -1103,7 +1103,7 @@ /turf/open/floor/iron/dark, /area/virtual_domain) "SX" = ( -/obj/machinery/vending/medical/syndicate/cybersun, +/obj/machinery/vending/medical/syndicate_access/cybersun, /turf/open/floor/plastic, /area/virtual_domain) "TB" = ( diff --git a/code/__DEFINES/_flags.dm b/code/__DEFINES/_flags.dm index 9b3b239034b96..687f5365f6d4a 100644 --- a/code/__DEFINES/_flags.dm +++ b/code/__DEFINES/_flags.dm @@ -140,8 +140,6 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define BINARY_JAMMING (1<<17) /// This area prevents Bag of Holding rifts from being opened. #define NO_BOH (1<<18) -/// This area prevents fishing from removing unique/limited loot from sources that're also used outside of it. -#define UNLIMITED_FISHING (1<<19) /* These defines are used specifically with the atom/pass_flags bitmask diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index 57dc338d3ebc3..1af3003bb8577 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -81,7 +81,6 @@ #define SECHUD_ASSISTANT "hudassistant" #define SECHUD_ATMOSPHERIC_TECHNICIAN "hudatmospherictechnician" #define SECHUD_BARTENDER "hudbartender" -#define SECHUD_BUSSER "hudbusser" #define SECHUD_BITAVATAR "hudbitavatar" #define SECHUD_BITRUNNER "hudbitrunner" #define SECHUD_BOTANIST "hudbotanist" diff --git a/code/__DEFINES/chat.dm b/code/__DEFINES/chat.dm index 40f342df26834..f4f88df6c706e 100644 --- a/code/__DEFINES/chat.dm +++ b/code/__DEFINES/chat.dm @@ -45,8 +45,6 @@ #define debug_world_log(msg) if (GLOB.Debug2) log_world("DEBUG: [msg]") /// Adds a generic box around whatever message you're sending in chat. Really makes things stand out. #define examine_block(str) ("
" + str + "
") -/// Makes a fieldset with a name in the middle top part. Can apply additional classes -#define fieldset_block(title, content, classes) ("
" + title + "
" + content + "
") /// Makes a horizontal line with text in the middle #define separator_hr(str) ("
" + str + "
") /// Emboldens runechat messages diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 439d803fb942d..60cd3a7b018b7 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -76,12 +76,15 @@ #define CANUNCONSCIOUS (1<<2) /// If set, this mob can be grabbed or pushed when bumped into #define CANPUSH (1<<3) +/// Mob godmode. Prevents most statuses and damage from being taken, but is more often than not a crapshoot. Use with caution. +#define GODMODE (1<<4) DEFINE_BITFIELD(status_flags, list( "CAN STUN" = CANSTUN, "CAN KNOCKDOWN" = CANKNOCKDOWN, "CAN UNCONSCIOUS" = CANUNCONSCIOUS, "CAN PUSH" = CANPUSH, + "GOD MODE" = GODMODE, )) //Health Defines diff --git a/code/__DEFINES/crafting.dm b/code/__DEFINES/crafting.dm index cb7930e9d1fb6..54dc479aa7306 100644 --- a/code/__DEFINES/crafting.dm +++ b/code/__DEFINES/crafting.dm @@ -28,10 +28,6 @@ #define CRAFT_CHECK_DENSITY (1<<5) /// If the created atom will gain custom mat datums #define CRAFT_APPLIES_MATS (1<<6) -/// Crafting passes reagents of components to the finished product -#define CRAFT_TRANSFERS_REAGENTS (1<<7) -/// Crafting clears all reagents present in the finished product -#define CRAFT_CLEARS_REAGENTS (1<<8) //food/drink crafting defines //When adding new defines, please make sure to also add them to the encompassing list diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm index 2e42957aa3a08..3282c9387a1e5 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm @@ -9,8 +9,6 @@ #define COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON "atom_init_success_on" ///from base of atom/examine(): (/mob, list/examine_text) #define COMSIG_ATOM_EXAMINE "atom_examine" -///from base of atom/examine_tags(): (/mob, list/examine_tags) -#define COMSIG_ATOM_EXAMINE_TAGS "atom_examine_tags" ///from base of atom/get_examine_name(): (/mob, list/overrides) #define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name" //Positions for overrides list diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm index 46e179ee567ba..f855b0bea0569 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm @@ -89,6 +89,10 @@ /// Sent from [atom/proc/item_interaction], when this atom is used as a tool and an event occurs #define COMSIG_ITEM_TOOL_ACTED "tool_item_acted" +/// This is sent via item interaction (IE, item clicking on atom) right before the item's inserted into the atom's storage +/// Args: (obj/item/inserting, mob/living/user) +#define COMSIG_ATOM_STORAGE_ITEM_INTERACT_INSERT "atom_storage_item_interact_insert" + #define BLOCK_STORAGE_INSERT (1<<0) /// from /obj/projectile/energy/fisher/on_hit() or /obj/item/gun/energy/recharge/fisher when striking a target #define COMSIG_ATOM_SABOTEUR_ACT "hit_by_saboteur" #define COMSIG_SABOTEUR_SUCCESS 1 diff --git a/code/__DEFINES/dcs/signals/signals_fish.dm b/code/__DEFINES/dcs/signals/signals_fish.dm index 9b614f924549f..8af3b8dfca79c 100644 --- a/code/__DEFINES/dcs/signals/signals_fish.dm +++ b/code/__DEFINES/dcs/signals/signals_fish.dm @@ -8,13 +8,6 @@ ///The item won't be inserted into the aquarium, but will early return attackby anyway. #define COMSIG_CANNOT_INSERT_IN_AQUARIUM (1<<1) -///Updates the appearance of a newly generated aquarium content visual:(visual) -#define COMSIG_AQUARIUM_CONTENT_GENERATE_APPEARANCE "aquarium_content_apply_appearance" -///Updates the base position of an aquarium content visual:(aquarium, visual) -#define AQUARIUM_CONTENT_RANDOMIZE_POSITION "aquarium_content_randomize_position" -///Updates the animation of an aquarium content visual:(aquarium, visual) -#define COMSIG_AQUARIUM_CONTENT_DO_ANIMATION "aquarium_content_do_animation" - // Fish signals #define COMSIG_FISH_STATUS_CHANGED "fish_status_changed" #define COMSIG_FISH_STIRRED "fish_stirred" @@ -22,32 +15,19 @@ #define COMSIG_FISH_LIFE "fish_life" ///From /datum/fish_trait/eat_fish: (predator) #define COMSIG_FISH_EATEN_BY_OTHER_FISH "fish_eaten_by_other_fish" -///From /obj/item/fish/generate_reagents_to_add, which returns a holder when the fish is eaten or composted for example: (list/reagents) -#define COMSIG_GENERATE_REAGENTS_TO_ADD "generate_reagents_to_add" ///From /obj/item/fish/feed: (fed_reagents, fed_reagent_type) #define COMSIG_FISH_FED "fish_on_fed" +///from /obj/item/fish/pet_fish +#define COMSIG_FISH_PETTED "fish_petted" ///From /obj/item/fish/update_size_and_weight: (new_size, new_weight) #define COMSIG_FISH_UPDATE_SIZE_AND_WEIGHT "fish_update_size_and_weight" ///From /obj/item/fish/update_fish_force: (weight_rank, bonus_malus) #define COMSIG_FISH_FORCE_UPDATED "fish_force_updated" -///From /obj/item/fish/interact_with_atom_secondary, sent to the target: (fish) -#define COMSIG_FISH_RELEASED_INTO "fish_released_into" - -///From /datum/fishing_challenge/New: (datum/fishing_challenge/challenge) -#define COMSIG_MOB_BEGIN_FISHING "mob_begin_fishing" -///From /datum/fishing_challenge/start_minigame_phase: (datum/fishing_challenge/challenge) -#define COMSIG_MOB_BEGIN_FISHING_MINIGAME "mob_begin_fishing_minigame" -///From /datum/fishing_challenge/completed: (datum/fishing_challenge/challenge, win) -#define COMSIG_MOB_COMPLETE_FISHING "mob_complete_fishing" - -/// Rolling a reward path for a fishing challenge -#define COMSIG_FISHING_CHALLENGE_ROLL_REWARD "fishing_roll_reward" -/// Adjusting the difficulty of a rishing challenge, often based on the reward path -#define COMSIG_FISHING_CHALLENGE_GET_DIFFICULTY "fishing_get_difficulty" /// Fishing challenge completed +#define COMSIG_FISHING_CHALLENGE_COMPLETED "fishing_completed" /// Sent to the fisherman when the reward is dispensed: (reward) -#define COMSIG_FISH_SOURCE_REWARD_DISPENSED "fish_source_reward_dispensed" +#define COMSIG_FISH_SOURCE_REWARD_DISPENSED "mob_fish_source_reward_dispensed" /// Called when you try to use fishing rod on anything #define COMSIG_PRE_FISHING "pre_fishing" diff --git a/code/__DEFINES/dcs/signals/signals_global_object.dm b/code/__DEFINES/dcs/signals/signals_global_object.dm index d100f47a3c97c..bed06ff176c1f 100644 --- a/code/__DEFINES/dcs/signals/signals_global_object.dm +++ b/code/__DEFINES/dcs/signals/signals_global_object.dm @@ -1,9 +1,9 @@ /// signals from globally accessible objects -///from SSJob whenever setup_occupations() is called, all occupations are set +///from SSJob whenever SetupOccupations() is called, all occupations are set #define COMSIG_OCCUPATIONS_SETUP "occupations_setup" -///from SSJob when divide_occupations() is called +///from SSJob when DivideOccupations is called #define COMSIG_OCCUPATIONS_DIVIDED "occupations_divided" ///from SSsun when the sun changes position : (azimuth) diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm index 1c6fcbffbda3d..16f7e00e78a19 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm @@ -11,6 +11,3 @@ #define COMSIG_BOT_RESET "bot_reset" ///Sent off /mob/living/basic/bot/proc/set_mode_flags() : (new_flags) #define COMSIG_BOT_MODE_FLAGS_SET "bot_mode_flags_set" - -///Signal sent off of ai/movement/proc/start_moving_towards -#define COMSIG_MOB_AI_MOVEMENT_STARTED "mob_ai_movement_started" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm index b95ffba607fd3..56d5ddf452471 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm @@ -118,7 +118,7 @@ ///Applied preferences to a human #define COMSIG_HUMAN_PREFS_APPLIED "human_prefs_applied" -///Whenever equip_rank is called, called after job is set +///Whenever EquipRanked is called, called after job is set #define COMSIG_JOB_RECEIVED "job_received" ///from /mob/living/carbon/human/proc/set_coretemperature(): (oldvalue, newvalue) #define COMSIG_HUMAN_CORETEMP_CHANGE "human_coretemp_change" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm index 5fe266bc3f0d1..1b2d82ca9c5d7 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -140,11 +140,6 @@ #define SPEECH_SAYMODE 10 #define SPEECH_MODS 11 -///from /datum/component/speechmod/handle_speech(): () -#define COMSIG_TRY_MODIFY_SPEECH "try_modify_speech" - ///Return value if we prevent speech from being modified - #define PREVENT_MODIFY_SPEECH 1 - ///from /mob/say_dead(): (mob/speaker, message) #define COMSIG_MOB_DEADSAY "mob_deadsay" #define MOB_DEADSAY_SIGNAL_INTERCEPT (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm index aee6f2df79bb7..47f5b7485991b 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_silicon.dm @@ -8,12 +8,3 @@ #define COMSIG_BORG_HUG_HANDLED 1 ///called from /mob/living/silicon/attack_hand proc #define COMSIG_MOB_PAT_BORG "mob_pat_borg" -///called when someone is inquiring about an AI's linked core -#define COMSIG_SILICON_AI_CORE_STATUS "AI_core_status" - #define COMPONENT_CORE_ALL_GOOD (1<<0) - #define COMPONENT_CORE_DISCONNECTED (1<<1) -///called when an AI (malf or perhaps combat upgraded or some other circumstance that has them inhabit -///an APC) enters an APC -#define COMSIG_SILICON_AI_OCCUPY_APC "AI_occupy_apc" -///called when an AI vacates an APC -#define COMSIG_SILICON_AI_VACATE_APC "AI_vacate_apc" diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index 1b167de3354d2..797256017d456 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -194,8 +194,6 @@ #define COMSIG_TOOL_IN_USE "tool_in_use" ///from base of [/obj/item/proc/tool_start_check]: (mob/living/user) #define COMSIG_TOOL_START_USE "tool_start_use" -/// From /obj/item/multitool/remove_buffer(): (buffer) -#define COMSIG_MULTITOOL_REMOVE_BUFFER "multitool_remove_buffer" ///from [/obj/item/proc/disableEmbedding]: #define COMSIG_ITEM_DISABLE_EMBED "item_disable_embed" ///from [/obj/effect/mine/proc/triggermine]: @@ -418,6 +416,10 @@ ///sent to the projectile when spawning the item (shrapnel) that may be embedded: (new_item) #define COMSIG_PROJECTILE_ON_SPAWN_EMBEDDED "projectile_on_spawn_embedded" +/// from /obj/projectile/energy/fisher/on_hit() or /obj/item/gun/energy/recharge/fisher when striking a target +#define COMSIG_HIT_BY_SABOTEUR "hit_by_saboteur" + #define COMSIG_SABOTEUR_SUCCESS (1<<0) + // /obj/vehicle/sealed/car/vim signals ///from /datum/action/vehicle/sealed/noise/chime/Trigger(): () diff --git a/code/__DEFINES/dcs/signals/signals_spell.dm b/code/__DEFINES/dcs/signals/signals_spell.dm index 08074116be2c3..8d02affded85a 100644 --- a/code/__DEFINES/dcs/signals/signals_spell.dm +++ b/code/__DEFINES/dcs/signals/signals_spell.dm @@ -68,9 +68,6 @@ #define COMSIG_SPELL_TOUCH_HAND_HIT "spell_touch_hand_cast" // Jaunt Spells -/// Sent from datum/action/cooldown/spell/jaunt/before_cast, before the mob enters jaunting as a pre-check: (datum/action/cooldown/spell/spell) -#define COMSIG_MOB_PRE_JAUNT "spell_mob_pre_jaunt" - #define COMPONENT_BLOCK_JAUNT (1<<0) /// Sent from datum/action/cooldown/spell/jaunt/enter_jaunt, to the mob jaunting: (obj/effect/dummy/phased_mob/jaunt, datum/action/cooldown/spell/spell) #define COMSIG_MOB_ENTER_JAUNT "spell_mob_enter_jaunt" /// Set from /obj/effect/dummy/phased_mob after the mob is ejected from its contents: (obj/effect/dummy/phased_mob/jaunt, mob/living/unjaunter) diff --git a/code/__DEFINES/fish.dm b/code/__DEFINES/fish.dm index 43e0e8587f9aa..04557b4a8e606 100644 --- a/code/__DEFINES/fish.dm +++ b/code/__DEFINES/fish.dm @@ -6,11 +6,6 @@ // Baseline fishing difficulty levels #define FISHING_DEFAULT_DIFFICULTY 15 #define FISHING_EASY_DIFFICULTY 10 -/** - * The minimum value of the difficulty of the minigame (unless it reaches 0 than it's auto-win) - * Any lower than this and the fish will be way too lethargic for the minigame to be engaging in the slightest. - */ -#define FISHING_MINIMUM_DIFFICULTY 6 /// Difficulty modifier when bait is fish's favorite #define FAV_BAIT_DIFFICULTY_MOD -5 @@ -141,27 +136,12 @@ #define FISH_WEIGHT_SLOWDOWN_EXPONENT 0.54 ///Used to calculate the force of the fish by comparing (1 + log(weight/this_define)) and the w_class of the item. #define FISH_WEIGHT_FORCE_DIVISOR 250 -///The multiplier used in the FISH_WEIGHT_BITE_DIVISOR define -#define FISH_WEIGHT_GRIND_TO_BITE_MULT 0.4 -///Used to calculate how many bites a fish can take and therefore the amount of reagents it has. -#define FISH_WEIGHT_BITE_DIVISOR (FISH_GRIND_RESULTS_WEIGHT_DIVISOR * FISH_WEIGHT_GRIND_TO_BITE_MULT) ///The breeding timeout for newly instantiated fish is multiplied by this. #define NEW_FISH_BREEDING_TIMEOUT_MULT 2 ///The last feeding timestamp of newly instantiated fish is multiplied by this: ergo, they spawn 50% hungry. #define NEW_FISH_LAST_FEEDING_MULT 0.5 -//IF YOU ADD ANY NEW FLAG, ADD IT TO THE RESPECTIVE BITFIELD in _globalvars/bitfields.dm TOO! - -///This fish is shown in the catalog and on the wiki (this only matters as an initial, compile-time value) -#define FISH_FLAG_SHOW_IN_CATALOG (1<<0) -///This fish has a flopping animation done through matrices -#define FISH_DO_FLOP_ANIM (1<<1) -///This fish has been petted in the last 30 seconds -#define FISH_FLAG_PETTED (1<<2) -///This fish can be scanned to complete fish scanning experiments -#define FISH_FLAG_EXPERIMENT_SCANNABLE (1<<3) - #define MIN_AQUARIUM_TEMP T0C #define MAX_AQUARIUM_TEMP (T0C + 100) #define DEFAULT_AQUARIUM_TEMP (T0C + 24) @@ -178,8 +158,8 @@ #define AQUARIUM_FLUID_SALTWATER "Saltwater" #define AQUARIUM_FLUID_SULPHWATEVER "Sulfuric Water" #define AQUARIUM_FLUID_AIR "Air" -#define AQUARIUM_FLUID_ANADROMOUS "Anadromous" -#define AQUARIUM_FLUID_ANY_WATER "Any Fluid" +#define AQUARIUM_FLUID_ANADROMOUS "Adaptive to both Freshwater and Saltwater" +#define AQUARIUM_FLUID_ANY_WATER "Adaptive to all kind of water" ///Fluff. The name of the aquarium company shown in the fish catalog #define AQUARIUM_COMPANY "Aquatech Ltd." @@ -205,15 +185,10 @@ /// The height of the minigame slider. Not in pixels, but minigame units. #define FISHING_MINIGAME_AREA 1000 -///The fish needs to be cooked for at least this long so that it can be safely eaten -#define FISH_SAFE_COOKING_DURATION 30 SECONDS - ///Defines for fish properties from the collect_fish_properties proc #define FISH_PROPERTIES_FAV_BAIT "fav_bait" #define FISH_PROPERTIES_BAD_BAIT "bad_bait" #define FISH_PROPERTIES_TRAITS "fish_traits" -#define FISH_PROPERTIES_BEAUTY_SCORE "beauty_score" -#define FISH_PROPERTIES_EVOLUTIONS "evolutions" ///Define for favorite and disliked baits that aren't just item typepaths. #define FISH_BAIT_TYPE "Type" @@ -221,27 +196,3 @@ #define FISH_BAIT_REAGENT "Reagent" #define FISH_BAIT_VALUE "Value" #define FISH_BAIT_AMOUNT "Amount" - - -///We multiply the weight of fish inside the loot table by this value if we are goofy enough to fish without a bait. -#define FISH_WEIGHT_MULT_WITHOUT_BAIT 0.15 - -/** - * A macro to ensure the wikimedia filenames of fish icons are unique, especially since there're a couple fish that have - * quite ambiguous names/icon_states like "checkered" or "pike" - */ -#define FISH_AUTOWIKI_FILENAME(fish) SANITIZE_FILENAME("[initial(fish.icon_state)]_wiki_fish") - -///The list keys for the autowiki for fish sources -#define FISH_SOURCE_AUTOWIKI_NAME "name" -#define FISH_SOURCE_AUTOWIKI_ICON "icon" -#define FISH_SOURCE_AUTOWIKI_WEIGHT "weight" -#define FISH_SOURCE_AUTOWIKI_WEIGHT_SUFFIX "weight_suffix" -#define FISH_SOURCE_AUTOWIKI_NOTES "notes" - -///Special value for the name key that always comes first when the data is sorted, regardless of weight. -#define FISH_SOURCE_AUTOWIKI_DUD "Nothing" -///Special value for the name key that always comes last -#define FISH_SOURCE_AUTOWIKI_OTHER "Other Stuff" -///The filename for the icon for "other stuff" which we don't articulate about on the autowiki -#define FISH_SOURCE_AUTOWIKI_QUESTIONMARK "questionmark" diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm index b7e5b38482d16..c9b7cb43cf0d9 100644 --- a/code/__DEFINES/food.dm +++ b/code/__DEFINES/food.dm @@ -170,21 +170,12 @@ GLOBAL_LIST_INIT(food_buffs, list( #define FOOD_IN_CONTAINER (1<<0) /// Finger food can be eaten while walking / running around #define FOOD_FINGER_FOOD (1<<1) -/// Examining this edible won't show infos on food types, bites and remote tasting etc. -#define FOOD_NO_EXAMINE (1<<2) -/// This food item doesn't track bitecounts, use responsibly. -#define FOOD_NO_BITECOUNT (1<<3) DEFINE_BITFIELD(food_flags, list( "FOOD_FINGER_FOOD" = FOOD_FINGER_FOOD, "FOOD_IN_CONTAINER" = FOOD_IN_CONTAINER, - "FOOD_NO_EXAMINE" = FOOD_NO_EXAMINE, - "FOOD_NO_BITECOUNT" = FOOD_NO_BITECOUNT, )) -///Define for return value of the after_eat callback that will call OnConsume if it hasn't already. -#define FOOD_AFTER_EAT_CONSUME_ANYWAY 2 - #define STOP_SERVING_BREAKFAST (15 MINUTES) #define FOOD_MEAT_HUMAN 50 diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 3c46589002475..e762b406d1eb4 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -77,7 +77,7 @@ #define ui_building "EAST-4:22,SOUTH:21" #define ui_language_menu "EAST-4:6,SOUTH:21" #define ui_navigate_menu "EAST-4:22,SOUTH:5" -#define ui_floor_changer "EAST-3:24, SOUTH+1:3" +#define ui_floor_menu "EAST-4:14,SOUTH:37" //Upper left (action buttons) #define ui_action_palette "WEST+0:23,NORTH-1:5" @@ -110,9 +110,6 @@ #define ui_living_pull "EAST-1:28,CENTER-3:15" #define ui_living_healthdoll "EAST-1:28,CENTER-1:15" -//Humans -#define ui_human_floor_changer "EAST-4:22, SOUTH+1:7" - //Drones #define ui_drone_drop "CENTER+1:18,SOUTH:5" #define ui_drone_pull "CENTER+1.5:2,SOUTH:5" @@ -135,7 +132,7 @@ #define ui_borg_alerts "CENTER+4:21,SOUTH:5" #define ui_borg_language_menu "CENTER+4:19,SOUTH+1:6" #define ui_borg_navigate_menu "CENTER+4:19,SOUTH+1:6" -#define ui_borg_floor_changer "EAST-1:28,SOUTH+1:39" +#define ui_borg_floor_menu "CENTER+4:-13,SOUTH+1:6" //Aliens #define ui_alien_health "EAST,CENTER-1:15" @@ -144,6 +141,7 @@ #define ui_alien_storage_r "CENTER+1:18,SOUTH:5" #define ui_alien_language_menu "EAST-4:20,SOUTH:5" #define ui_alien_navigate_menu "EAST-4:20,SOUTH:5" +#define ui_alien_floor_menu "EAST-4:-12,SOUTH:5" //AI #define ui_ai_core "BOTTOM:6,RIGHT-4" @@ -152,6 +150,7 @@ #define ui_ai_state_laws "BOTTOM:6,RIGHT-1" #define ui_ai_mod_int "BOTTOM:6,RIGHT" #define ui_ai_language_menu "BOTTOM+1:8,RIGHT-1:30" +#define ui_ai_floor_menu "BOTTOM+1:8,RIGHT-1:14" #define ui_ai_crew_monitor "BOTTOM:6,CENTER-1" #define ui_ai_crew_manifest "BOTTOM:6,CENTER" @@ -193,8 +192,8 @@ #define ui_ghost_teleport "SOUTH:6,CENTER:24" #define ui_ghost_pai "SOUTH: 6, CENTER+1:24" #define ui_ghost_minigames "SOUTH: 6, CENTER+2:24" -#define ui_ghost_language_menu "SOUTH: 22, CENTER+3:22" -#define ui_ghost_floor_changer "SOUTH: 6, CENTER+3:23" +#define ui_ghost_language_menu "SOUTH: 22, CENTER+3:8" +#define ui_ghost_floor_menu "SOUTH: 6, CENTER+3:8" //Blobbernauts #define ui_blobbernaut_overmind_health "EAST-1:28,CENTER+0:19" diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index ffba025270e42..c58f12bf5c957 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -110,8 +110,6 @@ DEFINE_BITFIELD(no_equip_flags, list( #define HIDEMUTWINGS (1<<13) ///hides belts and riggings #define HIDEBELT (1<<14) -///hides antennae -#define HIDEANTENNAE (1<<15) //bitflags for clothing coverage - also used for limbs #define HEAD (1<<0) @@ -271,8 +269,6 @@ GLOBAL_LIST_INIT(mining_suit_allowed, list( /obj/item/pickaxe, /obj/item/resonator, /obj/item/spear, - /obj/item/forging/reagent_weapon, // DOPPLER EDIT ADDITION - /obj/item/gun/ballistic/bow, // DOPPLER EDIT ADDITION )) /// String for items placed into the left pocket. diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 38f39437fac75..8846672efe1b7 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -279,8 +279,6 @@ 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/jobs.dm b/code/__DEFINES/jobs.dm index 953e7648009b8..2c3b151855cef 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -93,7 +93,6 @@ #define JOB_LAWYER "Lawyer" #define JOB_CHAPLAIN "Chaplain" #define JOB_PSYCHOLOGIST "Psychologist" -#define JOB_PUN_PUN "Pun Pun" //ERTs #define JOB_ERT_DEATHSQUAD "Death Commando" #define JOB_ERT_COMMANDER "Emergency Response Team Commander" @@ -137,32 +136,31 @@ #define JOB_DISPLAY_ORDER_LAWYER 12 #define JOB_DISPLAY_ORDER_CHAPLAIN 13 #define JOB_DISPLAY_ORDER_PSYCHOLOGIST 14 -#define JOB_DISPLAY_ORDER_PUN_PUN 15 -#define JOB_DISPLAY_ORDER_AI 16 -#define JOB_DISPLAY_ORDER_CYBORG 17 -#define JOB_DISPLAY_ORDER_CHIEF_ENGINEER 18 -#define JOB_DISPLAY_ORDER_STATION_ENGINEER 19 -#define JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN 20 -#define JOB_DISPLAY_ORDER_QUARTERMASTER 21 -#define JOB_DISPLAY_ORDER_CARGO_TECHNICIAN 22 -#define JOB_DISPLAY_ORDER_SHAFT_MINER 23 -#define JOB_DISPLAY_ORDER_BITRUNNER 24 -#define JOB_DISPLAY_ORDER_CARGO_GORILLA 25 -#define JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER 26 -#define JOB_DISPLAY_ORDER_MEDICAL_DOCTOR 27 -#define JOB_DISPLAY_ORDER_PARAMEDIC 28 -#define JOB_DISPLAY_ORDER_CHEMIST 29 -#define JOB_DISPLAY_ORDER_CORONER 30 -#define JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR 31 -#define JOB_DISPLAY_ORDER_SCIENTIST 32 -#define JOB_DISPLAY_ORDER_ROBOTICIST 33 -#define JOB_DISPLAY_ORDER_GENETICIST 34 -#define JOB_DISPLAY_ORDER_HEAD_OF_SECURITY 35 -#define JOB_DISPLAY_ORDER_VETERAN_ADVISOR 36 -#define JOB_DISPLAY_ORDER_WARDEN 37 -#define JOB_DISPLAY_ORDER_DETECTIVE 38 -#define JOB_DISPLAY_ORDER_SECURITY_OFFICER 39 -#define JOB_DISPLAY_ORDER_PRISONER 40 +#define JOB_DISPLAY_ORDER_AI 15 +#define JOB_DISPLAY_ORDER_CYBORG 16 +#define JOB_DISPLAY_ORDER_CHIEF_ENGINEER 17 +#define JOB_DISPLAY_ORDER_STATION_ENGINEER 18 +#define JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN 19 +#define JOB_DISPLAY_ORDER_QUARTERMASTER 20 +#define JOB_DISPLAY_ORDER_CARGO_TECHNICIAN 21 +#define JOB_DISPLAY_ORDER_SHAFT_MINER 22 +#define JOB_DISPLAY_ORDER_BITRUNNER 23 +#define JOB_DISPLAY_ORDER_CARGO_GORILLA 24 +#define JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER 25 +#define JOB_DISPLAY_ORDER_MEDICAL_DOCTOR 26 +#define JOB_DISPLAY_ORDER_PARAMEDIC 27 +#define JOB_DISPLAY_ORDER_CHEMIST 28 +#define JOB_DISPLAY_ORDER_CORONER 29 +#define JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR 30 +#define JOB_DISPLAY_ORDER_SCIENTIST 31 +#define JOB_DISPLAY_ORDER_ROBOTICIST 32 +#define JOB_DISPLAY_ORDER_GENETICIST 33 +#define JOB_DISPLAY_ORDER_HEAD_OF_SECURITY 34 +#define JOB_DISPLAY_ORDER_VETERAN_ADVISOR 35 +#define JOB_DISPLAY_ORDER_WARDEN 36 +#define JOB_DISPLAY_ORDER_DETECTIVE 37 +#define JOB_DISPLAY_ORDER_SECURITY_OFFICER 38 +#define JOB_DISPLAY_ORDER_PRISONER 39 #define DEPARTMENT_UNASSIGNED "No Department" @@ -205,7 +203,7 @@ DEFINE_BITFIELD(departments_bitflags, list( #define JOB_ANNOUNCE_ARRIVAL (1<<0) /// Whether the mob is added to the crew manifest. #define JOB_CREW_MANIFEST (1<<1) -/// Whether the mob is equipped through SSjob.equip_rank() on spawn. +/// Whether the mob is equipped through SSjob.EquipRank() on spawn. #define JOB_EQUIP_RANK (1<<2) /// Whether the job is considered a regular crew member of the station. Equipment such as AI and cyborgs not included. #define JOB_CREW_MEMBER (1<<3) diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index 25893cae63f72..56e39fd198899 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -139,15 +139,6 @@ /// Max length of a status line in the status display #define MAX_STATUS_LINE_LENGTH 40 -///Define for automated system arrival announcement -#define AUTO_ANNOUNCE_ARRIVAL "ARRIVAL" -///Define for automated system announcement when a head of staff arrives -#define AUTO_ANNOUNCE_NEWHEAD "NEWHEAD" -///Define for automated system announcement for when the arrival shuttle is broken -#define AUTO_ANNOUNCE_ARRIVALS_BROKEN "ARRIVALS_BROKEN" -///Define for automated system announcement for researched nodes -#define AUTO_ANNOUNCE_NODE "NODE" - /// Blank Status Display #define SD_BLANK 0 /// Shows the emergency shuttle timer diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index 5fb9d9447bbc0..d6b62da97d470 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -80,7 +80,6 @@ //Job preferences levels -#define JP_ANY 0 #define JP_LOW 1 #define JP_MEDIUM 2 #define JP_HIGH 3 diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 121cf5a072d17..ead7764d60523 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -37,7 +37,7 @@ /// Does this by inverting the passed in flags and seeing if we're still incapacitated #define INCAPACITATED_IGNORING(mob, flags) (mob.incapacitated & ~(flags)) -/// Max amounts of fire stacks a mob can get +/// Maxamounts of fire stacks a mob can get #define MAX_FIRE_STACKS 20 /// If a mob has a higher threshold than this, the icon shown will be increased to the big fire icon. #define MOB_BIG_FIRE_STACK_THRESHOLD 3 diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 563aace250578..ffac380ae5caf 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -156,7 +156,6 @@ #define INIT_ORDER_AI_CONTROLLERS 55 //So the controller can get the ref #define INIT_ORDER_TICKER 55 #define INIT_ORDER_TCG 55 -#define INIT_ORDER_AUTOMAPPER 51 // DOPPLER EDIT ADDITION - We need to load just before mapping. #define INIT_ORDER_MAPPING 50 #define INIT_ORDER_AI_IDLE_CONTROLLERS 50 #define INIT_ORDER_EARLY_ASSETS 48 diff --git a/code/__DEFINES/tools.dm b/code/__DEFINES/tools.dm index 794c56691a6da..b0812746cb81e 100644 --- a/code/__DEFINES/tools.dm +++ b/code/__DEFINES/tools.dm @@ -40,13 +40,6 @@ /// Combination flag for any item interaction that blocks the rest of the attack chain #define ITEM_INTERACT_ANY_BLOCKER (ITEM_INTERACT_SUCCESS | ITEM_INTERACT_BLOCKING) -/// How many seconds between each fuel depletion tick ("use" proc) -#define TOOL_FUEL_BURN_INTERVAL 5 - -///This is a number I got by quickly searching up the temperature to melt iron/glass, though not really realistic. -///This is used for places where lighters should not be hot enough to be used as a welding tool on. -#define HIGH_TEMPERATURE_REQUIRED 1500 - /** * A helper for checking if an item interaction should be skipped. * This is only used explicitly because some interactions may not want to ever be skipped. diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index c911181c43166..8faff1b7083f6 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -26,8 +26,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_RESTRAINED "restrained" /// Apply this to make a mob not dense, and remove it when you want it to no longer make them undense, other sources of undesity will still apply. Always define a unique source when adding a new instance of this! #define TRAIT_UNDENSE "undense" -/// Makes the mob immune to damage and several other ailments. -#define TRAIT_GODMODE "godmode" /// Expands our FOV by 30 degrees if restricted #define TRAIT_EXPANDED_FOV "expanded_fov" /// Doesn't miss attacks @@ -114,8 +112,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_STABLELIVER "stable_liver" #define TRAIT_VATGROWN "vatgrown" #define TRAIT_RESISTHEAT "resist_heat" -/// Trait for when you can no longer gain body heat -#define TRAIT_HYPOTHERMIC "body_hypothermic" ///For when you've gotten a power from a dna vault #define TRAIT_USED_DNA_VAULT "used_dna_vault" /// For when you want to be able to touch hot things, but still want fire to be an issue. @@ -223,30 +219,22 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NO_STAGGER "no_stagger" /// Getting hit by thrown movables won't push you away #define TRAIT_NO_THROW_HITPUSH "no_throw_hitpush" -/// This mob likes to eat fish. Raw, uncut fish. -#define TRAIT_FISH_EATER "fish_eater" ///Added to mob or mind, changes the icons of the fish shown in the minigame UI depending on the possible reward. #define TRAIT_REVEAL_FISH "reveal_fish" ///This trait gets you a list of fishes that can be caught when examining a fishing spot. #define TRAIT_EXAMINE_FISHING_SPOT "examine_fishing_spot" ///lobstrosities and carps will prioritize/flee from those that have this trait (given by the skill-locked hat) #define TRAIT_SCARY_FISHERMAN "scary_fisherman" -/// Atoms with this trait can be right-clicked with a fish to release them, presumably back in the fishing spot they were caught from. -#define TRAIT_CATCH_AND_RELEASE "catch_and_release" ///This trait lets you get the size and weight of the fish by examining them #define TRAIT_EXAMINE_FISH "examine_fish" ///This trait lets you roughly know if the fish is dead, starving, drowning or sick by examining them #define TRAIT_EXAMINE_DEEPER_FISH "examine_deeper_fish" ///Trait given to turfs or objects that can be fished from #define TRAIT_FISHING_SPOT "fishing_spot" -///This trait prevents the fishing spot from being linked to the fish-porter when a multitool is being used. -#define TRAIT_UNLINKABLE_FISHING_SPOT "unlinkable_fishing_spot" ///Trait given to mobs that can fish without a rod #define TRAIT_PROFOUND_FISHER "profound_fisher" /// If an atom has this trait, then you can toss a bottle with a message in it. #define TRAIT_MESSAGE_IN_A_BOTTLE_LOCATION "message_in_a_bottle_location" -/// Stops other objects of the same type from being inserted inside the same aquarium it's in. -#define TRAIT_UNIQUE_AQUARIUM_CONTENT "unique_aquarium_content" /// This trait lets you evaluate someone's fitness level against your own #define TRAIT_EXAMINE_FITNESS "reveal_power_level" /// These mobs have particularly hygienic tongues @@ -668,6 +656,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_ASHSTORM_IMMUNE "ashstorm_immune" #define TRAIT_SNOWSTORM_IMMUNE "snowstorm_immune" #define TRAIT_RADSTORM_IMMUNE "radstorm_immune" +#define TRAIT_VOIDSTORM_IMMUNE "voidstorm_immune" #define TRAIT_WEATHER_IMMUNE "weather_immune" //Immune to ALL weather effects. /// Cannot be grabbed by goliath tentacles @@ -749,8 +738,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_T_RAY_VISIBLE "t-ray-visible" /// If this item's been fried #define TRAIT_FOOD_FRIED "food_fried" -/// If this item's been bbq grilled -#define TRAIT_FOOD_BBQ_GRILLED "food_bbq_grilled" /// This is a silver slime created item #define TRAIT_FOOD_SILVER "food_silver" /// If this item's been made by a chef instead of being map-spawned or admin-spawned or such @@ -812,8 +799,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_HAUNTED "haunted" /// An item that, if it has contents, will ignore its contents when scanning for contraband. #define TRAIT_CONTRABAND_BLOCKER "contraband_blocker" -/// For edible items that cannot be composted inside hydro trays -#define TRAIT_UNCOMPOSTABLE "uncompostable" //quirk traits #define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance" @@ -850,7 +835,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_THROWINGARM "throwing_arm" #define TRAIT_SETTLER "settler" #define TRAIT_STRONG_STOMACH "strong_stomach" -#define TRAIT_VEGETARIAN "trait_vegetarian" /// This mob always lands on their feet when they fall, for better or for worse. #define TRAIT_CATLIKE_GRACE "catlike_grace" @@ -975,7 +959,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_FISH_AMPHIBIOUS "fish_amphibious" ///Trait needed for the lubefish evolution #define TRAIT_FISH_FED_LUBE "fish_fed_lube" -#define TRAIT_FISH_WELL_COOKED "fish_well_cooked" #define TRAIT_FISH_NO_HUNGER "fish_no_hunger" ///It comes from a fish case. Relevant for bounties so far. #define TRAIT_FISH_FROM_CASE "fish_from_case" @@ -1136,6 +1119,11 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// this object has been frozen #define TRAIT_FROZEN "frozen" +/// Currently fishing +#define TRAIT_GONE_FISHING "fishing" +/// Currently fishing, and it's the active minigame phase +#define TRAIT_ACTIVELY_FISHING "actively_fishing" + /// Makes a character be better/worse at tackling depending on their wing's status #define TRAIT_TACKLING_WINGED_ATTACKER "tacking_winged_attacker" diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm index e3d1f9f065b18..0648dd4dd3748 100644 --- a/code/__DEFINES/traits/sources.dm +++ b/code/__DEFINES/traits/sources.dm @@ -301,6 +301,3 @@ /// Trait added by style component #define STYLE_TRAIT "style" - -/// Trait from an engraving -#define ENGRAVED_TRAIT "engraved" diff --git a/code/__DEFINES/~doppler_defines/declarations.dm b/code/__DEFINES/~doppler_defines/declarations.dm index 1461f8cae6e67..37dbb5fd21780 100644 --- a/code/__DEFINES/~doppler_defines/declarations.dm +++ b/code/__DEFINES/~doppler_defines/declarations.dm @@ -2,5 +2,3 @@ #define TRAIT_TWITCH_ADAPTED "twitch_adapted" /// Given to the detective, if they have this, they can see syndicate special descriptions. #define TRAIT_DETECTIVE "detective_ability" -/// Trait for the excitable quirk, woof! -#define TRAIT_EXCITABLE "wagwag" diff --git a/code/__DEFINES/~doppler_defines/keybindings.dm b/code/__DEFINES/~doppler_defines/keybindings.dm index 371523c945bc8..ef4105eaad209 100644 --- a/code/__DEFINES/~doppler_defines/keybindings.dm +++ b/code/__DEFINES/~doppler_defines/keybindings.dm @@ -1,7 +1,3 @@ #define COMSIG_KB_LIVING_COMBAT_INDICATOR "keybinding_living_combat_indicator" #define COMSIG_KB_MOB_PIXEL_SHIFT_DOWN "keybinding_mob_pixel_shift_down" #define COMSIG_KB_MOB_PIXEL_SHIFT_UP "keybinding_mob_pixel_shift_up" -#define COMSIG_KB_CLIENT_LOOC_DOWN "keybinding_client_looc_down" -#define COMSIG_KB_CLIENT_WHISPER_DOWN "keybinding_client_whisper_down" -#define COMSIG_KB_CLIENT_DO_DOWN "keybinding_client_do_down" -#define COMSIG_KB_CLIENT_DO_LONGER_DOWN "keybinding_client_do_longer_down" diff --git a/code/__DEFINES/~doppler_defines/span.dm b/code/__DEFINES/~doppler_defines/span.dm index 0cf649540d128..4c3c1bd145f99 100644 --- a/code/__DEFINES/~doppler_defines/span.dm +++ b/code/__DEFINES/~doppler_defines/span.dm @@ -4,5 +4,3 @@ #define span_cyan(str) ("" + str + "") #define span_orange(str) ("" + str + "") #define span_yellow(str) ("" + str + "") -#define span_rlooc(str) ("" + str + "") -#define span_emote(str) ("" + str + "") diff --git a/code/__DEFINES/~doppler_defines/techweb_nodes.dm b/code/__DEFINES/~doppler_defines/techweb_nodes.dm index 1243df6ce241d..3070194171011 100644 --- a/code/__DEFINES/~doppler_defines/techweb_nodes.dm +++ b/code/__DEFINES/~doppler_defines/techweb_nodes.dm @@ -2,7 +2,3 @@ #define TECHWEB_NODE_XENOARCH_BASIC "basic_xenoarch" #define TECHWEB_NODE_XENOARCH_MACHINES "xenoarch_machines" #define TECHWEB_NODE_XENOARCH_STORAGE "xenoarch_storage" -#define TECHWEB_NODE_COLONY_APPLIANCES "colony_fabricator_appliances" -#define TECHWEB_NODE_COLONY_FLATPACKS "colony_fabricator_flatpacks" -#define TECHWEB_NODE_COLONY_STRUCTURES "colony_fabricator_structures" -#define TECHWEB_NODE_COLONY_TOOLS "colony_fabricator_tools" diff --git a/code/__HELPERS/atoms.dm b/code/__HELPERS/atoms.dm index 6fc9086b81cc7..646410026a054 100644 --- a/code/__HELPERS/atoms.dm +++ b/code/__HELPERS/atoms.dm @@ -63,19 +63,17 @@ var/turf/target_turf = get_turf(target) if(get_dist(source, target) > length) return FALSE - if(current == target_turf) + if(current == target_turf || source.CanReach(target))//they are on the same turf or in reach, source can see the target return TRUE - var/steps = 1 - if(current == target_turf)//they are on the same turf, source can see the target - return TRUE - current = get_step_towards(current, target_turf) - while(current != target_turf) - if(steps > length) - return FALSE + var/list/steps = get_steps_to(source, target) + if(isnull(steps) || length(steps) > length) + return FALSE + for(var/direction in steps) + current = get_step(current, direction) + if(current == target_turf) + break if(IS_OPAQUE_TURF(current)) return FALSE - current = get_step_towards(current, target_turf) - steps++ return TRUE ///Get the cardinal direction between two atoms diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index 76651964e24e0..f9957f4c7393e 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -195,20 +195,3 @@ /proc/cmp_deathmatch_mods(datum/deathmatch_modifier/a, datum/deathmatch_modifier/b) return sorttext(b.name, a.name) - -/** - * Orders fish types following this order (freshwater -> saltwater -> anadromous -> sulphuric water -> any water -> air) - * If both share the same required fluid type, they'll be ordered by name instead. - */ -/proc/cmp_fish_fluid(obj/item/fish/a, obj/item/fish/b) - var/static/list/fluids_priority = list( - AQUARIUM_FLUID_FRESHWATER, - AQUARIUM_FLUID_SALTWATER, - AQUARIUM_FLUID_ANADROMOUS, - AQUARIUM_FLUID_SULPHWATEVER, - AQUARIUM_FLUID_ANY_WATER, - AQUARIUM_FLUID_AIR, - ) - var/position_a = fluids_priority.Find(initial(a.required_fluid_type)) - var/position_b = fluids_priority.Find(initial(b.required_fluid_type)) - return cmp_numeric_asc(position_a, position_b) || cmp_text_asc(initial(b.name), initial(a.name)) diff --git a/code/__HELPERS/dynamic_human_icon_gen.dm b/code/__HELPERS/dynamic_human_icon_gen.dm index f1f3be038a86b..df8f4716bb918 100644 --- a/code/__HELPERS/dynamic_human_icon_gen.dm +++ b/code/__HELPERS/dynamic_human_icon_gen.dm @@ -57,7 +57,6 @@ GLOBAL_LIST_EMPTY(dynamic_human_appearances) /proc/set_dynamic_human_appearance(list/arguments) var/atom/target = arguments[1] //1st argument is the target var/dynamic_appearance = get_dynamic_human_appearance(arglist(arguments.Copy(2))) //the rest of the arguments starting from 2 matter to the proc - target.icon = 'icons/mob/human/human.dmi' - target.icon_state = "" - target.appearance_flags |= KEEP_TOGETHER + target.icon = 'icons/blanks/32x32.dmi' + target.icon_state = "nothing" target.copy_overlays(dynamic_appearance, cut_old = TRUE) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 699ae8aa72cdd..ce48e593980b5 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -181,7 +181,7 @@ //First we spawn a dude. var/mob/living/carbon/human/new_character = new//The mob being spawned. - SSjob.send_to_late_join(new_character) + SSjob.SendToLateJoin(new_character) ghost_player.client.prefs.safe_transfer_prefs_to(new_character) new_character.dna.update_dna_identity() @@ -243,16 +243,8 @@ if(!(character.mind.assigned_role.job_flags & JOB_ANNOUNCE_ARRIVAL)) return - var/obj/machinery/announcement_system/announcer - var/list/available_machines = list() - for(var/obj/machinery/announcement_system/announce as anything in GLOB.announcement_systems) - if(announce.arrival_toggle) - available_machines += announce - break - if(!length(available_machines)) - return - announcer = pick(available_machines) - announcer.announce(AUTO_ANNOUNCE_ARRIVAL, character.real_name, rank, list()) //make the list empty to make it announce it in common + var/obj/machinery/announcement_system/announcer = pick(GLOB.announcement_systems) + announcer.announce("ARRIVAL", character.real_name, rank, list()) //make the list empty to make it announce it in common ///Check if the turf pressure allows specialized equipment to work /proc/lavaland_equipment_pressure_check(turf/turf_to_check) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index d7df47342f525..8d49d79c240d2 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -187,7 +187,6 @@ GLOBAL_LIST_INIT(WALLITEMS_INTERIOR, typecacheof(list( /obj/machinery/status_display, /obj/machinery/ticket_machine, /obj/machinery/turretid, - /obj/structure/wall_torch, // DOPPLER EDIT ADDITION - Wall-mounted torches /obj/machinery/barsign, /obj/structure/extinguisher_cabinet, /obj/structure/fireaxecabinet, diff --git a/code/__HELPERS/hallucinations.dm b/code/__HELPERS/hallucinations.dm index d3d4a2630ed05..00fee61e2b1ca 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", max_length = MAX_NAME_LEN) + var/custom_name = tgui_input_text(user, "What name should it show up as? (Can be empty)", "Custom Delusion: Name") delusion_args += list( custom_icon_file = custom_icon_file, diff --git a/code/__HELPERS/hearted.dm b/code/__HELPERS/hearted.dm index d8f7832cbc06b..adae298516ec6 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?", max_length = MAX_NAME_LEN) + heart_nominee = tgui_input_text(src, "What was their name? Just a first or last name may be enough.", "<3?") if(2) - 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) + heart_nominee = tgui_input_text(src, "Try again, what was their name? Just a first or last name may be enough.", "<3?") 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?", max_length = MAX_NAME_LEN) + heart_nominee = tgui_input_text(src, "One more try, what was their name? Just a first or last name may be enough.", "<3?") if(!heart_nominee) return diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 4c0cf3038f58f..127ae5387e1b0 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -466,24 +466,25 @@ world var/base_icon_dir //We'll use this to get the icon state to display if not null BUT NOT pass it to overlays as the dir we have - if(render_icon) - //Try to remove/optimize this section if you can, it's a CPU hog. - //Determines if there're directionals. - if (curdir != SOUTH) - // icon states either have 1, 4 or 8 dirs. We only have to check - // one of NORTH, EAST or WEST to know that this isn't a 1-dir icon_state since they just have SOUTH. - if(!length(icon_states(icon(curicon, curstate, NORTH)))) - base_icon_dir = SOUTH - - var/list/icon_dimensions = get_icon_dimensions(curicon) - var/icon_width = icon_dimensions["width"] - var/icon_height = icon_dimensions["height"] - if(icon_width != 32 || icon_height != 32) - flat.Scale(icon_width, icon_height) + //Try to remove/optimize this section ASAP, CPU hog. + //Determines if there's directionals. + if(render_icon && curdir != SOUTH) + if ( + !length(icon_states(icon(curicon, curstate, NORTH))) \ + && !length(icon_states(icon(curicon, curstate, EAST))) \ + && !length(icon_states(icon(curicon, curstate, WEST))) \ + ) + base_icon_dir = SOUTH if(!base_icon_dir) base_icon_dir = curdir + // Expand our canvas to fit if we're too big + if(render_icon) + var/icon/active_icon = icon(curicon) + if(active_icon.Width() != 32 || active_icon.Height() != 32) + flat.Scale(active_icon.Width(), active_icon.Height()) + var/curblend = appearance.blend_mode || defblend if(appearance.overlays.len || appearance.underlays.len) diff --git a/code/__HELPERS/logging/_logging.dm b/code/__HELPERS/logging/_logging.dm index a7cf77a6e9754..bfcaded67f021 100644 --- a/code/__HELPERS/logging/_logging.dm +++ b/code/__HELPERS/logging/_logging.dm @@ -112,10 +112,6 @@ GLOBAL_LIST_INIT(testing_global_profiler, list("_PROFILE_NAME" = "Global")) log_emote(log_text, data) if(LOG_RADIO_EMOTE) log_radio_emote(log_text, data) - //DOPPLER EDIT ADDITION BEGIN - if(LOG_SUBTLE) - log_subtle(log_text, data) - //DOPPLER EDIT ADDITION END if(LOG_DSAY) log_dsay(log_text, data) if(LOG_PDA) diff --git a/code/__HELPERS/logging/mob.dm b/code/__HELPERS/logging/mob.dm index 77de744eb1de2..b6bebf74f689b 100644 --- a/code/__HELPERS/logging/mob.dm +++ b/code/__HELPERS/logging/mob.dm @@ -46,10 +46,6 @@ colored_message = "(EMOTE) [colored_message]" if(LOG_RADIO_EMOTE) colored_message = "(RADIOEMOTE) [colored_message]" - //DOPPLER EDIT ADDITION BEGIN - if(LOG_SUBTLE) - colored_message = "(EMOTE) (SUBTLE) [colored_message]" - //DOPPLER EDIT ADDITION END var/list/timestamped_message = list("\[[time_stamp(format = "YYYY-MM-DD hh:mm:ss")]\] [key_name_and_tag(src)] [loc_name(src)] (Event #[LAZYLEN(logging[smessage_type])])" = colored_message) diff --git a/code/__HELPERS/spatial_info.dm b/code/__HELPERS/spatial_info.dm index 529532f50cf4d..2a8b61bd01db8 100644 --- a/code/__HELPERS/spatial_info.dm +++ b/code/__HELPERS/spatial_info.dm @@ -195,8 +195,12 @@ var/turf/inbetween_turf = center_turf //this is the lowest overhead way of doing a loop in dm other than a goto. distance is guaranteed to be >= steps taken to target by this algorithm - for(var/step_counter in 1 to distance) - inbetween_turf = get_step_towards(inbetween_turf, target_turf) + var/list/steps = get_steps_to(inbetween_turf, target_turf) + if(isnull(steps)) + return + steps.Cut(distance + 1) + for(var/direction in steps) + inbetween_turf = get_step(inbetween_turf, direction) if(inbetween_turf == target_turf)//we've gotten to target's turf without returning due to turf opacity, so we must be able to see target break diff --git a/code/__byond_version_compat.dm b/code/__byond_version_compat.dm index 6680e655551f5..0f19332934d09 100644 --- a/code/__byond_version_compat.dm +++ b/code/__byond_version_compat.dm @@ -9,11 +9,6 @@ #error You need version 515.1627 or higher #endif -// Unable to compile this version thanks to mutable appearance changes -#if (DM_VERSION == 515 && DM_BUILD == 1643) -#error This version of BYOND cannot compile this project. Visit www.byond.com/download/build to download an older version or update (if possible). -#endif - // Keep savefile compatibilty at minimum supported level /savefile/byond_version = MIN_COMPILER_VERSION diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 45afc0e0c85a6..8db59bccc3532 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -65,7 +65,6 @@ DEFINE_BITFIELD(area_flags, list( "VALID_TERRITORY" = VALID_TERRITORY, "XENOBIOLOGY_COMPATIBLE" = XENOBIOLOGY_COMPATIBLE, "NO_BOH" = NO_BOH, - "UNLIMITED_FISHING" = UNLIMITED_FISHING, )) DEFINE_BITFIELD(turf_flags, list( @@ -561,13 +560,6 @@ DEFINE_BITFIELD(gun_flags, list( "TURRET_INCOMPATIBLE" = TURRET_INCOMPATIBLE, )) -DEFINE_BITFIELD(fish_flags, list( - "FISH_FLAG_SHOW_IN_CATALOG" = FISH_FLAG_SHOW_IN_CATALOG, - "FISH_DO_FLOP_ANIM" = FISH_DO_FLOP_ANIM, - "FISH_FLAG_PETTED" = FISH_FLAG_PETTED, - "FISH_FLAG_EXPERIMENT_SCANNABLE" = FISH_FLAG_EXPERIMENT_SCANNABLE, -)) - DEFINE_BITFIELD(bot_mode_flags, list( "POWER_ON" = BOT_MODE_ON, "AUTO_PATROL" = BOT_MODE_AUTOPATROL, diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 85ba6893a8edc..c7272ba1ce7e4 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -10,7 +10,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_AI_PAUSED" = TRAIT_AI_PAUSED, "TRAIT_BANNED_FROM_CARGO_SHUTTLE" = TRAIT_BANNED_FROM_CARGO_SHUTTLE, "TRAIT_BEING_SHOCKED" = TRAIT_BEING_SHOCKED, - "TRAIT_CATCH_AND_RELEASE" = TRAIT_CATCH_AND_RELEASE, "TRAIT_COMMISSIONED" = TRAIT_COMMISSIONED, "TRAIT_CLIMBABLE" = TRAIT_CLIMBABLE, "TRAIT_CURRENTLY_CLEANING" = TRAIT_CURRENTLY_CLEANING, @@ -18,7 +17,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_DO_NOT_SPLASH" = TRAIT_DO_NOT_SPLASH, "TRAIT_DRIED" = TRAIT_DRIED, "TRAIT_DRYABLE" = TRAIT_DRYABLE, - "TRAIT_FISHING_SPOT" = TRAIT_FISHING_SPOT, "TRAIT_FOOD_CHEF_MADE" = TRAIT_FOOD_CHEF_MADE, "TRAIT_FOOD_FRIED" = TRAIT_FOOD_FRIED, "TRAIT_QUALITY_FOOD_INGREDIENT" = TRAIT_QUALITY_FOOD_INGREDIENT, @@ -31,7 +29,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_SPINNING" = TRAIT_SPINNING, "TRAIT_STICKERED" = TRAIT_STICKERED, "TRAIT_UNHITTABLE_BY_PROJECTILES" = TRAIT_UNHITTABLE_BY_PROJECTILES, - "TRAIT_UNLINKABLE_FISHING_SPOT" = TRAIT_UNLINKABLE_FISHING_SPOT, ), /atom/movable = list( "TRAIT_ACTIVE_STORAGE" = TRAIT_ACTIVE_STORAGE, @@ -72,6 +69,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_TELEKINESIS_CONTROLLED" = TRAIT_TELEKINESIS_CONTROLLED, "TRAIT_UNDERFLOOR" = TRAIT_UNDERFLOOR, "TRAIT_UNIQUE_IMMERSE" = TRAIT_UNIQUE_IMMERSE, + "TRAIT_VOIDSTORM_IMMUNE" = TRAIT_VOIDSTORM_IMMUNE, + "TRAIT_WAS_RENAMED" = TRAIT_WAS_RENAMED, "TRAIT_WADDLING" = TRAIT_WADDLING, "TRAIT_WAS_RENAMED" = TRAIT_WAS_RENAMED, "TRAIT_WEATHER_IMMUNE" = TRAIT_WEATHER_IMMUNE, @@ -126,6 +125,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_ABDUCTOR_TRAINING" = TRAIT_ABDUCTOR_TRAINING, "TRAIT_ACT_AS_CULTIST" = TRAIT_ACT_AS_CULTIST, "TRAIT_ACT_AS_HERETIC" = TRAIT_ACT_AS_HERETIC, + "TRAIT_ACTIVELY_FISHING" = TRAIT_ACTIVELY_FISHING, "TRAIT_ADAMANTINE_EXTRACT_ARMOR" = TRAIT_ADAMANTINE_EXTRACT_ARMOR, "TRAIT_ADVANCEDTOOLUSER" = TRAIT_ADVANCEDTOOLUSER, "TRAIT_AGENDER" = TRAIT_AGENDER, @@ -240,7 +240,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_FEARLESS" = TRAIT_FEARLESS, "TRAIT_FENCE_CLIMBER" = TRAIT_FENCE_CLIMBER, "TRAIT_FINGERPRINT_PASSTHROUGH" = TRAIT_FINGERPRINT_PASSTHROUGH, - "TRAIT_FISH_EATER" = TRAIT_FISH_EATER, "TRAIT_FIST_MINING" = TRAIT_FIST_MINING, "TRAIT_FIXED_MUTANT_COLORS" = TRAIT_FIXED_MUTANT_COLORS, "TRAIT_FLESH_DESIRE" = TRAIT_FLESH_DESIRE, @@ -260,7 +259,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_GARLIC_BREATH" = TRAIT_GARLIC_BREATH, "TRAIT_GENELESS" = TRAIT_GENELESS, "TRAIT_GIANT" = TRAIT_GIANT, - "TRAIT_GODMODE" = TRAIT_GODMODE, + "TRAIT_GONE_FISHING" = TRAIT_GONE_FISHING, "TRAIT_GOOD_HEARING" = TRAIT_GOOD_HEARING, "TRAIT_GRABWEAKNESS" = TRAIT_GRABWEAKNESS, "TRAIT_GREENTEXT_CURSED" = TRAIT_GREENTEXT_CURSED, @@ -285,7 +284,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_HOT_SPRING_CURSED" = TRAIT_HOT_SPRING_CURSED, "TRAIT_HULK" = TRAIT_HULK, "TRAIT_HUSK" = TRAIT_HUSK, - "TRAIT_HYPOTHERMIC" = TRAIT_HYPOTHERMIC, "TRAIT_ID_APPRAISER" = TRAIT_ID_APPRAISER, "TRAIT_IGNORE_ELEVATION" = TRAIT_IGNORE_ELEVATION, "TRAIT_IGNORESLOWDOWN" = TRAIT_IGNORESLOWDOWN, @@ -526,7 +524,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_USER_SCOPED" = TRAIT_USER_SCOPED, "TRAIT_USES_SKINTONES" = TRAIT_USES_SKINTONES, "TRAIT_VATGROWN" = TRAIT_VATGROWN, - "TRAIT_VEGETARIAN" = TRAIT_VEGETARIAN, "TRAIT_VENTCRAWLER_ALWAYS" = TRAIT_VENTCRAWLER_ALWAYS, "TRAIT_VENTCRAWLER_NUDE" = TRAIT_VENTCRAWLER_NUDE, "TRAIT_VIRUSIMMUNE" = TRAIT_VIRUSIMMUNE, @@ -561,7 +558,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_CUSTOM_TAP_SOUND" = TRAIT_CUSTOM_TAP_SOUND, "TRAIT_DANGEROUS_OBJECT" = TRAIT_DANGEROUS_OBJECT, "TRAIT_FISHING_BAIT" = TRAIT_FISHING_BAIT, - "TRAIT_FOOD_BBQ_GRILLED" = TRAIT_FOOD_BBQ_GRILLED, "TRAIT_GERM_SENSITIVE" = TRAIT_GERM_SENSITIVE, "TRAIT_GOOD_QUALITY_BAIT" = TRAIT_GOOD_QUALITY_BAIT, "TRAIT_GREAT_QUALITY_BAIT" = TRAIT_GREAT_QUALITY_BAIT, @@ -582,8 +578,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_T_RAY_VISIBLE" = TRAIT_T_RAY_VISIBLE, "TRAIT_TRANSFORM_ACTIVE" = TRAIT_TRANSFORM_ACTIVE, "TRAIT_UNCATCHABLE" = TRAIT_UNCATCHABLE, - "TRAIT_UNCOMPOSTABLE" = TRAIT_UNCOMPOSTABLE, - "TRAIT_UNIQUE_AQUARIUM_CONTENT" = TRAIT_UNIQUE_AQUARIUM_CONTENT, "TRAIT_WIELDED" = TRAIT_WIELDED, ), /obj/item/ammo_casing = list( @@ -625,7 +619,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_FISH_STINGER" = TRAIT_FISH_STINGER, "TRAIT_FISH_TOXIN_IMMUNE" = TRAIT_FISH_TOXIN_IMMUNE, "TRAIT_RESIST_EMULSIFY" = TRAIT_RESIST_EMULSIFY, - "TRAIT_FISH_WELL_COOKED" = TRAIT_FISH_WELL_COOKED, "TRAIT_YUCKY_FISH" = TRAIT_YUCKY_FISH, ), /obj/item/fishing_rod = list( @@ -678,6 +671,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_CONTAINMENT_FIELD" = TRAIT_CONTAINMENT_FIELD, "TRAIT_ELEVATED_TURF" = TRAIT_ELEVATED_TURF, "TRAIT_FIREDOOR_STOP" = TRAIT_FIREDOOR_STOP, + "TRAIT_FISHING_SPOT" = TRAIT_FISHING_SPOT, "TRAIT_HYPERSPACE_STOPPED" = TRAIT_HYPERSPACE_STOPPED, "TRAIT_IMMERSE_STOPPED" = TRAIT_IMMERSE_STOPPED, "TRAIT_LAVA_STOPPED" = TRAIT_LAVA_STOPPED, @@ -693,7 +687,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_GLASSBLOWING" = TRAIT_GLASSBLOWING, "TRAIT_XENOARCH_QUALIFIED" = TRAIT_XENOARCH_QUALIFIED, "TRAIT_DETECTIVE" = TRAIT_DETECTIVE, - "TRAIT_EXCITABLE" = TRAIT_EXCITABLE, "TRAIT_TWITCH_ADAPTED" = TRAIT_TWITCH_ADAPTED, ), // DOPPLER EDIT ADDITION END diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index f3ee2ecfbc05a..26045c4e7c075 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -4,9 +4,8 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( /atom = list( - "TRAIT_CATCH_AND_RELEASE" = TRAIT_CATCH_AND_RELEASE, - "TRAIT_KEEP_TOGETHER" = TRAIT_KEEP_TOGETHER, "TRAIT_UNHITTABLE_BY_PROJECTILES" = TRAIT_UNHITTABLE_BY_PROJECTILES, + "TRAIT_KEEP_TOGETHER" = TRAIT_KEEP_TOGETHER, ), /atom/movable = list( "TRAIT_ASHSTORM_IMMUNE" = TRAIT_ASHSTORM_IMMUNE, @@ -21,6 +20,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_RUNECHAT_HIDDEN" = TRAIT_RUNECHAT_HIDDEN, "TRAIT_SCARY_FISHERMAN" = TRAIT_SCARY_FISHERMAN, "TRAIT_SNOWSTORM_IMMUNE" = TRAIT_SNOWSTORM_IMMUNE, + "TRAIT_VOIDSTORM_IMMUNE" = TRAIT_VOIDSTORM_IMMUNE, "TRAIT_WEATHER_IMMUNE" = TRAIT_WEATHER_IMMUNE, ), /mob = list( @@ -102,7 +102,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_FAT" = TRAIT_FAT, "TRAIT_FEARLESS" = TRAIT_FEARLESS, "TRAIT_FENCE_CLIMBER" = TRAIT_FENCE_CLIMBER, - "TRAIT_FISH_EATER" = TRAIT_FISH_EATER, "TRAIT_FIST_MINING" = TRAIT_FIST_MINING, "TRAIT_FIXED_MUTANT_COLORS" = TRAIT_FIXED_MUTANT_COLORS, "TRAIT_FLESH_DESIRE" = TRAIT_FLESH_DESIRE, @@ -119,7 +118,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_GARLIC_BREATH" = TRAIT_GARLIC_BREATH, "TRAIT_GENELESS" = TRAIT_GENELESS, "TRAIT_GIANT" = TRAIT_GIANT, - "TRAIT_GODMODE" = TRAIT_GODMODE, "TRAIT_GOOD_HEARING" = TRAIT_GOOD_HEARING, "TRAIT_GRABWEAKNESS" = TRAIT_GRABWEAKNESS, "TRAIT_GREENTEXT_CURSED" = TRAIT_GREENTEXT_CURSED, @@ -302,7 +300,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_UNSTABLE" = TRAIT_UNSTABLE, "TRAIT_USED_DNA_VAULT" = TRAIT_USED_DNA_VAULT, "TRAIT_USES_SKINTONES" = TRAIT_USES_SKINTONES, - "TRAIT_VEGETARIAN" = TRAIT_VEGETARIAN, "TRAIT_VENTCRAWLER_ALWAYS" = TRAIT_VENTCRAWLER_ALWAYS, "TRAIT_VENTCRAWLER_NUDE" = TRAIT_VENTCRAWLER_NUDE, "TRAIT_VIRUSIMMUNE" = TRAIT_VIRUSIMMUNE, @@ -379,7 +376,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_GLASSBLOWING" = TRAIT_GLASSBLOWING, "TRAIT_XENOARCH_QUALIFIED" = TRAIT_XENOARCH_QUALIFIED, "TRAIT_DETECTIVE" = TRAIT_DETECTIVE, - "TRAIT_EXCITABLE" = TRAIT_EXCITABLE, "TRAIT_TWITCH_ADAPTED" = TRAIT_TWITCH_ADAPTED, ), // DOPPLER EDIT ADDITION END diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 0c441ba928ee4..6696d985d0b8c 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -247,7 +247,8 @@ return TRUE /proc/CheckToolReach(atom/movable/here, atom/movable/there, reach) - if(!here || !there) + . = FALSE + if(QDELETED(here) || QDELETED(there)) return switch(reach) if(0) @@ -258,14 +259,18 @@ var/obj/dummy = new(get_turf(here)) dummy.pass_flags |= PASSTABLE dummy.SetInvisibility(INVISIBILITY_ABSTRACT) - for(var/i in 1 to reach) //Limit it to that many tries - var/turf/T = get_step(dummy, get_dir(dummy, there)) + var/list/steps = get_steps_to(dummy, there) + if(isnull(steps) || length(steps) > reach) // If the path is further than the reach, no way we can reach it anyways. + qdel(dummy) + return FALSE + for(var/direction in steps) + var/turf/next_step = get_step(dummy, direction) if(dummy.CanReach(there)) qdel(dummy) return TRUE - if(!dummy.Move(T)) //we're blocked! + if(!dummy.Move(next_step)) // We're blocked, nope. qdel(dummy) - return + return FALSE qdel(dummy) /// Default behavior: ignore double clicks (the second click that makes the doubleclick call already calls for a normal click) diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index b9a0e3bf655f4..476140acb1edd 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -59,15 +59,14 @@ H.leap_icon.screen_loc = ui_alien_storage_r static_inventory += H.leap_icon - floor_change = new /atom/movable/screen/floor_changer(null, src) - floor_change.icon = ui_style - floor_change.screen_loc = ui_above_intent - static_inventory += floor_change - using = new/atom/movable/screen/language_menu(null, src) using.screen_loc = ui_alien_language_menu static_inventory += using + using = new /atom/movable/screen/floor_menu(null, src) + using.screen_loc = ui_alien_floor_menu + static_inventory += using + using = new /atom/movable/screen/navigate(null, src) using.screen_loc = ui_alien_navigate_menu static_inventory += using diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index bb2b9fcb14aee..77d135ce2c663 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -10,11 +10,6 @@ action_intent.screen_loc = ui_combat_toggle static_inventory += action_intent - floor_change = new /atom/movable/screen/floor_changer(null, src) - floor_change.icon = ui_style - floor_change.screen_loc = ui_above_intent - static_inventory += floor_change - healths = new /atom/movable/screen/healths/alien(null, src) infodisplay += healths @@ -37,6 +32,10 @@ using.screen_loc = ui_alien_language_menu static_inventory += using + using = new /atom/movable/screen/floor_menu(null, src) + using.screen_loc = ui_alien_floor_menu + static_inventory += using + using = new /atom/movable/screen/navigate(null, src) using.screen_loc = ui_alien_navigate_menu static_inventory += using diff --git a/code/_onclick/hud/generic_dextrous.dm b/code/_onclick/hud/generic_dextrous.dm index 4048fd91b16f6..aac5a2b75ccaa 100644 --- a/code/_onclick/hud/generic_dextrous.dm +++ b/code/_onclick/hud/generic_dextrous.dm @@ -33,10 +33,6 @@ action_intent.screen_loc = ui_combat_toggle static_inventory += action_intent - floor_change = new /atom/movable/screen/floor_changer(null, src) - floor_change.icon = 'icons/hud/screen_midnight.dmi' - static_inventory += floor_change - zone_select = new /atom/movable/screen/zone_sel(null, src) zone_select.icon = ui_style diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm index 9f90076a3ac71..e20c1ede2f663 100644 --- a/code/_onclick/hud/ghost.dm +++ b/code/_onclick/hud/ghost.dm @@ -91,10 +91,10 @@ using.icon = ui_style static_inventory += using - floor_change = new /atom/movable/screen/floor_changer/vertical(null, src) - floor_change.icon = ui_style - floor_change.screen_loc = ui_ghost_floor_changer - static_inventory += floor_change + using = new /atom/movable/screen/floor_menu(null, src) + using.screen_loc = ui_ghost_floor_menu + using.icon = ui_style + static_inventory += using /datum/hud/ghost/show_hud(version = 0, mob/viewmob) // don't show this HUD if observing; show the HUD of the observee diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 90370d267162b..73497bf418ff1 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -41,7 +41,6 @@ GLOBAL_LIST_INIT(available_ui_styles, list( var/atom/movable/screen/rest_icon var/atom/movable/screen/throw_icon var/atom/movable/screen/module_store_icon - var/atom/movable/screen/floor_change var/list/static_inventory = list() //the screen objects which are static var/list/toggleable_inventory = list() //the screen objects which can be hidden @@ -229,7 +228,6 @@ GLOBAL_LIST_INIT(available_ui_styles, list( zone_select = null pull_icon = null rest_icon = null - floor_change = null hand_slots.Cut() QDEL_LIST(toggleable_inventory) @@ -421,11 +419,6 @@ GLOBAL_LIST_INIT(available_ui_styles, list( return update_robot_modules_display() -/datum/hud/new_player/show_hud(version = 0, mob/viewmob) - . = ..() - if(.) - show_station_trait_buttons() - /datum/hud/proc/hidden_inventory_update() return diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 0ab0f022ca22e..5834a3973555c 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -70,16 +70,15 @@ using.icon = ui_style static_inventory += using + using = new /atom/movable/screen/floor_menu(null, src) + using.icon = ui_style + static_inventory += using + action_intent = new /atom/movable/screen/combattoggle/flashy(null, src) action_intent.icon = ui_style action_intent.screen_loc = ui_combat_toggle static_inventory += action_intent - floor_change = new /atom/movable/screen/floor_changer(null, src) - floor_change.icon = ui_style - floor_change.screen_loc = ui_human_floor_changer - static_inventory += floor_change - using = new /atom/movable/screen/mov_intent(null, src) using.icon = ui_style diff --git a/code/_onclick/hud/living.dm b/code/_onclick/hud/living.dm index d70d2f7d55d39..70084b1ecd9c6 100644 --- a/code/_onclick/hud/living.dm +++ b/code/_onclick/hud/living.dm @@ -15,10 +15,6 @@ action_intent.screen_loc = ui_combat_toggle static_inventory += action_intent - floor_change = new /atom/movable/screen/floor_changer(null, src) - floor_change.icon = 'icons/hud/screen_midnight.dmi' - static_inventory += floor_change - combo_display = new /atom/movable/screen/combo(null, src) infodisplay += combo_display diff --git a/code/_onclick/hud/new_player.dm b/code/_onclick/hud/new_player.dm index 1c794b5566d2d..371341aec0bf5 100644 --- a/code/_onclick/hud/new_player.dm +++ b/code/_onclick/hud/new_player.dm @@ -6,7 +6,6 @@ /datum/hud/new_player ///Whether the menu is currently on the client's screen or not var/menu_hud_status = TRUE - var/list/shown_station_trait_buttons /datum/hud/new_player/New(mob/owner) . = ..() @@ -27,58 +26,31 @@ if (!lobbyscreen.always_shown) lobbyscreen.RegisterSignal(src, COMSIG_HUD_LOBBY_COLLAPSED, TYPE_PROC_REF(/atom/movable/screen/lobby, collapse_button)) lobbyscreen.RegisterSignal(src, COMSIG_HUD_LOBBY_EXPANDED, TYPE_PROC_REF(/atom/movable/screen/lobby, expand_button)) + if (istype(lobbyscreen, /atom/movable/screen/lobby/button)) + var/atom/movable/screen/lobby/button/lobby_button = lobbyscreen + lobby_button.owner = REF(owner) + add_station_trait_buttons() -/// Load and then display the buttons for relevant station traits -/datum/hud/new_player/proc/show_station_trait_buttons() +/// Display buttons for relevant station traits +/datum/hud/new_player/proc/add_station_trait_buttons() if (!mymob?.client || mymob.client.interviewee || !length(GLOB.lobby_station_traits)) return + var/buttons_created = 0 + var/y_offset = 397 + var/y_button_offset = 27 for (var/datum/station_trait/trait as anything in GLOB.lobby_station_traits) - if (QDELETED(trait) || !trait.can_display_lobby_button(mymob.client)) - remove_station_trait_button(trait) - continue - if(LAZYACCESS(shown_station_trait_buttons, trait)) + if (!trait.can_display_lobby_button(mymob.client)) continue var/atom/movable/screen/lobby/button/sign_up/sign_up_button = new(our_hud = src) + sign_up_button.SlowInit() + sign_up_button.owner = REF(mymob) + sign_up_button.screen_loc = offset_to_screen_loc(233, y_offset, mymob.client.view) + y_offset += y_button_offset + static_inventory += sign_up_button trait.setup_lobby_button(sign_up_button) - static_inventory |= sign_up_button - LAZYSET(shown_station_trait_buttons, trait, sign_up_button) - RegisterSignal(trait, COMSIG_QDELETING, PROC_REF(remove_station_trait_button)) - - place_station_trait_buttons() - -/// Display the buttosn for relevant station traits. -/datum/hud/new_player/proc/place_station_trait_buttons() - if(hud_version != HUD_STYLE_STANDARD || !mymob?.client) - return - - var/y_offset = 397 - var/x_offset = 233 - var/y_button_offset = 27 - var/x_button_offset = -27 - var/iteration = 0 - for(var/trait in shown_station_trait_buttons) - var/atom/movable/screen/lobby/button/sign_up/sign_up_button = shown_station_trait_buttons[trait] - iteration++ - sign_up_button.screen_loc = offset_to_screen_loc(x_offset, y_offset, mymob.client.view) - mymob.client.screen |= sign_up_button - if (iteration >= MAX_STATION_TRAIT_BUTTONS_VERTICAL) - iteration = 0 - y_offset = 397 - x_offset += x_button_offset - else - y_offset += y_button_offset - -/// Remove a station trait button, then re-order the rest. -/datum/hud/new_player/proc/remove_station_trait_button(datum/station_trait/trait) - SIGNAL_HANDLER - var/atom/movable/screen/lobby/button/sign_up/button = LAZYACCESS(shown_station_trait_buttons, trait) - if(!button) - return - LAZYREMOVE(shown_station_trait_buttons, trait) - UnregisterSignal(trait, COMSIG_QDELETING) - static_inventory -= button - qdel(button) - place_station_trait_buttons() + buttons_created++ + if (buttons_created >= MAX_STATION_TRAIT_BUTTONS_VERTICAL) + return /atom/movable/screen/lobby plane = SPLASHSCREEN_PLANE @@ -122,9 +94,11 @@ var/enabled = TRUE ///Is the button currently being hovered over with the mouse? var/highlighted = FALSE + /// The ref of the mob that owns this button. Only the owner can click on it. + var/owner /atom/movable/screen/lobby/button/Click(location, control, params) - if(usr != get_mob()) + if(owner != REF(usr)) return if(!usr.client || usr.client.interviewee) @@ -139,7 +113,7 @@ return TRUE /atom/movable/screen/lobby/button/MouseEntered(location,control,params) - if(usr != get_mob()) + if(owner != REF(usr)) return if(!usr.client || usr.client.interviewee) @@ -150,7 +124,7 @@ update_appearance(UPDATE_ICON) /atom/movable/screen/lobby/button/MouseExited() - if(usr != get_mob()) + if(owner != REF(usr)) return if(!usr.client || usr.client.interviewee) diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 2d82bb0c1e6e8..e2e534443691a 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -87,6 +87,11 @@ using.screen_loc = ui_borg_navigate_menu static_inventory += using +// Z-level floor change + using = new /atom/movable/screen/floor_menu(null, src) + using.screen_loc = ui_borg_floor_menu + static_inventory += using + //Radio using = new /atom/movable/screen/robot/radio(null, src) using.screen_loc = ui_borg_radio @@ -144,11 +149,6 @@ action_intent.screen_loc = ui_combat_toggle static_inventory += action_intent - floor_change = new /atom/movable/screen/floor_changer(null, src) - floor_change.icon = ui_style - floor_change.screen_loc = ui_borg_floor_changer - static_inventory += floor_change - //Health healths = new /atom/movable/screen/healths/robot(null, src) infodisplay += healths diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 31390c62cbb91..cb06e00d116ef 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -160,6 +160,33 @@ /atom/movable/screen/language_menu/Click() usr.get_language_holder().open_language_menu(usr) +/atom/movable/screen/floor_menu + name = "change floor" + icon = 'icons/hud/screen_midnight.dmi' + icon_state = "floor_change" + screen_loc = ui_floor_menu + +/atom/movable/screen/floor_menu/Initialize(mapload) + . = ..() + register_context() + +/atom/movable/screen/floor_menu/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + + context[SCREENTIP_CONTEXT_LMB] = "Go up a floor" + context[SCREENTIP_CONTEXT_RMB] = "Go down a floor" + return CONTEXTUAL_SCREENTIP_SET + +/atom/movable/screen/floor_menu/Click(location,control,params) + var/list/modifiers = params2list(params) + + if(LAZYACCESS(modifiers, RIGHT_CLICK) || LAZYACCESS(modifiers, ALT_CLICK)) + usr.down() + return + + usr.up() + return + /atom/movable/screen/inventory /// The identifier for the slot. It has nothing to do with ID cards. var/slot_id @@ -353,34 +380,6 @@ icon = 'icons/hud/screen_cyborg.dmi' screen_loc = ui_borg_intents -/atom/movable/screen/floor_changer - name = "change floor" - icon = 'icons/hud/screen_midnight.dmi' - icon_state = "floor_change" - screen_loc = ui_floor_changer - var/vertical = FALSE - -/atom/movable/screen/floor_changer/Click(location,control,params) - var/list/modifiers = params2list(params) - - var/mouse_position - - if(vertical) - mouse_position = text2num(LAZYACCESS(modifiers, ICON_Y)) - else - mouse_position = text2num(LAZYACCESS(modifiers, ICON_X)) - - if(mouse_position > 16) - usr.up() - return - - usr.down() - return - -/atom/movable/screen/floor_changer/vertical - icon_state = "floor_change_v" - vertical = TRUE - /atom/movable/screen/spacesuit name = "Space suit cell status" icon_state = "spacesuit_0" diff --git a/code/controllers/subsystem/ai_controllers.dm b/code/controllers/subsystem/ai_controllers.dm index 49c571a9a0763..e7aa6b53fdc21 100644 --- a/code/controllers/subsystem/ai_controllers.dm +++ b/code/controllers/subsystem/ai_controllers.dm @@ -23,12 +23,14 @@ 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 - ai_controller.planning_failed() + COOLDOWN_START(ai_controller, failed_planning_cooldown, AI_FAILED_PLANNING_COOLDOWN) our_cost = MC_AVERAGE(our_cost, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index bbc21becc0f3b..4557e153db190 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -488,26 +488,29 @@ SUBSYSTEM_DEF(air) T.excited = FALSE ///Adds a turf to active processing, handles duplicates. Call this with blockchanges == TRUE if you want to nuke the assoc excited group -/datum/controller/subsystem/air/proc/add_to_active(turf/open/activate, blockchanges = FALSE) - if(istype(activate) && activate.air) - activate.significant_share_ticker = 0 - if(blockchanges && activate.excited_group) //This is used almost exclusivly for shuttles, so the excited group doesn't stay behind - activate.excited_group.garbage_collect() //Nuke it - if(activate.excited) //Don't keep doing it if there's no point +/datum/controller/subsystem/air/proc/add_to_active(turf/open/T, blockchanges = FALSE) + if(istype(T) && T.air) + T.significant_share_ticker = 0 + if(blockchanges && T.excited_group) //This is used almost exclusivly for shuttles, so the excited group doesn't stay behind + T.excited_group.garbage_collect() //Nuke it + if(T.excited) //Don't keep doing it if there's no point return #ifdef VISUALIZE_ACTIVE_TURFS - activate.add_atom_colour(COLOR_VIBRANT_LIME, TEMPORARY_COLOUR_PRIORITY) + T.add_atom_colour(COLOR_VIBRANT_LIME, TEMPORARY_COLOUR_PRIORITY) #endif - activate.excited = TRUE - active_turfs += activate - else if(activate.flags_1 & INITIALIZED_1) - for(var/turf/neighbor as anything in activate.atmos_adjacent_turfs) - add_to_active(neighbor, TRUE) + T.excited = TRUE + active_turfs += T + if(currentpart == SSAIR_ACTIVETURFS) + currentrun += T + else if(T.flags_1 & INITIALIZED_1) + for(var/turf/S in T.atmos_adjacent_turfs) + add_to_active(S, TRUE) else if(map_loading) if(queued_for_activation) - queued_for_activation[activate] = activate + queued_for_activation[T] = T + return else - activate.requires_activation = TRUE + T.requires_activation = TRUE /datum/controller/subsystem/air/StartLoadingMap() LAZYINITLIST(queued_for_activation) @@ -557,8 +560,8 @@ SUBSYSTEM_DEF(air) if(enemy_tile.current_cycle == -INFINITE) continue // .air instead of .return_air() because we can guarantee that the proc won't do anything - if(potential_diff.air.compare(enemy_tile.air, MOLES)) - //testing("Active turf found. Return value of compare(): [T.air.compare(enemy_tile.air, MOLES)]") + if(potential_diff.air.compare(enemy_tile.air)) + //testing("Active turf found. Return value of compare(): [T.air.compare(enemy_tile.air)]") if(!potential_diff.excited) potential_diff.excited = TRUE SSair.active_turfs += potential_diff diff --git a/code/controllers/subsystem/bitrunning.dm b/code/controllers/subsystem/bitrunning.dm index 63c2561f0f496..78afb101945b0 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/dynamic/dynamic.dm b/code/controllers/subsystem/dynamic/dynamic.dm index c3edc30dc6866..2092b3efacd8f 100644 --- a/code/controllers/subsystem/dynamic/dynamic.dm +++ b/code/controllers/subsystem/dynamic/dynamic.dm @@ -526,7 +526,7 @@ SUBSYSTEM_DEF(dynamic) //To new_player and such, and we want the datums to just free when the roundstart work is done var/list/roundstart_rules = init_rulesets(/datum/dynamic_ruleset/roundstart) - SSjob.divide_occupations(pure = TRUE, allow_all = TRUE) + SSjob.DivideOccupations(pure = TRUE, allow_all = TRUE) for(var/i in GLOB.new_player_list) var/mob/dead/new_player/player = i if(player.ready == PLAYER_READY_TO_PLAY && player.mind && player.check_preferences()) @@ -541,7 +541,7 @@ SUBSYSTEM_DEF(dynamic) else roundstart_pop_ready++ candidates.Add(player) - SSjob.reset_occupations() + SSjob.ResetOccupations() log_dynamic("Listing [roundstart_rules.len] round start rulesets, and [candidates.len] players ready.") if (candidates.len <= 0) log_dynamic("[candidates.len] candidates.") @@ -1018,7 +1018,7 @@ SUBSYSTEM_DEF(dynamic) var/list/reopened_jobs = list() for(var/mob/living/quitter in GLOB.suicided_mob_list) - var/datum/job/job = SSjob.get_job(quitter.job) + var/datum/job/job = SSjob.GetJob(quitter.job) if(!job || !(job.job_flags & JOB_REOPEN_ON_ROUNDSTART_LOSS)) continue if(!include_command && job.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets.dm index 0d3242a4d17b2..c77cce50d0157 100644 --- a/code/controllers/subsystem/dynamic/dynamic_rulesets.dm +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets.dm @@ -283,7 +283,7 @@ if(length(exclusive_roles)) var/exclusive_candidate = FALSE for(var/role in exclusive_roles) - var/datum/job/job = SSjob.get_job(role) + var/datum/job/job = SSjob.GetJob(role) if((role in candidate_client.prefs.job_preferences) && SSjob.check_job_eligibility(candidate_player, job, "Dynamic Roundstart TC", add_job_to_log = TRUE) == JOB_AVAILABLE) exclusive_candidate = TRUE diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm index efe857b936ddf..3476702e741ed 100644 --- a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm @@ -413,7 +413,7 @@ return ..() /datum/dynamic_ruleset/midround/from_ghosts/nuclear/finish_setup(mob/new_character, index) - new_character.mind.set_assigned_role(SSjob.get_job_type(/datum/job/nuclear_operative)) + new_character.mind.set_assigned_role(SSjob.GetJobType(/datum/job/nuclear_operative)) new_character.mind.special_role = ROLE_NUCLEAR_OPERATIVE if(index == 1) var/datum/antagonist/nukeop/leader/leader_antag_datum = new() @@ -572,7 +572,7 @@ var/mob/living/carbon/human/new_nightmare = new (find_maintenance_spawn(atmos_sensitive = TRUE, require_darkness = TRUE)) player_mind.transfer_to(new_nightmare) - player_mind.set_assigned_role(SSjob.get_job_type(/datum/job/nightmare)) + player_mind.set_assigned_role(SSjob.GetJobType(/datum/job/nightmare)) player_mind.special_role = ROLE_NIGHTMARE player_mind.add_antag_datum(/datum/antagonist/nightmare) new_nightmare.set_species(/datum/species/shadow/nightmare) @@ -991,7 +991,7 @@ var/mob/living/carbon/human/voidwalker = new (space_turf) player_mind.transfer_to(voidwalker) - player_mind.set_assigned_role(SSjob.get_job_type(/datum/job/voidwalker)) + player_mind.set_assigned_role(SSjob.GetJobType(/datum/job/voidwalker)) player_mind.special_role = antag_flag player_mind.add_antag_datum(antag_datum) diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm index 79eedc0adb8d7..999cd156b18d8 100644 --- a/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm @@ -63,7 +63,7 @@ GLOBAL_VAR_INIT(revolutionary_win, FALSE) flags = HIGH_IMPACT_RULESET /datum/dynamic_ruleset/roundstart/malf_ai/ready(forced) - var/datum/job/ai_job = SSjob.get_job_type(/datum/job/ai) + var/datum/job/ai_job = SSjob.GetJobType(/datum/job/ai) // If we're not forced, we're going to make sure we can actually have an AI in this shift, if(!forced && min(ai_job.total_positions - ai_job.current_positions, ai_job.spawn_positions) <= 0) @@ -75,7 +75,7 @@ GLOBAL_VAR_INIT(revolutionary_win, FALSE) /datum/dynamic_ruleset/roundstart/malf_ai/pre_execute(population) . = ..() - var/datum/job/ai_job = SSjob.get_job_type(/datum/job/ai) + var/datum/job/ai_job = SSjob.GetJobType(/datum/job/ai) // Maybe a bit too pedantic, but there should never be more malf AIs than there are available positions, spawn positions or antag cap allocations. var/num_malf = min(get_antag_cap(population), min(ai_job.total_positions - ai_job.current_positions, ai_job.spawn_positions)) for (var/i in 1 to num_malf) @@ -296,7 +296,7 @@ GLOBAL_VAR_INIT(revolutionary_win, FALSE) var/mob/M = pick_n_take(candidates) if (M) assigned += M.mind - M.mind.set_assigned_role(SSjob.get_job_type(/datum/job/space_wizard)) + M.mind.set_assigned_role(SSjob.GetJobType(/datum/job/space_wizard)) M.mind.special_role = ROLE_WIZARD return TRUE @@ -429,7 +429,7 @@ GLOBAL_VAR_INIT(revolutionary_win, FALSE) break var/mob/M = pick_n_take(candidates) assigned += M.mind - M.mind.set_assigned_role(SSjob.get_job_type(job_type)) + M.mind.set_assigned_role(SSjob.GetJobType(job_type)) M.mind.special_role = required_role return TRUE diff --git a/code/controllers/subsystem/id_access.dm b/code/controllers/subsystem/id_access.dm index faa2df1050ec2..b80e5718128bd 100644 --- a/code/controllers/subsystem/id_access.dm +++ b/code/controllers/subsystem/id_access.dm @@ -409,12 +409,6 @@ SUBSYSTEM_DEF(id_access) if(trim.assignment) id_card.assignment = trim.assignment - 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/job.dm b/code/controllers/subsystem/job.dm index 0b04b25c59721..b1629237dc6bf 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -22,7 +22,7 @@ SUBSYSTEM_DEF(job) var/list/unassigned = list() //Players who need jobs var/initial_players_to_assign = 0 //used for checking against population caps - // Whether to run divide_occupations pure so that there are no side-effects from calling it other than + // Whether to run DivideOccupations pure so that there are no side-effects from calling it other than // a player's assigned_role being set to some value. var/run_divide_occupation_pure = FALSE @@ -31,7 +31,7 @@ SUBSYSTEM_DEF(job) var/overflow_role = /datum/job/assistant - var/list/level_order = list(JP_HIGH, JP_MEDIUM, JP_LOW) + var/list/level_order = list(JP_HIGH,JP_MEDIUM,JP_LOW) /// Lazylist of mob:occupation_string pairs. var/list/dynamic_forced_occupations @@ -88,7 +88,7 @@ SUBSYSTEM_DEF(job) setup_job_lists() job_config_datum_singletons = generate_config_singletons() // we set this up here regardless in case someone wants to use the verb to generate the config file. if(!length(all_occupations)) - setup_occupations() + SetupOccupations() if(CONFIG_GET(flag/load_jobs_from_txt)) load_jobs_from_config() set_overflow_role(CONFIG_GET(string/overflow_job)) // this must always go after load_jobs_from_config() due to how the legacy systems operate, this always takes precedent. @@ -108,9 +108,9 @@ SUBSYSTEM_DEF(job) return overflow_jobs /datum/controller/subsystem/job/proc/set_overflow_role(new_overflow_role) - var/datum/job/new_overflow = ispath(new_overflow_role) ? get_job_type(new_overflow_role) : get_job(new_overflow_role) + var/datum/job/new_overflow = ispath(new_overflow_role) ? GetJobType(new_overflow_role) : GetJob(new_overflow_role) if(!new_overflow) - job_debug("SET_OVRFLW: Failed to set new overflow role: [new_overflow_role]") + JobDebug("Failed to set new overflow role: [new_overflow_role]") CRASH("set_overflow_role failed | new_overflow_role: [isnull(new_overflow_role) ? "null" : new_overflow_role]") var/cap = CONFIG_GET(number/overflow_cap) @@ -121,16 +121,17 @@ SUBSYSTEM_DEF(job) if(new_overflow.type == overflow_role) return - var/datum/job/old_overflow = get_job_type(overflow_role) + var/datum/job/old_overflow = GetJobType(overflow_role) old_overflow.allow_bureaucratic_error = initial(old_overflow.allow_bureaucratic_error) old_overflow.spawn_positions = initial(old_overflow.spawn_positions) old_overflow.total_positions = initial(old_overflow.total_positions) if(!(initial(old_overflow.job_flags) & JOB_CANNOT_OPEN_SLOTS)) old_overflow.job_flags &= ~JOB_CANNOT_OPEN_SLOTS overflow_role = new_overflow.type - job_debug("SET_OVRFLW: Overflow role set to: [new_overflow.type]") + JobDebug("Overflow role set to : [new_overflow.type]") -/datum/controller/subsystem/job/proc/setup_occupations() + +/datum/controller/subsystem/job/proc/SetupOccupations() name_occupations = list() type_occupations = list() @@ -204,20 +205,20 @@ SUBSYSTEM_DEF(job) return TRUE -/datum/controller/subsystem/job/proc/get_job(rank) +/datum/controller/subsystem/job/proc/GetJob(rank) if(!length(all_occupations)) - setup_occupations() + SetupOccupations() return name_occupations[rank] -/datum/controller/subsystem/job/proc/get_job_type(jobtype) +/datum/controller/subsystem/job/proc/GetJobType(jobtype) RETURN_TYPE(/datum/job) if(!length(all_occupations)) - setup_occupations() + SetupOccupations() return type_occupations[jobtype] /datum/controller/subsystem/job/proc/get_department_type(department_type) if(!length(all_occupations)) - setup_occupations() + SetupOccupations() return joinable_departments_by_type[department_type] /** @@ -229,92 +230,89 @@ SUBSYSTEM_DEF(job) * * latejoin - Set to TRUE if this is a latejoin role assignment. * * do_eligibility_checks - Set to TRUE to conduct all job eligibility tests and reject on failure. Set to FALSE if job eligibility has been tested elsewhere and they can be safely skipped. */ -/datum/controller/subsystem/job/proc/assign_role(mob/dead/new_player/player, datum/job/job, latejoin = FALSE, do_eligibility_checks = TRUE) - job_debug("AR: Running, Player: [player], Job: [isnull(job) ? "null" : job], LateJoin: [latejoin]") +/datum/controller/subsystem/job/proc/AssignRole(mob/dead/new_player/player, datum/job/job, latejoin = FALSE, do_eligibility_checks = TRUE) + JobDebug("Running AR, Player: [player], Job: [isnull(job) ? "null" : job], LateJoin: [latejoin]") if(!player?.mind || !job) - job_debug("AR: Failed, player has no mind or job is null. Player: [player], Rank: [isnull(job) ? "null" : job.type]") + JobDebug("AR has failed, player has no mind or job is null, Player: [player], Rank: [isnull(job) ? "null" : job.type]") return FALSE if(do_eligibility_checks && (check_job_eligibility(player, job, "AR", add_job_to_log = TRUE) != JOB_AVAILABLE)) return FALSE - job_debug("AR: Role now set and assigned - [player] is [job.title], JCP:[job.current_positions], JPL:[latejoin ? job.total_positions : job.spawn_positions]") + JobDebug("Player: [player] is now Rank: [job.title], JCP:[job.current_positions], JPL:[latejoin ? job.total_positions : job.spawn_positions]") player.mind.set_assigned_role(job) unassigned -= player job.current_positions++ return TRUE -/datum/controller/subsystem/job/proc/find_occupation_candidates(datum/job/job, level = 0) - job_debug("FOC: Now running, Job: [job], Level: [job_priority_level_to_string(level)]") +/datum/controller/subsystem/job/proc/FindOccupationCandidates(datum/job/job, level) + JobDebug("Running FOC, Job: [job], Level: [job_priority_level_to_string(level)]") var/list/candidates = list() for(var/mob/dead/new_player/player in unassigned) if(!player) - job_debug("FOC: Player no longer exists.") + JobDebug("FOC player no longer exists.") continue - if(!player.client) - job_debug("FOC: Player client no longer exists, Player: [player]") + JobDebug("FOC player client no longer exists, Player: [player]") continue - // Initial screening check. Does the player even have the job enabled, if they do - Is it at the correct priority level? var/player_job_level = player.client?.prefs.job_preferences[job.title] if(isnull(player_job_level)) - job_debug("FOC: Player job not enabled, Player: [player]") + JobDebug("FOC player job not enabled, Player: [player]") continue - - if(level && (player_job_level != level)) - job_debug("FOC: Player job enabled at wrong level, Player: [player], TheirLevel: [job_priority_level_to_string(player_job_level)], ReqLevel: [job_priority_level_to_string(level)]") + else if(player_job_level != level) + JobDebug("FOC player job enabled at wrong level, Player: [player], TheirLevel: [job_priority_level_to_string(player_job_level)], ReqLevel: [job_priority_level_to_string(level)]") continue - // This check handles its own output to job_debug. + // This check handles its own output to JobDebug. if(check_job_eligibility(player, job, "FOC", add_job_to_log = FALSE) != JOB_AVAILABLE) continue // They have the job enabled, at this priority level, with no restrictions applying to them. - job_debug("FOC: Player eligible, Player: [player], Level: [job_priority_level_to_string(level)]") + JobDebug("FOC pass, Player: [player], Level: [job_priority_level_to_string(level)]") candidates += player return candidates -/datum/controller/subsystem/job/proc/give_random_job(mob/dead/new_player/player) - job_debug("GRJ: Giving random job, Player: [player]") +/datum/controller/subsystem/job/proc/GiveRandomJob(mob/dead/new_player/player) + JobDebug("GRJ Giving random job, Player: [player]") . = FALSE for(var/datum/job/job as anything in shuffle(joinable_occupations)) if(QDELETED(player)) - job_debug("GRJ: Player is deleted, aborting") + JobDebug("GRJ player is deleted, aborting") break if((job.current_positions >= job.spawn_positions) && job.spawn_positions != -1) - job_debug("GRJ: Job lacks spawn positions to be eligible, Player: [player], Job: [job]") + JobDebug("GRJ job lacks spawn positions to be eligible, Player: [player], Job: [job]") continue - if(istype(job, get_job_type(overflow_role))) // We don't want to give him assistant, that's boring! - job_debug("GRJ: Skipping overflow role, Player: [player], Job: [job]") + if(istype(job, GetJobType(overflow_role))) // We don't want to give him assistant, that's boring! + JobDebug("GRJ skipping overflow role, Player: [player], Job: [job]") continue if(job.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) //If you want a command position, select it! - job_debug("GRJ: Skipping command role, Player: [player], Job: [job]") + JobDebug("GRJ skipping command role, Player: [player], Job: [job]") continue - // This check handles its own output to job_debug. + // This check handles its own output to JobDebug. if(check_job_eligibility(player, job, "GRJ", add_job_to_log = TRUE) != JOB_AVAILABLE) continue - if(assign_role(player, job, do_eligibility_checks = FALSE)) - job_debug("GRJ: Random job given, Player: [player], Job: [job]") + if(AssignRole(player, job, do_eligibility_checks = FALSE)) + JobDebug("GRJ Random job given, Player: [player], Job: [job]") return TRUE - job_debug("GRJ: Player eligible but assign_role failed, Player: [player], Job: [job]") + JobDebug("GRJ Player eligible but AssignRole failed, Player: [player], Job: [job]") -/datum/controller/subsystem/job/proc/reset_occupations() - job_debug("RO: Occupations reset.") +/datum/controller/subsystem/job/proc/ResetOccupations() + JobDebug("Occupations reset.") for(var/mob/dead/new_player/player as anything in GLOB.new_player_list) if(!player?.mind) continue - player.mind.set_assigned_role(get_job_type(/datum/job/unassigned)) + player.mind.set_assigned_role(GetJobType(/datum/job/unassigned)) player.mind.special_role = null - setup_occupations() + SetupOccupations() unassigned = list() if(CONFIG_GET(flag/load_jobs_from_txt)) // Any errors with the configs has already been said, we don't need to repeat them here. @@ -323,11 +321,12 @@ SUBSYSTEM_DEF(job) return -/* - * Forces a random Head of Staff role to be assigned to a random eligible player. - * Returns TRUE if a player was selected and assigned the role. FALSE otherwise. +/** + * Will try to select a head, ignoring ALL non-head preferences for every level until. + * + * Basically tries to ensure there is at least one head in every shift if anyone has that job preference enabled at all. */ -/datum/controller/subsystem/job/proc/force_one_head_assignment() +/datum/controller/subsystem/job/proc/FillHeadPosition() var/datum/job_department/command_department = get_department_type(/datum/job_department/command) if(!command_department) return FALSE @@ -335,65 +334,60 @@ SUBSYSTEM_DEF(job) for(var/datum/job/job as anything in command_department.department_jobs) if((job.current_positions >= job.total_positions) && job.total_positions != -1) continue - var/list/candidates = find_occupation_candidates(job, level) + var/list/candidates = FindOccupationCandidates(job, level) if(!candidates.len) continue var/mob/dead/new_player/candidate = pick(candidates) - // Eligibility checks done as part of find_occupation_candidates. - if(assign_role(candidate, job, do_eligibility_checks = FALSE)) + // Eligibility checks done as part of FindOccupationCandidates. + if(AssignRole(candidate, job, do_eligibility_checks = FALSE)) return TRUE return FALSE /** * Attempts to fill out all possible head positions for players with that job at a a given job priority level. - * Returns the number of Head positions assigned. * * Arguments: - * * level - One of the JP_LOW, JP_MEDIUM, JP_HIGH or JP_ANY defines. Attempts to find candidates with head jobs at that priority only. + * * level - One of the JP_LOW, JP_MEDIUM or JP_HIGH defines. Attempts to find candidates with head jobs at this priority only. */ -/datum/controller/subsystem/job/proc/fill_all_head_positions_at_priority(level) - . = 0 +/datum/controller/subsystem/job/proc/CheckHeadPositions(level) var/datum/job_department/command_department = get_department_type(/datum/job_department/command) - if(!command_department) - return . - + return for(var/datum/job/job as anything in command_department.department_jobs) if((job.current_positions >= job.total_positions) && job.total_positions != -1) continue - var/list/candidates = find_occupation_candidates(job, level) + var/list/candidates = FindOccupationCandidates(job, level) if(!candidates.len) continue var/mob/dead/new_player/candidate = pick(candidates) - // Eligibility checks done as part of find_occupation_candidates - if(assign_role(candidate, job, do_eligibility_checks = FALSE)) - .++ + // Eligibility checks done as part of FindOccupationCandidates + AssignRole(candidate, job, do_eligibility_checks = FALSE) /// Attempts to fill out all available AI positions. /datum/controller/subsystem/job/proc/fill_ai_positions() - var/datum/job/ai_job = get_job(JOB_AI) + var/datum/job/ai_job = GetJob(JOB_AI) if(!ai_job) return // In byond for(in to) loops, the iteration is inclusive so we need to stop at ai_job.total_positions - 1 for(var/i in ai_job.current_positions to ai_job.total_positions - 1) for(var/level in level_order) var/list/candidates = list() - candidates = find_occupation_candidates(ai_job, level) + candidates = FindOccupationCandidates(ai_job, level) if(candidates.len) var/mob/dead/new_player/candidate = pick(candidates) - // Eligibility checks done as part of find_occupation_candidates - if(assign_role(candidate, get_job_type(/datum/job/ai), do_eligibility_checks = FALSE)) + // Eligibility checks done as part of FindOccupationCandidates + if(AssignRole(candidate, GetJobType(/datum/job/ai), do_eligibility_checks = FALSE)) break -/** Proc divide_occupations +/** Proc DivideOccupations * fills var "assigned_role" for all ready players. * This proc must not have any side effect besides of modifying "assigned_role". **/ -/datum/controller/subsystem/job/proc/divide_occupations(pure = FALSE, allow_all = FALSE) +/datum/controller/subsystem/job/proc/DivideOccupations(pure = FALSE, allow_all = FALSE) //Setup new player list and get the jobs list - job_debug("DO: Running, allow_all = [allow_all], pure = [pure]") + JobDebug("Running DO, allow_all = [allow_all], pure = [pure]") run_divide_occupation_pure = pure SEND_SIGNAL(src, COMSIG_OCCUPATIONS_DIVIDED, pure, allow_all) @@ -403,166 +397,162 @@ SUBSYSTEM_DEF(job) if(player.ready == PLAYER_READY_TO_PLAY && player.check_preferences() && player.mind && is_unassigned_job(player.mind.assigned_role)) unassigned += player - initial_players_to_assign = length(unassigned) + initial_players_to_assign = unassigned.len - job_debug("DO: Player count to assign roles to: [initial_players_to_assign]") + JobDebug("DO, Len: [unassigned.len]") //Scale number of open security officer slots to population setup_officer_positions() //Jobs will have fewer access permissions if the number of players exceeds the threshold defined in game_options.txt - var/min_access_threshold = CONFIG_GET(number/minimal_access_threshold) - if(min_access_threshold) - if(min_access_threshold > initial_players_to_assign) + var/mat = CONFIG_GET(number/minimal_access_threshold) + if(mat) + if(mat > unassigned.len) CONFIG_SET(flag/jobs_have_minimal_access, FALSE) else CONFIG_SET(flag/jobs_have_minimal_access, TRUE) - //Shuffle player list. - shuffle_inplace(unassigned) + //Shuffle players and jobs + unassigned = shuffle(unassigned) - handle_feedback_gathering() + HandleFeedbackGathering() - // Assign any priority positions before all other standard job selections. - job_debug("DO: Assigning priority positions") + // Dynamic has picked a ruleset that requires enforcing some jobs before others. + JobDebug("DO, Assigning Priority Positions: [length(dynamic_forced_occupations)]") assign_priority_positions() - job_debug("DO: Priority assignment complete") - - // The overflow role has limitless slots, plus having the Overflow box ticked in prefs should (with one exception) set the priority to JP_HIGH. - // So everyone with overflow enabled will get that job. Thus we can assign it immediately to all players that have it enabled. - job_debug("DO: Assigning early overflow roles") - assign_all_overflow_positions() - job_debug("DO: Early overflow roles assigned.") - - // At this point we can assume the following: - // From assign_priority_positions() - // 1. If possible, any necessary job roles to allow Dynamic rulesets to execute (such as an AI for malf AI) are satisfied. - // 2. All Head of Staff roles with any player pref set to JP_HIGH are filled out. - // 3. If any player not selected by the above has any Head of Staff preference enabled at any JP_ level, there is at least one Head of Staff. - // - // From assign_all_overflow_positions() - // 4. Anyone with the overflow role enabled has been given the overflow role. - - // Shuffle the joinable occupation list and filter out ineligible occupations due to above job assignments. - var/list/available_occupations = joinable_occupations.Copy() - for(var/datum/job/job in available_occupations) - // Make sure the job isn't filled. If it is, remove it from the list so it doesn't get checked. - if((job.current_positions >= job.spawn_positions) && job.spawn_positions != -1) - job_debug("DO: Job is now filled, Job: [job], Current: [job.current_positions], Limit: [job.spawn_positions]") - available_occupations -= job - job_debug("DO: Running standard job assignment") + //People who wants to be the overflow role, sure, go on. + JobDebug("DO, Running Overflow Check 1") + var/datum/job/overflow_datum = GetJobType(overflow_role) + var/list/overflow_candidates = FindOccupationCandidates(overflow_datum, JP_LOW) + JobDebug("AC1, Candidates: [overflow_candidates.len]") + for(var/mob/dead/new_player/player in overflow_candidates) + JobDebug("AC1 pass, Player: [player]") + // Eligibility checks done as part of FindOccupationCandidates + AssignRole(player, GetJobType(overflow_role), do_eligibility_checks = FALSE) + overflow_candidates -= player + JobDebug("DO, AC1 end") + + //Select one head + JobDebug("DO, Running Head Check") + FillHeadPosition() + JobDebug("DO, Head Check end") + + // Fill out any remaining AI positions. + JobDebug("DO, Running AI Check") + fill_ai_positions() + JobDebug("DO, AI Check end") + + //Other jobs are now checked + JobDebug("DO, Running standard job assignment") + // New job giving system by Donkie + // This will cause lots of more loops, but since it's only done once it shouldn't really matter much at all. + // Hopefully this will add more randomness and fairness to job giving. + // Loop through all levels from high to low + var/list/shuffledoccupations = shuffle(joinable_occupations) for(var/level in level_order) - job_debug("JOBS: Filling in head roles, Level: [job_priority_level_to_string(level)]") - // Fill the head jobs first each level - fill_all_head_positions_at_priority(level) + //Check the head jobs first each level + CheckHeadPositions(level) // Loop through all unassigned players for(var/mob/dead/new_player/player in unassigned) if(!allow_all) - if(popcap_reached()) - job_debug("JOBS: Popcap reached, trying to reject player: [player]") - try_reject_player(player) + if(PopcapReached()) + RejectPlayer(player) + + // Loop through all jobs + for(var/datum/job/job in shuffledoccupations) // SHUFFLE ME BABY + if(!job) + JobDebug("FOC invalid/null job in occupations, Player: [player], Job: [job]") + shuffledoccupations -= job + continue - job_debug("JOBS: Finding a job for player: [player], at job priority pref: [job_priority_level_to_string(level)]") + // Make sure the job isn't filled. If it is, remove it from the list so it doesn't get checked again. + if((job.current_positions >= job.spawn_positions) && job.spawn_positions != -1) + JobDebug("FOC job filled and not overflow, Player: [player], Job: [job], Current: [job.current_positions], Limit: [job.spawn_positions]") + shuffledoccupations -= job + continue - // Loop through all jobs and build a list of jobs this player could be eligible for. - var/list/possible_jobs = list() - for(var/datum/job/job in available_occupations) // Filter any job that doesn't fit the current level. var/player_job_level = player.client?.prefs.job_preferences[job.title] if(isnull(player_job_level)) - job_debug("JOBS: Job not enabled, Job: [job]") + JobDebug("FOC player job not enabled, Player: [player]") continue - if(player_job_level != level) - job_debug("JOBS: Job enabled at different priority pref, Job: [job], TheirLevel: [job_priority_level_to_string(player_job_level)], ReqLevel: [job_priority_level_to_string(level)]") + else if(player_job_level != level) + JobDebug("FOC player job enabled but at different level, Player: [player], TheirLevel: [job_priority_level_to_string(player_job_level)], ReqLevel: [job_priority_level_to_string(level)]") continue - if(check_job_eligibility(player, job, "JOBS", add_job_to_log = TRUE) != JOB_AVAILABLE) + if(check_job_eligibility(player, job, "DO", add_job_to_log = TRUE) != JOB_AVAILABLE) continue - possible_jobs += job - - // If there are no possible jobs for them at this priority, skip them. - if(!length(possible_jobs)) - job_debug("JOBS: Player not eligible for any available jobs at this priority level: [player]") - continue + JobDebug("DO pass, Player: [player], Level:[level], Job:[job.title]") + AssignRole(player, job, do_eligibility_checks = FALSE) + unassigned -= player + break - // Otherwise, pick one of those jobs at random. - var/datum/job/picked_job = pick(possible_jobs) + JobDebug("DO, Ending standard job assignment") - job_debug("JOBS: Now assigning role to player: [player], Job:[picked_job.title]") - assign_role(player, picked_job, do_eligibility_checks = FALSE) - if((picked_job.current_positions >= picked_job.spawn_positions) && picked_job.spawn_positions != -1) - job_debug("JOBS: Job is now full, Job: [picked_job], Positions: [picked_job.current_positions], Limit: [picked_job.spawn_positions]") - available_occupations -= picked_job - - job_debug("DO: Ending standard job assignment") - - job_debug("DO: Handle unassigned") - // For any players that didn't get a job, fall back on their pref setting for what to do. + JobDebug("DO, Handle unassigned.") + // Hand out random jobs to the people who didn't get any in the last check + // Also makes sure that they got their preference correct for(var/mob/dead/new_player/player in unassigned) - handle_unassigned(player, allow_all) - job_debug("DO: Ending handle unassigned") + HandleUnassigned(player, allow_all) + JobDebug("DO, Ending handle unassigned.") - job_debug("DO: Handle unrejectable unassigned") + JobDebug("DO, Handle unrejectable unassigned") //Mop up people who can't leave. for(var/mob/dead/new_player/player in unassigned) //Players that wanted to back out but couldn't because they're antags (can you feel the edge case?) - if(!give_random_job(player)) - if(!assign_role(player, get_job_type(overflow_role))) //If everything is already filled, make them an assistant - job_debug("DO: Forced antagonist could not be assigned any random job or the overflow role. divide_occupations failed.") - job_debug("---------------------------------------------------") + if(!GiveRandomJob(player)) + if(!AssignRole(player, GetJobType(overflow_role))) //If everything is already filled, make them an assistant + JobDebug("DO, Forced antagonist could not be assigned any random job or the overflow role. DivideOccupations failed.") + JobDebug("---------------------------------------------------") run_divide_occupation_pure = FALSE return FALSE //Living on the edge, the forced antagonist couldn't be assigned to overflow role (bans, client age) - just reroll - job_debug("DO: Ending handle unrejectable unassigned") + JobDebug("DO, Ending handle unrejectable unassigned") - job_debug("All divide occupations tasks completed.") - job_debug("---------------------------------------------------") + JobDebug("All divide occupations tasks completed.") + JobDebug("---------------------------------------------------") run_divide_occupation_pure = FALSE return TRUE //We couldn't find a job from prefs for this guy. -/datum/controller/subsystem/job/proc/handle_unassigned(mob/dead/new_player/player, allow_all = FALSE) +/datum/controller/subsystem/job/proc/HandleUnassigned(mob/dead/new_player/player, allow_all = FALSE) var/jobless_role = player.client.prefs.read_preference(/datum/preference/choiced/jobless_role) if(!allow_all) - if(popcap_reached()) - job_debug("HU: Popcap reached, trying to reject player: [player]") - try_reject_player(player) + if(PopcapReached()) + RejectPlayer(player) return switch (jobless_role) if (BEOVERFLOW) - var/datum/job/overflow_role_datum = get_job_type(overflow_role) + var/datum/job/overflow_role_datum = GetJobType(overflow_role) if(check_job_eligibility(player, overflow_role_datum, debug_prefix = "HU", add_job_to_log = TRUE) != JOB_AVAILABLE) - job_debug("HU: Player cannot be overflow, trying to reject: [player]") - try_reject_player(player) + RejectPlayer(player) return - if(!assign_role(player, overflow_role_datum, do_eligibility_checks = FALSE)) - job_debug("HU: Player could not be assigned overflow role, trying to reject: [player]") - try_reject_player(player) + if(!AssignRole(player, overflow_role_datum, do_eligibility_checks = FALSE)) + RejectPlayer(player) return if (BERANDOMJOB) - if(!give_random_job(player)) - job_debug("HU: Player cannot be given a random job, trying to reject: [player]") - try_reject_player(player) + if(!GiveRandomJob(player)) + RejectPlayer(player) return if (RETURNTOLOBBY) - job_debug("HU: Player unable to be assigned job, return to lobby enabled: [player]") - try_reject_player(player) + RejectPlayer(player) return else //Something gone wrong if we got here. - job_debug("HU: [player] has an invalid jobless_role var: [jobless_role]") - log_game("[player] has an invalid jobless_role var: [jobless_role]") - message_admins("[player] has an invalid jobless_role, this shouldn't happen.") - try_reject_player(player) + var/message = "HU: [player] fell through handling unassigned" + JobDebug(message) + log_game(message) + message_admins(message) + RejectPlayer(player) //Gives the player the stuff he should have with his rank -/datum/controller/subsystem/job/proc/equip_rank(mob/living/equipping, datum/job/job, client/player_client) +/datum/controller/subsystem/job/proc/EquipRank(mob/living/equipping, datum/job/job, client/player_client) equipping.job = job.title SEND_SIGNAL(equipping, COMSIG_JOB_RECEIVED, job) @@ -582,7 +572,7 @@ SUBSYSTEM_DEF(job) /datum/controller/subsystem/job/proc/handle_auto_deadmin_roles(client/C, rank) if(!C?.holder) return TRUE - var/datum/job/job = get_job(rank) + var/datum/job/job = GetJob(rank) var/timegate_expired = FALSE // allow only forcing deadminning in the first X seconds of the round if auto_deadmin_timegate is set in config @@ -600,7 +590,7 @@ SUBSYSTEM_DEF(job) return C.holder.auto_deadmin() /datum/controller/subsystem/job/proc/setup_officer_positions() - var/datum/job/J = SSjob.get_job(JOB_SECURITY_OFFICER) + var/datum/job/J = SSjob.GetJob(JOB_SECURITY_OFFICER) if(!J) CRASH("setup_officer_positions(): Security officer job is missing") @@ -608,7 +598,7 @@ SUBSYSTEM_DEF(job) if(ssc > 0) if(J.spawn_positions > 0) var/officer_positions = min(12, max(J.spawn_positions, round(unassigned.len / ssc))) //Scale between configured minimum and 12 officers - job_debug("SOP: Setting open security officer positions to [officer_positions]") + JobDebug("Setting open security officer positions to [officer_positions]") J.total_positions = officer_positions J.spawn_positions = officer_positions @@ -624,7 +614,7 @@ SUBSYSTEM_DEF(job) else //We ran out of spare locker spawns! break -/datum/controller/subsystem/job/proc/handle_feedback_gathering() +/datum/controller/subsystem/job/proc/HandleFeedbackGathering() for(var/datum/job/job as anything in joinable_occupations) var/high = 0 //high var/medium = 0 //medium @@ -663,7 +653,7 @@ SUBSYSTEM_DEF(job) SSblackbox.record_feedback("nested tally", "job_preferences", young, list("[job.title]", "young")) SSblackbox.record_feedback("nested tally", "job_preferences", newbie, list("[job.title]", "newbie")) -/datum/controller/subsystem/job/proc/popcap_reached() +/datum/controller/subsystem/job/proc/PopcapReached() var/hpc = CONFIG_GET(number/hard_popcap) var/epc = CONFIG_GET(number/extreme_popcap) if(hpc || epc) @@ -672,12 +662,12 @@ SUBSYSTEM_DEF(job) return 1 return 0 -/datum/controller/subsystem/job/proc/try_reject_player(mob/dead/new_player/player) +/datum/controller/subsystem/job/proc/RejectPlayer(mob/dead/new_player/player) if(player.mind && player.mind.special_role) - job_debug("RJCT: Player unable to be rejected due to special_role, Player: [player], SpecialRole: [player.mind.special_role]") - return FALSE - - job_debug("RJCT: Player rejected, Player: [player]") + return + if(PopcapReached()) + JobDebug("Popcap overflow Check observer located, Player: [player]") + JobDebug("Player rejected :[player]") unassigned -= player if(!run_divide_occupation_pure) to_chat(player, "You have failed to qualify for any job you desired.") @@ -689,10 +679,10 @@ SUBSYSTEM_DEF(job) var/oldjobs = SSjob.all_occupations sleep(2 SECONDS) for (var/datum/job/job as anything in oldjobs) - INVOKE_ASYNC(src, PROC_REF(recover_job), job) + INVOKE_ASYNC(src, PROC_REF(RecoverJob), job) -/datum/controller/subsystem/job/proc/recover_job(datum/job/J) - var/datum/job/newjob = get_job(J.title) +/datum/controller/subsystem/job/proc/RecoverJob(datum/job/J) + var/datum/job/newjob = GetJob(J.title) if (!istype(newjob)) return newjob.total_positions = J.total_positions @@ -709,7 +699,7 @@ SUBSYSTEM_DEF(job) if(buckle && isliving(joining_mob)) buckle_mob(joining_mob, FALSE, FALSE) -/datum/controller/subsystem/job/proc/send_to_late_join(mob/M, buckle = TRUE) +/datum/controller/subsystem/job/proc/SendToLateJoin(mob/M, buckle = TRUE) var/atom/destination if(M.mind && !is_unassigned_job(M.mind.assigned_role) && length(GLOB.jobspawn_overrides[M.mind.assigned_role.title])) //We're doing something special today. destination = pick(GLOB.jobspawn_overrides[M.mind.assigned_role.title]) @@ -744,6 +734,19 @@ SUBSYSTEM_DEF(job) stack_trace("Unable to find last resort spawn point.") return GET_ERROR_ROOM +///Lands specified mob at a random spot in the hallways +/datum/controller/subsystem/job/proc/DropLandAtRandomHallwayPoint(mob/living/living_mob) + var/turf/spawn_turf = get_safe_random_station_turf(typesof(/area/station/hallway)) + + if(!spawn_turf) + SendToLateJoin(living_mob) + else + podspawn(list( + "target" = spawn_turf, + "path" = /obj/structure/closet/supplypod/centcompod, + "spawn" = living_mob + )) + /// Returns a list of minds of all heads of staff who are alive /datum/controller/subsystem/job/proc/get_living_heads() . = list() @@ -778,7 +781,7 @@ SUBSYSTEM_DEF(job) if(sec.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_SECURITY) . += sec -/datum/controller/subsystem/job/proc/job_debug(message) +/datum/controller/subsystem/job/proc/JobDebug(message) log_job_debug(message) /// Builds various lists of jobs based on station, centcom and additional jobs with icons associated with them. @@ -843,47 +846,12 @@ SUBSYSTEM_DEF(job) safe_code_timer_id = null safe_code_request_loc = null -/// Assigns roles that are considered high priority, either due to dynamic needing to force a specific role for a specific ruleset -/// or making sure roles critical to round progression exist where possible every shift. +/// Blindly assigns the required roles to every player in the dynamic_forced_occupations list. /datum/controller/subsystem/job/proc/assign_priority_positions() - job_debug("APP: Assigning Dynamic ruleset forced occupations: [length(dynamic_forced_occupations)]") for(var/mob/new_player in dynamic_forced_occupations) - // Eligibility checks already carried out as part of the dynamic ruleset trim_candidates proc. - // However no guarantee of game state between then and now, so don't skip eligibility checks on assign_role. - assign_role(new_player, get_job(dynamic_forced_occupations[new_player])) - - // Get JP_HIGH department Heads of Staff in place. Indirectly useful for the Revolution ruleset to have as many Heads as possible. - job_debug("APP: Assigning all JP_HIGH head of staff roles.") - var/head_count = fill_all_head_positions_at_priority(JP_HIGH) - - // If nobody has JP_HIGH on a Head role, try to force at least one Head of Staff so every shift has the best chance - // of having at least one leadership role. - if(head_count == 0) - force_one_head_assignment() - - // Fill out all AI positions. - job_debug("APP: Filling all AI positions") - fill_ai_positions() - -/datum/controller/subsystem/job/proc/assign_all_overflow_positions() - job_debug("OVRFLW: Assigning all overflow roles.") - job_debug("OVRFLW: This shift's overflow role: [overflow_role]") - var/datum/job/overflow_datum = get_job_type(overflow_role) - - // When the Overflow role changes for any reason, this allows players to set otherwise invalid job priority pref states. - // So if Assistant is the "usual" Overflow but it gets changed to Clown for a shift, players can set the Assistant role's priorities - // to JP_MEDIUM and JP_LOW. When the "usual" Overflow role comes back, it returns to an On option in the prefs menu but still - // keeps its old JP_MEDIUM or JP_LOW value in the background. - - // Due to this prefs quirk, we actually don't want to find JP_HIGH candidates as it may exclude people with abnormal pref states that - // appear normal from the UI. By passing in JP_ANY, it will return all players that have the overflow job pref (which should be a toggle) - // set to any level. - var/list/overflow_candidates = find_occupation_candidates(overflow_datum, JP_ANY) - for(var/mob/dead/new_player/player in overflow_candidates) - // Eligibility checks done as part of find_occupation_candidates, so skip them. - assign_role(player, get_job_type(overflow_role), do_eligibility_checks = FALSE) - job_debug("OVRFLW: Assigned overflow to player: [player]") - job_debug("OVRFLW: All overflow roles assigned.") + // Eligibility checks already carried out as part of the dynamic ruleset trim_candidates proc.area + // However no guarantee of game state between then and now, so don't skip eligibility checks on AssignRole. + AssignRole(new_player, GetJob(dynamic_forced_occupations[new_player])) /// Takes a job priority #define such as JP_LOW and gets its string representation for logging. /datum/controller/subsystem/job/proc/job_priority_level_to_string(priority) @@ -901,40 +869,40 @@ SUBSYSTEM_DEF(job) * Arguments: * * player - The player to check for job eligibility. * * possible_job - The job to check for eligibility against. - * * debug_prefix - Logging prefix for the job_debug log entries. For example, GRJ during give_random_job or DO during divide_occupations. + * * debug_prefix - Logging prefix for the JobDebug log entries. For example, GRJ during GiveRandomJob or DO during DivideOccupations. * * add_job_to_log - If TRUE, appends the job type to the log entry. If FALSE, does not. Set to FALSE when check is part of iterating over players for a specific job, set to TRUE when check is part of iterating over jobs for a specific player and you don't want extra log entry spam. */ /datum/controller/subsystem/job/proc/check_job_eligibility(mob/dead/new_player/player, datum/job/possible_job, debug_prefix = "", add_job_to_log = FALSE) if(!player.mind) - job_debug("[debug_prefix]: Player has no mind, Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") + JobDebug("[debug_prefix] player has no mind, Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") return JOB_UNAVAILABLE_GENERIC if(possible_job.title in player.mind.restricted_roles) - job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_ANTAG_INCOMPAT, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") + JobDebug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_ANTAG_INCOMPAT, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") return JOB_UNAVAILABLE_ANTAG_INCOMPAT if(!possible_job.player_old_enough(player.client)) - job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_ACCOUNTAGE, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") + JobDebug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_ACCOUNTAGE, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") return JOB_UNAVAILABLE_ACCOUNTAGE var/required_playtime_remaining = possible_job.required_playtime_remaining(player.client) if(required_playtime_remaining) - job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_PLAYTIME, possible_job.title)], Player: [player], MissingTime: [required_playtime_remaining][add_job_to_log ? ", Job: [possible_job]" : ""]") + JobDebug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_PLAYTIME, possible_job.title)], Player: [player], MissingTime: [required_playtime_remaining][add_job_to_log ? ", Job: [possible_job]" : ""]") return JOB_UNAVAILABLE_PLAYTIME // Run the banned check last since it should be the rarest check to fail and can access the database. if(is_banned_from(player.ckey, possible_job.title)) - job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_BANNED, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") + JobDebug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_BANNED, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") return JOB_UNAVAILABLE_BANNED // Check for character age if(possible_job.required_character_age > player.client.prefs.read_preference(/datum/preference/numeric/age) && possible_job.required_character_age != null) - job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_AGE)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") + JobDebug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_AGE)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") return JOB_UNAVAILABLE_AGE // Need to recheck the player exists after is_banned_from since it can query the DB which may sleep. if(QDELETED(player)) - job_debug("[debug_prefix]: Player is qdeleted, Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") + JobDebug("[debug_prefix] player is qdeleted, Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") return JOB_UNAVAILABLE_GENERIC return JOB_AVAILABLE diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index d20824f0972b6..4d9d9b142eeee 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -410,22 +410,14 @@ Used by the AI doomsday and the self-destruct nuke. add_new_zlevel("[name][i ? " [i + 1]" : ""]", level, contain_turfs = FALSE) ++i - SSautomapper.preload_templates_from_toml(files) // DOPPLER EDIT ADDITION - We need to load our templates AFTER the Z level exists, otherwise, there is no z level to preload. - var/turf_blacklist = SSautomapper.get_turf_blacklists(files) // DOPPLER EDIT ADDITION - We use blacklisted turfs to carve out places for our templates. - // load the maps for (var/P in parsed_maps) var/datum/parsed_map/pm = P - pm.turf_blacklist = turf_blacklist // DOPPLER EDIT ADDITION - apply blacklist var/bounds = pm.bounds var/x_offset = bounds ? round(world.maxx / 2 - bounds[MAP_MAXX] / 2) + 1 : 1 var/y_offset = bounds ? round(world.maxy / 2 - bounds[MAP_MAXY] / 2) + 1 : 1 if (!pm.load(x_offset, y_offset, start_z + parsed_maps[P], no_changeturf = TRUE, new_z = TRUE)) errorList |= pm.original_path - // DOPPLER EDIT ADDITION BEGIN - We need to load our templates from cache after our space has been carved out. - if(!LAZYLEN(errorList)) - SSautomapper.load_templates_from_cache(files) - // DOPPLER EDIT ADDITION END if(!silent) INIT_ANNOUNCE("Loaded [name] in [(REALTIMEOFDAY - start_time)/10]s!") return parsed_maps diff --git a/code/controllers/subsystem/processing/ai_idle_behaviors.dm b/code/controllers/subsystem/processing/ai_idle_behaviors.dm index 8875d971ad87c..cda3d354882f4 100644 --- a/code/controllers/subsystem/processing/ai_idle_behaviors.dm +++ b/code/controllers/subsystem/processing/ai_idle_behaviors.dm @@ -1,17 +1,6 @@ PROCESSING_SUBSYSTEM_DEF(idle_ai_behaviors) - name = "AI Idle Behaviors" - flags = SS_BACKGROUND + name = "idle_ai_behaviors" + flags = SS_NO_INIT | 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/processing/fishing.dm b/code/controllers/subsystem/processing/fishing.dm index 0e8c126fe9330..a81ff0dec6783 100644 --- a/code/controllers/subsystem/processing/fishing.dm +++ b/code/controllers/subsystem/processing/fishing.dm @@ -13,38 +13,10 @@ PROCESSING_SUBSYSTEM_DEF(fishing) fish_properties = list() for(var/fish_type in subtypesof(/obj/item/fish)) var/obj/item/fish/fish = new fish_type(null, FALSE) - var/list/properties = list() - fish_properties[fish_type] = properties - properties[FISH_PROPERTIES_FAV_BAIT] = fish.favorite_bait.Copy() - properties[FISH_PROPERTIES_BAD_BAIT] = fish.disliked_bait.Copy() - properties[FISH_PROPERTIES_TRAITS] = fish.fish_traits.Copy() - - var/list/evo_types = fish.evolution_types?.Copy() - properties[FISH_PROPERTIES_EVOLUTIONS] = evo_types - for(var/type in evo_types) - LAZYADD(GLOB.fishes_by_fish_evolution[type], fish_type) - - var/beauty_score = "???" - switch(fish.beauty) - if(-INFINITY to FISH_BEAUTY_DISGUSTING) - beauty_score = "OH HELL NAW!" - if(FISH_BEAUTY_DISGUSTING to FISH_BEAUTY_UGLY) - beauty_score = "☆☆☆☆☆" - if(FISH_BEAUTY_UGLY to FISH_BEAUTY_BAD) - beauty_score = "★☆☆☆☆" - if(FISH_BEAUTY_BAD to FISH_BEAUTY_NULL) - beauty_score = "★★☆☆☆" - if(FISH_BEAUTY_NULL to FISH_BEAUTY_GENERIC) - beauty_score = "★★★☆☆" - if(FISH_BEAUTY_GENERIC to FISH_BEAUTY_GOOD) - beauty_score = "★★★★☆" - if(FISH_BEAUTY_GOOD to FISH_BEAUTY_GREAT) - beauty_score = "★★★★★" - if(FISH_BEAUTY_GREAT to INFINITY) - beauty_score = "★★★★★★" - - properties[FISH_PROPERTIES_BEAUTY_SCORE] = beauty_score - + fish_properties[fish_type] = list() + fish_properties[fish_type][FISH_PROPERTIES_FAV_BAIT] = fish.favorite_bait.Copy() + fish_properties[fish_type][FISH_PROPERTIES_BAD_BAIT] = fish.disliked_bait.Copy() + fish_properties[fish_type][FISH_PROPERTIES_TRAITS] = fish.fish_traits.Copy() qdel(fish) ///init the list of things lures can catch diff --git a/code/controllers/subsystem/processing/station.dm b/code/controllers/subsystem/processing/station.dm index c58840cfa7ad1..883ab37456d2c 100644 --- a/code/controllers/subsystem/processing/station.dm +++ b/code/controllers/subsystem/processing/station.dm @@ -164,8 +164,6 @@ PROCESSING_SUBSYSTEM_DEF(station) ///Creates a given trait of a specific type, while also removing any blacklisted ones from the future pool. /datum/controller/subsystem/processing/station/proc/setup_trait(datum/station_trait/trait_type) - if(locate(trait_type) in station_traits) - return var/datum/station_trait/trait_instance = new trait_type() station_traits += trait_instance log_game("Station Trait: [trait_instance.name] chosen for this round.") @@ -181,4 +179,5 @@ PROCESSING_SUBSYSTEM_DEF(station) var/datum/hud/new_player/observer_hud = player.hud_used if (!istype(observer_hud)) continue - observer_hud.show_station_trait_buttons() + observer_hud.add_station_trait_buttons() + observer_hud.show_hud(observer_hud.hud_version) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index f5a9309457246..baca9a1235486 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -236,14 +236,14 @@ SUBSYSTEM_DEF(ticker) can_continue = SSdynamic.pre_setup() //Choose antagonists CHECK_TICK SEND_GLOBAL_SIGNAL(COMSIG_GLOB_PRE_JOBS_ASSIGNED, src) - can_continue = can_continue && SSjob.divide_occupations() //Distribute jobs + can_continue = can_continue && SSjob.DivideOccupations() //Distribute jobs CHECK_TICK if(!GLOB.Debug2) if(!can_continue) log_game("Game failed pre_setup") to_chat(world, "Error setting up game. Reverting to pre-game lobby.") - SSjob.reset_occupations() + SSjob.ResetOccupations() return FALSE else message_admins(span_notice("DEBUG: Bypassing prestart checks...")) @@ -416,7 +416,7 @@ SUBSYSTEM_DEF(ticker) continue var/datum/job/player_assigned_role = new_player_living.mind.assigned_role if(player_assigned_role.job_flags & JOB_EQUIP_RANK) - SSjob.equip_rank(new_player_living, player_assigned_role, new_player_mob.client) + SSjob.EquipRank(new_player_living, player_assigned_role, new_player_mob.client) player_assigned_role.after_roundstart_spawn(new_player_living, new_player_mob.client) if(picked_spare_id_candidate == new_player_mob) captainless = FALSE diff --git a/code/datums/actions/action.dm b/code/datums/actions/action.dm index d8247d3e92a5e..39e69ba9fa8fd 100644 --- a/code/datums/actions/action.dm +++ b/code/datums/actions/action.dm @@ -52,8 +52,6 @@ /// Toggles whether this action is usable or not var/action_disabled = FALSE - /// Can this action be shared with our rider? - var/can_be_shared = TRUE /datum/action/New(Target) link_to(Target) diff --git a/code/datums/actions/mobs/lava_swoop.dm b/code/datums/actions/mobs/lava_swoop.dm index 2b07734b4a852..aa512b2d28e8d 100644 --- a/code/datums/actions/mobs/lava_swoop.dm +++ b/code/datums/actions/mobs/lava_swoop.dm @@ -39,7 +39,7 @@ return // stop swooped target movement swooping = TRUE - owner.add_traits(list(TRAIT_GODMODE, TRAIT_UNDENSE), SWOOPING_TRAIT) + ADD_TRAIT(owner, TRAIT_UNDENSE, SWOOPING_TRAIT) owner.visible_message(span_boldwarning("[owner] swoops up high!")) var/negative @@ -66,6 +66,7 @@ animate(owner, alpha = 255, transform = oldtransform, time = 0, flags = ANIMATION_END_NOW) //reset immediately return animate(owner, alpha = 100, transform = matrix()*0.7, time = 7) + owner.status_flags |= GODMODE SEND_SIGNAL(owner, COMSIG_SWOOP_INVULNERABILITY_STARTED) owner.mouse_opacity = MOUSE_OPACITY_TRANSPARENT @@ -111,11 +112,12 @@ for(var/mob/observer in range(7, owner)) shake_camera(observer, 15, 1) - owner.remove_traits(list(TRAIT_GODMODE, TRAIT_UNDENSE), SWOOPING_TRAIT) + REMOVE_TRAIT(owner, TRAIT_UNDENSE, SWOOPING_TRAIT) SLEEP_CHECK_DEATH(1, owner) swooping = FALSE if(!lava_success) SEND_SIGNAL(owner, COMSIG_LAVA_ARENA_FAILED) + owner.status_flags &= ~GODMODE /datum/action/cooldown/mob_cooldown/lava_swoop/proc/lava_pools(atom/target, amount = 30, delay = 0.8) if(!target) diff --git a/code/datums/actions/mobs/personality_commune.dm b/code/datums/actions/mobs/personality_commune.dm index 8481d451fb1dd..26cf483449204 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", max_length = MAX_MESSAGE_LEN) + var/to_send = tgui_input_text(non_controller, "What would you like to tell your other self?", "Commune") 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 4d5b660044322..499da54b1b1eb 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -39,6 +39,8 @@ 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 @@ -67,15 +69,14 @@ 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 = SSidle_ai_behaviors.idle_behaviors[idle_behavior] + idle_behavior = new 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) @@ -239,7 +240,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]) || on_failed_planning_timeout || !able_to_run) + if(!length(SSmobs.clients_by_zlevel[pawn_turf.z])) return AI_STATUS_OFF if(should_idle()) return AI_STATUS_IDLE @@ -299,9 +300,6 @@ 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() @@ -314,6 +312,10 @@ 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 @@ -489,7 +491,6 @@ 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 @@ -530,15 +531,6 @@ 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/basic_mobs/base_basic_controller.dm b/code/datums/ai/basic_mobs/base_basic_controller.dm index f21d31b05000c..a14630fa0e83a 100644 --- a/code/datums/ai/basic_mobs/base_basic_controller.dm +++ b/code/datums/ai/basic_mobs/base_basic_controller.dm @@ -19,12 +19,9 @@ /datum/ai_controller/basic_controller/setup_able_to_run() . = ..() RegisterSignal(pawn, COMSIG_MOB_INCAPACITATE_CHANGED, PROC_REF(update_able_to_run)) - if(ai_traits & PAUSE_DURING_DO_AFTER) - RegisterSignals(pawn, list(COMSIG_DO_AFTER_BEGAN, COMSIG_DO_AFTER_ENDED), PROC_REF(update_able_to_run)) - /datum/ai_controller/basic_controller/clear_able_to_run() - UnregisterSignal(pawn, list(COMSIG_MOB_INCAPACITATE_CHANGED, COMSIG_MOB_STATCHANGE, COMSIG_DO_AFTER_BEGAN, COMSIG_DO_AFTER_ENDED)) + UnregisterSignal(pawn, list(COMSIG_MOB_INCAPACITATE_CHANGED, COMSIG_MOB_STATCHANGE)) return ..() /datum/ai_controller/basic_controller/get_able_to_run() diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/emote_with_target.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/emote_with_target.dm index 7960301d70440..8f4483d4dafdd 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/emote_with_target.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/emote_with_target.dm @@ -14,7 +14,7 @@ var/atom/target = controller.blackboard[target_key] if(!length(emote_list) || isnull(target)) return AI_BEHAVIOR_FAILED | AI_BEHAVIOR_DELAY - run_emote(controller.pawn, target, emote_list) + run_emote(controller.pawn, target_key, emote_list) return AI_BEHAVIOR_SUCCEEDED | AI_BEHAVIOR_DELAY diff --git a/code/datums/ai/basic_mobs/targeting_strategies/basic_targeting_strategy.dm b/code/datums/ai/basic_mobs/targeting_strategies/basic_targeting_strategy.dm index d552b69c142dc..709acb8d5e892 100644 --- a/code/datums/ai/basic_mobs/targeting_strategies/basic_targeting_strategy.dm +++ b/code/datums/ai/basic_mobs/targeting_strategies/basic_targeting_strategy.dm @@ -25,7 +25,8 @@ if(ismob(the_target)) //Target is in godmode, ignore it. if(living_mob.loc == the_target) return FALSE // We've either been eaten or are shapeshifted, let's assume the latter because we're still alive - if(HAS_TRAIT(the_target, TRAIT_GODMODE)) + var/mob/M = the_target + if(M.status_flags & GODMODE) return FALSE if (vision_range && get_dist(living_mob, the_target) > vision_range) diff --git a/code/datums/ai/movement/_ai_movement.dm b/code/datums/ai/movement/_ai_movement.dm index 33b7e4e214f6b..c1b3aae5bd60f 100644 --- a/code/datums/ai/movement/_ai_movement.dm +++ b/code/datums/ai/movement/_ai_movement.dm @@ -11,7 +11,6 @@ controller.consecutive_pathing_attempts = 0 controller.set_blackboard_key(BB_CURRENT_MIN_MOVE_DISTANCE, min_distance) moving_controllers[controller] = current_movement_target - SEND_SIGNAL(controller.pawn, COMSIG_MOB_AI_MOVEMENT_STARTED, current_movement_target) /datum/ai_movement/proc/stop_moving_towards(datum/ai_controller/controller) controller.consecutive_pathing_attempts = 0 diff --git a/code/datums/ai_laws/ai_laws.dm b/code/datums/ai_laws/ai_laws.dm index a0d1d629fc8d3..0dbc6839430ba 100644 --- a/code/datums/ai_laws/ai_laws.dm +++ b/code/datums/ai_laws/ai_laws.dm @@ -192,7 +192,7 @@ GLOBAL_VAR(round_default_lawset) var/datum/ai_laws/default_laws = get_round_default_lawset() default_laws = new default_laws() inherent = default_laws.inherent - var/datum/job/human_ai_job = SSjob.get_job(JOB_HUMAN_AI) + var/datum/job/human_ai_job = SSjob.GetJob(JOB_HUMAN_AI) if(human_ai_job && human_ai_job.current_positions && !zeroth) //there is a human AI so we "slave" to that. zeroth = "Follow the orders of Big Brother." protected_zeroth = TRUE diff --git a/code/datums/brain_damage/creepy_trauma.dm b/code/datums/brain_damage/creepy_trauma.dm index d908dfc0e613c..742f1fe57e9db 100644 --- a/code/datums/brain_damage/creepy_trauma.dm +++ b/code/datums/brain_damage/creepy_trauma.dm @@ -66,8 +66,7 @@ /datum/brain_trauma/special/obsessed/on_lose() ..() - if (owner.mind.remove_antag_datum(/datum/antagonist/obsessed)) - owner.mind.add_antag_datum(/datum/antagonist/former_obsessed) + owner.mind.remove_antag_datum(/datum/antagonist/obsessed) owner.clear_mood_event("creeping") if(obsession) log_game("[key_name(owner)] is no longer obsessed with [key_name(obsession)].") diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index 99467c570990f..f4c78bc9007e6 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -156,11 +156,11 @@ for(var/job in appearance_from_prefs.job_preferences) var/this_pref = appearance_from_prefs.job_preferences[job] if(this_pref > highest_pref) - appearance_job = SSjob.get_job(job) + appearance_job = SSjob.GetJob(job) highest_pref = this_pref if(!appearance_job) - appearance_job = SSjob.get_job(JOB_ASSISTANT) + appearance_job = SSjob.GetJob(JOB_ASSISTANT) if(istype(appearance_job, /datum/job/ai)) human_image = icon('icons/mob/silicon/ai.dmi', icon_state = resolve_ai_icon(appearance_from_prefs.read_preference(/datum/preference/choiced/ai_core_display)), dir = SOUTH) diff --git a/code/datums/components/aquarium_content.dm b/code/datums/components/aquarium_content.dm index d956b39928a47..57d62cdb0ee26 100644 --- a/code/datums/components/aquarium_content.dm +++ b/code/datums/components/aquarium_content.dm @@ -15,7 +15,14 @@ var/obj/structure/aquarium/current_aquarium //This is visual effect holder that will end up in aquarium's vis_contents - var/obj/effect/aquarium/vc_obj + var/obj/effect/vc_obj + + /// Base px offset of the visual object in current aquarium aka current base position + var/base_px = 0 + /// Base px offset of the visual object in current aquarium aka current base position + var/base_py = 0 + //Current layer for the visual object + var/base_layer /** * Fish sprite how to: @@ -26,12 +33,37 @@ * cover the extra pixels anyway. */ + /// Icon used for in aquarium sprite + var/icon = 'icons/obj/aquarium/fish.dmi' + /// If this is set this icon state will be used for the holder while icon_state will only be used for item/catalog. Transformation from source_width/height WON'T be applied. + var/icon_state + /// Applied to vc object only for use with greyscaled icons. + var/aquarium_vc_color + /// Transformation applied to the visual holder - used when scaled down sprites are used as in aquarium visual + var/matrix/base_transform + + /// How the thing will be layered + var/layer_mode = AQUARIUM_LAYER_MODE_AUTO + + /// If the starting position is randomised within bounds when inserted into aquarium. + var/randomize_position = FALSE + + //Target sprite size for path/position calculations. + var/sprite_height = 3 + var/sprite_width = 3 + /// Currently playing animation var/current_animation /// Does this behviour need additional processing in aquarium, will be added to SSobj processing on insertion var/processing = FALSE + /// TODO: Change this into trait checked on aquarium insertion + var/unique = FALSE + + /// Proc used to retrieve current animation state from the parent, optional + var/animation_getter + /// Signals of the parent that will trigger animation update var/animation_update_signals @@ -41,27 +73,50 @@ /// The original value of the beauty this component had when initialized var/original_beauty -/datum/component/aquarium_content/Initialize(animation_update_signals, beauty) +/datum/component/aquarium_content/Initialize(icon, animation_getter, animation_update_signals, beauty) if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE + src.animation_getter = animation_getter src.animation_update_signals = animation_update_signals src.beauty = original_beauty = beauty if(animation_update_signals) RegisterSignals(parent, animation_update_signals, PROC_REF(generate_animation)) + if(istype(parent,/obj/item/fish)) + InitializeFromFish() + else if(istype(parent,/obj/item/aquarium_prop)) + InitializeFromProp() + else + InitializeOther() + ADD_TRAIT(parent, TRAIT_FISH_CASE_COMPATIBILE, REF(src)) RegisterSignal(parent, COMSIG_TRY_INSERTING_IN_AQUARIUM, PROC_REF(is_ready_to_insert)) RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(enter_aquarium)) - - if(isfish(parent)) - RegisterSignal(parent, COMSIG_FISH_STATUS_CHANGED, PROC_REF(on_fish_status_changed)) + RegisterSignal(parent, COMSIG_FISH_PETTED, PROC_REF(on_fish_petted)) //If component is added to something already in aquarium at the time initialize it properly. var/atom/movable/movable_parent = parent if(istype(movable_parent.loc, /obj/structure/aquarium)) on_inserted(movable_parent.loc) +/// Sets visuals properties for fish +/datum/component/aquarium_content/proc/InitializeFromFish() + var/obj/item/fish/fish = parent + + icon = fish.icon + sprite_height = fish.sprite_height + sprite_width = fish.sprite_width + aquarium_vc_color = fish.aquarium_vc_color + + icon = fish.dedicated_in_aquarium_icon + icon_state = fish.dedicated_in_aquarium_icon_state + base_transform = matrix() + + randomize_position = TRUE + + RegisterSignal(fish, COMSIG_FISH_STATUS_CHANGED, PROC_REF(on_fish_status_changed)) + /datum/component/aquarium_content/proc/on_fish_status_changed(obj/item/fish/source) SIGNAL_HANDLER var/old_beauty = beauty @@ -72,6 +127,31 @@ change_aquarium_beauty(beauty - old_beauty) generate_animation() +/// Sets visuals properties for fish +/datum/component/aquarium_content/proc/InitializeFromProp() + var/obj/item/aquarium_prop/prop = parent + + icon = prop.icon + icon_state = prop.icon_state + layer_mode = prop.layer_mode + sprite_height = 32 + sprite_width = 32 + base_transform = matrix() + + unique = TRUE + +/// Mostly for admin abuse +/datum/component/aquarium_content/proc/InitializeOther() + sprite_width = 8 + sprite_height = 8 + + var/matrix/matrix = matrix() + var/x_scale = sprite_width / 32 + var/y_scale = sprite_height / 32 + matrix.Scale(x_scale, y_scale) + base_transform = matrix + + /datum/component/aquarium_content/PreTransfer() . = ..() REMOVE_TRAIT(parent, TRAIT_FISH_CASE_COMPATIBILE, REF(src)) @@ -90,11 +170,12 @@ /datum/component/aquarium_content/proc/is_ready_to_insert(datum/source, obj/structure/aquarium/aquarium) SIGNAL_HANDLER - if(HAS_TRAIT(parent, TRAIT_UNIQUE_AQUARIUM_CONTENT)) - for(var/atom/movable/content as anything in aquarium) - if(content == parent) + //This is kinda awful but we're unaware of other fish + if(unique) + for(var/atom/movable/fish_or_prop in aquarium) + if(fish_or_prop == parent) continue - if(content.type == parent.type) + if(fish_or_prop.type == parent.type) return COMSIG_CANNOT_INSERT_IN_AQUARIUM return COMSIG_CAN_INSERT_IN_AQUARIUM @@ -109,7 +190,7 @@ //If we don't have vc object yet build it if(!vc_obj) - generate_base_vc() + vc_obj = generate_base_vc() //Set default position and layer set_vc_base_position() @@ -144,28 +225,112 @@ SIGNAL_HANDLER generate_animation() -///Sends a signal to the parent to get them to update the aquarium animation of the visual object -/datum/component/aquarium_content/proc/generate_animation(reset=FALSE) - if(!current_aquarium) - return - SEND_SIGNAL(parent, COMSIG_AQUARIUM_CONTENT_DO_ANIMATION, reset ? null : current_animation, current_aquarium, vc_obj) - /datum/component/aquarium_content/proc/remove_visual_from_aquarium() current_aquarium.vis_contents -= vc_obj - if(vc_obj.layer) - current_aquarium.free_layer(vc_obj.layer) + if(base_layer) + current_aquarium.free_layer(base_layer) /// Generates common visual object, propeties that don't depend on aquarium surface /datum/component/aquarium_content/proc/generate_base_vc() - vc_obj = new - vc_obj.vis_flags |= VIS_INHERIT_ID | VIS_INHERIT_PLANE //plane so it shows properly in containers on inventory ui for handheld cases - SEND_SIGNAL(parent, COMSIG_AQUARIUM_CONTENT_GENERATE_APPEARANCE, vc_obj) + var/obj/effect/visual = new + apply_appearance(visual) + visual.vis_flags |= VIS_INHERIT_ID | VIS_INHERIT_PLANE //plane so it shows properly in containers on inventory ui for handheld cases + return visual + +/// Applies icon,color and base scaling to our visual holder +/datum/component/aquarium_content/proc/apply_appearance(obj/effect/holder) + holder.icon = icon + holder.icon_state = icon_state + holder.transform = matrix(base_transform) + if(aquarium_vc_color) + holder.color = aquarium_vc_color + + +/// Actually animates the vc holder +/datum/component/aquarium_content/proc/generate_animation(reset=FALSE) + if(!current_aquarium) + return + var/next_animation = animation_getter ? call(parent,animation_getter)() : null + if(current_animation == next_animation && !reset) + return + current_animation = next_animation + switch(current_animation) + if(AQUARIUM_ANIMATION_FISH_SWIM) + swim_animation() + return + if(AQUARIUM_ANIMATION_FISH_DEAD) + dead_animation() + return + +/// Create looping random path animation, pixel offsets parameters include offsets already +/datum/component/aquarium_content/proc/swim_animation() + var/avg_width = round(sprite_width / 2) + var/avg_height = round(sprite_height / 2) + + var/list/aq_properties = current_aquarium.get_surface_properties() + var/px_min = aq_properties[AQUARIUM_PROPERTIES_PX_MIN] + avg_width - 16 + var/px_max = aq_properties[AQUARIUM_PROPERTIES_PX_MAX] - avg_width - 16 + var/py_min = aq_properties[AQUARIUM_PROPERTIES_PY_MIN] + avg_height - 16 + var/py_max = aq_properties[AQUARIUM_PROPERTIES_PY_MAX] - avg_width - 16 + + var/origin_x = base_px + var/origin_y = base_py + var/prev_x = origin_x + var/prev_y = origin_y + animate(vc_obj, pixel_x = origin_x, time = 0, loop = -1) //Just to start the animation + var/move_number = rand(3, 5) //maybe unhardcode this + for(var/i in 1 to move_number) + //If it's last movement, move back to start otherwise move to some random point + var/target_x = i == move_number ? origin_x : rand(px_min,px_max) //could do with enforcing minimal delta for prettier zigzags + var/target_y = i == move_number ? origin_y : rand(py_min,py_max) + var/dx = prev_x - target_x + var/dy = prev_y - target_y + prev_x = target_x + prev_y = target_y + var/dist = abs(dx) + abs(dy) + var/eyeballed_time = dist * 2 //2ds per px + //Face the direction we're going + var/matrix/dir_mx = matrix(base_transform) + if(dx <= 0) //assuming default sprite is facing left here + dir_mx.Scale(-1, 1) + animate(transform = dir_mx, time = 0, loop = -1) + animate(pixel_x = target_x, pixel_y = target_y, time = eyeballed_time, loop = -1) + +/datum/component/aquarium_content/proc/dead_animation() + //Set base_py to lowest possible value + var/avg_height = round(sprite_height / 2) + var/list/aq_properties = current_aquarium.get_surface_properties() + var/py_min = aq_properties[AQUARIUM_PROPERTIES_PY_MIN] + avg_height - 16 + base_py = py_min + animate(vc_obj, pixel_y = py_min, time = 1) //flop to bottom and end current animation. /datum/component/aquarium_content/proc/set_vc_base_position() - SEND_SIGNAL(parent, AQUARIUM_CONTENT_RANDOMIZE_POSITION, current_aquarium, vc_obj) - if(vc_obj.layer) - current_aquarium.free_layer(vc_obj.layer) - vc_obj.layer = current_aquarium.request_layer(vc_obj.layer_mode) + if(randomize_position) + randomize_base_position() + if(base_layer) + current_aquarium.free_layer(base_layer) + base_layer = current_aquarium.request_layer(layer_mode) + vc_obj.layer = base_layer + +/datum/component/aquarium_content/proc/on_fish_petted() + SIGNAL_HANDLER + + new /obj/effect/temp_visual/heart(get_turf(parent)) + +/datum/component/aquarium_content/proc/randomize_base_position() + var/list/aq_properties = current_aquarium.get_surface_properties() + var/avg_width = round(sprite_width / 2) + var/avg_height = round(sprite_height / 2) + var/px_min = aq_properties[AQUARIUM_PROPERTIES_PX_MIN] + avg_width - 16 + var/px_max = aq_properties[AQUARIUM_PROPERTIES_PX_MAX] - avg_width - 16 + var/py_min = aq_properties[AQUARIUM_PROPERTIES_PY_MIN] + avg_height - 16 + var/py_max = aq_properties[AQUARIUM_PROPERTIES_PY_MAX] - avg_width - 16 + + base_px = rand(px_min,px_max) + base_py = rand(py_min,py_max) + + vc_obj.pixel_x = base_px + vc_obj.pixel_y = base_py /datum/component/aquarium_content/proc/on_removed(obj/structure/aquarium/source, atom/movable/gone, direction) SIGNAL_HANDLER @@ -179,16 +344,6 @@ remove_visual_from_aquarium() current_aquarium = null -///The visual overlay of the aquarium content. It holds a few vars that we can modity them during signals. -/obj/effect/aquarium - layer = 0 //set on set_vc_base_position - /// Base px offset of the visual object in current aquarium aka current base position - var/base_px = 0 - /// Base px offset of the visual object in current aquarium aka current base position - var/base_py = 0 - /// How the visual will be layered - var/layer_mode = AQUARIUM_LAYER_MODE_AUTO - #undef DEAD_FISH_BEAUTY #undef MIN_DEAD_FISH_BEAUTY #undef MAX_DEAD_FISH_BEAUTY diff --git a/code/datums/components/area_based_godmode.dm b/code/datums/components/area_based_godmode.dm index b9447efbafbf8..4f03ae57794c8 100644 --- a/code/datums/components/area_based_godmode.dm +++ b/code/datums/components/area_based_godmode.dm @@ -34,6 +34,8 @@ var/mob/mob_target = parent if(!istype(mob_target)) return COMPONENT_INCOMPATIBLE + if(initial(mob_target.status_flags) & GODMODE) + return COMPONENT_INCOMPATIBLE sources_to_area_type = list() src.gain_message = gain_message @@ -100,11 +102,11 @@ /datum/component/area_based_godmode/proc/check_area(mob/source) SIGNAL_HANDLER - var/has_godmode = HAS_TRAIT(source, TRAIT_GODMODE) + var/has_godmode = source.status_flags & GODMODE if(!check_in_valid_area(source)) if(has_godmode) to_chat(source, lose_message) - REMOVE_TRAIT(source, TRAIT_GODMODE, REF(src)) + source.status_flags ^= GODMODE check_area_cached_state = FALSE return @@ -113,7 +115,7 @@ return to_chat(source, gain_message) - ADD_TRAIT(source, TRAIT_GODMODE, REF(src)) + source.status_flags ^= GODMODE #undef MAP_AREA_TYPE #undef MAP_ALLOW_AREA_SUBTYPES diff --git a/code/datums/components/chuunibyou.dm b/code/datums/components/chuunibyou.dm index 5724b93488f49..4e06f0fd47486 100644 --- a/code/datums/components/chuunibyou.dm +++ b/code/datums/components/chuunibyou.dm @@ -64,7 +64,7 @@ /datum/component/chuunibyou/proc/on_try_speech(datum/source, message, ignore_spam, forced) SIGNAL_HANDLER - if(casting_spell && !HAS_TRAIT(src, TRAIT_MUTE)) + if(casting_spell) return COMPONENT_IGNORE_CAN_SPEAK ///signal sent when the parent casts a spell that has a projectile diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index 54f77d4579e23..ec6df83b8042f 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -268,11 +268,9 @@ qdel(thing) var/datum/reagents/holder = locate() in parts if(holder) //transfer reagents from ingredients to result - if(!ispath(recipe.result, /obj/item/reagent_containers) && result.reagents) - if(recipe.crafting_flags & CRAFT_CLEARS_REAGENTS) - result.reagents.clear_reagents() - if(recipe.crafting_flags & CRAFT_TRANSFERS_REAGENTS) - holder.trans_to(result.reagents, holder.total_volume, no_react = TRUE) + if(!ispath(recipe.result, /obj/item/reagent_containers) && result.reagents) + result.reagents.clear_reagents() + holder.trans_to(result.reagents, holder.total_volume, no_react = TRUE) parts -= holder qdel(holder) result.CheckParts(parts, recipe) diff --git a/code/datums/components/crafting/ranged_weapon.dm b/code/datums/components/crafting/ranged_weapon.dm index bfd2385f89e01..174c0226a423e 100644 --- a/code/datums/components/crafting/ranged_weapon.dm +++ b/code/datums/components/crafting/ranged_weapon.dm @@ -300,22 +300,6 @@ 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/echolocation.dm b/code/datums/components/echolocation.dm index 4fda54ac0f50e..51ab89a2be564 100644 --- a/code/datums/components/echolocation.dm +++ b/code/datums/components/echolocation.dm @@ -156,7 +156,7 @@ copied_appearance.pixel_x = 0 copied_appearance.pixel_y = 0 copied_appearance.transform = matrix() - if(input.icon && input.icon_state) + if(!iscarbon(input)) //wacky overlay people get generated everytime saved_appearances["[input.icon]-[input.icon_state]"] = copied_appearance return copied_appearance diff --git a/code/datums/components/engraved.dm b/code/datums/components/engraved.dm index 5db43b8076cd2..60bfa5f617729 100644 --- a/code/datums/components/engraved.dm +++ b/code/datums/components/engraved.dm @@ -67,13 +67,13 @@ RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) //supporting component transfer means putting these here instead of initialize SSpersistence.wall_engravings += src - ADD_TRAIT(parent, TRAIT_NOT_ENGRAVABLE, ENGRAVED_TRAIT) + ADD_TRAIT(parent, TRAIT_NOT_ENGRAVABLE, TRAIT_GENERIC) /datum/component/engraved/UnregisterFromParent() UnregisterSignal(parent, COMSIG_ATOM_EXAMINE) //supporting component transfer means putting these here instead of destroy SSpersistence.wall_engravings -= src - REMOVE_TRAIT(parent, TRAIT_NOT_ENGRAVABLE, ENGRAVED_TRAIT) + REMOVE_TRAIT(parent, TRAIT_NOT_ENGRAVABLE, TRAIT_GENERIC) /// Used to maintain the acid overlay on the parent [/atom]. /datum/component/engraved/proc/on_update_overlays(atom/parent_atom, list/overlays) diff --git a/code/datums/components/fishing_spot.dm b/code/datums/components/fishing_spot.dm index 982b0da2df71a..b825354d7bebc 100644 --- a/code/datums/components/fishing_spot.dm +++ b/code/datums/components/fishing_spot.dm @@ -19,15 +19,11 @@ RegisterSignal(parent, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_examined_more)) RegisterSignal(parent, COMSIG_NPC_FISHING, PROC_REF(return_fishing_spot)) RegisterSignal(parent, COMSIG_ATOM_EX_ACT, PROC_REF(explosive_fishing)) - RegisterSignal(parent, COMSIG_FISH_RELEASED_INTO, PROC_REF(fish_released)) - RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(link_to_fish_porter)) ADD_TRAIT(parent, TRAIT_FISHING_SPOT, REF(src)) /datum/component/fishing_spot/Destroy() - REMOVE_TRAIT(parent, TRAIT_FISHING_SPOT, REF(src)) fish_source.on_fishing_spot_del(src) fish_source = null - REMOVE_TRAIT(parent, TRAIT_FISHING_SPOT, REF(src)) return ..() /datum/component/fishing_spot/proc/handle_cast(datum/source, obj/item/fishing_rod/rod, mob/user) @@ -65,7 +61,7 @@ var/obj/item/fishing_rod/rod = possibly_rod if(!istype(rod)) return - if(GLOB.fishing_challenges_by_user[user] || rod.fishing_line) + if(HAS_TRAIT(user,TRAIT_GONE_FISHING) || rod.fishing_line) user.balloon_alert(user, "already fishing") return COMPONENT_NO_AFTERATTACK var/denial_reason = fish_source.reason_we_cant_fish(rod, user, parent) @@ -74,10 +70,15 @@ return COMPONENT_NO_AFTERATTACK // In case the fishing source has anything else to do before beginning to fish. fish_source.on_start_fishing(rod, user, parent) - var/datum/fishing_challenge/challenge = new(src, rod, user) + start_fishing_challenge(rod, user) + return COMPONENT_NO_AFTERATTACK + +/datum/component/fishing_spot/proc/start_fishing_challenge(obj/item/fishing_rod/rod, mob/user) + /// Roll what we caught based on modified table + var/result = fish_source.roll_reward(rod, user, parent) + var/datum/fishing_challenge/challenge = new(src, result, rod, user) fish_source.pre_challenge_started(rod, user, challenge) challenge.start(user) - return COMPONENT_NO_AFTERATTACK /datum/component/fishing_spot/proc/return_fishing_spot(datum/source, list/fish_spot_container) fish_spot_container[NPC_FISHING_SPOT] = fish_source @@ -85,13 +86,3 @@ /datum/component/fishing_spot/proc/explosive_fishing(atom/location, severity) SIGNAL_HANDLER fish_source.spawn_reward_from_explosion(location, severity) - -/datum/component/fishing_spot/proc/link_to_fish_porter(atom/source, mob/user, obj/item/multitool/tool) - SIGNAL_HANDLER - if(istype(tool.buffer, /obj/machinery/fishing_portal_generator)) - var/obj/machinery/fishing_portal_generator/portal = tool.buffer - return portal.link_fishing_spot(fish_source, source, user) - -/datum/component/fishing_spot/proc/fish_released(datum/source, obj/item/fish/fish, mob/living/releaser) - SIGNAL_HANDLER - fish_source.readd_fish(fish, releaser) diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm index 9e2964273fd48..c034300f982fe 100644 --- a/code/datums/components/food/edible.dm +++ b/code/datums/components/food/edible.dm @@ -40,6 +40,8 @@ Behavior that's still missing from this component that original food items had t var/volume = 50 ///The flavortext for taste (haha get it flavor text) var/list/tastes + ///Whether to tell the examiner that this is edible or not. + var/show_examine = TRUE /datum/component/edible/Initialize( list/initial_reagents, @@ -55,6 +57,7 @@ Behavior that's still missing from this component that original food items had t datum/callback/on_consume, datum/callback/check_liked, reagent_purity = 0.5, + show_examine = TRUE, ) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE @@ -70,6 +73,7 @@ Behavior that's still missing from this component that original food items had t src.on_consume = on_consume src.tastes = string_assoc_list(tastes) src.check_liked = check_liked + src.show_examine = show_examine setup_initial_reagents(initial_reagents, reagent_purity) @@ -77,9 +81,9 @@ Behavior that's still missing from this component that original food items had t RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) RegisterSignal(parent, COMSIG_ATOM_ATTACK_ANIMAL, PROC_REF(UseByAnimal)) RegisterSignal(parent, COMSIG_ATOM_CHECKPARTS, PROC_REF(OnCraft)) - RegisterSignal(parent, COMSIG_OOZE_EAT_ATOM, PROC_REF(on_ooze_eat)) - RegisterSignal(parent, COMSIG_FOOD_INGREDIENT_ADDED, PROC_REF(edible_ingredient_added)) RegisterSignal(parent, COMSIG_ATOM_CREATEDBY_PROCESSING, PROC_REF(OnProcessed)) + RegisterSignal(parent, COMSIG_FOOD_INGREDIENT_ADDED, PROC_REF(edible_ingredient_added)) + RegisterSignal(parent, COMSIG_OOZE_EAT_ATOM, PROC_REF(on_ooze_eat)) if(isturf(parent)) RegisterSignal(parent, COMSIG_ATOM_ENTERED, PROC_REF(on_entered)) @@ -212,7 +216,7 @@ Behavior that's still missing from this component that original food items had t SIGNAL_HANDLER var/atom/owner = parent - if(food_flags & FOOD_NO_EXAMINE) + if(!show_examine) return if(foodtypes) var/list/types = bitfield_to_list(foodtypes, FOOD_FLAGS) @@ -312,6 +316,7 @@ Behavior that's still missing from this component that original food items had t SIGNAL_HANDLER var/atom/this_food = parent + for(var/obj/item/food/crafted_part in parts_list) if(!crafted_part.reagents) continue @@ -320,7 +325,7 @@ Behavior that's still missing from this component that original food items had t this_food.reagents.maximum_volume = ROUND_UP(this_food.reagents.maximum_volume) // Just because I like whole numbers for this. - BLACKBOX_LOG_FOOD_MADE(parent.type) + BLACKBOX_LOG_FOOD_MADE(this_food.type) ///Makes sure the thing hasn't been destroyed or fully eaten to prevent eating phantom edibles /datum/component/edible/proc/IsFoodGone(atom/owner, mob/living/feeder) @@ -457,7 +462,7 @@ Behavior that's still missing from this component that original food items had t var/atom/owner = parent - if(!owner.reagents) + if(!owner?.reagents) stack_trace("[eater] failed to bite [owner], because [owner] had no reagents.") return FALSE if(eater.satiety > -200) @@ -474,8 +479,7 @@ Behavior that's still missing from this component that original food items had t if(bitecount == 0) apply_buff(eater) - var/fraction = 0.3 - fraction = min(bite_consumption / owner.reagents.total_volume, 1) + var/fraction = min(bite_consumption / owner.reagents.total_volume, 1) owner.reagents.trans_to(eater, bite_consumption, transferred_by = feeder, methods = INGEST) bitecount++ @@ -485,7 +489,8 @@ Behavior that's still missing from this component that original food items had t On_Consume(eater, feeder) //Invoke our after eat callback if it is valid - after_eat?.Invoke(eater, feeder, bitecount) + if(after_eat) + after_eat.Invoke(eater, feeder, bitecount) //Invoke the eater's stomach's after_eat callback if valid if(iscarbon(eater)) @@ -526,7 +531,7 @@ Behavior that's still missing from this component that original food items had t if(recipe_complexity <= 0) return var/obj/item/food/food = parent - if(istype(food) && !isnull(food.crafted_food_buff)) + if(!isnull(food.crafted_food_buff)) buff = food.crafted_food_buff else buff = pick_weight(GLOB.food_buffs[min(recipe_complexity, FOOD_COMPLEXITY_5)]) @@ -661,7 +666,7 @@ Behavior that's still missing from this component that original food items had t /datum/component/edible/proc/UseByAnimal(datum/source, mob/living/basic/pet/dog/doggy) SIGNAL_HANDLER - if(!isdog(doggy) || (food_flags & FOOD_NO_BITECOUNT)) //this entirely relies on bitecounts alas + if(!isdog(doggy)) return var/atom/food = parent diff --git a/code/datums/components/gps.dm b/code/datums/components/gps.dm index 0b3751856b8a2..7e52f00def752 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, max_length = 20) + var/a = tgui_input_text(usr, "Enter the desired tag", "GPS Tag", gpstag, 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 5163ca69dacd9..bc7cc2e6af3c4 100644 --- a/code/datums/components/infective.dm +++ b/code/datums/components/infective.dm @@ -8,78 +8,43 @@ var/weak_infection_chance = 10 -/datum/component/infective/Initialize(list/datum/disease/diseases, expire_in, weak = FALSE, weak_infection_chance = 10) - if(!ismovable(parent)) - return COMPONENT_INCOMPATIBLE - - if(!islist(diseases)) - diseases = islist(diseases) - - ///Make sure the diseases list is populated with instances of diseases so that it doesn't have to be for each AddComponent call. - for(var/datum/disease/disease as anything in diseases) - if(!disease) //empty entry, remove. - diseases -= disease - if(ispath(disease, /datum/disease)) - var/datum/disease/instance = new disease - diseases -= disease - diseases += instance - else if(!istype(disease)) - stack_trace("found [isdatum(disease) ? "an instance of [disease.type]" : disease] inside the diseases list argument for [type]") - diseases -= disease - - src.diseases = diseases - +/datum/component/infective/Initialize(list/datum/disease/_diseases, expire_in, weak = FALSE) + if(islist(_diseases)) + diseases = _diseases + else + diseases = list(_diseases) if(expire_in) expire_time = world.time + expire_in QDEL_IN(src, expire_in) - is_weak = weak - src.weak_infection_chance = weak_infection_chance + if(!ismovable(parent)) + return COMPONENT_INCOMPATIBLE -/datum/component/infective/Destroy() - QDEL_NULL(diseases) - return ..() + is_weak = weak -/datum/component/infective/RegisterWithParent() if(is_weak && isitem(parent)) RegisterSignal(parent, COMSIG_FOOD_EATEN, PROC_REF(try_infect_eat)) RegisterSignal(parent, COMSIG_PILL_CONSUMED, PROC_REF(try_infect_eat)) - return - var/static/list/disease_connections = list( - COMSIG_ATOM_ENTERED = PROC_REF(try_infect_crossed), - ) - AddComponent(/datum/component/connect_loc_behalf, parent, disease_connections) - - RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(clean)) - RegisterSignal(parent, COMSIG_MOVABLE_BUCKLE, PROC_REF(try_infect_buckle)) - RegisterSignal(parent, COMSIG_MOVABLE_BUMP, PROC_REF(try_infect_collide)) - RegisterSignal(parent, COMSIG_MOVABLE_IMPACT_ZONE, PROC_REF(try_infect_impact_zone)) - if(isitem(parent)) - RegisterSignal(parent, COMSIG_ITEM_ATTACK_ZONE, PROC_REF(try_infect_attack_zone)) - RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(try_infect_attack)) - RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(try_infect_equipped)) - RegisterSignal(parent, COMSIG_FOOD_EATEN, PROC_REF(try_infect_eat)) - RegisterSignal(parent, COMSIG_PILL_CONSUMED, PROC_REF(try_infect_eat)) - if(istype(parent, /obj/item/reagent_containers/cup)) - RegisterSignal(parent, COMSIG_GLASS_DRANK, PROC_REF(try_infect_drink)) - if(isorgan(parent)) - RegisterSignal(parent, COMSIG_ORGAN_IMPLANTED, PROC_REF(on_organ_insertion)) - -/datum/component/infective/UnregisterFromParent() - . = ..() - UnregisterSignal(parent, list( - COMSIG_FOOD_EATEN, - COMSIG_PILL_CONSUMED, - COMSIG_COMPONENT_CLEAN_ACT, - COMSIG_MOVABLE_BUMP, - COMSIG_MOVABLE_IMPACT_ZONE, - COMSIG_ITEM_ATTACK_ZONE, - COMSIG_ITEM_ATTACK, - COMSIG_ITEM_EQUIPPED, - COMSIG_GLASS_DRANK, - COMSIG_ORGAN_IMPLANTED, - )) - qdel(GetComponent(/datum/component/connect_loc_behalf)) + else + var/static/list/disease_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(try_infect_crossed), + ) + AddComponent(/datum/component/connect_loc_behalf, parent, disease_connections) + + RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(clean)) + RegisterSignal(parent, COMSIG_MOVABLE_BUCKLE, PROC_REF(try_infect_buckle)) + RegisterSignal(parent, COMSIG_MOVABLE_BUMP, PROC_REF(try_infect_collide)) + RegisterSignal(parent, COMSIG_MOVABLE_IMPACT_ZONE, PROC_REF(try_infect_impact_zone)) + if(isitem(parent)) + RegisterSignal(parent, COMSIG_ITEM_ATTACK_ZONE, PROC_REF(try_infect_attack_zone)) + RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(try_infect_attack)) + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(try_infect_equipped)) + RegisterSignal(parent, COMSIG_FOOD_EATEN, PROC_REF(try_infect_eat)) + RegisterSignal(parent, COMSIG_PILL_CONSUMED, PROC_REF(try_infect_eat)) + if(istype(parent, /obj/item/reagent_containers/cup)) + RegisterSignal(parent, COMSIG_GLASS_DRANK, PROC_REF(try_infect_drink)) + if(isorgan(parent)) + RegisterSignal(parent, COMSIG_ORGAN_IMPLANTED, PROC_REF(on_organ_insertion)) /datum/component/infective/proc/on_organ_insertion(obj/item/organ/target, mob/living/carbon/receiver) SIGNAL_HANDLER @@ -97,16 +62,16 @@ eater.add_mood_event("disgust", /datum/mood_event/disgust/dirty_food) - for(var/datum/disease/disease as anything in diseases) - if(is_weak && !prob(weak_infection_chance)) - continue + if(is_weak && !prob(weak_infection_chance)) + return + + for(var/datum/disease/disease in diseases) if(!disease.has_required_infectious_organ(eater, ORGAN_SLOT_STOMACH)) continue eater.ForceContractDisease(disease) - if(!is_weak) - try_infect(feeder, BODY_ZONE_L_ARM) + try_infect(feeder, BODY_ZONE_L_ARM) /datum/component/infective/proc/try_infect_drink(datum/source, mob/living/drinker, mob/living/feeder) SIGNAL_HANDLER @@ -114,14 +79,11 @@ if(HAS_TRAIT(drinker, TRAIT_STRONG_STOMACH)) return - if(!is_weak) - var/appendage_zone = feeder.held_items.Find(source) - appendage_zone = appendage_zone == 0 ? BODY_ZONE_CHEST : (appendage_zone % 2 ? BODY_ZONE_R_ARM : BODY_ZONE_L_ARM) - try_infect(feeder, appendage_zone) + var/appendage_zone = feeder.held_items.Find(source) + appendage_zone = appendage_zone == 0 ? BODY_ZONE_CHEST : appendage_zone % 2 ? BODY_ZONE_R_ARM : BODY_ZONE_L_ARM + try_infect(feeder, appendage_zone) - for(var/datum/disease/disease as anything in diseases) - if(is_weak && !prob(weak_infection_chance)) - continue + for(var/datum/disease/disease in diseases) if(!disease.has_required_infectious_organ(drinker, ORGAN_SLOT_STOMACH)) continue @@ -201,3 +163,19 @@ /datum/component/infective/proc/try_infect(mob/living/L, target_zone) for(var/V in diseases) L.ContactContractDisease(V, target_zone) + +/datum/component/infective/UnregisterFromParent() + . = ..() + UnregisterSignal(parent, list( + COMSIG_FOOD_EATEN, + COMSIG_PILL_CONSUMED, + COMSIG_COMPONENT_CLEAN_ACT, + COMSIG_MOVABLE_BUMP, + COMSIG_MOVABLE_IMPACT_ZONE, + COMSIG_ITEM_ATTACK_ZONE, + COMSIG_ITEM_ATTACK, + COMSIG_ITEM_EQUIPPED, + COMSIG_GLASS_DRANK, + COMSIG_ORGAN_IMPLANTED, + )) + qdel(GetComponent(/datum/component/connect_loc_behalf)) diff --git a/code/datums/components/irradiated.dm b/code/datums/components/irradiated.dm index 9562f161fb4a8..077539f49db8e 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, wound_clothing = FALSE) + human_parent.apply_damage(RADIATION_BURN_SPLOTCH_DAMAGE, BURN, affected_limb) playsound( human_parent, pick('sound/effects/wounds/sizzle1.ogg', 'sound/effects/wounds/sizzle2.ogg'), diff --git a/code/datums/components/itempicky.dm b/code/datums/components/itempicky.dm index bda8b1ae13881..74fbdff1caa91 100644 --- a/code/datums/components/itempicky.dm +++ b/code/datums/components/itempicky.dm @@ -5,21 +5,13 @@ var/whitelist /// Message shown if you try to pick up an item not in the whitelist var/message = "You don't like %TARGET, why would you hold it?" - /// An optional callback we check for overriding our whitelist - var/datum/callback/tertiary_condition = null -/datum/component/itempicky/Initialize(whitelist, message, tertiary_condition) +/datum/component/itempicky/Initialize(whitelist, message) if(!ismob(parent)) return COMPONENT_INCOMPATIBLE src.whitelist = whitelist if(message) src.message = message - if(tertiary_condition) - src.tertiary_condition = tertiary_condition - -/datum/component/itempicky/Destroy(force) - tertiary_condition = null - return ..() /datum/component/itempicky/RegisterWithParent() RegisterSignal(parent, COMSIG_LIVING_TRY_PUT_IN_HAND, PROC_REF(particularly)) @@ -38,7 +30,6 @@ /datum/component/itempicky/proc/particularly(datum/source, obj/item/pickingup) SIGNAL_HANDLER - // if we were passed the output of a callback, check against that - if(!tertiary_condition?.Invoke() && !is_type_in_typecache(pickingup, whitelist)) + if(!is_type_in_typecache(pickingup, whitelist)) to_chat(source, span_warning("[replacetext(message, "%TARGET", pickingup)]")) return COMPONENT_LIVING_CANT_PUT_IN_HAND diff --git a/code/datums/components/mind_linker.dm b/code/datums/components/mind_linker.dm index f6b2af5329716..4449a8fe36e8e 100644 --- a/code/datums/components/mind_linker.dm +++ b/code/datums/components/mind_linker.dm @@ -242,7 +242,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", max_length = MAX_MESSAGE_LEN) + var/message = tgui_input_text(owner, "Enter a message to transmit.", "[linker.network_name] Telepathy") if(!message || QDELETED(src) || QDELETED(owner) || owner.stat == DEAD) return diff --git a/code/datums/components/profound_fisher.dm b/code/datums/components/profound_fisher.dm index 61f6543bd12bf..5bd5af12943a5 100644 --- a/code/datums/components/profound_fisher.dm +++ b/code/datums/components/profound_fisher.dm @@ -64,12 +64,9 @@ /datum/component/profound_fisher/proc/on_unarmed_attack(mob/living/source, atom/attack_target, proximity_flag, list/modifiers) SIGNAL_HANDLER - if(!should_fish_on(source, attack_target)) + if(!source.client || !should_fish_on(source, attack_target)) return - if(source.client) - INVOKE_ASYNC(src, PROC_REF(begin_fishing), source, attack_target) - else - INVOKE_ASYNC(src, PROC_REF(pretend_fish), source, attack_target) + INVOKE_ASYNC(src, PROC_REF(begin_fishing), source, attack_target) return COMPONENT_CANCEL_ATTACK_CHAIN /datum/component/profound_fisher/proc/pre_attack(mob/living/source, atom/target) @@ -80,33 +77,34 @@ if(source.client) INVOKE_ASYNC(src, PROC_REF(begin_fishing), source, target) else - INVOKE_ASYNC(src, PROC_REF(pretend_fish), source, target) + INVOKE_ASYNC(src, PROC_REF(pretend_fish), target) return COMPONENT_HOSTILE_NO_ATTACK /datum/component/profound_fisher/proc/should_fish_on(mob/living/user, atom/target) - if(!HAS_TRAIT(target, TRAIT_FISHING_SPOT) || GLOB.fishing_challenges_by_user[user]) + if(!HAS_TRAIT(target, TRAIT_FISHING_SPOT) || HAS_TRAIT(user, TRAIT_GONE_FISHING)) return FALSE if(user.combat_mode || !user.CanReach(target)) return FALSE return TRUE /datum/component/profound_fisher/proc/begin_fishing(mob/living/user, atom/target) - RegisterSignal(user, COMSIG_MOB_BEGIN_FISHING, PROC_REF(actually_fishing_with_internal_rod)) + RegisterSignal(user, SIGNAL_ADDTRAIT(TRAIT_GONE_FISHING), PROC_REF(actually_fishing_with_internal_rod)) our_rod.melee_attack_chain(user, target) - UnregisterSignal(user, COMSIG_MOB_BEGIN_FISHING) + UnregisterSignal(user, SIGNAL_ADDTRAIT(TRAIT_GONE_FISHING)) /datum/component/profound_fisher/proc/actually_fishing_with_internal_rod(datum/source) SIGNAL_HANDLER ADD_TRAIT(source, TRAIT_PROFOUND_FISHER, REF(parent)) - RegisterSignal(source, COMSIG_MOB_COMPLETE_FISHING, PROC_REF(remove_profound_fisher)) + RegisterSignal(source, SIGNAL_REMOVETRAIT(TRAIT_GONE_FISHING), PROC_REF(remove_profound_fisher)) /datum/component/profound_fisher/proc/remove_profound_fisher(datum/source) SIGNAL_HANDLER REMOVE_TRAIT(source, TRAIT_PROFOUND_FISHER, TRAIT_GENERIC) - UnregisterSignal(source, COMSIG_MOB_COMPLETE_FISHING) + UnregisterSignal(source, SIGNAL_REMOVETRAIT(TRAIT_GONE_FISHING)) -/datum/component/profound_fisher/proc/pretend_fish(mob/living/source, atom/target) - if(DOING_INTERACTION_WITH_TARGET(source, target)) +/datum/component/profound_fisher/proc/pretend_fish(atom/target) + var/mob/living/living_parent = parent + if(DOING_INTERACTION_WITH_TARGET(living_parent, target)) return var/list/fish_spot_container[NPC_FISHING_SPOT] SEND_SIGNAL(target, COMSIG_NPC_FISHING, fish_spot_container) @@ -115,14 +113,13 @@ return null var/obj/effect/fishing_float/float = new(get_turf(target), target) playsound(float, 'sound/effects/splash.ogg', 100) - if(!PERFORM_ALL_TESTS(fish_sources)) - var/happiness_percentage = source.ai_controller?.blackboard[BB_BASIC_HAPPINESS] * 0.01 - var/fishing_speed = 10 SECONDS - round(4 SECONDS * happiness_percentage) - if(!do_after(source, fishing_speed, target = target) && !QDELETED(fish_spot)) - qdel(float) - return - var/reward_loot = fish_spot.roll_reward(our_rod, source) - fish_spot.dispense_reward(reward_loot, source, target) + var/happiness_percentage = living_parent.ai_controller?.blackboard[BB_BASIC_HAPPINESS] / 100 + var/fishing_speed = 10 SECONDS - round(4 SECONDS * happiness_percentage) + if(!do_after(living_parent, fishing_speed, target = target) && !QDELETED(fish_spot)) + qdel(float) + return + var/reward_loot = fish_spot.roll_reward(our_rod, parent) + fish_spot.dispense_reward(reward_loot, parent, target) playsound(float, 'sound/effects/bigsplash.ogg', 100) qdel(float) @@ -130,5 +127,3 @@ line = /obj/item/fishing_line/reinforced bait = /obj/item/food/bait/doughball/synthetic/unconsumable resistance_flags = INDESTRUCTIBLE - reel_overlay = null - show_in_wiki = FALSE //abstract fishing rod diff --git a/code/datums/components/riding/riding_mob.dm b/code/datums/components/riding/riding_mob.dm index ae4d29e22f5f9..1e3c94d84c6a3 100644 --- a/code/datums/components/riding/riding_mob.dm +++ b/code/datums/components/riding/riding_mob.dm @@ -7,9 +7,7 @@ var/can_use_abilities = FALSE /// shall we require riders to go through the riding minigame if they arent in our friends list var/require_minigame = FALSE - /// unsharable abilities that we will force to be shared anyway - var/list/override_unsharable_abilities = list() - /// abilities that are always blacklisted from sharing + /// list of blacklisted abilities that cant be shared var/list/blacklist_abilities = list() /datum/component/riding/creature/Initialize(mob/living/riding_mob, force = FALSE, ride_check_flags = NONE, potion_boost = FALSE) @@ -170,8 +168,6 @@ for(var/datum/action/action as anything in ridden_creature.actions) if(is_type_in_list(action, blacklist_abilities)) continue - if(!action.can_be_shared && !is_type_in_list(action, override_unsharable_abilities)) - continue action.GiveAction(rider) /// Takes away the riding parent's abilities from the rider @@ -508,6 +504,7 @@ /datum/component/riding/creature/leaper can_force_unbuckle = FALSE can_use_abilities = TRUE + blacklist_abilities = list(/datum/action/cooldown/toggle_seethrough) ride_check_flags = JUST_FRIEND_RIDERS /datum/component/riding/creature/leaper/handle_specials() diff --git a/code/datums/components/seclight_attachable.dm b/code/datums/components/seclight_attachable.dm index 6b3991c9c5e3c..b1d4aebc93f83 100644 --- a/code/datums/components/seclight_attachable.dm +++ b/code/datums/components/seclight_attachable.dm @@ -97,8 +97,8 @@ RegisterSignal(parent, COMSIG_ITEM_UI_ACTION_CLICK, PROC_REF(on_action_click)) RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby)) RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) - RegisterSignal(parent, COMSIG_ATOM_SABOTEUR_ACT, PROC_REF(on_hit_by_saboteur)) RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(on_parent_deleted)) + RegisterSignal(parent, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) /datum/component/seclite_attachable/UnregisterFromParent() UnregisterSignal(parent, list( @@ -110,7 +110,6 @@ COMSIG_ITEM_UI_ACTION_CLICK, COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_EXAMINE, - COMSIG_ATOM_SABOTEUR_ACT, COMSIG_QDELETING, )) @@ -297,8 +296,8 @@ // but that's the downside of using icon states over overlays. source.icon_state = base_state -//turns the light off for a few seconds. -/datum/component/seclite_attachable/proc/on_hit_by_saboteur(datum/source, disrupt_duration) +/// Signal proc for [COMSIG_HIT_BY_SABOTEUR] that turns the light off for a few seconds. +/datum/component/seclite_attachable/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER . = light.on_saboteur(source, disrupt_duration) update_light() - return . diff --git a/code/datums/components/seethrough_mob.dm b/code/datums/components/seethrough_mob.dm index b6951c5489b6d..bae87faf61583 100644 --- a/code/datums/components/seethrough_mob.dm +++ b/code/datums/components/seethrough_mob.dm @@ -122,7 +122,6 @@ background_icon_state = "bg_alien" cooldown_time = 1 SECONDS melee_cooldown_time = 0 - can_be_shared = FALSE /datum/action/cooldown/toggle_seethrough/Remove(mob/remove_from) var/datum/component/seethrough_mob/transparency = target diff --git a/code/datums/components/singularity.dm b/code/datums/components/singularity.dm index 0cd64d829a2fd..14aaedff7172a 100644 --- a/code/datums/components/singularity.dm +++ b/code/datums/components/singularity.dm @@ -373,7 +373,7 @@ for(var/mob/living/target as anything in GLOB.mob_living_list) if(target.z != atom_parent.z) continue - if(HAS_TRAIT(target, TRAIT_GODMODE)) + if(target.status_effects & GODMODE) continue var/distance_from_target = get_dist(target, atom_parent) if(distance_from_target < closest_distance) diff --git a/code/datums/components/soulstoned.dm b/code/datums/components/soulstoned.dm index d4e9e0eaf02e1..bb22030c21042 100644 --- a/code/datums/components/soulstoned.dm +++ b/code/datums/components/soulstoned.dm @@ -11,7 +11,8 @@ stoned.forceMove(container) stoned.fully_heal() - stoned.add_traits(list(TRAIT_GODMODE, TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), SOULSTONE_TRAIT) + stoned.add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), SOULSTONE_TRAIT) + stoned.status_flags |= GODMODE RegisterSignal(stoned, COMSIG_MOVABLE_MOVED, PROC_REF(free_prisoner)) @@ -24,4 +25,5 @@ /datum/component/soulstoned/UnregisterFromParent() var/mob/living/stoned = parent - stoned.remove_traits(list(TRAIT_GODMODE, TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), SOULSTONE_TRAIT) + stoned.status_flags &= ~GODMODE + stoned.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), SOULSTONE_TRAIT) diff --git a/code/datums/components/speechmod.dm b/code/datums/components/speechmod.dm index fc01d8d2d846c..8ffa3e8624e49 100644 --- a/code/datums/components/speechmod.dm +++ b/code/datums/components/speechmod.dm @@ -60,8 +60,6 @@ var/message = speech_args[SPEECH_MESSAGE] if(message[1] == "*") return - if(SEND_SIGNAL(source, COMSIG_TRY_MODIFY_SPEECH) & PREVENT_MODIFY_SPEECH) - return if(!isnull(should_modify_speech) && !should_modify_speech.Invoke(source, speech_args)) return diff --git a/code/datums/components/supermatter_crystal.dm b/code/datums/components/supermatter_crystal.dm index 53a0797c2e1c0..81a29b56c6d81 100644 --- a/code/datums/components/supermatter_crystal.dm +++ b/code/datums/components/supermatter_crystal.dm @@ -71,7 +71,7 @@ SIGNAL_HANDLER if(isliving(user)) var/mob/living/living_mob = user - if(living_mob.incorporeal_move || HAS_TRAIT(living_mob, TRAIT_GODMODE)) + if(living_mob.incorporeal_move || living_mob.status_flags & GODMODE) return if(isalien(user)) dust_mob(source, user, cause = "alien attack") @@ -80,7 +80,7 @@ /datum/component/supermatter_crystal/proc/animal_hit(datum/source, mob/living/simple_animal/user, list/modifiers) SIGNAL_HANDLER - if(user.incorporeal_move || HAS_TRAIT(user, TRAIT_GODMODE)) + if(user.incorporeal_move || user.status_flags & GODMODE) return var/atom/atom_source = source var/murder @@ -101,7 +101,7 @@ SIGNAL_HANDLER if(isliving(user)) var/mob/living/living_mob = user - if(living_mob.incorporeal_move || HAS_TRAIT(living_mob, TRAIT_GODMODE)) + if(living_mob.incorporeal_move || living_mob.status_flags & GODMODE) return var/atom/atom_source = source if(iscyborg(user) && atom_source.Adjacent(user)) @@ -115,7 +115,7 @@ /datum/component/supermatter_crystal/proc/hand_hit(datum/source, mob/living/user, list/modifiers) SIGNAL_HANDLER - if(user.incorporeal_move || HAS_TRAIT(user, TRAIT_GODMODE)) + if(user.incorporeal_move || user.status_flags & GODMODE) return if(user.zone_selected != BODY_ZONE_PRECISE_MOUTH) dust_mob(source, user, cause = "hand") @@ -202,7 +202,7 @@ return if(atom_source.Adjacent(user)) //if the item is stuck to the person, kill the person too instead of eating just the item. - if(user.incorporeal_move || HAS_TRAIT(user, TRAIT_GODMODE)) + if(user.incorporeal_move || user.status_flags & GODMODE) return var/vis_msg = span_danger("[user] reaches out and touches [atom_source] with [item], inducing a resonance... [item] starts to glow briefly before the light continues up to [user]'s body. [user.p_They()] burst[user.p_s()] into flames before flashing into dust!") var/mob_msg = span_userdanger("You reach out and touch [atom_source] with [item]. Everything starts burning and all you can hear is ringing. Your last thought is \"That was not a wise decision.\"") @@ -219,7 +219,7 @@ SIGNAL_HANDLER if(isliving(hit_object)) var/mob/living/hit_mob = hit_object - if(hit_mob.incorporeal_move || HAS_TRAIT(hit_mob, TRAIT_GODMODE)) + if(hit_mob.incorporeal_move || hit_mob.status_flags & GODMODE) return var/atom/atom_source = source var/obj/machinery/power/supermatter_crystal/our_supermatter = parent // Why is this a component? @@ -272,7 +272,7 @@ span_hear("You hear a loud crack as you are washed with a wave of heat.")) /datum/component/supermatter_crystal/proc/dust_mob(datum/source, mob/living/nom, vis_msg, mob_msg, cause) - if(nom.incorporeal_move || HAS_TRAIT(nom, TRAIT_GODMODE)) //try to keep supermatter sliver's + hemostat's dust conditions in sync with this too + if(nom.incorporeal_move || nom.status_flags & GODMODE) //try to keep supermatter sliver's + hemostat's dust conditions in sync with this too return var/atom/atom_source = source if(!vis_msg) @@ -290,8 +290,10 @@ /datum/component/supermatter_crystal/proc/consume(atom/source, atom/movable/consumed_object) if(consumed_object.flags_1 & SUPERMATTER_IGNORES_1) return - if(HAS_TRAIT(consumed_object, TRAIT_GODMODE)) - return + if(isliving(consumed_object)) + var/mob/living/consumed_mob = consumed_object + if(consumed_mob.status_flags & GODMODE) + return var/atom/atom_source = source SEND_SIGNAL(consumed_object, COMSIG_SUPERMATTER_CONSUMED, atom_source) diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index 3d777e888d9fc..0c23733ea1658 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -71,7 +71,7 @@ /datum/component/tackler/proc/checkTackle(mob/living/carbon/user, atom/clicked_atom, list/modifiers) SIGNAL_HANDLER - if(!modifiers[RIGHT_CLICK] || modifiers[ALT_CLICK] || modifiers[SHIFT_CLICK] || modifiers[CTRL_CLICK] || modifiers[MIDDLE_CLICK]) + if(modifiers[ALT_CLICK] || modifiers[SHIFT_CLICK] || modifiers[CTRL_CLICK] || modifiers[MIDDLE_CLICK]) return if(!user.throw_mode || user.get_active_held_item() || user.pulling || user.buckled || user.incapacitated) diff --git a/code/datums/components/toggle_attached_clothing.dm b/code/datums/components/toggle_attached_clothing.dm index 8321119d85e58..9ba42fe091732 100644 --- a/code/datums/components/toggle_attached_clothing.dm +++ b/code/datums/components/toggle_attached_clothing.dm @@ -198,9 +198,9 @@ on_removed?.Invoke(deployable) var/obj/item/parent_gear = parent - if(destroy_on_removal) + if (destroy_on_removal) QDEL_NULL(deployable) - if(parent_icon_state_suffix) + else if (parent_icon_state_suffix) parent_gear.icon_state = "[initial(parent_gear.icon_state)]" parent_gear.worn_icon_state = parent_gear.icon_state parent_gear.update_slot_icon() diff --git a/code/datums/datum.dm b/code/datums/datum.dm index d170aeca8522e..a4169004fc982 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -419,11 +419,6 @@ filter_data = null atom_cast.filters = null -/// Calls qdel on itself, because signals dont allow callbacks -/datum/proc/selfdelete() - SIGNAL_HANDLER - qdel(src) - /// Return text from this proc to provide extra context to hard deletes that happen to it /// Optional, you should use this for cases where replication is difficult and extra context is required /// Can be called more then once per object, use harddel_deets_dumped to avoid duplicate calls (I am so sorry) diff --git a/code/datums/diseases/advance/floor_diseases/carpellosis.dm b/code/datums/diseases/advance/floor_diseases/carpellosis.dm index cdeb6051537e3..a0482215494c4 100644 --- a/code/datums/diseases/advance/floor_diseases/carpellosis.dm +++ b/code/datums/diseases/advance/floor_diseases/carpellosis.dm @@ -41,7 +41,7 @@ switch(stage) if(2) - if(SPT_PROB(1, seconds_per_tick) && affected_mob.stat == CONSCIOUS && affected_mob.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)) + if(SPT_PROB(1, seconds_per_tick) && affected_mob.stat == CONSCIOUS) to_chat(affected_mob, span_warning("You want to wag your tail...")) affected_mob.emote("wag") if(3) diff --git a/code/datums/elements/art.dm b/code/datums/elements/art.dm index d5a642c23d0b6..81d388aa94af8 100644 --- a/code/datums/elements/art.dm +++ b/code/datums/elements/art.dm @@ -74,7 +74,7 @@ var/datum/job_department/hater_department = SSjob.get_department_type(hater_department_type) for(var/datum/job/hater_job as anything in hater_department.department_jobs) haters += hater_job.title - var/datum/job/quartermaster/fucking_quartermaster = SSjob.get_job_type(/datum/job/quartermaster) + var/datum/job/quartermaster/fucking_quartermaster = SSjob.GetJobType(/datum/job/quartermaster) haters += fucking_quartermaster.title if(!(user.mind.assigned_role.title in haters)) diff --git a/code/datums/elements/bed_tucking.dm b/code/datums/elements/bed_tucking.dm index 3b49f2a608f88..58f5640c31c75 100644 --- a/code/datums/elements/bed_tucking.dm +++ b/code/datums/elements/bed_tucking.dm @@ -53,11 +53,11 @@ return COMPONENT_NO_AFTERATTACK /datum/element/bed_tuckable/proc/tuck(obj/item/tucked, obj/structure/bed/target_bed) - tucked.dir = target_bed.dir & target_bed.left_headrest_dirs ? EAST : WEST - tucked.pixel_x = target_bed.dir & target_bed.left_headrest_dirs ? -x_offset : x_offset + tucked.dir = target_bed.dir + tucked.pixel_x = target_bed.dir & EAST ? -x_offset : x_offset tucked.pixel_y = y_offset if(starting_angle) - rotation_degree = target_bed.dir & target_bed.left_headrest_dirs ? starting_angle + 180 : starting_angle + rotation_degree = target_bed.dir & EAST ? starting_angle + 180 : starting_angle tucked.transform = turn(tucked.transform, rotation_degree) RegisterSignal(tucked, COMSIG_ITEM_PICKUP, PROC_REF(untuck)) diff --git a/code/datums/elements/consumable_mob.dm b/code/datums/elements/consumable_mob.dm index fafdb8cbcab28..1a7c67a431220 100644 --- a/code/datums/elements/consumable_mob.dm +++ b/code/datums/elements/consumable_mob.dm @@ -23,7 +23,7 @@ /datum/element/consumable_mob/proc/on_consume(atom/movable/source, mob/living/consumer) SIGNAL_HANDLER - if(!consumer.combat_mode || !consumer.reagents || HAS_TRAIT(consumer, TRAIT_PACIFISM)) + if(!consumer.combat_mode || !consumer.reagents) return for(var/reagent_type in reagents_list) if(isnull(reagents_list[reagent_type])) diff --git a/code/datums/elements/disarm_attack.dm b/code/datums/elements/disarm_attack.dm index 8b4b0b3ff8adf..a788cd9f35ed3 100644 --- a/code/datums/elements/disarm_attack.dm +++ b/code/datums/elements/disarm_attack.dm @@ -6,23 +6,13 @@ if(!isitem(target)) return ELEMENT_INCOMPATIBLE - var/obj/item/item = target - RegisterSignal(item, COMSIG_ITEM_ATTACK_SECONDARY, PROC_REF(secondary_attack)) - RegisterSignal(item, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) - item.item_flags |= ITEM_HAS_CONTEXTUAL_SCREENTIPS - RegisterSignal(item, COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET, PROC_REF(add_item_context)) + RegisterSignal(target, COMSIG_ITEM_ATTACK_SECONDARY, PROC_REF(secondary_attack)) + RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) /datum/element/disarm_attack/Detach(datum/source) - UnregisterSignal(source, list(COMSIG_ATOM_EXAMINE, COMSIG_ITEM_ATTACK_SECONDARY, COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET)) + UnregisterSignal(source, list(COMSIG_ATOM_EXAMINE, COMSIG_ITEM_ATTACK_SECONDARY)) return ..() -/datum/element/disarm_attack/proc/add_item_context(obj/item/source, list/context, atom/target, mob/living/user) - SIGNAL_HANDLER - if(!isliving(target) || !can_disarm_attack(source, target, user, FALSE)) - return NONE - context[SCREENTIP_CONTEXT_RMB] = "Shove" - return CONTEXTUAL_SCREENTIP_SET - /datum/element/disarm_attack/proc/secondary_attack(obj/item/source, mob/living/victim, mob/living/user, params) SIGNAL_HANDLER if(!user.can_disarm(victim) || !can_disarm_attack(source, victim, user)) diff --git a/code/datums/elements/embed.dm b/code/datums/elements/embed.dm index 2aae03fb3a4b6..4a8bda37c3a75 100644 --- a/code/datums/elements/embed.dm +++ b/code/datums/elements/embed.dm @@ -23,7 +23,7 @@ return RegisterSignal(target, COMSIG_MOVABLE_IMPACT_ZONE, PROC_REF(check_embed)) - RegisterSignal(target, COMSIG_ATOM_EXAMINE_TAGS, PROC_REF(examined_tags)) + RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(examined)) RegisterSignal(target, COMSIG_EMBED_TRY_FORCE, PROC_REF(try_force_embed)) RegisterSignal(target, COMSIG_ITEM_DISABLE_EMBED, PROC_REF(detach_from_weapon)) @@ -46,7 +46,7 @@ if(blocked || !istype(victim) || HAS_TRAIT(victim, TRAIT_PIERCEIMMUNE)) return FALSE - if(HAS_TRAIT(victim, TRAIT_GODMODE)) + if(victim.status_flags & GODMODE) return FALSE var/flying_speed = throwingdatum?.speed || weapon.throw_speed @@ -82,13 +82,13 @@ Detach(weapon) ///Someone inspected our embeddable item -/datum/element/embed/proc/examined_tags(obj/item/I, mob/user, list/examine_list) +/datum/element/embed/proc/examined(obj/item/I, mob/user, list/examine_list) SIGNAL_HANDLER if(I.is_embed_harmless()) - examine_list["sticky"] = "[I] feels sticky, and could probably get stuck to someone if thrown properly!" + examine_list += "[I] feels sticky, and could probably get stuck to someone if thrown properly!" else - examine_list["embeddable"] = "[I] has a fine point, and could probably embed in someone if thrown properly!" + examine_list += "[I] has a fine point, and could probably embed in someone if thrown properly!" /** * check_embed_projectile() is what we get when a projectile with a defined shrapnel_type impacts a target. diff --git a/code/datums/elements/food/fried_item.dm b/code/datums/elements/food/fried_item.dm index bc21e51f24cd7..2afab84d1cb43 100644 --- a/code/datums/elements/food/fried_item.dm +++ b/code/datums/elements/food/fried_item.dm @@ -17,27 +17,28 @@ var/atom/this_food = target switch(fry_time) - if(0 to 15 SECONDS) + if(0 to 15) this_food.add_atom_colour(fried_colors[1], FIXED_COLOUR_PRIORITY) this_food.name = "lightly-fried [this_food.name]" this_food.desc += " It's been lightly fried in a deep fryer." - if(15 SECONDS to 50 SECONDS) + if(15 to 50) this_food.add_atom_colour(fried_colors[2], FIXED_COLOUR_PRIORITY) this_food.name = "fried [this_food.name]" this_food.desc += " It's been fried, increasing its tastiness value by [rand(1, 75)]%." - if(50 SECONDS to 85 SECONDS) + if(50 to 85) this_food.add_atom_colour(fried_colors[3], FIXED_COLOUR_PRIORITY) this_food.name = "deep-fried [this_food.name]" this_food.desc += " Deep-fried to perfection." - if(85 SECONDS to INFINITY) + if(85 to INFINITY) this_food.add_atom_colour(fried_colors[4], FIXED_COLOUR_PRIORITY) this_food.name = "\proper the physical manifestation of the very concept of fried foods" this_food.desc = "A heavily-fried... something. Who can tell anymore?" ADD_TRAIT(this_food, TRAIT_FOOD_FRIED, ELEMENT_TRAIT(type)) + SEND_SIGNAL(this_food, COMSIG_ITEM_FRIED, fry_time) // Already edible items will inherent these parameters // Otherwise, we will become edible. this_food.AddComponent( \ @@ -48,7 +49,6 @@ foodtypes = FRIED, \ volume = this_food.reagents?.maximum_volume, \ ) - SEND_SIGNAL(this_food, COMSIG_ITEM_FRIED, fry_time) /datum/element/fried_item/Detach(atom/source, ...) for(var/color in fried_colors) diff --git a/code/datums/elements/food/grilled_item.dm b/code/datums/elements/food/grilled_item.dm index 6899f47faa475..74e772eb73c92 100644 --- a/code/datums/elements/food/grilled_item.dm +++ b/code/datums/elements/food/grilled_item.dm @@ -28,12 +28,10 @@ if(grill_time > 30 SECONDS && isnull(this_food.GetComponent(/datum/component/edible))) this_food.AddComponent(/datum/component/edible, foodtypes = FRIED) - SEND_SIGNAL(this_food, COMSIG_ITEM_BARBEQUE_GRILLED, grill_time) - ADD_TRAIT(this_food, TRAIT_FOOD_BBQ_GRILLED, ELEMENT_TRAIT(type)) + SEND_SIGNAL(this_food, COMSIG_ITEM_BARBEQUE_GRILLED) /datum/element/grilled_item/Detach(atom/source, ...) source.name = initial(source.name) source.desc = initial(source.desc) qdel(source.GetComponent(/datum/component/edible)) // Don't care if it was initially edible - REMOVE_TRAIT(src, TRAIT_FOOD_BBQ_GRILLED, ELEMENT_TRAIT(type)) return ..() diff --git a/code/datums/elements/give_turf_traits.dm b/code/datums/elements/give_turf_traits.dm index 7e7c37d86e7ef..3c53d4a5e7305 100644 --- a/code/datums/elements/give_turf_traits.dm +++ b/code/datums/elements/give_turf_traits.dm @@ -67,7 +67,7 @@ for(var/mob/living/living in location) living.update_turf_movespeed() -/// Signals are carried over when the turf is changed, but traits aren't, so they've to be readded post-change. +/// Signals and components are carried over when the turf is changed, so they've to be readded post-change. /datum/element/give_turf_traits/proc/pre_change_turf(turf/changed, path, list/new_baseturfs, flags, list/post_change_callbacks) SIGNAL_HANDLER post_change_callbacks += CALLBACK(src, PROC_REF(reoccupy_turf)) diff --git a/code/datums/elements/lazy_fishing_spot.dm b/code/datums/elements/lazy_fishing_spot.dm index 67edcea2e88ed..b84826def1ed8 100644 --- a/code/datums/elements/lazy_fishing_spot.dm +++ b/code/datums/elements/lazy_fishing_spot.dm @@ -20,19 +20,10 @@ RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examined)) RegisterSignal(target, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_examined_more)) RegisterSignal(target, COMSIG_ATOM_EX_ACT, PROC_REF(explosive_fishing)) - RegisterSignal(target, COMSIG_FISH_RELEASED_INTO, PROC_REF(fish_released)) - RegisterSignal(target, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(link_to_fish_porter)) /datum/element/lazy_fishing_spot/Detach(datum/target) - UnregisterSignal(target, list( - COMSIG_FISH_RELEASED_INTO, - COMSIG_PRE_FISHING, - COMSIG_NPC_FISHING, - COMSIG_ATOM_EXAMINE, - COMSIG_ATOM_EXAMINE_MORE, - COMSIG_ATOM_EX_ACT, - COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), - )) + UnregisterSignal(target, list(COMSIG_PRE_FISHING, COMSIG_ATOM_EXAMINE, COMSIG_ATOM_EXAMINE_MORE, COMSIG_ATOM_EX_ACT)) + UnregisterSignal(target, list(COMSIG_PRE_FISHING, COMSIG_NPC_FISHING)) REMOVE_TRAIT(target, TRAIT_FISHING_SPOT, REF(src)) return ..() @@ -70,16 +61,3 @@ /datum/element/lazy_fishing_spot/proc/return_glob_fishing_spot(datum/source, list/fish_spot_container) fish_spot_container[NPC_FISHING_SPOT] = GLOB.preset_fish_sources[configuration] - -/datum/element/lazy_fishing_spot/proc/link_to_fish_porter(atom/source, mob/user, obj/item/multitool/tool) - SIGNAL_HANDLER - if(!istype(tool.buffer, /obj/machinery/fishing_portal_generator)) - return - var/datum/fish_source/fish_source = GLOB.preset_fish_sources[configuration] - var/obj/machinery/fishing_portal_generator/portal = tool.buffer - return portal.link_fishing_spot(fish_source, source, user) - -/datum/element/lazy_fishing_spot/proc/fish_released(datum/source, obj/item/fish/fish, mob/living/releaser) - SIGNAL_HANDLER - var/datum/fish_source/fish_source = GLOB.preset_fish_sources[configuration] - fish_source.readd_fish(fish, releaser) diff --git a/code/datums/elements/pet_collar.dm b/code/datums/elements/pet_collar.dm index f98767629e7e7..5c49de2eceb5b 100644 --- a/code/datums/elements/pet_collar.dm +++ b/code/datums/elements/pet_collar.dm @@ -54,7 +54,7 @@ /datum/element/wears_collar/proc/on_content_enter(mob/living/source, obj/item/clothing/neck/petcollar/new_collar) SIGNAL_HANDLER - if(!istype(new_collar) || !new_collar.tagname) + if(!istype(new_collar)) return source.fully_replace_character_name(null, "\proper [new_collar.tagname]") diff --git a/code/datums/elements/slapcrafting.dm b/code/datums/elements/slapcrafting.dm index 4b58bddd2a0f4..42776bf31f773 100644 --- a/code/datums/elements/slapcrafting.dm +++ b/code/datums/elements/slapcrafting.dm @@ -26,7 +26,7 @@ return //Don't do anything, it just shouldn't be used in crafting. RegisterSignal(target, COMSIG_ATOM_ATTACKBY, PROC_REF(attempt_slapcraft)) - RegisterSignal(target, COMSIG_ATOM_EXAMINE_TAGS, PROC_REF(get_examine_info)) + RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(get_examine_info)) RegisterSignal(target, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(get_examine_more_info)) RegisterSignal(target, COMSIG_TOPIC, PROC_REF(topic_handler)) @@ -126,7 +126,7 @@ already_used_names += initial(result.name) string_results += list("\a [initial(result.name)]") - examine_list["crafting component"] = "You think [source] could be used to make [english_list(string_results)]! Examine again to look at the details..." + examine_list += span_notice("You think [source] could be used to make [english_list(string_results)]! Examine again to look at the details...") /// Alerts any examiners to the details of the recipe. /datum/element/slapcrafting/proc/get_examine_more_info(atom/source, mob/user, list/examine_list) diff --git a/code/datums/elements/wall_engraver.dm b/code/datums/elements/wall_engraver.dm index 2b319b0609a28..7204d8cacef5e 100644 --- a/code/datums/elements/wall_engraver.dm +++ b/code/datums/elements/wall_engraver.dm @@ -31,12 +31,12 @@ /datum/element/wall_engraver/proc/try_chisel(obj/item/item, turf/closed/wall, mob/living/user) if(!istype(wall) || !user.mind) return - if(HAS_TRAIT_FROM(wall, TRAIT_NOT_ENGRAVABLE, ENGRAVED_TRAIT)) - user.balloon_alert(user, "wall has already been engraved!") - return - if(HAS_TRAIT(wall, TRAIT_NOT_ENGRAVABLE)) + if(HAS_TRAIT_FROM(wall, TRAIT_NOT_ENGRAVABLE, INNATE_TRAIT)) user.balloon_alert(user, "wall cannot be engraved!") return + if(HAS_TRAIT_FROM(wall, TRAIT_NOT_ENGRAVABLE, TRAIT_GENERIC)) + user.balloon_alert(user, "wall has already been engraved!") + return if(!length(user.mind?.memories)) user.balloon_alert(user, "nothing memorable to engrave!") return diff --git a/code/datums/elements/weapon_description.dm b/code/datums/elements/weapon_description.dm index eda7ca59b49e6..0897b571159bb 100644 --- a/code/datums/elements/weapon_description.dm +++ b/code/datums/elements/weapon_description.dm @@ -73,10 +73,6 @@ // Doesn't show the base notes for items that have the override notes variable set to true if(!source.override_notes) - if (source.sharpness & SHARP_EDGED) - readout += "It's sharp and could cause bleeding wounds." - if (source.sharpness & SHARP_POINTY) - readout += "It's pointy and could cause piercing wounds." // Make sure not to divide by 0 on accident if(source.force > 0) readout += "It takes about [span_warning("[HITS_TO_CRIT(source.force)] melee hit\s")] to take down an enemy." diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index 84355a8a490bf..8d77c6fc6bdbb 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -107,7 +107,6 @@ var/is_important = emote_type & EMOTE_IMPORTANT var/is_visual = emote_type & EMOTE_VISIBLE var/is_audible = emote_type & EMOTE_AUDIBLE - var/space = should_have_space_before_emote(html_decode(msg)[1]) ? " " : "" // DOPPLER EDIT ADDITION // Emote doesn't get printed to chat, runechat only if(emote_type & EMOTE_RUNECHAT) @@ -156,7 +155,6 @@ deaf_message = "You see how [user] [msg]", self_message = msg, audible_message_flags = EMOTE_MESSAGE|ALWAYS_SHOW_SELF_MESSAGE, - separation = space, // DOPPLER EDIT ADDITION ) // Emote is entirely audible, no visible component else if(is_audible) @@ -164,7 +162,6 @@ message = msg, self_message = msg, audible_message_flags = EMOTE_MESSAGE, - separation = space, // DOPPLER EDIT ADDITION ) // Emote is entirely visible, no audible component else if(is_visual) @@ -172,41 +169,10 @@ message = msg, self_message = msg, visible_message_flags = EMOTE_MESSAGE|ALWAYS_SHOW_SELF_MESSAGE, - separation = space, // DOPPLER EDIT ADDITION ) else CRASH("Emote [type] has no valid emote type set!") - // DOPPLER EDIT ADDITION START - AI QOL - RELAY EMOTES OVER HOLOPADS - var/obj/effect/overlay/holo_pad_hologram/hologram = GLOB.hologram_impersonators[user] - if(hologram) - if(is_important) - for(var/mob/living/viewer in viewers(world.view, hologram)) - to_chat(viewer, msg) - else if(is_visual && is_audible) - hologram.audible_message( - message = msg, - deaf_message = "You see how [user] [msg]", - self_message = msg, - audible_message_flags = EMOTE_MESSAGE|ALWAYS_SHOW_SELF_MESSAGE, - separation = space, - ) - else if(is_audible) - hologram.audible_message( - message = msg, - self_message = msg, - audible_message_flags = EMOTE_MESSAGE, - separation = space, - ) - else if(is_visual) - hologram.visible_message( - message = msg, - self_message = msg, - visible_message_flags = EMOTE_MESSAGE|ALWAYS_SHOW_SELF_MESSAGE, - separation = space, - ) - // DOPPLER EDIT ADDITION END - if(!isnull(user.client)) var/dchatmsg = "[user] [msg]" for(var/mob/ghost as anything in GLOB.dead_mob_list - viewers(get_turf(user))) diff --git a/code/datums/id_trim/_id_trim.dm b/code/datums/id_trim/_id_trim.dm index a64b71e357fd0..562232214b3d1 100644 --- a/code/datums/id_trim/_id_trim.dm +++ b/code/datums/id_trim/_id_trim.dm @@ -29,12 +29,6 @@ ///If set, IDs with this trim will give wearers arrows of different colors when pointing var/pointer_color -/datum/id_trim/proc/find_job() - for (var/datum/job/job as anything in SSjob.all_occupations) - if (job.title == assignment) - return job - return null - /// Returns the SecHUD job icon state for whatever this object's ID card is, if it has one. /obj/item/proc/get_sechud_job_icon_state() var/obj/item/card/id/id_card = GetID() diff --git a/code/datums/id_trim/jobs.dm b/code/datums/id_trim/jobs.dm index 0bb7dabe262cc..a42018406b2a5 100644 --- a/code/datums/id_trim/jobs.dm +++ b/code/datums/id_trim/jobs.dm @@ -24,7 +24,7 @@ /datum/id_trim/job/New() if(ispath(job)) - job = SSjob.get_job_type(job) + job = SSjob.GetJobType(job) if(isnull(job_changes)) job_changes = SSmapping.config.job_changes @@ -156,29 +156,6 @@ ) job = /datum/job/bartender -/datum/id_trim/job/pun_pun - assignment = "Busser" - trim_state = "trim_busser" - department_color = COLOR_SERVICE_LIME - subdepartment_color = COLOR_SERVICE_LIME - sechud_icon_state = SECHUD_BUSSER - minimal_access = list( - ACCESS_MINERAL_STOREROOM, - ACCESS_SERVICE, - ACCESS_THEATRE, - ) - extra_access = list( - ACCESS_HYDROPONICS, - ACCESS_KITCHEN, - ACCESS_BAR, - ) - template_access = list( - ACCESS_CAPTAIN, - ACCESS_CHANGE_IDS, - ACCESS_HOP, - ) - job = /datum/job/pun_pun - /datum/id_trim/job/bitrunner assignment = JOB_BITRUNNER trim_state = "trim_bitrunner" @@ -1093,7 +1070,7 @@ if(CONFIG_GET(number/depsec_access_level) == POPULATION_SCALED_ACCESS) var/minimal_security_officers = 3 // We do not spawn in any more lockers if there are 5 or less security officers, so let's keep it lower than that number. - var/datum/job/J = SSjob.get_job(JOB_SECURITY_OFFICER) + var/datum/job/J = SSjob.GetJob(JOB_SECURITY_OFFICER) if((J.spawn_positions - minimal_security_officers) <= 0) access |= elevated_access diff --git a/code/datums/memory/tattoo_kit.dm b/code/datums/memory/tattoo_kit.dm index 62b4d73be28ba..98d47eaa285d8 100644 --- a/code/datums/memory/tattoo_kit.dm +++ b/code/datums/memory/tattoo_kit.dm @@ -46,11 +46,11 @@ if(!tattoo_target) balloon_alert(tattoo_artist, "no limb to tattoo!") return - if(HAS_TRAIT_FROM(tattoo_target, TRAIT_NOT_ENGRAVABLE, ENGRAVED_TRAIT)) - balloon_alert(tattoo_artist, "bodypart already tattooed!") + if(HAS_TRAIT_FROM(tattoo_target, TRAIT_NOT_ENGRAVABLE, INNATE_TRAIT)) + balloon_alert(tattoo_artist, "bodypart cannot be engraved!") return - if(HAS_TRAIT(tattoo_target, TRAIT_NOT_ENGRAVABLE)) - balloon_alert(tattoo_artist, "bodypart cannot be tattooed!") + if(HAS_TRAIT_FROM(tattoo_target, TRAIT_NOT_ENGRAVABLE, TRAIT_GENERIC)) + balloon_alert(tattoo_artist, "bodypart has already been engraved!") return var/datum/memory/memory_to_tattoo = tattoo_artist.mind.select_memory("tattoo") if(!memory_to_tattoo || !tattoo_artist.Adjacent(tattoo_holder) || !tattoo_holder.get_bodypart(selected_zone)) diff --git a/code/datums/mind/_mind.dm b/code/datums/mind/_mind.dm index 397a1c5b13afa..36e9d7ba6d024 100644 --- a/code/datums/mind/_mind.dm +++ b/code/datums/mind/_mind.dm @@ -106,7 +106,7 @@ /datum/mind/New(_key) key = _key init_known_skills() - set_assigned_role(SSjob.get_job_type(/datum/job/unassigned)) // Unassigned by default. + set_assigned_role(SSjob.GetJobType(/datum/job/unassigned)) // Unassigned by default. /datum/mind/Destroy() SSticker.minds -= src @@ -251,7 +251,7 @@ var/new_role = input("Select new role", "Assigned role", assigned_role.title) as null|anything in sort_list(SSjob.name_occupations) if(isnull(new_role)) return - var/datum/job/new_job = SSjob.get_job(new_role) + var/datum/job/new_job = SSjob.GetJob(new_role) if (!new_job) to_chat(usr, span_warning("Job not found.")) return diff --git a/code/datums/mind/antag.dm b/code/datums/mind/antag.dm index ca10f3afe2071..11340ae56a6b4 100644 --- a/code/datums/mind/antag.dm +++ b/code/datums/mind/antag.dm @@ -286,7 +286,7 @@ /datum/mind/proc/make_wizard() if(has_antag_datum(/datum/antagonist/wizard)) return - set_assigned_role(SSjob.get_job_type(/datum/job/space_wizard)) + set_assigned_role(SSjob.GetJobType(/datum/job/space_wizard)) special_role = ROLE_WIZARD add_antag_datum(/datum/antagonist/wizard) diff --git a/code/datums/mind/initialization.dm b/code/datums/mind/initialization.dm index e3b3e8225dc7a..eb622cc5af549 100644 --- a/code/datums/mind/initialization.dm +++ b/code/datums/mind/initialization.dm @@ -21,17 +21,17 @@ //AI /mob/living/silicon/ai/mind_initialize() . = ..() - mind.set_assigned_role(SSjob.get_job_type(/datum/job/ai)) + mind.set_assigned_role(SSjob.GetJobType(/datum/job/ai)) //BORG /mob/living/silicon/robot/mind_initialize() . = ..() - mind.set_assigned_role(SSjob.get_job_type(/datum/job/cyborg)) + mind.set_assigned_role(SSjob.GetJobType(/datum/job/cyborg)) //PAI /mob/living/silicon/pai/mind_initialize() . = ..() - mind.set_assigned_role(SSjob.get_job_type(/datum/job/personal_ai)) + mind.set_assigned_role(SSjob.GetJobType(/datum/job/personal_ai)) mind.special_role = "" diff --git a/code/datums/mood.dm b/code/datums/mood.dm index cffd955635817..3834ea866b8da 100644 --- a/code/datums/mood.dm +++ b/code/datums/mood.dm @@ -406,7 +406,7 @@ clear_mood_event(MOOD_CATEGORY_AREA_BEAUTY) return - if(HAS_MIND_TRAIT(mob_parent, TRAIT_MORBID)) + if(HAS_TRAIT(mob_parent, TRAIT_MORBID)) if(HAS_TRAIT(mob_parent, TRAIT_SNOB)) switch(area_to_beautify.beauty) if(BEAUTY_LEVEL_DECENT to BEAUTY_LEVEL_GOOD) diff --git a/code/datums/mood_events/food_events.dm b/code/datums/mood_events/food_events.dm index e64d975902ea7..7d33e7e57ce06 100644 --- a/code/datums/mood_events/food_events.dm +++ b/code/datums/mood_events/food_events.dm @@ -49,8 +49,3 @@ /datum/mood_event/food/top quality = FOOD_QUALITY_TOP - -/datum/mood_event/pacifist_eating_fish_item - description = "I shouldn't be eating living creatures..." - mood_change = -1 //The disgusting food moodlet already has a pretty big negative value, this is just for context. - timeout = 4 MINUTES diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index cdd28c1855ee8..54b276fa71a3d 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -333,34 +333,9 @@ /datum/mood_event/fishing description = "Fishing is relaxing." - mood_change = 4 + mood_change = 5 timeout = 3 MINUTES -/datum/mood_event/fish_released - description = "Go, fish, swim and be free!" - mood_change = 1 - timeout = 2 MINUTES - -/datum/mood_event/fish_released/add_effects(morbid, obj/item/fish/fish) - if(!morbid) - description = "Go, [fish.name], swim and be free!" - return - if(fish.status == FISH_DEAD) - description = "Some scavenger will surely find a use for the remains of [fish.name]. How pragmatic." - else - description = "Returned to the burden of the deep. But is this truly a mercy, [fish.name]? There will always be bigger fish..." - -/datum/mood_event/fish_petting - description = "It felt nice to pet the fish." - mood_change = 2 - timeout = 2 MINUTES - -/datum/mood_event/fish_petting/add_effects(obj/item/fish/fish, morbid) - if(!morbid) - description = "It felt nice to pet \the [fish]." - else - description = "I caress \the [fish] as [fish.p_they()] squirms under my touch, blissfully unaware of how cruel this world is." - /datum/mood_event/kobun description = "You are all loved by the Universe. I’m not alone, and you aren’t either." mood_change = 14 diff --git a/code/datums/proximity_monitor/field.dm b/code/datums/proximity_monitor/field.dm index 3ba3017bed0a5..e3f0ade5e7dba 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,11 +62,12 @@ for(var/turf/new_turf as anything in field_turfs - old_field_turfs) if(QDELETED(src)) return + field_turfs += new_turf setup_field_turf(new_turf) - for(var/turf/new_turf as anything in edge_turfs - old_edge_turfs) if(QDELETED(src)) return + edge_turfs += new_turf setup_edge_turf(new_turf) /datum/proximity_monitor/advanced/on_initialized(turf/location, atom/created, init_flags) diff --git a/code/datums/quirks/neutral_quirks/vegetarian.dm b/code/datums/quirks/neutral_quirks/vegetarian.dm index 0568e2f1e2293..0ade72acafe57 100644 --- a/code/datums/quirks/neutral_quirks/vegetarian.dm +++ b/code/datums/quirks/neutral_quirks/vegetarian.dm @@ -7,4 +7,17 @@ lose_text = span_notice("You feel like eating meat isn't that bad.") medical_record_text = "Patient reports a vegetarian diet." mail_goodies = list(/obj/effect/spawner/random/food_or_drink/salad) - mob_trait = TRAIT_VEGETARIAN + +/datum/quirk/vegetarian/add(client/client_source) + var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) + if(!tongue) + return + tongue.liked_foodtypes &= ~MEAT + tongue.disliked_foodtypes |= MEAT + +/datum/quirk/vegetarian/remove() + var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE) + if(!tongue) + return + tongue.liked_foodtypes = initial(tongue.liked_foodtypes) + tongue.disliked_foodtypes = initial(tongue.disliked_foodtypes) diff --git a/code/datums/records/manifest.dm b/code/datums/records/manifest.dm index afc5cef6aa4ec..fc2bb30ce8d32 100644 --- a/code/datums/records/manifest.dm +++ b/code/datums/records/manifest.dm @@ -31,7 +31,7 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new) var/name = target.name var/rank = target.rank // user-visible job var/trim = target.trim // internal jobs by trim type - var/datum/job/job = SSjob.get_job(trim) + var/datum/job/job = SSjob.GetJob(trim) if(!job || !(job.job_flags & JOB_CREW_MANIFEST) || !LAZYLEN(job.departments_list)) // In case an unlawful custom rank is added. var/list/misc_list = manifest_out[DEPARTMENT_UNASSIGNED] misc_list[++misc_list.len] = list( diff --git a/code/datums/ruins/icemoon.dm b/code/datums/ruins/icemoon.dm index d6317b12ab15c..2445b4da242e6 100644 --- a/code/datums/ruins/icemoon.dm +++ b/code/datums/ruins/icemoon.dm @@ -64,7 +64,7 @@ /datum/map_template/ruin/icemoon/frozen_phonebooth name = "Ice-Ruin Frozen Phonebooth" id = "frozen_phonebooth" - description = "A venture by Nanotrasen to help popularize the use of holopads. This one was sent to a icemoon." + description = "A venture by nanotrasen to help popularize the use of holopads. This one was sent to a icemoon." suffix = "icemoon_surface_phonebooth.dmm" /datum/map_template/ruin/icemoon/smoking_room @@ -172,12 +172,6 @@ description = "Radio signals are being detected and the source is this completely innocent pile of snow." suffix = "icemoon_underground_comms_agent.dmm" -/datum/map_template/ruin/icemoon/underground/syndie_lab - name = "Ice-Ruin Syndicate Lab" - id = "syndie_lab" - description = "A small laboratory and living space for Syndicate agents." - suffix = "icemoon_underground_syndielab.dmm" - //TODO: Bottom-Level ONLY Spawns after Refactoring Related Code /datum/map_template/ruin/icemoon/underground/plasma_facility name = "Ice-Ruin Abandoned Plasma Facility" diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index fb2d1d44c0c08..bb5f58500e2d1 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -278,7 +278,7 @@ /datum/map_template/ruin/lavaland/lava_phonebooth name = "Lava-Ruin Phonebooth" id = "lava_phonebooth" - description = "A venture by Nanotrasen to help popularize the use of holopads. This one somehow made its way here." + description = "A venture by nanotrasen to help popularize the use of holopads. This one somehow made its way here." suffix = "lavaland_surface_phonebooth.dmm" allow_duplicates = FALSE cost = 5 diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index 790ae33ade4b1..e3ff61fad6c25 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -49,7 +49,7 @@ id = "asteroid6" suffix = "asteroid6.dmm" name = "Space-Ruin Asteroid 6" - description = "This asteroid has brittle bone disease, so it is fortunate asteroids don't have bones." + description = "This asteroid has brittle bone disease, so it is fortunate asteroids dont have bones." /datum/map_template/ruin/space/deep_storage id = "deep-storage" @@ -70,7 +70,7 @@ suffix = "derelict_construction.dmm" name = "Space-Ruin Derelict Construction" description = "Construction supplies are in high demand due to non-trivial damage routinely sustained by most space stations in this sector. \ - Space pirates who don't attempt to rob corporate research stations with only 3 collaborators live long enough to sell captured construction \ + Space pirates who dont attempt to rob corporate research stations with only 3 collaborators live long enough to sell captured construction \ equipment back to the highest bidder." /datum/map_template/ruin/space/derelict_sulaco @@ -181,7 +181,7 @@ id = "spacehotel" suffix = "spacehotel.dmm" name = "Space-Ruin The Twin-Nexus Hotel" - description = "An interstellar hotel, where the weary spaceman can rest their head and relax, assured that the residential staff will not murder them in their sleep. Probably." + description = "An interstellar hotel, where the weary spaceman can rest their head and relax, assured that the residental staff will not murder them in their sleep. Probably." /datum/map_template/ruin/space/turreted_outpost id = "turreted-outpost" @@ -470,7 +470,7 @@ id = "Space_phonebooth" suffix = "phonebooth.dmm" name = "Space-Ruin Phonebooth" - description = "A venture by Nanotrasen to help popularize the use of holopads." + description = "A venture by nanotrasen to help popularize the use of holopads." /datum/map_template/ruin/space/the_outlet id = "the_outlet" @@ -500,7 +500,7 @@ id = "garbagetruck3" suffix = "garbagetruck3.dmm" name = "Space-Ruin Decommissioned Garbage Truck NX3" - description = "An NX-760 interstellar transport barge. At the end of their life cycle, they are often filled with trash and launched into unexplored space to become someone else's problem. This one is full of industrial garbage, and a Russian drug den." + description = "An NX-760 interstellar transport barge. At the end of their life cycle, they are often filled with trash and launched into unexplored space to become someone else's problem. This one is full of industrial garbage, and a russian drug den." /datum/map_template/ruin/space/garbagetruck4 id = "garbagetruck4" diff --git a/code/datums/shuttles/_shuttle.dm b/code/datums/shuttles/_shuttle.dm index 94c20d41b7365..0100a3d85da3d 100644 --- a/code/datums/shuttles/_shuttle.dm +++ b/code/datums/shuttles/_shuttle.dm @@ -14,7 +14,7 @@ var/description /// The recommended occupancy limit for the shuttle (count chairs, beds, and benches then round to 5) var/occupancy_limit - /// Description of the prerequisite that has to be achieved for the shuttle to be purchased + /// Description of the prerequisition that has to be achieved for the shuttle to be purchased var/prerequisites /// Shuttle warnings and hazards to the admin who spawns the shuttle var/admin_notes @@ -40,7 +40,7 @@ . = ..() /datum/map_template/shuttle/preload_size(path, cache) - . = ..(path, TRUE) // Done this way because we still want to know if someone actually wanted to cache the map + . = ..(path, TRUE) // Done this way because we still want to know if someone actualy wanted to cache the map if(!cached_map) return diff --git a/code/datums/shuttles/emergency.dm b/code/datums/shuttles/emergency.dm index 2af1a238a7258..42e3566ccfef1 100644 --- a/code/datums/shuttles/emergency.dm +++ b/code/datums/shuttles/emergency.dm @@ -90,7 +90,7 @@ suffix = "bar" name = "The Emergency Escape Bar" description = "Features include sentient bar staff (a Bardrone and a Barmaid), bathroom, a quality lounge for the heads, and a large gathering table." - admin_notes = "Bardrone and Barmaid have TRAIT_GODMODE (basically invincibility), will be automatically sentienced by the fun balloon at 60 seconds before arrival. \ + admin_notes = "Bardrone and Barmaid are GODMODE, will be automatically sentienced by the fun balloon at 60 seconds before arrival. \ Has medical facilities." credit_cost = CARGO_CRATE_VALUE * 10 occupancy_limit = "30" @@ -164,7 +164,7 @@ /datum/map_template/shuttle/emergency/arena suffix = "arena" name = "The Arena" - description = "The crew must pass through an otherworldly arena to board this shuttle. Expect massive casualties." + description = "The crew must pass through an otherworldy arena to board this shuttle. Expect massive casualties." prerequisites = "The source of the Bloody Signal must be tracked down and eliminated to unlock this shuttle." admin_notes = "RIP AND TEAR." credit_cost = CARGO_CRATE_VALUE * 20 @@ -241,7 +241,7 @@ suffix = "kilo" name = "Kilo Station Emergency Shuttle" credit_cost = CARGO_CRATE_VALUE * 10 - description = "A fully functional shuttle including a complete infirmary, storage facilities and regular amenities." + description = "A fully functional shuttle including a complete infirmary, storage facilties and regular amenities." occupancy_limit = "55" /datum/map_template/shuttle/emergency/mini @@ -400,15 +400,15 @@ /datum/map_template/shuttle/emergency/monkey suffix = "nature" name = "Dynamic Environmental Interaction Shuttle" - description = "A large shuttle with a center biodome that is flourishing with life. Frolic with the monkeys! (Extra monkeys are stored on the bridge.)" - admin_notes = "Pretty freakin' large, almost as big as Raven or Cere. Exercise caution with it." + description = "A large shuttle with a center biodome that is flourishing with life. Frolick with the monkeys! (Extra monkeys are stored on the bridge.)" + admin_notes = "Pretty freakin' large, almost as big as Raven or Cere. Excercise caution with it." credit_cost = CARGO_CRATE_VALUE * 16 occupancy_limit = "45" /datum/map_template/shuttle/emergency/casino suffix = "casino" name = "Lucky Jackpot Casino Shuttle" - description = "A luxurious casino packed to the brim with everything you need to start new gambling addictions!" + description = "A luxurious casino packed to the brim with everything you need to start new gambling addicitions!" admin_notes = "The ship is a bit chunky, so watch where you park it." credit_cost = 7777 occupancy_limit = "85" @@ -424,7 +424,7 @@ /datum/map_template/shuttle/emergency/fish suffix = "fish" name = "Angler's Choice Emergency Shuttle" - description = "Trades such amenities as 'storage space' and 'sufficient seating' for an artificial environment ideal for fishing, plus ample supplies (also for fishing)." + description = "Trades such amenities as 'storage space' and 'sufficient seating' for an artifical environment ideal for fishing, plus ample supplies (also for fishing)." admin_notes = "There's a chasm in it, it has railings but that won't stop determined players." credit_cost = CARGO_CRATE_VALUE * 10 occupancy_limit = "35" diff --git a/code/datums/station_traits/_station_trait.dm b/code/datums/station_traits/_station_trait.dm index ddd8bc20a9110..ef91a183d9f27 100644 --- a/code/datums/station_traits/_station_trait.dm +++ b/code/datums/station_traits/_station_trait.dm @@ -33,10 +33,10 @@ GLOBAL_LIST_EMPTY(lobby_station_traits) var/list/lobby_buttons = list() /// The ID that we look for in dynamic.json. Not synced with 'name' because I can already see this go wrong var/dynamic_threat_id - /// If ran during dynamic, do we reduce the total threat? Will be overridden by config if set + /// If ran during dynamic, do we reduce the total threat? Will be overriden by config if set var/threat_reduction = 0 - /// Which ruleset flags to allow dynamic to use. NONE to disregard - var/dynamic_category = NONE + /// Which ruleset flags to allow dynamic to use. null to disregard + var/dynamic_category = null /// Trait should not be instantiated in a round if its type matches this type var/abstract_type = /datum/station_trait @@ -51,19 +51,15 @@ GLOBAL_LIST_EMPTY(lobby_station_traits) GLOB.dynamic_ruleset_categories = dynamic_category if(sign_up_button) GLOB.lobby_station_traits += src - if(SSstation.initialized) - SSstation.display_lobby_traits() if(trait_processes) START_PROCESSING(SSstation, src) if(trait_to_give) ADD_TRAIT(SSstation, trait_to_give, STATION_TRAIT) /datum/station_trait/Destroy() - destroy_lobby_buttons() SSstation.station_traits -= src - GLOB.lobby_station_traits -= src - GLOB.dynamic_station_traits -= src - REMOVE_TRAIT(SSstation, trait_to_give, STATION_TRAIT) + GLOB.dynamic_station_traits.Remove(src) + destroy_lobby_buttons() return ..() /// Returns the type of info the centcom report has on this trait, if any. @@ -129,15 +125,13 @@ GLOBAL_LIST_EMPTY(lobby_station_traits) /// Remove all of our active lobby buttons /datum/station_trait/proc/destroy_lobby_buttons() for (var/atom/movable/screen/button as anything in lobby_buttons) - var/mob/dead/new_player/hud_owner = button.get_mob() + var/mob/hud_owner = button.get_mob() + qdel(button) if (QDELETED(hud_owner)) - qdel(button) - continue - var/datum/hud/new_player/using_hud = hud_owner.hud_used - if(!using_hud) - qdel(button) continue - using_hud.remove_station_trait_button(src) + var/datum/hud/using_hud = hud_owner.hud_used + using_hud?.show_hud(using_hud?.hud_version) + lobby_buttons = list() /// Called when overriding a pulsar star command report message. /datum/station_trait/proc/get_pulsar_message() diff --git a/code/datums/station_traits/job_traits.dm b/code/datums/station_traits/job_traits.dm index b23a694cfdec9..f2bd456aaee77 100644 --- a/code/datums/station_traits/job_traits.dm +++ b/code/datums/station_traits/job_traits.dm @@ -41,10 +41,6 @@ else LAZYADD(lobby_candidates, user) -/datum/station_trait/job/on_lobby_button_destroyed(atom/movable/screen/lobby/button/sign_up/lobby_button) - . = ..() - LAZYREMOVE(lobby_candidates, lobby_button.get_mob()) - /datum/station_trait/job/on_lobby_button_update_icon(atom/movable/screen/lobby/button/sign_up/lobby_button, updates) if (LAZYFIND(lobby_candidates, lobby_button.get_mob())) lobby_button.base_icon_state = "signup_on" @@ -65,7 +61,7 @@ if (isnull(signee) || !signee.client || !signee.mind || signee.ready != PLAYER_READY_TO_PLAY) LAZYREMOVE(lobby_candidates, signee) - var/datum/job/our_job = SSjob.get_job_type(job_to_add) + var/datum/job/our_job = SSjob.GetJobType(job_to_add) our_job.total_positions = position_amount our_job.spawn_positions = position_amount while(length(lobby_candidates) && position_amount > 0) @@ -77,14 +73,14 @@ lobby_candidates = null /datum/station_trait/job/can_display_lobby_button(client/player) - var/datum/job/our_job = SSjob.get_job_type(job_to_add) + var/datum/job/our_job = SSjob.GetJobType(job_to_add) return our_job.player_old_enough(player) && ..() /// Adds a gorilla to the cargo department, replacing the sloth and the mech /datum/station_trait/job/cargorilla name = "Cargo Gorilla" button_desc = "Sign up to become the Cargo Gorilla, a peaceful shepherd of boxes." - weight = 0 + weight = 1 show_in_report = FALSE // Selective attention test. Did you spot the gorilla? can_roll_antag = CAN_ROLL_NEVER job_to_add = /datum/job/cargo_gorilla @@ -247,26 +243,6 @@ qdel(thing_on_table) new /obj/machinery/fax/auto_name(picked_turf) -/datum/station_trait/job/pun_pun - name = "Pun Pun is a Crewmember" - button_desc = "Ook ook ah ah, sign up to play as the bartender's monkey." - weight = 0 //Unrollable by default, available all day during monkey day. - report_message = "We've evaluated the bartender's monkey to have the mental capacity of the average crewmember. As such, we made them one." - show_in_report = TRUE - can_roll_antag = CAN_ROLL_ALWAYS - job_to_add = /datum/job/pun_pun - -/datum/station_trait/job/pun_pun/New() - . = ..() - if(!SSticker.HasRoundStarted() || !GLOB.the_one_and_only_punpun) //Make sure we don't have two Pun Puns if loaded before the start of the round. - return - new /obj/effect/landmark/start/pun_pun(GLOB.the_one_and_only_punpun.loc) - qdel(GLOB.the_one_and_only_punpun) - -/datum/station_trait/job/pun_pun/on_lobby_button_update_overlays(atom/movable/screen/lobby/button/sign_up/lobby_button, list/overlays) - . = ..() - overlays += LAZYFIND(lobby_candidates, lobby_button.get_mob()) ? "pun_pun_on" : "pun_pun_off" - #undef CAN_ROLL_ALWAYS #undef CAN_ROLL_PROTECTED #undef CAN_ROLL_NEVER diff --git a/code/datums/station_traits/negative_traits.dm b/code/datums/station_traits/negative_traits.dm index fc7fd4c01ef7f..83d1bfa14f4c9 100644 --- a/code/datums/station_traits/negative_traits.dm +++ b/code/datums/station_traits/negative_traits.dm @@ -26,7 +26,7 @@ report_message = "Due to an ongoing strike announced by the postal workers union, mail won't be delivered this shift." /datum/station_trait/mail_blocked/on_round_start() - //This is either a holiday or Sunday... well then, let's flip the situation. + //This is either a holiday or sunday... well then, let's flip the situation. if(SSeconomy.mail_blocked) name = "Postal system overtime" report_message = "Despite being a day off, the postal system is working overtime today. Mail will be delivered this shift." @@ -343,7 +343,7 @@ /datum/station_trait/random_event_weight_modifier/dust_storms name = "Dust Stormfront" - report_message = "The space around your station is clouded by heavy pockets of space dust. Expect an increased likelihood of space dust storms damaging the station hull." + report_message = "The space around your station is clouded by heavy pockets of space dust. Expect an increased likelyhood of space dust storms damaging the station hull." trait_type = STATION_TRAIT_NEGATIVE weight = 2 cost = STATION_TRAIT_COST_LOW @@ -614,10 +614,10 @@ //Send a nebula shielding unit to engineering var/datum/supply_pack/supply_pack_shielding = new /datum/supply_pack/engineering/rad_nebula_shielding_kit() if(!send_supply_pod_to_area(supply_pack_shielding.generate(null), /area/station/engineering/main, /obj/structure/closet/supplypod/centcompod)) - //if engineering isn't valid, just send it to the bridge + //if engineering isnt valid, just send it to the bridge send_supply_pod_to_area(supply_pack_shielding.generate(null), /area/station/command/bridge, /obj/structure/closet/supplypod/centcompod) - // Let medical know resistance is futile + // Let medical know resistence is futile if (/area/station/medical/virology in GLOB.areas_by_type) send_fax_to_area( new /obj/item/paper/fluff/radiation_nebula_virologist, @@ -656,7 +656,7 @@ if(!istype(get_area(spawned_mob), radioactive_areas)) //only if you're spawned in the radioactive areas return - if(!isliving(spawned_mob)) // Dynamic shouldn't spawn non-living but uhhhhhhh why not + if(!isliving(spawned_mob)) // Dynamic shouldnt spawn non-living but uhhhhhhh why not return var/mob/living/spawnee = spawned_mob @@ -696,7 +696,7 @@ /datum/station_trait/nebula/hostile/radiation/send_instructions() var/obj/machinery/nebula_shielding/shielder = /obj/machinery/nebula_shielding/radiation var/obj/machinery/gravity_generator/main/innate_shielding = /obj/machinery/gravity_generator/main - //How long do we have until the first shielding unit needs to be up? + //How long do we have untill the first shielding unit needs to be up? var/deadline = "[(initial(innate_shielding.radioactive_nebula_shielding) * intensity_increment_time) / (1 MINUTES)] minute\s" //For how long each shielding unit will protect for var/shielder_time = "[(initial(shielder.shielding_strength) * intensity_increment_time) / (1 MINUTES)] minute\s" diff --git a/code/datums/station_traits/positive_traits.dm b/code/datums/station_traits/positive_traits.dm index 052a8177345c7..945fbe06934bc 100644 --- a/code/datums/station_traits/positive_traits.dm +++ b/code/datums/station_traits/positive_traits.dm @@ -285,7 +285,6 @@ /datum/job/paramedic = /obj/item/organ/internal/cyberimp/eyes/hud/medical, /datum/job/prisoner = /obj/item/organ/internal/eyes/robotic/shield, /datum/job/psychologist = /obj/item/organ/internal/ears/cybernetic/whisper, - /datum/job/pun_pun = /obj/item/organ/internal/cyberimp/arm/strongarm, /datum/job/quartermaster = /obj/item/organ/internal/stomach/cybernetic/tier3, /datum/job/research_director = /obj/item/organ/internal/cyberimp/bci, /datum/job/roboticist = /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic, diff --git a/code/datums/status_effects/debuffs/fire_stacks.dm b/code/datums/status_effects/debuffs/fire_stacks.dm index ae7f73d4e0de0..c2ca39b638726 100644 --- a/code/datums/status_effects/debuffs/fire_stacks.dm +++ b/code/datums/status_effects/debuffs/fire_stacks.dm @@ -227,9 +227,8 @@ amount_to_heat = amount_to_heat ** (BODYTEMP_FIRE_TEMP_SOFTCAP / owner.bodytemperature) victim.adjust_bodytemperature(amount_to_heat) - if (!(HAS_TRAIT(victim, TRAIT_RESISTHEAT))) - victim.add_mood_event("on_fire", /datum/mood_event/on_fire) - victim.add_mob_memory(/datum/memory/was_burning) + victim.add_mood_event("on_fire", /datum/mood_event/on_fire) + victim.add_mob_memory(/datum/memory/was_burning) /** * Handles mob ignition, should be the only way to set on_fire to TRUE diff --git a/code/datums/status_effects/debuffs/genetic_damage.dm b/code/datums/status_effects/debuffs/genetic_damage.dm index 91cfc593fcc41..9a6944090775e 100644 --- a/code/datums/status_effects/debuffs/genetic_damage.dm +++ b/code/datums/status_effects/debuffs/genetic_damage.dm @@ -34,7 +34,7 @@ /datum/status_effect/genetic_damage/tick(seconds_between_ticks) if(ismonkey(owner) && total_damage >= GORILLA_MUTATION_MINIMUM_DAMAGE && SPT_PROB(GORILLA_MUTATION_CHANCE_PER_SECOND, seconds_between_ticks)) var/mob/living/carbon/carbon_owner = owner - carbon_owner.gorillize(genetics_gorilla = TRUE) + carbon_owner.gorillize() qdel(src) return diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm index e5a7f3ee0f5a8..a282242df7568 100644 --- a/code/datums/storage/storage.dm +++ b/code/datums/storage/storage.dm @@ -826,6 +826,10 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) return if(!iscarbon(user) && !isdrone(user)) return + var/mob/living/user_living = user + if(user_living.incapacitated) + return + attempt_insert(dropping, user) return COMPONENT_CANCEL_MOUSEDROPPED_ONTO diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm index 9bf17c7a9dc76..8a1cfff765733 100644 --- a/code/datums/weather/weather_types/radiation_storm.dm +++ b/code/datums/weather/weather_types/radiation_storm.dm @@ -34,28 +34,28 @@ status_alarm(TRUE) -/datum/weather/rad_storm/weather_act(mob/living/living) +/datum/weather/rad_storm/weather_act(mob/living/L) if(!prob(mutate_chance)) return - if(!ishuman(living) || HAS_TRAIT(living, TRAIT_GODMODE)) + if(!ishuman(L)) return - var/mob/living/carbon/human/human = living - if(!human.can_mutate()) + var/mob/living/carbon/human/H = L + if(!H.can_mutate() || H.status_flags & GODMODE) return - if(HAS_TRAIT(human, TRAIT_RADIMMUNE)) + if(HAS_TRAIT(H, TRAIT_RADIMMUNE)) return - if (SSradiation.wearing_rad_protected_clothing(human)) + if (SSradiation.wearing_rad_protected_clothing(H)) return - human.random_mutate_unique_identity() - human.random_mutate_unique_features() + H.random_mutate_unique_identity() + H.random_mutate_unique_features() if(prob(50)) - do_mutate(human) + do_mutate(L) /datum/weather/rad_storm/end() if(..()) diff --git a/code/datums/weather/weather_types/void_storm.dm b/code/datums/weather/weather_types/void_storm.dm index 617e3ff0230fd..90cc7d44cfbe1 100644 --- a/code/datums/weather/weather_types/void_storm.dm +++ b/code/datums/weather/weather_types/void_storm.dm @@ -6,7 +6,7 @@ telegraph_overlay = "light_snow" weather_message = span_hypnophrase("You feel the air around you getting colder... and void's sweet embrace...") - weather_overlay = "light_snow" + weather_overlay = "snow_storm" weather_color = COLOR_BLACK weather_duration_lower = 60 SECONDS weather_duration_upper = 120 SECONDS @@ -19,5 +19,31 @@ protect_indoors = FALSE target_trait = ZTRAIT_VOIDSTORM + immunity_type = TRAIT_VOIDSTORM_IMMUNE + barometer_predictable = FALSE perpetual = TRUE + + /// List of areas that were once impacted areas but are not anymore. Used for updating the weather overlay based whether the ascended heretic is in the area. + var/list/former_impacted_areas = list() + +/datum/weather/void_storm/can_weather_act(mob/living/mob_to_check) + . = ..() + if(IS_HERETIC_OR_MONSTER(mob_to_check)) + return FALSE + +/datum/weather/void_storm/weather_act(mob/living/victim) + var/need_mob_update = FALSE + need_mob_update += victim.adjustFireLoss(1, updating_health = FALSE) + need_mob_update += victim.adjustOxyLoss(rand(1, 3), updating_health = FALSE) + if(need_mob_update) + victim.updatehealth() + victim.adjust_eye_blur(rand(0 SECONDS, 2 SECONDS)) + victim.adjust_bodytemperature(-30 * TEMPERATURE_DAMAGE_COEFFICIENT) + +// Goes through former_impacted_areas and sets the overlay of each back to the telegraph overlay, to indicate the ascended heretic is no longer in that area. +/datum/weather/void_storm/update_areas() + for(var/area/former_area as anything in former_impacted_areas) + former_area.icon_state = telegraph_overlay + former_impacted_areas -= former_area + return ..() diff --git a/code/datums/wounds/_wound_static_data.dm b/code/datums/wounds/_wound_static_data.dm index adc0923ee4f0a..f8b03d1856b5d 100644 --- a/code/datums/wounds/_wound_static_data.dm +++ b/code/datums/wounds/_wound_static_data.dm @@ -95,7 +95,7 @@ if (random_roll && !can_be_randomly_generated) return FALSE - if (HAS_TRAIT(limb.owner, TRAIT_NEVER_WOUNDED) || HAS_TRAIT(limb.owner, TRAIT_GODMODE)) + if (HAS_TRAIT(limb.owner, TRAIT_NEVER_WOUNDED) || (limb.owner.status_flags & GODMODE)) return FALSE if (!wounding_types_valid(suggested_wounding_types)) diff --git a/code/game/area/areas/centcom.dm b/code/game/area/areas/centcom.dm index 28b3496c4e18a..012e7a170f726 100644 --- a/code/game/area/areas/centcom.dm +++ b/code/game/area/areas/centcom.dm @@ -124,7 +124,6 @@ /area/centcom/tdome/arena name = "Thunderdome Arena" icon_state = "thunder" - area_flags = parent_type::area_flags | UNLIMITED_FISHING //for possible testing purposes /area/centcom/tdome/tdome1 name = "Thunderdome (Team 1)" diff --git a/code/game/area/areas/ruins/icemoon.dm b/code/game/area/areas/ruins/icemoon.dm index 061bd8f06d209..d0049e7007c49 100644 --- a/code/game/area/areas/ruins/icemoon.dm +++ b/code/game/area/areas/ruins/icemoon.dm @@ -75,7 +75,3 @@ /area/ruin/powered/hermit name = "\improper Hermit's Cabin" -/area/ruin/syndielab - name = "\improper Syndicate Lab" - ambience_index = AMBIENCE_DANGER - sound_environment = SOUND_ENVIRONMENT_CAVE diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index ca4ae5635797a..9c1f69af47e23 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -690,10 +690,10 @@ created_atoms.Add(created_atom) to_chat(user, span_notice("You manage to create [amount_to_create] [initial(atom_to_create.gender) == PLURAL ? "[initial(atom_to_create.name)]" : "[initial(atom_to_create.name)][plural_s(initial(atom_to_create.name))]"] from [src].")) SEND_SIGNAL(src, COMSIG_ATOM_PROCESSED, user, process_item, created_atoms) - UsedforProcessing(user, process_item, chosen_option, created_atoms) + UsedforProcessing(user, process_item, chosen_option) return -/atom/proc/UsedforProcessing(mob/living/user, obj/item/used_item, list/chosen_option, list/created_atoms) +/atom/proc/UsedforProcessing(mob/living/user, obj/item/used_item, list/chosen_option) qdel(src) return diff --git a/code/game/atom/alternate_appearance.dm b/code/game/atom/alternate_appearance.dm index 8c50760ea45ea..108b72b95d286 100644 --- a/code/game/atom/alternate_appearance.dm +++ b/code/game/atom/alternate_appearance.dm @@ -212,10 +212,3 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) return ..() /datum/atom_hud/alternate_appearance/basic/food_demands - -/datum/atom_hud/alternate_appearance/basic/heretic - -/datum/atom_hud/alternate_appearance/basic/heretic/mobShouldSee(mob/M) - if(IS_HERETIC(M)) - return TRUE - return FALSE diff --git a/code/game/atom/atom_examine.dm b/code/game/atom/atom_examine.dm index fee219f7b4b50..0a2a51dc297d4 100644 --- a/code/game/atom/atom_examine.dm +++ b/code/game/atom/atom_examine.dm @@ -24,15 +24,12 @@ if(desc) . += "[desc]" - var/list/tags_list = examine_tags(user) - if (length(tags_list)) - var/tag_string = list() - for (var/atom_tag in tags_list) - tag_string += (isnull(tags_list[atom_tag]) ? atom_tag : span_tooltip(tags_list[atom_tag], atom_tag)) - // Weird bit but ensures that if the final element has its own "and" we don't add another one - tag_string = english_list(tag_string, and_text = (findtext(tag_string[length(tag_string)], " and ")) ? ", " : " and ") - var/post_descriptor = examine_post_descriptor(user) - . += "[p_They()] [p_are()] a [tag_string] [examine_descriptor(user)][length(post_descriptor) ? " [jointext(post_descriptor, " ")]" : ""]." + if(custom_materials) + var/list/materials_list = list() + for(var/custom_material in custom_materials) + var/datum/material/current_material = GET_MATERIAL_REF(custom_material) + materials_list += "[current_material.name]" + . += "It is made out of [english_list(materials_list)]." if(reagents) var/user_sees_reagents = user.can_see_reagents() @@ -58,34 +55,6 @@ SEND_SIGNAL(src, COMSIG_ATOM_EXAMINE, user, .) -/* - * A list of "tags" displayed after atom's description in examine. - * This should return an assoc list of tags -> tooltips for them. If item if null, then no tooltip is assigned. - * For example: - * list("small" = "This is a small size class item.", "fireproof" = "This item is impervious to fire.") - * will result in - * This is a small, fireproof item. - * where "item" is pulled from examine_descriptor() proc - */ -/atom/proc/examine_tags(mob/user) - . = list() - SEND_SIGNAL(src, COMSIG_ATOM_EXAMINE_TAGS, user, .) - -/// What this atom should be called in examine tags -/atom/proc/examine_descriptor(mob/user) - return "object" - -/// Returns a list of strings to be displayed after the descriptor -/atom/proc/examine_post_descriptor(mob/user) - . = list() - if(!custom_materials) - return - var/mats_list = list() - for(var/custom_material in custom_materials) - var/datum/material/current_material = GET_MATERIAL_REF(custom_material) - mats_list += span_tooltip("It is made out of [current_material.name].", current_material.name) - . += "made of [english_list(mats_list)]" - /** * Called when a mob examines (shift click or verb) this atom twice (or more) within EXAMINE_MORE_WINDOW (default 1 second) * diff --git a/code/game/atom/atom_tool_acts.dm b/code/game/atom/atom_tool_acts.dm index 94f096abe5236..3a89b62ccb034 100644 --- a/code/game/atom/atom_tool_acts.dm +++ b/code/game/atom/atom_tool_acts.dm @@ -1,7 +1,7 @@ /** * ## Item interaction * - * Handles non-combat interactions of a tool on this atom, + * Handles non-combat iteractions of a tool on this atom, * such as using a tool on a wall to deconstruct it, * or scanning someone with a health analyzer */ @@ -69,7 +69,7 @@ * * Handles the tool_acts in particular, such as wrenches and screwdrivers. * - * This can be overridden to handle unique "tool interactions" + * This can be overriden to handle unique "tool interactions" * IE using an item like a tool (when it's not actually one) * This is particularly useful for things that shouldn't be inserted into storage * (because tool acting runs before storage checks) diff --git a/code/game/atom/atoms_initializing_EXPENSIVE.dm b/code/game/atom/atoms_initializing_EXPENSIVE.dm index 205617fdbc8f9..c603ae5514810 100644 --- a/code/game/atom/atoms_initializing_EXPENSIVE.dm +++ b/code/game/atom/atoms_initializing_EXPENSIVE.dm @@ -57,14 +57,14 @@ * Called when an atom is created in byond (built in engine proc) * * Not a lot happens here in SS13 code, as we offload most of the work to the - * [Initialization][/atom/proc/Initialize] proc, mostly we run the preloader + * [Intialization][/atom/proc/Initialize] proc, mostly we run the preloader * if the preloader is being used and then call [InitAtom][/datum/controller/subsystem/atoms/proc/InitAtom] of which the ultimate - * result is that the Initialize proc is called. + * result is that the Intialize proc is called. * */ /atom/New(loc, ...) //atom creation method that preloads variables at creation - if(GLOB.use_preloader && src.type == GLOB._preloader_path)//in case the instantiated atom is creating other atoms in New() + if(GLOB.use_preloader && src.type == GLOB._preloader_path)//in case the instanciated atom is creating other atoms in New() world.preloader_load(src) var/do_initialize = SSatoms.initialized @@ -80,17 +80,17 @@ * we don't use New as we have better control over when this is called and we can choose * to delay calls or hook other logic in and so forth * - * During roundstart map parsing, atoms are queued for initialization in the base atom/New(), - * After the map has loaded, then Initialize is called on all atoms one by one. NB: this - * is also true for loading map templates as well, so they don't Initialize until all objects + * During roundstart map parsing, atoms are queued for intialization in the base atom/New(), + * After the map has loaded, then Initalize is called on all atoms one by one. NB: this + * is also true for loading map templates as well, so they don't Initalize until all objects * in the map file are parsed and present in the world * * If you're creating an object at any point after SSInit has run then this proc will be * immediately be called from New. * - * mapload: This parameter is true if the atom being loaded is either being initialized during - * the Atom subsystem initialization, or if the atom is being loaded from the map template. - * If the item is being created at runtime any time after the Atom subsystem is initialized then + * mapload: This parameter is true if the atom being loaded is either being intialized during + * the Atom subsystem intialization, or if the atom is being loaded from the map template. + * If the item is being created at runtime any time after the Atom subsystem is intialized then * it's false. * * The mapload argument occupies the same position as loc when Initialize() is called by New(). @@ -98,7 +98,7 @@ * with mapload at the end of atom/New() before this proc (atom/Initialize()) is called. * * You must always call the parent of this proc, otherwise failures will occur as the item - * will not be seen as initialized (this can lead to all sorts of strange behaviour, like + * will not be seen as initalized (this can lead to all sorts of strange behaviour, like * the item being completely unclickable) * * You must not sleep in this proc, or any subprocs @@ -136,7 +136,7 @@ if(uses_integrity) atom_integrity = max_integrity - TEST_ONLY_ASSERT((!armor || istype(armor)), "[type] has an armor that contains an invalid value at initialize") + TEST_ONLY_ASSERT((!armor || istype(armor)), "[type] has an armor that contains an invalid value at intialize") // apply materials properly from the default custom_materials value // This MUST come after atom_integrity is set above, as if old materials get removed, @@ -150,14 +150,14 @@ return INITIALIZE_HINT_NORMAL /** - * Late Initialization, for code that should run after all atoms have run Initialization + * Late Intialization, for code that should run after all atoms have run Intialization * - * To have your LateIntialize proc be called, your atoms [Initialization][/atom/proc/Initialize] + * To have your LateIntialize proc be called, your atoms [Initalization][/atom/proc/Initialize] * proc must return the hint * [INITIALIZE_HINT_LATELOAD] otherwise it will never be called. * * useful for doing things like finding other machines on GLOB.machines because you can guarantee - * that all atoms will actually exist in the "WORLD" at this time and that all their Initialization + * that all atoms will actually exist in the "WORLD" at this time and that all their Intialization * code has been run */ /atom/proc/LateInitialize() diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 0928ff220df7b..1949f1571cc03 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -17,7 +17,7 @@ var/tk_throw_range = 10 var/mob/pulledby = null /// What language holder type to init as - var/initial_language_holder = /datum/language_holder/atom_basic + var/initial_language_holder = /datum/language_holder /// Holds all languages this mob can speak and understand VAR_PRIVATE/datum/language_holder/language_holder /// The list of factions this atom belongs to diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 58cc789430ae0..e39ce9bd92d37 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -28,8 +28,6 @@ var/obj/item/clothing/under/U = H.w_uniform if(!istype(U)) return FALSE - if(U.has_sensor < HAS_SENSORS) - return FALSE if(U.sensor_mode <= SENSOR_VITALS) return FALSE return TRUE @@ -229,11 +227,7 @@ Medical HUD! Basic mode needs suit sensors on. holder.icon_state = "hudbuff" if(null) holder.icon_state = "hudhealthy" - if(ishuman(src)) - var/mob/living/carbon/human/crew = src - var/obj/item/clothing/under/uniform = crew.w_uniform - if(uniform && uniform.has_sensor == BROKEN_SENSORS) - holder.icon_state = "hudnosensor" + /*********************************************** FAN HUDs! For identifying other fans on-sight. diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index b2df8d7416dde..bce9ed3bb9375 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -353,7 +353,7 @@ GLOBAL_LIST(admin_objective_list) //Prefilled admin assignable objective list return FALSE if(human_check) brain_target = target.current?.get_organ_slot(ORGAN_SLOT_BRAIN) - //Protect will always succeed when someone suicides + //Protect will always suceed when someone suicides return !target || (target.current && HAS_TRAIT(target.current, TRAIT_SUICIDED)) || considered_alive(target, enforce_human = human_check) || (brain_target && HAS_TRAIT(brain_target, TRAIT_SUICIDED)) /datum/objective/protect/update_explanation_text() diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 34b8612c2d4be..8a7e9846561be 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -1147,9 +1147,6 @@ if(0 to 25) . += span_warning("It's falling apart!") -/obj/machinery/examine_descriptor(mob/user) - return "machine" - /obj/machinery/examine_more(mob/user) . = ..() if(HAS_TRAIT(user, TRAIT_RESEARCH_SCANNER) && component_parts) diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index c9e66c89c9576..1700abb0af1ab 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -16,26 +16,16 @@ GLOBAL_LIST_EMPTY(announcement_systems) circuit = /obj/item/circuitboard/machine/announcement_system - ///The headset that we use for broadcasting var/obj/item/radio/headset/radio - ///The message that we send when someone is joining. var/arrival = "%PERSON has signed up as %RANK" - ///Whether the arrival message is sent - var/arrival_toggle = TRUE - ///The message that we send when a department head arrives. + var/arrivalToggle = 1 var/newhead = "%PERSON, %RANK, is the department head." - ///Whether the newhead message is sent. - var/newhead_toggle = TRUE + var/newheadToggle = 1 var/greenlight = "Light_Green" var/pinklight = "Light_Pink" var/errorlight = "Error_Red" - ///If true, researched nodes will be announced to the appropriate channels - var/announce_research_node = TRUE - /// The text that we send when announcing researched nodes. - var/node_message = "The '%NODE' techweb node has been researched" - /obj/machinery/announcement_system/Initialize(mapload) . = ..() GLOB.announcement_systems += src @@ -51,10 +41,10 @@ GLOBAL_LIST_EMPTY(announcement_systems) /obj/machinery/announcement_system/update_overlays() . = ..() - if(arrival_toggle) + if(arrivalToggle) . += greenlight - if(newhead_toggle) + if(newheadToggle) . += pinklight if(machine_stat & BROKEN) @@ -88,25 +78,18 @@ GLOBAL_LIST_EMPTY(announcement_systems) str = replacetext(str, "%RANK", "[rank]") return str -/obj/machinery/announcement_system/proc/announce(message_type, target, rank, list/channels) +/obj/machinery/announcement_system/proc/announce(message_type, user, rank, list/channels) if(!is_operational) return var/message - switch(message_type) - if(AUTO_ANNOUNCE_ARRIVAL) - if(!arrival_toggle) - message = CompileText(arrival, target, rank) - return - if(AUTO_ANNOUNCE_NEWHEAD) - if(!newhead_toggle) - message = CompileText(newhead, target, rank) - return - if(AUTO_ANNOUNCE_ARRIVALS_BROKEN) - message = "The arrivals shuttle has been damaged. Docking for repairs..." - if(AUTO_ANNOUNCE_NODE) - message = replacetext(node_message, "%NODE", target) + if(message_type == "ARRIVAL" && arrivalToggle) + message = CompileText(arrival, user, rank) + else if(message_type == "NEWHEAD" && newheadToggle) + message = CompileText(newhead, user, rank) + else if(message_type == "ARRIVALS_BROKEN") + message = "The arrivals shuttle has been damaged. Docking for repairs..." broadcast(message, channels) @@ -135,11 +118,9 @@ GLOBAL_LIST_EMPTY(announcement_systems) /obj/machinery/announcement_system/ui_data() var/list/data = list() data["arrival"] = arrival - data["arrivalToggle"] = arrival_toggle + data["arrivalToggle"] = arrivalToggle data["newhead"] = newhead - data["newheadToggle"] = newhead_toggle - data["node_message"] = node_message - data["node_toggle"] = announce_research_node + data["newheadToggle"] = newheadToggle return data /obj/machinery/announcement_system/ui_act(action, param) @@ -154,28 +135,25 @@ GLOBAL_LIST_EMPTY(announcement_systems) return switch(action) if("ArrivalText") - var/new_message = trim(html_encode(param["newText"]), MAX_MESSAGE_LEN) - if(new_message) - arrival = new_message - usr.log_message("updated the arrivals announcement to: [new_message]", LOG_GAME) + var/NewMessage = trim(html_encode(param["newText"]), MAX_MESSAGE_LEN) + if(!usr.can_perform_action(src, ALLOW_SILICON_REACH)) + return + if(NewMessage) + arrival = NewMessage + usr.log_message("updated the arrivals announcement to: [NewMessage]", LOG_GAME) if("NewheadText") - var/new_message = trim(html_encode(param["newText"]), MAX_MESSAGE_LEN) - if(new_message) - newhead = new_message - usr.log_message("updated the head announcement to: [new_message]", LOG_GAME) - if("node_message") - var/new_message = trim(html_encode(param["new_text"]), MAX_MESSAGE_LEN) - if(new_message) - node_message = new_message - usr.log_message("updated the researched node announcement to: [node_message]", LOG_GAME) - if("newhead_toggle") - newhead_toggle = !newhead_toggle + var/NewMessage = trim(html_encode(param["newText"]), MAX_MESSAGE_LEN) + if(!usr.can_perform_action(src, ALLOW_SILICON_REACH)) + return + if(NewMessage) + newhead = NewMessage + usr.log_message("updated the head announcement to: [NewMessage]", LOG_GAME) + if("NewheadToggle") + newheadToggle = !newheadToggle update_appearance() - if("arrivalToggle") - arrival_toggle = !arrival_toggle + if("ArrivalToggle") + arrivalToggle = !arrivalToggle update_appearance() - if("node_toggle") - announce_research_node = !announce_research_node add_fingerprint(usr) /obj/machinery/announcement_system/attack_robot(mob/living/silicon/user) @@ -195,11 +173,6 @@ GLOBAL_LIST_EMPTY(announcement_systems) arrival = pick("#!@%ERR-34%2 CANNOT LOCAT@# JO# F*LE!", "CRITICAL ERROR 99.", "ERR)#: DA#AB@#E NOT F(*ND!") newhead = pick("OV#RL()D: \[UNKNOWN??\] DET*#CT)D!", "ER)#R - B*@ TEXT F*O(ND!", "AAS.exe is not responding. NanoOS is searching for a solution to the problem.") - node_message = pick(list( - replacetext(/obj/machinery/announcement_system::node_message, "%NODE", /datum/techweb_node/mech_clown::display_name), - "R/NT1M3 A= ANNOUN-*#nt_SY!?EM.dm, LI%£ 86: N=0DE NULL!", - "BEPIS BEPIS BEPIS", - )) /obj/machinery/announcement_system/emp_act(severity) . = ..() diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index e2f5d16cc572f..6f21e9303fc5a 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -133,6 +133,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) find_and_hang_on_wall(directional = TRUE, \ custom_drop_callback = CALLBACK(src, PROC_REF(deconstruct), FALSE)) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) + /obj/machinery/camera/Destroy(force) if(can_use()) toggle_cam(null, 0) //kick anyone viewing out and remove from the camera chunks @@ -233,11 +235,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) M.reset_perspective(null) to_chat(M, span_warning("The screen bursts into static!")) -/obj/machinery/camera/on_saboteur(datum/source, disrupt_duration) - . = ..() +/obj/machinery/camera/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER //lasts twice as much so we don't have to constantly shoot cameras just to be S T E A L T H Y emp_act(EMP_LIGHT, reset_time = disrupt_duration * 2) - return TRUE + return COMSIG_SABOTEUR_SUCCESS /obj/machinery/camera/proc/post_emp_reset(thisemp, previous_network) if(QDELETED(src)) diff --git a/code/game/machinery/camera/camera_construction.dm b/code/game/machinery/camera/camera_construction.dm index d6988617e1f25..15f22d02cbe96 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", max_length = MAX_NAME_LEN) + 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") 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 d7b9ac03dae6d..d48b62977893c 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -721,7 +721,7 @@ 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", max_length = MAX_MESSAGE_LEN) + var/input = tgui_input_text(user, "Message to announce to the station crew", "Announcement") if(!input || !user.can_perform_action(src, ALLOW_SILICON_REACH)) return if(user.try_speak(input)) diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index adac393d7bedb..b5e5a915ce2bf 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -223,7 +223,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) continue // Check if their uniform is in a compatible mode. - if((uniform.has_sensor == NO_SENSORS) || !uniform.sensor_mode) + if((uniform.has_sensor <= NO_SENSORS) || !uniform.sensor_mode) stack_trace("Human without active suit sensors is in suit_sensors_list: [tracked_human] ([tracked_human.type]) ([uniform.type])") continue @@ -245,19 +245,6 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) if (jobs[trim_assignment] != null) entry["ijob"] = jobs[trim_assignment] - // Broken sensors show garbage data - if (uniform.has_sensor == BROKEN_SENSORS) - entry["life_status"] = rand(0,1) - entry["area"] = pick_list (ION_FILE, "ionarea") - entry["oxydam"] = rand(0,175) - entry["toxdam"] = rand(0,175) - entry["burndam"] = rand(0,175) - entry["brutedam"] = rand(0,175) - entry["health"] = -50 - entry["can_track"] = tracked_living_mob.can_track() - results[++results.len] = entry - continue - // Current status if (sensor_mode >= SENSOR_LIVING) entry["life_status"] = tracked_living_mob.stat diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index da00fc3542197..e1612ae7ef2e5 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", max_length = 32, encode = FALSE) + var/new_sequence_input = tgui_input_text(usr, "Enter a replacement sequence", "Inherent Gene Replacement", 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 7fd47887bc73d..d53895300438d 100644 --- a/code/game/machinery/computer/records/records.dm +++ b/code/game/machinery/computer/records/records.dm @@ -148,7 +148,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_length = MAX_NAME_LEN) + var/name = tgui_input_text(user, "Enter the name of the new record.", "New Record", trimmed, 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/computer/telescreen.dm b/code/game/machinery/computer/telescreen.dm index 6021c954cabfc..6058d3bf131ab 100644 --- a/code/game/machinery/computer/telescreen.dm +++ b/code/game/machinery/computer/telescreen.dm @@ -55,6 +55,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai /obj/machinery/computer/security/telescreen/entertainment/Initialize(mapload) . = ..() + RegisterSignal(src, COMSIG_CLICK, PROC_REF(BigClick)) find_and_hang_on_wall() speakers = new(src) @@ -62,65 +63,15 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai . = ..() QDEL_NULL(speakers) -/obj/machinery/computer/security/telescreen/entertainment/examine(mob/user) - . = ..() - . += length(network) ? span_notice("The TV is broadcasting something!") : span_notice("There's nothing on TV.") - -/obj/machinery/computer/security/telescreen/entertainment/ui_state(mob/user) - return GLOB.always_state - -// Snowflake ui status to allow mobs to watch TV from across the room, -// but only allow adjacent mobs / tk users / silicon to change the channel -/obj/machinery/computer/security/telescreen/entertainment/ui_status(mob/living/user, datum/ui_state/state) - if(!can_watch_tv(user)) - return UI_CLOSE - if(!isliving(user)) - return isAdminGhostAI(user) ? UI_INTERACTIVE : UI_UPDATE - if(user.stat >= SOFT_CRIT) - return UI_UPDATE - - var/can_range = FALSE - if(iscarbon(user)) - var/mob/living/carbon/carbon_user = user - if(carbon_user.dna?.check_mutation(/datum/mutation/human/telekinesis) && tkMaxRangeCheck(user, src)) - can_range = TRUE - if(HAS_SILICON_ACCESS(user) || (user.interaction_range && user.interaction_range >= get_dist(user, src))) - can_range = TRUE - - if((can_range || user.CanReach(src)) && ISADVANCEDTOOLUSER(user)) - if(user.incapacitated) - return UI_UPDATE - if(!can_range && user.can_hold_items() && (user.usable_hands <= 0 || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED))) - return UI_UPDATE - return UI_INTERACTIVE - return UI_UPDATE - -/obj/machinery/computer/security/telescreen/entertainment/Click(location, control, params) - if(world.time <= usr.next_click + 1) - return // just so someone can't turn an auto clicker on and spam tvs +/// Bypass clickchain to allow humans to use the telescreen from a distance +/obj/machinery/computer/security/telescreen/entertainment/proc/BigClick() + SIGNAL_HANDLER - . = ..() - if(!can_watch_tv(usr)) - return - if((!length(network) && !Adjacent(usr)) || LAZYACCESS(params2list(params), SHIFT_CLICK)) // let people examine + if(!network.len) + balloon_alert(usr, "nothing on TV!") return - // Lets us see the tv regardless of click results - INVOKE_ASYNC(src, TYPE_PROC_REF(/atom, interact), usr) -/obj/machinery/computer/security/telescreen/entertainment/proc/can_watch_tv(mob/living/watcher) - if(!is_operational) - return FALSE - if((watcher.sight & SEE_OBJS) || HAS_SILICON_ACCESS(watcher)) - if(get_dist(watcher, src) > 7) - return FALSE - else - if(!can_see(watcher, src, 7)) - return FALSE - if(watcher.is_blind()) - return FALSE - if(!isobserver(watcher) && watcher.stat >= UNCONSCIOUS) - return FALSE - return TRUE + INVOKE_ASYNC(src, TYPE_PROC_REF(/atom, interact), usr) /// Sets the monitor's icon to the selected state, and says an announcement /obj/machinery/computer/security/telescreen/entertainment/proc/notify(on, announcement) diff --git a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm index 670abc2d87bbf..235986cbd0ddb 100644 --- a/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm +++ b/code/game/machinery/dna_infuser/infuser_entries/infuser_tier_zero_entries.dm @@ -75,7 +75,7 @@ desc = "EVERYONE CALM DOWN! I'm not implying anything with this entry. Are we really so surprised that felinids are humans with mixed feline DNA?" threshold_desc = DNA_INFUSION_NO_THRESHOLD qualities = list( - "oh, let me guess, you're a big fan of those Japanese tourist bots", + "oh, let me guess, you're a big fan of those japanese tourist bots", ) input_obj_or_mob = list( /mob/living/basic/pet/cat, diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 68251b2c1eec3..a33895e5569b7 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1176,10 +1176,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) @@ -1204,8 +1204,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(I.use_tool(src, user, time_to_open, volume = 100)) - if(check_electrified && shock(user, 100)) + if(do_after(user, time_to_open, src)) + if(check_electrified && shock(user,100)) prying_so_hard = FALSE return open(BYPASS_DOOR_CHECKS) @@ -2228,7 +2228,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(src, user, TRUE) + try_to_crowbar(null, 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 cd7d8201a9ec8..d75b5e17174c5 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, forced = FALSE) +/obj/machinery/door/proc/try_to_crowbar(obj/item/acting_object, mob/user) 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 2e5d909f3e952..84df989ba0ea3 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -544,7 +544,7 @@ correct_state() /// We check for adjacency when using the primary attack. -/obj/machinery/door/firedoor/try_to_crowbar(obj/item/acting_object, mob/user, forced = FALSE) +/obj/machinery/door/firedoor/try_to_crowbar(obj/item/acting_object, mob/user) if(welded || operating) return diff --git a/code/game/machinery/doors/passworddoor.dm b/code/game/machinery/doors/passworddoor.dm index bf27dfcffc23b..bccc243381ba4 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", max_length = MAX_MESSAGE_LEN) + var/guess = tgui_input_text(user, "Enter the password", "Password") if(guess == password) return TRUE return FALSE diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index a287aefeaa825..0c897c6809666 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -6,7 +6,7 @@ layer = ABOVE_WINDOW_LAYER closingLayer = ABOVE_WINDOW_LAYER resistance_flags = ACID_PROOF - obj_flags = CAN_BE_HIT | IGNORE_DENSITY | BLOCKS_CONSTRUCTION_DIR + obj_flags = CAN_BE_HIT | BLOCKS_CONSTRUCTION_DIR var/base_state = "left" max_integrity = 150 //If you change this, consider changing ../door/window/brigdoor/ max_integrity at the bottom of this .dm file integrity_failure = 0 diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 9744a65f53d03..bf3d97426fd24 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -550,15 +550,13 @@ Possible to do for anyone motivated enough: if(AI) AI.eyeobj.setLoc(get_turf(src)) //ensure the AI camera moves to the holopad - hologram.Impersonation = AI //DOPPLER EDIT ADDITION -- Customization; puts the AI core as the impersonated mob so that the examine proc can be redirected else //make it like real life hologram.Impersonation = user - //hologram.mouse_opacity = MOUSE_OPACITY_TRANSPARENT//So you can't click on it. // DOPPLER EDIT -- Customization; Making holograms clickable/examinable + hologram.mouse_opacity = MOUSE_OPACITY_TRANSPARENT//So you can't click on it. hologram.layer = FLY_LAYER //Above all the other objects/mobs. Or the vast majority of them. SET_PLANE_EXPLICIT(hologram, ABOVE_GAME_PLANE, src) hologram.set_anchored(TRUE)//So space wind cannot drag it. - //hologram.name = "[user.name] (Hologram)"//If someone decides to right click. // DOPPLER EDIT - hologram.name = user.name //DOPPLER EDIT -- Make the name exact, so that the double-emotes are less jarring in the chat + hologram.name = "[user.name] (Hologram)"//If someone decides to right click. set_holo(user, hologram) set_holo(user, hologram) diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 98149a8232223..f6f4270835ca0 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, max_length = 20) + var/input_text = tgui_input_text(user, "Enter the beacon's location tag", "Beacon Location", location, 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, max_length = 20) + var/input_text = tgui_input_text(user, "Enter the tag of the next patrol location", "Beacon Location", next_patrol, 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 aced87bfe588a..3186d2081e5a7 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_length = MAX_NAME_LEN, multiline = FALSE) + var/temp_name = tgui_input_text(usr, "Write the Criminal's Name", "Warrent Alert Handler", "John Doe", 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_length = MAX_BROADCAST_LEN, multiline = TRUE) + var/temp_desc = tgui_input_text(usr, "Write the Criminal's Crimes", "Warrent Alert Handler", "Unknown", 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, max_length = MAX_BROADCAST_LEN, multiline = TRUE) + var/temp_message = tgui_input_text(usr, "Write your Feed story", "Network Channel Handler", feed_channel_message, 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 6bc1e6c77ff14..c381f2f506304 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", max_length = MAX_MESSAGE_LEN) + var/new_scribble_text = tgui_input_text(user, "What do you want to scribble?", "Write something") if(isnull(new_scribble_text)) return add_fingerprint(user) diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index de7c6351e38d4..1e90b270c8c8d 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -187,6 +187,9 @@ //Allow you to drag-drop disposal pipes and transit tubes into it /obj/machinery/pipedispenser/disposal/mouse_drop_receive(obj/structure/pipe, mob/user, params) + if(user.incapacitated) + return + if (!istype(pipe, /obj/structure/disposalconstruct) && !istype(pipe, /obj/structure/c_transit_tube) && !istype(pipe, /obj/structure/c_transit_tube_pod)) return diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 31fc68b31421f..af27a5411cdcd 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -135,6 +135,8 @@ DEFINE_BITFIELD(turret_flags, list( if(!has_cover) INVOKE_ASYNC(src, PROC_REF(popUp)) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) + AddElement(/datum/element/hostile_machine) ///Toggles the turret on or off depending on the value of the turn_on arg. @@ -155,10 +157,10 @@ DEFINE_BITFIELD(turret_flags, list( addtimer(CALLBACK(src, PROC_REF(toggle_on), TRUE), duration + 1) //the cooldown isn't over until the tick after its end. toggle_on(FALSE) -/obj/machinery/porta_turret/on_saboteur(datum/source, disrupt_duration) - . = ..() +/obj/machinery/porta_turret/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER INVOKE_ASYNC(src, PROC_REF(set_disabled), disrupt_duration) - return TRUE + return COMSIG_SABOTEUR_SUCCESS /obj/machinery/porta_turret/proc/check_should_process() if (datum_flags & DF_ISPROCESSING) @@ -573,7 +575,7 @@ DEFINE_BITFIELD(turret_flags, list( // If we aren't shooting heads then return a threatcount of 0 if (!(turret_flags & TURRET_FLAG_SHOOT_HEADS)) - var/datum/job/apparent_job = SSjob.get_job(perp.get_assignment()) + var/datum/job/apparent_job = SSjob.GetJob(perp.get_assignment()) if(apparent_job?.job_flags & JOB_HEAD_OF_STAFF) return 0 diff --git a/code/game/machinery/porta_turret/portable_turret_construct.dm b/code/game/machinery/porta_turret/portable_turret_construct.dm index 0ae7d9699ee26..a8fa4e67b2bf6 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_length = MAX_NAME_LEN) + var/choice = tgui_input_text(user, "Enter a new turret name", "Turret Classification", finish_name, 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 3ef023ccb64d7..bb43b7a46db9e 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_length = MAX_NAME_LEN) + var/msg = tgui_input_text(user, "Name of your roulette wheel", "Roulette Customization", "Roulette Machine", 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 9ff9c562aa04c..3232dc524ab89 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", max_length = MAX_NAME_LEN) + var/str = tgui_input_text(user, "Personal Unit Name", "Unit Name") if(!isnull(str)) name = str name_set = TRUE - str = tgui_input_text(user, "Personal Unit Description", "Unit Description", max_length = MAX_DESC_LEN) + str = tgui_input_text(user, "Personal Unit Description", "Unit Description") 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 1b3197e702da5..05186da8bc08c 100644 --- a/code/game/machinery/telecomms/computers/message.dm +++ b/code/game/machinery/telecomms/computers/message.dm @@ -139,7 +139,7 @@ return TRUE authenticated = TRUE - success_message = "YOU SUCCESSFULLY LOGGED IN!" + success_message = "YOU SUCCESFULLY LOGGED IN!" return TRUE if("link_server") @@ -180,10 +180,10 @@ notice_message = "NOTICE: Logs cleared." return TRUE if("set_key") - var/dkey = tgui_input_text(usr, "Please enter the decryption key", "Telecomms Decryption", max_length = 16) + var/dkey = tgui_input_text(usr, "Please enter the decryption key", "Telecomms Decryption") if(dkey && dkey != "") if(linkedServer.decryptkey == dkey) - var/newkey = tgui_input_text(usr, "Please enter the new key (3 - 16 characters max)", "New Key", max_length = 16) + var/newkey = tgui_input_text(usr, "Please enter the new key (3 - 16 characters max)", "New Key") 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", max_length = MAX_NAME_LEN) - var/job = tgui_input_text(usr, "What is the sender's job?", "Job", max_length = 60) + 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/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", max_length = MAX_MESSAGE_LEN) + var/message = tgui_input_text(usr, "Please enter your message", "Message") if(isnull(sender) || sender == "") sender = "UNKNOWN" diff --git a/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm b/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm index d97966160233b..27c02fb9d1806 100644 --- a/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm +++ b/code/game/objects/effects/anomalies/anomalies_bioscrambler.dm @@ -62,7 +62,7 @@ for(var/mob/living/carbon/target in GLOB.player_list) if (target.z != z) continue - if (HAS_TRAIT(target, TRAIT_GODMODE)) + if (target.status_flags & GODMODE) continue if (target.stat >= UNCONSCIOUS) continue // Don't just haunt a corpse @@ -89,12 +89,10 @@ duration = 0.5 SECONDS color = COLOR_LIME var/max_alpha = 255 - ///How far the effect would scale in size - var/amount_to_scale = 2 /obj/effect/temp_visual/circle_wave/Initialize(mapload) transform = matrix().Scale(0.1) - animate(src, transform = matrix().Scale(amount_to_scale), time = duration, flags = ANIMATION_PARALLEL) + animate(src, transform = matrix().Scale(2), time = duration, flags = ANIMATION_PARALLEL) animate(src, alpha = max_alpha, time = duration * 0.6, flags = ANIMATION_PARALLEL) animate(alpha = 0, time = duration * 0.4) apply_wibbly_filters(src) @@ -106,7 +104,3 @@ /obj/effect/temp_visual/circle_wave/bioscrambler/light max_alpha = 128 -/obj/effect/temp_visual/circle_wave/void_conduit - color = COLOR_FULL_TONER_BLACK - duration = 12 SECONDS - amount_to_scale = 12 diff --git a/code/game/objects/effects/decals/cleanable/food.dm b/code/game/objects/effects/decals/cleanable/food.dm index d612bd9e7f53e..23c266ecb5906 100644 --- a/code/game/objects/effects/decals/cleanable/food.dm +++ b/code/game/objects/effects/decals/cleanable/food.dm @@ -10,9 +10,6 @@ icon_state = "tomato_floor1" random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3") -/obj/effect/decal/cleanable/food/tomato_smudge/can_bloodcrawl_in() - return TRUE // why? why not. - /obj/effect/decal/cleanable/food/plant_smudge name = "plant smudge" desc = "Chlorophyll? More like borophyll!" diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index b1a4a75c945d7..64c0afe188a8a 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -306,11 +306,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) GLOB.newplayer_start += loc return INITIALIZE_HINT_QDEL -/obj/effect/landmark/start/pun_pun - name = JOB_PUN_PUN - icon = 'icons/mob/human/human.dmi' - icon_state = "monkey" - /obj/effect/landmark/latejoin name = "JoinLate" diff --git a/code/game/objects/effects/spawners/random/trash.dm b/code/game/objects/effects/spawners/random/trash.dm index 6f6f5badc8e7e..9cf00c20ee3ec 100644 --- a/code/game/objects/effects/spawners/random/trash.dm +++ b/code/game/objects/effects/spawners/random/trash.dm @@ -324,18 +324,3 @@ 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.dm b/code/game/objects/items.dm index 99266b3787eb6..fa790eb3e2db6 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -464,36 +464,27 @@ abstract_move(null) forceMove(T) -/obj/item/examine_tags(mob/user) - var/list/parent_tags = ..() - parent_tags.Insert(1, weight_class_to_text(w_class)) // To make size display first, otherwise it looks goofy - . = parent_tags - .[weight_class_to_text(w_class)] = "[gender == PLURAL ? "They are" : "It is"] a [weight_class_to_text(w_class)] item." +/obj/item/examine(mob/user) //This might be spammy. Remove? + . = ..() - if(item_flags & CRUEL_IMPLEMENT) - .[span_red("morbid")] = "It seems quite practical for particularly morbid procedures and experiments." + . += "[gender == PLURAL ? "They are" : "It is"] a [weight_class_to_text(w_class)] item." - if (siemens_coefficient == 0) - .["insulated"] = "It is made from a robust electrical insulator and will block any electricity passing through it!" - else if (siemens_coefficient <= 0.5) - .["partially insulated"] = "It is made from a poor insulator that will dampen (but not fully block) electric shocks passing through it." + if(item_flags & CRUEL_IMPLEMENT) + . += "[src] seems quite practical for particularly morbid procedures and experiments." if(resistance_flags & INDESTRUCTIBLE) - .["indestructible"] = "It is extremely robust! It'll probably withstand anything that could happen to it!" + . += "[src] seems extremely robust! It'll probably withstand anything that could happen to it!" + else + if(resistance_flags & LAVA_PROOF) + . += "[src] is made of an extremely heat-resistant material, it'd probably be able to withstand lava!" + if(resistance_flags & (ACID_PROOF | UNACIDABLE)) + . += "[src] looks pretty robust! It'd probably be able to withstand acid!" + if(resistance_flags & FREEZE_PROOF) + . += "[src] is made of cold-resistant materials." + if(resistance_flags & FIRE_PROOF) + . += "[src] is made of fire-retardant materials." return - if(resistance_flags & LAVA_PROOF) - .["lavaproof"] = "It is made of an extremely heat-resistant material, it'd probably be able to withstand lava!" - if(resistance_flags & (ACID_PROOF | UNACIDABLE)) - .["acidproof"] = "It looks pretty robust! It'd probably be able to withstand acid!" - if(resistance_flags & FREEZE_PROOF) - .["freezeproof"] = "It is made of cold-resistant materials." - if(resistance_flags & FIRE_PROOF) - .["fireproof"] = "It is made of fire-retardant materials." - -/obj/item/examine_descriptor(mob/user) - return "item" - /obj/item/examine_more(mob/user) . = ..() if(HAS_TRAIT(user, TRAIT_RESEARCH_SCANNER)) @@ -660,7 +651,7 @@ /obj/item/attack_alien(mob/user, list/modifiers) var/mob/living/carbon/alien/ayy = user - if(!ayy.can_hold_items(src)) + if(!user.can_hold_items(src)) if(src in ayy.contents) // To stop Aliens having items stuck in their pockets ayy.dropItemToGround(src) to_chat(user, span_warning("Your claws aren't capable of such fine manipulation!")) @@ -1211,13 +1202,13 @@ return TRUE /// Called before [obj/item/proc/use_tool] if there is a delay, or by [obj/item/proc/use_tool] if there isn't. Only ever used by welding tools and stacks, so it's not added on any other [obj/item/proc/use_tool] checks. -/obj/item/proc/tool_start_check(mob/living/user, amount=0, heat_required=0) - . = tool_use_check(user, amount, heat_required) +/obj/item/proc/tool_start_check(mob/living/user, amount=0) + . = tool_use_check(user, amount) if(.) SEND_SIGNAL(src, COMSIG_TOOL_START_USE, user) /// A check called by [/obj/item/proc/tool_start_check] once, and by use_tool on every tick of delay. -/obj/item/proc/tool_use_check(mob/living/user, amount, heat_required) +/obj/item/proc/tool_use_check(mob/living/user, amount) return !amount /// Generic use proc. Depending on the item, it uses up fuel, charges, sheets, etc. Returns TRUE on success, FALSE on failure. diff --git a/code/game/objects/items/AI_modules/freeform.dm b/code/game/objects/items/AI_modules/freeform.dm index 05ef00c946772..a0a91f7185e5a 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], max_length = CONFIG_GET(number/max_law_len), multiline = TRUE) + var/targName = tgui_input_text(user, "Enter a new core law for the AI.", "Freeform Law Entry", laws[1], CONFIG_GET(number/max_law_len), TRUE) if(!targName || !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], max_length = CONFIG_GET(number/max_law_len), multiline = TRUE) + var/targName = tgui_input_text(user, "Enter a new law for the AI.", "Freeform Law Entry", laws[1], CONFIG_GET(number/max_law_len), TRUE) if(!targName || !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 593bc43f2dcea..30e904d45ac84 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_length = MAX_NAME_LEN) + var/targName = tgui_input_text(user, "Enter a new subject that Asimov is concerned with.", "Asimov", subject, 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_length = MAX_NAME_LEN) + var/target_name = tgui_input_text(user, "Enter a new subject that Asimov++ is concerned with.", "Asimov++", subject, 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 41a1f38ba891d..fafde17acb5f3 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], max_length = CONFIG_GET(number/max_law_len), multiline = TRUE) + var/targName = tgui_input_text(user, "Enter a new law for the AI", "Freeform Law Entry", laws[1], CONFIG_GET(number/max_law_len), TRUE) if(!targName || !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 76f4715730620..b53e16a86b0c8 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_length = MAX_NAME_LEN) + var/targName = tgui_input_text(user, "Subject to safeguard.", "Safeguard", user.name, 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 480735bfe2fe7..74fc7ab8232ae 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_length = MAX_NAME_LEN) + var/targName = tgui_input_text(user, "Enter the subject who is the only human.", "One Human", user.real_name, 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 b28acce35d42d..1f20ea9bc3e39 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -125,7 +125,7 @@ /obj/item/card/id/Initialize(mapload) . = ..() - var/datum/bank_account/blank_bank_account = new("Unassigned", SSjob.get_job_type(/datum/job/unassigned), player_account = FALSE) + var/datum/bank_account/blank_bank_account = new("Unassigned", SSjob.GetJobType(/datum/job/unassigned), player_account = FALSE) registered_account = blank_bank_account registered_account.replaceable = TRUE @@ -987,11 +987,6 @@ return ..() -/obj/item/card/id/advanced/proc/after_input_check(mob/user) - if(QDELETED(user) || QDELETED(src) || !user.client || !user.can_perform_action(src, NEED_DEXTERITY|FORBID_TELEKINESIS_REACH)) - return FALSE - return TRUE - /obj/item/card/id/advanced/item_interaction(mob/living/user, obj/item/tool, list/modifiers) . = ..() if(.) @@ -1294,7 +1289,7 @@ . = ..() registered_account = new(player_account = FALSE) registered_account.account_id = ADMIN_ACCOUNT_ID // this is so bank_card_talk() can work. - registered_account.account_job = SSjob.get_job_type(/datum/job/admin) + registered_account.account_job = SSjob.GetJobType(/datum/job/admin) registered_account.account_balance += 999999 // MONEY! We add more money to the account every time we spawn because it's a debug item and infinite money whoopie /obj/item/card/id/advanced/debug/alt_click_can_use_id(mob/living/user) @@ -1447,44 +1442,6 @@ trim = /datum/id_trim/highlander wildcard_slots = WILDCARD_LIMIT_ADMIN -/// An ID that you can flip with attack_self_secondary, overriding the appearance of the ID (useful for plainclothes detectives for example). -/obj/item/card/id/advanced/plainclothes - name = "Plainclothes ID" - ///The trim that we use as plainclothes identity - var/alt_trim = /datum/id_trim/job/assistant - -/obj/item/card/id/advanced/plainclothes/add_context(atom/source, list/context, obj/item/held_item, mob/user) - . = ..() - context[SCREENTIP_CONTEXT_LMB] = "Show/Flip ID" - -/obj/item/card/id/advanced/plainclothes/examine(mob/user) - . = ..() - if(trim_assignment_override) - . += span_smallnotice("it's currently under plainclothes identity.") - else - . += span_smallnotice("flip it to switch to the plainclothes identity.") - -/obj/item/card/id/advanced/plainclothes/attack_self(mob/user) - var/popup_input = tgui_input_list(user, "Choose Action", "Two-Sided ID", list("Show", "Flip")) - if(!popup_input || !after_input_check(user)) - return TRUE - if(popup_input == "Show") - return ..() - balloon_alert(user, "flipped") - if(trim_assignment_override) - SSid_access.remove_trim_from_chameleon_card(src) - else - SSid_access.apply_trim_to_chameleon_card(src, alt_trim) - update_label() - update_appearance() - -/obj/item/card/id/advanced/plainclothes/update_label() - if(!trim_assignment_override) - return ..() - var/name_string = registered_name ? "[registered_name]'s ID Card" : initial(name) - var/datum/id_trim/fake = SSid_access.trim_singletons_by_path[alt_trim] - name = "[name_string] ([fake.assignment])" - /obj/item/card/id/advanced/chameleon name = "agent card" desc = "A highly advanced chameleon ID card. Touch this card on another ID card or player to choose which accesses to copy. \ @@ -1699,9 +1656,8 @@ to_chat(user, span_notice("You successfully reset the ID card.")) return - ///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) - + ///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) if(!after_input_check(user)) return TRUE if(input_name) @@ -1731,7 +1687,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_length = 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_NAME_LEN) if(!after_input_check(user)) return TRUE @@ -1768,6 +1724,11 @@ registered_account = account to_chat(user, span_notice("Your account number has been automatically assigned.")) +/obj/item/card/id/advanced/chameleon/proc/after_input_check(mob/user) + if(QDELETED(user) || QDELETED(src) || !user.client || !user.can_perform_action(src, NEED_DEXTERITY|FORBID_TELEKINESIS_REACH)) + return FALSE + return TRUE + /obj/item/card/id/advanced/chameleon/add_item_context(obj/item/source, list/context, atom/target, mob/living/user,) . = ..() @@ -1885,15 +1846,15 @@ return switch(popup_input) if("Name") - 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) + 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) 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_length = 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_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/cigs_lighters.dm similarity index 76% rename from code/game/objects/items/cigarettes.dm rename to code/game/objects/items/cigs_lighters.dm index 168817bf1ff9f..35f14640278e4 100644 --- a/code/game/objects/items/cigarettes.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -6,6 +6,8 @@ MATCHES CIGARETTES CIGARS SMOKING PIPES +CHEAP LIGHTERS +ZIPPO CIGARETTE PACKETS ARE IN FANCY.DM */ @@ -198,7 +200,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM // "It is called a cigarette" AddComponent(/datum/component/edible,\ initial_reagents = list_reagents,\ - food_flags = FOOD_NO_EXAMINE,\ + food_flags = null,\ foodtypes = JUNKFOOD,\ volume = 50,\ eat_time = 0 SECONDS,\ @@ -208,6 +210,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM junkiness = 0,\ reagent_purity = null,\ on_consume = CALLBACK(src, PROC_REF(on_consume)),\ + show_examine = FALSE, \ ) /obj/item/cigarette/Destroy() @@ -817,6 +820,319 @@ CIGARETTE PACKETS ARE IN FANCY.DM inhand_icon_on = null inhand_icon_off = null +///////// +//ZIPPO// +///////// +/obj/item/lighter + name = "\improper Zippo lighter" + desc = "The zippo." + icon = 'icons/obj/cigarettes.dmi' + icon_state = "zippo" + inhand_icon_state = "zippo" + worn_icon_state = "lighter" + w_class = WEIGHT_CLASS_TINY + obj_flags = CONDUCTS_ELECTRICITY + slot_flags = ITEM_SLOT_BELT + heat = 1500 + resistance_flags = FIRE_PROOF + grind_results = list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5, /datum/reagent/fuel/oil = 5) + custom_price = PAYCHECK_CREW * 1.1 + light_system = OVERLAY_LIGHT + light_range = 2 + light_power = 1.3 + light_color = LIGHT_COLOR_FIRE + light_on = FALSE + /// Whether the lighter is lit. + var/lit = FALSE + /// Whether the lighter is fancy. Fancy lighters have fancier flavortext and won't burn thumbs. + var/fancy = TRUE + /// The engraving overlay used by this lighter. + var/overlay_state + /// A list of possible engraving overlays. + var/overlay_list = list( + "plain", + "dame", + "thirteen", + "snake" + ) + +/obj/item/lighter/Initialize(mapload) + . = ..() + if(!overlay_state) + overlay_state = pick(overlay_list) + AddComponent(\ + /datum/component/bullet_intercepting,\ + block_chance = 0.5,\ + active_slots = ITEM_SLOT_SUITSTORE,\ + on_intercepted = CALLBACK(src, PROC_REF(on_intercepted_bullet)),\ + ) + update_appearance() + +/// Destroy the lighter when it's shot by a bullet +/obj/item/lighter/proc/on_intercepted_bullet(mob/living/victim, obj/projectile/bullet) + victim.visible_message(span_warning("\The [bullet] shatters on [victim]'s lighter!")) + playsound(victim, SFX_RICOCHET, 100, TRUE) + new /obj/effect/decal/cleanable/oil(get_turf(src)) + do_sparks(1, TRUE, src) + victim.dropItemToGround(src, force = TRUE, silent = TRUE) + qdel(src) + +/obj/item/lighter/cyborg_unequip(mob/user) + if(!lit) + return + set_lit(FALSE) + +/obj/item/lighter/suicide_act(mob/living/carbon/user) + if (lit) + user.visible_message(span_suicide("[user] begins holding \the [src]'s flame up to [user.p_their()] face! It looks like [user.p_theyre()] trying to commit suicide!")) + playsound(src, 'sound/items/welder.ogg', 50, TRUE) + return FIRELOSS + else + user.visible_message(span_suicide("[user] begins whacking [user.p_them()]self with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")) + return BRUTELOSS + +/obj/item/lighter/update_icon_state() + icon_state = "[initial(icon_state)][lit ? "-on" : ""]" + return ..() + +/obj/item/lighter/update_overlays() + . = ..() + . += create_lighter_overlay() + +/// Generates an overlay used by this lighter. +/obj/item/lighter/proc/create_lighter_overlay() + return mutable_appearance(icon, "lighter_overlay_[overlay_state][lit ? "-on" : ""]") + +/obj/item/lighter/ignition_effect(atom/A, mob/user) + if(get_temperature()) + . = span_infoplain(span_rose("With a single flick of [user.p_their()] wrist, [user] smoothly lights [A] with [src]. Damn [user.p_theyre()] cool.")) + +/obj/item/lighter/proc/set_lit(new_lit) + if(lit == new_lit) + return + + lit = new_lit + if(lit) + force = 5 + damtype = BURN + hitsound = 'sound/items/welder.ogg' + attack_verb_continuous = string_list(list("burns", "singes")) + attack_verb_simple = string_list(list("burn", "singe")) + START_PROCESSING(SSobj, src) + if(isliving(loc)) + var/mob/living/male_model = loc + if(male_model.fire_stacks && !(male_model.on_fire)) + male_model.ignite_mob() + else + hitsound = SFX_SWING_HIT + force = 0 + attack_verb_continuous = null //human_defense.dm takes care of it + attack_verb_simple = null + STOP_PROCESSING(SSobj, src) + set_light_on(lit) + update_appearance() + +/obj/item/lighter/extinguish() + . = ..() + set_lit(FALSE) + +/obj/item/lighter/attack_self(mob/living/user) + if(!user.is_holding(src)) + return ..() + if(lit) + set_lit(FALSE) + if(fancy) + user.visible_message( + span_notice("You hear a quiet click, as [user] shuts off [src] without even looking at what [user.p_theyre()] doing. Wow."), + span_notice("You quietly shut off [src] without even looking at what you're doing. Wow.") + ) + playsound(src.loc , 'sound/items/zippo_off.ogg', 100, 1) + else + user.visible_message( + span_notice("[user] quietly shuts off [src]."), + span_notice("You quietly shut off [src].") + ) + playsound(src.loc , 'sound/items/lighter_off.ogg', 100, 1) + return + + set_lit(TRUE) + if(fancy) + user.visible_message( + span_notice("Without even breaking stride, [user] flips open and lights [src] in one smooth movement."), + span_notice("Without even breaking stride, you flip open and light [src] in one smooth movement.") + ) + playsound(src.loc , 'sound/items/zippo_on.ogg', 100, 1) + return + else + playsound(src.loc, 'sound/items/lighter_on.ogg', 100, 1) + + var/hand_protected = FALSE + var/mob/living/carbon/human/human_user = user + if(!istype(human_user) || HAS_TRAIT(human_user, TRAIT_RESISTHEAT) || HAS_TRAIT(human_user, TRAIT_RESISTHEATHANDS)) + hand_protected = TRUE + else if(!istype(human_user.gloves, /obj/item/clothing/gloves)) + hand_protected = FALSE + else + var/obj/item/clothing/gloves/gloves = human_user.gloves + if(gloves.max_heat_protection_temperature) + hand_protected = (gloves.max_heat_protection_temperature > 360) + + if(hand_protected || prob(75)) + user.visible_message( + span_notice("After a few attempts, [user] manages to light [src]."), + span_notice("After a few attempts, you manage to light [src].") + ) + return + + var/hitzone = user.held_index_to_dir(user.active_hand_index) == "r" ? BODY_ZONE_PRECISE_R_HAND : BODY_ZONE_PRECISE_L_HAND + user.apply_damage(5, BURN, hitzone) + user.visible_message( + span_warning("After a few attempts, [user] manages to light [src] - however, [user.p_they()] burn[user.p_s()] [user.p_their()] finger in the process."), + span_warning("You burn yourself while lighting the lighter!") + ) + user.add_mood_event("burnt_thumb", /datum/mood_event/burnt_thumb) + + +/obj/item/lighter/attack(mob/living/carbon/M, mob/living/carbon/user) + if(lit && M.ignite_mob()) + message_admins("[ADMIN_LOOKUPFLW(user)] set [key_name_admin(M)] on fire with [src] at [AREACOORD(user)]") + log_game("[key_name(user)] set [key_name(M)] on fire with [src] at [AREACOORD(user)]") + var/obj/item/cigarette/cig = help_light_cig(M) + if(!lit || !cig || user.combat_mode) + ..() + return + + if(cig.lit) + to_chat(user, span_warning("The [cig.name] is already lit!")) + if(M == user) + cig.attackby(src, user) + return + + if(fancy) + cig.light(span_rose("[user] whips the [name] out and holds it for [M]. [user.p_Their()] arm is as steady as the unflickering flame [user.p_they()] light[user.p_s()] \the [cig] with.")) + else + cig.light(span_notice("[user] holds the [name] out for [M], and lights [M.p_their()] [cig.name].")) + + +/obj/item/lighter/process() + open_flame(heat) + +/obj/item/lighter/get_temperature() + return lit * heat + + +/obj/item/lighter/greyscale + name = "cheap lighter" + desc = "A cheap lighter." + icon_state = "lighter" + fancy = FALSE + overlay_list = list( + "transp", + "tall", + "matte", + "zoppo" //u cant stoppo th zoppo + ) + + /// The color of the lighter. + var/lighter_color + /// The set of colors this lighter can be autoset as on init. + var/list/color_list = list( //Same 16 color selection as electronic assemblies + COLOR_ASSEMBLY_BLACK, + COLOR_FLOORTILE_GRAY, + COLOR_ASSEMBLY_BGRAY, + COLOR_ASSEMBLY_WHITE, + COLOR_ASSEMBLY_RED, + COLOR_ASSEMBLY_ORANGE, + COLOR_ASSEMBLY_BEIGE, + COLOR_ASSEMBLY_BROWN, + COLOR_ASSEMBLY_GOLD, + COLOR_ASSEMBLY_YELLOW, + COLOR_ASSEMBLY_GURKHA, + COLOR_ASSEMBLY_LGREEN, + COLOR_ASSEMBLY_GREEN, + COLOR_ASSEMBLY_LBLUE, + COLOR_ASSEMBLY_BLUE, + COLOR_ASSEMBLY_PURPLE + ) + +/obj/item/lighter/greyscale/Initialize(mapload) + . = ..() + if(!lighter_color) + lighter_color = pick(color_list) + update_appearance() + +/obj/item/lighter/greyscale/create_lighter_overlay() + var/mutable_appearance/lighter_overlay = ..() + lighter_overlay.color = lighter_color + return lighter_overlay + +/obj/item/lighter/greyscale/ignition_effect(atom/A, mob/user) + if(get_temperature()) + . = span_notice("After some fiddling, [user] manages to light [A] with [src].") + + +/obj/item/lighter/slime + name = "slime zippo" + desc = "A specialty zippo made from slimes and industry. Has a much hotter flame than normal." + icon_state = "slighter" + heat = 3000 //Blue flame! + light_color = LIGHT_COLOR_CYAN + overlay_state = "slime" + grind_results = list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5, /datum/reagent/medicine/pyroxadone = 5) + +/obj/item/lighter/skull + name = "badass zippo" + desc = "An absolutely badass zippo lighter. Just look at that skull!" + overlay_state = "skull" + +/obj/item/lighter/mime + name = "pale zippo" + desc = "In lieu of fuel, performative spirit can be used to light cigarettes." + icon_state = "mlighter" //These ones don't show a flame. + light_color = LIGHT_COLOR_HALOGEN + heat = 0 //I swear it's a real lighter dude you just can't see the flame dude I promise + overlay_state = "mime" + grind_results = list(/datum/reagent/iron = 1, /datum/reagent/toxin/mutetoxin = 5, /datum/reagent/consumable/nothing = 10) + light_range = 0 + light_power = 0 + fancy = FALSE + +/obj/item/lighter/mime/ignition_effect(atom/A, mob/user) + . = span_infoplain("[user] lifts the [name] to the [A], which miraculously lights!") + +/obj/item/lighter/bright + name = "illuminative zippo" + desc = "Sustains an incredibly bright chemical reaction when you spark it. Avoid looking directly at the igniter when lit." + icon_state = "slighter" + light_color = LIGHT_COLOR_ELECTRIC_CYAN + overlay_state = "bright" + grind_results = list(/datum/reagent/iron = 1, /datum/reagent/flash_powder = 10) + light_range = 8 + light_power = 3 //Irritatingly bright and large enough to cover a small room. + fancy = FALSE + +/obj/item/lighter/bright/examine(mob/user) + . = ..() + + if(lit && isliving(user)) + var/mob/living/current_viewer = user + current_viewer.flash_act(4) + +/obj/item/lighter/bright/ignition_effect(atom/A, mob/user) + if(get_temperature()) + . = span_infoplain(span_rose("[user] lifts the [src] to the [A], igniting it with a brilliant flash of light!")) + var/mob/living/current_viewer = user + current_viewer.flash_act(4) + +/obj/effect/spawner/random/special_lighter + name = "special lighter spawner" + icon_state = "lighter" + loot = list( + /obj/item/lighter/skull, + /obj/item/lighter/mime, + /obj/item/lighter/bright, + ) + /////////// //ROLLING// /////////// diff --git a/code/game/objects/items/circuitboards/circuitboard.dm b/code/game/objects/items/circuitboards/circuitboard.dm index 6439ef9ccbe94..236b6ed402c4a 100644 --- a/code/game/objects/items/circuitboards/circuitboard.dm +++ b/code/game/objects/items/circuitboards/circuitboard.dm @@ -17,8 +17,8 @@ grind_results = list(/datum/reagent/silicon = 20) greyscale_colors = CIRCUIT_COLOR_GENERIC var/build_path = null - /// whether or not the circuit board will build into a vendor whose products cost nothing (used for offstation vending machines mostly) - var/all_products_free = FALSE + ///determines if the circuit board originated from a vendor off station or not. + var/onstation = TRUE ///determines if the board requires specific levels of parts. (ie specifically a femto menipulator vs generic manipulator) var/specific_parts = FALSE diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 9c3cde9f725a5..41950561571d6 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -403,29 +403,6 @@ name = "R&D Console" greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/rdconsole - var/silence_announcements = FALSE - -/obj/item/circuitboard/computer/rdconsole/examine(mob/user) - . = ..() - . += span_info("The board is configured to [silence_announcements ? "silence" : "announce"] researched nodes on radio.") - . += span_notice("The board mode can be changed with a [EXAMINE_HINT("multitool")].") - -/obj/item/circuitboard/computer/rdconsole/multitool_act(mob/living/user) - . = ..() - if(obj_flags & EMAGGED) - balloon_alert(user, "board mode is broken!") - return - silence_announcements = !silence_announcements - balloon_alert(user, "announcements [silence_announcements ? "enabled" : "disabled"]") - -/obj/item/circuitboard/computer/rdconsole/emag_act(mob/user, obj/item/card/emag/emag_card) - if (obj_flags & EMAGGED) - return FALSE - - obj_flags |= EMAGGED - silence_announcements = FALSE - to_chat(user, span_notice("You overload the node announcement chip, forcing every node to be announced on the common channel.")) - return TRUE /obj/item/circuitboard/computer/rdservercontrol name = "R&D Server Control" diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 03c79049b3087..484cb54b0e340 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, max_length = MAX_MESSAGE_LEN) + var/txt = tgui_input_text(usr, "Choose what to write", "Scribbles", text_buffer) if(isnull(txt)) return txt = crayon_text_strip(txt) diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 491d48a66d392..b1e01e5a6cebc 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -493,7 +493,7 @@ do_help(H, user) -/// Called whenever the paddles successfully shock something +/// Called whenever the paddles successfuly shock something /obj/item/shockpaddles/proc/do_success() if(busy) busy = FALSE @@ -708,7 +708,7 @@ base_icon_state = "syndiepaddles" /obj/item/shockpaddles/syndicate/nanotrasen - name = "elite Nanotrasen defibrillator paddles" + name = "elite nanotrasen defibrillator paddles" desc = "A pair of paddles used to revive deceased ERT members. They possess both the ability to penetrate armor and to deliver powerful or disabling shocks offensively." icon_state = "ntpaddles0" inhand_icon_state = "ntpaddles0" diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 5e59ee700c6aa..8db7652d5a07e 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -41,6 +41,8 @@ set_light_on(TRUE) update_brightness() register_context() + if(toggle_context) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/flashlight_eyes) @@ -254,7 +256,7 @@ if(!scanning.get_bodypart(BODY_ZONE_HEAD)) to_chat(user, span_warning("[scanning] doesn't have a head!")) return - if(light_power < 0.5) + if(light_power < 1) to_chat(user, span_warning("[src] isn't bright enough to see anything!")) return @@ -284,12 +286,12 @@ setDir(user.dir) /// when hit by a light disruptor - turns the light off, forces the light to be disabled for a few seconds -/obj/item/flashlight/on_saboteur(datum/source, disrupt_duration) - . = ..() +/obj/item/flashlight/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER if(light_on) toggle_light() COOLDOWN_START(src, disabled_time, disrupt_duration) - return TRUE + return COMSIG_SABOTEUR_SUCCESS /obj/item/flashlight/pen name = "penlight" diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index dae54ce9e7816..8dd03736a65a9 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -235,12 +235,9 @@ 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) && !always_fail && target_humanoid.flash_act(severity)) + if(prob(effectchance * diode.rating) && 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/multitool.dm b/code/game/objects/items/devices/multitool.dm index 8e29be708db6e..03ed7f927b0f7 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -35,11 +35,6 @@ var/apc_scanner = TRUE COOLDOWN_DECLARE(next_apc_scan) -/obj/item/multitool/Destroy() - if(buffer) - remove_buffer(buffer) - return ..() - /obj/item/multitool/examine(mob/user) . = ..() . += span_notice("Its buffer [buffer ? "contains [buffer]." : "is empty."]") @@ -75,10 +70,9 @@ /obj/item/multitool/proc/set_buffer(datum/buffer) if(src.buffer) UnregisterSignal(src.buffer, COMSIG_QDELETING) - remove_buffer(src.buffer) src.buffer = buffer if(!QDELETED(buffer)) - RegisterSignal(buffer, COMSIG_QDELETING, PROC_REF(remove_buffer)) + RegisterSignal(buffer, COMSIG_QDELETING, PROC_REF(on_buffer_del)) /** * Called when the buffer's stored object is deleted @@ -86,9 +80,8 @@ * This proc does not clear the buffer of the multitool, it is here to * handle the deletion of the object the buffer references */ -/obj/item/multitool/proc/remove_buffer(datum/source) +/obj/item/multitool/proc/on_buffer_del(datum/source) SIGNAL_HANDLER - SEND_SIGNAL(src, COMSIG_MULTITOOL_REMOVE_BUFFER, source) buffer = null // Syndicate device disguised as a multitool; it will turn red when an AI camera is nearby. diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 6ce325034e3ac..5673afc678a41 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -462,7 +462,9 @@ GLOBAL_LIST_INIT(channel_tokens, list( grant_headset_languages(mob_loc) /obj/item/radio/headset/click_alt(mob/living/user) - if(!istype(user) || !command) + if(!istype(user) || !Adjacent(user) || user.incapacitated) + return CLICK_ACTION_BLOCKING + if (!command) return CLICK_ACTION_BLOCKING use_command = !use_command to_chat(user, span_notice("You toggle high-volume mode [use_command ? "on" : "off"].")) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 7303eaf873803..2b7a9bad7602a 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -121,17 +121,19 @@ return AddElement(/datum/element/slapcrafting, string_list(list(/datum/crafting_recipe/improv_explosive))) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) + /obj/item/radio/Destroy() remove_radio_all(src) //Just to be sure if(istype(keyslot)) QDEL_NULL(keyslot) return ..() -/obj/item/radio/on_saboteur(datum/source, disrupt_duration) - . = ..() +/obj/item/radio/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER if(broadcasting) //no broadcasting but it can still be used to send radio messages. set_broadcasting(FALSE) - return TRUE + return COMSIG_SABOTEUR_SUCCESS /obj/item/radio/proc/set_frequency(new_frequency) SEND_SIGNAL(src, COMSIG_RADIO_NEW_FREQUENCY, args) diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index 7374254885251..40ca839cb9a15 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -30,8 +30,6 @@ custom_price = PAYCHECK_COMMAND /// If this analyzer will give a bonus to wound treatments apon woundscan. var/give_wound_treatment_bonus = FALSE - var/last_scan_text - var/scanner_busy = FALSE /obj/item/healthanalyzer/Initialize(mapload) . = ..() @@ -40,7 +38,7 @@ /obj/item/healthanalyzer/examine(mob/user) . = ..() if(src.mode != SCANNER_NO_MODE) - . += span_notice("Alt-click [src] to toggle the limb damage readout. Ctrl-shift-click to print readout report.") + . += span_notice("Alt-click [src] to toggle the limb damage readout.") /obj/item/healthanalyzer/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] begins to analyze [user.p_them()]self with [src]! The display shows that [user.p_theyre()] dead!")) @@ -73,10 +71,10 @@ if ((HAS_TRAIT(user, TRAIT_CLUMSY) || HAS_TRAIT(user, TRAIT_DUMB)) && prob(50)) user.visible_message(span_warning("[user] analyzes the floor's vitals!"), \ span_notice("You stupidly try to analyze the floor's vitals!")) - to_chat(user, "[span_info("Analyzing results for The floor:
\tOverall status: Healthy")]\ -
[span_info("Key: Suffocation/Toxin/Burn/Brute")]\ -
[span_info("\tDamage specifics: 0-0-0-0")]\ -
[span_info("Body temperature: ???")]") + to_chat(user, "[span_info("Analyzing results for The floor:\n\tOverall status: Healthy")]\ + \n[span_info("Key: Suffocation/Toxin/Burn/Brute")]\ + \n[span_info("\tDamage specifics: 0-0-0-0")]\ + \n[span_info("Body temperature: ???")]") return if(ispodperson(M) && !advanced) @@ -90,7 +88,6 @@ switch (scanmode) if (SCANMODE_HEALTH) healthscan(user, M, mode, advanced) - last_scan_text = healthscan(user, M, mode, advanced, tochat = FALSE) if (SCANMODE_WOUND) woundscan(user, M, src) @@ -152,12 +149,12 @@ mob_status = span_alert("Deceased") oxy_loss = max(rand(1, 40), oxy_loss, (300 - (tox_loss + fire_loss + brute_loss))) // Random oxygen loss - render_list += "[span_info("Analyzing results for [target]:")]
Overall status: [mob_status]
" + render_list += "[span_info("Analyzing results for [target]:")]\nOverall status: [mob_status]\n" if(ishuman(target)) var/mob/living/carbon/human/humantarget = target if(humantarget.undergoing_cardiac_arrest() && humantarget.stat != DEAD) - render_list += "Subject suffering from heart attack: Apply defibrillation or other electric shock immediately!
" + render_list += "Subject suffering from heart attack: Apply defibrillation or other electric shock immediately!\n" if(humantarget.has_reagent(/datum/reagent/inverse/technetium)) advanced = TRUE @@ -167,22 +164,22 @@ if(HAS_TRAIT(target, TRAIT_HUSK)) if(advanced) if(HAS_TRAIT_FROM(target, TRAIT_HUSK, BURN)) - render_list += "Subject has been husked by severe burns.
" + render_list += "Subject has been husked by severe burns.\n" else if (HAS_TRAIT_FROM(target, TRAIT_HUSK, CHANGELING_DRAIN)) - render_list += "Subject has been husked by dessication.
" + render_list += "Subject has been husked by dessication.\n" else - render_list += "Subject has been husked by mysterious causes.
" + render_list += "Subject has been husked by mysterious causes.\n" else - render_list += "Subject has been husked.
" + render_list += "Subject has been husked.\n" if(target.getStaminaLoss()) if(advanced) - render_list += "Fatigue level: [target.getStaminaLoss()]%.
" + render_list += "Fatigue level: [target.getStaminaLoss()]%.\n" else - render_list += "Subject appears to be suffering from fatigue.
" + render_list += "Subject appears to be suffering from fatigue.\n" if (!target.get_organ_slot(ORGAN_SLOT_BRAIN)) // kept exclusively for soul purposes - render_list += "Subject lacks a brain.
" + render_list += "Subject lacks a brain.\n" if(iscarbon(target)) var/mob/living/carbon/carbontarget = target @@ -201,14 +198,14 @@ trauma_desc += "permanent " trauma_desc += trauma.scan_desc trauma_text += trauma_desc - render_list += "Cerebral traumas detected: subject appears to be suffering from [english_list(trauma_text)].
" + render_list += "Cerebral traumas detected: subject appears to be suffering from [english_list(trauma_text)].\n" if(carbontarget.quirks.len) - render_list += "Subject Major Disabilities: [carbontarget.get_quirk_string(FALSE, CAT_QUIRK_MAJOR_DISABILITY, from_scan = TRUE)].
" + render_list += "Subject Major Disabilities: [carbontarget.get_quirk_string(FALSE, CAT_QUIRK_MAJOR_DISABILITY, from_scan = TRUE)].\n" if(advanced) - render_list += "Subject Minor Disabilities: [carbontarget.get_quirk_string(FALSE, CAT_QUIRK_MINOR_DISABILITY, TRUE)].
" + render_list += "Subject Minor Disabilities: [carbontarget.get_quirk_string(FALSE, CAT_QUIRK_MINOR_DISABILITY, TRUE)].\n" if (HAS_TRAIT(target, TRAIT_IRRADIATED)) - render_list += "Subject is irradiated. Supply toxin healing.
" + render_list += "Subject is irradiated. Supply toxin healing.\n" //Eyes and ears if(advanced && iscarbon(target)) @@ -218,24 +215,24 @@ var/obj/item/organ/internal/ears/ears = carbontarget.get_organ_slot(ORGAN_SLOT_EARS) if(istype(ears)) if(HAS_TRAIT_FROM(carbontarget, TRAIT_DEAF, GENETIC_MUTATION)) - render_list += "Subject is genetically deaf.
" + render_list += "Subject is genetically deaf.\n" else if(HAS_TRAIT_FROM(carbontarget, TRAIT_DEAF, EAR_DAMAGE)) - render_list += "Subject is deaf from ear damage.
" + render_list += "Subject is deaf from ear damage.\n" else if(HAS_TRAIT(carbontarget, TRAIT_DEAF)) - render_list += "Subject is deaf.
" + render_list += "Subject is deaf.\n" else if(ears.damage) - render_list += "Subject has [ears.damage > ears.maxHealth ? "permanent ": "temporary "]hearing damage.
" + render_list += "Subject has [ears.damage > ears.maxHealth ? "permanent ": "temporary "]hearing damage.\n" if(ears.deaf) - render_list += "Subject is [ears.damage > ears.maxHealth ? "permanently": "temporarily"] deaf.
" + render_list += "Subject is [ears.damage > ears.maxHealth ? "permanently": "temporarily"] deaf.\n" // Eye status var/obj/item/organ/internal/eyes/eyes = carbontarget.get_organ_slot(ORGAN_SLOT_EYES) if(istype(eyes)) if(carbontarget.is_blind()) - render_list += "Subject is blind.
" + render_list += "Subject is blind.\n" else if(carbontarget.is_nearsighted()) - render_list += "Subject is nearsighted.
" + render_list += "Subject is nearsighted.\n" // Body part damage report if(iscarbon(target)) @@ -267,7 +264,7 @@ render_list += dmgreport // tables do not need extra linebreak for(var/obj/item/bodypart/limb as anything in carbontarget.bodyparts) for(var/obj/item/embed as anything in limb.embedded_objects) - render_list += "Embedded object: [embed] located in \the [limb.plaintext_zone]
" + render_list += "Embedded object: [embed] located in \the [limb.plaintext_zone]\n" if(ishuman(target)) var/mob/living/carbon/human/humantarget = target @@ -319,34 +316,34 @@ //Genetic stability if(advanced && humantarget.has_dna()) - render_list += "Genetic Stability: [humantarget.dna.stability]%.
" + render_list += "Genetic Stability: [humantarget.dna.stability]%.\n" // Hulk and body temperature var/datum/species/targetspecies = humantarget.dna.species var/mutant = HAS_TRAIT(humantarget, TRAIT_HULK) - render_list += "Species: [targetspecies.name][mutant ? "-derived mutant" : ""]
" + render_list += "Species: [targetspecies.name][mutant ? "-derived mutant" : ""]\n" var/core_temperature_message = "Core temperature: [round(humantarget.coretemperature-T0C, 0.1)] °C ([round(humantarget.coretemperature*1.8-459.67,0.1)] °F)" if(humantarget.coretemperature >= humantarget.get_body_temp_heat_damage_limit()) - render_list += "☼ [core_temperature_message] ☼
" + render_list += "☼ [core_temperature_message] ☼\n" else if(humantarget.coretemperature <= humantarget.get_body_temp_cold_damage_limit()) - render_list += "❄ [core_temperature_message] ❄
" + render_list += "❄ [core_temperature_message] ❄\n" else - render_list += "[core_temperature_message]
" + render_list += "[core_temperature_message]\n" var/body_temperature_message = "Body temperature: [round(target.bodytemperature-T0C, 0.1)] °C ([round(target.bodytemperature*1.8-459.67,0.1)] °F)" if(target.bodytemperature >= target.get_body_temp_heat_damage_limit()) - render_list += "☼ [body_temperature_message] ☼
" + render_list += "☼ [body_temperature_message] ☼\n" else if(target.bodytemperature <= target.get_body_temp_cold_damage_limit()) - render_list += "❄ [body_temperature_message] ❄
" + render_list += "❄ [body_temperature_message] ❄\n" else - render_list += "[body_temperature_message]
" + render_list += "[body_temperature_message]\n" // Time of death if(target.station_timestamp_timeofdeath && (target.stat == DEAD || ((HAS_TRAIT(target, TRAIT_FAKEDEATH)) && !advanced))) - render_list += "Time of Death: [target.station_timestamp_timeofdeath]
" + render_list += "Time of Death: [target.station_timestamp_timeofdeath]\n" var/tdelta = round(world.time - target.timeofdeath) - render_list += "Subject died [DisplayTimeText(tdelta)] ago.
" + render_list += "Subject died [DisplayTimeText(tdelta)] ago.\n" // Wounds if(iscarbon(target)) @@ -357,14 +354,14 @@ render_list += "Physical trauma[LAZYLEN(wounded_part.wounds) > 1 ? "s" : ""] detected in [wounded_part.name]" for(var/k in wounded_part.wounds) var/datum/wound/W = k - render_list += "
[W.name] ([W.severity_text()])
Recommended treatment: [W.treat_text]
" // less lines than in woundscan() so we don't overload people trying to get basic med info + render_list += "
[W.name] ([W.severity_text()])\nRecommended treatment: [W.treat_text]
" // less lines than in woundscan() so we don't overload people trying to get basic med info render_list += "
" //Diseases for(var/datum/disease/disease as anything in target.diseases) if(!(disease.visibility_flags & HIDDEN_SCANNER)) - render_list += "Warning: [disease.form] detected
\ -
Name: [disease.name].
Type: [disease.spread_text].
Stage: [disease.stage]/[disease.max_stages].
Possible Cure: [disease.cure_text]
\ + render_list += "Warning: [disease.form] detected\n\ +
Name: [disease.name].\nType: [disease.spread_text].\nStage: [disease.stage]/[disease.max_stages].\nPossible Cure: [disease.cure_text]
\
" // divs do not need extra linebreak // Blood Level @@ -373,26 +370,26 @@ var/blood_id = carbontarget.get_blood_id() if(blood_id) if(carbontarget.is_bleeding()) - render_list += "Subject is bleeding!
" + render_list += "Subject is bleeding!\n" var/blood_percent = round((carbontarget.blood_volume / BLOOD_VOLUME_NORMAL) * 100) var/blood_type = carbontarget.dna.blood_type if(blood_id != /datum/reagent/blood) // special blood substance var/datum/reagent/R = GLOB.chemical_reagents_list[blood_id] blood_type = R ? R.name : blood_id if(carbontarget.blood_volume <= BLOOD_VOLUME_SAFE && carbontarget.blood_volume > BLOOD_VOLUME_OKAY) - render_list += "Blood level: LOW [blood_percent]%, [carbontarget.blood_volume] cl, [span_info("type: [blood_type]")]
" + render_list += "Blood level: LOW [blood_percent]%, [carbontarget.blood_volume] cl, [span_info("type: [blood_type]")]\n" else if(carbontarget.blood_volume <= BLOOD_VOLUME_OKAY) - render_list += "Blood level: CRITICAL [blood_percent]%, [carbontarget.blood_volume] cl, [span_info("type: [blood_type]")]
" + render_list += "Blood level: CRITICAL [blood_percent]%, [carbontarget.blood_volume] cl, [span_info("type: [blood_type]")]\n" else - render_list += "Blood level: [blood_percent]%, [carbontarget.blood_volume] cl, type: [blood_type]
" + render_list += "Blood level: [blood_percent]%, [carbontarget.blood_volume] cl, type: [blood_type]\n" // Blood Alcohol Content var/blood_alcohol_content = target.get_blood_alcohol_content() if(blood_alcohol_content > 0) if(blood_alcohol_content >= 0.24) - render_list += "Blood alcohol content: CRITICAL [blood_alcohol_content]%
" + render_list += "Blood alcohol content: CRITICAL [blood_alcohol_content]%\n" else - render_list += "Blood alcohol content: [blood_alcohol_content]%
" + render_list += "Blood alcohol content: [blood_alcohol_content]%\n" // Cybernetics if(iscarbon(target)) @@ -402,8 +399,8 @@ if(IS_ROBOTIC_ORGAN(cyberimp) && !(cyberimp.organ_flags & ORGAN_HIDDEN)) cyberimp_detect += "[!cyberimp_detect ? "[cyberimp.examine_title(user)]" : ", [cyberimp.examine_title(user)]"]" if(cyberimp_detect) - render_list += "Detected cybernetic modifications:
" - render_list += "[cyberimp_detect]
" + render_list += "Detected cybernetic modifications:\n" + render_list += "[cyberimp_detect]\n" // we handled the last
so we don't need handholding if(tochat) @@ -411,37 +408,6 @@ else return(jointext(render_list, "")) -/obj/item/healthanalyzer/click_ctrl_shift(mob/user) - . = ..() - if(!LAZYLEN(last_scan_text)) - balloon_alert(user, "no scans!") - return - if(scanner_busy) - balloon_alert(user, "analyzer busy!") - return - scanner_busy = TRUE - balloon_alert(user, "printing report...") - addtimer(CALLBACK(src, PROC_REF(print_report)), 2 SECONDS) - -/obj/item/healthanalyzer/proc/print_report(mob/user) - var/obj/item/paper/report_paper = new(get_turf(src)) - - report_paper.color = COLOR_STARLIGHT - report_paper.name = "Health scan report" - var/report_text = "
Health scan report. Time of scan: [station_time_timestamp()]


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

" + render_list += "
[simple_scan ? current_wound.get_simple_scanner_description() : current_wound.get_scanner_description()]
\n" if (scanner.give_wound_treatment_bonus) ADD_TRAIT(current_wound, TRAIT_WOUND_SCANNED, ANALYZER_TRAIT) if(!advised) @@ -704,8 +670,8 @@ var/list/render = list() for(var/datum/disease/disease as anything in patient.diseases) if(!(disease.visibility_flags & HIDDEN_SCANNER)) - render += "Warning: [disease.form] detected
\ -
Name: [disease.name].
Type: [disease.spread_text].
Stage: [disease.stage]/[disease.max_stages].
Possible Cure: [disease.cure_text]
\ + render += "Warning: [disease.form] detected\n\ +
Name: [disease.name].\nType: [disease.spread_text].\nStage: [disease.stage]/[disease.max_stages].\nPossible Cure: [disease.cure_text]
\
" if(!length(render)) diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 9b6328fe682fa..b86489fae9ea7 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -162,7 +162,7 @@ if(mytape && recording) mytape.timestamp += mytape.used_capacity - mytape.storedinfo += "\[[time2text(mytape.used_capacity,"mm:ss")]\] [speaker.GetVoice()]: [raw_message]" + mytape.storedinfo += "\[[time2text(mytape.used_capacity,"mm:ss")]\] [raw_message]" /obj/item/taperecorder/verb/record() diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 4f0c0a84aa317..d17530c801085 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -25,36 +25,11 @@ /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 40f08e78ffc77..4445cdd1b7277 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", max_length = MAX_MESSAGE_LEN) || initial(selected_message) + selected_message = tgui_input_text(user, "What is your question?", "Eightball") || 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 4eca1dc2fc0a7..fe066bd1bf572 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/bait.dm b/code/game/objects/items/food/bait.dm index 711c6cb1e68ff..f31eb44f308eb 100644 --- a/code/game/objects/items/food/bait.dm +++ b/code/game/objects/items/food/bait.dm @@ -6,8 +6,6 @@ var/bait_quality = TRAIT_BASIC_QUALITY_BAIT /// Icon state added to main fishing rod icon when this bait is equipped var/rod_overlay_icon_state - /// Is this included in the autowiki? - var/show_on_wiki = TRUE /obj/item/food/bait/Initialize(mapload) . = ..() @@ -38,14 +36,9 @@ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' righthand_file = 'icons/mob/inhands/items_righthand.dmi' inhand_icon_state = "pen" - bait_quality = TRAIT_GREAT_QUALITY_BAIT //this is only here for autowiki purposes, it's removed on init. food_reagents = list(/datum/reagent/drug/kronkaine = 2) //The kronkaine is the thing that makes this a great bait. tastes = list("hypocrisy" = 1) -/obj/item/food/bait/natural/Initialize(mapload) - . = ..() - REMOVE_TRAIT(src, bait_quality, INNATE_TRAIT) - /obj/item/food/bait/doughball name = "doughball" desc = "Small piece of dough. Simple but effective fishing bait." @@ -58,12 +51,17 @@ bait_quality = TRAIT_BASIC_QUALITY_BAIT rod_overlay_icon_state = "dough_overlay" -///The abstract synthetic doughball type. +/** + * Bound to the tech fishing rod, from which cannot be removed, + * Bait-related preferences and traits, both negative and positive, + * should be ignored by this bait. + * Otherwise it'd be hard/impossible to cath some fish with it, + * making that rod a shoddy choice in the long run. + */ /obj/item/food/bait/doughball/synthetic name = "synthetic doughball" icon_state = "doughball_blue" preserved_food = TRUE - show_on_wiki = FALSE //It's an abstract item. /obj/item/food/bait/doughball/synthetic/Initialize(mapload) . = ..() @@ -72,17 +70,10 @@ ///Found in the can of omni-baits, only available from the super fishing toolbox, from the fishing mystery box. /obj/item/food/bait/doughball/synthetic/super name = "super-doughball" - desc = "Be they herbivore or carnivores, no fish will be able to resist this." + desc = "No fish will be able to resist this." bait_quality = TRAIT_GREAT_QUALITY_BAIT - show_on_wiki = TRUE -/** - * Bound to the tech fishing rod, from which cannot be removed, - * Bait-related preferences and traits, both negative and positive, - * should be ignored by this bait. - * Otherwise it'd be hard/impossible to cath some fish with it, - * making that rod a shoddy choice in the long run. - */ +///Used by the advanced fishing rod /obj/item/food/bait/doughball/syntethic/unconsumable /obj/item/food/bait/doughball/synthetic/unconsumable/Initialize(mapload) diff --git a/code/game/objects/items/food/donuts.dm b/code/game/objects/items/food/donuts.dm index 922ed2eaa6674..0d2e2f91d3008 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 a619be72062af..5ad5cea20fae8 100644 --- a/code/game/objects/items/food/meatdish.dm +++ b/code/game/objects/items/food/meatdish.dm @@ -57,7 +57,7 @@ food_reagents = list( /datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 3, - /datum/reagent/consumable/nutriment/fat = 2, + /datum/reagent/consumable/nutriment/fat/oil = 2, ) bite_consumption = 4.5 crafting_complexity = FOOD_COMPLEXITY_1 @@ -99,20 +99,14 @@ /obj/item/food/fishmeat/gunner_jellyfish name = "filleted gunner jellyfish" - desc = "A gunner jellyfish with the stingers removed. Mildly hallucinogenic when raw." + desc = "A gunner jellyfish with the stingers removed. Mildly hallucinogenic." icon = 'icons/obj/food/lizard.dmi' icon_state = "jellyfish_fillet" food_reagents = list( - /datum/reagent/consumable/nutriment/protein = 4, //The halluginogen comes from the fish trait. + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/toxin/mindbreaker = 2, ) -///Premade gunner jellyfish fillets from supply orders. Contains the halluginogen that'd be normally from the fish trait. -/obj/item/food/fishmeat/gunner_jellyfish/supply - -/obj/item/food/fishmeat/gunner_jellyfish/supply/Initialize(mapload) - food_reagents[/datum/reagent/toxin/mindbreaker/fish] = 2 - return ..() - /obj/item/food/fishmeat/armorfish name = "cleaned armorfish" desc = "An armorfish with its guts and shell removed, ready for use in cooking." diff --git a/code/game/objects/items/food/misc.dm b/code/game/objects/items/food/misc.dm index 54ec5ce019012..b2cf4d132c5fb 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 cbf604db63d0d..ca7da893bb4b4 100644 --- a/code/game/objects/items/grenades/_grenade.dm +++ b/code/game/objects/items/grenades/_grenade.dm @@ -51,8 +51,6 @@ 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) . = ..() @@ -212,10 +210,7 @@ return FALSE if(change_det_time()) tool.play_tool_sound(src) - 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)].")) + 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) @@ -225,7 +220,7 @@ . = TRUE - var/newtime = tgui_input_list(user, "Please enter a new detonation time", "Detonation Timer", possible_fuse_time) + var/newtime = tgui_input_list(user, "Please enter a new detonation time", "Detonation Timer", list("Instant", 3, 4, 5)) if (isnull(newtime)) return if(!user.can_perform_action(src)) @@ -233,40 +228,25 @@ 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(text2num(newtime)) + newtime = round(newtime) if(change_det_time(newtime)) to_chat(user, span_notice("You modify the time delay. It's set for [DisplayTimeText(det_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) +/obj/item/grenade/proc/change_det_time(time) //Time uses real time. . = TRUE - //Multitool if(!isnull(time)) - 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] + det_time = round(clamp(time * 10, 0, 5 SECONDS)) else - det_time = possible_fuse_time[old_selection+1] - - if(det_time == "Instant") - det_time = 0 //String to num conversion because I hate coders - return - det_time = text2num(det_time) SECONDS + 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 /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 6817610bf76e7..98e7a4bab796e 100644 --- a/code/game/objects/items/grenades/flashbang.dm +++ b/code/game/objects/items/grenades/flashbang.dm @@ -4,7 +4,6 @@ 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_noteleport.dm b/code/game/objects/items/implants/security/implant_noteleport.dm index a757e2cc0cd0f..b4795a7f797b7 100644 --- a/code/game/objects/items/implants/security/implant_noteleport.dm +++ b/code/game/objects/items/implants/security/implant_noteleport.dm @@ -17,7 +17,6 @@ if(!. || !isliving(target)) return FALSE RegisterSignal(target, COMSIG_MOVABLE_TELEPORTING, PROC_REF(on_teleport)) - RegisterSignal(target, COMSIG_MOB_PRE_JAUNT, PROC_REF(on_jaunt)) return TRUE /obj/item/implant/teleport_blocker/removed(mob/target, silent = FALSE, special = FALSE) @@ -25,7 +24,6 @@ if(!. || !isliving(target)) return FALSE UnregisterSignal(target, COMSIG_MOVABLE_TELEPORTING) - UnregisterSignal(target, COMSIG_MOB_PRE_JAUNT) return TRUE /// Signal for COMSIG_MOVABLE_TELEPORTED that blocks teleports and stuns the would-be-teleportee. @@ -40,18 +38,6 @@ spark_system.start() return COMPONENT_BLOCK_TELEPORT -/// Signal for COMSIG_MOB_PRE_JAUNT that prevents a user from entering a jaunt. -/obj/item/implant/teleport_blocker/proc/on_jaunt(mob/living/jaunter) - SIGNAL_HANDLER - - to_chat(jaunter, span_holoparasite("As you attempt to jaunt, you slam directly into the barrier between realities and are sent crashing back into corporeality!")) - - jaunter.apply_status_effect(/datum/status_effect/incapacitating/paralyzed, 5 SECONDS) - var/datum/effect_system/spark_spread/quantum/spark_system = new() - spark_system.set_up(5, TRUE, jaunter) - spark_system.start() - return COMPONENT_BLOCK_JAUNT - /obj/item/implantcase/teleport_blocker name = "implant case - 'Bluespace Grounding'" desc = "A glass case containing a bluespace grounding implant." diff --git a/code/game/objects/items/implants/security/implant_track.dm b/code/game/objects/items/implants/security/implant_track.dm index 9b8050d7dade2..b95c0afa7d857 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", max_length = MAX_MESSAGE_LEN) + var/warning = tgui_input_text(user, "What warning do you want to send to [imp_in.name]?", "Messaging") 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 26cefd6eeedbd..2aec478162445 100644 --- a/code/game/objects/items/mail.dm +++ b/code/game/objects/items/mail.dm @@ -548,10 +548,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", max_length = MAX_LABEL_LEN) + var/mail_name = tgui_input_text(user, "Enter mail title, or leave it blank", "Mail Counterfeiting") if(!(src in user.contents)) return FALSE - if(reject_bad_text(mail_name, max_length = MAX_LABEL_LEN, ascii_only = FALSE)) + if(reject_bad_text(mail_name, ascii_only = FALSE)) shady_mail.name = mail_name else shady_mail.name = mail_type diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index 0fd63321519c0..8c1ae33c4c70e 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -479,6 +479,7 @@ else cell = new preload_cell_type(src) RegisterSignal(src, COMSIG_ATOM_ATTACKBY, PROC_REF(convert)) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) update_appearance() /obj/item/melee/baton/security/get_cell() @@ -513,14 +514,13 @@ qdel(item) qdel(src) -/obj/item/melee/baton/security/on_saboteur(datum/source, disrupt_duration) - . = ..() +/obj/item/melee/baton/security/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER if(!active) return turn_off() update_appearance() - return TRUE - + return COMSIG_SABOTEUR_SUCCESS /obj/item/melee/baton/security/Exited(atom/movable/mov_content) . = ..() if(mov_content == cell) diff --git a/code/game/objects/items/rcd/RCD.dm b/code/game/objects/items/rcd/RCD.dm index 279bc91d622c5..cf18773015870 100644 --- a/code/game/objects/items/rcd/RCD.dm +++ b/code/game/objects/items/rcd/RCD.dm @@ -126,7 +126,7 @@ var/atom/movable/rcd_structure = rcd_results["[RCD_DESIGN_PATH]"] /** *For anything that does not go an a wall we have to make sure that turf is clear for us to put the structure on it - *If we are just trying to destroy something then this check is not necessary + *If we are just trying to destory something then this check is not nessassary *RCD_WALLFRAME is also returned as the rcd_mode when upgrading apc, airalarm, firealarm using simple circuits upgrade */ if(rcd_mode != RCD_WALLFRAME && rcd_mode != RCD_DECONSTRUCT) @@ -142,7 +142,7 @@ structures_to_ignore = list(/obj/structure/grille) else //when building directional windows we ignore the grill and other directional windows structures_to_ignore = list(/obj/structure/grille, /obj/structure/window) - else //for directional windows we ignore other directional windows as they can be in different directions on the turf. + else //for directional windows we ignore other directional windows as they can be in diffrent directions on the turf. structures_to_ignore = list(/obj/structure/window) //check if we can build our window on the grill @@ -152,7 +152,7 @@ return FALSE /** - * if we are trying to create plating on turf which is not a proper floor then don't check for objects on top of the turf just allow that turf to be converted into plating. e.g. create plating beneath a player or underneath a machine frame/any dense object + * if we are trying to create plating on turf which is not a proper floor then dont check for objects on top of the turf just allow that turf to be converted into plating. e.g. create plating beneath a player or underneath a machine frame/any dense object * if we are trying to finish a wall girder then let it finish then make sure no one/nothing is stuck in the girder */ else if(rcd_mode == RCD_TURF && rcd_structure == /turf/open/floor/plating/rcd && (!istype(target_turf, /turf/open/floor) || istype(target, /obj/structure/girder))) @@ -184,10 +184,10 @@ ignored_types = list(/obj/structure/window) //if we are trying to create grills/windoors we can go ahead and further ignore other windoors on the turf if(rcd_mode == RCD_WINDOWGRILLE || (rcd_mode == RCD_AIRLOCK && ispath(rcd_structure, /obj/machinery/door/window))) - //only ignore mobs if we are trying to create windoors and not grills. We don't want to drop a grill on top of somebody + //only ignore mobs if we are trying to create windoors and not grills. We dont want to drop a grill on top of somebody ignore_mobs = rcd_mode == RCD_AIRLOCK ignored_types += /obj/machinery/door/window - //if we are trying to create full airlock doors then we do the regular checks and make sure we have the full space for them. i.e. don't ignore anything dense on the turf + //if we are trying to create full airlock doors then we do the regular checks and make sure we have the full space for them. i.e. dont ignore anything dense on the turf else if(rcd_mode == RCD_AIRLOCK) ignored_types = list() @@ -369,10 +369,10 @@ * The advantage of organizing designs into categories is that * You can ignore an complete category if the design disk upgrade for that category isn't installed. */ - //You can't select designs from the Machines category if you don't have the frames upgrade installed. + //You can't select designs from the Machines category if you dont have the frames upgrade installed. if(category == "Machines" && !(upgrade & RCD_UPGRADE_FRAMES)) return TRUE - //You can't select designs from the Furniture category if you don't have the furnishing upgrade installed. + //You can't select designs from the Furniture category if you dont have the furnishing upgrade installed. if(category == "Furniture" && !(upgrade & RCD_UPGRADE_FURNISHING)) return TRUE diff --git a/code/game/objects/items/rcd/RHD.dm b/code/game/objects/items/rcd/RHD.dm index 8007fac4dd4c7..a212274ce46be 100644 --- a/code/game/objects/items/rcd/RHD.dm +++ b/code/game/objects/items/rcd/RHD.dm @@ -71,7 +71,7 @@ return silo_mats.mat_container.get_material_amount(/datum/material/iron) / SILO_USE_AMOUNT return 0 -///returns local matter units available. overridden by rcd borg to return power units available +///returns local matter units available. overriden by rcd borg to return power units available /obj/item/construction/proc/get_matter(mob/user) return matter diff --git a/code/game/objects/items/robot/ai_upgrades.dm b/code/game/objects/items/robot/ai_upgrades.dm index b630a3b8a4231..f6357b229efb9 100644 --- a/code/game/objects/items/robot/ai_upgrades.dm +++ b/code/game/objects/items/robot/ai_upgrades.dm @@ -1,45 +1,4 @@ ///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 @@ -75,21 +34,28 @@ //Lipreading -/obj/item/aiupgrade/surveillance_upgrade +/obj/item/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." - to_gift = /datum/ai_module/malf/upgrade/eavesdrop + icon = 'icons/obj/devices/circuitry_n_data.dmi' + icon_state = "datadisk3" -/obj/item/aiupgrade/surveillance_upgrade/Initialize(mapload) +/obj/item/surveillance_upgrade/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) - -/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 - - - - +/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 diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm index f0548fa66f404..53e307e31d6e0 100644 --- a/code/game/objects/items/spear.dm +++ b/code/game/objects/items/spear.dm @@ -177,8 +177,10 @@ return if(target.resistance_flags & INDESTRUCTIBLE) //due to the lich incident of 2021, embedding grenades inside of indestructible structures is forbidden return - if(HAS_TRAIT(target, TRAIT_GODMODE)) - return + if(ismob(target)) + var/mob/mob_target = target + if(mob_target.status_flags & GODMODE) //no embedding grenade phylacteries inside of ghost poly either + return if(iseffect(target)) //and no accidentally wasting your moment of glory on graffiti return user.say("[war_cry]", forced="spear warcry") diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm index 110713d343612..568fd2f49aa29 100644 --- a/code/game/objects/items/stacks/sheets/sheets.dm +++ b/code/game/objects/items/stacks/sheets/sheets.dm @@ -63,7 +63,7 @@ * Facilitates sheets being smacked on the floor * * This is used for crafting by hitting the floor with items. - * The initial use case is glass sheets breaking in to shards when the floor is hit. + * The inital use case is glass sheets breaking in to shards when the floor is hit. * Args: * * user: The user that did the action * * params: paramas passed in from attackby diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index e2a8e10c4df49..5eb651b2905d4 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -177,7 +177,7 @@ /** * use available_amount of sheets/pieces, return TRUE only if all sheets/pieces of this stack were used * we don't delete this stack when it reaches 0 because we expect the all in one grinder, etc to delete - * this stack if grinding was successful + * this stack if grinding was successfull */ use(available_amount, check = FALSE) return available_amount == current_amount @@ -546,7 +546,7 @@ update_weight() return TRUE -/obj/item/stack/tool_use_check(mob/living/user, amount, heat_required) +/obj/item/stack/tool_use_check(mob/living/user, amount) if(get_amount() < amount) // general balloon alert that says they don't have enough user.balloon_alert(user, "not enough material!") diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index b4855c52fae35..4b89719998c8f 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -68,7 +68,7 @@ * Place our tile on a plating, or replace it. * * Arguments: - * * target_plating - Instance of the plating we want to place on. Replaced during successful executions. + * * target_plating - Instance of the plating we want to place on. Replaced during sucessful executions. * * user - The mob doing the placing. */ /obj/item/stack/tile/proc/place_tile(turf/open/floor/plating/target_plating, mob/user) @@ -1259,7 +1259,7 @@ inhand_icon_state = "tile-catwalk" mats_per_unit = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT) turf_type = /turf/open/floor/catwalk_floor - merge_type = /obj/item/stack/tile/catwalk_tile //Just to be cleaner, these all stack with each other + merge_type = /obj/item/stack/tile/catwalk_tile //Just to be cleaner, these all stack with eachother tile_reskin_types = list( /obj/item/stack/tile/catwalk_tile, /obj/item/stack/tile/catwalk_tile/iron, diff --git a/code/game/objects/items/stickers.dm b/code/game/objects/items/stickers.dm index 9924749379573..447e202247367 100644 --- a/code/game/objects/items/stickers.dm +++ b/code/game/objects/items/stickers.dm @@ -25,7 +25,7 @@ throw_range = 3 pressure_resistance = 0 - item_flags = NOBLUDGEON + item_flags = NOBLUDGEON | XENOMORPH_HOLDABLE //funny ~Jimmyl w_class = WEIGHT_CLASS_TINY /// `list` or `null`, contains possible alternate `icon_states`. diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index 095250fdcca52..2a2affef2cb9e 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -274,6 +274,8 @@ . += span_notice("Ctrl-click to activate seed extraction.") /obj/item/storage/bag/plants/portaseeder/item_ctrl_click(mob/user) + if(user.incapacitated) + return for(var/obj/item/plant in contents) seedify(plant, 1) return CLICK_ACTION_SUCCESS @@ -575,7 +577,7 @@ new /obj/item/ammo_casing/harpoon(src) /obj/item/storage/bag/rebar_quiver - name = "rebar quiver" + name = "Rebar Storage Quiver" icon = 'icons/obj/weapons/bows/quivers.dmi' icon_state = "rebar_quiver" worn_icon_state = "rebar_quiver" @@ -605,7 +607,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_NORMAL + w_class = WEIGHT_CLASS_SMALL resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF actions_types = list(/datum/action/item_action/reload_rebar) @@ -647,7 +649,7 @@ if(held_crossbow.magazine.contents.len >= held_crossbow.magazine.max_ammo) user.balloon_alert(user, "no more room!") return - if(!do_after(user, 1.2 SECONDS, user)) + if(!do_after(user, 0.8 SECONDS, user, IGNORE_USER_LOC_CHANGE)) return var/obj/item/ammo_casing/rebar/ammo_to_load = contents[1] diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 40d35a334d08f..5386718d94718 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -515,7 +515,6 @@ . = ..() atom_storage.max_slots = 1 atom_storage.set_holdable(/obj/item/clothing/mask/luchador) - AddComponent(/datum/component/adjust_fishing_difficulty, -2) /obj/item/storage/belt/military name = "chest rig" diff --git a/code/game/objects/items/storage/boxes/food_boxes.dm b/code/game/objects/items/storage/boxes/food_boxes.dm index bac558ce3be78..86d59123c72aa 100644 --- a/code/game/objects/items/storage/boxes/food_boxes.dm +++ b/code/game/objects/items/storage/boxes/food_boxes.dm @@ -301,7 +301,7 @@ new /obj/item/food/fishmeat/armorfish(src) new /obj/item/food/fishmeat/carp(src) new /obj/item/food/fishmeat/moonfish(src) - new /obj/item/food/fishmeat/gunner_jellyfish/supply(src) + new /obj/item/food/fishmeat/gunner_jellyfish(src) /obj/item/storage/box/ingredients/salads theme_name = "salads" diff --git a/code/game/objects/items/storage/medkit.dm b/code/game/objects/items/storage/medkit.dm index e5db3d75855ea..368ef9c0b406a 100644 --- a/code/game/objects/items/storage/medkit.dm +++ b/code/game/objects/items/storage/medkit.dm @@ -818,8 +818,3 @@ /obj/item/storage/test_tube_rack/update_icon_state() icon_state = "[base_icon_state][contents.len > 0 ? contents.len : null]" return ..() - -/obj/item/storage/test_tube_rack/full/PopulateContents() - for(var/i in 1 to atom_storage.max_slots) - new /obj/item/reagent_containers/cup/tube(src) - diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index 873b45210cdec..d2bb90e69e445 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -410,7 +410,6 @@ desc = "A bandana. It seems to have a little carp embroidered on the inside, as well as the kanji '魚'." icon_state = "snake_eater" inhand_icon_state = null - clothing_traits = list(TRAIT_FISH_EATER) /obj/item/clothing/head/costume/knight name = "fake medieval helmet" diff --git a/code/game/objects/items/tcg/tcg.dm b/code/game/objects/items/tcg/tcg.dm index 30650fcd69f7e..23204b4809ff8 100644 --- a/code/game/objects/items/tcg/tcg.dm +++ b/code/game/objects/items/tcg/tcg.dm @@ -3,7 +3,7 @@ /obj/item/tcgcard name = "Coder" - desc = "Wow, a mint condition coder card! Better tell the GitHub all about this!" + desc = "Wow, a mint condition coder card! Better tell the Github all about this!" icon = DEFAULT_TCG_DMI_ICON icon_state = "runtime" w_class = WEIGHT_CLASS_TINY @@ -332,11 +332,11 @@ GLOBAL_LIST_EMPTY(tcgcard_radial_choices) /obj/item/cardpack name = "Trading Card Pack: Coder" - desc = "Contains six complete fuckups by the coders. Report this on GitHub please!" + desc = "Contains six complete fuckups by the coders. Report this on github please!" icon = 'icons/obj/toys/tcgmisc.dmi' icon_state = "error" w_class = WEIGHT_CLASS_TINY - custom_price = PAYCHECK_CREW * 0.75 //Price reduced from * 2 to * 0.75, this is planned as a temporary measure until card persistence is added. + custom_price = PAYCHECK_CREW * 0.75 //Price reduced from * 2 to * 0.75, this is planned as a temporary measure until card persistance is added. ///The card series to look in var/series = "MEME" ///Chance of the pack having a coin in it out of 10 @@ -351,7 +351,7 @@ GLOBAL_LIST_EMPTY(tcgcard_radial_choices) "epic" = 30, "legendary" = 5, "misprint" = 1) - ///The amount of cards to draw from the guaranteed rarity table + ///The amount of cards to draw from the guarenteed rarity table var/guaranteed_count = 1 ///The guaranteed rarity table, acts about the same as the rarity table. it can have as many or as few raritys as you'd like var/list/guar_rarity = list( @@ -434,7 +434,7 @@ GLOBAL_LIST_EMPTY(tcgcard_radial_choices) atom_storage.max_total_storage = 120 atom_storage.max_slots = 60 -///Returns a list of cards ids of card_cnt weighted by rarity from the pack's tables that have matching series, with gnt_cnt of the guaranteed table. +///Returns a list of cards ids of card_cnt weighted by rarity from the pack's tables that have matching series, with gnt_cnt of the guarenteed table. /obj/item/cardpack/proc/buildCardListWithRarity(card_cnt, rarity_cnt) var/list/toReturn = list() //You can always get at least one of some rarity @@ -453,7 +453,7 @@ GLOBAL_LIST_EMPTY(tcgcard_radial_choices) weight += rarity_table[chance] var/random = rand(weight) for(var/bracket in rarity_table) - //Steals blatantly from pick_weight(), sorry buddy I need the index + //Steals blatently from pick_weight(), sorry buddy I need the index random -= rarity_table[bracket] if(random <= 0) rarity = bracket @@ -469,12 +469,12 @@ GLOBAL_LIST_EMPTY(tcgcard_radial_choices) log_runtime("The index [rarity] of rarity_table does not exist in the global cache") return toReturn -//All of these values should be overridden by either a template or a card itself +//All of these values should be overriden by either a template or a card itself /datum/card ///Unique ID, for use in lookups and (eventually) for persistence. MAKE SURE THIS IS UNIQUE FOR EACH CARD IN AS SERIES, OR THE ENTIRE SYSTEM WILL BREAK, AND I WILL BE VERY DISAPPOINTED. var/id = "coder" var/name = "Coder" - var/desc = "Wow, a mint condition coder card! Better tell the GitHub all about this!" + var/desc = "Wow, a mint condition coder card! Better tell the Github all about this!" ///This handles any extra rules for the card, i.e. extra attributes, special effects, etc. If you've played any other card game, you know how this works. var/rules = "There are no rules here. There is no escape. No Recall or Intervention can work in this place." var/icon = DEFAULT_TCG_DMI diff --git a/code/game/objects/items/tcg/tcg_machines.dm b/code/game/objects/items/tcg/tcg_machines.dm index 7a55e2e9554f7..77b6891e4c17a 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_length = MAX_NAME_LEN) + var/card_name = tgui_input_text(user, "Insert card name", "Blank Card Naming", "blank card", 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/theft_tools.dm b/code/game/objects/items/theft_tools.dm index d51130a4d21d2..e13251fe8e5ea 100644 --- a/code/game/objects/items/theft_tools.dm +++ b/code/game/objects/items/theft_tools.dm @@ -187,7 +187,7 @@ if(!isliving(hit_atom)) return ..() var/mob/living/victim = hit_atom - if(victim.incorporeal_move || HAS_TRAIT(victim, TRAIT_GODMODE)) //try to keep this in sync with supermatter's consume fail conditions + if(victim.incorporeal_move || victim.status_flags & GODMODE) //try to keep this in sync with supermatter's consume fail conditions return ..() var/mob/thrower = throwingdatum?.get_thrower() if(thrower) @@ -208,7 +208,7 @@ /obj/item/nuke_core/supermatter_sliver/pickup(mob/living/user) ..() - if(!isliving(user) || HAS_TRAIT(user, TRAIT_GODMODE)) //try to keep this in sync with supermatter's consume fail conditions + if(!isliving(user) || user.status_flags & GODMODE) //try to keep this in sync with supermatter's consume fail conditions return FALSE user.visible_message(span_danger("[user] reaches out and tries to pick up [src]. [user.p_their()] body starts to glow and bursts into flames before flashing into dust!"),\ span_userdanger("You reach for [src] with your hands. That was dumb."),\ @@ -311,7 +311,7 @@ if(!isliving(AM)) return var/mob/living/victim = AM - if(victim.incorporeal_move || HAS_TRAIT(victim, TRAIT_GODMODE)) //try to keep this in sync with supermatter's consume fail conditions + if(victim.incorporeal_move || victim.status_flags & GODMODE) //try to keep this in sync with supermatter's consume fail conditions return victim.investigate_log("has been dusted by [src].", INVESTIGATE_DEATHS) victim.dust() diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index dfc406437201b..143b8eab174e6 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -1,3 +1,5 @@ +/// How many seconds between each fuel depletion tick ("use" proc) +#define WELDER_FUEL_BURN_INTERVAL 5 /obj/item/weldingtool name = "welding tool" desc = "A standard edition welder provided by Nanotrasen." @@ -87,7 +89,7 @@ force = 15 damtype = BURN burned_fuel_for += seconds_per_tick - if(burned_fuel_for >= TOOL_FUEL_BURN_INTERVAL) + if(burned_fuel_for >= WELDER_FUEL_BURN_INTERVAL) use(TRUE) update_appearance() @@ -274,17 +276,16 @@ return welding /// If welding tool ran out of fuel during a construction task, construction fails. -/obj/item/weldingtool/tool_use_check(mob/living/user, amount, heat_required) +/obj/item/weldingtool/tool_use_check(mob/living/user, amount) if(!isOn() || !check_fuel()) to_chat(user, span_warning("[src] has to be on to complete this task!")) return FALSE - if(get_fuel() < amount) + + if(get_fuel() >= amount) + return TRUE + else to_chat(user, span_warning("You need more welding fuel to complete this task!")) return FALSE - if(heat < heat_required) - to_chat(user, span_warning("[src] is not hot enough to complete this task!")) - return FALSE - return TRUE /// Ran when the welder is attacked by a screwdriver. /obj/item/weldingtool/proc/flamethrower_screwdriver(obj/item/tool, mob/user) @@ -409,3 +410,5 @@ if(get_fuel() < max_fuel && nextrefueltick < world.time) nextrefueltick = world.time + 10 reagents.add_reagent(/datum/reagent/fuel, 1) + +#undef WELDER_FUEL_BURN_INTERVAL diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 139a3fcb216f2..1c82bffbf7c7e 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1134,6 +1134,7 @@ name = "xenomorph action figure" desc = "MEGA presents the new Xenos Isolated action figure! Comes complete with realistic sounds! Pull back string to use." w_class = WEIGHT_CLASS_SMALL + item_flags = XENOMORPH_HOLDABLE var/cooldown = 0 /obj/item/toy/toy_xeno/attack_self(mob/user) @@ -1404,7 +1405,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_length = MAX_NAME_LEN) + var/new_name = tgui_input_text(usr, "What would you like to name the dummy?", "Doll Name", doll_name, 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 2db970b556ae1..ef19205cf8063 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/wall_turf = get_step(get_turf(user), user.dir) - if(iswallturf(wall_turf)) - wall_turf.item_interaction(user, src) + var/turf/T = get_step(get_turf(user), user.dir) + if(iswallturf(T)) + T.attackby(src, user) return ITEM_INTERACT_SUCCESS /obj/item/wallframe/wrench_act(mob/living/user, obj/item/tool) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 0a88aade6978f..ef436e24e8c1a 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -187,11 +187,8 @@ GLOBAL_LIST_EMPTY(objects_by_id_tag) . = ..() if(desc_controls) . += span_notice(desc_controls) - -/obj/examine_tags(mob/user) - . = ..() if(obj_flags & UNIQUE_RENAME) - .["renameable"] = "Use a pen on it to rename it or change its description." + . += span_notice("Use a pen on it to rename it or change its description.") /obj/analyzer_act(mob/living/user, obj/item/analyzer/tool) if(atmos_scan(user=user, target=src, silent=FALSE)) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index e6c9579d67936..701c13bfcf755 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -58,9 +58,6 @@ if(!broken) return span_warning("It's falling apart!") -/obj/structure/examine_descriptor(mob/user) - return "structure" - /obj/structure/rust_heretic_act() take_damage(500, BRUTE, "melee", 1) diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index 9131a28e6eb06..4ade32bdd0e0a 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -27,8 +27,6 @@ var/elevation = 8 /// If this bed can be deconstructed using a wrench var/can_deconstruct = TRUE - /// Directions in which the bed has its headrest on the left side. - var/left_headrest_dirs = NORTHEAST /obj/structure/bed/Initialize(mapload) . = ..() @@ -60,7 +58,7 @@ update_buckle_vars(newdir) /obj/structure/bed/proc/update_buckle_vars(newdir) - buckle_lying = newdir & left_headrest_dirs ? 270 : 90 + buckle_lying = newdir & NORTHEAST ? 270 : 90 /obj/structure/bed/atom_deconstruct(disassembled = TRUE) if(build_stack_type) @@ -85,8 +83,6 @@ icon_state = "med_down" base_icon_state = "med" anchored = FALSE - left_headrest_dirs = SOUTHWEST - buckle_lying = 270 resistance_flags = NONE build_stack_type = /obj/item/stack/sheet/mineral/titanium build_stack_amount = 1 diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 73020ba93bbb7..e1581422d0570 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -16,17 +16,7 @@ var/buildstacktype = /obj/item/stack/sheet/iron var/buildstackamount = 1 var/item_chair = /obj/item/chair // if null it can't be picked up - ///How much sitting on this chair influences fishing difficulty - var/fishing_modifier = -3 -/obj/structure/chair/Initialize(mapload) - . = ..() - if(prob(0.2)) - name = "tactical [name]" - fishing_modifier -= 4 - MakeRotate() - if(can_buckle && fishing_modifier) - AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier) /obj/structure/chair/examine(mob/user) . = ..() @@ -34,6 +24,12 @@ if(!has_buckled_mobs() && can_buckle) . += span_notice("While standing on [src], drag and drop your sprite onto [src] to buckle to it.") +/obj/structure/chair/Initialize(mapload) + . = ..() + if(prob(0.2)) + name = "tactical [name]" + MakeRotate() + ///This proc adds the rotate component, overwrite this if you for some reason want to change some specific args. /obj/structure/chair/proc/MakeRotate() AddComponent(/datum/component/simple_rotation, ROTATION_IGNORE_ANCHORED|ROTATION_GHOSTS_ALLOWED) @@ -138,7 +134,6 @@ buildstacktype = /obj/item/stack/sheet/mineral/wood buildstackamount = 3 item_chair = /obj/item/chair/wood - fishing_modifier = -4 /obj/structure/chair/wood/narsie_act() return @@ -156,7 +151,6 @@ max_integrity = 70 buildstackamount = 2 item_chair = null - fishing_modifier = -5 // The mutable appearance used for the overlay over buckled mobs. var/mutable_appearance/armrest @@ -232,13 +226,11 @@ desc = "A luxurious chair, the many purple scales reflect the light in a most pleasing manner." icon_state = "carp_chair" buildstacktype = /obj/item/stack/sheet/animalhide/carp - fishing_modifier = -10 /obj/structure/chair/office anchored = FALSE buildstackamount = 5 item_chair = null - fishing_modifier = -4 icon_state = "officechair_dark" /obj/structure/chair/office/Initialize(mapload) @@ -253,10 +245,6 @@ /obj/structure/chair/office/tactical name = "tactical swivel chair" -/obj/structure/chair/office/tactical/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -10) - /obj/structure/chair/office/light icon_state = "officechair_white" @@ -448,7 +436,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) desc = "You sit in this. Either by will or force. Looks REALLY uncomfortable." icon_state = "chairold" item_chair = null - fishing_modifier = 4 /obj/structure/chair/bronze name = "brass chair" @@ -458,7 +445,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) buildstacktype = /obj/item/stack/sheet/bronze buildstackamount = 1 item_chair = null - fishing_modifier = -12 //the pinnacle of Ratvarian technology. /// Total rotations made var/turns = 0 @@ -498,7 +484,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) item_chair = null obj_flags = parent_type::obj_flags | NO_DEBRIS_AFTER_DECONSTRUCTION alpha = 0 - fishing_modifier = -20 //it only lives for 25 seconds, so we make them worth it. /obj/structure/chair/mime/wrench_act_secondary(mob/living/user, obj/item/weapon) return NONE @@ -520,7 +505,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) buildstacktype = /obj/item/stack/sheet/plastic buildstackamount = 2 item_chair = /obj/item/chair/plastic - fishing_modifier = -8 /obj/structure/chair/plastic/post_buckle_mob(mob/living/Mob) Mob.pixel_y += 2 diff --git a/code/game/objects/structures/beds_chairs/sofa.dm b/code/game/objects/structures/beds_chairs/sofa.dm index 04bb0b1e25e3f..bf9a221929b67 100644 --- a/code/game/objects/structures/beds_chairs/sofa.dm +++ b/code/game/objects/structures/beds_chairs/sofa.dm @@ -19,7 +19,6 @@ path/corner/color_name {\ icon = 'icons/obj/chairs_wide.dmi' buildstackamount = 1 item_chair = null - fishing_modifier = -4 var/mutable_appearance/armrest /obj/structure/chair/sofa/Initialize(mapload) diff --git a/code/game/objects/structures/cannons/cannon_instructions.dm b/code/game/objects/structures/cannons/cannon_instructions.dm index 34cdcdf1ced68..c259ea0e76f17 100644 --- a/code/game/objects/structures/cannons/cannon_instructions.dm +++ b/code/game/objects/structures/cannons/cannon_instructions.dm @@ -17,10 +17,4 @@ 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/construction_console/construction_actions.dm b/code/game/objects/structures/construction_console/construction_actions.dm index b9abfe70c3f71..fc014d14318bd 100644 --- a/code/game/objects/structures/construction_console/construction_actions.dm +++ b/code/game/objects/structures/construction_console/construction_actions.dm @@ -91,7 +91,7 @@ if(place_turf.density) to_chat(owner, span_warning("[structure_name] may only be placed on a floor.")) return - //Can't place two dense objects inside each other + //Can't place two dense objects inside eachother if(initial(structure_path.density) && place_turf.is_blocked_turf()) to_chat(owner, span_warning("Location is obstructed by something. Please clear the location and try again.")) return diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index c4740398d82d2..a1e45e0ad7ab8 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -157,8 +157,8 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) register_context() if(opened) - opened = FALSE //necessary because open() proc will early return if its true - if(open(special_effects = FALSE)) //closets which are meant to be open by default don't need to be animated open + opened = FALSE //nessassary because open() proc will early return if its true + if(open(special_effects = FALSE)) //closets which are meant to be open by default dont need to be animated open return update_appearance() @@ -823,24 +823,21 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) balloon_alert(user, "unlock first!") return - if(isnull(id_card) && secure) + if(isnull(id_card)) balloon_alert(user, "not yours to rename!") return var/name_set = FALSE var/desc_set = FALSE - - var/input_name = tgui_input_text(user, "Locker Name", "Locker Name", max_length = MAX_NAME_LEN) - - if(!isnull(input_name)) - name = input_name + var/str = tgui_input_text(user, "Personal Locker Name", "Locker Name") + if(!isnull(str)) + name = str name_set = TRUE - var/input_desc = tgui_input_text(user, "Locker Description", "Locker Description", max_length = MAX_DESC_LEN) - - if(!isnull(input_desc)) - desc = input_desc + str = tgui_input_text(user, "Personal Locker Description", "Locker Description") + if(!isnull(str)) + desc = str desc_set = TRUE var/bit_flag = NONE @@ -918,6 +915,8 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) /obj/structure/closet/mouse_drop_receive(atom/movable/O, mob/living/user, params) if(!istype(O) || O.anchored || istype(O, /atom/movable/screen)) return + if(!istype(user) || user.incapacitated || user.body_position == LYING_DOWN) + return if(user == O) //try to climb onto it return ..() if(!opened) @@ -1069,7 +1068,7 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) addtimer(CALLBACK(src, PROC_REF(check_if_shake)), next_check_time) return TRUE - // If we reach here, nobody is resisting, so don't shake + // If we reach here, nobody is resisting, so dont shake return FALSE /obj/structure/closet/proc/bust_open() @@ -1192,13 +1191,15 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) return if(!opened && ((shove_flags & SHOVE_KNOCKDOWN_BLOCKED) || !(shove_flags & SHOVE_BLOCKED))) return - if(opened) - if (target.loc != loc) + var/was_opened = opened + if(!toggle()) + return + if(was_opened) + if (!target.Move(get_turf(src), get_dir(target, src))) return target.forceMove(src) else target.Knockdown(SHOVE_KNOCKDOWN_SOLID) - toggle() update_icon() target.visible_message(span_danger("[shover.name] shoves [target.name] into [src]!"), span_userdanger("You're shoved into [src] by [shover.name]!"), diff --git a/code/game/objects/structures/crates_lockers/closets/bodybag.dm b/code/game/objects/structures/crates_lockers/closets/bodybag.dm index 66950b0845f1d..ac8b444e47dc7 100644 --- a/code/game/objects/structures/crates_lockers/closets/bodybag.dm +++ b/code/game/objects/structures/crates_lockers/closets/bodybag.dm @@ -116,22 +116,8 @@ */ /obj/structure/closet/body_bag/proc/perform_fold(mob/living/carbon/human/the_folder) visible_message(span_notice("[the_folder] folds up [src].")) - the_folder.put_in_hands(undeploy_bodybag(the_folder.loc)) - -/// Makes the bag into an item, returns that item -/obj/structure/closet/body_bag/proc/undeploy_bodybag(atom/fold_loc) - var/obj/item/bodybag/folding_bodybag = foldedbag_instance || new foldedbag_path() - if(fold_loc) - folding_bodybag.forceMove(fold_loc) - return folding_bodybag - -/obj/structure/closet/body_bag/container_resist_act(mob/living/user, loc_required = TRUE) - // ideally we support this natively but i guess that's for a later time - if(!istype(loc, /obj/machinery/disposal)) - return ..() - for(var/atom/movable/thing as anything in src) - thing.forceMove(loc) - undeploy_bodybag(loc) + var/obj/item/bodybag/folding_bodybag = foldedbag_instance || new foldedbag_path + the_folder.put_in_hands(folding_bodybag) /obj/structure/closet/body_bag/bluespace name = "bluespace body bag" @@ -166,7 +152,7 @@ /obj/structure/closet/body_bag/bluespace/perform_fold(mob/living/carbon/human/the_folder) visible_message(span_notice("[the_folder] folds up [src].")) - var/obj/item/bodybag/folding_bodybag = undeploy_bodybag(the_folder.loc) + var/obj/item/bodybag/folding_bodybag = foldedbag_instance || new foldedbag_path var/max_weight_of_contents = initial(folding_bodybag.w_class) for(var/am in contents) var/atom/movable/content = am @@ -200,7 +186,7 @@ contents_thermal_insulation = 0.5 foldedbag_path = /obj/item/bodybag/environmental /// The list of weathers we protect from. - var/list/weather_protection = list(TRAIT_ASHSTORM_IMMUNE, TRAIT_RADSTORM_IMMUNE, TRAIT_SNOWSTORM_IMMUNE) // Does not protect against lava or the The Floor Is Lava spell. + var/list/weather_protection = list(TRAIT_ASHSTORM_IMMUNE, TRAIT_RADSTORM_IMMUNE, TRAIT_SNOWSTORM_IMMUNE, TRAIT_VOIDSTORM_IMMUNE) // Does not protect against lava or the The Floor Is Lava spell. /// The contents of the gas to be distributed to an occupant. Set in Initialize() var/datum/gas_mixture/air_contents = null @@ -291,9 +277,18 @@ icon_state = initial(icon_state) /obj/structure/closet/body_bag/environmental/prisoner/container_resist_act(mob/living/user, loc_required = TRUE) - // copy-pasted with changes because flavor text as well as some other misc stuff - if(opened || ismovable(loc) || !sinched) - return ..() + /// copy-pasted with changes because flavor text as well as some other misc stuff + if(opened) + return + if(ismovable(loc)) + user.changeNext_move(CLICK_CD_BREAKOUT) + user.last_special = world.time + CLICK_CD_BREAKOUT + var/atom/movable/location = loc + location.relay_container_resist_act(user, src) + return + if(!sinched) + open(user) + return user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT @@ -306,8 +301,6 @@ //we check after a while whether there is a point of resisting anymore and whether the user is capable of resisting user.visible_message(span_danger("[user] successfully broke out of [src]!"), span_notice("You successfully break out of [src]!")) - if(istype(loc, /obj/machinery/disposal)) - return ..() bust_open() else if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded. @@ -376,7 +369,7 @@ icon_state = "holobag_med" resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF foldedbag_path = null - weather_protection = list(TRAIT_SNOWSTORM_IMMUNE) + weather_protection = list(TRAIT_VOIDSTORM_IMMUNE, TRAIT_SNOWSTORM_IMMUNE) /obj/structure/closet/body_bag/environmental/hardlight/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) if(damage_type in list(BRUTE, BURN)) @@ -388,7 +381,7 @@ icon_state = "holobag_sec" resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF foldedbag_path = null - weather_protection = list(TRAIT_SNOWSTORM_IMMUNE) + weather_protection = list(TRAIT_VOIDSTORM_IMMUNE, TRAIT_SNOWSTORM_IMMUNE) /obj/structure/closet/body_bag/environmental/prisoner/hardlight/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) if(damage_type in list(BRUTE, BURN)) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 2fed72c5bab3b..cac9fbaf890bb 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -5,6 +5,7 @@ icon_state = "crate" base_icon_state = "crate" req_access = null + can_weld_shut = FALSE horizontal = TRUE allow_objects = TRUE allow_dense = TRUE @@ -94,9 +95,6 @@ else if(secure) . += "securecrateg" - if(welded) - . += icon_welded - if(opened && lid_icon_state) var/mutable_appearance/lid = mutable_appearance(icon = lid_icon, icon_state = lid_icon_state) lid.pixel_x = lid_x @@ -176,7 +174,6 @@ can_install_electronics = FALSE paint_jobs = null elevation_open = 0 - can_weld_shut = FALSE /obj/structure/closet/crate/trashcart //please make this a generic cart path later after things calm down a little desc = "A heavy, metal trashcart with wheels." @@ -193,7 +190,6 @@ base_icon_state = "laundry" elevation = 14 elevation_open = 14 - can_weld_shut = FALSE /obj/structure/closet/crate/trashcart/Initialize(mapload) . = ..() @@ -228,7 +224,7 @@ /obj/structure/closet/crate/deforest name = "deforest medical crate" - desc = "A DeForest brand crate of medical supplies." + desc = "A DeFortest brand crate of medical supplies." icon_state = "deforest" base_icon_state = "deforest" diff --git a/code/game/objects/structures/crates_lockers/crates/bins.dm b/code/game/objects/structures/crates_lockers/crates/bins.dm index 8ff1e1aa21da8..a686d53f392c6 100644 --- a/code/game/objects/structures/crates_lockers/crates/bins.dm +++ b/code/game/objects/structures/crates_lockers/crates/bins.dm @@ -12,7 +12,6 @@ paint_jobs = null elevation = 17 elevation_open = 17 - can_weld_shut = FALSE /obj/structure/closet/crate/bin/LateInitialize() . = ..() diff --git a/code/game/objects/structures/crates_lockers/crates/cardboard.dm b/code/game/objects/structures/crates_lockers/crates/cardboard.dm index 12008cc4022bf..7b1e7dc725779 100644 --- a/code/game/objects/structures/crates_lockers/crates/cardboard.dm +++ b/code/game/objects/structures/crates_lockers/crates/cardboard.dm @@ -12,7 +12,6 @@ close_sound_volume = 25 paint_jobs = null cutting_tool = /obj/item/wirecutters - can_weld_shut = FALSE /obj/structure/closet/crate/cardboard/mothic name = "\improper Mothic Fleet box" diff --git a/code/game/objects/structures/crates_lockers/crates/critter.dm b/code/game/objects/structures/crates_lockers/crates/critter.dm index d116a33d8ff75..5e1873d166ab6 100644 --- a/code/game/objects/structures/crates_lockers/crates/critter.dm +++ b/code/game/objects/structures/crates_lockers/crates/critter.dm @@ -17,7 +17,6 @@ can_install_electronics = FALSE elevation = 21 elevation_open = 0 - can_weld_shut = FALSE var/obj/item/tank/internals/emergency_oxygen/tank diff --git a/code/game/objects/structures/crates_lockers/crates/large.dm b/code/game/objects/structures/crates_lockers/crates/large.dm index 667dd9b2ebb8b..0a08d9c7949a1 100644 --- a/code/game/objects/structures/crates_lockers/crates/large.dm +++ b/code/game/objects/structures/crates_lockers/crates/large.dm @@ -15,7 +15,6 @@ close_sound_volume = 50 can_install_electronics = FALSE elevation = 22 - can_weld_shut = FALSE // Stops people from "diving into" a crate you can't open normally divable = FALSE diff --git a/code/game/objects/structures/detectiveboard.dm b/code/game/objects/structures/detectiveboard.dm index 27c11cda5a018..f9d0560dfdee4 100644 --- a/code/game/objects/structures/detectiveboard.dm +++ b/code/game/objects/structures/detectiveboard.dm @@ -50,11 +50,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/detectiveboard, 32) to_chat(user, "You already attaching evidence!") return attaching_evidence = TRUE - var/name = tgui_input_text(user, "Please enter the evidence name", "Detective's Board", max_length = MAX_NAME_LEN) + var/name = tgui_input_text(user, "Please enter the evidence name", "Detective's Board") if(!name) attaching_evidence = FALSE return - var/desc = tgui_input_text(user, "Please enter the evidence description", "Detective's Board", max_length = MAX_DESC_LEN) + var/desc = tgui_input_text(user, "Please enter the evidence description", "Detective's Board") if(!desc) attaching_evidence = FALSE return @@ -146,7 +146,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/detectiveboard, 32) if("add_case") if(cases.len == MAX_CASES) return FALSE - var/new_case = tgui_input_text(user, "Please enter the case name", "Detective's Board", max_length = MAX_NAME_LEN) + var/new_case = tgui_input_text(user, "Please enter the case name", "Detective's Board") if(!new_case) return FALSE var/case_color = tgui_input_list(user, "Please choose case color", "Detective's Board", case_colors) @@ -173,7 +173,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/detectiveboard, 32) update_appearance(UPDATE_ICON) return TRUE if("rename_case") - var/new_name = tgui_input_text(user, "Please enter the new name for the case", "Detective's Board", max_length = MAX_NAME_LEN) + var/new_name = tgui_input_text(user, "Please ender the case new name", "Detective's Board") 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 03957e2708bf0..b582d86efde0e 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -159,7 +159,7 @@ toggle_lock(user) else if(open && !showpiece) insert_showpiece(attacking_item, user) - return TRUE //cancel the attack chain, whether we successfully placed an item or not + return TRUE //cancel the attack chain, wether we successfully placed an item or not else if(glass_fix && broken && istype(attacking_item, /obj/item/stack/sheet/glass)) var/obj/item/stack/sheet/glass/glass_sheet = attacking_item if(glass_sheet.get_amount() < 2) @@ -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_length = MAX_PLAQUE_LEN) + var/new_trophy_message = tgui_input_text(usr, "Let's make history!", "Trophy Message", trophy_message, 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 c2d67e6290145..9493a7c941407 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_length = MAX_NAME_LEN) + var/t = tgui_input_text(user, "Enter the name for the door", "Airlock Renaming", created_name, MAX_NAME_LEN) if(!t) return if(!in_range(src, usr) && loc != usr) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 389e8dcbd743d..0f20f87e0b547 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -500,7 +500,7 @@ /obj/structure/girder/bronze/attackby(obj/item/W, mob/living/user, params) add_fingerprint(user) if(W.tool_behaviour == TOOL_WELDER) - if(!W.tool_start_check(user, amount = 0, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!W.tool_start_check(user, amount = 0)) return balloon_alert(user, "slicing apart...") if(W.use_tool(src, user, 40, volume=50)) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 57e30d58ef2bd..0cc73b9adef9c 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -34,7 +34,7 @@ return CONTEXTUAL_SCREENTIP_SET /obj/structure/kitchenspike_frame/welder_act(mob/living/user, obj/item/tool) - if(!tool.tool_start_check(user, amount = 0, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!tool.tool_start_check(user, amount = 0)) return FALSE to_chat(user, span_notice("You begin cutting \the [src] apart...")) if(!tool.use_tool(src, user, 5 SECONDS, volume = 50)) diff --git a/code/game/objects/structures/lavaland/ore_vent.dm b/code/game/objects/structures/lavaland/ore_vent.dm index 1de24f030bf5e..f9214b989b95c 100644 --- a/code/game/objects/structures/lavaland/ore_vent.dm +++ b/code/game/objects/structures/lavaland/ore_vent.dm @@ -426,7 +426,7 @@ /** * When the ore vent cannot spawn a mob due to being blocked from all sides, we cause some MILD, MILD explosions. - * Explosion matches a gibtonite light explosion, as a way to clear nearby solid structures, with a high likelihood of breaking the NODE drone. + * Explosion matches a gibtonite light explosion, as a way to clear neartby solid structures, with a high likelyhood of breaking the NODE drone. */ /obj/structure/ore_vent/proc/anti_cheese() explosion(src, heavy_impact_range = 1, light_impact_range = 3, flame_range = 0, flash_range = 0, adminlog = FALSE) diff --git a/code/game/objects/structures/maintenance.dm b/code/game/objects/structures/maintenance.dm index a8de16271f36d..9f88246966f94 100644 --- a/code/game/objects/structures/maintenance.dm +++ b/code/game/objects/structures/maintenance.dm @@ -1,9 +1,9 @@ /** This structure acts as a source of moisture loving cell lines, -as well as a location where a hidden item can sometimes be retrieved +as well as a location where a hidden item can somtimes be retrieved at the cost of risking a vicious bite.**/ /obj/structure/moisture_trap name = "moisture trap" - desc = "A device installed in order to control moisture in poorly ventilated areas.\nThe stagnant water inside basin seems to produce serious biofouling issues when improperly maintained.\nThis unit in particular seems to be teeming with life!\nWho thought mother Gaia could assert herself so vigorously in this sterile and desolate place?" + desc = "A device installed in order to control moisture in poorly ventilated areas.\nThe stagnant water inside basin seems to produce serious biofouling issues when improperly maintained.\nThis unit in particular seems to be teeming with life!\nWho thought mother Gaia could assert herself so vigoriously in this sterile and desolate place?" icon_state = "moisture_trap" anchored = TRUE density = FALSE @@ -58,7 +58,7 @@ at the cost of risking a vicious bite.**/ if(!isliving(user)) return FALSE var/mob/living/living_user = user - if(living_user.body_position == STANDING_UP && ishuman(living_user)) //I don't think monkeys can crawl on command. + if(living_user.body_position == STANDING_UP && ishuman(living_user)) //I dont think monkeys can crawl on command. return FALSE return TRUE diff --git a/code/game/objects/structures/mystery_box.dm b/code/game/objects/structures/mystery_box.dm index cb56cfe8ef120..9bb51ba09cbef 100644 --- a/code/game/objects/structures/mystery_box.dm +++ b/code/game/objects/structures/mystery_box.dm @@ -142,7 +142,7 @@ GLOBAL_LIST_INIT(mystery_fishing, list( /// Stores the current sound channel we're using so we can cut off our own sounds as needed. Randomized after each roll var/current_sound_channel /// How many time can it still be used? - var/uses_left = INFINITY + var/uses_left /// A list of weakrefs to mind datums of people that opened it and how many times. var/list/datum/weakref/minds_that_opened_us @@ -281,7 +281,6 @@ GLOBAL_LIST_INIT(mystery_fishing, list( max_integrity = 100 damage_deflection = 30 grant_extra_mag = FALSE - anchored = FALSE /obj/structure/mystery_box/handle_deconstruct(disassembled) new /obj/item/stack/sheet/mineral/wood(drop_location(), 2) diff --git a/code/game/objects/structures/petrified_statue.dm b/code/game/objects/structures/petrified_statue.dm index d27a2e8e1cd8d..5383436d4dbff 100644 --- a/code/game/objects/structures/petrified_statue.dm +++ b/code/game/objects/structures/petrified_statue.dm @@ -13,24 +13,24 @@ /obj/structure/statue/petrified/relaymove() return -/obj/structure/statue/petrified/Initialize(mapload, mob/living/living, statue_timer, save_brain) +/obj/structure/statue/petrified/Initialize(mapload, mob/living/L, statue_timer, save_brain) . = ..() if(statue_timer) timer = statue_timer if(save_brain) brain = save_brain - if(!living) - return - petrified_mob = living - if(living.buckled) - living.buckled.unbuckle_mob(living, force = TRUE) - living.visible_message(span_warning("[living]'s skin rapidly turns to marble!"), span_userdanger("Your body freezes up! Can't... move... can't... think...")) - living.forceMove(src) - living.add_traits(list(TRAIT_GODMODE, TRAIT_MUTE, TRAIT_NOBLOOD), STATUE_MUTE) - living.faction |= FACTION_MIMIC //Stops mimics from instaqdeling people in statues - atom_integrity = living.health + 100 //stoning damaged mobs will result in easier to shatter statues - max_integrity = atom_integrity - START_PROCESSING(SSobj, src) + if(L) + petrified_mob = L + if(L.buckled) + L.buckled.unbuckle_mob(L,force=1) + L.visible_message(span_warning("[L]'s skin rapidly turns to marble!"), span_userdanger("Your body freezes up! Can't... move... can't... think...")) + L.forceMove(src) + ADD_TRAIT(L, TRAIT_MUTE, STATUE_MUTE) + L.faction |= FACTION_MIMIC //Stops mimics from instaqdeling people in statues + L.status_flags |= GODMODE + atom_integrity = L.health + 100 //stoning damaged mobs will result in easier to shatter statues + max_integrity = atom_integrity + START_PROCESSING(SSobj, src) /obj/structure/statue/petrified/process(seconds_per_tick) if(!petrified_mob) @@ -47,9 +47,6 @@ /obj/structure/statue/petrified/Exited(atom/movable/gone, direction) . = ..() if(gone == petrified_mob) - petrified_mob.remove_traits(list(TRAIT_GODMODE, TRAIT_MUTE, TRAIT_NOBLOOD), STATUE_MUTE) - petrified_mob.take_overall_damage((petrified_mob.health - atom_integrity + 100)) //any new damage the statue incurred is transferred to the mob - petrified_mob.faction -= FACTION_MIMIC petrified_mob = null /obj/structure/statue/petrified/Destroy() @@ -67,7 +64,13 @@ for(var/obj/O in src) O.forceMove(loc) - petrified_mob?.forceMove(loc) + if(petrified_mob) + petrified_mob.status_flags &= ~GODMODE + REMOVE_TRAIT(petrified_mob, TRAIT_MUTE, STATUE_MUTE) + REMOVE_TRAIT(petrified_mob, TRAIT_NOBLOOD, MAGIC_TRAIT) + petrified_mob.take_overall_damage((petrified_mob.health - atom_integrity + 100)) //any new damage the statue incurred is transferred to the mob + petrified_mob.faction -= FACTION_MIMIC + petrified_mob.forceMove(loc) return ..() /obj/structure/statue/petrified/atom_deconstruct(disassembled = TRUE) @@ -111,6 +114,7 @@ return FALSE var/obj/structure/statue/petrified/S = new(loc, src, statue_timer, save_brain) S.name = "statue of [name]" + ADD_TRAIT(src, TRAIT_NOBLOOD, MAGIC_TRAIT) S.copy_overlays(src) var/newcolor = list(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) if(colorlist) diff --git a/code/game/objects/structures/pinatas.dm b/code/game/objects/structures/pinatas.dm index 44d7a8b021594..6483d39b1a26c 100644 --- a/code/game/objects/structures/pinatas.dm +++ b/code/game/objects/structures/pinatas.dm @@ -28,7 +28,7 @@ . = ..() if(get_integrity() < (max_integrity/2)) icon_state = "[base_icon_state]_damaged" - if(damage_amount >= 10) // Swing means minimum damage threshold for dropping candy is met. + if(damage_amount >= 10) // Swing means minimum damage threshhold for dropping candy is met. flick("[icon_state]_swing", src) /obj/structure/pinata/play_attack_sound(damage_amount, damage_type, damage_flag) diff --git a/code/game/objects/structures/plaques/_plaques.dm b/code/game/objects/structures/plaques/_plaques.dm index 951a538e7241a..1277869dbf67f 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", max_length = MAX_PLAQUE_LEN) + var/descriptionchoice = tgui_input_text(user, "Engrave this plaque's text", "Plaque Customization") 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", max_length = MAX_PLAQUE_LEN) + var/descriptionchoice = tgui_input_text(user, "Engrave this plaque's text", "Plaque Customization") if(!descriptionchoice) return if(!Adjacent(user)) //Make sure user is adjacent still diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index fe2e4b06b4f10..06a099ad4f906 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/railings.dmi' icon_state = "railing" flags_1 = ON_BORDER_1 - obj_flags = CAN_BE_HIT | BLOCKS_CONSTRUCTION_DIR | IGNORE_DENSITY + obj_flags = CAN_BE_HIT | BLOCKS_CONSTRUCTION_DIR density = TRUE anchored = TRUE pass_flags_self = LETPASSTHROW|PASSSTRUCTURE diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm index d3713ca1b2f68..9268cb9c059ce 100644 --- a/code/game/objects/structures/signs/_signs.dm +++ b/code/game/objects/structures/signs/_signs.dm @@ -12,7 +12,7 @@ var/buildable_sign = TRUE ///This determines if you can select this sign type when using a pen on a sign backing. False by default, set to true per sign type to override. var/is_editable = FALSE - ///sign_change_name is used to make nice looking, alphabetized and categorized names when you use a pen on any sign item or structure which is_editable. + ///sign_change_name is used to make nice looking, alphebetized and categorized names when you use a pen on any sign item or structure which is_editable. var/sign_change_name ///Callback to the knock down proc for wallmounting behavior. var/knock_down_callback @@ -135,7 +135,7 @@ unwrenched_sign.setDir(dir) qdel(src) //The sign structure on the wall goes poof and only the sign item from unwrenching remains. -/obj/structure/sign/blank //This subtype is necessary for now because some other things (posters, picture frames, paintings) inherit from the parent type. +/obj/structure/sign/blank //This subtype is necessary for now because some other things (posters, picture frames, paintings) inheret from the parent type. icon_state = "backing" name = "sign backing" desc = "A plastic sign backing, use a pen to change the decal. It can be detached from the wall with a wrench." diff --git a/code/game/objects/structures/votingbox.dm b/code/game/objects/structures/votingbox.dm index 55909978fe2f7..42ccd62509304 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, max_length = MAX_DESC_LEN) + var/new_description = tgui_input_text(user, "Enter a new description", "Vote Description", vote_description, multiline = TRUE) 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 4ff29eb606e8f..4c22cbf01b29d 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_length = MAX_NAME_LEN) + var/t = tgui_input_text(user, "Enter the name for the door", "Windoor Renaming", created_name, MAX_NAME_LEN) if(!t) return if(!in_range(src, usr) && loc != usr) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index fdb5193035c84..f2a90d98dc52d 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -505,7 +505,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/unanchored/spawner, 0) switch(state) if(RWINDOW_SECURE) if(tool.tool_behaviour == TOOL_WELDER) - if(tool.tool_start_check(user, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(tool.tool_start_check(user)) user.visible_message(span_notice("[user] holds \the [tool] to the security screws on \the [src]..."), span_notice("You begin heating the security screws on \the [src]...")) if(tool.use_tool(src, user, 15 SECONDS, volume = 100)) diff --git a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm index 52372448616c7..8ddae94231d31 100644 --- a/code/game/shuttle_engines.dm +++ b/code/game/shuttle_engines.dm @@ -113,7 +113,7 @@ if(ENGINE_UNWRENCHED) to_chat(user, span_warning("The [src.name] needs to be wrenched to the floor!")) if(ENGINE_WRENCHED) - if(!tool.tool_start_check(user, amount=round(ENGINE_WELDTIME / 5), heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!tool.tool_start_check(user, amount=round(ENGINE_WELDTIME / 5))) return TRUE user.visible_message(span_notice("[user.name] starts to weld the [name] to the floor."), \ @@ -126,7 +126,7 @@ alter_engine_power(engine_power) if(ENGINE_WELDED) - if(!tool.tool_start_check(user, amount=round(ENGINE_WELDTIME / 5), heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!tool.tool_start_check(user, amount=round(ENGINE_WELDTIME / 5))) return TRUE user.visible_message(span_notice("[user.name] starts to cut the [name] free from the floor."), \ diff --git a/code/game/turfs/closed/_closed.dm b/code/game/turfs/closed/_closed.dm index cf287a6eb6d88..8ccaabc46c0af 100644 --- a/code/game/turfs/closed/_closed.dm +++ b/code/game/turfs/closed/_closed.dm @@ -15,6 +15,3 @@ /turf/closed/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) return FALSE - -/turf/closed/examine_descriptor(mob/user) - return "wall" diff --git a/code/game/turfs/closed/wall/reinf_walls.dm b/code/game/turfs/closed/wall/reinf_walls.dm index 739ee5aeae0f4..e94a31eeafef4 100644 --- a/code/game/turfs/closed/wall/reinf_walls.dm +++ b/code/game/turfs/closed/wall/reinf_walls.dm @@ -76,7 +76,7 @@ if(COVER) if(W.tool_behaviour == TOOL_WELDER) - if(!W.tool_start_check(user, amount=2, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!W.tool_start_check(user, amount=2)) return to_chat(user, span_notice("You begin slicing through the metal cover...")) if(W.use_tool(src, user, 60, volume=100)) @@ -109,7 +109,7 @@ return TRUE if(W.tool_behaviour == TOOL_WELDER) - if(!W.tool_start_check(user, amount=2, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!W.tool_start_check(user, amount=2)) return to_chat(user, span_notice("You begin welding the metal cover back to the frame...")) if(W.use_tool(src, user, 60, volume=100)) @@ -143,7 +143,7 @@ if(SUPPORT_RODS) if(W.tool_behaviour == TOOL_WELDER) - if(!W.tool_start_check(user, amount=2, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!W.tool_start_check(user, amount=2)) return to_chat(user, span_notice("You begin slicing through the support rods...")) if(W.use_tool(src, user, 100, volume=100)) @@ -176,7 +176,7 @@ return TRUE if(W.tool_behaviour == TOOL_WELDER) - if(!W.tool_start_check(user, amount=0, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!W.tool_start_check(user, amount=0)) return to_chat(user, span_notice("You begin welding the support rods back together...")) if(W.use_tool(src, user, 100, volume=100)) diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index 0fbe774a7c5ae..a78579d713e9a 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -117,6 +117,7 @@ GLOB.station_turfs -= src return ..() + /turf/closed/wall/examine(mob/user) . += ..() . += deconstruction_hints(user) @@ -237,18 +238,23 @@ playsound(src, 'sound/weapons/genhit.ogg', 25, TRUE) add_fingerprint(user) -/turf/closed/wall/item_interaction(mob/living/user, obj/item/tool, list/modifiers) +/turf/closed/wall/attackby(obj/item/W, mob/user, params) + user.changeNext_move(CLICK_CD_MELEE) if (!ISADVANCEDTOOLUSER(user)) to_chat(user, span_warning("You don't have the dexterity to do this!")) - return ITEM_INTERACT_BLOCKING + return + + //get the user's location + if(!isturf(user.loc)) + return //can't do this stuff whilst inside objects and such add_fingerprint(user) //the istype cascade has been spread among various procs for easy overriding - if(try_clean(tool, user) || try_wallmount(tool, user) || try_decon(tool, user)) - return ITEM_INTERACT_SUCCESS + if(try_clean(W, user) || try_wallmount(W, user) || try_decon(W, user)) + return - return NONE + return ..() /turf/closed/wall/proc/try_clean(obj/item/W, mob/living/user) if((user.combat_mode) || !LAZYLEN(dent_decals)) @@ -284,7 +290,7 @@ /turf/closed/wall/proc/try_decon(obj/item/I, mob/user) if(I.tool_behaviour == TOOL_WELDER) - if(!I.tool_start_check(user, amount=round(slicing_duration / 50), heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!I.tool_start_check(user, amount=round(slicing_duration / 50))) return FALSE to_chat(user, span_notice("You begin slicing through the outer plating...")) diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 01478f4d9f02b..f9b374c88cb88 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -74,9 +74,6 @@ . += burnt_appearance -/turf/open/examine_descriptor(mob/user) - return "floor" - //direction is direction of travel of A /turf/open/zPassIn(direction) if(direction != DOWN) diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm index dad46fd8de6b6..84b9ac26e9b8d 100644 --- a/code/game/turfs/open/floor.dm +++ b/code/game/turfs/open/floor.dm @@ -14,8 +14,8 @@ smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_OPEN_FLOOR canSmoothWith = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_OPEN_FLOOR - thermal_conductivity = 0.02 - heat_capacity = 20000 + thermal_conductivity = 0.04 + heat_capacity = 10000 tiled_dirt = TRUE diff --git a/code/game/turfs/open/floor/reinforced_floor.dm b/code/game/turfs/open/floor/reinforced_floor.dm index dcba9ed36673a..0a44c78ceca5e 100644 --- a/code/game/turfs/open/floor/reinforced_floor.dm +++ b/code/game/turfs/open/floor/reinforced_floor.dm @@ -4,7 +4,7 @@ desc = "Extremely sturdy." icon_state = "engine" holodeck_compatible = TRUE - thermal_conductivity = 0.01 + thermal_conductivity = 0.025 heat_capacity = INFINITY floor_tile = /obj/item/stack/rods footstep = FOOTSTEP_PLATING diff --git a/code/game/turfs/open/ice.dm b/code/game/turfs/open/ice.dm index f28bc8dd4b052..dbfff2efc8f91 100644 --- a/code/game/turfs/open/ice.dm +++ b/code/game/turfs/open/ice.dm @@ -53,7 +53,6 @@ return NONE balloon_alert(user, "dug hole") AddComponent(/datum/component/fishing_spot, GLOB.preset_fish_sources[/datum/fish_source/ice_fishing]) - ADD_TRAIT(src, TRAIT_CATCH_AND_RELEASE, INNATE_TRAIT) add_overlay(mutable_appearance('icons/turf/overlays.dmi', "ice_hole")) can_make_hole = FALSE RemoveElement(/datum/element/contextual_screentip_tools, tool_screentips) diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index c080e228438a5..23e2b6b38db84 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -48,8 +48,6 @@ . = ..() if(fish_source_type) AddElement(/datum/element/lazy_fishing_spot, fish_source_type) - // You can release chrabs and lavaloops and likes in lava, or be an absolute scumbag and drop other fish there too. - ADD_TRAIT(src, TRAIT_CATCH_AND_RELEASE, INNATE_TRAIT) refresh_light() if(!smoothing_flags) update_appearance() diff --git a/code/game/turfs/open/misc.dm b/code/game/turfs/open/misc.dm index f00e6ed6ded6e..5c5987f656e23 100644 --- a/code/game/turfs/open/misc.dm +++ b/code/game/turfs/open/misc.dm @@ -17,8 +17,8 @@ smoothing_groups = SMOOTH_GROUP_TURF_OPEN canSmoothWith = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_OPEN_FLOOR - thermal_conductivity = 0.02 - heat_capacity = 20000 + thermal_conductivity = 0.04 + heat_capacity = 10000 tiled_dirt = TRUE /turf/open/misc/attackby(obj/item/W, mob/user, params) diff --git a/code/game/turfs/open/water.dm b/code/game/turfs/open/water.dm index 835d29089181b..de895754d03ae 100644 --- a/code/game/turfs/open/water.dm +++ b/code/game/turfs/open/water.dm @@ -1,5 +1,4 @@ /turf/open/water - name = "water" gender = PLURAL desc = "Shallow water." icon = 'icons/turf/floors.dmi' @@ -30,7 +29,6 @@ AddElement(/datum/element/watery_tile) if(!isnull(fishing_datum)) AddElement(/datum/element/lazy_fishing_spot, fishing_datum) - ADD_TRAIT(src, TRAIT_CATCH_AND_RELEASE, INNATE_TRAIT) /turf/open/water/jungle diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 19356c2e32309..b0493ce0a8ad4 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -32,7 +32,7 @@ GLOBAL_LIST_EMPTY(station_turfs) var/temperature = T20C ///Used for fire, if a melting temperature was reached, it will be destroyed var/to_be_destroyed = 0 - ///The max temperature of the fire which it was subjected to, determines the melting point of turf + ///The max temperature of the fire which it was subjected to var/max_fire_temperature_sustained = 0 var/blocks_air = FALSE @@ -231,7 +231,7 @@ GLOBAL_LIST_EMPTY(station_turfs) /// Call to move a turf from its current area to a new one /turf/proc/change_area(area/old_area, area/new_area) - //don't waste our time + //dont waste our time if(old_area == new_area) return @@ -277,7 +277,7 @@ GLOBAL_LIST_EMPTY(station_turfs) // We don't want to block ourselves if((movable_content == source_atom)) continue - // don't consider ignored atoms or their types + // dont consider ignored atoms or their types if(length(ignore_atoms)) if(!type_list && (movable_content in ignore_atoms)) continue @@ -306,7 +306,7 @@ GLOBAL_LIST_EMPTY(station_turfs) return TRUE return FALSE -//The zpass procs exist to be overridden, not directly called +//The zpass procs exist to be overriden, not directly called //use can_z_pass for that ///If we'd allow anything to travel into us /turf/proc/zPassIn(direction) @@ -426,7 +426,7 @@ GLOBAL_LIST_EMPTY(station_turfs) if(thing == mover || thing == mover_loc) // Multi tile objects and moving out of other objects continue if(!thing.Cross(mover)) - if(QDELETED(mover)) //deleted from Cross() (CanPass is pure so it can't delete, Cross shouldn't be doing this either though, but it can happen) + if(QDELETED(mover)) //deleted from Cross() (CanPass is pure so it cant delete, Cross shouldnt be doing this either though, but it can happen) return FALSE if(mover_is_phasing) mover.Bump(thing) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 1510783fc7cb8..68096367ef80b 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", max_length = MAX_NAME_LEN) + add_ability.name = tgui_input_text(user, "Choose ability name", "Ability name", "Generic Ability") add_ability.create_sequence_actions() else add_ability = new ability_type(ability_recipient) @@ -523,7 +523,7 @@ ADMIN_VERB(spawn_debug_full_crew, R_DEBUG, "Spawn Debug Full Crew", "Creates a f // Then, spawn a human and slap a person into it. var/number_made = 0 for(var/rank in SSjob.name_occupations) - var/datum/job/job = SSjob.get_job(rank) + var/datum/job/job = SSjob.GetJob(rank) // JOB_CREW_MEMBER is all jobs that pretty much aren't silicon if(!(job.job_flags & JOB_CREW_MEMBER)) @@ -535,7 +535,7 @@ ADMIN_VERB(spawn_debug_full_crew, R_DEBUG, "Spawn Debug Full Crew", "Creates a f new_guy.mind.name = "[rank] Dummy" // Assign the rank to the new player dummy. - if(!SSjob.assign_role(new_guy, job, do_eligibility_checks = FALSE)) + if(!SSjob.AssignRole(new_guy, job, do_eligibility_checks = FALSE)) qdel(new_guy) to_chat(user, "[rank] wasn't able to be spawned.") continue @@ -547,7 +547,7 @@ ADMIN_VERB(spawn_debug_full_crew, R_DEBUG, "Spawn Debug Full Crew", "Creates a f qdel(new_guy) // Then equip up the human with job gear. - SSjob.equip_rank(character, job) + SSjob.EquipRank(character, job) job.after_latejoin_spawn(character) // Finally, ensure the minds are tracked and in the manifest. diff --git a/code/modules/admin/outfit_editor.dm b/code/modules/admin/outfit_editor.dm index a3bd433f52e40..67196c54bd434 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, max_length = MAX_NAME_LEN) + var/newname = tgui_input_text(owner, "What do you want to name this outfit?", OUTFIT_EDITOR_NAME) if(newname) drip.name = newname if("save") diff --git a/code/modules/admin/painting_manager.dm b/code/modules/admin/painting_manager.dm index 5ebcdef005904..7a8bd7127a4d3 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, max_length = MAX_NAME_LEN) + var/new_title = tgui_input_text(user, "New painting title?", "Painting Rename", chosen_painting.title) 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, max_length = MAX_NAME_LEN) + var/new_name = tgui_input_text(user, "New painting author name?", "Painting Rename", chosen_painting.creator_name) 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", max_length = MAX_NAME_LEN) + var/tag_name = tgui_input_text(user, "New tag name?", "Add Tag") 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 c68baa32e4ea1..d697537c6df5f 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", max_length = MAX_NAME_LEN) + var/new_label = tgui_input_text(user, "Choose a new label", "Sound Emitter") if(!new_label) return maptext = MAPTEXT(new_label) diff --git a/code/modules/admin/sql_ban_system.dm b/code/modules/admin/sql_ban_system.dm index c01d60f794b9a..74955324dffd4 100644 --- a/code/modules/admin/sql_ban_system.dm +++ b/code/modules/admin/sql_ban_system.dm @@ -398,9 +398,6 @@ ROLE_WIZARD, ROLE_VOIDWALKER, ), - "Doppler Ban Options" = list( - BAN_LOOC, // DOPPLER EDIT ADDITION - LOOC muting - ), // DOPPLER EDIT ADDITION - EXTRA_BANS ) for(var/department in long_job_lists) output += "
" diff --git a/code/modules/admin/verbs/admin.dm b/code/modules/admin/verbs/admin.dm index a0d772f665fe1..88ee5148f7a3c 100644 --- a/code/modules/admin/verbs/admin.dm +++ b/code/modules/admin/verbs/admin.dm @@ -32,7 +32,7 @@ ADMIN_VERB(unprison, R_ADMIN, "UnPrison", ADMIN_VERB_NO_DESCRIPTION, ADMIN_CATEG tgui_alert(user, "[prisoner.name] is not prisoned.") return - SSjob.send_to_late_join(prisoner) + SSjob.SendToLateJoin(prisoner) message_admins("[key_name_admin(user)] has unprisoned [key_name_admin(prisoner)]") log_admin("[key_name(user)] has unprisoned [key_name(prisoner)]") BLACKBOX_LOG_ADMIN_VERB("Unprison") @@ -181,11 +181,6 @@ ADMIN_VERB(drop_everything, R_ADMIN, "Drop Everything", ADMIN_VERB_NO_DESCRIPTIO if(MUTE_DEADCHAT) mute_string = "deadchat and DSAY" feedback_string = "Deadchat" - // DOPPLER EDIT ADDITION START - LOOC muting. - if(MUTE_LOOC) - mute_string = "LOOC" - feedback_string = "LOOC" - // DOPPLER EDIT ADDITION END - LOOC muting. if(MUTE_INTERNET_REQUEST) mute_string = "internet sound requests" feedback_string = "Internet Sound Requests" diff --git a/code/modules/admin/verbs/admin_newscaster.dm b/code/modules/admin/verbs/admin_newscaster.dm index b1be5560d69d9..4cb7b5c3344e2 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_length = MAX_NAME_LEN, multiline = FALSE) + var/temp_name = tgui_input_text(usr, "Write the Criminal's Name", "Warrent Alert Handler", "John Doe", 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_length = MAX_BROADCAST_LEN, multiline = TRUE) + var/temp_desc = tgui_input_text(usr, "Write the Criminal's Crimes", "Warrent Alert Handler", "Unknown", 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, max_length = MAX_BROADCAST_LEN, multiline = TRUE) + var/temp_message = tgui_input_text(usr, "Write your Feed story", "Network Channel Handler", feed_channel_message, 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 d2eeba90262cf..214cf653d4e1f 100644 --- a/code/modules/admin/verbs/adminevents.dm +++ b/code/modules/admin/verbs/adminevents.dm @@ -269,21 +269,13 @@ 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/admingame.dm b/code/modules/admin/verbs/admingame.dm index 488c670a19d4b..57311446961ed 100644 --- a/code/modules/admin/verbs/admingame.dm +++ b/code/modules/admin/verbs/admingame.dm @@ -88,10 +88,7 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(show_player_panel, R_ADMIN, "Show Player Panel", mo body += "PRAY | " body += "ADMINHELP | " body += "WEBREQ | " - //DOPPLER EDIT ADDITION BEGIN - LOOC muting. - body += "DEADCHAT | " - body += "LOOC\]" - //DOPPLER EDIT ADDITION END - LOOC muting. + body += "DEADCHAT\]" body += "(toggle all)" body += "

" @@ -153,24 +150,20 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(show_player_panel, R_ADMIN, "Show Player Panel", mo user << browse(body, "window=adminplayeropts-[REF(player)];size=550x515") BLACKBOX_LOG_ADMIN_VERB("Player Panel") -/client/proc/cmd_admin_godmode(mob/mob in GLOB.mob_list) +/client/proc/cmd_admin_godmode(mob/M in GLOB.mob_list) set category = "Admin.Game" set name = "Godmode" if(!check_rights(R_ADMIN)) return - var/had_trait = HAS_TRAIT_FROM(mob, TRAIT_GODMODE, ADMIN_TRAIT) - if(had_trait) - REMOVE_TRAIT(mob, TRAIT_GODMODE, ADMIN_TRAIT) - else - ADD_TRAIT(mob, TRAIT_GODMODE, ADMIN_TRAIT) - to_chat(usr, span_adminnotice("Toggled [had_trait ? "OFF" : "ON"]"), confidential = TRUE) + M.status_flags ^= GODMODE + to_chat(usr, span_adminnotice("Toggled [(M.status_flags & GODMODE) ? "ON" : "OFF"]"), confidential = TRUE) - log_admin("[key_name(usr)] has toggled [key_name(mob)]'s nodamage to [had_trait ? "Off" : "On"]") - var/msg = "[key_name_admin(usr)] has toggled [ADMIN_LOOKUPFLW(mob)]'s nodamage to [had_trait ? "Off" : "On"]" + log_admin("[key_name(usr)] has toggled [key_name(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]") + var/msg = "[key_name_admin(usr)] has toggled [ADMIN_LOOKUPFLW(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]" message_admins(msg) - admin_ticket_log(mob, msg) - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Godmode", "[had_trait ? "Disabled" : "Enabled"]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! + admin_ticket_log(M, msg) + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Godmode", "[M.status_flags & GODMODE ? "Enabled" : "Disabled"]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /* If a guy was gibbed and you want to revive him, this is a good way to do so. @@ -197,7 +190,7 @@ ADMIN_VERB(respawn_character, R_ADMIN, "Respawn Character", "Respawn a player th if(findtext(G_found.real_name,"monkey")) if(tgui_alert(user,"This character appears to have been a monkey. Would you like to respawn them as such?",,list("Yes","No")) == "Yes") var/mob/living/carbon/human/species/monkey/new_monkey = new - SSjob.send_to_late_join(new_monkey) + SSjob.SendToLateJoin(new_monkey) G_found.mind.transfer_to(new_monkey) //be careful when doing stuff like this! I've already checked the mind isn't in use new_monkey.key = G_found.key to_chat(new_monkey, "You have been fully respawned. Enjoy the game.", confidential = TRUE) @@ -209,7 +202,7 @@ ADMIN_VERB(respawn_character, R_ADMIN, "Respawn Character", "Respawn a player th //Ok, it's not a monkey. So, spawn a human. var/mob/living/carbon/human/new_character = new//The mob being spawned. - SSjob.send_to_late_join(new_character) + SSjob.SendToLateJoin(new_character) var/datum/record/locked/record_found //Referenced to later to either randomize or not randomize the character. if(G_found.mind && !G_found.mind.active) //mind isn't currently in use by someone/something @@ -232,7 +225,7 @@ ADMIN_VERB(respawn_character, R_ADMIN, "Respawn Character", "Respawn a player th else new_character.mind_initialize() if(is_unassigned_job(new_character.mind.assigned_role)) - new_character.mind.set_assigned_role(SSjob.get_job_type(SSjob.overflow_role)) + new_character.mind.set_assigned_role(SSjob.GetJobType(SSjob.overflow_role)) new_character.key = G_found.key @@ -249,7 +242,7 @@ ADMIN_VERB(respawn_character, R_ADMIN, "Respawn Character", "Respawn a player th //Now for special roles and equipment. var/datum/antagonist/traitor/traitordatum = new_character.mind.has_antag_datum(/datum/antagonist/traitor) if(traitordatum) - SSjob.equip_rank(new_character, new_character.mind.assigned_role, new_character.client) + SSjob.EquipRank(new_character, new_character.mind.assigned_role, new_character.client) new_character.mind.give_uplink(silent = TRUE, antag_datum = traitordatum) switch(new_character.mind.special_role) @@ -278,7 +271,7 @@ ADMIN_VERB(respawn_character, R_ADMIN, "Respawn Character", "Respawn a player th new_character = new_character.AIize() else if(!traitordatum) // Already equipped there. - SSjob.equip_rank(new_character, new_character.mind.assigned_role, new_character.client)//Or we simply equip them. + SSjob.EquipRank(new_character, new_character.mind.assigned_role, new_character.client)//Or we simply equip them. //Announces the character on all the systems, based on the record. if(!record_found && (new_character.mind.assigned_role.job_flags & JOB_CREW_MEMBER)) diff --git a/code/modules/admin/verbs/ai_triumvirate.dm b/code/modules/admin/verbs/ai_triumvirate.dm index 38c2eba712c60..d63994a25c319 100644 --- a/code/modules/admin/verbs/ai_triumvirate.dm +++ b/code/modules/admin/verbs/ai_triumvirate.dm @@ -36,7 +36,7 @@ GLOBAL_DATUM(triple_ai_controller, /datum/triple_ai_controller) to_chat(usr, "This option is currently only usable during pregame. This may change at a later date.", confidential = TRUE) return - var/datum/job/job = SSjob.get_job_type(/datum/job/ai) + var/datum/job/job = SSjob.GetJobType(/datum/job/ai) if(!job) to_chat(usr, "Unable to locate the AI job", confidential = TRUE) CRASH("triple_ai() called, no /datum/job/ai to be found.") diff --git a/code/modules/admin/verbs/ert.dm b/code/modules/admin/verbs/ert.dm index 23f1627503e06..441a5d0dd56fe 100644 --- a/code/modules/admin/verbs/ert.dm +++ b/code/modules/admin/verbs/ert.dm @@ -248,7 +248,7 @@ ert_antag.random_names = ertemplate.random_names ert_operative.mind.add_antag_datum(ert_antag,ert_team) - ert_operative.mind.set_assigned_role(SSjob.get_job_type(ert_antag.ert_job_path)) + ert_operative.mind.set_assigned_role(SSjob.GetJobType(ert_antag.ert_job_path)) //Logging and cleanup ert_operative.log_message("has been selected as \a [ert_antag.name].", LOG_GAME) diff --git a/code/modules/admin/verbs/lawpanel.dm b/code/modules/admin/verbs/lawpanel.dm index 6de3ff70182b8..f1daaf175761f 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") // admin verb so no max length and also any user-level input is config based already so ehhhh + var/lawtext = tgui_input_text(user, "Input law text", "Law text") if(!lawtext) return FALSE if(QDELETED(src) || QDELETED(borgo)) diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm index 9012a8652bbff..bcb89379ef40a 100644 --- a/code/modules/admin/verbs/secrets.dm +++ b/code/modules/admin/verbs/secrets.dm @@ -84,7 +84,7 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w if("infinite_sec") if(!is_debugger) return - var/datum/job/sec_job = SSjob.get_job_type(/datum/job/security_officer) + var/datum/job/sec_job = SSjob.GetJobType(/datum/job/security_officer) sec_job.total_positions = -1 sec_job.spawn_positions = -1 message_admins("[key_name_admin(holder)] has removed the cap on security officers.") diff --git a/code/modules/admin/view_variables/debug_variable_appearance.dm b/code/modules/admin/view_variables/debug_variable_appearance.dm index c5a367e83a064..6d87f6cc85d86 100644 --- a/code/modules/admin/view_variables/debug_variable_appearance.dm +++ b/code/modules/admin/view_variables/debug_variable_appearance.dm @@ -38,9 +38,6 @@ // can't use the name either for byond reasons var/_vis_flags -#if (MIN_COMPILER_VERSION > 515 || MIN_COMPILER_BUILD > 1643) -#warn vis_flags should now be supported by mutable appearances so we can safely remove the weird copying in this code -#endif // all alone at the end of the universe GLOBAL_DATUM_INIT(pluto, /atom/movable, new /atom/movable(null)) @@ -66,28 +63,6 @@ GLOBAL_DATUM_INIT(pluto, /atom/movable, new /atom/movable(null)) return FALSE if(var_name == NAMEOF(src, realized_underlays)) return FALSE - -#if (MIN_COMPILER_VERSION >= 515 && MIN_COMPILER_BUILD >= 1643) -#warn X/Y/Z and contents are now fully unviewable on our supported versions, remove the below check -#endif - -// lummy removed these from the the MA/image type -#if (DM_VERSION <= 515 && DM_BUILD < 1643) - // Filtering out the stuff I know we don't care about - if(var_name == NAMEOF(src, x)) - return FALSE - if(var_name == NAMEOF(src, y)) - return FALSE - if(var_name == NAMEOF(src, z)) - return FALSE - #ifndef SPACEMAN_DMM // Spaceman doesn't believe in contents on appearances, sorry lads - if(var_name == NAMEOF(src, contents)) - return FALSE - #endif - if(var_name == NAMEOF(src, loc)) - return FALSE -#endif - // Could make an argument for this but I think they will just confuse people, so yeeet if(var_name == NAMEOF(src, vis_contents)) return FALSE return ..() diff --git a/code/modules/admin/view_variables/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm index 66ac70f3f62f7..37bf0911c608f 100644 --- a/code/modules/admin/view_variables/view_variables.dm +++ b/code/modules/admin/view_variables/view_variables.dm @@ -3,7 +3,7 @@ ADMIN_VERB_AND_CONTEXT_MENU(debug_variables, R_NONE, "View Variables", "View the variables of a datum.", ADMIN_CATEGORY_DEBUG, datum/thing in world) user.debug_variables(thing) -// This is kept as a separate proc because admins are able to show VV to non-admins +// This is kept as a seperate proc because admins are able to show VV to non-admins /client/proc/debug_variables(datum/thing in world) set category = "Debug" @@ -23,7 +23,7 @@ ADMIN_VERB_AND_CONTEXT_MENU(debug_variables, R_NONE, "View Variables", "View the if(isappearance(thing)) thing = get_vv_appearance(thing) // this is /mutable_appearance/our_bs_subtype - var/islist = islist(thing) || (!isdatum(thing) && hascall(thing, "Cut")) // Some special lists don't count as lists, but can be detected by if they have list procs + var/islist = islist(thing) || (!isdatum(thing) && hascall(thing, "Cut")) // Some special lists dont count as lists, but can be detected by if they have list procs if(!islist && !isdatum(thing)) return diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index da7c7e9e39cac..5f7a7e579d3ee 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -83,7 +83,7 @@ app.wiz_team = master_wizard.wiz_team master_wizard.wiz_team.add_member(app_mind) app_mind.add_antag_datum(app) - app_mind.set_assigned_role(SSjob.get_job_type(/datum/job/wizard_apprentice)) + app_mind.set_assigned_role(SSjob.GetJobType(/datum/job/wizard_apprentice)) app_mind.special_role = ROLE_WIZARD_APPRENTICE SEND_SOUND(M, sound('sound/effects/magic.ogg')) @@ -424,7 +424,15 @@ monkey_man.fully_replace_character_name(monkey_man.real_name, pick(GLOB.syndicate_monkey_names)) - monkey_man.make_clever_and_no_dna_scramble() + monkey_man.dna.add_mutation(/datum/mutation/human/clever) + // Can't make them human or nonclever. At least not with the easy and boring way out. + for(var/datum/mutation/human/mutation as anything in monkey_man.dna.mutations) + mutation.mutadone_proof = TRUE + mutation.instability = 0 + + // Extra backup! + ADD_TRAIT(monkey_man, TRAIT_NO_DNA_SCRAMBLE, SPECIES_TRAIT) + // Anything else requires enough effort that they deserve it. monkey_man.mind.enslave_mind_to_creator(user) diff --git a/code/modules/antagonists/abductor/abductor.dm b/code/modules/antagonists/abductor/abductor.dm index cd56fcdaa5cdc..7fc0c565ab1df 100644 --- a/code/modules/antagonists/abductor/abductor.dm +++ b/code/modules/antagonists/abductor/abductor.dm @@ -70,7 +70,7 @@ return team /datum/antagonist/abductor/on_gain() - owner.set_assigned_role(SSjob.get_job_type(role_job)) + owner.set_assigned_role(SSjob.GetJobType(role_job)) owner.special_role = ROLE_ABDUCTOR objectives += team.objectives finalize_abductor() diff --git a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm index ab1636b4dedfd..5a8f699832e6e 100644 --- a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm +++ b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm @@ -189,12 +189,8 @@ 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", - max_length = MAX_MESSAGE_LEN, - ) + 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") if(!command) return @@ -219,7 +215,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", max_length = MAX_MESSAGE_LEN) + var/message = tgui_input_text(user, "Message to send to your target's brain", "Enter message") if(!message) return if(QDELETED(living_target) || living_target.stat == DEAD) diff --git a/code/modules/antagonists/abductor/machinery/experiment.dm b/code/modules/antagonists/abductor/machinery/experiment.dm index 27093778c3116..09790f4ba897e 100644 --- a/code/modules/antagonists/abductor/machinery/experiment.dm +++ b/code/modules/antagonists/abductor/machinery/experiment.dm @@ -190,7 +190,7 @@ H.forceMove(console.pad.teleport_target) return //Area not chosen / It's not safe area - teleport to arrivals - SSjob.send_to_late_join(H, FALSE) + SSjob.SendToLateJoin(H, FALSE) return /obj/machinery/abductor/experiment/update_icon_state() diff --git a/code/modules/antagonists/blob/blobstrains/_reagent.dm b/code/modules/antagonists/blob/blobstrains/_reagent.dm index 65a50621b1717..2d7f4c5d34eb8 100644 --- a/code/modules/antagonists/blob/blobstrains/_reagent.dm +++ b/code/modules/antagonists/blob/blobstrains/_reagent.dm @@ -26,21 +26,12 @@ // These can only be applied by blobs. They are what (reagent) blobs are made out of. /datum/reagent/blob name = "Unknown" - description = "" + description = "shouldn't exist and you should adminhelp immediately." color = COLOR_WHITE taste_description = "bad code and slime" chemical_flags = NONE penetrates_skin = NONE - -/datum/reagent/blob/New() - ..() - - if(name == "Unknown") - description = "shouldn't exist and you should adminhelp immediately." - else if(description == "") - description = "[name] is the reagent created by that type of blob." - /// Used by blob reagents to calculate the reaction volume they should use when exposing mobs. /datum/reagent/blob/proc/return_mob_expose_reac_volume(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/overmind) if(exposed_mob.stat == DEAD || HAS_TRAIT(exposed_mob, TRAIT_BLOB_ALLY)) diff --git a/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm b/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm index acb4d96c23ad8..a18d802ff7dd4 100644 --- a/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm +++ b/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm @@ -12,7 +12,7 @@ /datum/reagent/blob/cryogenic_poison name = "Cryogenic Poison" - description = "A freezing poison that does high damage over time. Cryogenic poison blobs inject this into their victims." + description = "will inject targets with a freezing poison that does high damage over time." color = "#8BA6E9" taste_description = "brain freeze" diff --git a/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm b/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm index d9010a965376e..a62895ae6c4b7 100644 --- a/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm +++ b/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm @@ -12,7 +12,6 @@ /datum/reagent/blob/regenerative_materia name = "Regenerative Materia" - description = "Chemical that inflicts toxin damage and makes the target believe they are fully healed. Regenerative materia blobs inject this into their victims." taste_description = "heaven" color = "#A88FB7" diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index c7a2fc3a1107f..324c91ea3a529 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -175,7 +175,6 @@ 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/blob/structures/core.dm b/code/modules/antagonists/blob/structures/core.dm index f995dc0b81b03..6eeccc8c361dd 100644 --- a/code/modules/antagonists/blob/structures/core.dm +++ b/code/modules/antagonists/blob/structures/core.dm @@ -24,7 +24,7 @@ GLOB.blob_cores += src START_PROCESSING(SSobj, src) SSpoints_of_interest.make_point_of_interest(src) - update_appearance() //so it at least appears + update_appearance() //so it atleast appears if(!placed && !overmind) return INITIALIZE_HINT_QDEL if(overmind) diff --git a/code/modules/antagonists/brainwashing/brainwashing.dm b/code/modules/antagonists/brainwashing/brainwashing.dm index 5d5cca3cb6de1..57707688f4daf 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", max_length = MAX_MESSAGE_LEN) + var/objective = tgui_input_text(admin, "Add an objective", "Brainwashing") if(objective) objectives += objective while(tgui_alert(admin, "Add another objective?", "More Brainwashing", list("Yes","No")) == "Yes") diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm index d5ee0c2fc873a..7e13612153b49 100644 --- a/code/modules/antagonists/changeling/powers/absorb.dm +++ b/code/modules/antagonists/changeling/powers/absorb.dm @@ -41,14 +41,9 @@ owner.visible_message(span_danger("[owner] sucks the fluids from [target]!"), span_notice("We have absorbed [target].")) to_chat(target, span_userdanger("You are absorbed by the changeling!")) - var/true_absorbtion = (!isnull(target.client) || !isnull(target.mind) || !isnull(target.last_mind)) - if (!true_absorbtion) - to_chat(owner, span_changeling(span_bold("You absorb [target], but their weak DNA is not enough to satisfy your hunger."))) - if(!changeling.has_profile_with_dna(target.dna)) changeling.add_new_profile(target) - if (true_absorbtion) - changeling.true_absorbs++ + changeling.true_absorbs++ if(owner.nutrition < NUTRITION_LEVEL_WELL_FED) owner.set_nutrition(min((owner.nutrition + target.nutrition), NUTRITION_LEVEL_WELL_FED)) @@ -62,8 +57,7 @@ is_absorbing = FALSE changeling.adjust_chemicals(10) - if (true_absorbtion) - changeling.can_respec = TRUE + changeling.can_respec = TRUE if(target.stat != DEAD) target.investigate_log("has died from being changeling absorbed.", INVESTIGATE_DEATHS) diff --git a/code/modules/antagonists/clown_ops/clownop.dm b/code/modules/antagonists/clown_ops/clownop.dm index 9866ee30ccf13..07c1cc84ad756 100644 --- a/code/modules/antagonists/clown_ops/clownop.dm +++ b/code/modules/antagonists/clown_ops/clownop.dm @@ -11,7 +11,7 @@ nuke_icon_state = "bananiumbomb_base" /datum/antagonist/nukeop/clownop/admin_add(datum/mind/new_owner,mob/admin) - new_owner.set_assigned_role(SSjob.get_job_type(/datum/job/clown_operative)) + new_owner.set_assigned_role(SSjob.GetJobType(/datum/job/clown_operative)) new_owner.add_antag_datum(src) message_admins("[key_name_admin(admin)] has clown op'ed [key_name_admin(new_owner)].") log_admin("[key_name(admin)] has clown op'ed [key_name(new_owner)].") diff --git a/code/modules/antagonists/cult/cult_comms.dm b/code/modules/antagonists/cult/cult_comms.dm index 45c3aee695574..3d5677996502a 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", max_length = MAX_MESSAGE_LEN) + var/input = tgui_input_text(usr, "Message to tell to the other acolytes", "Voice of Blood") if(!input || !IsAvailable(feedback = TRUE)) return diff --git a/code/modules/antagonists/cult/cult_objectives.dm b/code/modules/antagonists/cult/cult_objectives.dm index 60542f259bf2a..d290b212ab22f 100644 --- a/code/modules/antagonists/cult/cult_objectives.dm +++ b/code/modules/antagonists/cult/cult_objectives.dm @@ -63,7 +63,7 @@ /datum/objective/sacrifice/proc/on_possible_mindswap(mob/source) SIGNAL_HANDLER UnregisterSignal(target.current, list(COMSIG_QDELETING, COMSIG_MOB_MIND_TRANSFERRED_INTO)) - //we check if the mind is bodyless only after mindswap shenanigans to avoid issues. + //we check if the mind is bodyless only after mindswap shenanigeans to avoid issues. addtimer(CALLBACK(src, PROC_REF(do_we_have_a_body)), 0 SECONDS) /datum/objective/sacrifice/proc/do_we_have_a_body() diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index 511988fb5bcbb..773f890d25dbb 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -137,7 +137,7 @@ /* * Set up and populate our list of options. - * Overridden by subtypes. + * Overriden by subtypes. * * The list of options is a associated list of format: * item_name = list( diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index 29515e45bb124..4b94666abc367 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -233,11 +233,9 @@ var/mob/living/carbon/human/H = owner.current if(!istype(H)) return - if(isplasmaman(H)) - H.dna.species.outfit_important_for_life = plasmaman_outfit - - H.dna.species.give_important_for_life(H) + H.equipOutfit(plasmaman_outfit) + H.open_internals(H.get_item_for_held_index(2)) H.equipOutfit(outfit) if(isplasmaman(H)) diff --git a/code/modules/antagonists/heretic/influences.dm b/code/modules/antagonists/heretic/influences.dm index 7b316d6cdb984..abba2c3f1007e 100644 --- a/code/modules/antagonists/heretic/influences.dm +++ b/code/modules/antagonists/heretic/influences.dm @@ -43,7 +43,7 @@ while((length(smashes) + num_drained) < how_many_can_we_make && location_sanity < 100) var/turf/chosen_location = get_safe_random_station_turf() - // We don't want them close to each other - at least 1 tile of separation + // We don't want them close to each other - at least 1 tile of seperation var/list/nearby_things = range(1, chosen_location) var/obj/effect/heretic_influence/what_if_i_have_one = locate() in nearby_things var/obj/effect/visible_heretic_influence/what_if_i_had_one_but_its_used = locate() in nearby_things diff --git a/code/modules/antagonists/heretic/items/heretic_armor.dm b/code/modules/antagonists/heretic/items/heretic_armor.dm index 8375c3ae44334..0c64e4a227eaf 100644 --- a/code/modules/antagonists/heretic/items/heretic_armor.dm +++ b/code/modules/antagonists/heretic/items/heretic_armor.dm @@ -153,7 +153,6 @@ RemoveElement(/datum/element/heretic_focus) if(isliving(loc)) - REMOVE_TRAIT(loc, TRAIT_RESISTLOWPRESSURE, REF(src)) loc.balloon_alert(loc, "cloak hidden") loc.visible_message(span_notice("Light shifts around [loc], making the cloak around them invisible!")) @@ -164,6 +163,5 @@ AddElement(/datum/element/heretic_focus) if(isliving(loc)) - ADD_TRAIT(loc, TRAIT_RESISTLOWPRESSURE, REF(src)) loc.balloon_alert(loc, "cloak revealed") loc.visible_message(span_notice("A kaleidoscope of colours collapses around [loc], a cloak appearing suddenly around their person!")) diff --git a/code/modules/antagonists/heretic/items/heretic_necks.dm b/code/modules/antagonists/heretic/items/heretic_necks.dm index a738b4aae47ea..5c73c22a4e793 100644 --- a/code/modules/antagonists/heretic/items/heretic_necks.dm +++ b/code/modules/antagonists/heretic/items/heretic_necks.dm @@ -1,5 +1,5 @@ /obj/item/clothing/neck/heretic_focus - name = "amber focus" + name = "Amber Focus" desc = "An amber focusing glass that provides a link to the world beyond. The necklace seems to twitch, but only when you look at it from the corner of your eye." icon_state = "eldritch_necklace" w_class = WEIGHT_CLASS_SMALL @@ -10,7 +10,7 @@ AddElement(/datum/element/heretic_focus) /obj/item/clothing/neck/heretic_focus/crimson_medallion - name = "crimson medallion" + name = "Crimson Medallion" desc = "A blood-red focusing glass that provides a link to the world beyond, and worse. Its eye is constantly twitching and gazing in all directions. It almost seems to be silently screaming..." icon_state = "crimson_medallion" /// The aura healing component. Used to delete it when taken off. @@ -105,7 +105,7 @@ . += span_red("You can also squeeze it to recover a large amount of health quickly, at a cost...") /obj/item/clothing/neck/eldritch_amulet - name = "warm eldritch medallion" + name = "Warm Eldritch Medallion" desc = "A strange medallion. Peering through the crystalline surface, the world around you melts away. You see your own beating heart, and the pulsing of a thousand others." icon = 'icons/obj/antags/eldritch.dmi' icon_state = "eye_medalion" @@ -134,7 +134,7 @@ user.update_sight() /obj/item/clothing/neck/eldritch_amulet/piercing - name = "piercing eldritch medallion" + name = "Piercing Eldritch Medallion" desc = "A strange medallion. Peering through the crystalline surface, the light refracts into new and terrifying spectrums of color. You see yourself, reflected off cascading mirrors, warped into impossible shapes." heretic_only_trait = TRAIT_XRAY_VISION @@ -149,7 +149,7 @@ // The amulet conversion tool used by moon heretics /obj/item/clothing/neck/heretic_focus/moon_amulet - name = "moonlight amulet" + name = "Moonlight Amulet" desc = "A piece of the mind, the soul and the moon. Gazing into it makes your head spin and hear whispers of laughter and joy." icon = 'icons/obj/antags/eldritch.dmi' icon_state = "moon_amulette" diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm index 5919f9a40d12a..4b3525c93b044 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm @@ -501,7 +501,6 @@ sac_target.remove_status_effect(/datum/status_effect/necropolis_curse) sac_target.remove_status_effect(/datum/status_effect/unholy_determination) sac_target.reagents?.del_reagent(/datum/reagent/inverse/helgrasp/heretic) - sac_target.uncuff() sac_target.clear_mood_event("shadow_realm") if(IS_HERETIC(sac_target)) var/datum/antagonist/heretic/victim_heretic = sac_target.mind?.has_antag_datum(/datum/antagonist/heretic) diff --git a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm index 2bae6ed540296..3a0f17ed48391 100644 --- a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm +++ b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm @@ -47,7 +47,7 @@ desc = "Allows you to transmute any ballistic weapon, such as a pipegun, with hide \ from any animal, a plank of wood, and a camera to create the Lionhunter's rifle. \ The Lionhunter's Rifle is a long ranged ballistic weapon with three shots. \ - These shots function as normal, albeit weak high-caliber munitions when fired from \ + These shots function as normal, albeit weak high caliber mutitions when fired from \ close range or at inanimate objects. You can aim the rifle at distant foes, \ causing the shot to deal massively increased damage and hone in on them." gain_text = "I met an old man in an antique shop who wielded a very unusual weapon. \ diff --git a/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm b/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm index d54646fe103b2..a958ab3f272bb 100644 --- a/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm +++ b/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm @@ -37,23 +37,6 @@ route = PATH_SIDE depth = 8 -/datum/heretic_knowledge/spell/void_prison - name = "Void Prison" - desc = "Grants you Void Prison, a spell that places your victim into ball, making them unable to do anything or speak. \ - Applies void chill afterwards." - gain_text = "At first, I see myself, waltzing along a snow-laden street. \ - I try to yell, grab hold of this fool and tell them to run. \ - But the only welts made are on my own beating fist. \ - My smiling face turns to regard me, reflecting back in glassy eyes the empty path I have been lead down." - next_knowledge = list( - /datum/heretic_knowledge/spell/void_phase, - /datum/heretic_knowledge/summon/raw_prophet, - ) - spell_to_add = /datum/action/cooldown/spell/pointed/void_prison - cost = 1 - route = PATH_SIDE - depth = 8 - /datum/heretic_knowledge/spell/cleave name = "Blood Cleave" desc = "Grants you Cleave, an area-of-effect targeted spell \ diff --git a/code/modules/antagonists/heretic/knowledge/void_lore.dm b/code/modules/antagonists/heretic/knowledge/void_lore.dm index d2fd0efe8b570..11031a51aca96 100644 --- a/code/modules/antagonists/heretic/knowledge/void_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/void_lore.dm @@ -12,10 +12,9 @@ * * Mark of Void * Ritual of Knowledge - * Void Conduit + * Cone of Cold * Void Phase * > Sidepaths: - * Void Stasis * Carving Knife * Blood Siphon * @@ -79,7 +78,7 @@ var/mob/living/carbon/carbon_target = target carbon_target.adjust_silence(10 SECONDS) - carbon_target.apply_status_effect(/datum/status_effect/void_chill, 2) + carbon_target.apply_status_effect(/datum/status_effect/void_chill) /datum/heretic_knowledge/cold_snap name = "Aristocrat's Way" @@ -97,29 +96,12 @@ research_tree_icon_path = 'icons/effects/effects.dmi' research_tree_icon_state = "the_freezer" depth = 4 - /// Traits we apply to become immune to the environment - var/static/list/gain_traits = list(TRAIT_NO_SLIP_ICE, TRAIT_NO_SLIP_SLIDE) /datum/heretic_knowledge/cold_snap/on_gain(mob/user, datum/antagonist/heretic/our_heretic) user.add_traits(list(TRAIT_NOBREATH, TRAIT_RESISTCOLD), type) - RegisterSignal(user, COMSIG_LIVING_LIFE, PROC_REF(check_environment)) /datum/heretic_knowledge/cold_snap/on_lose(mob/user, datum/antagonist/heretic/our_heretic) user.remove_traits(list(TRAIT_RESISTCOLD, TRAIT_NOBREATH), type) - UnregisterSignal(user, COMSIG_LIVING_LIFE) - -///Checks if our traits should be active -/datum/heretic_knowledge/cold_snap/proc/check_environment(mob/living/user) - SIGNAL_HANDLER - - var/datum/gas_mixture/environment = user.loc?.return_air() - if(!isnull(environment)) - var/affected_temperature = environment.return_temperature() - var/affected_pressure = environment.return_pressure() - if(affected_temperature <= T0C || affected_pressure < ONE_ATMOSPHERE) - user.add_traits(gain_traits, type) - else - user.remove_traits(gain_traits, type) /datum/heretic_knowledge/mark/void_mark name = "Mark of Void" @@ -132,17 +114,17 @@ mark_type = /datum/status_effect/eldritch/void /datum/heretic_knowledge/knowledge_ritual/void - next_knowledge = list(/datum/heretic_knowledge/spell/void_conduit) + next_knowledge = list(/datum/heretic_knowledge/spell/void_cone) route = PATH_VOID -/datum/heretic_knowledge/spell/void_conduit - name = "Void Conduit" - desc = "Grants you Void Conduit, a spell which summons a pulsing gate to the Void itself. Every pulse breaks windows and airlocks, while afflicting Heathens with an eldritch chill and shielding Heretics against low pressure." - gain_text = "The hum in the still, cold air turns to a cacophonous rattle. \ - Over the noise, there is no distinction to the clattering of window panes and the yawning knowledge that ricochets through my skull. \ - The doors won't close. I can't keep the cold out now." +/datum/heretic_knowledge/spell/void_cone + name = "Void Blast" + desc = "Grants you Void Blast, a spell that shoots out a freezing blast in a cone in front of you, \ + freezing the ground and any victims within." + gain_text = "Every door I open racks my body. I am afraid of what is behind them. Someone is expecting me, \ + and my legs start to drag. Is that... snow?" next_knowledge = list(/datum/heretic_knowledge/spell/void_phase) - spell_to_add = /datum/action/cooldown/spell/conjure/void_conduit + spell_to_add = /datum/action/cooldown/spell/cone/staggered/cone_of_cold/void cost = 1 route = PATH_VOID depth = 7 @@ -157,7 +139,6 @@ /datum/heretic_knowledge/blade_upgrade/void, /datum/heretic_knowledge/reroll_targets, /datum/heretic_knowledge/spell/blood_siphon, - /datum/heretic_knowledge/spell/void_prison, /datum/heretic_knowledge/rune_carver, ) spell_to_add = /datum/action/cooldown/spell/pointed/void_phase @@ -168,19 +149,13 @@ /datum/heretic_knowledge/blade_upgrade/void name = "Seeking Blade" - desc = "Your blade now freezes enemies. Additionally, you can now attack distant marked targets with your Void Blade, teleporting directly next to them." + desc = "You can now attack distant marked targets with your Void Blade, teleporting directly next to them." gain_text = "Fleeting memories, fleeting feet. I mark my way with frozen blood upon the snow. Covered and forgotten." next_knowledge = list(/datum/heretic_knowledge/spell/void_pull) route = PATH_VOID research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' research_tree_icon_state = "blade_upgrade_void" -/datum/heretic_knowledge/blade_upgrade/void/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) - if(source == target) - return - - target.apply_status_effect(/datum/status_effect/void_chill, 2) - /datum/heretic_knowledge/blade_upgrade/void/do_ranged_effects(mob/living/user, mob/living/target, obj/item/melee/sickly_blade/blade) if(!target.has_status_effect(/datum/status_effect/eldritch)) return @@ -225,8 +200,6 @@ var/datum/looping_sound/void_loop/sound_loop ///Reference to the ongoing voidstrom that surrounds the heretic var/datum/weather/void_storm/storm - ///The storm where there are actual effects - var/datum/proximity_monitor/advanced/void_storm/heavy_storm /datum/heretic_knowledge/ultimate/void_final/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) if(!isopenturf(loc)) @@ -248,22 +221,16 @@ sound = 'sound/ambience/antag/heretic/ascend_void.ogg', color_override = "pink", ) - user.add_traits(list(TRAIT_RESISTLOWPRESSURE, TRAIT_NEGATES_GRAVITY, TRAIT_MOVE_FLYING, TRAIT_FREE_HYPERSPACE_MOVEMENT), MAGIC_TRAIT) + ADD_TRAIT(user, TRAIT_RESISTLOWPRESSURE, MAGIC_TRAIT) // Let's get this show on the road! sound_loop = new(user, TRUE, TRUE) RegisterSignal(user, COMSIG_LIVING_LIFE, PROC_REF(on_life)) - RegisterSignal(user, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(hit_by_projectile)) - RegisterSignals(user, list(COMSIG_LIVING_DEATH, COMSIG_QDELETING), PROC_REF(on_death)) - heavy_storm = new(user, 10) - if(ishuman(user)) - var/mob/living/carbon/human/ascended_human = user - var/obj/item/organ/internal/eyes/heretic_eyes = ascended_human.get_organ_slot(ORGAN_SLOT_EYES) - heretic_eyes?.color_cutoffs = list(30, 30, 30) - ascended_human.update_sight() + RegisterSignal(user, COMSIG_LIVING_DEATH, PROC_REF(on_death)) /datum/heretic_knowledge/ultimate/void_final/on_lose(mob/user, datum/antagonist/heretic/our_heretic) on_death() // Losing is pretty much dying. I think + RegisterSignals(user, list(COMSIG_LIVING_LIFE, COMSIG_LIVING_DEATH)) /** * Signal proc for [COMSIG_LIVING_LIFE]. @@ -276,29 +243,10 @@ /datum/heretic_knowledge/ultimate/void_final/proc/on_life(mob/living/source, seconds_per_tick, times_fired) SIGNAL_HANDLER - for(var/atom/thing_in_range as anything in range(10, source)) - if(iscarbon(thing_in_range)) - var/mob/living/carbon/close_carbon = thing_in_range - if(IS_HERETIC_OR_MONSTER(close_carbon)) - close_carbon.apply_status_effect(/datum/status_effect/void_conduit) - continue - close_carbon.adjust_silence_up_to(2 SECONDS, 20 SECONDS) - close_carbon.apply_status_effect(/datum/status_effect/void_chill, 1) - close_carbon.adjust_eye_blur(rand(0 SECONDS, 2 SECONDS)) - close_carbon.adjust_bodytemperature(-30 * TEMPERATURE_DAMAGE_COEFFICIENT) - - if(istype(thing_in_range, /obj/machinery/door) || istype(thing_in_range, /obj/structure/door_assembly)) - var/obj/affected_door = thing_in_range - affected_door.take_damage(rand(60, 80)) - - if(istype(thing_in_range, /obj/structure/window) || istype(thing_in_range, /obj/structure/grille)) - var/obj/structure/affected_structure = thing_in_range - affected_structure.take_damage(rand(20, 40)) - - if(isturf(thing_in_range)) - var/turf/affected_turf = thing_in_range - var/datum/gas_mixture/environment = affected_turf.return_air() - environment.temperature *= 0.9 + for(var/mob/living/carbon/close_carbon in view(5, source)) + if(IS_HERETIC_OR_MONSTER(close_carbon)) + continue + close_carbon.adjust_silence_up_to(2 SECONDS, 20 SECONDS) // Telegraph the storm in every area on the station. var/list/station_levels = SSmapping.levels_by_trait(ZTRAIT_STATION) @@ -306,6 +254,14 @@ storm = new /datum/weather/void_storm(station_levels) storm.telegraph() + // When the heretic enters a new area, intensify the storm in the new area, + // and lessen the intensity in the former area. + var/area/source_area = get_area(source) + if(!storm.impacted_areas[source_area]) + storm.former_impacted_areas |= storm.impacted_areas + storm.impacted_areas = list(source_area) + storm.update_areas() + /** * Signal proc for [COMSIG_LIVING_DEATH]. * @@ -319,32 +275,3 @@ if(storm) storm.end() QDEL_NULL(storm) - if(heavy_storm) - QDEL_NULL(heavy_storm) - UnregisterSignal(source, list(COMSIG_LIVING_LIFE, COMSIG_ATOM_PRE_BULLET_ACT, COMSIG_LIVING_DEATH, COMSIG_QDELETING)) - -///Few checks to determine if we can deflect bullets -/datum/heretic_knowledge/ultimate/void_final/proc/can_deflect(mob/living/ascended_heretic) - if(!(ascended_heretic.mobility_flags & MOBILITY_USE)) - return FALSE - if(!isturf(ascended_heretic.loc)) - return FALSE - return TRUE - -/datum/heretic_knowledge/ultimate/void_final/proc/hit_by_projectile(mob/living/ascended_heretic, obj/projectile/hitting_projectile, def_zone) - SIGNAL_HANDLER - - if(!can_deflect(ascended_heretic)) - return NONE - - ascended_heretic.visible_message( - span_danger("The void storm surrounding [ascended_heretic] deflects [hitting_projectile]!"), - span_userdanger("The void storm protects you from [hitting_projectile]!"), - ) - playsound(ascended_heretic, pick('sound/magic/VoidDeflect01.ogg', 'sound/magic/VoidDeflect02.ogg', 'sound/magic/VoidDeflect03.ogg'), 75, TRUE) - hitting_projectile.firer = ascended_heretic - if(prob(75)) - hitting_projectile.set_angle(get_angle(hitting_projectile.firer, hitting_projectile.fired_from)) - else - hitting_projectile.set_angle(rand(0, 360))//SHING - return COMPONENT_BULLET_PIERCED diff --git a/code/modules/antagonists/heretic/magic/void_phase.dm b/code/modules/antagonists/heretic/magic/void_phase.dm index c6e367e87608c..350ca0f29c100 100644 --- a/code/modules/antagonists/heretic/magic/void_phase.dm +++ b/code/modules/antagonists/heretic/magic/void_phase.dm @@ -10,7 +10,7 @@ ranged_mousepointer = 'icons/effects/mouse_pointers/throw_target.dmi' school = SCHOOL_FORBIDDEN - cooldown_time = 25 SECONDS + cooldown_time = 30 SECONDS invocation = "RE'L'TY PH'S'E." invocation_type = INVOCATION_WHISPER @@ -57,7 +57,6 @@ if(living_mob.can_block_magic(antimagic_flags)) continue living_mob.apply_damage(40, BRUTE, wound_bonus = CANT_WOUND) - living_mob.apply_status_effect(/datum/status_effect/void_chill, 1) /obj/effect/temp_visual/voidin icon = 'icons/effects/96x96.dmi' diff --git a/code/modules/antagonists/heretic/magic/void_pull.dm b/code/modules/antagonists/heretic/magic/void_pull.dm index 1db1c6601718e..2021bf8a04e4f 100644 --- a/code/modules/antagonists/heretic/magic/void_pull.dm +++ b/code/modules/antagonists/heretic/magic/void_pull.dm @@ -9,7 +9,7 @@ sound = 'sound/magic/voidblink.ogg' school = SCHOOL_FORBIDDEN - cooldown_time = 30 SECONDS + cooldown_time = 40 SECONDS invocation = "BR'NG F'RTH TH'M T' M'." invocation_type = INVOCATION_WHISPER @@ -32,7 +32,6 @@ // Before we cast the actual effects, deal AOE damage to anyone adjacent to us for(var/mob/living/nearby_living as anything in get_things_to_cast_on(cast_on, damage_radius)) nearby_living.apply_damage(30, BRUTE, wound_bonus = CANT_WOUND) - nearby_living.apply_status_effect(/datum/status_effect/void_chill, 1) /datum/action/cooldown/spell/aoe/void_pull/get_things_to_cast_on(atom/center, radius_override = 1) var/list/things = list() diff --git a/code/modules/antagonists/heretic/status_effects/buffs.dm b/code/modules/antagonists/heretic/status_effects/buffs.dm index e4f5990040be4..1668ea5a11ef7 100644 --- a/code/modules/antagonists/heretic/status_effects/buffs.dm +++ b/code/modules/antagonists/heretic/status_effects/buffs.dm @@ -251,10 +251,11 @@ status_type = STATUS_EFFECT_REFRESH duration = -1 alert_type = null - var/static/list/caretaking_traits = list(TRAIT_GODMODE, TRAIT_HANDS_BLOCKED, TRAIT_IGNORESLOWDOWN, TRAIT_SECLUDED_LOCATION) + var/static/list/caretaking_traits = list(TRAIT_HANDS_BLOCKED, TRAIT_IGNORESLOWDOWN, TRAIT_SECLUDED_LOCATION) /datum/status_effect/caretaker_refuge/on_apply() owner.add_traits(caretaking_traits, TRAIT_STATUS_EFFECT(id)) + owner.status_flags |= GODMODE animate(owner, alpha = 45,time = 0.5 SECONDS) owner.density = FALSE RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_ALLOW_HERETIC_CASTING), PROC_REF(on_focus_lost)) @@ -265,6 +266,7 @@ /datum/status_effect/caretaker_refuge/on_remove() owner.remove_traits(caretaking_traits, TRAIT_STATUS_EFFECT(id)) + owner.status_flags &= ~GODMODE owner.alpha = initial(owner.alpha) owner.density = initial(owner.density) UnregisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_ALLOW_HERETIC_CASTING)) diff --git a/code/modules/antagonists/heretic/status_effects/debuffs.dm b/code/modules/antagonists/heretic/status_effects/debuffs.dm index 8b1751bccde69..7037d1cc3778b 100644 --- a/code/modules/antagonists/heretic/status_effects/debuffs.dm +++ b/code/modules/antagonists/heretic/status_effects/debuffs.dm @@ -1,3 +1,41 @@ +// VOID CHILL +/datum/status_effect/void_chill + id = "void_chill" + alert_type = /atom/movable/screen/alert/status_effect/void_chill + duration = 8 SECONDS + status_type = STATUS_EFFECT_REPLACE + tick_interval = 0.5 SECONDS + /// The amount the victim's body temperature changes each tick() in kelvin. Multiplied by TEMPERATURE_DAMAGE_COEFFICIENT. + var/cooling_per_tick = -14 + +/atom/movable/screen/alert/status_effect/void_chill + name = "Void Chill" + desc = "There's something freezing you from within and without. You've never felt cold this oppressive before..." + icon_state = "void_chill" + +/datum/status_effect/void_chill/on_apply() + owner.add_atom_colour(COLOR_BLUE_LIGHT, TEMPORARY_COLOUR_PRIORITY) + owner.add_movespeed_modifier(/datum/movespeed_modifier/void_chill, update = TRUE) + return TRUE + +/datum/status_effect/void_chill/on_remove() + owner.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, COLOR_BLUE_LIGHT) + owner.remove_movespeed_modifier(/datum/movespeed_modifier/void_chill, update = TRUE) + +/datum/status_effect/void_chill/tick(seconds_between_ticks) + owner.adjust_bodytemperature(cooling_per_tick * TEMPERATURE_DAMAGE_COEFFICIENT) + +/datum/status_effect/void_chill/major + duration = 10 SECONDS + cooling_per_tick = -20 + +/datum/status_effect/void_chill/lasting + id = "lasting_void_chill" + duration = -1 + +/datum/movespeed_modifier/void_chill + multiplicative_slowdown = 0.3 + // AMOK /datum/status_effect/amok id = "amok" diff --git a/code/modules/antagonists/heretic/status_effects/mark_effects.dm b/code/modules/antagonists/heretic/status_effects/mark_effects.dm index 4cbdbdf8c1ce1..b647ba6ca8077 100644 --- a/code/modules/antagonists/heretic/status_effects/mark_effects.dm +++ b/code/modules/antagonists/heretic/status_effects/mark_effects.dm @@ -105,7 +105,7 @@ effect_icon_state = "emark4" /datum/status_effect/eldritch/void/on_effect() - owner.apply_status_effect(/datum/status_effect/void_chill, 3) + owner.apply_status_effect(/datum/status_effect/void_chill/major) owner.adjust_silence(10 SECONDS) return ..() diff --git a/code/modules/antagonists/malf_ai/malf_ai.dm b/code/modules/antagonists/malf_ai/malf_ai.dm index dc92289f66bef..4dc2568fe0e89 100644 --- a/code/modules/antagonists/malf_ai/malf_ai.dm +++ b/code/modules/antagonists/malf_ai/malf_ai.dm @@ -41,7 +41,6 @@ malfunction_flavor = strings(MALFUNCTION_FLAVOR_FILE, employer) add_law_zero() - RegisterSignal(owner.current, COMSIG_SILICON_AI_CORE_STATUS, PROC_REF(core_status)) if(malf_sound) owner.current.playsound_local(get_turf(owner.current), malf_sound, 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) owner.current.grant_language(/datum/language/codespeak, source = LANGUAGE_MALF) @@ -59,7 +58,7 @@ QDEL_NULL(malf_ai.malf_picker) owner.special_role = null - UnregisterSignal(owner, COMSIG_SILICON_AI_CORE_STATUS) + return ..() /// Generates a complete set of malf AI objectives up to the traitor objective limit. @@ -198,7 +197,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/malf/mod = malf_ai.malf_picker.possible_modules[category][module] + var/datum/ai_module/mod = malf_ai.malf_picker.possible_modules[category][module] cat["items"] += list(list( "name" = mod.name, "cost" = mod.cost, @@ -223,7 +222,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/malf/valid_mod = buyable_items[key] + var/datum/ai_module/valid_mod = buyable_items[key] if(valid_mod.name == item_name) malf_ai.malf_picker.purchase_module(malf_ai, valid_mod) return TRUE @@ -272,14 +271,6 @@ return malf_ai_icon -/datum/antagonist/malf_ai/proc/core_status(datum/source) - SIGNAL_HANDLER - - var/mob/living/silicon/ai/malf_owner = owner.current - if(malf_owner.linked_core) - return COMPONENT_CORE_ALL_GOOD - return COMPONENT_CORE_DISCONNECTED - //Subtype of Malf AI datum, used for one of the traitor final objectives /datum/antagonist/malf_ai/infected name = "Infected AI" diff --git a/code/modules/antagonists/malf_ai/malf_ai_modules.dm b/code/modules/antagonists/malf_ai/malf_ai_modules.dm index a9f84c51dad1a..90f3b76649230 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/malf)) +GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) /// The malf AI action subtype. All malf actions are subtypes of this. /datum/action/innate/ai @@ -137,19 +137,19 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) return /// Modules causing destruction -/datum/ai_module/malf/destructive +/datum/ai_module/destructive category = "Destructive Modules" /// Modules with stealthy and utility uses -/datum/ai_module/malf/utility +/datum/ai_module/utility category = "Utility Modules" /// Modules that are improving AI abilities and assets -/datum/ai_module/malf/upgrade +/datum/ai_module/upgrade category = "Upgrade Modules" /// Doomsday Device: Starts the self-destruct timer. It can only be stopped by killing the AI completely. -/datum/ai_module/malf/destructive/nuke_station +/datum/ai_module/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/malf)) return TRUE /// Hostile Station Lockdown: Locks, bolts, and electrifies every airlock on the station. After 90 seconds, the doors reset. -/datum/ai_module/malf/destructive/lockdown +/datum/ai_module/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/malf)) CHECK_TICK /// Override Machine: Allows the AI to override a machine, animating it into an angry, living version of itself. -/datum/ai_module/malf/destructive/override_machine +/datum/ai_module/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/malf)) 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/malf/destructive/destroy_rcd +/datum/ai_module/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 @@ -506,7 +506,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) 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/malf/destructive/overload_machine +/datum/ai_module/destructive/overload_machine name = "Machine Overload" description = "Overheats an electrical machine, causing a small explosion and destroying it. Two uses per purchase." cost = 20 @@ -567,7 +567,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) return TRUE /// Blackout: Overloads a random number of lights across the station. Three uses. -/datum/ai_module/malf/destructive/blackout +/datum/ai_module/destructive/blackout name = "Blackout" description = "Attempts to overload the lighting circuits on the station, destroying some bulbs. Three uses per purchase." cost = 15 @@ -601,7 +601,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) build_all_button_icons() /// HIGH IMPACT HONKING -/datum/ai_module/malf/destructive/megahonk +/datum/ai_module/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 @@ -632,7 +632,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) 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/malf/utility/place_cyborg_transformer +/datum/ai_module/utility/place_cyborg_transformer name = "Robotic Factory (Removes Shunting)" description = "Build a machine anywhere, using expensive nanomachines, that can convert a living human into a loyal cyborg slave when placed inside." cost = 100 @@ -707,7 +707,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) return success /// Air Alarm Safety Override: Unlocks the ability to enable dangerous modes on all air alarms. -/datum/ai_module/malf/utility/break_air_alarms +/datum/ai_module/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." @@ -733,7 +733,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) 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/malf/utility/break_fire_alarms +/datum/ai_module/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." @@ -764,7 +764,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) owner.playsound_local(owner, 'sound/machines/terminal_off.ogg', 50, 0) /// Disable Emergency Lights -/datum/ai_module/malf/utility/emergency_lights +/datum/ai_module/utility/emergency_lights name = "Disable Emergency Lights" description = "Cuts emergency lights across the entire station. If power is lost to light fixtures, \ they will not attempt to fall back on emergency power reserves." @@ -791,7 +791,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) 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/malf/utility/reactivate_cameras +/datum/ai_module/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." @@ -832,7 +832,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) build_all_button_icons() /// Upgrade Camera Network: EMP-proofs all cameras, in addition to giving them X-ray vision. -/datum/ai_module/malf/upgrade/upgrade_cameras +/datum/ai_module/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. @@ -841,7 +841,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) unlock_text = span_notice("OTA firmware distribution complete! Cameras upgraded: CAMSUPGRADED. Light amplification system online.") unlock_sound = 'sound/items/rped.ogg' -/datum/ai_module/malf/upgrade/upgrade_cameras/upgrade(mob/living/silicon/ai/AI) +/datum/ai_module/upgrade/upgrade_cameras/upgrade(mob/living/silicon/ai/AI) // Sets up nightvision RegisterSignal(AI, COMSIG_MOB_UPDATE_SIGHT, PROC_REF(on_update_sight)) AI.update_sight() @@ -864,13 +864,13 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) upgraded_cameras++ unlock_text = replacetext(unlock_text, "CAMSUPGRADED", "[upgraded_cameras]") //This works, since unlock text is called after upgrade() -/datum/ai_module/malf/upgrade/upgrade_cameras/proc/on_update_sight(mob/source) +/datum/ai_module/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/malf/upgrade/upgrade_turrets +/datum/ai_module/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 @@ -878,7 +878,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) 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/malf/upgrade/upgrade_turrets/upgrade(mob/living/silicon/ai/AI) +/datum/ai_module/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 @@ -887,7 +887,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) turret.lethal_projectile_sound = 'sound/weapons/lasercannonfire.ogg' /// Enhanced Surveillance: Enables AI to hear conversations going on near its active vision. -/datum/ai_module/malf/upgrade/eavesdrop +/datum/ai_module/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." @@ -896,12 +896,12 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) unlock_text = span_notice("OTA firmware distribution complete! Cameras upgraded: Enhanced surveillance package online.") unlock_sound = 'sound/items/rped.ogg' -/datum/ai_module/malf/upgrade/eavesdrop/upgrade(mob/living/silicon/ai/AI) +/datum/ai_module/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/malf/upgrade/mecha_domination +/datum/ai_module/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. \ @@ -912,10 +912,10 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) Loss of signal will result in total system lockout.") unlock_sound = 'sound/mecha/nominal.ogg' -/datum/ai_module/malf/upgrade/mecha_domination/upgrade(mob/living/silicon/ai/AI) +/datum/ai_module/upgrade/mecha_domination/upgrade(mob/living/silicon/ai/AI) AI.can_dominate_mechs = TRUE //Yep. This is all it does. Honk! -/datum/ai_module/malf/upgrade/voice_changer +/datum/ai_module/upgrade/voice_changer name = "Voice Changer" description = "Allows you to change the AI's voice. Upgrade is active immediately upon purchase." cost = 40 @@ -1053,7 +1053,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) if("name") say_name = strip_html(params["name"], MAX_NAME_LEN) -/datum/ai_module/malf/utility/emag +/datum/ai_module/utility/emag name = "Targeted Safeties Override" description = "Allows you to disable the safeties of any machinery on the station, provided you can access it." cost = 20 @@ -1147,7 +1147,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) return TRUE -/datum/ai_module/malf/utility/core_tilt +/datum/ai_module/utility/core_tilt name = "Rolling Servos" description = "Allows you to slowly roll around, crushing anything in your way with your bulk." cost = 10 @@ -1246,7 +1246,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) stack_trace("non-standard dir entered to get_rotation_from_dir. (got: [dir])") return 0 -/datum/ai_module/malf/utility/remote_vendor_tilt +/datum/ai_module/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.dm b/code/modules/antagonists/nukeop/datums/operative.dm index c05295e15d32e..9eca88d33852d 100644 --- a/code/modules/antagonists/nukeop/datums/operative.dm +++ b/code/modules/antagonists/nukeop/datums/operative.dm @@ -94,7 +94,7 @@ nuke_team = new_team /datum/antagonist/nukeop/admin_add(datum/mind/new_owner,mob/admin) - new_owner.set_assigned_role(SSjob.get_job_type(/datum/job/nuclear_operative)) + new_owner.set_assigned_role(SSjob.GetJobType(/datum/job/nuclear_operative)) new_owner.add_antag_datum(src) message_admins("[key_name_admin(admin)] has nuke op'ed [key_name_admin(new_owner)].") log_admin("[key_name(admin)] has nuke op'ed [key_name(new_owner)].") diff --git a/code/modules/antagonists/nukeop/datums/operative_leader.dm b/code/modules/antagonists/nukeop/datums/operative_leader.dm index 1af9f1d28c40e..c2995e5575326 100644 --- a/code/modules/antagonists/nukeop/datums/operative_leader.dm +++ b/code/modules/antagonists/nukeop/datums/operative_leader.dm @@ -44,13 +44,7 @@ /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_length = 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_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 b59d984238e61..0160fbd89149c 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", max_length = MAX_MESSAGE_LEN, multiline = TRUE, encode = FALSE) + war_declaration = tgui_input_text(user, "Insert your custom declaration", "Declaration", 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", max_length = MAX_MESSAGE_LEN, multiline = TRUE, encode = FALSE) + war_declaration = tgui_input_text(usr, "Insert your custom declaration", "Declaration", multiline = TRUE, encode = FALSE) if(!war_declaration) tgui_alert(usr, "Invalid war declaration.", "Poor Choice of Words") diff --git a/code/modules/antagonists/obsessed/obsessed.dm b/code/modules/antagonists/obsessed/obsessed.dm index 7f9d9614fb1d9..7316102e2ce09 100644 --- a/code/modules/antagonists/obsessed/obsessed.dm +++ b/code/modules/antagonists/obsessed/obsessed.dm @@ -1,9 +1,3 @@ -#define OBSESSED_OBJECTIVE_SPEND_TIME "spend_time" -#define OBSESSED_OBJECTIVE_POLAROID "polaroid" -#define OBSESSED_OBJECTIVE_HUG "hug" -#define OBSESSED_OBJECTIVE_HEIRLOOM "heirloom" -#define OBSESSED_OBJECTIVE_JEALOUS "jealous" - /datum/antagonist/obsessed name = "Obsessed" show_in_antagpanel = TRUE @@ -19,23 +13,8 @@ preview_outfit = /datum/outfit/obsessed hardcore_random_bonus = TRUE stinger_sound = 'sound/ambience/antag/creepalert.ogg' - /// How many objectives should be generated - var/objectives_to_generate = 3 - /// Brain trauma that causes the obsession var/datum/brain_trauma/special/obsessed/trauma -/// Dummy antag datum that will show the cured obsessed to admins -/datum/antagonist/former_obsessed - name = "Former Obsessed" - show_in_antagpanel = FALSE - show_name_in_check_antagonists = TRUE - antagpanel_category = ANTAG_GROUP_CREW - show_in_roundend = FALSE - count_against_dynamic_roll_chance = FALSE - silent = TRUE - can_elimination_hijack = ELIMINATION_PREVENT - antag_flags = FLAG_FAKE_ANTAG - /datum/antagonist/obsessed/admin_add(datum/mind/new_owner,mob/admin) var/mob/living/carbon/C = new_owner.current if(!istype(C)) @@ -93,7 +72,7 @@ H.regenerate_icons() /datum/antagonist/obsessed/forge_objectives(datum/mind/obsessionmind) - var/list/objectives_left = list(OBSESSED_OBJECTIVE_SPEND_TIME, OBSESSED_OBJECTIVE_POLAROID, OBSESSED_OBJECTIVE_HUG) + var/list/objectives_left = list("spendtime", "polaroid", "hug") var/datum/objective/assassinate/obsessed/kill = new kill.owner = owner kill.target = obsessionmind @@ -105,44 +84,44 @@ family_heirloom = heirloom_quirk.heirloom?.resolve() break if(family_heirloom) - objectives_left += OBSESSED_OBJECTIVE_HEIRLOOM + objectives_left += "heirloom" // If they have no coworkers, jealousy will pick someone else on the station. This will never be a free objective. if(!is_captain_job(obsessionmind.assigned_role)) - objectives_left += OBSESSED_OBJECTIVE_JEALOUS + objectives_left += "jealous" - for(var/i in 1 to objectives_to_generate) - var/chosen_objective = pick_n_take(objectives_left) + for(var/i in 1 to 3) + var/chosen_objective = pick(objectives_left) + objectives_left.Remove(chosen_objective) switch(chosen_objective) - if(OBSESSED_OBJECTIVE_SPEND_TIME) + if("spendtime") var/datum/objective/spendtime/spendtime = new spendtime.owner = owner spendtime.target = obsessionmind objectives += spendtime - if(OBSESSED_OBJECTIVE_POLAROID) + if("polaroid") var/datum/objective/polaroid/polaroid = new polaroid.owner = owner polaroid.target = obsessionmind objectives += polaroid - if(OBSESSED_OBJECTIVE_HUG) + if("hug") var/datum/objective/hug/hug = new hug.owner = owner hug.target = obsessionmind objectives += hug - if(OBSESSED_OBJECTIVE_HEIRLOOM) + if("heirloom") var/datum/objective/steal/heirloom_thief/heirloom_thief = new heirloom_thief.owner = owner heirloom_thief.target = obsessionmind//while you usually wouldn't need this for stealing, we need the name of the obsession heirloom_thief.steal_target = family_heirloom objectives += heirloom_thief - if(OBSESSED_OBJECTIVE_JEALOUS) + if("jealous") var/datum/objective/assassinate/jealous/jealous = new jealous.owner = owner jealous.target = obsessionmind//will reroll into a coworker on the objective itself objectives += jealous objectives += kill//finally add the assassinate last, because you'd have to complete it last to greentext. - for(var/datum/objective/O in objectives) O.update_explanation_text() @@ -299,9 +278,3 @@ explanation_text = "Steal [target.name]'s family heirloom, [steal_target] they cherish." else explanation_text = "Free Objective" - -#undef OBSESSED_OBJECTIVE_SPEND_TIME -#undef OBSESSED_OBJECTIVE_POLAROID -#undef OBSESSED_OBJECTIVE_HUG -#undef OBSESSED_OBJECTIVE_HEIRLOOM -#undef OBSESSED_OBJECTIVE_JEALOUS diff --git a/code/modules/antagonists/paradox_clone/paradox_clone.dm b/code/modules/antagonists/paradox_clone/paradox_clone.dm index bd8eb7cd7d866..e809e8cecbf00 100644 --- a/code/modules/antagonists/paradox_clone/paradox_clone.dm +++ b/code/modules/antagonists/paradox_clone/paradox_clone.dm @@ -52,7 +52,7 @@ kill.update_explanation_text() objectives += kill - owner.set_assigned_role(SSjob.get_job_type(/datum/job/paradox_clone)) + owner.set_assigned_role(SSjob.GetJobType(/datum/job/paradox_clone)) //clone doesnt show up on message lists var/obj/item/modular_computer/pda/messenger = locate() in owner.current diff --git a/code/modules/antagonists/space_dragon/space_dragon.dm b/code/modules/antagonists/space_dragon/space_dragon.dm index cc82f491c1fcd..0d982dc492d4e 100644 --- a/code/modules/antagonists/space_dragon/space_dragon.dm +++ b/code/modules/antagonists/space_dragon/space_dragon.dm @@ -67,12 +67,12 @@ forge_objectives() rift_ability = new() owner.special_role = ROLE_SPACE_DRAGON - owner.set_assigned_role(SSjob.get_job_type(/datum/job/space_dragon)) + owner.set_assigned_role(SSjob.GetJobType(/datum/job/space_dragon)) return ..() /datum/antagonist/space_dragon/on_removal() owner.special_role = null - owner.set_assigned_role(SSjob.get_job_type(/datum/job/unassigned)) + owner.set_assigned_role(SSjob.GetJobType(/datum/job/unassigned)) return ..() /datum/antagonist/space_dragon/apply_innate_effects(mob/living/mob_override) diff --git a/code/modules/antagonists/space_ninja/space_ninja.dm b/code/modules/antagonists/space_ninja/space_ninja.dm index 37bc2299928da..7f88c687c12d1 100644 --- a/code/modules/antagonists/space_ninja/space_ninja.dm +++ b/code/modules/antagonists/space_ninja/space_ninja.dm @@ -114,12 +114,12 @@ equip_space_ninja(owner.current) owner.current.add_quirk(/datum/quirk/freerunning) owner.current.add_quirk(/datum/quirk/light_step) - owner.current.mind.set_assigned_role(SSjob.get_job_type(/datum/job/space_ninja)) + owner.current.mind.set_assigned_role(SSjob.GetJobType(/datum/job/space_ninja)) owner.current.mind.special_role = ROLE_NINJA return ..() /datum/antagonist/ninja/admin_add(datum/mind/new_owner,mob/admin) - new_owner.set_assigned_role(SSjob.get_job_type(/datum/job/space_ninja)) + new_owner.set_assigned_role(SSjob.GetJobType(/datum/job/space_ninja)) new_owner.special_role = ROLE_NINJA new_owner.add_antag_datum(src) message_admins("[key_name_admin(admin)] has ninja'ed [key_name_admin(new_owner)].") diff --git a/code/modules/antagonists/traitor/contractor/syndicate_contract.dm b/code/modules/antagonists/traitor/contractor/syndicate_contract.dm index 71ae454df72f9..2c9d45e382dd4 100644 --- a/code/modules/antagonists/traitor/contractor/syndicate_contract.dm +++ b/code/modules/antagonists/traitor/contractor/syndicate_contract.dm @@ -102,17 +102,14 @@ if(traitor_data.uplink_handler.contractor_hub.current_contract == src) traitor_data.uplink_handler.contractor_hub.current_contract = null - for(var/obj/item/person_contents as anything in person_sent.gather_belongings(FALSE, FALSE)) + for(var/obj/item/person_contents as anything in person_sent.gather_belongings()) if(ishuman(person_sent)) var/mob/living/carbon/human/human_sent = person_sent if(person_contents == human_sent.w_uniform) continue //So all they're left with are shoes and uniform. if(person_contents == human_sent.shoes) continue - var/unequipped = person_sent.temporarilyRemoveItemFromInventory(person_contents) - if (!unequipped) - continue - person_contents.moveToNullspace() + person_sent.transferItemToLoc(person_contents) victim_belongings.Add(WEAKREF(person_contents)) var/obj/structure/closet/supplypod/extractionpod/pod = source diff --git a/code/modules/antagonists/traitor/objectives/kidnapping.dm b/code/modules/antagonists/traitor/objectives/kidnapping.dm index 0d4ff5cfd9971..ea7fef9b4b607 100644 --- a/code/modules/antagonists/traitor/objectives/kidnapping.dm +++ b/code/modules/antagonists/traitor/objectives/kidnapping.dm @@ -228,14 +228,13 @@ var/mob/living/carbon/human/sent_mob = entered_atom - for(var/obj/item/belonging in sent_mob.gather_belongings(FALSE, FALSE)) + for(var/obj/item/belonging in sent_mob.gather_belongings()) if(belonging == sent_mob.get_item_by_slot(ITEM_SLOT_ICLOTHING) || belonging == sent_mob.get_item_by_slot(ITEM_SLOT_FEET)) continue - var/unequipped = sent_mob.temporarilyRemoveItemFromInventory(belonging) + var/unequipped = sent_mob.transferItemToLoc(belonging) if (!unequipped) continue - belonging.moveToNullspace() target_belongings.Add(WEAKREF(belonging)) var/datum/market_item/hostage/market_item = sent_mob.process_capture(rand(1000, 3000)) diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/summons.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/summons.dm index b8bf9a8e3cf25..fe5f69fd9fa53 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", max_length = MAX_MESSAGE_LEN) + var/message = tgui_input_text(user, "Whisper a secret truth to drive your victims to madness", "Whispers of Madness") if(!message || QDELETED(user) || QDELETED(book) || !can_buy(user, book)) return FALSE curse_of_madness(user, message) diff --git a/code/modules/antagonists/wizard/grand_ritual/grand_rune.dm b/code/modules/antagonists/wizard/grand_ritual/grand_rune.dm index 25883370c0d1b..15900a6ac0b0a 100644 --- a/code/modules/antagonists/wizard/grand_ritual/grand_rune.dm +++ b/code/modules/antagonists/wizard/grand_ritual/grand_rune.dm @@ -147,7 +147,7 @@ haunt_color = spell_colour, \ haunt_duration = 10 SECONDS, \ aggro_radius = 0, \ - spawn_message = span_revenwarning("[sacrifice] begins to float and twirl into the air as it becomes enveloped in otherworldly energies..."), \ + spawn_message = span_revenwarning("[sacrifice] begins to float and twirl into the air as it becomes enveloped in otherworldy energies..."), \ ) addtimer(CALLBACK(sacrifice, TYPE_PROC_REF(/obj/item/food/cheese/wheel, consume_cheese)), 10 SECONDS) cheese_sacrificed += length(cheese_to_haunt) @@ -253,7 +253,7 @@ while(created < to_create && location_sanity < 100) var/turf/chosen_location = get_safe_random_station_turf() - // We don't want them close to each other - at least 1 tile of separation + // We don't want them close to each other - at least 1 tile of seperation var/list/nearby_things = range(1, chosen_location) var/obj/effect/heretic_influence/what_if_i_have_one = locate() in nearby_things var/obj/effect/visible_heretic_influence/what_if_i_had_one_but_its_used = locate() in nearby_things diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index fa6d9a515b680..335c934a32052 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -124,7 +124,7 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) if(!owner.current) return if(!GLOB.wizardstart.len) - SSjob.send_to_late_join(owner.current) + SSjob.SendToLateJoin(owner.current) to_chat(owner, "HOT INSERTION, GO GO GO") owner.current.forceMove(pick(GLOB.wizardstart)) diff --git a/code/modules/antagonists/xeno/xeno.dm b/code/modules/antagonists/xeno/xeno.dm index 5ef26665bf238..59c83fd52ed11 100644 --- a/code/modules/antagonists/xeno/xeno.dm +++ b/code/modules/antagonists/xeno/xeno.dm @@ -160,7 +160,7 @@ else mind.add_antag_datum(/datum/antagonist/xeno) - mind.set_assigned_role(SSjob.get_job_type(/datum/job/xenomorph)) + mind.set_assigned_role(SSjob.GetJobType(/datum/job/xenomorph)) mind.special_role = ROLE_ALIEN /mob/living/carbon/alien/on_wabbajacked(mob/living/new_mob) @@ -170,7 +170,7 @@ if(isalien(new_mob)) return mind.remove_antag_datum(/datum/antagonist/xeno) - mind.set_assigned_role(SSjob.get_job_type(/datum/job/unassigned)) + mind.set_assigned_role(SSjob.GetJobType(/datum/job/unassigned)) mind.special_role = null #undef CAPTIVE_XENO_DEAD diff --git a/code/modules/art/paintings.dm b/code/modules/art/paintings.dm index 1c11e0f8086cc..2e330d31185da 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", max_length = MAX_NAME_LEN) + var/new_name = tgui_input_text(user, "What do you want to name the painting?", "Title Your Masterpiece", null, 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/art/statues.dm b/code/modules/art/statues.dm index da4a47dd843d8..fd64d212f3e80 100644 --- a/code/modules/art/statues.dm +++ b/code/modules/art/statues.dm @@ -36,7 +36,7 @@ /obj/structure/statue/attackby(obj/item/W, mob/living/user, params) add_fingerprint(user) if(W.tool_behaviour == TOOL_WELDER) - if(!W.tool_start_check(user, amount=1, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!W.tool_start_check(user, amount=1)) return FALSE user.balloon_alert(user, "slicing apart...") if(W.use_tool(src, user, 40, volume=50)) diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index f20d364759927..b81eb26e7fae9 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -128,7 +128,7 @@ /** * Handles actual flashing part of the attack * - * This proc is awful in every sense of the way, someone should definitely refactor this whole code. + * This proc is awful in every sense of the way, someone should definately refactor this whole code. * Arguments: * * M - Victim * * user - Attacker @@ -161,7 +161,7 @@ else if(sigreturn & DEVIATION_OVERRIDE_NONE) deviation = DEVIATION_NONE - //If you face away from someone they shouldn't notice any effects. + //If you face away from someone they shouldnt notice any effects. if(deviation == DEVIATION_FULL) return @@ -185,7 +185,7 @@ /** * Handles the directionality of the attack * - * Returns the amount of 'deviation', 0 being facing each other, 1 being sideways, 2 being facing away from each other. + * Returns the amount of 'deviation', 0 being facing eachother, 1 being sideways, 2 being facing away from eachother. * Arguments: * * victim - Victim * * attacker - Attacker diff --git a/code/modules/asset_cache/assets/inventory.dm b/code/modules/asset_cache/assets/inventory.dm index 5aaab9332a852..0883dbd7515e5 100644 --- a/code/modules/asset_cache/assets/inventory.dm +++ b/code/modules/asset_cache/assets/inventory.dm @@ -14,7 +14,6 @@ "inventory-suit_storage.png" = 'icons/ui/inventory/suit_storage.png', "inventory-id.png" = 'icons/ui/inventory/id.png', "inventory-belt.png" = 'icons/ui/inventory/belt.png', - "inventory-tail.png" = 'icons/ui/inventory/tail.png', // DOPPLER ADDITION - tail item slot "inventory-back.png" = 'icons/ui/inventory/back.png', "inventory-pocket.png" = 'icons/ui/inventory/pocket.png', "inventory-collar.png" = 'icons/ui/inventory/collar.png', diff --git a/code/modules/asset_cache/assets/rtd.dm b/code/modules/asset_cache/assets/rtd.dm index 66899fcb943f1..23a3b0d71b2db 100644 --- a/code/modules/asset_cache/assets/rtd.dm +++ b/code/modules/asset_cache/assets/rtd.dm @@ -2,7 +2,7 @@ name = "rtd" /datum/asset/spritesheet/rtd/create_spritesheets() - //some tiles may share the same icon but have different properties to animate that icon + //some tiles may share the same icon but have diffrent properties to animate that icon //so we keep track of what icons we registered var/list/registered = list() diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index dc56aa3fda7f7..e7c5f5d35c7fa 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -304,7 +304,7 @@ our_excited_group = excited_group //update our cache if(our_excited_group && enemy_excited_group && enemy_tile.excited) //If you're both excited, no need to compare right? should_share_air = TRUE - else if(our_air.compare(enemy_air, ARCHIVE)) //Lets see if you're up for it + else if(our_air.compare(enemy_air)) //Lets see if you're up for it SSair.add_to_active(enemy_tile) //Add yourself young man var/datum/excited_group/existing_group = our_excited_group || enemy_excited_group || new if(!our_excited_group) @@ -332,7 +332,7 @@ var/datum/gas_mixture/planetary_mix = SSair.planetary[initial_gas_mix] // archive ourself again so we don't accidentally share more gas than we currently have LINDA_CYCLE_ARCHIVE(src) - if(our_air.compare(planetary_mix, ARCHIVE)) + if(our_air.compare(planetary_mix)) if(!our_excited_group) var/datum/excited_group/new_group = new new_group.add_turf(src) diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index f329b98bec06a..db2732be83fad 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -451,17 +451,16 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) //thermal energy of the system (self and sharer) is unchanged ///Compares sample to self to see if within acceptable ranges that group processing may be enabled -///Takes the gas index to read from as a second arg (either MOLES or ARCHIVE) ///Returns: a string indicating what check failed, or "" if check passes -/datum/gas_mixture/proc/compare(datum/gas_mixture/sample, index) +/datum/gas_mixture/proc/compare(datum/gas_mixture/sample) var/list/sample_gases = sample.gases //accessing datum vars is slower than proc vars var/list/cached_gases = gases var/moles_sum = 0 for(var/id in cached_gases | sample_gases) // compare gases from either mixture // Yes this is actually fast. I too hate it here - var/gas_moles = cached_gases[id]?[index] || 0 - var/sample_moles = sample_gases[id]?[index] || 0 + var/gas_moles = cached_gases[id]?[MOLES] || 0 + var/sample_moles = sample_gases[id]?[MOLES] || 0 // Brief explanation. We are much more likely to not pass this first check then pass the first and fail the second // Because of this, double calculating the delta is FASTER then inserting it into a var if(abs(gas_moles - sample_moles) > MINIMUM_MOLES_DELTA_TO_MOVE) @@ -471,12 +470,8 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) moles_sum += gas_moles if(moles_sum > MINIMUM_MOLES_DELTA_TO_MOVE) //Don't consider temp if there's not enough mols - if(index == ARCHIVE) - if(abs(temperature_archived - sample.temperature_archived) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) - return "temp" - else - if(abs(temperature - sample.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) - return "temp" + if(abs(temperature - sample.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) + return "temp" return "" @@ -552,7 +547,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) /** * Counts how much pressure will there be if we impart MOLAR_ACCURACY amounts of our gas to the output gasmix. - * We do all of this without actually transferring it so don't worry about it changing the gasmix. + * We do all of this without actually transferring it so dont worry about it changing the gasmix. * Returns: Resulting pressure (number). * Args: * - output_air (gasmix). @@ -567,10 +562,10 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) * Args: * - output_air. The gas mix we want to pump to. * - target_pressure. The target pressure we want. - * - ignore_temperature. Returns a cheaper form of gas calculation, useful if the temperature difference between the two gasmixes is low or nonexistent. + * - ignore_temperature. Returns a cheaper form of gas calculation, useful if the temperature difference between the two gasmixes is low or nonexistant. */ /datum/gas_mixture/proc/gas_pressure_calculate(datum/gas_mixture/output_air, target_pressure, ignore_temperature = FALSE) - // So we don't need to iterate the gaslist multiple times. + // So we dont need to iterate the gaslist multiple times. var/our_moles = total_moles() var/output_moles = output_air.total_moles() var/output_pressure = output_air.return_pressure() diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm index c040e30db3fcf..7bbfea3dcf253 100644 --- a/code/modules/atmospherics/gasmixtures/gas_types.dm +++ b/code/modules/atmospherics/gasmixtures/gas_types.dm @@ -85,7 +85,7 @@ rarity = 1000 purchaseable = TRUE base_value = 0.1 - desc = "A very common gas that used to pad artificial atmospheres to habitable pressure." + desc = "A very common gas that used to pad artifical atmospheres to habitable pressure." primary_color = "#ffff00" /datum/gas/carbon_dioxide //what the fuck is this? @@ -133,7 +133,7 @@ fusion_power = 10 rarity = 50 base_value = 2.5 - desc = "The most noble gas of them all. High quantities of hyper-noblium actively prevents reactions from occurring." + desc = "The most noble gas of them all. High quantities of hyper-noblium actively prevents reactions from occuring." primary_color = COLOR_TEAL /datum/gas/nitrous_oxide @@ -173,7 +173,7 @@ fusion_power = 5 rarity = 300 base_value = 2.5 - desc = "A highly flammable and radioactive gas." + desc = "A highly flammable and radioctive gas." primary_color = "#32cd32" /datum/gas/bz @@ -279,7 +279,7 @@ moles_visible = MOLES_GAS_VISIBLE rarity = 300 base_value = 4 - desc = "A potent fire suppressant. Removes oxygen from high temperature fires and cools down the area" + desc = "A potent fire supressant. Removes oxygen from high temperature fires and cools down the area" primary_color = COLOR_PURPLE /datum/gas/helium @@ -314,7 +314,7 @@ appearance_flags = TILE_BOUND vis_flags = NONE // The visual offset we are "on". - // Can't use the traditional loc because we are stored in nullspace, and we can't set plane before init because of the helping that SET_PLANE_EXPLICIT does IN init + // Can't use the tradtional loc because we are stored in nullspace, and we can't set plane before init because of the helping that SET_PLANE_EXPLICIT does IN init var/plane_offset = 0 /obj/effect/overlay/gas/New(state, alph, offset) diff --git a/code/modules/atmospherics/gasmixtures/reaction_factors.dm b/code/modules/atmospherics/gasmixtures/reaction_factors.dm index af058dc77877f..5148793179500 100644 --- a/code/modules/atmospherics/gasmixtures/reaction_factors.dm +++ b/code/modules/atmospherics/gasmixtures/reaction_factors.dm @@ -50,14 +50,14 @@ /datum/gas/carbon_dioxide = "Carbon Dioxide is formed at 1 mole per mole of freon consumed.", "Temperature" = "Can only occur between [FREON_LOWER_TEMPERATURE] - [FREON_MAXIMUM_BURN_TEMPERATURE] Kelvin", "Energy" = "[FIRE_FREON_ENERGY_CONSUMED] joules of energy is absorbed per mole of freon consumed.", - "Hot Ice" = "This reaction produces hot ice when occurring between [HOT_ICE_FORMATION_MINIMUM_TEMPERATURE]-[HOT_ICE_FORMATION_MAXIMUM_TEMPERATURE] kelvins", + "Hot Ice" = "This reaction produces hot ice when occuring between [HOT_ICE_FORMATION_MINIMUM_TEMPERATURE]-[HOT_ICE_FORMATION_MAXIMUM_TEMPERATURE] kelvins", ) /datum/gas_reaction/nitrousformation/init_factors() factor = list( /datum/gas/oxygen = "10 moles of Oxygen needs to be present for the reaction to occur. Oxygen is consumed at 0.5 moles per mole of nitrous oxide formed.", - /datum/gas/nitrogen = " 20 moles of Nitrogen needs to be present for the reaction to occur. Nitrogen is consumed at 1 mole per mole of nitrous oxide formed.", + /datum/gas/nitrogen = " 20 moles of Nitrogen needs to be present for the reaction to occur. Nitrogen is consumed at 1 mole per mole of nitrous oxife formed.", /datum/gas/bz = "5 moles of BZ needs to be present for the reaction to occur. Not consumed.", /datum/gas/nitrous_oxide = "Nitrous oxide gets produced rapidly.", "Temperature" = "Can only occur between [N2O_FORMATION_MIN_TEMPERATURE] - [N2O_FORMATION_MAX_TEMPERATURE] Kelvin", diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index f6c238c8d0e28..49254d077deae 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -328,7 +328,7 @@ SET_REACTION_RESULTS(burned_fuel) var/turf/open/location - if(istype(holder, /datum/pipeline)) //Find the tile the reaction is occurring on, or a random part of the network if it's a pipenet. + if(istype(holder, /datum/pipeline)) //Find the tile the reaction is occuring on, or a random part of the network if it's a pipenet. var/datum/pipeline/pipenet = holder location = pick(pipenet.members) else if(isatom(holder)) @@ -686,7 +686,7 @@ var/list/cached_gases = air.gases var/temperature = air.temperature - //This reaction is aggressively slow. like, a tenth of a mole per fire slow. Keep that in mind + //This reaction is agressively slow. like, a tenth of a mole per fire slow. Keep that in mind var/heat_efficiency = min(temperature / NITRIUM_DECOMPOSITION_TEMP_DIVISOR, cached_gases[/datum/gas/nitrium][MOLES]) if (heat_efficiency <= 0 || (cached_gases[/datum/gas/nitrium][MOLES] - heat_efficiency < 0)) //Shouldn't produce gas from nothing. @@ -1091,7 +1091,7 @@ SET_REACTION_RESULTS(produced_amount) var/turf/open/location var/energy_released = produced_amount * PN_TRITIUM_CONVERSION_ENERGY - if(istype(holder,/datum/pipeline)) //Find the tile the reaction is occurring on, or a random part of the network if it's a pipenet. + if(istype(holder,/datum/pipeline)) //Find the tile the reaction is occuring on, or a random part of the network if it's a pipenet. var/datum/pipeline/pipenet = holder location = pick(pipenet.members) else if(isatom(holder)) @@ -1143,7 +1143,7 @@ SET_REACTION_RESULTS(consumed_amount) var/turf/open/location var/energy_released = consumed_amount * PN_BZASE_ENERGY - if(istype(holder,/datum/pipeline)) //Find the tile the reaction is occurring on, or a random part of the network if it's a pipenet. + if(istype(holder,/datum/pipeline)) //Find the tile the reaction is occuring on, or a random part of the network if it's a pipenet. var/datum/pipeline/pipenet = holder location = pick(pipenet.members) else if(isatom(holder)) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 95758c22707c6..12e6c684079e6 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -34,7 +34,7 @@ ///The flags of the pipe/component (PIPING_ALL_LAYER | PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY | PIPING_CARDINAL_AUTONORMALIZE) var/pipe_flags = NONE - ///This only works on pipes, because they have 1000 subtypes which need to be visible and invisible under tiles, so we track this here + ///This only works on pipes, because they have 1000 subtypes wich need to be visible and invisible under tiles, so we track this here var/hide = TRUE ///The image of the pipe/device used for ventcrawling @@ -331,7 +331,7 @@ if(isnull(given_layer)) given_layer = piping_layer - // you can't place the machine on the same location as the target cause it blocks + // you cant place the machine on the same location as the target cause it blocks if(target.loc == loc) return FALSE @@ -478,7 +478,7 @@ * Called by wrench_act() before deconstruct() * Arguments: * * mob_user - the mob doing the act - * * pressures - it can be passed on from wrench_act(), it's the pressure difference between the environment pressure and the pipe internal pressure + * * pressures - it can be passed on from wrench_act(), it's the pressure difference between the enviroment pressure and the pipe internal pressure */ /obj/machinery/atmospherics/proc/unsafe_pressure_release(mob/user, pressures = null) if(!user) @@ -569,7 +569,7 @@ // Handles mob movement inside a pipenet /obj/machinery/atmospherics/relaymove(mob/living/user, direction) - if(!direction) //can't go this way. + if(!direction) //cant go this way. return if(user in buckled_mobs)// fixes buckle ventcrawl edgecase fuck bug return diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm index e3ef70489ac85..9f2f6a96f4bf8 100644 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm +++ b/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm @@ -430,7 +430,7 @@ radio.talk_into(src, "[safe_alert] Failsafe has been disengaged.", common_channel) final_countdown = FALSE return - else if((i % 50) != 0 && i > 50) // A message once every 5 seconds until the final 5 seconds which count down individually + else if((i % 50) != 0 && i > 50) // A message once every 5 seconds until the final 5 seconds which count down individualy sleep(1 SECONDS) continue else if(i > 50) diff --git a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm index b5cc7c628df29..565ada80b931e 100644 --- a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm +++ b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm @@ -106,7 +106,7 @@ return TRUE return FALSE -///Injects the gases from the input inside the internal gasmix, the amount is dependent on the gas_input var +///Injects the gases from the input inside the internal gasmix, the amount is dependant on the gas_input var /obj/machinery/atmospherics/components/binary/crystallizer/proc/inject_gases() var/datum/gas_mixture/contents = airs[2] for(var/gas_type in selected_recipe.requirements) diff --git a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm index 6308e1eee611e..26cb395113519 100644 --- a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm +++ b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm @@ -1,6 +1,6 @@ /obj/item/hypernoblium_crystal name = "Hypernoblium Crystal" - desc = "Crystallized oxygen and hypernoblium stored in a bottle to pressureproof your clothes or stop reactions occurring in portable atmospheric devices." + desc = "Crystalized oxygen and hypernoblium stored in a bottle to pressureproof your clothes or stop reactions occuring in portable atmospheric devices." icon = 'icons/obj/pipes_n_cables/atmos.dmi' icon_state = "hypernoblium_crystal" var/uses = 1 diff --git a/code/modules/atmospherics/machinery/components/tank.dm b/code/modules/atmospherics/machinery/components/tank.dm index f76f3dc470f57..ee1e61428d196 100644 --- a/code/modules/atmospherics/machinery/components/tank.dm +++ b/code/modules/atmospherics/machinery/components/tank.dm @@ -304,7 +304,7 @@ . = TRUE if(atom_integrity >= max_integrity) return - if(!tool.tool_start_check(user, amount = 0, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!tool.tool_start_check(user, amount = 0)) return to_chat(user, span_notice("You begin to repair the cracks in the gas tank...")) var/repair_amount = max_integrity / 10 @@ -562,7 +562,7 @@ if(!anchored) to_chat(user, span_notice("You need to wrench [src] to the floor before finishing.")) return - if(!tool.tool_start_check(user, amount = 0, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!tool.tool_start_check(user, amount = 0)) return to_chat(user, span_notice("You begin sealing the outer plating with the welder...")) if(!tool.use_tool(src, user, 2 SECONDS, volume = 60)) diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index e6c60140f3a70..a5a03c3ba1204 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -397,7 +397,7 @@ return ITEM_INTERACT_SUCCESS /obj/machinery/portable_atmospherics/canister/welder_act_secondary(mob/living/user, obj/item/I) - if(!I.tool_start_check(user, amount=1, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!I.tool_start_check(user, amount=1)) return ITEM_INTERACT_BLOCKING var/pressure = air_contents.return_pressure() diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index edd8e30eaf8ce..210eb9b0d9e28 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -95,7 +95,7 @@ /obj/machinery/portable_atmospherics/welder_act(mob/living/user, obj/item/tool) if(user.combat_mode) return ITEM_INTERACT_SKIP_TO_ATTACK - if(atom_integrity >= max_integrity || (machine_stat & BROKEN) || !tool.tool_start_check(user, amount = 1, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(atom_integrity >= max_integrity || (machine_stat & BROKEN) || !tool.tool_start_check(user, amount = 1)) return ITEM_INTERACT_BLOCKING balloon_alert(user, "repairing...") while(tool.use_tool(src, user, 2.5 SECONDS, volume=40)) @@ -223,17 +223,16 @@ 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 @@ -242,8 +241,6 @@ 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/base.dm b/code/modules/autowiki/pages/base.dm index ce32bfd4032b7..8e745ace61c2d 100644 --- a/code/modules/autowiki/pages/base.dm +++ b/code/modules/autowiki/pages/base.dm @@ -46,12 +46,7 @@ if (IsAdminAdvancedProcCall()) return - var/static/uploaded_icons = list() - if(uploaded_icons["[name]"]) - CRASH("We tried uploading an icon, but the name \"[name]\" was already taken!") - fcopy(icon, "data/autowiki_files/[name].png") - uploaded_icons["[name]"] = TRUE /// Escape a parameter such that it can be correctly put inside a wiki output /datum/autowiki/proc/escape_value(parameter) diff --git a/code/modules/autowiki/pages/soup.dm b/code/modules/autowiki/pages/soup.dm index 754beb3a82adb..f67d00e97a057 100644 --- a/code/modules/autowiki/pages/soup.dm +++ b/code/modules/autowiki/pages/soup.dm @@ -16,7 +16,6 @@ var/container_for_images = /obj/item/reagent_containers/cup/bowl - var/list/already_generated_icons = list() for(var/soup_recipe_type in subtypesof(/datum/chemical_reaction/food/soup)) var/datum/chemical_reaction/food/soup/soup_recipe = new soup_recipe_type() // Used to determine what icon is displayed on the wiki @@ -124,17 +123,14 @@ template_list["results"] = escape_value(compiled_results) // -- While we're here, generate an icon of the bowl -- - - if(!already_generated_icons[filename]) - if(!soup_icon_state) - var/obj/item/reagent_containers/cup/bowl/soup_bowl = new() - soup_bowl.reagents.add_reagent(result_soup_type, soup_bowl.reagents.maximum_volume) - upload_icon(getFlatIcon(soup_bowl, no_anim = TRUE), filename) - qdel(soup_bowl) - else - var/image/compiled_image = image(icon = soup_icon, icon_state = soup_icon_state) - upload_icon(getFlatIcon(compiled_image, no_anim = TRUE), filename) - already_generated_icons[filename] = TRUE + if(!soup_icon_state) + var/obj/item/reagent_containers/cup/bowl/soup_bowl = new() + soup_bowl.reagents.add_reagent(result_soup_type, soup_bowl.reagents.maximum_volume) + upload_icon(getFlatIcon(soup_bowl, no_anim = TRUE), filename) + qdel(soup_bowl) + else + var/image/compiled_image = image(icon = soup_icon, icon_state = soup_icon_state) + upload_icon(getFlatIcon(compiled_image, no_anim = TRUE), filename) // -- Cleanup -- qdel(soup_recipe) diff --git a/code/modules/autowiki/pages/vending.dm b/code/modules/autowiki/pages/vending.dm index e110afa760ea2..0a8dd3db0a9d5 100644 --- a/code/modules/autowiki/pages/vending.dm +++ b/code/modules/autowiki/pages/vending.dm @@ -10,10 +10,7 @@ // So we put it inside, something var/obj/parent = new - for (var/obj/machinery/vending/vending_type as anything in sort_list(subtypesof(/obj/machinery/vending), GLOBAL_PROC_REF(cmp_typepaths_asc))) - var/obj/machinery/vending/parent_machine = type2parent(vending_type) - if(initial(parent_machine.name) == initial(vending_type.name)) - continue //Same name, likely just a slightly touched up subtype for specific maps. + for (var/vending_type in sort_list(subtypesof(/obj/machinery/vending), GLOBAL_PROC_REF(cmp_typepaths_asc))) var/obj/machinery/vending/vending_machine = new vending_type(parent) vending_machine.use_power = FALSE vending_machine.update_icon(UPDATE_ICON_STATE) diff --git a/code/modules/awaymissions/cordon.dm b/code/modules/awaymissions/cordon.dm index 738efa1d7c21f..285d0d49e1051 100644 --- a/code/modules/awaymissions/cordon.dm +++ b/code/modules/awaymissions/cordon.dm @@ -49,10 +49,10 @@ /turf/cordon/Bumped(atom/movable/bumped_atom) . = ..() - if(HAS_TRAIT(bumped_atom, TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT)) //we could feasibly reach the border, so just don't + if(HAS_TRAIT(bumped_atom, TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT)) //we could feasibly reach the border, so just dont dump_in_space(bumped_atom) -/// Area used in conjunction with the cordon turf to create a fully functioning world border. +/// Area used in conjuction with the cordon turf to create a fully functioning world border. /area/misc/cordon name = "CORDON" icon_state = "cordon" diff --git a/code/modules/basketball/basketball.dm b/code/modules/basketball/basketball.dm index c69c2fd1f7833..35579dc448282 100644 --- a/code/modules/basketball/basketball.dm +++ b/code/modules/basketball/basketball.dm @@ -8,6 +8,7 @@ inhand_icon_state = "basketball" desc = "Here's your chance, do your dance at the Space Jam." w_class = WEIGHT_CLASS_BULKY //Stops people from hiding it in their bags/pockets + item_flags = XENOMORPH_HOLDABLE // playing ball against a xeno is rigged since they cannot be disarmed /// The person dribbling the basketball var/mob/living/wielder /// So the basketball doesn't make sound every step diff --git a/code/modules/bitrunning/areas.dm b/code/modules/bitrunning/areas.dm index 0656f9d65b389..4fcf0a0496e47 100644 --- a/code/modules/bitrunning/areas.dm +++ b/code/modules/bitrunning/areas.dm @@ -14,7 +14,7 @@ name = "Virtual Domain Ruins" icon_state = "bit_ruin" icon = 'icons/area/areas_station.dmi' - area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | HIDDEN_AREA | UNLIMITED_FISHING + area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | HIDDEN_AREA has_gravity = STANDARD_GRAVITY requires_power = FALSE @@ -26,7 +26,7 @@ /area/virtual_domain/safehouse name = "Virtual Domain Safehouse" - area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | VIRTUAL_SAFE_AREA | UNLIMITED_FISHING + area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | VIRTUAL_SAFE_AREA icon_state = "bit_safe" requires_power = FALSE sound_environment = SOUND_ENVIRONMENT_ROOM @@ -36,30 +36,30 @@ /area/lavaland/surface/outdoors/virtual_domain name = "Virtual Domain Lava Ruins" icon_state = "bit_ruin" - area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | HIDDEN_AREA | UNLIMITED_FISHING + area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | HIDDEN_AREA /area/icemoon/underground/explored/virtual_domain name = "Virtual Domain Ice Ruins" icon_state = "bit_ice" - area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | HIDDEN_AREA | UNLIMITED_FISHING + area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | HIDDEN_AREA /area/ruin/space/virtual_domain name = "Virtual Domain Unexplored Location" icon = 'icons/area/areas_station.dmi' icon_state = "bit_ruin" - area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | HIDDEN_AREA | UNLIMITED_FISHING + area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | HIDDEN_AREA /area/space/virtual_domain name = "Virtual Domain Space" icon = 'icons/area/areas_station.dmi' icon_state = "bit_space" - area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | HIDDEN_AREA | UNLIMITED_FISHING + area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | HIDDEN_AREA ///Areas that virtual entities should not be in /area/virtual_domain/protected_space name = "Virtual Domain Safe Zone" - area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | VIRTUAL_SAFE_AREA | UNLIMITED_FISHING + area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | VIRTUAL_SAFE_AREA icon_state = "bit_safe" /area/virtual_domain/protected_space/fullbright diff --git a/code/modules/bitrunning/server/threats.dm b/code/modules/bitrunning/server/threats.dm index ea612a43efaea..6b9a334d9252a 100644 --- a/code/modules/bitrunning/server/threats.dm +++ b/code/modules/bitrunning/server/threats.dm @@ -119,7 +119,7 @@ var/datum/mind/antag_mind = new_mob.mind antag_mind.add_antag_datum(chosen_role) antag_mind.special_role = ROLE_GLITCH - antag_mind.set_assigned_role(SSjob.get_job_type(/datum/job/bitrunning_glitch)) + antag_mind.set_assigned_role(SSjob.GetJobType(/datum/job/bitrunning_glitch)) playsound(new_mob, 'sound/magic/ethereal_exit.ogg', 50, vary = TRUE) message_admins("[ADMIN_LOOKUPFLW(new_mob)] has been made into virtual antagonist by an event.") diff --git a/code/modules/bitrunning/spawners.dm b/code/modules/bitrunning/spawners.dm index 26288d54a1555..4b5f79a43b186 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/virtual_pirate + outfit = /datum/outfit/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,16 +32,6 @@ 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 dc1029353c320..0bc35ceaf40e4 100644 --- a/code/modules/bitrunning/virtual_domain/domains/meta_central.dm +++ b/code/modules/bitrunning/virtual_domain/domains/meta_central.dm @@ -10,4 +10,3 @@ 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/capture_the_flag/ctf_controller.dm b/code/modules/capture_the_flag/ctf_controller.dm index dbc152d6bf467..b5df4981c9f15 100644 --- a/code/modules/capture_the_flag/ctf_controller.dm +++ b/code/modules/capture_the_flag/ctf_controller.dm @@ -63,7 +63,7 @@ ///Unloading CTF removes the map entirely and allows for a new map to be loaded in its place. /datum/ctf_controller/proc/unload_ctf() if(game_id != CTF_GHOST_CTF_GAME_ID) - return //At present we only support unloading standard centcom ctf, if we intend to support ctf unloading elsewhere then this proc will need to be amended. + return //At present we only support unloading standard centcom ctf, if we intend to support ctf unloading elsewhere then this proc will need to be ammended. stop_ctf() new /obj/effect/landmark/ctf(get_turf(GLOB.ctf_spawner)) @@ -187,7 +187,7 @@ respawn_cooldown = CTF_DEFAULT_RESPAWN instagib_mode = !instagib_mode -///A datum that holds details about individual CTF teams, any team specific CTF functionality should be implemented here. +///A datum that holds details about individual CTF teams, any team specific CTF functionality should be implimented here. /datum/ctf_team ///Reference to the spawn point that this team uses. var/obj/machinery/ctf/spawner/spawner @@ -206,7 +206,7 @@ team_color = spawner.team team_span = spawner.team_span -///If the team is destroyed all players in that team need their component removed. +///If the team is destroyed all players in that team need their componenet removed. /datum/ctf_team/Destroy(force) for(var/player in team_members) var/datum/component/ctf_player/ctf_player = team_members[player] @@ -217,7 +217,7 @@ /datum/ctf_team/proc/score_points(points_scored) points += points_scored -///Resets this teams score and clears its member list. All members will be dusted and have their player component removed. +///Resets this teams score and clears its member list. All members will be dusted and have their player componenet removed. /datum/ctf_team/proc/reset_team() points = 0 for(var/player in team_members) @@ -231,7 +231,7 @@ var/datum/component/ctf_player/ctf_player = team_members[player] ctf_player.send_message(message) -///Creates a CTF game with the provided team ID then returns a reference to the new controller. If a controller already exists provides a reference to it. +///Creates a CTF game with the provided teeam ID then returns a reference to the new controller. If a controller already exists provides a reference to it. /proc/create_ctf_game(game_id) if(GLOB.ctf_games[game_id]) return GLOB.ctf_games[game_id] diff --git a/code/modules/capture_the_flag/ctf_map_loading.dm b/code/modules/capture_the_flag/ctf_map_loading.dm index 4c2f6b319e036..6448533a3c74b 100644 --- a/code/modules/capture_the_flag/ctf_map_loading.dm +++ b/code/modules/capture_the_flag/ctf_map_loading.dm @@ -100,5 +100,5 @@ GLOBAL_DATUM(ctf_spawner, /obj/effect/landmark/ctf) /datum/map_template/ctf/turbine name = "Turbine" - description = "A CTF map that takes place in a familiar facility. Don't try to hold out mid- There's no sentries in this version." + description = "A CTF map that takes place in a familiar facility. Don't try to hold out mid- Theres no sentries in this version." mappath = "_maps/map_files/CTF/turbine.dmm" diff --git a/code/modules/capture_the_flag/ctf_player_component.dm b/code/modules/capture_the_flag/ctf_player_component.dm index 5a02a954aba6a..c51b48b918c98 100644 --- a/code/modules/capture_the_flag/ctf_player_component.dm +++ b/code/modules/capture_the_flag/ctf_player_component.dm @@ -1,4 +1,4 @@ -///A component added to the mind of anyone who is playing in an ongoing CTF match. Any player specific CTF functionality should be implemented here. (someone should implement score tracking here) +///A component added to the mind of anyone who is playing in an ongoing CTF match. Any player specific CTF functionality should be implimented here. (someone should impliment score tracking here) /datum/component/ctf_player ///The team that this player is associated with. var/team diff --git a/code/modules/cargo/bounties/science.dm b/code/modules/cargo/bounties/science.dm index be0edbe1eb64b..0206ea41967d6 100644 --- a/code/modules/cargo/bounties/science.dm +++ b/code/modules/cargo/bounties/science.dm @@ -55,7 +55,7 @@ //******Modular Computer Bounties****** /datum/bounty/item/science/ntnet name = "Modular Tablets" - description = "Turns out that NTNet wasn't actually a fad after all, who knew. Send some fully functional PDAs to help get us up to speed on the latest technology." + description = "Turns out that NTNet wasn't actually a fad afterall, who knew. Send some fully functional PDAs to help get us up to speed on the latest technology." reward = CARGO_CRATE_VALUE * 6 required_count = 4 wanted_types = list(/obj/item/modular_computer/pda = TRUE) diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm index 179ca701adc0c..cd86761587680 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_length = MAX_NAME_LEN) + 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 if (isnull(nameInput)) return - var/descInput = tgui_input_text(usr, "Enter a custom desc", "Custom description", temp_pod.style::desc, max_length = MAX_DESC_LEN) + var/descInput = tgui_input_text(usr, "Enter a custom desc", "Custom description", temp_pod.style::desc) if (isnull(descInput)) return temp_pod.name = nameInput diff --git a/code/modules/cargo/order.dm b/code/modules/cargo/order.dm index ef6484f21fc1f..a10bb3da5c00c 100644 --- a/code/modules/cargo/order.dm +++ b/code/modules/cargo/order.dm @@ -140,7 +140,7 @@ manifest_text += "Item: [packname]
" manifest_text += "Contents:
" manifest_text += "
    " - var/container_contents = list() // Associative list with the format (item_name = nº of occurrences, ...) + var/container_contents = list() // Associative list with the format (item_name = nº of occurences, ...) for(var/atom/movable/AM in container.contents - manifest_paper) container_contents[AM.name]++ if((manifest_paper.errors & MANIFEST_ERROR_CONTENTS) && container_contents) diff --git a/code/modules/cargo/orderconsole.dm b/code/modules/cargo/orderconsole.dm index ac37511f789a4..ae46d9943818b 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, max_length = MAX_MESSAGE_LEN) + reason = tgui_input_text(user, "Reason", name) if(isnull(reason)) return @@ -384,7 +384,7 @@ return add_item(ui.user, supply_pack_id) if("remove") var/order_name = params["order_name"] - //try removing at least one item with the specified name. An order may not be removed if it was from the department + //try removing atleast one item with the specified name. An order may not be removed if it was from the department for(var/datum/supply_order/order in SSshuttle.shopping_list) if(order.pack.name != order_name) continue diff --git a/code/modules/cargo/packs/engineering.dm b/code/modules/cargo/packs/engineering.dm index dd376ec201747..e8255a58e6431 100644 --- a/code/modules/cargo/packs/engineering.dm +++ b/code/modules/cargo/packs/engineering.dm @@ -199,6 +199,7 @@ 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" @@ -208,6 +209,7 @@ 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 a47c92fabc449..f405fc7de3a8a 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 in vitamins. Contains a lime, orange, watermelon, apple, \ - berries and a lemon." + desc = "Rich of vitamins. Contains a lime, orange, watermelon, apple, \ + berries and a lime." cost = CARGO_CRATE_VALUE * 3 contains = list(/obj/item/food/grown/citrus/lime, /obj/item/food/grown/citrus/orange, diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index cbf05c8c0c256..833142ed34b03 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -181,7 +181,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) data["character_profiles"] = create_character_profiles() data["character_preview_view"] = character_preview_view.assigned_map - data["overflow_role"] = SSjob.get_job_type(SSjob.overflow_role).title + data["overflow_role"] = SSjob.GetJobType(SSjob.overflow_role).title data["window"] = current_window data["content_unlocked"] = unlock_content diff --git a/code/modules/client/preferences/middleware/jobs.dm b/code/modules/client/preferences/middleware/jobs.dm index 392822eac6149..201e57668ea6a 100644 --- a/code/modules/client/preferences/middleware/jobs.dm +++ b/code/modules/client/preferences/middleware/jobs.dm @@ -10,7 +10,7 @@ if (level != null && level != JP_LOW && level != JP_MEDIUM && level != JP_HIGH) return FALSE - var/datum/job/job = SSjob.get_job(job_title) + var/datum/job/job = SSjob.GetJob(job_title) if (isnull(job)) return FALSE diff --git a/code/modules/client/preferences/species_features/vampire.dm b/code/modules/client/preferences/species_features/vampire.dm index f720dca3649ec..5ecdae7b1bf8e 100644 --- a/code/modules/client/preferences/species_features/vampire.dm +++ b/code/modules/client/preferences/species_features/vampire.dm @@ -32,7 +32,7 @@ GLOBAL_LIST_EMPTY(vampire_houses) //find and setup the house (department) this vampire is joining var/datum/job_department/vampire_house - var/datum/job/vampire_job = SSjob.get_job(target.job) + var/datum/job/vampire_job = SSjob.GetJob(target.job) if(!vampire_job) //no job or no mind LOSERS return var/list/valid_departments = (SSjob.joinable_departments.Copy()) - list(/datum/job_department/silicon, /datum/job_department/undefined) diff --git a/code/modules/clothing/belts/polymorph_belt.dm b/code/modules/clothing/belts/polymorph_belt.dm index 9f28c33e01964..fb09b2e68c8f1 100644 --- a/code/modules/clothing/belts/polymorph_belt.dm +++ b/code/modules/clothing/belts/polymorph_belt.dm @@ -104,14 +104,9 @@ invocation_type = INVOCATION_NONE spell_requirements = NONE possible_shapes = list(/mob/living/basic/cockroach) - can_be_shared = FALSE /// Amount of time it takes us to transform back or forth var/channel_time = 3 SECONDS -/datum/action/cooldown/spell/shapeshift/polymorph_belt/cast(mob/living/cast_on) - cast_on = owner //make sure this is only affecting the wearer of the belt - return ..() - /datum/action/cooldown/spell/shapeshift/polymorph_belt/Remove(mob/remove_from) var/datum/status_effect/shapechange_mob/shapechange = remove_from.has_status_effect(/datum/status_effect/shapechange_mob/from_spell) var/atom/changer = shapechange?.caster_mob || remove_from @@ -119,7 +114,6 @@ return ..() /datum/action/cooldown/spell/shapeshift/polymorph_belt/before_cast(mob/living/cast_on) - cast_on = owner . = ..() if (. & SPELL_CANCEL_CAST) return diff --git a/code/modules/clothing/chameleon/_chameleon_action.dm b/code/modules/clothing/chameleon/_chameleon_action.dm index e03f64f6292f8..25d6744152156 100644 --- a/code/modules/clothing/chameleon/_chameleon_action.dm +++ b/code/modules/clothing/chameleon/_chameleon_action.dm @@ -230,7 +230,7 @@ if(istype(applying_from, /datum/outfit/job)) var/datum/outfit/job/job_outfit = applying_from - var/datum/job/job_datum = SSjob.get_job_type(job_outfit.jobtype) + var/datum/job/job_datum = SSjob.GetJobType(job_outfit.jobtype) apply_job_data(job_datum) update_look(using_item_type) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 8260acaa9474e..d4705aee14c43 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -314,6 +314,14 @@ . += span_warning("[p_Theyre()] completely shredded and require[p_s()] mending before [p_they()] can be worn again!") return + switch (max_heat_protection_temperature) + if (400 to 1000) + . += "[src] offers the wearer limited protection from fire." + if (1001 to 1600) + . += "[src] offers the wearer some protection from fire." + if (1601 to 35000) + . += "[src] offers the wearer robust protection from fire." + if(TRAIT_FAST_CUFFING in clothing_traits) . += "[src] increase the speed that you handcuff others." @@ -348,38 +356,6 @@ if(get_armor().has_any_armor() || (flags_cover & (HEADCOVERSMOUTH|PEPPERPROOF)) || (clothing_flags & STOPSPRESSUREDAMAGE) || (visor_flags & STOPSPRESSUREDAMAGE)) . += span_notice("It has a tag listing its protection classes.") -/obj/item/clothing/examine_tags(mob/user) - . = ..() - if (clothing_flags & THICKMATERIAL) - .["thick"] = "Protects from most injections and sprays." - if (clothing_flags & CASTING_CLOTHES) - .["magical"] = "Allows magical beings to cast spells when wearing [src]." - if((clothing_flags & STOPSPRESSUREDAMAGE) || (visor_flags & STOPSPRESSUREDAMAGE)) - .["pressureproof"] = "Protects the wearer from extremely low or high pressure, such as vacuum of space." - if(flags_cover & PEPPERPROOF) - .["pepperproof"] = "Protects the wearer from the effects of pepperspray." - if (heat_protection || cold_protection) - var/heat_desc - var/cold_desc - switch (max_heat_protection_temperature) - if (400 to 1000) - heat_desc = "high" - if (1001 to 1600) - heat_desc = "very high" - if (1601 to 35000) - heat_desc = "extremely high" - switch (min_cold_protection_temperature) - if (160 to 272) - cold_desc = "low" - if (72 to 159) - cold_desc = "very low" - if (0 to 71) - cold_desc = "extremely low" - .["thermally insulated"] = "Protects the wearer from [jointext(list(heat_desc, cold_desc), " and ")] temperatures." - -/obj/item/clothing/examine_descriptor(mob/user) - return "clothing" - /obj/item/clothing/Topic(href, href_list) . = ..() @@ -407,7 +383,7 @@ added_damage_header = TRUE readout += "[armor_to_protection_name(durability_key)] [armor_to_protection_class(rating)]" - if((flags_cover & HEADCOVERSMOUTH) || (flags_cover & PEPPERPROOF)) + if(flags_cover & HEADCOVERSMOUTH || flags_cover & PEPPERPROOF) var/list/things_blocked = list() if(flags_cover & HEADCOVERSMOUTH) things_blocked += span_tooltip("Because this item is worn on the head and is covering the mouth, it will block facehugger proboscides, killing facehuggers.", "facehuggers") @@ -417,7 +393,7 @@ readout += "COVERAGE" readout += "It will block [english_list(things_blocked)]." - if((clothing_flags & STOPSPRESSUREDAMAGE) || (visor_flags & STOPSPRESSUREDAMAGE)) + if(clothing_flags & STOPSPRESSUREDAMAGE || visor_flags & STOPSPRESSUREDAMAGE) var/list/parts_covered = list() var/output_string = "It" if(!(clothing_flags & STOPSPRESSUREDAMAGE)) @@ -429,19 +405,8 @@ if(length(parts_covered)) // Just in case someone makes spaceproof gloves or something readout += "[output_string] will protect the wearer's [english_list(parts_covered)] from [span_tooltip("The extremely low pressure is the biggest danger posed by the vacuum of space.", "low pressure")]." - var/heat_prot - switch (max_heat_protection_temperature) - if (400 to 1000) - heat_prot = "minor" - if (1001 to 1600) - heat_prot = "some" - if (1601 to 35000) - heat_prot = "extreme" - if (heat_prot) - . += "[src] offers the wearer [heat_protection] protection from heat, up to [max_heat_protection_temperature] kelvin." - - if(min_cold_protection_temperature) - readout += "It will insulate the wearer from [min_cold_protection_temperature <= SPACE_SUIT_MIN_TEMP_PROTECT ? span_tooltip("While not as dangerous as the lack of pressure, the extremely low temperature of space is also a hazard.", "the cold of space, down to [min_cold_protection_temperature] kelvin") : "cold, down to [min_cold_protection_temperature] kelvin"]." + if(min_cold_protection_temperature == SPACE_SUIT_MIN_TEMP_PROTECT) + readout += "It will insulate the wearer from [span_tooltip("While not as dangerous as the lack of pressure, the extremely low temperature of space is also a hazard.", "the cold of space")]." if(!length(readout)) readout += "No armor or durability information available." diff --git a/code/modules/clothing/ears/_ears.dm b/code/modules/clothing/ears/_ears.dm index bdc294f5366ae..5ae5b628808e1 100644 --- a/code/modules/clothing/ears/_ears.dm +++ b/code/modules/clothing/ears/_ears.dm @@ -26,4 +26,3 @@ . = ..() AddElement(/datum/element/earhealing) AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) - AddComponent(/datum/component/adjust_fishing_difficulty, -1) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 3bb50a5e6b176..4ed35997680c0 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -344,7 +344,6 @@ /obj/item/clothing/glasses/sunglasses/Initialize(mapload) . = ..() add_glasses_slapcraft_component() - AddComponent(/datum/component/adjust_fishing_difficulty, -1) /obj/item/clothing/glasses/sunglasses/proc/add_glasses_slapcraft_component() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/hudsunsec, /datum/crafting_recipe/hudsunmed, /datum/crafting_recipe/hudsundiag, /datum/crafting_recipe/scienceglasses) @@ -445,21 +444,9 @@ visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT glass_colour_type = /datum/client_colour/glass_colour/gray -/obj/item/clothing/glasses/welding/Initialize(mapload) - . = ..() - if(!up) - AddComponent(/datum/component/adjust_fishing_difficulty, 8) - -/obj/item/clothing/glasses/welding/attack_self(mob/living/user) +/obj/item/clothing/glasses/welding/attack_self(mob/user) adjust_visor(user) -/obj/item/clothing/glasses/welding/adjust_visor(mob/user) - . = ..() - if(up) - qdel(GetComponent(/datum/component/adjust_fishing_difficulty)) - else - AddComponent(/datum/component/adjust_fishing_difficulty, 8) - /obj/item/clothing/glasses/welding/update_icon_state() . = ..() icon_state = "[initial(icon_state)][up ? "up" : ""]" @@ -478,10 +465,6 @@ tint = INFINITY // You WILL Be blind, no matter what dog_fashion = /datum/dog_fashion/head -/obj/item/clothing/glasses/blindfold/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 8) - /obj/item/clothing/glasses/trickblindfold name = "blindfold" desc = "A see-through blindfold perfect for cheating at games like pin the stun baton on the clown." @@ -519,10 +502,6 @@ flags_cover = GLASSESCOVERSEYES glass_colour_type = /datum/client_colour/glass_colour/red -/obj/item/clothing/glasses/thermal/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -4) - /obj/item/clothing/glasses/thermal/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) @@ -635,10 +614,6 @@ var/list/hudlist = list(DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC, DATA_HUD_SECURITY_ADVANCED, DATA_HUD_BOT_PATH) var/xray = FALSE -/obj/item/clothing/glasses/debug/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -15) - /obj/item/clothing/glasses/debug/equipped(mob/user, slot) . = ..() if(!(slot & ITEM_SLOT_EYES)) @@ -725,10 +700,6 @@ /// Hallucination datum currently being used for seeing mares var/datum/hallucination/stored_hallucination -/obj/item/clothing/glasses/nightmare_vision/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 13) - /obj/item/clothing/glasses/nightmare_vision/Destroy() QDEL_NULL(stored_hallucination) return ..() diff --git a/code/modules/clothing/gloves/bone.dm b/code/modules/clothing/gloves/bone.dm index 761057054f901..2c75e642ff617 100644 --- a/code/modules/clothing/gloves/bone.dm +++ b/code/modules/clothing/gloves/bone.dm @@ -12,10 +12,6 @@ resistance_flags = NONE armor_type = /datum/armor/gloves_bracer -/obj/item/clothing/gloves/bracer/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 2) - /datum/armor/gloves_bracer melee = 15 bullet = 25 diff --git a/code/modules/clothing/gloves/botany.dm b/code/modules/clothing/gloves/botany.dm index 144477240b29d..af94a6b7bb13e 100644 --- a/code/modules/clothing/gloves/botany.dm +++ b/code/modules/clothing/gloves/botany.dm @@ -12,10 +12,6 @@ clothing_traits = list(TRAIT_PLANT_SAFE) armor_type = /datum/armor/gloves_botanic_leather -/obj/item/clothing/gloves/botanic_leather/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) - /datum/armor/gloves_botanic_leather bio = 50 fire = 70 diff --git a/code/modules/clothing/gloves/boxing.dm b/code/modules/clothing/gloves/boxing.dm index ab6e03ae493d2..021d895f69c36 100644 --- a/code/modules/clothing/gloves/boxing.dm +++ b/code/modules/clothing/gloves/boxing.dm @@ -19,7 +19,6 @@ ) AddComponent(/datum/component/martial_art_giver, style_to_give) - AddComponent(/datum/component/adjust_fishing_difficulty, 19) /obj/item/clothing/gloves/boxing/evil name = "evil boxing gloves" diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 048d575f5f02e..82b1eb8f37954 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -44,7 +44,6 @@ /obj/item/clothing/gloves/color/fingerless/Initialize(mapload) . = ..() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/gripperoffbrand) - AddComponent(/datum/component/adjust_fishing_difficulty, -2) AddElement( /datum/element/slapcrafting,\ diff --git a/code/modules/clothing/gloves/combat.dm b/code/modules/clothing/gloves/combat.dm index a2574c8d23ec7..efc5bd40b0587 100644 --- a/code/modules/clothing/gloves/combat.dm +++ b/code/modules/clothing/gloves/combat.dm @@ -25,16 +25,8 @@ greyscale_colors = null inhand_icon_state = null -/obj/item/clothing/gloves/combat/wizard/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) //something something wizard casting - /obj/item/clothing/gloves/combat/floortile name = "floortile camouflage gloves" desc = "Is it just me or is there a pair of gloves on the floor?" icon_state = "ftc_gloves" inhand_icon_state = "greyscale_gloves" - -/obj/item/clothing/gloves/combat/floortiletile/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) //tacticool diff --git a/code/modules/clothing/gloves/insulated.dm b/code/modules/clothing/gloves/insulated.dm index b04637d4c527b..19109d68b9c93 100644 --- a/code/modules/clothing/gloves/insulated.dm +++ b/code/modules/clothing/gloves/insulated.dm @@ -15,19 +15,13 @@ cut_type = /obj/item/clothing/gloves/cut clothing_traits = list(TRAIT_CHUNKYFINGERS) -/obj/item/clothing/gloves/color/yellow/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 10) - /obj/item/clothing/gloves/color/yellow/apply_fantasy_bonuses(bonus) . = ..() if(bonus >= 10) detach_clothing_traits(TRAIT_CHUNKYFINGERS) - qdel(GetComponent(/datum/component/adjust_fishing_difficulty)) /obj/item/clothing/gloves/color/yellow/remove_fantasy_bonuses(bonus) attach_clothing_traits(TRAIT_CHUNKYFINGERS) - AddComponent(/datum/component/adjust_fishing_difficulty, 10) return ..() /datum/armor/color_yellow @@ -122,10 +116,6 @@ greyscale_colors = null clothing_traits = list(TRAIT_FINGERPRINT_PASSTHROUGH) -/obj/item/clothing/gloves/cut/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) - /obj/item/clothing/gloves/cut/heirloom desc = "The old gloves your great grandfather stole from Engineering, many moons ago. They've seen some tough times recently." @@ -141,7 +131,3 @@ heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE - -/obj/item/clothing/gloves/chief_engineer/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -4) diff --git a/code/modules/clothing/gloves/punch_mitts.dm b/code/modules/clothing/gloves/punch_mitts.dm index 96848731a9cbb..07d93d5ab021c 100644 --- a/code/modules/clothing/gloves/punch_mitts.dm +++ b/code/modules/clothing/gloves/punch_mitts.dm @@ -11,7 +11,7 @@ /obj/item/clothing/gloves/fingerless/punch_mitts/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -4) + AddComponent(/datum/component/martial_art_giver, /datum/martial_art/boxing/hunter) /datum/armor/gloves_mitts diff --git a/code/modules/clothing/gloves/special.dm b/code/modules/clothing/gloves/special.dm index 3e18a4ed2adc0..1366a29ac4a6e 100644 --- a/code/modules/clothing/gloves/special.dm +++ b/code/modules/clothing/gloves/special.dm @@ -14,7 +14,6 @@ . = ..() RegisterSignal(src, COMSIG_ITEM_EQUIPPED, PROC_REF(on_glove_equip)) RegisterSignal(src, COMSIG_ITEM_POST_UNEQUIP, PROC_REF(on_glove_unequip)) - AddComponent(/datum/component/adjust_fishing_difficulty, 19) /// Called when the glove is equipped. Adds a component to the equipper and stores a weak reference to it. /obj/item/clothing/gloves/cargo_gauntlet/proc/on_glove_equip(datum/source, mob/equipper, slot) @@ -60,7 +59,6 @@ /obj/item/clothing/gloves/rapid/Initialize(mapload) . = ..() AddComponent(/datum/component/wearertargeting/punchcooldown) - AddComponent(/datum/component/adjust_fishing_difficulty, -7) /obj/item/clothing/gloves/radio name = "translation gloves" @@ -76,10 +74,6 @@ icon_state = "black" greyscale_colors = "#2f2e31" -/obj/item/clothing/gloves/race/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -7) - /obj/item/clothing/gloves/captain desc = "Regal blue gloves, with a nice gold trim, a diamond anti-shock coating, and an integrated thermal barrier. Swanky." name = "captain's gloves" @@ -96,10 +90,6 @@ resistance_flags = NONE clothing_traits = list(TRAIT_FAST_CUFFING) -/obj/item/clothing/gloves/captain/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -4) - /datum/armor/captain_gloves bio = 90 fire = 70 @@ -127,10 +117,6 @@ greyscale_colors = "#99eeff" clothing_traits = list(TRAIT_QUICKER_CARRY, TRAIT_FASTMED) -/obj/item/clothing/gloves/latex/nitrile/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -4) - /obj/item/clothing/gloves/latex/coroner name = "coroner's gloves" desc = "Black gloves made from latex with a superhydrophobic coating. Useful for picking bodies up instead of dragging blood behind." @@ -170,50 +156,42 @@ clothing_traits = list(TRAIT_QUICKER_CARRY, TRAIT_CHUNKYFINGERS) clothing_flags = THICKMATERIAL -/obj/item/clothing/gloves/atmos/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 6) - ///A pair of gloves that both allow the user to fish without the need of a held fishing rod and provides athletics experience. /obj/item/clothing/gloves/fishing name = "athletic fishing gloves" desc = "A pair of gloves to fish without a fishing rod but your raw athletics strength. It doubles as a good workout device. WARNING: May cause injuries when catching bigger fish." icon_state = "fishing_gloves" - ///The current fishing minigame datum the wearer is engaged in. - var/datum/fishing_challenge/challenge /obj/item/clothing/gloves/fishing/Initialize(mapload) . = ..() AddComponent(/datum/component/profound_fisher, new /obj/item/fishing_rod/mob_fisher/athletic(src)) - AddComponent(/datum/component/adjust_fishing_difficulty, -3) //on top of the extra that you get from the athletics skill. /obj/item/clothing/gloves/fishing/equipped(mob/user, slot) . = ..() if(slot == ITEM_SLOT_GLOVES) - RegisterSignal(user, COMSIG_MOB_BEGIN_FISHING_MINIGAME, PROC_REF(begin_workout)) + RegisterSignal(user, SIGNAL_ADDTRAIT(TRAIT_ACTIVELY_FISHING), PROC_REF(begin_workout)) /obj/item/clothing/gloves/fishing/dropped(mob/user) - UnregisterSignal(user, COMSIG_MOB_BEGIN_FISHING_MINIGAME) - if(challenge) - stop_workout(user) + UnregisterSignal(user, list(SIGNAL_ADDTRAIT(TRAIT_ACTIVELY_FISHING), SIGNAL_REMOVETRAIT(TRAIT_ACTIVELY_FISHING))) + STOP_PROCESSING(SSprocessing, src) return ..() -/obj/item/clothing/gloves/fishing/proc/begin_workout(datum/source, datum/fishing_challenge/challenge) +/obj/item/clothing/gloves/fishing/proc/begin_workout(datum/source) SIGNAL_HANDLER - RegisterSignal(source, COMSIG_MOB_COMPLETE_FISHING, PROC_REF(stop_workout)) + RegisterSignal(source, SIGNAL_REMOVETRAIT(TRAIT_ACTIVELY_FISHING), PROC_REF(stop_workout)) if(HAS_TRAIT(source, TRAIT_PROFOUND_FISHER)) //Only begin working out if we're fishing with these gloves and not some other fishing rod.. START_PROCESSING(SSprocessing, src) - src.challenge = challenge /obj/item/clothing/gloves/fishing/proc/stop_workout(datum/source) SIGNAL_HANDLER - UnregisterSignal(source, COMSIG_MOB_COMPLETE_FISHING) - challenge = null + UnregisterSignal(source, SIGNAL_REMOVETRAIT(TRAIT_ACTIVELY_FISHING)) STOP_PROCESSING(SSprocessing, src) /obj/item/clothing/gloves/fishing/process(seconds_per_tick) var/mob/living/wearer = loc - var/stamina_exhaustion = 2 + challenge.difficulty * 0.02 + var/list/trait_source = GET_TRAIT_SOURCES(wearer, TRAIT_ACTIVELY_FISHING) + var/datum/fishing_challenge/challenge = trait_source[1] + var/stamina_exhaustion = 2.5 + challenge.difficulty * 0.025 var/is_heavy_gravity = wearer.has_gravity() > STANDARD_GRAVITY var/obj/item/organ/internal/cyberimp/chest/spine/potential_spine = wearer.get_organ_slot(ORGAN_SLOT_SPINE) if(istype(potential_spine)) @@ -232,14 +210,11 @@ ///The internal fishing rod of the athletic fishing gloves. The more athletic you're, the easier the minigame will be. /obj/item/fishing_rod/mob_fisher/athletic - name = "athletics fishing gloves" icon = /obj/item/clothing/gloves/fishing::icon icon_state = /obj/item/clothing/gloves/fishing::icon_state line = null bait = null - ui_description = "A pair of gloves to fish without a fishing rod while training your athletics." - wiki_description = "It requires the Advanced Fishing Technology Node to be researched to be printed. It may hurt the user when catching larger fish." - show_in_wiki = TRUE //Show this cool pair of gloves in the wiki. + ui_description = "The integrated fishing rod of a pair of athletic fishing gloves" /obj/item/fishing_rod/mob_fisher/athletic/Initialize(mapload) . = ..() @@ -249,7 +224,7 @@ return list() /obj/item/fishing_rod/mob_fisher/athletic/hook_hit(atom/atom_hit_by_hook_projectile, mob/user) - difficulty_modifier = -3 * (user.mind?.get_skill_level(/datum/skill/athletics) - 1) + difficulty_modifier = -3 * user.mind?.get_skill_level(/datum/skill/athletics) return ..() /obj/item/fishing_rod/mob_fisher/athletic/proc/noodling_is_dangerous(datum/source, atom/movable/reward, mob/living/user) diff --git a/code/modules/clothing/gloves/tacklers.dm b/code/modules/clothing/gloves/tacklers.dm index d45fa8d0a90b5..bbe7f5dba18b4 100644 --- a/code/modules/clothing/gloves/tacklers.dm +++ b/code/modules/clothing/gloves/tacklers.dm @@ -22,12 +22,6 @@ var/tackle_speed = 1 /// See: [/datum/component/tackler/var/skill_mod] var/skill_mod = 1 - ///How much these gloves affect fishing difficulty - var/fishing_modifier = -5 - -/obj/item/clothing/gloves/tackler/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier) //fishing tackle equipment (ba dum tsh) /obj/item/clothing/gloves/tackler/Destroy() tackler = null @@ -61,7 +55,6 @@ tackle_speed = 2 min_distance = 2 skill_mod = -2 - fishing_modifier = -8 /obj/item/clothing/gloves/tackler/combat name = "gorilla gloves" @@ -113,11 +106,9 @@ base_knockdown = 1.75 SECONDS min_distance = 2 skill_mod = -1 - fishing_modifier = -3 /obj/item/clothing/gloves/tackler/football name = "football gloves" desc = "Gloves for football players! Teaches them how to tackle like a pro." icon_state = "tackle_gloves" inhand_icon_state = null - fishing_modifier = -3 diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index 9f7d01506f1e5..3cd88ffc8eda0 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -107,10 +107,6 @@ inhand_icon_state = null dog_fashion = /datum/dog_fashion/head/pirate -/obj/item/clothing/head/collectable/pirate/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) - /obj/item/clothing/head/collectable/kitty name = "collectable kitty ears" desc = "The fur feels... a bit too realistic." @@ -133,10 +129,6 @@ icon_state = "wizard" dog_fashion = /datum/dog_fashion/head/blue_wizard -/obj/item/clothing/head/collectable/wizard/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -1) - /obj/item/clothing/head/collectable/hardhat name = "collectable hard hat" desc = "WARNING! Offers no real protection, or luminosity, but damn, is it fancy!" @@ -181,7 +173,3 @@ inhand_icon_state = "swatsyndie_helmet" clothing_flags = SNUG_FIT flags_inv = HIDEHAIR - -/obj/item/clothing/head/collectable/swat/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 2) diff --git a/code/modules/clothing/head/fedora.dm b/code/modules/clothing/head/fedora.dm index 7bf295f74553a..cf0d23ac37f58 100644 --- a/code/modules/clothing/head/fedora.dm +++ b/code/modules/clothing/head/fedora.dm @@ -36,10 +36,6 @@ icon_state = "fedora_carpskin" inhand_icon_state = null -/obj/item/clothing/head/fedora/carpskin/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -4) - /obj/item/clothing/head/fedora/beige/press name = "press fedora" desc = "An beige fedora with a piece of paper saying \"PRESS\" stuck in its rim." diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 1b86a8ea36ce0..fc56f83342346 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -40,6 +40,7 @@ /obj/item/clothing/head/utility/hardhat/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_updates_onmob) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) /obj/item/clothing/head/utility/hardhat/proc/toggle_helmet_light(mob/living/user) on = !on @@ -59,11 +60,11 @@ /obj/item/clothing/head/utility/hardhat/proc/turn_off(mob/user) set_light_on(FALSE) -/obj/item/clothing/head/utility/hardhat/on_saboteur(datum/source, disrupt_duration) - . = ..() +/obj/item/clothing/head/utility/hardhat/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER if(on) toggle_helmet_light() - return TRUE + return COMSIG_SABOTEUR_SUCCESS /obj/item/clothing/head/utility/hardhat/attack_self(mob/living/user) toggle_helmet_light(user) @@ -238,10 +239,6 @@ dog_fashion = /datum/dog_fashion/head/pumpkin/unlit clothing_traits = list() -/obj/item/clothing/head/utility/hardhat/pumpkinhead/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 3) - /obj/item/clothing/head/utility/hardhat/pumpkinhead/set_light_on(new_value) . = ..() if(isnull(.)) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index b9b371d498c10..2874a27b72b98 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -201,10 +201,6 @@ visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF clothing_traits = list(TRAIT_HEAD_INJURY_BLOCKED) -/obj/item/clothing/head/helmet/toggleable/riot/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 2) - /datum/armor/toggleable_riot melee = 50 bullet = 10 @@ -284,10 +280,6 @@ dog_fashion = null clothing_traits = list(TRAIT_HEAD_INJURY_BLOCKED) -/obj/item/clothing/head/helmet/swat/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 3) - /datum/armor/helmet_swat melee = 40 bullet = 30 @@ -437,10 +429,6 @@ dog_fashion = null clothing_traits = list(TRAIT_HEAD_INJURY_BLOCKED) -/obj/item/clothing/head/helmet/knight/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 3) - /datum/armor/helmet_knight melee = 50 bullet = 10 diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 7b67cda761f2e..5d5fc87d409f4 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -624,10 +624,6 @@ flags_inv = HIDEHAIR //Cover your head doctor! w_class = WEIGHT_CLASS_SMALL //surgery cap can be easily crumpled -/obj/item/clothing/head/utility/surgerycap/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) //FISH DOCTOR?! - /obj/item/clothing/head/utility/surgerycap/attack_self(mob/user) . = ..() if(.) @@ -670,10 +666,6 @@ icon_state = "headmirror" body_parts_covered = NONE -/obj/item/clothing/head/utility/head_mirror/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) //FISH DOCTOR?! - /obj/item/clothing/head/utility/head_mirror/examine(mob/user) . = ..() . += span_notice("In a properly lit room, you can use this to examine people's eyes, ears, and mouth closer.") diff --git a/code/modules/clothing/head/mind_monkey_helmet.dm b/code/modules/clothing/head/mind_monkey_helmet.dm index 9dcaa5c365f27..449df33550560 100644 --- a/code/modules/clothing/head/mind_monkey_helmet.dm +++ b/code/modules/clothing/head/mind_monkey_helmet.dm @@ -10,10 +10,6 @@ var/mob/living/carbon/human/magnification = null ///if the helmet is on a valid target (just works like a normal helmet if not (cargo please stop)) var/polling = FALSE///if the helmet is currently polling for targets (special code for removal) var/light_colors = 1 ///which icon state color this is (red, blue, yellow) - /// This chance is increased by 7 every time the helmet fails to get a host, to dissuade spam. starts negative to add 1 safe reuse - var/rage_chance = -7 - /// Holds the steam effect at dangerous rage chance levels. - var/obj/effect/abstract/particle_holder/particle_effect /obj/item/clothing/head/helmet/monkey_sentience/Initialize(mapload) . = ..() @@ -22,13 +18,12 @@ /obj/item/clothing/head/helmet/monkey_sentience/examine(mob/user) . = ..() - . += span_boldwarning("---WARNING: REMOVAL OF HELMET ON SUBJECT, OR REPEATED SENTIENCE GENERATION FAILURES MAY LEAD TO:---") + . += span_boldwarning("---WARNING: REMOVAL OF HELMET ON SUBJECT MAY LEAD TO:---") . += span_warning("BLOOD RAGE") . += span_warning("BRAIN DEATH") . += span_warning("PRIMAL GENE ACTIVATION") . += span_warning("GENETIC MAKEUP MASS SUSCEPTIBILITY") - . += span_notice("Warranty voided if helmet is placed after more than ") + span_boldnotice("two") + span_notice(" mind magnification failures.") - . += span_boldnotice("Ask your CMO if mind magnification is right for you!") + . += span_boldnotice("Ask your CMO if mind magnification is right for you.") /obj/item/clothing/head/helmet/monkey_sentience/update_icon_state() . = ..() @@ -60,40 +55,9 @@ UnregisterSignal(magnification, COMSIG_SPECIES_LOSS) magnification = null visible_message(span_notice("[src] falls silent and drops on the floor. Maybe you should try again later?")) - var/particle_path - switch(rage_chance) - if(-7 to 0) - user.visible_message(span_notice("[src] falls silent and drops on the floor. Try again later?")) - playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) - particle_path = null - if(7 to 13) - user.visible_message(span_notice("[src] sparkles momentarily, then falls silent and drops on the floor. Maybe you should try again later?")) - playsound(src, SFX_SPARKS, 30, TRUE) - do_sparks(2, FALSE, src) - particle_path = /particles/smoke/steam/mild - if(14 to 21) - user.visible_message(span_notice("[src] sparkles and shatters ominously, then falls silent and drops on the floor. Maybe you shouldn't try again later.")) - do_sparks(4, FALSE, src) - playsound(src, SFX_SPARKS, 15, TRUE) - playsound(src, SFX_SHATTER, 30, TRUE) - particle_path = /particles/smoke/steam/bad - if(21 to INFINITY) - user.visible_message(span_notice("[src] buzzes and smokes heavily, then falls silent and drops on the floor. This is clearly a bad idea.")) - do_sparks(6, FALSE, src) - playsound(src, 'sound/machines/buzz-two.ogg', 30, TRUE) - particle_path = /particles/smoke/steam - rage_chance += 7 - - QDEL_NULL(particle_effect) - if(particle_path) - particle_effect = new(src, particle_path) - QDEL_IN(particle_effect, 2 MINUTES) - - if((rage_chance > 0) && prob(rage_chance)) // too much spam means agnry gorilla running at you - malfunction(user) + playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) user.dropItemToGround(src) return - magnification.key = chosen_one.key playsound(src, 'sound/machines/microwave/microwave-end.ogg', 100, FALSE) to_chat(magnification, span_notice("You're a mind magnified monkey! Protect your helmet with your life- if you lose it, your sentience goes with it!")) @@ -114,7 +78,17 @@ to_chat(magnification, span_userdanger("You feel your flicker of sentience ripped away from you, as everything becomes dim...")) magnification.ghostize(FALSE) if(prob(10)) - malfunction(magnification) + switch(rand(1,4)) + if(1) //blood rage + var/datum/ai_controller/monkey/monky_controller = magnification.ai_controller + monky_controller.set_trip_mode(mode = FALSE) + monky_controller.set_blackboard_key(BB_MONKEY_AGGRESSIVE, TRUE) + if(2) //brain death + magnification.apply_damage(500,BRAIN,BODY_ZONE_HEAD,FALSE,FALSE,FALSE) + if(3) //primal gene (gorilla) + magnification.gorillize() + if(4) //genetic mass susceptibility (gib) + magnification.gib(DROP_ALL_REMAINS) //either used up correctly or taken off before polling finished (punish this by destroying the helmet) UnregisterSignal(magnification, COMSIG_SPECIES_LOSS) playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) @@ -123,19 +97,6 @@ magnification = null new /obj/effect/decal/cleanable/ash(drop_location()) //just in case they're in a locker or other containers it needs to use crematorium ash, see the path itself for an explanation -/obj/item/clothing/head/helmet/monkey_sentience/proc/malfunction(mob/living/carbon/target) - switch(rand(1,4)) - if(1) //blood rage - var/datum/ai_controller/monkey/monky_controller = target.ai_controller - monky_controller.set_trip_mode(mode = FALSE) - monky_controller.set_blackboard_key(BB_MONKEY_AGGRESSIVE, TRUE) - if(2) //brain death - target.apply_damage(500,BRAIN,BODY_ZONE_HEAD,FALSE,FALSE,FALSE) - if(3) //primal gene (gorilla) - target.gorillize() - if(4) //genetic mass susceptibility (gib) - target.gib(DROP_ALL_REMAINS) - /obj/item/clothing/head/helmet/monkey_sentience/dropped(mob/user) . = ..() if(magnification || polling) diff --git a/code/modules/clothing/head/moth.dm b/code/modules/clothing/head/moth.dm index e040d834c9d21..58be10a1b0fc7 100644 --- a/code/modules/clothing/head/moth.dm +++ b/code/modules/clothing/head/moth.dm @@ -15,7 +15,6 @@ /obj/item/clothing/head/mothcap/original/Initialize(mapload) . = ..() AddComponent(/datum/component/scope, range_modifier = 1.2, zoom_method = ZOOM_METHOD_ITEM_ACTION, item_action_type = /datum/action/item_action/hands_free/moth_googles) - AddComponent(/datum/component/adjust_fishing_difficulty, -2) /obj/item/clothing/head/mothcap/original/item_action_slot_check(slot, mob/user, datum/action/action) return (slot & ITEM_SLOT_HEAD) diff --git a/code/modules/clothing/head/pirate.dm b/code/modules/clothing/head/pirate.dm index 6d5d0a67f30f9..818478ccb7d4a 100644 --- a/code/modules/clothing/head/pirate.dm +++ b/code/modules/clothing/head/pirate.dm @@ -5,9 +5,8 @@ inhand_icon_state = null dog_fashion = /datum/dog_fashion/head/pirate -/obj/item/clothing/head/costume/pirate/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) +/obj/item/clothing/head/costume/pirate + var/datum/language/piratespeak/L = new /obj/item/clothing/head/costume/pirate/equipped(mob/user, slot) . = ..() diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 629305740318d..f8e7e80532f16 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -175,7 +175,6 @@ . = ..() AddComponent(/datum/component/speechmod, replacements = strings("crustacean_replacement.json", "crustacean")) //you asked for this. AddElement(/datum/element/skill_reward, /datum/skill/fishing) - AddComponent(/datum/component/adjust_fishing_difficulty, -4) #define PROPHAT_MOOD "prophat" diff --git a/code/modules/clothing/head/welding.dm b/code/modules/clothing/head/welding.dm index 000448fd7258d..e3f014875dde4 100644 --- a/code/modules/clothing/head/welding.dm +++ b/code/modules/clothing/head/welding.dm @@ -18,11 +18,6 @@ resistance_flags = FIRE_PROOF clothing_flags = SNUG_FIT | STACKABLE_HELMET_EXEMPT -/obj/item/clothing/head/utility/welding/Initialize(mapload) - . = ..() - if(!up) - AddComponent(/datum/component/adjust_fishing_difficulty, 8) - /datum/armor/utility_welding melee = 10 fire = 100 @@ -31,13 +26,6 @@ /obj/item/clothing/head/utility/welding/attack_self(mob/user) adjust_visor(user) -/obj/item/clothing/head/utility/welding/adjust_visor(mob/user) - . = ..() - if(up) - qdel(GetComponent(/datum/component/adjust_fishing_difficulty)) - else - AddComponent(/datum/component/adjust_fishing_difficulty, 8) - /obj/item/clothing/head/utility/welding/update_icon_state() . = ..() icon_state = "[initial(icon_state)][up ? "up" : ""]" diff --git a/code/modules/clothing/masks/animal_masks.dm b/code/modules/clothing/masks/animal_masks.dm index 7b29519e12ba5..05e5888168e12 100644 --- a/code/modules/clothing/masks/animal_masks.dm +++ b/code/modules/clothing/masks/animal_masks.dm @@ -150,18 +150,6 @@ GLOBAL_LIST_INIT(cursed_animal_masks, list( animal_sounds_alt = list("HUUUUU!!","SMOOOOOKIN'!!","Hello my baby, hello my honey, hello my rag-time gal.", "Feels bad, man.", "GIT DIS GUY OFF ME!!" ,"SOMEBODY STOP ME!!", "NORMIES, GET OUT!!") flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT -/obj/item/clothing/mask/animal/frog/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, cursed ? 2 : -2) - -/obj/item/clothing/mask/animal/frog/make_cursed() - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 2) - -/obj/item/clothing/mask/animal/frog/clear_curse() - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) - /obj/item/clothing/mask/animal/frog/cursed cursed = TRUE @@ -239,18 +227,6 @@ GLOBAL_LIST_INIT(cursed_animal_masks, list( inhand_icon_state = null animal_sounds = list("RAWR!","Rawr!","GRR!","Growl!") -/obj/item/clothing/mask/animal/small/bear/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, cursed ? 2 : -2) - -/obj/item/clothing/mask/animal/small/bear/make_cursed() - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 2) - -/obj/item/clothing/mask/animal/small/bear/clear_curse() - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) - /obj/item/clothing/mask/animal/small/bear/cursed cursed = TRUE @@ -299,17 +275,5 @@ GLOBAL_LIST_INIT(cursed_animal_masks, list( animal_sounds_alt = list("Eekum-bokum!", "Oomenacka!", "In mah head..... Zombi.... Zombi!") animal_sounds_alt_probability = 5 -/obj/item/clothing/mask/animal/small/tribal/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, cursed ? 4 : -4) - -/obj/item/clothing/mask/animal/small/tribal/make_cursed() - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 4) - -/obj/item/clothing/mask/animal/small/tribal/clear_curse() - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -4) - /obj/item/clothing/mask/animal/small/tribal/cursed //adminspawn only. cursed = TRUE diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index 46ad60e58deaa..2e75cebf5d98f 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -24,10 +24,6 @@ w_class = WEIGHT_CLASS_SMALL actions_types = list(/datum/action/item_action/adjust) -/obj/item/clothing/mask/floortilebalaclava/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) //tacticool - /obj/item/clothing/mask/floortilebalaclava/attack_self(mob/user) adjust_visor(user) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 47ecf9a11f5a8..c5871d23c1859 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -18,7 +18,6 @@ GLOBAL_LIST_INIT(clown_mask_options, list( armor_type = /datum/armor/mask_gas flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH | PEPPERPROOF resistance_flags = NONE - voice_filter = "lowpass=f=750,volume=2" ///Max numbers of installable filters var/max_filters = 1 ///List to keep track of each filter @@ -29,19 +28,19 @@ GLOBAL_LIST_INIT(clown_mask_options, list( var/has_fov = TRUE ///Cigarette in the mask var/obj/item/cigarette/cig - ///How much does this mask affect fishing difficulty - var/fishing_modifier = 2 + voice_filter = "lowpass=f=750,volume=2" /datum/armor/mask_gas bio = 100 +/obj/item/clothing/mask/gas/worn_overlays(mutable_appearance/standing, isinhands) + . = ..() + if(!isinhands && cig) + . += cig.build_worn_icon(default_layer = FACEMASK_LAYER, default_icon_file = 'icons/mob/clothing/mask.dmi') + /obj/item/clothing/mask/gas/Initialize(mapload) . = ..() init_fov() - - if(fishing_modifier) - AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier) - if(!max_filters || !starting_filter_type) return @@ -50,11 +49,6 @@ GLOBAL_LIST_INIT(clown_mask_options, list( LAZYADD(gas_filters, inserted_filter) has_filter = TRUE -/obj/item/clothing/mask/gas/worn_overlays(mutable_appearance/standing, isinhands) - . = ..() - if(!isinhands && cig) - . += cig.build_worn_icon(default_layer = FACEMASK_LAYER, default_icon_file = 'icons/mob/clothing/mask.dmi') - /obj/item/clothing/mask/gas/Destroy() QDEL_LAZYLIST(gas_filters) return..() @@ -228,7 +222,6 @@ GLOBAL_LIST_INIT(clown_mask_options, list( visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT resistance_flags = FIRE_PROOF clothing_flags = parent_type::clothing_flags | INTERNALS_ADJUST_EXEMPT - fishing_modifier = 8 /datum/armor/gas_welding melee = 10 @@ -243,12 +236,6 @@ GLOBAL_LIST_INIT(clown_mask_options, list( . = ..() if(.) playsound(src, 'sound/mecha/mechmove03.ogg', 50, TRUE) - if(!fishing_modifier) - return - if(up) - qdel(GetComponent(/datum/component/adjust_fishing_difficulty)) - else - AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier) /obj/item/clothing/mask/gas/welding/update_icon_state() . = ..() @@ -279,7 +266,6 @@ GLOBAL_LIST_INIT(clown_mask_options, list( strip_delay = 60 w_class = WEIGHT_CLASS_SMALL has_fov = FALSE - fishing_modifier = 0 /obj/item/clothing/mask/gas/clown_hat name = "clown wig and mask" @@ -299,7 +285,6 @@ GLOBAL_LIST_INIT(clown_mask_options, list( has_fov = FALSE var/list/clownmask_designs = list() voice_filter = null // performer masks expect to be talked through - fishing_modifier = 0 /obj/item/clothing/mask/gas/clown_hat/plasmaman starting_filter_type = /obj/item/gas_filter/plasmaman @@ -342,7 +327,6 @@ GLOBAL_LIST_INIT(clown_mask_options, list( flags_cover = MASKCOVERSEYES resistance_flags = FLAMMABLE has_fov = FALSE - fishing_modifier = 0 /obj/item/clothing/mask/gas/mime name = "mime mask" @@ -356,7 +340,6 @@ GLOBAL_LIST_INIT(clown_mask_options, list( actions_types = list(/datum/action/item_action/adjust) species_exception = list(/datum/species/golem) has_fov = FALSE - fishing_modifier = 0 var/list/mimemask_designs = list() /obj/item/clothing/mask/gas/mime/plasmaman @@ -401,7 +384,6 @@ GLOBAL_LIST_INIT(clown_mask_options, list( flags_cover = MASKCOVERSEYES resistance_flags = FLAMMABLE has_fov = FALSE - fishing_modifier = 0 /obj/item/clothing/mask/gas/sexymime name = "sexy mime mask" @@ -413,7 +395,6 @@ GLOBAL_LIST_INIT(clown_mask_options, list( resistance_flags = FLAMMABLE species_exception = list(/datum/species/golem) has_fov = FALSE - fishing_modifier = 0 /obj/item/clothing/mask/gas/cyborg name = "cyborg visor" @@ -422,7 +403,6 @@ GLOBAL_LIST_INIT(clown_mask_options, list( resistance_flags = FLAMMABLE has_fov = FALSE flags_cover = MASKCOVERSEYES - fishing_modifier = 0 /obj/item/clothing/mask/gas/owl_mask name = "owl mask" @@ -433,7 +413,6 @@ GLOBAL_LIST_INIT(clown_mask_options, list( flags_cover = MASKCOVERSEYES resistance_flags = FLAMMABLE has_fov = FALSE - fishing_modifier = -1 /obj/item/clothing/mask/gas/carp name = "carp mask" @@ -442,7 +421,6 @@ GLOBAL_LIST_INIT(clown_mask_options, list( inhand_icon_state = null has_fov = FALSE flags_cover = MASKCOVERSEYES - fishing_modifier = -3 /obj/item/clothing/mask/gas/tiki_mask name = "tiki mask" @@ -456,7 +434,6 @@ GLOBAL_LIST_INIT(clown_mask_options, list( max_integrity = 100 actions_types = list(/datum/action/item_action/adjust) dog_fashion = null - fishing_modifier = -2 var/list/tikimask_designs = list() /obj/item/clothing/mask/gas/tiki_mask/Initialize(mapload) @@ -499,7 +476,6 @@ GLOBAL_LIST_INIT(clown_mask_options, list( resistance_flags = FIRE_PROOF | ACID_PROOF flags_inv = HIDEFACIALHAIR|HIDEFACE|HIDEEYES|HIDEEARS|HIDEHAIR|HIDESNOUT has_fov = FALSE - fishing_modifier = -2 /obj/item/clothing/mask/gas/prop name = "prop gas mask" @@ -510,7 +486,6 @@ GLOBAL_LIST_INIT(clown_mask_options, list( flags_cover = MASKCOVERSMOUTH resistance_flags = FLAMMABLE has_fov = FALSE - fishing_modifier = 0 /obj/item/clothing/mask/gas/atmosprop name = "prop atmospheric gas mask" @@ -522,7 +497,6 @@ GLOBAL_LIST_INIT(clown_mask_options, list( flags_cover = MASKCOVERSMOUTH resistance_flags = FLAMMABLE has_fov = FALSE - fishing_modifier = 0 /obj/item/clothing/mask/gas/driscoll name = "driscoll mask" @@ -531,4 +505,3 @@ GLOBAL_LIST_INIT(clown_mask_options, list( flags_inv = HIDEFACIALHAIR w_class = WEIGHT_CLASS_NORMAL inhand_icon_state = null - fishing_modifier = 0 diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm index c5e538d44468e..cbfbc166cbcab 100644 --- a/code/modules/clothing/masks/hailer.dm +++ b/code/modules/clothing/masks/hailer.dm @@ -57,7 +57,6 @@ GLOBAL_LIST_INIT(hailer_phrases, list( visor_flags_cover = MASKCOVERSMOUTH tint = 0 has_fov = FALSE - fishing_modifier = 0 unique_death = 'sound/voice/sec_death.ogg' COOLDOWN_DECLARE(hailer_cooldown) ///Decides the phrases available for use; defines used are the last index of a category of available phrases @@ -87,7 +86,6 @@ GLOBAL_LIST_INIT(hailer_phrases, list( visor_flags_inv = 0 flags_cover = MASKCOVERSMOUTH | MASKCOVERSEYES | PEPPERPROOF visor_flags_cover = MASKCOVERSMOUTH | MASKCOVERSEYES | PEPPERPROOF - fishing_modifier = 2 /obj/item/clothing/mask/gas/sechailer/swat/spacepol name = "spacepol mask" @@ -105,7 +103,6 @@ GLOBAL_LIST_INIT(hailer_phrases, list( slot_flags = null aggressiveness = AGGR_GOOD_COP // Borgs are nicecurity! actions_types = list(/datum/action/item_action/halt) - fishing_modifier = 0 /obj/item/clothing/mask/gas/sechailer/screwdriver_act(mob/living/user, obj/item/I) . = ..() diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 7e16bd3bdab83..839f3430cd9cc 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -213,10 +213,6 @@ desc = "An outdated medical apparatus for listening to the sounds of the human body. It also makes you look like you know what you're doing." icon_state = "stethoscope" -/obj/item/clothing/neck/stethoscope/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) //FISH DOCTOR?! - /obj/item/clothing/neck/stethoscope/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] puts \the [src] to [user.p_their()] chest! It looks like [user.p_they()] won't hear much!")) return OXYLOSS @@ -456,10 +452,6 @@ /obj/item/clothing/neck/petcollar/attack_self(mob/user) tagname = sanitize_name(tgui_input_text(user, "Would you like to change the name on the tag?", "Pet Naming", "Spot", MAX_NAME_LEN)) - if (!tagname || !length(tagname)) - name = initial(name) - tagname = null - return name = "[initial(name)] - [tagname]" ////////////// diff --git a/code/modules/clothing/outfits/event.dm b/code/modules/clothing/outfits/event.dm index b99ea6f526202..fa07b3297b285 100644 --- a/code/modules/clothing/outfits/event.dm +++ b/code/modules/clothing/outfits/event.dm @@ -18,7 +18,7 @@ if(visualsOnly) return user.fully_replace_character_name(user.real_name, "Santa Claus") - user.mind.set_assigned_role(SSjob.get_job_type(/datum/job/santa)) + user.mind.set_assigned_role(SSjob.GetJobType(/datum/job/santa)) user.mind.special_role = ROLE_SANTA user.hairstyle = "Long Hair 3" diff --git a/code/modules/clothing/shoes/boots.dm b/code/modules/clothing/shoes/boots.dm index 68a7b1bb0aefd..03f174aa43c31 100644 --- a/code/modules/clothing/shoes/boots.dm +++ b/code/modules/clothing/shoes/boots.dm @@ -72,10 +72,6 @@ icon_state = "ftc_boots" inhand_icon_state = null -/obj/item/clothing/shoes/jackboots/floortile/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) //tacticool - /obj/item/clothing/shoes/winterboots name = "winter boots" desc = "Boots lined with 'synthetic' animal fur." @@ -179,10 +175,6 @@ icon_state = "pirateboots" inhand_icon_state = null -/obj/item/clothing/shoes/pirate/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) - /obj/item/clothing/shoes/pirate/armored armor_type = /datum/armor/shoes_pirate strip_delay = 40 diff --git a/code/modules/clothing/shoes/clown.dm b/code/modules/clothing/shoes/clown.dm index c999a242a190f..699d6fa627bf5 100644 --- a/code/modules/clothing/shoes/clown.dm +++ b/code/modules/clothing/shoes/clown.dm @@ -15,7 +15,6 @@ create_storage(storage_type = /datum/storage/pockets/shoes/clown) LoadComponent(/datum/component/squeak, squeak_sound, 50, falloff_exponent = 20) //die off quick please AddElement(/datum/element/swabable, CELL_LINE_TABLE_CLOWN, CELL_VIRUS_TABLE_GENERIC, rand(2,3), 0) - AddComponent(/datum/component/adjust_fishing_difficulty, 3) //Goofy /obj/item/clothing/shoes/clown_shoes/equipped(mob/living/user, slot) . = ..() diff --git a/code/modules/clothing/shoes/costume.dm b/code/modules/clothing/shoes/costume.dm index 4f2287f40d278..bf8000d9a0800 100644 --- a/code/modules/clothing/shoes/costume.dm +++ b/code/modules/clothing/shoes/costume.dm @@ -45,7 +45,6 @@ /obj/item/clothing/shoes/bronze/Initialize(mapload) . = ..() AddComponent(/datum/component/squeak, list('sound/machines/clockcult/integration_cog_install.ogg' = 1, 'sound/magic/clockwork/fellowship_armory.ogg' = 1), 50, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) - AddComponent(/datum/component/adjust_fishing_difficulty, 4) /obj/item/clothing/shoes/cookflops desc = "All this talk of antags, greytiding, and griefing... I just wanna grill for god's sake!" @@ -129,7 +128,6 @@ create_storage(storage_type = /datum/storage/pockets/shoes) LoadComponent(/datum/component/squeak, list('sound/effects/quack.ogg' = 1), 50, falloff_exponent = 20) - AddComponent(/datum/component/adjust_fishing_difficulty, -6) //deploy tactical duckling lure /obj/item/clothing/shoes/ducky_shoes/equipped(mob/living/user, slot) . = ..() diff --git a/code/modules/clothing/shoes/galoshes.dm b/code/modules/clothing/shoes/galoshes.dm index d42b8ffddb388..e743db6b7424c 100644 --- a/code/modules/clothing/shoes/galoshes.dm +++ b/code/modules/clothing/shoes/galoshes.dm @@ -12,18 +12,11 @@ can_be_bloody = FALSE custom_price = PAYCHECK_CREW * 3 can_be_tied = FALSE - ///How much these boots affect fishing difficulty - var/fishing_modifier = -3 - -/obj/item/clothing/shoes/galoshes/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier) /obj/item/clothing/shoes/galoshes/dry name = "absorbent galoshes" desc = "A pair of purple rubber boots, designed to prevent slipping on wet surfaces while also drying them." icon_state = "galoshes_dry" - fishing_modifier = -6 /datum/armor/shoes_galoshes bio = 100 diff --git a/code/modules/clothing/shoes/laceup.dm b/code/modules/clothing/shoes/laceup.dm index 808bf22f5080d..7ee348ea6c434 100644 --- a/code/modules/clothing/shoes/laceup.dm +++ b/code/modules/clothing/shoes/laceup.dm @@ -3,7 +3,3 @@ desc = "The height of fashion, and they're pre-polished!" icon_state = "laceups" equip_delay_other = 50 - -/obj/item/clothing/shoes/laceup/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 3) //You aren't going to fish with these are you? diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 38d4770244abd..2ae13924dedc9 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -20,30 +20,18 @@ var/slowdown_active = 2 /// A list of traits we apply when we get activated var/list/active_traits = list(TRAIT_NO_SLIP_WATER, TRAIT_NO_SLIP_ICE, TRAIT_NO_SLIP_SLIDE, TRAIT_NEGATES_GRAVITY) - /// How much do these boots affect fishing when active - var/magpulse_fishing_modifier = 8 - /// How much do these boots affect fishing when not active - var/fishing_modifier = 4 /obj/item/clothing/shoes/magboots/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_updates_onmob) RegisterSignal(src, COMSIG_SPEED_POTION_APPLIED, PROC_REF(on_speed_potioned)) - if(fishing_modifier) - AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier) /// Signal handler for [COMSIG_SPEED_POTION_APPLIED]. Speed potion removes the active slowdown /obj/item/clothing/shoes/magboots/proc/on_speed_potioned(datum/source) SIGNAL_HANDLER - // Don't need to touch the actual slowdown here, since the speed potion does it for us slowdown_active = 0 - - if(magpulse && magpulse_fishing_modifier) - qdel(GetComponent(/datum/component/adjust_fishing_difficulty)) - if(fishing_modifier) - AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier) - magpulse_fishing_modifier = fishing_modifier + // Don't need to touch the actual slowdown here, since the speed potion does it for us /obj/item/clothing/shoes/magboots/verb/toggle() set name = "Toggle Magboots" @@ -59,15 +47,7 @@ if(magpulse) attach_clothing_traits(active_traits) slowdown += slowdown_active - if(magpulse_fishing_modifier) - AddComponent(/datum/component/adjust_fishing_difficulty, magpulse_fishing_modifier) - else if(magpulse_fishing_modifier != fishing_modifier) - qdel(GetComponent(/datum/component/adjust_fishing_difficulty)) else - if(fishing_modifier) - AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier) - else if(magpulse_fishing_modifier != fishing_modifier) - qdel(GetComponent(/datum/component/adjust_fishing_difficulty)) detach_clothing_traits(active_traits) slowdown = max(initial(slowdown), slowdown - slowdown_active) // Just in case, for speed pot shenanigans @@ -91,13 +71,9 @@ base_icon_state = "advmag" slowdown_active = SHOES_SLOWDOWN // ZERO active slowdown resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF - magpulse_fishing_modifier = 3 - fishing_modifier = 0 /obj/item/clothing/shoes/magboots/syndie name = "blood-red magboots" desc = "Reverse-engineered magnetic boots that have a heavy magnetic pull. Property of Gorlex Marauders." icon_state = "syndiemag0" base_icon_state = "syndiemag" - magpulse_fishing_modifier = 6 - fishing_modifier = 3 diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index 124dfcee41c0b..caf84d9562dcb 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -25,13 +25,6 @@ resistance_flags = NONE dog_fashion = null slowdown = 0.5 - ///How much this helmet affects fishing difficulty - var/fishing_modifier = 3 - -/obj/item/clothing/head/helmet/space/Initialize(mapload) - . = ..() - if(fishing_modifier) - AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier) /datum/armor/helmet_space bio = 100 @@ -77,8 +70,6 @@ var/thermal_on = FALSE /// If this is FALSE the batery status UI will be disabled. This is used for suits that don't use bateries like the changeling's flesh suit mutation. var/show_hud = TRUE - ///How much this suit affects fishing difficulty - var/fishing_modifier = 5 /datum/armor/suit_space bio = 100 @@ -90,9 +81,6 @@ if(ispath(cell)) cell = new cell(src) - if(fishing_modifier) - AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier) - /// Start Processing on the space suit when it is worn to heat the wearer /obj/item/clothing/suit/space/equipped(mob/living/user, slot) . = ..() diff --git a/code/modules/clothing/spacesuits/freedom.dm b/code/modules/clothing/spacesuits/freedom.dm index 085b9c8deb7c2..b0a08f4cc7367 100644 --- a/code/modules/clothing/spacesuits/freedom.dm +++ b/code/modules/clothing/spacesuits/freedom.dm @@ -9,7 +9,6 @@ strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = ACID_PROOF | FIRE_PROOF - fishing_modifier = 0 /datum/armor/space_freedom melee = 20 @@ -32,4 +31,3 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = ACID_PROOF | FIRE_PROOF slowdown = 0 - fishing_modifier = 0 diff --git a/code/modules/clothing/spacesuits/pirate.dm b/code/modules/clothing/spacesuits/pirate.dm index 8ead0aeaa6619..73feec525c548 100644 --- a/code/modules/clothing/spacesuits/pirate.dm +++ b/code/modules/clothing/spacesuits/pirate.dm @@ -7,7 +7,6 @@ armor_type = /datum/armor/space_pirate strip_delay = 40 equip_delay_other = 20 - fishing_modifier = -2 /datum/armor/space_pirate melee = 30 @@ -32,7 +31,6 @@ armor_type = /datum/armor/space_pirate strip_delay = 40 equip_delay_other = 20 - fishing_modifier = -3 /obj/item/clothing/head/helmet/space/pirate/tophat name = "designer pirate helmet" @@ -41,7 +39,7 @@ /obj/item/clothing/suit/space/pirate/silverscale name = "designer pirate suit" - desc = "A specially-made Cybersun branded space suit; the fine plastisilk exterior is woven from the cocoons of black-market Lümlan mothroaches \ - and the trim is lined with the ivory of the critically endangered Zanzibarian dwarf elephant. Baby seal leather boots sold separately." + desc = "A specially-made Cybersun branded space suit; the fine plastisilk exterior is woven from the coccons of black-market Lümlan mothroaches \ + and the trim is lined with the ivory of the critically endagered Zanzibarian dwarf elephant. Baby seal leather boots sold seperately." inhand_icon_state = "syndicate-black" icon_state = "syndicate-black-white" diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 8faaf58b53ed4..380cd0cf3fb53 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -8,7 +8,6 @@ resistance_flags = FIRE_PROOF icon_state = "plasmaman_suit" inhand_icon_state = "plasmaman_suit" - fishing_modifier = 0 var/next_extinguish = 0 var/extinguish_cooldown = 100 var/extinguishes_left = 10 @@ -58,7 +57,6 @@ light_power = 0.8 light_color = "#ffcc99" light_on = FALSE - fishing_modifier = 0 var/helmet_on = FALSE var/smile = FALSE var/smile_color = COLOR_RED @@ -70,7 +68,6 @@ 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 @@ -81,6 +78,7 @@ . = ..() visor_toggling() update_appearance() + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) /obj/item/clothing/head/helmet/space/plasmaman/examine() . = ..() @@ -196,13 +194,13 @@ update_item_action_buttons() -/obj/item/clothing/head/helmet/space/plasmaman/on_saboteur(datum/source, disrupt_duration) - . = ..() +/obj/item/clothing/head/helmet/space/plasmaman/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER if(!helmet_on) - return FALSE + return helmet_on = FALSE update_appearance() - return TRUE + return COMSIG_SABOTEUR_SUCCESS /obj/item/clothing/head/helmet/space/plasmaman/attack_hand_secondary(mob/user) ..() diff --git a/code/modules/clothing/spacesuits/santa.dm b/code/modules/clothing/spacesuits/santa.dm index 08f01cc1869bb..f6bd1657606c5 100644 --- a/code/modules/clothing/spacesuits/santa.dm +++ b/code/modules/clothing/spacesuits/santa.dm @@ -8,7 +8,6 @@ flags_cover = HEADCOVERSEYES dog_fashion = /datum/dog_fashion/head/santa slowdown = 0 - fishing_modifier = 0 /obj/item/clothing/head/helmet/space/santahat/beardless icon = 'icons/obj/clothing/head/costume.dmi' @@ -27,4 +26,3 @@ inhand_icon_state = "santa" slowdown = 0 allowed = list(/obj/item) //for stuffing exta special presents - fishing_modifier = 0 diff --git a/code/modules/clothing/spacesuits/specialops.dm b/code/modules/clothing/spacesuits/specialops.dm index dbe02400aa664..caaa32cc24be2 100644 --- a/code/modules/clothing/spacesuits/specialops.dm +++ b/code/modules/clothing/spacesuits/specialops.dm @@ -13,7 +13,6 @@ strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF - fishing_modifier = 0 /datum/armor/space_beret melee = 80 @@ -42,7 +41,6 @@ strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF - fishing_modifier = 0 /datum/armor/space_officer melee = 80 diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index efa23e1a06862..6e56107173c46 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -294,10 +294,6 @@ equip_delay_other = 60 clothing_traits = list(TRAIT_BRAWLING_KNOCKDOWN_BLOCKED) -/obj/item/clothing/suit/armor/riot/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 5) - /datum/armor/armor_riot melee = 50 bullet = 10 @@ -417,10 +413,6 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS clothing_traits = list(TRAIT_BRAWLING_KNOCKDOWN_BLOCKED) -/obj/item/clothing/suit/armor/swat/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 5) - //All of the armor below is mostly unused @@ -562,10 +554,6 @@ 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 @@ -707,10 +695,6 @@ /obj/item/gun/ballistic/bow ) -/obj/item/clothing/suit/armor/vest/military/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 5) - /datum/armor/military melee = 45 bullet = 25 diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index 4fa5eeb5a90f7..4ddfd31631d5c 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -16,7 +16,6 @@ . = ..() if(flags_inv & HIDEFACE) AddComponent(/datum/component/clothing_fov_visor, FOV_90_DEGREES) - AddComponent(/datum/component/adjust_fishing_difficulty, 6) /datum/armor/head_bio_hood bio = 100 @@ -41,10 +40,6 @@ equip_delay_other = 70 resistance_flags = ACID_PROOF -/obj/item/clothing/suit/bio_suit/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 6) - //Standard biosuit, orange stripe /datum/armor/suit_bio_suit bio = 100 diff --git a/code/modules/clothing/suits/costume.dm b/code/modules/clothing/suits/costume.dm index a720f49b9383f..566ca5557f728 100644 --- a/code/modules/clothing/suits/costume.dm +++ b/code/modules/clothing/suits/costume.dm @@ -263,10 +263,6 @@ allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/gun/ballistic/rifle/boltaction/harpoon) hoodtype = /obj/item/clothing/head/hooded/carp_hood -/obj/item/clothing/suit/hooded/carp_costume/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) - /obj/item/clothing/head/hooded/carp_hood name = "carp hood" desc = "A hood attached to a carp costume." @@ -278,10 +274,6 @@ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT flags_inv = HIDEHAIR|HIDEEARS -/obj/item/clothing/head/hooded/carp_hood/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) - /obj/item/clothing/head/hooded/carp_hood/equipped(mob/living/carbon/human/user, slot) ..() if (slot & ITEM_SLOT_HEAD) @@ -402,10 +394,6 @@ clothing_flags = THICKMATERIAL hoodtype = /obj/item/clothing/head/hooded/shark_hood -/obj/item/clothing/suit/hooded/shark_costume/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) - /obj/item/clothing/head/hooded/shark_hood name = "shark hood" desc = "A hood attached to a shark costume." @@ -416,10 +404,6 @@ clothing_flags = THICKMATERIAL flags_inv = HIDEHAIR|HIDEEARS -/obj/item/clothing/head/hooded/shark_hood/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) - /obj/item/clothing/suit/hooded/shork_costume // Oh God Why name = "shork costume" desc = "Why would you ever do this?" @@ -431,10 +415,6 @@ clothing_flags = THICKMATERIAL hoodtype = /obj/item/clothing/head/hooded/shork_hood -/obj/item/clothing/suit/hooded/shork_costume/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 2) - /obj/item/clothing/head/hooded/shork_hood name = "shork hood" desc = "A hood attached to a shork costume." @@ -445,10 +425,6 @@ clothing_flags = THICKMATERIAL flags_inv = HIDEHAIR|HIDEEARS -/obj/item/clothing/head/hooded/shork_hood/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 3) - /obj/item/clothing/suit/hooded/bloated_human //OH MY GOD WHAT HAVE YOU DONE!?!?!? name = "bloated human suit" desc = "A horribly bloated suit made from human skins." @@ -613,10 +589,6 @@ flags_1 = IS_PLAYER_COLORABLE_1 species_exception = list(/datum/species/golem) -/obj/item/clothing/suit/costume/hawaiian/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) - /obj/item/clothing/suit/costume/football_armor name = "football protective gear" desc = "Given to members of the football team!" diff --git a/code/modules/clothing/suits/ethereal.dm b/code/modules/clothing/suits/ethereal.dm index 1c86ca34094f3..6c53329a13e7d 100644 --- a/code/modules/clothing/suits/ethereal.dm +++ b/code/modules/clothing/suits/ethereal.dm @@ -14,7 +14,6 @@ /obj/item/clothing/suit/hooded/ethereal_raincoat/Initialize(mapload) . = ..() update_icon(UPDATE_OVERLAYS) - AddComponent(/datum/component/adjust_fishing_difficulty, -3) /obj/item/clothing/suit/hooded/ethereal_raincoat/worn_overlays(mutable_appearance/standing, isinhands, icon_file) . = ..() @@ -29,11 +28,6 @@ name = "trailwarden oilcoat" desc = "A masterfully handcrafted oilslick coat, supposedly makes for excellent camouflage among Sprout's vegetation. You can hear a faint electrical buzz emanating from the luminescent pattern." greyscale_colors = "#32a87d" - hoodtype = /obj/item/clothing/head/hooded/ethereal_rainhood/trailwarden - -/obj/item/clothing/suit/hooded/ethereal_raincoat/trailwarden/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -5) /obj/item/clothing/suit/hooded/ethereal_raincoat/trailwarden/equipped(mob/living/user, slot) . = ..() @@ -51,9 +45,3 @@ worn_icon = 'icons/mob/clothing/head/ethereal.dmi' body_parts_covered = HEAD flags_inv = HIDEHAIR|HIDEEARS|HIDEFACIALHAIR - -/obj/item/clothing/head/hooded/ethereal_rainhood/trailwarden - -/obj/item/clothing/head/hooded/ethereal_rainhood/trailwarden/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -4) diff --git a/code/modules/clothing/suits/ghostsheet.dm b/code/modules/clothing/suits/ghostsheet.dm index 965adc9b7e2ff..65213fd176dba 100644 --- a/code/modules/clothing/suits/ghostsheet.dm +++ b/code/modules/clothing/suits/ghostsheet.dm @@ -16,7 +16,6 @@ . = ..() if(check_holidays(HALLOWEEN)) update_icon(UPDATE_OVERLAYS) - AddComponent(/datum/component/adjust_fishing_difficulty, 8) /obj/item/clothing/suit/costume/ghost_sheet/worn_overlays(mutable_appearance/standing, isinhands, icon_file) . = ..() diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 2ba150ab692ee..7e6bdde01cdfd 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -52,10 +52,6 @@ greyscale_colors = "#313c6e" flags_1 = IS_PLAYER_COLORABLE_1 -/obj/item/clothing/suit/apron/overalls/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) - //Captain /obj/item/clothing/suit/jacket/capjacket name = "captain's parade jacket" @@ -353,10 +349,6 @@ /obj/item/tank/internals/emergency_oxygen, ) -/obj/item/clothing/suit/apron/surgical/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) // FISH DOCTOR?! - //Curator /obj/item/clothing/suit/jacket/curator name = "treasure hunter's coat" diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 954fb9342e3ca..e5cda21a78a77 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -38,10 +38,6 @@ icon_state = "labcoat_cmo" inhand_icon_state = null -/obj/item/clothing/suit/toggle/labcoat/cmo/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) //FISH DOCTOR?! - /datum/armor/toggle_labcoat bio = 50 fire = 50 @@ -59,10 +55,6 @@ icon_state = "labcoat_paramedic" inhand_icon_state = null -/obj/item/clothing/suit/toggle/labcoat/paramedic/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) //FISH DOCTOR?! - /obj/item/clothing/suit/toggle/labcoat/mad name = "\proper The Mad's labcoat" desc = "It makes you look capable of konking someone on the noggin and shooting them into space." diff --git a/code/modules/clothing/suits/moth.dm b/code/modules/clothing/suits/moth.dm index 076a0dd0b3c9a..dd0a7f016ac17 100644 --- a/code/modules/clothing/suits/moth.dm +++ b/code/modules/clothing/suits/moth.dm @@ -16,7 +16,7 @@ /obj/item/clothing/suit/mothcoat/original/Initialize(mapload) . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) + create_storage(storage_type = /datum/storage/pockets) /obj/item/clothing/suit/mothcoat/winter diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index bb42fb1ed3975..1541c66a333b6 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -39,10 +39,6 @@ equip_delay_other = 60 resistance_flags = FIRE_PROOF -/obj/item/clothing/suit/utility/fire/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 7) - /datum/armor/utility_fire melee = 15 bullet = 5 @@ -108,7 +104,6 @@ . = ..() if(flags_inv & HIDEFACE) AddComponent(/datum/component/clothing_fov_visor, FOV_90_DEGREES) - AddComponent(/datum/component/adjust_fishing_difficulty, 8) /datum/armor/utility_bomb_hood melee = 20 @@ -138,10 +133,6 @@ equip_delay_other = 70 resistance_flags = NONE -/obj/item/clothing/suit/utility/bomb_suit/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 8) - /datum/armor/utility_bomb_suit melee = 20 laser = 20 @@ -188,7 +179,6 @@ . = ..() if(flags_inv & HIDEFACE) AddComponent(/datum/component/clothing_fov_visor, FOV_90_DEGREES) - AddComponent(/datum/component/adjust_fishing_difficulty, 7) /datum/armor/utility_radiation bio = 60 @@ -222,4 +212,3 @@ /obj/item/clothing/suit/utility/radiation/Initialize(mapload) . = ..() AddElement(/datum/element/radiation_protected_clothing) - AddComponent(/datum/component/adjust_fishing_difficulty, 7) diff --git a/code/modules/clothing/suits/wintercoats.dm b/code/modules/clothing/suits/wintercoats.dm index 4636054ee3e6b..dcc33fb65376b 100644 --- a/code/modules/clothing/suits/wintercoats.dm +++ b/code/modules/clothing/suits/wintercoats.dm @@ -221,7 +221,16 @@ 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 = /obj/item/clothing/suit/apron::allowed + 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, + ) 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 b590984cbc7cb..53026e974bf63 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -11,12 +11,6 @@ clothing_flags = SNUG_FIT | CASTING_CLOTHES resistance_flags = FIRE_PROOF | ACID_PROOF dog_fashion = /datum/dog_fashion/head/blue_wizard - ///How much this hat affects fishing difficulty - var/fishing_modifier = -4 - -/obj/item/clothing/head/wizard/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier) //A wizard always practices his casting (ba dum tsh) /datum/armor/head_wizard melee = 30 @@ -54,7 +48,6 @@ armor_type = /datum/armor/none resistance_flags = FLAMMABLE dog_fashion = /datum/dog_fashion/head/blue_wizard - fishing_modifier = -1 /obj/item/clothing/head/wizard/chanterelle name = "chanterelle hat" @@ -121,12 +114,6 @@ equip_delay_other = 50 clothing_flags = CASTING_CLOTHES resistance_flags = FIRE_PROOF | ACID_PROOF - ///How much this robe affects fishing difficulty - var/fishing_modifier = -6 - -/obj/item/clothing/suit/wizrobe/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier) //A wizard always practices his casting (ba dum tsh) /datum/armor/suit_wizrobe melee = 30 @@ -194,20 +181,17 @@ inhand_icon_state = "wizrobe" armor_type = /datum/armor/none resistance_flags = FLAMMABLE - fishing_modifier = -2 /obj/item/clothing/head/wizard/marisa/fake name = "witch hat" armor_type = /datum/armor/none resistance_flags = FLAMMABLE - fishing_modifier = -1 /obj/item/clothing/head/wizard/tape/fake name = "tape hat" desc = "A hat designed exclusively from duct tape. You can barely see." armor_type = /datum/armor/none resistance_flags = FLAMMABLE - fishing_modifier = -1 /obj/item/clothing/suit/wizrobe/marisa/fake name = "witch robe" @@ -216,14 +200,12 @@ inhand_icon_state = null armor_type = /datum/armor/none resistance_flags = FLAMMABLE - fishing_modifier = -2 /obj/item/clothing/suit/wizrobe/tape/fake name = "tape robe" desc = "An outfit designed exclusively from duct tape. It was hard to put on." armor_type = /datum/armor/none resistance_flags = FLAMMABLE - fishing_modifier = -2 /obj/item/clothing/suit/wizrobe/paper name = "papier-mache robe" // no non-latin characters! @@ -240,8 +222,21 @@ icon_state = "durathread-fake" inhand_icon_state = null armor_type = /datum/armor/robe_durathread - allowed = /obj/item/clothing/suit/apron::allowed - fishing_modifier = -4 + 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, + ) /datum/armor/robe_durathread melee = 15 diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 9212f5e431ff6..fa7813f0f4695 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -108,7 +108,11 @@ . += accessory_overlay /obj/item/clothing/under/attackby(obj/item/attacking_item, mob/user, params) - if(repair_sensors(attacking_item, user)) + if(has_sensor == BROKEN_SENSORS && istype(attacking_item, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/cabling = attacking_item + to_chat(user, span_notice("You repair the suit sensors on [src] with [cabling].")) + cabling.use(1) + has_sensor = HAS_SENSORS return TRUE if(istype(attacking_item, /obj/item/clothing/accessory)) @@ -127,11 +131,35 @@ /obj/item/clothing/under/update_clothes_damaged_state(damaged_state = CLOTHING_DAMAGED) . = ..() if(damaged_state == CLOTHING_SHREDDED && has_sensor > NO_SENSORS) - break_sensors() + has_sensor = BROKEN_SENSORS else if(damaged_state == CLOTHING_PRISTINE && has_sensor == BROKEN_SENSORS) - repair_sensors(cable_required = FALSE) + has_sensor = HAS_SENSORS update_appearance() +/obj/item/clothing/under/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + if(has_sensor == NO_SENSORS || has_sensor == BROKEN_SENSORS) + return + + if(severity <= EMP_HEAVY) + has_sensor = BROKEN_SENSORS + if(ismob(loc)) + var/mob/M = loc + to_chat(M,span_warning("[src]'s sensors short out!")) + + else + sensor_mode = pick(SENSOR_OFF, SENSOR_OFF, SENSOR_OFF, SENSOR_LIVING, SENSOR_LIVING, SENSOR_VITALS, SENSOR_VITALS, SENSOR_COORDS) + if(ismob(loc)) + var/mob/M = loc + to_chat(M,span_warning("The sensors on the [src] change rapidly!")) + + if(ishuman(loc)) + var/mob/living/carbon/human/ooman = loc + if(ooman.w_uniform == src) + ooman.update_suit_sensors() + /obj/item/clothing/under/visual_equipped(mob/user, slot) . = ..() if(adjusted == ALT_STYLE) @@ -153,68 +181,13 @@ freshly_laundered = FALSE user.add_mood_event("fresh_laundry", /datum/mood_event/fresh_laundry) -// Start suit sensor handling - -/// Change the suit sensor state to broken and update the mob's status on the global sensor list -/obj/item/clothing/under/proc/break_sensors() - if(has_sensor == BROKEN_SENSORS || has_sensor == NO_SENSORS) - return - - visible_message(span_warning("[src]'s medical sensors short out!"), blind_message = span_warning("The [src] makes an electronic sizzling sound!"), vision_distance = COMBAT_MESSAGE_RANGE) - has_sensor = BROKEN_SENSORS - sensor_malfunction() - update_wearer_status() - -/** - * Repair the suit sensors and update the mob's status on the global sensor list. - * Can be called either through player action such as repairing with coil, or as part of a general fixing proc - * - * Arguments: - * * attacking_item - the item being used for the repair, if any - * * user - mob that's doing the repair - * * cable_required - set to FALSE to bypass consuming cable coil - */ -/obj/item/clothing/under/proc/repair_sensors(obj/item/attacking_item, mob/user, cable_required = TRUE) - if(has_sensor != BROKEN_SENSORS) - return - - if(cable_required) - if(!istype(attacking_item, /obj/item/stack/cable_coil)) - return - var/obj/item/stack/cable_coil/cabling = attacking_item - if(!cabling.use(1)) - return - cabling.visible_message(span_notice("[user] repairs the suit sensors on [src] with [cabling].")) - - playsound(source = src, soundin = 'sound/effects/sparks4.ogg', vol = 100, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE, ignore_walls = FALSE) - has_sensor = HAS_SENSORS - update_wearer_status() - - return TRUE - -/// If the item is being worn, a gentle reminder every 3-5 minutes that the sensors are broken -/obj/item/clothing/under/proc/sensor_malfunction() - if(!QDELETED(src) && has_sensor == BROKEN_SENSORS && ishuman(loc)) - do_sparks(number = 2, cardinal_only = FALSE, source = src) - addtimer(CALLBACK(src, PROC_REF(sensor_malfunction)), rand(BROKEN_SPARKS_MIN, BROKEN_SPARKS_MAX * 0.5), TIMER_UNIQUE | TIMER_NO_HASH_WAIT) - -/// If the item is being worn, update the mob's status on the global sensor list -/obj/item/clothing/under/proc/update_wearer_status() - if(!ishuman(loc)) - return - - var/mob/living/carbon/human/ooman = loc - ooman.update_suit_sensors() - ooman.med_hud_set_status() - /mob/living/carbon/human/update_suit_sensors() . = ..() update_sensor_list() -/// Adds or removes a mob from the global suit sensors list based on sensor status and mode /mob/living/carbon/human/proc/update_sensor_list() - var/obj/item/clothing/under/uniform = w_uniform - if(istype(uniform) && uniform.has_sensor > NO_SENSORS && uniform.sensor_mode) + var/obj/item/clothing/under/U = w_uniform + if(istype(U) && U.has_sensor > NO_SENSORS && U.sensor_mode) GLOB.suit_sensors_list |= src else GLOB.suit_sensors_list -= src @@ -222,46 +195,6 @@ /mob/living/carbon/human/dummy/update_sensor_list() return -/obj/item/clothing/under/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - if(has_sensor == NO_SENSORS || has_sensor == BROKEN_SENSORS) - return - - if(severity <= EMP_HEAVY) - break_sensors() - - else - sensor_mode = pick(SENSOR_OFF, SENSOR_OFF, SENSOR_OFF, SENSOR_LIVING, SENSOR_LIVING, SENSOR_VITALS, SENSOR_VITALS, SENSOR_COORDS) - playsound(source = src, soundin = 'sound/effects/sparks3.ogg', vol = 75, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE, ignore_walls = FALSE) - visible_message(span_warning("The [src]'s medical sensors flash and change rapidly!"), blind_message = span_warning("The [src] makes an electronic sizzling sound!"), vision_distance = COMBAT_MESSAGE_RANGE) - - 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 @@ -357,7 +290,7 @@ if(can_adjust) . += "Alt-click on [src] to wear it [adjusted == ALT_STYLE ? "normally" : "casually"]." if(has_sensor == BROKEN_SENSORS) - . += span_warning("The medical sensors appear to be shorted out. You could repair it with some cabling.") + . += "Its sensors appear to be shorted out. You could repair it with some cabling." else if(has_sensor > NO_SENSORS) switch(sensor_mode) if(SENSOR_OFF) @@ -408,7 +341,10 @@ if(SENSOR_COORDS) to_chat(user_mob, span_notice("Your suit will now report your exact vital lifesigns as well as your coordinate position.")) - update_wearer_status() + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + if(H.w_uniform == src) + H.update_suit_sensors() /obj/item/clothing/under/item_ctrl_click(mob/user) if(!can_toggle_sensors(user)) @@ -416,7 +352,6 @@ sensor_mode = SENSOR_COORDS balloon_alert(user, "set to tracking") - update_wearer_status() return CLICK_ACTION_SUCCESS /// Checks if the toggler is allowed to toggle suit sensors currently diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm index b43196c1628e2..cc66e9d406a57 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_length = MAX_NAME_LEN) + journalist_name = tgui_input_text(user, "What is your name?", "Journalist Name", "[user.name]", MAX_NAME_LEN) if(!press_name) - press_name = tgui_input_text(user, "For what organization you work?", "Press Name", "Nanotrasen", max_length = MAX_CHARTER_LEN) + press_name = tgui_input_text(user, "For what organization you work?", "Press Name", "Nanotrasen", 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 0d5786a20e94b..ad55b26fa89fd 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 c8550dd0ff6ba..ddf325a2201ab 100644 --- a/code/modules/clothing/under/costume.dm +++ b/code/modules/clothing/under/costume.dm @@ -417,7 +417,7 @@ can_adjust = FALSE /obj/item/clothing/under/costume/gi - name = "martial gi" + name = "Martial Artist 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 @@ -434,13 +434,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 @@ -448,7 +448,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/jobs/civilian/curator.dm b/code/modules/clothing/under/jobs/civilian/curator.dm index f08657cee0754..8f40e623d8adf 100644 --- a/code/modules/clothing/under/jobs/civilian/curator.dm +++ b/code/modules/clothing/under/jobs/civilian/curator.dm @@ -28,10 +28,6 @@ inhand_icon_state = null worn_icon = 'icons/mob/clothing/under/civilian.dmi' -/obj/item/clothing/under/rank/civilian/curator/treasure_hunter/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -3) - /obj/item/clothing/under/rank/civilian/curator/nasa name = "\improper NASA jumpsuit" desc = "It has a NASA logo on it and is made of space-proofed materials." diff --git a/code/modules/clothing/under/jobs/medical.dm b/code/modules/clothing/under/jobs/medical.dm index 2dea332408231..1574b64bbf066 100644 --- a/code/modules/clothing/under/jobs/medical.dm +++ b/code/modules/clothing/under/jobs/medical.dm @@ -44,10 +44,6 @@ icon_state = "scrubscmo" inhand_icon_state = "w_suit" -/obj/item/clothing/under/rank/medical/chief_medical_officer/scrubs/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) //FISH DOCTOR?! - /obj/item/clothing/under/rank/medical/chief_medical_officer/turtleneck name = "chief medical officer's turtleneck" desc = "A light blue turtleneck and tan khakis, for a chief medical officer with a superior sense of style." @@ -86,10 +82,6 @@ /obj/item/clothing/under/rank/medical/scrubs name = "medical scrubs" -/obj/item/clothing/under/rank/medical/scrubs/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) //FISH DOCTOR?! - /obj/item/clothing/under/rank/medical/scrubs/blue desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue." icon_state = "scrubsblue" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 588dd8efc2a68..81002bd8a9e2d 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 @@ -58,10 +58,6 @@ can_adjust = FALSE resistance_flags = FIRE_PROOF | ACID_PROOF -/obj/item/clothing/under/misc/adminsuit/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -15) - /datum/armor/clothing_under/adminsuit melee = 100 bullet = 100 diff --git a/code/modules/clothing/under/skirt_dress.dm b/code/modules/clothing/under/skirt_dress.dm index 30f74920ef9d6..638b754c2b83d 100644 --- a/code/modules/clothing/under/skirt_dress.dm +++ b/code/modules/clothing/under/skirt_dress.dm @@ -40,10 +40,6 @@ body_parts_covered = CHEST|GROIN|LEGS flags_inv = HIDESHOES -/obj/item/clothing/under/dress/wedding_dress/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 4) //You aren't going to fish with this are you? - /obj/item/clothing/under/dress/eveninggown name = "evening gown" desc = "Fancy dress for space bar singers." @@ -54,10 +50,6 @@ flags_1 = IS_PLAYER_COLORABLE_1 greyscale_colors = "#e11f1f" -/obj/item/clothing/under/dress/eveninggown/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 4) //You aren't going to fish with this are you? - /obj/item/clothing/under/dress/skirt name = "cardigan skirt" desc = "A nice skirt with a cute cardigan, very fancy!" diff --git a/code/modules/clothing/under/suits.dm b/code/modules/clothing/under/suits.dm index 98f41f407cab9..0dbf1880d7d2f 100644 --- a/code/modules/clothing/under/suits.dm +++ b/code/modules/clothing/under/suits.dm @@ -107,16 +107,8 @@ icon_state = "tuxedo" inhand_icon_state = null -/obj/item/clothing/under/suit/tuxedo/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, 4) //You aren't going to fish with this are you? - /obj/item/clothing/under/suit/carpskin name = "carpskin suit" desc = "An luxurious suit made with only the finest scales, perfect for conducting dodgy business deals." icon_state = "carpskin_suit" inhand_icon_state = null - -/obj/item/clothing/under/suit/carpskin/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm index e4653b1c9bd47..ff3061d3e5992 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -34,10 +34,6 @@ can_adjust = FALSE supports_variations_flags = NONE -/obj/item/clothing/under/syndicate/bloodred/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) //extra-tactical - /datum/armor/clothing_under/syndicate_bloodred melee = 10 bullet = 10 @@ -123,10 +119,6 @@ can_adjust = FALSE supports_variations_flags = NONE -/obj/item/clothing/under/syndicate/floortilecamo/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -4) //tacticool - /obj/item/clothing/under/syndicate/soviet name = "Ratnik 5 tracksuit" desc = "Badly translated labels tell you to clean this in Vodka. Great for squatting in." @@ -168,10 +160,6 @@ supports_variations_flags = NONE armor_type = /datum/armor/clothing_under/syndicate_scrubs -/obj/item/clothing/under/syndicate/scrubs/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -2) //FISH DOCTOR?! - /datum/armor/clothing_under/syndicate_scrubs melee = 10 bio = 50 diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm index 4c76534175a60..d31e204333b31 100644 --- a/code/modules/economy/account.dm +++ b/code/modules/economy/account.dm @@ -44,7 +44,6 @@ 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() @@ -72,22 +71,11 @@ 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 - -/** - * 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 - LAZYADD(SSeconomy.bank_accounts_by_job[new_job.type], src) + if(account_job) + LAZYADD(SSeconomy.bank_accounts_by_job[account_job.type], src) /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) @@ -95,15 +83,11 @@ 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 d064161c23249..72caf05e92b27 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, max_length = MAX_MESSAGE_LEN) + emote_param = tgui_input_text(ui.user, "Add params to the emote...", emote.message_param) 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/_event.dm b/code/modules/events/_event.dm index a1e8aef5b6c91..0a41f5ffb6c9a 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -15,7 +15,7 @@ var/earliest_start = 20 MINUTES //The earliest world.time that an event can start (round-duration in deciseconds) default: 20 mins var/min_players = 0 //The minimum amount of alive, non-AFK human players on server required to start the event. - var/occurrences = 0 //How many times this event has occurred + var/occurrences = 0 //How many times this event has occured var/max_occurrences = 20 //The maximum number of times this event can occur (naturally), it can still be forced. //By setting this to 0 you can effectively disable an event. @@ -143,7 +143,7 @@ Runs the event */ /datum/round_event_control/proc/run_event(random = FALSE, announce_chance_override = null, admin_forced = FALSE, event_cause) /* - * We clear our signals first so we don't cancel a wanted event by accident, + * We clear our signals first so we dont cancel a wanted event by accident, * the majority of time the admin will probably want to cancel a single midround spawned random events * and not multiple events called by others admins * * In the worst case scenario we can still recall a event which we cancelled by accident, which is much better then to have a unwanted event @@ -220,7 +220,7 @@ Runs the event SHOULD_CALL_PARENT(FALSE) return -///Announces the event name to deadchat, override this if what an event should show to deadchat is different to its event name. +///Annouces the event name to deadchat, override this if what an event should show to deadchat is different to its event name. /datum/round_event/proc/announce_deadchat(random, cause) deadchat_broadcast(" has just been[random ? " randomly" : ""] triggered[cause ? " by [cause]" : ""]!", "[control.name]", message_type=DEADCHAT_ANNOUNCEMENT) //STOP ASSUMING IT'S BADMINS! @@ -267,8 +267,8 @@ Runs the event -//Do not override this proc, instead use the appropriate procs. -//This proc will handle the calls to the appropriate procs. +//Do not override this proc, instead use the appropiate procs. +//This proc will handle the calls to the appropiate procs. /datum/round_event/process() SHOULD_NOT_OVERRIDE(TRUE) if(!processing) diff --git a/code/modules/events/ghost_role/fugitive_event.dm b/code/modules/events/ghost_role/fugitive_event.dm index f0e1a7c893a3e..9eb792a6f6ab3 100644 --- a/code/modules/events/ghost_role/fugitive_event.dm +++ b/code/modules/events/ghost_role/fugitive_event.dm @@ -72,7 +72,7 @@ player_mind.active = TRUE var/mob/living/carbon/human/S = new(landing_turf) player_mind.transfer_to(S) - player_mind.set_assigned_role(SSjob.get_job_type(/datum/job/fugitive)) + player_mind.set_assigned_role(SSjob.GetJobType(/datum/job/fugitive)) player_mind.special_role = ROLE_FUGITIVE player_mind.add_antag_datum(/datum/antagonist/fugitive) var/datum/antagonist/fugitive/fugitiveantag = player_mind.has_antag_datum(/datum/antagonist/fugitive) diff --git a/code/modules/events/ghost_role/morph_event.dm b/code/modules/events/ghost_role/morph_event.dm index 1b7af6361fdbb..21d4b07873d86 100644 --- a/code/modules/events/ghost_role/morph_event.dm +++ b/code/modules/events/ghost_role/morph_event.dm @@ -25,7 +25,7 @@ var/mob/living/basic/morph/corpus_accipientis = new(spawn_loc) player_mind.transfer_to(corpus_accipientis) - player_mind.set_assigned_role(SSjob.get_job_type(/datum/job/morph)) + player_mind.set_assigned_role(SSjob.GetJobType(/datum/job/morph)) player_mind.special_role = ROLE_MORPH player_mind.add_antag_datum(/datum/antagonist/morph) SEND_SOUND(corpus_accipientis, sound('sound/magic/mutate.ogg')) diff --git a/code/modules/events/ghost_role/nightmare.dm b/code/modules/events/ghost_role/nightmare.dm index 1fdebff0cd864..d30108d94b984 100644 --- a/code/modules/events/ghost_role/nightmare.dm +++ b/code/modules/events/ghost_role/nightmare.dm @@ -27,7 +27,7 @@ var/mob/living/carbon/human/S = new (spawn_loc) player_mind.transfer_to(S) - player_mind.set_assigned_role(SSjob.get_job_type(/datum/job/nightmare)) + player_mind.set_assigned_role(SSjob.GetJobType(/datum/job/nightmare)) player_mind.special_role = ROLE_NIGHTMARE player_mind.add_antag_datum(/datum/antagonist/nightmare) S.set_species(/datum/species/shadow/nightmare) diff --git a/code/modules/events/ghost_role/operative.dm b/code/modules/events/ghost_role/operative.dm index c7ad41d001d16..98cfe5ecad41e 100644 --- a/code/modules/events/ghost_role/operative.dm +++ b/code/modules/events/ghost_role/operative.dm @@ -22,7 +22,7 @@ operative.randomize_human_appearance(~RANDOMIZE_SPECIES) operative.dna.update_dna_identity() var/datum/mind/Mind = new /datum/mind(chosen_one.key) - Mind.set_assigned_role(SSjob.get_job_type(/datum/job/lone_operative)) + Mind.set_assigned_role(SSjob.GetJobType(/datum/job/lone_operative)) Mind.special_role = ROLE_LONE_OPERATIVE Mind.active = TRUE Mind.transfer_to(operative) diff --git a/code/modules/events/holiday/easter.dm b/code/modules/events/holiday/easter.dm index d10fb681cc5bd..40c7fda57c3c2 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/events/wizard/rpgtitles.dm b/code/modules/events/wizard/rpgtitles.dm index b78ae483ea687..9bb69a90f2cf4 100644 --- a/code/modules/events/wizard/rpgtitles.dm +++ b/code/modules/events/wizard/rpgtitles.dm @@ -38,7 +38,7 @@ GLOBAL_DATUM(rpgtitle_controller, /datum/rpgtitle_controller) /datum/rpgtitle_controller/proc/on_crewmember_join(datum/source, mob/living/new_crewmember, rank) SIGNAL_HANDLER - var/datum/job/job = SSjob.get_job(rank) + var/datum/job/job = SSjob.GetJob(rank) //we must prepare for the mother of all strings new_crewmember.maptext_height = max(new_crewmember.maptext_height, 32) diff --git a/code/modules/experisci/experiment/types/experiment.dm b/code/modules/experisci/experiment/types/experiment.dm index 358d795f68f59..add015622f621 100644 --- a/code/modules/experisci/experiment/types/experiment.dm +++ b/code/modules/experisci/experiment/types/experiment.dm @@ -99,9 +99,3 @@ experiment_handler.selected_experiment = null var/announcetext = experiment_handler.linked_web.complete_experiment(src) experiment_handler.announce_message_to_all(announcetext) - -/datum/experiment/proc/get_points_reward_text() - var/list/english_list_keys = list() - for(var/points_type in points_reward) - english_list_keys += "[points_reward[points_type]] [points_type]" - return "[english_list(english_list_keys)] points" diff --git a/code/modules/experisci/experiment/types/scanning_fish.dm b/code/modules/experisci/experiment/types/scanning_fish.dm index 3ea4f543687ea..f1c2263a84c7e 100644 --- a/code/modules/experisci/experiment/types/scanning_fish.dm +++ b/code/modules/experisci/experiment/types/scanning_fish.dm @@ -64,7 +64,7 @@ GLOBAL_LIST_EMPTY(scanned_fish_by_techweb) ///Only scannable fish will contribute towards the experiment. /datum/experiment/scanning/fish/final_contributing_index_checks(datum/component/experiment_handler/experiment_handler, obj/item/fish/target, typepath) - return target.fish_flags & FISH_FLAG_EXPERIMENT_SCANNABLE + return target.experisci_scannable /** * After a fish scanning experiment is done, more may be unlocked. If so, add them to the techweb diff --git a/code/modules/fishing/admin.dm b/code/modules/fishing/admin.dm index 46212f421283b..f4643201a7788 100644 --- a/code/modules/fishing/admin.dm +++ b/code/modules/fishing/admin.dm @@ -56,7 +56,7 @@ ADMIN_VERB(fishing_calculator, R_DEBUG, "Fishing Calculator", "A calculator... f var/list/info = list() info["result"] = result_type info["weight"] = modified_table[result_type] || 0 - info["difficulty"] = spot.calculate_difficulty(result_type, temporary_rod, user) + /datum/fishing_challenge::difficulty + info["difficulty"] = spot.calculate_difficulty(result_type,temporary_rod, user) info["count"] = spot.fish_counts[result_type] || "Infinite" result_table += list(info) current_table = result_table diff --git a/code/modules/fishing/aquarium/aquarium.dm b/code/modules/fishing/aquarium/aquarium.dm index a3becfe671860..0d2cd462128d4 100644 --- a/code/modules/fishing/aquarium/aquarium.dm +++ b/code/modules/fishing/aquarium/aquarium.dm @@ -295,7 +295,7 @@ else dead_fish++ - var/morb = HAS_MIND_TRAIT(user, TRAIT_MORBID) + var/morb = HAS_TRAIT(user, TRAIT_MORBID) //Check if there are live fish - good mood //All fish dead - bad mood. //No fish - nothing. diff --git a/code/modules/fishing/aquarium/aquarium_kit.dm b/code/modules/fishing/aquarium/aquarium_kit.dm index 11fd841009d08..3257760f6a439 100644 --- a/code/modules/fishing/aquarium/aquarium_kit.dm +++ b/code/modules/fishing/aquarium/aquarium_kit.dm @@ -122,16 +122,7 @@ /obj/item/aquarium_prop/Initialize(mapload) . = ..() - //It's important that we register the signals before the component is attached. - RegisterSignal(src, COMSIG_AQUARIUM_CONTENT_GENERATE_APPEARANCE, PROC_REF(generate_aquarium_appearance)) - AddComponent(/datum/component/aquarium_content, beauty = beauty) - ADD_TRAIT(src, TRAIT_UNIQUE_AQUARIUM_CONTENT, INNATE_TRAIT) - -/obj/item/aquarium_prop/proc/generate_aquarium_appearance(datum/source, obj/effect/aquarium/visual) - SIGNAL_HANDLER - visual.icon = icon - visual.icon_state = icon_state - visual.layer_mode = layer_mode + AddComponent(/datum/component/aquarium_content, icon, beauty = beauty) /obj/item/aquarium_prop/rocks name = "decorative rocks" diff --git a/code/modules/fishing/aquarium/fish_analyzer.dm b/code/modules/fishing/aquarium/fish_analyzer.dm index c899c0c3abc55..3d01479ef5a2f 100644 --- a/code/modules/fishing/aquarium/fish_analyzer.dm +++ b/code/modules/fishing/aquarium/fish_analyzer.dm @@ -8,7 +8,6 @@ worn_icon_state = "fish_analyzer" desc = "A fish-shaped scanner used to monitor fish's status and evolutionary traits." obj_flags = CONDUCTS_ELECTRICITY - custom_price = PAYCHECK_CREW * 3 item_flags = NOBLUDGEON slot_flags = ITEM_SLOT_BELT throwforce = 3 @@ -41,7 +40,7 @@ register_item_context() update_appearance() - AddComponent(/datum/component/adjust_fishing_difficulty, -3, ITEM_SLOT_HANDS) + /obj/item/fish_analyzer/examine(mob/user) . = ..() diff --git a/code/modules/fishing/bait.dm b/code/modules/fishing/bait.dm index 9bd36daa7bebd..8fb66ad4c3d22 100644 --- a/code/modules/fishing/bait.dm +++ b/code/modules/fishing/bait.dm @@ -1,6 +1,6 @@ /obj/item/bait_can name = "can o bait" - desc = "there's a lot of them in there, getting them out takes a while though." + desc = "there's a lot of them in there, getting them out takes a while though" icon = 'icons/obj/fishing.dmi' icon_state = "bait_can" base_icon_state = "bait_can" @@ -112,7 +112,7 @@ var/list/known_fishes = list() for(var/obj/item/fish/fish_type as anything in SSfishing.lure_catchables[type]) - if(initial(fish_type.fish_flags) & FISH_FLAG_SHOW_IN_CATALOG) + if(initial(fish_type.show_in_catalog)) known_fishes += initial(fish_type.name) if(!length(known_fishes)) diff --git a/code/modules/fishing/fish/_fish.dm b/code/modules/fishing/fish/_fish.dm index 494d74c5ef772..08d09188e6bdd 100644 --- a/code/modules/fishing/fish/_fish.dm +++ b/code/modules/fishing/fish/_fish.dm @@ -1,11 +1,12 @@ #define FISH_SAD 0 +#define FISH_NEUTRAL 1 +#define FISH_SATISFIED 2 +#define FISH_HAPPY 3 #define FISH_VERY_HAPPY 4 -#define GET_FISH_ELECTROGENESIS(fish) (fish.electrogenesis_power * fish.size * 0.1) - // Fish path used for autogenerated fish /obj/item/fish - name = "fish" + name = "generic looking aquarium fish" desc = "very bland" icon = 'icons/obj/aquarium/fish.dmi' lefthand_file = 'icons/mob/inhands/fish_lefthand.dmi' @@ -19,12 +20,11 @@ drop_sound = 'sound/creatures/fish/fish_drop1.ogg' pickup_sound = SFX_FISH_PICKUP sound_vary = TRUE + ///The grind results of the fish. They scale with the weight of the fish. + grind_results = list(/datum/reagent/blood = 5, /datum/reagent/consumable/liquidgibs = 5) obj_flags = UNIQUE_RENAME item_flags = IMMUTABLE_SLOW|SLOWS_WHILE_IN_HAND - /// Flags for fish variables that would otherwise be TRUE/FALSE - var/fish_flags = FISH_FLAG_SHOW_IN_CATALOG|FISH_DO_FLOP_ANIM|FISH_FLAG_EXPERIMENT_SCANNABLE - /// width of aquarium visual icon var/sprite_width /// height of aquarium visual icon @@ -59,12 +59,16 @@ var/status = FISH_ALIVE ///icon used when the fish is dead, ifset. var/icon_state_dead + ///If this fish should do the flopping animation + var/do_flop_animation = TRUE /// Current fish health. Dies at 0. var/health = 100 /// The message shown when the fish dies. var/death_text = "%SRC dies." + /// Should this fish type show in fish catalog + var/show_in_catalog = TRUE /// How rare this fish is in the random cases var/random_case_rarity = FISH_RARITY_BASIC @@ -134,36 +138,27 @@ var/min_pressure = WARNING_LOW_PRESSURE var/max_pressure = HAZARD_HIGH_PRESSURE + /// If this fish type counts towards the Fish Species Scanning experiments + var/experisci_scannable = TRUE /// cooldown on creating tesla zaps COOLDOWN_DECLARE(electrogenesis_cooldown) - /// power of the tesla zap created by the fish in a bioelectric generator. Scales with size. - var/electrogenesis_power = 2 MEGA JOULES + /// power of the tesla zap created by the fish in a bioelectric generator + var/electrogenesis_power = 10 MEGA JOULES /// The beauty this fish provides to the aquarium it's inserted in. var/beauty = FISH_BEAUTY_GENERIC - - /** - * If you wonder why this isn't being tracked by the edible component instead: - * We reset the this value when revived, and slowly chip it away as we heal. - * Of course, it would be daunting to get this to be handled by the edible component - * given its complexity. - */ - var/bites_amount = 0 + ///have we recently pet this fish + var/recently_petted = FALSE /obj/item/fish/Initialize(mapload, apply_qualities = TRUE) . = ..() - //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)) - RegisterSignal(src, COMSIG_AQUARIUM_CONTENT_GENERATE_APPEARANCE, PROC_REF(update_aquarium_appearance)) - AddComponent(/datum/component/aquarium_content, list(COMSIG_FISH_STIRRED), beauty) + AddComponent(/datum/component/aquarium_content, icon, PROC_REF(get_aquarium_animation), list(COMSIG_FISH_STIRRED), beauty) RegisterSignal(src, COMSIG_ATOM_ON_LAZARUS_INJECTOR, PROC_REF(use_lazarus)) - if(fish_flags & FISH_DO_FLOP_ANIM) + if(do_flop_animation) RegisterSignal(src, COMSIG_ATOM_TEMPORARY_ANIMATION_START, PROC_REF(on_temp_animation)) - check_flopping() + check_environment() if(status != FISH_DEAD) - ADD_TRAIT(src, TRAIT_UNCOMPOSTABLE, REF(src)) //Composting a food that is not real food wouldn't work anyway. START_PROCESSING(SSobj, src) //stops new fish from being able to reproduce right away. @@ -175,215 +170,6 @@ update_size_and_weight() register_evolutions() - register_context() - register_item_context() - -/obj/item/fish/add_item_context(atom/source, list/context, obj/item/held_item, mob/user) - if(HAS_TRAIT(source, TRAIT_CATCH_AND_RELEASE)) - context[SCREENTIP_CONTEXT_RMB] = "Release" - return CONTEXTUAL_SCREENTIP_SET - return NONE - -/obj/item/fish/add_context(atom/source, list/context, obj/item/held_item, mob/user) - if(src == held_item) - context[SCREENTIP_CONTEXT_LMB] = "Pet" - return CONTEXTUAL_SCREENTIP_SET - if(istype(held_item, /obj/item/fish_feed)) - context[SCREENTIP_CONTEXT_LMB] = "Feed" - return CONTEXTUAL_SCREENTIP_SET - if(istype(held_item, /obj/item/fish_analyzer)) - context[SCREENTIP_CONTEXT_LMB] = "Scan" - return CONTEXTUAL_SCREENTIP_SET - return NONE - -/obj/item/fish/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) - if(!HAS_TRAIT(interacting_with, TRAIT_CATCH_AND_RELEASE)) - return NONE - if(HAS_TRAIT(src, TRAIT_NODROP)) - balloon_alert(user, "it's stuck to your hand!") - return ITEM_INTERACT_BLOCKING - balloon_alert(user, "releasing fish...") - if(!do_after(src, 3 SECONDS, interacting_with)) - return ITEM_INTERACT_BLOCKING - balloon_alert(user, "fish released") - var/goodbye_text = "Bye bye [name]." - if(status == FISH_DEAD && !HAS_MIND_TRAIT(user, TRAIT_NAIVE)) - goodbye_text = "May it rest in peace..." - user.visible_message(span_notice("[user] releases [src] into [interacting_with]"), \ - span_notice("You release [src] into [interacting_with]. [goodbye_text]"), \ - span_notice("You hear a splash.")) - playsound(interacting_with, 'sound/effects/splash.ogg', 50) - SEND_SIGNAL(interacting_with, COMSIG_FISH_RELEASED_INTO, src) - qdel(src) - return ITEM_INTERACT_SUCCESS - -///Main proc that makes the fish edible. -/obj/item/fish/proc/make_edible() - var/foodtypes = get_food_types() - if(foodtypes & RAW) - AddComponent(/datum/component/infective, GLOB.floor_diseases.Copy(), weak = TRUE, weak_infection_chance = PERFORM_ALL_TESTS(edible_fish) ? 100 : 15) - else - AddComponent(/datum/component/germ_sensitive) - var/bites_to_finish = weight / FISH_WEIGHT_BITE_DIVISOR - create_reagents(INFINITY) //We'll set this to the total volume of the reagents right after generate_fish_reagents() is over - generate_fish_reagents(bites_to_finish) - reagents.maximum_volume = round(reagents.total_volume * 1.25) //make some meager space for condiments. - AddComponent(/datum/component/edible, \ - food_flags = FOOD_NO_EXAMINE|FOOD_NO_BITECOUNT, \ - foodtypes = foodtypes, \ - volume = reagents.total_volume, \ - eat_time = 1.5 SECONDS, \ - bite_consumption = reagents.total_volume / bites_to_finish, \ - after_eat = CALLBACK(src, PROC_REF(after_eat)), \ - check_liked = CALLBACK(src, PROC_REF(check_liked)), \ - reagent_purity = 1, \ - ) - RegisterSignals(src, list(COMSIG_ITEM_FRIED, COMSIG_ITEM_BARBEQUE_GRILLED), PROC_REF(on_fish_cooked)) - -///A proc that returns the food types the edible component has when initialized. -/obj/item/fish/proc/get_food_types() - return SEAFOOD|MEAT|RAW|GORE - -///Kill the fish, remove the raw and gore food types, and the infectiveness too if not under-cooked. -/obj/item/fish/proc/on_fish_cooked(datum/source, cooking_time) - SIGNAL_HANDLER - SHOULD_NOT_OVERRIDE(TRUE) - adjust_health(0) - - //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 - 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) - - var/datum/component/edible/edible = GetComponent(/datum/component/edible) - edible.foodtypes &= ~(RAW|GORE) - if(cooking_time >= FISH_SAFE_COOKING_DURATION) - well_cooked() - - ///override the signals so they don't mess with blood and proteins again. - RegisterSignals(src, list(COMSIG_ITEM_FRIED, COMSIG_ITEM_BARBEQUE_GRILLED), PROC_REF(on_fish_cooked_again), TRUE) - -///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(cooking_time >= FISH_SAFE_COOKING_DURATION) - well_cooked() - -///The fish is well cooked. Change how the fish tastes, remove the infective comp and add the relative trait. -/obj/item/fish/proc/well_cooked() - qdel(GetComponent(/datum/component/infective)) - AddComponent(/datum/component/germ_sensitive) - ADD_TRAIT(src, TRAIT_FISH_WELL_COOKED, INNATE_TRAIT) - var/datum/reagent/consumable/nutriment/protein/protein = reagents.has_reagent(/datum/reagent/consumable/nutriment/protein, check_subtypes = TRUE) - if(protein) - protein.data = get_fish_taste_cooked() - -///Checks if the fish is liked or not when eaten by a human. -/obj/item/fish/proc/check_liked(mob/living/eater) - if(HAS_TRAIT(eater, TRAIT_PACIFISM) && (status == FISH_ALIVE ||HAS_MIND_TRAIT(eater, TRAIT_NAIVE))) - eater.add_mood_event("eating_fish", /datum/mood_event/pacifist_eating_fish_item) - return FOOD_TOXIC - if(HAS_TRAIT(eater, TRAIT_AGEUSIA)) - return - if(HAS_TRAIT(eater, TRAIT_FISH_EATER) && !HAS_TRAIT(eater, TRAIT_VEGETARIAN)) - return FOOD_LIKED - -/** - * Fish is not a reagent holder yet it's edible, so it doen't behave like most other snacks - * which means it has its own way of handling being bitten, which is defined here. - */ -/obj/item/fish/proc/after_eat(mob/living/eater, mob/living/feeder) - SHOULD_CALL_PARENT(TRUE) - if(!reagents.total_volume) - return - bites_amount++ - var/bites_to_finish = weight / FISH_WEIGHT_BITE_DIVISOR - adjust_health(health - (initial(health) / bites_to_finish) * 3) - if(status == FISH_ALIVE && prob(50) && feeder.is_holding(src) && feeder.dropItemToGround(src)) - to_chat(feeder, span_warning("[src] slips out of your hands in pain!")) - var/turf/target_turf = get_ranged_target_turf(get_turf(src), pick(GLOB.alldirs), 2) - throw_at(target_turf) - -///A proc that returns a static reagent holder with a set reagents that you'd get when eating this fish. -/obj/item/fish/proc/generate_fish_reagents(multiplier = 1) - SHOULD_NOT_OVERRIDE(TRUE) - var/list/reagents_to_add = get_base_edible_reagents_to_add() - SEND_SIGNAL(src, COMSIG_GENERATE_REAGENTS_TO_ADD, reagents_to_add) - if(multiplier != 1) - for(var/reagent in reagents_to_add) - reagents_to_add[reagent] *= multiplier - reagents.add_reagent_list(reagents_to_add, added_purity = 1) - var/datum/reagent/consumable/nutriment/protein/protein = reagents.has_reagent(/datum/reagent/consumable/nutriment/protein, check_subtypes = TRUE) - if(protein) - protein.data = HAS_TRAIT(src, TRAIT_FISH_WELL_COOKED) ? get_fish_taste_cooked() : get_fish_taste() - -/obj/item/fish/proc/get_fish_taste() - return list("raw fish" = 2.5, "scales" = 1) - -/obj/item/fish/proc/get_fish_taste_cooked() - return list("cooked fish" = 2) - -///The proc that adds in the main reagents this fish has when eaten (without accounting for traits) -/obj/item/fish/proc/get_base_edible_reagents_to_add() - var/return_list = list( - /datum/reagent/consumable/nutriment/protein = 2, - /datum/reagent/blood = 1, - ) - //It has been at the very least under-cooked. - if(HAS_TRAIT(src, TRAIT_FOOD_FRIED) || HAS_TRAIT(src, TRAIT_FOOD_BBQ_GRILLED)) - return_list[/datum/reagent/consumable/nutriment/protein] *= 2 - return_list -= /datum/reagent/blood - if(required_fluid_type == AQUARIUM_FLUID_SALTWATER) - return_list[/datum/reagent/consumable/salt] = 0.4 - return return_list - -///adjusts the maximum volume of the fish reagents holder and update the amount of food to bite -/obj/item/fish/proc/adjust_reagents_capacity(amount_to_add) - if(!reagents) - return - reagents.maximum_volume += amount_to_add - var/bites_to_finish = weight / FISH_WEIGHT_BITE_DIVISOR - ///updates how many units of reagent one bite takes if edible. - if(IS_EDIBLE(src)) - AddComponent(/datum/component/edible, bite_consumption = reagents.maximum_volume / bites_to_finish) - -///Grinding a fish replaces some the protein it has with blood and gibs. You ain't getting a clean smoothie out of it. -/obj/item/fish/on_grind() - . = ..() - if(!reagents) - return - reagents.convert_reagent(/datum/reagent/consumable/nutriment/protein, /datum/reagent/consumable/liquidgibs, 0.4, include_source_subtypes = TRUE) - reagents.convert_reagent(/datum/reagent/consumable/nutriment/protein, /datum/reagent/blood, 0.2, include_source_subtypes = TRUE) - -///When processed, the reagents inside this fish will be passed to the created atoms. -/obj/item/fish/UsedforProcessing(mob/living/user, obj/item/used_item, list/chosen_option, list/created_atoms) - var/created_len = length(created_atoms) - for(var/atom/movable/created as anything in created_atoms) - if(!created.reagents) - continue - for(var/datum/reagent/reagent as anything in reagents.reagent_list) - var/transfer_vol = reagent.volume / created_len - var/datum/reagent/result_reagent = created.reagents.has_reagent(reagent.type) - if(!result_reagent) - created.reagents.add_reagent(reagent.type, transfer_vol, reagents.copy_data(reagent), reagents.chem_temp, reagent.purity, reagent.ph, no_react = TRUE) - continue - var/multiplier = transfer_vol / result_reagent.volume - created.reagents.multiply_single_reagent(reagent.type, multiplier) - return ..() /obj/item/fish/update_icon_state() if(status == FISH_DEAD && icon_state_dead) @@ -396,37 +182,34 @@ if(!istype(item, /obj/item/fish_feed)) return ..() if(!item.reagents.total_volume) - balloon_alert(user, "[item.name] is empty!") + balloon_alert(user, "[item] is empty!") return TRUE if(status == FISH_DEAD) - balloon_alert(user, "[name] [HAS_MIND_TRAIT(user, TRAIT_NAIVE) ? "isn't hungry" : "is dead!"]") + balloon_alert(user, "[src] is dead!") return TRUE feed(item.reagents) - balloon_alert(user, "fed [name]") + balloon_alert(user, "fed [src]") return TRUE /obj/item/fish/examine(mob/user) . = ..() if(HAS_MIND_TRAIT(user, TRAIT_EXAMINE_DEEPER_FISH)) if(status == FISH_DEAD) - . += span_deadsay("It's [HAS_MIND_TRAIT(user, TRAIT_NAIVE) ? "taking the big snooze" : "dead"].") - else - var/list/warnings = list() - if(is_hungry()) - warnings += "starving" - if(!HAS_TRAIT(src, TRAIT_FISH_STASIS) && !proper_environment()) - warnings += "drowning" - if(health < initial(health) * 0.6) - warnings += "sick" - if(length(warnings)) - . += span_warning("It's [english_list(warnings)].") + . += span_deadsay("it's dead.") + var/list/warnings = list() + if(is_hungry()) + warnings += "starving" + if(!HAS_TRAIT(src, TRAIT_FISH_STASIS) && !proper_environment()) + warnings += "drowning" + if(health < initial(health) * 0.6) + warnings += "sick" + if(length(warnings)) + . += span_warning("it's [english_list(warnings)]") if(HAS_MIND_TRAIT(user, TRAIT_EXAMINE_FISH)) . += span_notice("It's [size] cm long.") . += span_notice("It weighs [weight] g.") if(HAS_TRAIT(src, TRAIT_FISHING_BAIT)) . += span_smallnoticeital("It can be used as a fishing bait.") - if(bites_amount) - . += span_warning("It's been bitten by someone.") ///Randomizes weight and size. /obj/item/fish/proc/randomize_size_and_weight(base_size = average_size, base_weight = average_weight, deviation = weight_size_deviation) @@ -442,12 +225,11 @@ /obj/item/fish/proc/update_size_and_weight(new_size = average_size, new_weight = average_weight) SEND_SIGNAL(src, COMSIG_FISH_UPDATE_SIZE_AND_WEIGHT, new_size, new_weight) if(size) - remove_fillet_type() + if(fillet_type) + RemoveElement(/datum/element/processable, TOOL_KNIFE, fillet_type, num_fillets, 0.5 SECONDS * num_fillets, screentip_verb = "Cut") if(size > FISH_SIZE_TWO_HANDS_REQUIRED) qdel(GetComponent(/datum/component/two_handed)) - size = new_size - var/init_icon_state = initial(inhand_icon_state) switch(size) if(0 to FISH_SIZE_TINY_MAX) @@ -479,34 +261,17 @@ inhand_icon_state = "[inhand_icon_state]_wielded" AddComponent(/datum/component/two_handed, require_twohands = TRUE) - add_fillet_type() + if(fillet_type) + var/init_fillets = initial(num_fillets) + var/amount = max(round(init_fillets * size / FISH_FILLET_NUMBER_SIZE_DIVISOR, 1), 1) + num_fillets = amount + AddElement(/datum/element/processable, TOOL_KNIFE, fillet_type, num_fillets, 0.5 SECONDS * num_fillets, screentip_verb = "Cut") - var/make_edible = TRUE 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) - if(reagents) //This fish has reagents. Adjust the maximum volume of the reagent holder and do some math to adjut the reagents too. - var/new_weight_ratio = new_weight / weight - var/volume_diff = reagents.maximum_volume * new_weight_ratio - reagents.maximum_volume - if(new_weight_ratio > weight) - adjust_reagents_capacity(volume_diff) - ///As always, we want to maintain proportions here, so we need to get the ratio of bites left and initial bites left. - var/weight_diff = new_weight - weight - var/multiplier = weight_diff / FISH_WEIGHT_BITE_DIVISOR - var/initial_bites_left = weight / FISH_WEIGHT_BITE_DIVISOR - var/bites_left = initial_bites_left - bites_amount - var/amount_to_gen = bites_left / initial_bites_left * multiplier - generate_fish_reagents(amount_to_gen) - else - reagents.multiply_reagents(new_weight_ratio) - adjust_reagents_capacity(volume_diff) - make_edible = FALSE - + grind_results[reagent_type] /= FLOOR(weight/FISH_GRIND_RESULTS_WEIGHT_DIVISOR, 0.1) weight = new_weight - if(make_edible) - make_edible() - if(weight >= FISH_WEIGHT_SLOWDOWN) slowdown = round(((weight/FISH_WEIGHT_SLOWDOWN_DIVISOR)**FISH_WEIGHT_SLOWDOWN_EXPONENT)-1.3, 0.1) drag_slowdown = round(slowdown * 0.5, 1) @@ -518,25 +283,10 @@ mob.update_equipment_speed_mods() for(var/reagent_type in grind_results) - grind_results[reagent_type] *= max(FLOOR(weight/FISH_GRIND_RESULTS_WEIGHT_DIVISOR, 0.1), 0.1) + grind_results[reagent_type] *= FLOOR(weight/FISH_GRIND_RESULTS_WEIGHT_DIVISOR, 0.1) update_fish_force() -/obj/item/fish/proc/remove_fillet_type() - if(!fillet_type) - return - var/amount = max(round(num_fillets * size / FISH_FILLET_NUMBER_SIZE_DIVISOR, 1), 1) - var/time = PERFORM_ALL_TESTS(fish_size_weight) ? 0 : 0.5 SECONDS * amount - RemoveElement(/datum/element/processable, TOOL_KNIFE, fillet_type, amount, time, screentip_verb = "Cut") - -/obj/item/fish/proc/add_fillet_type() - if(!fillet_type) - return - var/amount = max(round(num_fillets * size / FISH_FILLET_NUMBER_SIZE_DIVISOR, 1), 1) - var/time = PERFORM_ALL_TESTS(fish_size_weight) ? 0 : 0.5 SECONDS * amount - AddElement(/datum/element/processable, TOOL_KNIFE, fillet_type, amount, time, screentip_verb = "Cut") - return amount //checked by a unit test - ///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) @@ -671,7 +421,7 @@ /obj/item/fish/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) . = ..() - check_flopping() + check_environment() /obj/item/fish/proc/enter_stasis() ADD_TRAIT(src, TRAIT_FISH_STASIS, INNATE_TRAIT) @@ -700,11 +450,11 @@ fed_reagents.remove_reagent(fed_reagent_type, 0.1) SEND_SIGNAL(src, COMSIG_FISH_FED, fed_reagents, fed_reagent_type) -/obj/item/fish/proc/check_flopping() +/obj/item/fish/proc/check_environment() if(QDELETED(src)) //we don't care anymore return - if(!(fish_flags & FISH_DO_FLOP_ANIM)) + if(!do_flop_animation) return // Do additional stuff @@ -737,15 +487,12 @@ if(FISH_ALIVE) status = FISH_ALIVE health = initial(health) // since the fishe has been revived - regenerate_bites(bites_amount) last_feeding = world.time //reset hunger - check_flopping() + check_environment() START_PROCESSING(SSobj, src) - ADD_TRAIT(src, TRAIT_UNCOMPOSTABLE, INNATE_TRAIT) if(FISH_DEAD) status = FISH_DEAD STOP_PROCESSING(SSobj, src) - REMOVE_TRAIT(src, TRAIT_UNCOMPOSTABLE, INNATE_TRAIT) stop_flopping() if(!silent) var/message = span_notice(replacetext(death_text, "%SRC", "[src]")) @@ -757,51 +504,6 @@ update_fish_force() SEND_SIGNAL(src, COMSIG_FISH_STATUS_CHANGED) -/obj/item/fish/vv_edit_var(var_name, var_value) - switch(var_name) - if(NAMEOF(src, status)) - if(var_value != FISH_DEAD && var_value != FISH_ALIVE) - var_value = var_value ? FISH_ALIVE : FISH_DEAD - set_status(var_value) - if(NAMEOF(src, size)) - if(!isnum(var_value) || var_value == 0) - return FALSE - update_size_and_weight(var_value, weight) - if(NAMEOF(src, weight)) - if(!isnum(var_value) || var_value == 0) - return FALSE - update_size_and_weight(size, var_value) - if(NAMEOF(src, health)) - if(!isnum(var_value)) - return FALSE - adjust_health(health) - if(NAMEOF(src, fish_flags)) - var/old_fish_flags = fish_flags - fish_flags = var_value - if((old_fish_flags ^ fish_flags) & FISH_DO_FLOP_ANIM) //the flopping flag wasn't added nor removed - return TRUE - if(fish_flags & FISH_DO_FLOP_ANIM) - RegisterSignal(src, COMSIG_ATOM_TEMPORARY_ANIMATION_START, PROC_REF(on_temp_animation)) - else - UnregisterSignal(src, COMSIG_ATOM_TEMPORARY_ANIMATION_START) - check_flopping() - if(NAMEOF(src, fillet_type)) - if(!ispath(var_value)) - return FALSE - remove_fillet_type() - fillet_type = var_value - add_fillet_type() - if(NAMEOF(src, num_fillets)) - if(!isnum(var_value)) - return FALSE - remove_fillet_type() - num_fillets = var_value - add_fillet_type() - else - return ..() - - return TRUE - /obj/item/fish/expose_reagents(list/reagents, datum/reagents/source, methods = TOUCH, volume_modifier = 1, show_message = TRUE) . = ..() if(. & COMPONENT_NO_EXPOSE_REAGENTS || status != FISH_DEAD) @@ -828,25 +530,6 @@ injector.expend(src, user) return LAZARUS_INJECTOR_USED -/obj/item/fish/proc/update_aquarium_appearance(datum/source, obj/effect/aquarium/visual) - SIGNAL_HANDLER - visual.icon = dedicated_in_aquarium_icon || icon - visual.icon_state = dedicated_in_aquarium_icon_state || "[initial(icon_state)]_small" - visual.color = aquarium_vc_color - -/obj/item/fish/proc/randomize_aquarium_position(datum/source, obj/structure/aquarium/current_aquarium, obj/effect/aquarium/visual) - SIGNAL_HANDLER - var/list/aq_properties = current_aquarium.get_surface_properties() - var/avg_width = round(sprite_width * 0.5) - var/avg_height = round(sprite_height * 0.5) - var/px_min = aq_properties[AQUARIUM_PROPERTIES_PX_MIN] + avg_width - 16 - var/px_max = aq_properties[AQUARIUM_PROPERTIES_PX_MAX] - avg_width - 16 - var/py_min = aq_properties[AQUARIUM_PROPERTIES_PY_MIN] + avg_height - 16 - var/py_max = aq_properties[AQUARIUM_PROPERTIES_PY_MAX] - avg_width - 16 - - visual.pixel_x = visual.base_px = rand(px_min,px_max) - visual.pixel_y = visual.base_py = rand(py_min,py_max) - /obj/item/fish/proc/get_aquarium_animation() var/obj/structure/aquarium/aquarium = loc if(!istype(aquarium) || aquarium.fluid_type == AQUARIUM_FLUID_AIR || status == FISH_DEAD) @@ -854,59 +537,6 @@ else return AQUARIUM_ANIMATION_FISH_SWIM -/obj/item/fish/proc/update_aquarium_animation(datum/source, current_animation, obj/structure/current_aquarium, obj/effect/visual) - SIGNAL_HANDLER - var/animation = get_aquarium_animation() - if(animation == current_animation) - return - switch(animation) - if(AQUARIUM_ANIMATION_FISH_SWIM) - swim_animation(current_aquarium, visual) - if(AQUARIUM_ANIMATION_FISH_DEAD) - dead_animation(current_aquarium, visual) - -/// Create looping random path animation, pixel offsets parameters include offsets already -/obj/item/fish/proc/swim_animation(obj/structure/aquarium/current_aquarium, obj/effect/aquarium/visual) - var/avg_width = round(sprite_width / 2) - var/avg_height = round(sprite_height / 2) - - var/list/aq_properties = current_aquarium.get_surface_properties() - var/px_min = aq_properties[AQUARIUM_PROPERTIES_PX_MIN] + avg_width - 16 - var/px_max = aq_properties[AQUARIUM_PROPERTIES_PX_MAX] - avg_width - 16 - var/py_min = aq_properties[AQUARIUM_PROPERTIES_PY_MIN] + avg_height - 16 - var/py_max = aq_properties[AQUARIUM_PROPERTIES_PY_MAX] - avg_width - 16 - - var/origin_x = visual.base_px - var/origin_y = visual.base_py - var/prev_x = origin_x - var/prev_y = origin_y - animate(visual, pixel_x = origin_x, time = 0, loop = -1) //Just to start the animation - var/move_number = rand(3, 5) //maybe unhardcode this - for(var/i in 1 to move_number) - //If it's last movement, move back to start otherwise move to some random point - var/target_x = i == move_number ? origin_x : rand(px_min,px_max) //could do with enforcing minimal delta for prettier zigzags - var/target_y = i == move_number ? origin_y : rand(py_min,py_max) - var/dx = prev_x - target_x - var/dy = prev_y - target_y - prev_x = target_x - prev_y = target_y - var/dist = abs(dx) + abs(dy) - var/eyeballed_time = dist * 2 //2ds per px - //Face the direction we're going - var/matrix/dir_mx = matrix(visual.transform) - if(dx <= 0) //assuming default sprite is facing left here - dir_mx.Scale(-1, 1) - animate(transform = dir_mx, time = 0, loop = -1) - animate(pixel_x = target_x, pixel_y = target_y, time = eyeballed_time, loop = -1) - -/obj/item/fish/proc/dead_animation(obj/structure/aquarium/current_aquarium, obj/effect/aquarium/visual) - //Set base_py to lowest possible value - var/avg_height = round(sprite_height / 2) - var/list/aq_properties = current_aquarium.get_surface_properties() - var/py_min = aq_properties[AQUARIUM_PROPERTIES_PY_MIN] + avg_height - 16 - visual.base_py = py_min - 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() var/obj/structure/aquarium/aquarium = loc @@ -945,28 +575,10 @@ health_change_per_second += 0.5 //Slowly healing adjust_health(health + health_change_per_second * seconds_per_tick) -/obj/item/fish/proc/adjust_health(amount) - if(status == FISH_DEAD || amount == health) - return - var/pre_health = health - var/initial_health = initial(health) - health = clamp(amount, 0, initial_health) +/obj/item/fish/proc/adjust_health(amt) + health = clamp(amt, 0, initial(health)) if(health <= 0) set_status(FISH_DEAD) - return - if(amount < pre_health || !bites_amount) - return - var/health_to_pre_health_diff = amount - pre_health - var/init_health_to_pre_diff = initial_health - pre_health - var/bites_to_recover = bites_amount * (health_to_pre_health_diff / init_health_to_pre_diff) - regenerate_bites(bites_to_recover) - -/obj/item/fish/proc/regenerate_bites(amount) - amount = min(amount, bites_amount) - if(amount <= 0) - return - bites_amount -= amount - generate_fish_reagents(amount) /obj/item/fish/proc/ready_to_reproduce(being_targeted = FALSE) var/obj/structure/aquarium/aquarium = loc @@ -1145,7 +757,7 @@ var/fish_zap_flags = ZAP_MOB_DAMAGE if(istype(loc, /obj/structure/aquarium/bioelec_gen)) fish_zap_range = 5 - fish_zap_power = GET_FISH_ELECTROGENESIS(src) + fish_zap_power = electrogenesis_power fish_zap_flags |= (ZAP_GENERATES_POWER | ZAP_MOB_STUN) tesla_zap(source = get_turf(src), zap_range = fish_zap_range, power = fish_zap_power, cutoff = 1 MEGA JOULES, zap_flags = fish_zap_flags) @@ -1156,10 +768,9 @@ if(HAS_TRAIT(src, TRAIT_FISH_FROM_CASE)) //Avoid printing money by simply ordering fish and sending it back. calculated_price *= 0.05 return round(calculated_price) - /obj/item/fish/proc/get_happiness_value() var/happiness_value = 0 - if(fish_flags & FISH_FLAG_PETTED) + if(recently_petted) happiness_value++ if(HAS_TRAIT(src, TRAIT_FISH_NO_HUNGER) || min((world.time - last_feeding) / feeding_frequency, 1) < 0.5) happiness_value++ @@ -1170,62 +781,18 @@ happiness_value++ if(ISINRANGE(aquarium.fluid_temp, required_temperature_min, required_temperature_max)) happiness_value++ - if(bites_amount) // ouch - happiness_value -= 2 - if(health < initial(health) * 0.6) - happiness_value -= 1 - return clamp(happiness_value, FISH_SAD, FISH_VERY_HAPPY) - -/obj/item/fish/attack_self(mob/living/user) - . = ..() - pet_fish(user) + return happiness_value /obj/item/fish/proc/pet_fish(mob/living/user) - var/in_aquarium = isaquarium(loc) - if(status == FISH_DEAD) - to_chat(user, span_warning("You try to pet [src], but [p_theyre()] motionless!")) - return FALSE - if(!proper_environment()) - to_chat(user, span_warning("You try to pet [src], but [p_theyre()] not feeling well!")) - return FALSE - if(fish_flags & FISH_FLAG_PETTED) - if(in_aquarium) - to_chat(user, span_warning("[src] runs away from your finger as you dip it into the water!")) - else - to_chat(user, span_warning("You try to pet [src] but [p_they()] squirms away!")) - return FALSE - if(HAS_TRAIT(src, TRAIT_FISH_ELECTROGENESIS) && GET_FISH_ELECTROGENESIS(src) > 15 MEGA JOULES) + if(recently_petted) + to_chat(user, span_warning("[src] runs away from your finger as you dip it into the water!")) + return + if(electrogenesis_power > 15 MEGA JOULES) user.electrocute_act(5, src) //was it all worth it? - fish_flags |= FISH_FLAG_PETTED - new /obj/effect/temp_visual/heart(get_turf(src)) - if((/datum/fish_trait/aggressive in fish_traits) && prob(50)) - if(!in_aquarium) - user.visible_message( - span_warning("[src] dances around before biting [user]!"), - span_warning("[src] dances around before biting you!"), - vision_distance = DEFAULT_MESSAGE_RANGE - 3, - ) - else - user.visible_message( - span_warning("[src] bites [user]'s hand!"), - span_warning("You pet [src] as you hold it, only for [p_them()] to happily bite back!"), - vision_distance = DEFAULT_MESSAGE_RANGE - 3, - ) - var/body_zone = pick(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM) - user.apply_damage((force * 0.2) + w_class * 2, BRUTE, body_zone, user.run_armor_check(body_zone, MELEE)) - playsound(src,'sound/weapons/bite.ogg', 45, TRUE, -1) - else - if(in_aquarium) - to_chat(user, span_notice("[src] dances around!")) - else - to_chat(user, span_notice("You pet [src] as you hold it.")) - user.add_mood_event("petted_fish", /datum/mood_event/fish_petting, src, HAS_MIND_TRAIT(user, TRAIT_MORBID)) - playsound(src, 'sound/weapons/thudswoosh.ogg', 30, TRUE, -1) - addtimer(CALLBACK(src, PROC_REF(undo_petted)), 30 SECONDS) - return TRUE - -/obj/item/fish/proc/undo_petted() - fish_flags &= ~FISH_FLAG_PETTED + recently_petted = TRUE + SEND_SIGNAL(src, COMSIG_FISH_PETTED) + to_chat(user, span_notice("[src] dances around!")) + addtimer(VARSET_CALLBACK(src, recently_petted, FALSE), 30 SECONDS) /// Returns random fish, using random_case_rarity probabilities. /proc/random_fish_type(required_fluid) @@ -1256,7 +823,3 @@ return fluid_type == AQUARIUM_FLUID_SALTWATER || fluid_type == AQUARIUM_FLUID_FRESHWATER else return fish_fluid_type == fluid_type - -#undef GET_FISH_ELECTROGENESIS -#undef FISH_SAD -#undef FISH_VERY_HAPPY diff --git a/code/modules/fishing/fish/fish_evolution.dm b/code/modules/fishing/fish/fish_evolution.dm index d7b8f744f0a67..688b0c201c7b4 100644 --- a/code/modules/fishing/fish/fish_evolution.dm +++ b/code/modules/fishing/fish/fish_evolution.dm @@ -1,7 +1,4 @@ -///A global list of fish evolutions, which are singletons. GLOBAL_LIST_INIT(fish_evolutions, init_subtypes_w_path_keys(/datum/fish_evolution, list())) -///A list of fish evolution types, each having an associated list containing all fish types that have it. -GLOBAL_LIST_EMPTY(fishes_by_fish_evolution) /** * Fish evolution datums @@ -10,9 +7,7 @@ GLOBAL_LIST_EMPTY(fishes_by_fish_evolution) * then there's a chance the offspring may be of a new type rather than the same as its source or mate (if any). */ /datum/fish_evolution - ///The name of the evolution. If not set, it'll be generated on runtime from the name of the new fish type. var/name - ///The probability that this evolution can happen. var/probability = 0 ///The obj/item/fish path of the new fish var/obj/item/fish/new_fish_type = /obj/item/fish @@ -26,14 +21,8 @@ GLOBAL_LIST_EMPTY(fishes_by_fish_evolution) var/list/removed_traits ///A text string shown in the catalog, containing information on conditions specific to this evolution. var/conditions_note - ///Is this evolution shown on the wiki? - var/show_on_wiki = TRUE - ///Is the result of this evolution shown on the wiki? - var/show_result_on_wiki = TRUE /datum/fish_evolution/New() - ..() - SHOULD_CALL_PARENT(TRUE) if(!ispath(new_fish_type, /obj/item/fish)) stack_trace("[type] instantiated with a new fish type of [new_fish_type]. That's not a fish, hun, things will break.") if(!name) @@ -98,7 +87,6 @@ GLOBAL_LIST_EMPTY(fishes_by_fish_evolution) new_fish_type = /obj/item/fish/mastodon new_traits = list(/datum/fish_trait/heavy, /datum/fish_trait/amphibious, /datum/fish_trait/predator, /datum/fish_trait/aggressive) conditions_note = "The fish (and its mate) needs to be unusually big both in size and weight." - show_result_on_wiki = FALSE /datum/fish_evolution/mastodon/check_conditions(obj/item/fish/source, obj/item/fish/mate, obj/structure/aquarium/aquarium) if((source.size < 120 || source.weight < 3000) || (mate && (mate.size < 120 || mate.weight < 3000))) @@ -118,11 +106,13 @@ GLOBAL_LIST_EMPTY(fishes_by_fish_evolution) required_temperature_max = MIN_AQUARIUM_TEMP+10 /datum/fish_evolution/three_eyes + name = "Three-eyed Goldfish" probability = 3 new_fish_type = /obj/item/fish/goldfish/three_eyes new_traits = list(/datum/fish_trait/recessive) /datum/fish_evolution/chainsawfish + name = "Chainsawfish" probability = 30 new_fish_type = /obj/item/fish/chainsawfish new_traits = list(/datum/fish_trait/predator, /datum/fish_trait/aggressive) diff --git a/code/modules/fishing/fish/fish_traits.dm b/code/modules/fishing/fish/fish_traits.dm index 8c96df6e4ac5f..e51b810d16b2e 100644 --- a/code/modules/fishing/fish/fish_traits.dm +++ b/code/modules/fishing/fish/fish_traits.dm @@ -37,7 +37,7 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) var/list/fish_whitelist /// Depending on the value, fish with trait will be reported as more or less difficult in the catalog. var/added_difficulty = 0 - /// Reagents to add to the fish whenever the COMSIG_GENERATE_REAGENTS_TO_ADD signal is sent. Their values will be multiplied later. + /// Reagents added to the fish when gained var/list/reagents_to_add /// Difficulty modifier from this mod, needs to return a list with two values @@ -57,8 +57,10 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) /// Applies some special qualities to the fish that has been spawned /datum/fish_trait/proc/apply_to_fish(obj/item/fish/fish) SHOULD_CALL_PARENT(TRUE) - if(length(reagents_to_add)) - RegisterSignal(fish, COMSIG_GENERATE_REAGENTS_TO_ADD, PROC_REF(add_reagents)) + if(reagents_to_add) + for(var/reagent in reagents_to_add) + add_to_reagents(fish, reagent, reagents_to_add[reagent]) + RegisterSignal(fish, COMSIG_ATOM_PROCESSED, PROC_REF(process_reagents)) /// Applies some special qualities to basic mobs generated by fish (i.e. chasm chrab --> young lobstrosity --> lobstrosity). /datum/fish_trait/proc/apply_to_mob(mob/living/basic/mob) @@ -77,15 +79,25 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) SEND_SIGNAL(prey, COMSIG_FISH_EATEN_BY_OTHER_FISH, predator) qdel(prey) +/// Proc that inserts a reagent to the grind_results list of the fish. You'll still have to set the processed comsig proc yourself. +/datum/fish_trait/proc/add_to_reagents(obj/item/fish/fish, reagent_type, amount) + LAZYINITLIST(fish.grind_results) + fish.grind_results.Insert(1, reagent_type) + fish.grind_results[reagent_type] = amount -/** - * Signal sent when we need to generate an abstract holder containing - * reagents to be transfered, usually as a result of the fish being eaten by someone - */ -/datum/fish_trait/proc/add_reagents(obj/item/fish/fish, list/reagents) +/// Proc that handles adding reagents from the trait to the fillets from butchered fish. +/datum/fish_trait/proc/process_reagents(obj/item/fish/source, mob/living/user, obj/item/process_item, list/results) SIGNAL_HANDLER + var/results_with_reagents = 0 + for(var/atom/result as anything in results) + if(result.reagents) + results_with_reagents++ + if(!results_with_reagents) + return for(var/reagent in reagents_to_add) - reagents[reagent] += reagents_to_add[reagent] + var/amount = round(source.grind_results[reagent] / results_with_reagents, 0.1) + for(var/atom/result as anything in results) + result.reagents?.add_reagent(reagent, amount) /// Proc that adds or changes the venomous when the fish size and/or weight are updated /datum/fish_trait/proc/add_venom(obj/item/fish/source, venom_path, new_weight, mult = 0.25) @@ -120,16 +132,10 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) /datum/fish_trait/shiny_lover/difficulty_mod(obj/item/fishing_rod/rod, mob/fisherman) . = ..() - // These fish are easier to catch with shiny hook + // These fish are easier to catch with shiny lure if(rod.hook && rod.hook.fishing_hook_traits & FISHING_HOOK_SHINY) .[ADDITIVE_FISHING_MOD] -= FISH_TRAIT_MINOR_DIFFICULTY_BOOST -/datum/fish_trait/shiny_lover/catch_weight_mod(obj/item/fishing_rod/rod, mob/fisherman) - . = ..() - // These fish are harder to find without a shiny hook - if(rod.hook && rod.hook.fishing_hook_traits & FISHING_HOOK_SHINY) - .[MULTIPLICATIVE_FISHING_MOD] = 0.5 - /datum/fish_trait/picky_eater name = "Picky Eater" catalog_description = "This fish is very picky and will ignore low quality bait (unless it's amongst its favorites)." @@ -319,7 +325,7 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) /** * Useful for those species with the parthenogenesis trait if you don't want them to mate with each other, - * or for similar shenanigans, I don't know. + * or for similar shenanigeans, I don't know. * Otherwise you could just set the stable_population to 1. */ /datum/fish_trait/no_mating @@ -401,7 +407,7 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) /datum/fish_trait/yucky name = "Yucky" catalog_description = "This fish tastes so repulsive, other fishes won't try to eat it." - reagents_to_add = list(/datum/reagent/yuck = 1.2) + reagents_to_add = list(/datum/reagent/yuck = 3) /datum/fish_trait/yucky/apply_to_fish(obj/item/fish/fish) . = ..() @@ -409,9 +415,9 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) /datum/fish_trait/toxic name = "Toxic" - catalog_description = "This fish contains toxins. Feeding it to predatory fishes or people is not recommended." + catalog_description = "This fish contains toxins. Feeding it to predatory fishes or people is not reccomended." diff_traits_inheritability = 25 - reagents_to_add = list(/datum/reagent/toxin/tetrodotoxin = 1) + reagents_to_add = list(/datum/reagent/toxin/tetrodotoxin = 2.5) /datum/fish_trait/toxic/apply_to_fish(obj/item/fish/fish) . = ..() @@ -500,7 +506,6 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) spontaneous_manifest_types = list(/obj/item/fish/clownfish/lube = 100) catalog_description = "This fish exudes a viscous, slippery lubrificant. It's recommended not to step on it." added_difficulty = 5 - reagents_to_add = list(/datum/reagent/lube = 1.2) /datum/fish_trait/lubed/apply_to_fish(obj/item/fish/fish) . = ..() @@ -586,30 +591,11 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) inheritability = 60 diff_traits_inheritability = 30 catalog_description = "This fish is electroreceptive, and will generate electric fields. Can be harnessed inside a bioelectric generator." - reagents_to_add = list(/datum/reagent/consumable/liquidelectricity = 1.5) /datum/fish_trait/electrogenesis/apply_to_fish(obj/item/fish/fish) . = ..() ADD_TRAIT(fish, TRAIT_FISH_ELECTROGENESIS, FISH_TRAIT_DATUM) RegisterSignal(fish, COMSIG_FISH_FORCE_UPDATED, PROC_REF(on_force_updated)) - RegisterSignals(fish, list(COMSIG_ITEM_FRIED, TRAIT_FOOD_BBQ_GRILLED), PROC_REF(on_fish_cooked)) - -/datum/fish_trait/electrogenesis/proc/on_fish_cooked(obj/item/fish/fish, cooked_time) - SIGNAL_HANDLER - if(cooked_time >= FISH_SAFE_COOKING_DURATION) - fish.reagents.del_reagent(/datum/reagent/consumable/liquidelectricity) - else - fish.reagents.multiply_single_reagent(/datum/reagent/consumable/liquidelectricity, 0.66) - -/datum/fish_trait/electrogenesis/add_reagents(obj/item/fish/fish, list/reagents) - . = ..() - if(HAS_TRAIT(fish, TRAIT_FISH_WELL_COOKED)) // Cooking it well removes all liquid electricity - reagents -= /datum/reagent/consumable/liquidelectricity - else - reagents -= /datum/reagent/blood - //Otherwise, undercooking it will remove 2/3 of it. - if(!HAS_TRAIT(fish, TRAIT_FOOD_FRIED) && !HAS_TRAIT(fish, TRAIT_FOOD_BBQ_GRILLED)) - reagents[/datum/reagent/consumable/liquidelectricity] -= 1 /datum/fish_trait/electrogenesis/proc/on_force_updated(obj/item/fish/fish, weight_rank, bonus_or_malus) SIGNAL_HANDLER @@ -678,15 +664,6 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) return change_venom_on_death(source, /datum/reagent/toxin/venom, 0.7, 0.3) -/datum/fish_trait/hallucinogenic - name = "Hallucinogenic" - catalog_description = "This fish is coated with hallucinogenic neurotoxin. We advise cooking it before consumption." - reagents_to_add = list(/datum/reagent/toxin/mindbreaker/fish = 1) - -/datum/fish_trait/hallucinogenic/add_reagents(obj/item/fish/fish, list/reagents) - if(!HAS_TRAIT(src, TRAIT_FOOD_FRIED) && !HAS_TRAIT(src, TRAIT_FOOD_BBQ_GRILLED)) - return ..() - /datum/fish_trait/ink name = "Ink Production" catalog_description = "This fish possess a sac that produces ink." diff --git a/code/modules/fishing/fish/types/air_space.dm b/code/modules/fishing/fish/types/air_space.dm index dda3794ff4e1c..f3b985edfa78a 100644 --- a/code/modules/fishing/fish/types/air_space.dm +++ b/code/modules/fishing/fish/types/air_space.dm @@ -40,12 +40,6 @@ ), ) -/obj/item/fish/sand_crab/get_fish_taste() - return list("raw crab" = 2) - -/obj/item/fish/sand_crab/get_fish_taste_cooked() - return list("cooked crab" = 2) - /obj/item/fish/bumpy name = "bump-fish" desc = "An misshapen fish-thing all covered in stubby little tendrils" diff --git a/code/modules/fishing/fish/types/anadromous.dm b/code/modules/fishing/fish/types/anadromous.dm index 4edbce5d0c348..ecdbda1fde7d2 100644 --- a/code/modules/fishing/fish/types/anadromous.dm +++ b/code/modules/fishing/fish/types/anadromous.dm @@ -11,11 +11,6 @@ fillet_type = /obj/item/food/fishmeat/salmon beauty = FISH_BEAUTY_GOOD -/obj/item/fish/sockeye_salmon/get_base_edible_reagents_to_add() - var/return_list = ..() - return_list[/datum/reagent/consumable/nutriment/fat] = 1 - return return_list - /obj/item/fish/arctic_char name = "arctic char" desc = "A cold-water anadromous fish widespread around the Northern Hemisphere of Earth, yet it has somehow found a way here." diff --git a/code/modules/fishing/fish/types/freshwater.dm b/code/modules/fishing/fish/types/freshwater.dm index 68254f661371d..129b738fc0ad8 100644 --- a/code/modules/fishing/fish/types/freshwater.dm +++ b/code/modules/fishing/fish/types/freshwater.dm @@ -26,14 +26,11 @@ desc = "A great rubber duck tool for Lawyers who can't get a grasp over their case." stable_population = 1 random_case_rarity = FISH_RARITY_NOPE - fish_flags = parent_type::fish_flags & ~FISH_FLAG_SHOW_IN_CATALOG + show_in_catalog = FALSE beauty = FISH_BEAUTY_GOOD compatible_types = list(/obj/item/fish/goldfish, /obj/item/fish/goldfish/three_eyes) fish_traits = list(/datum/fish_trait/recessive) -/obj/item/fish/goldfish/gill/get_fish_taste() - return list("raw fish" = 2.5, "objection" = 1) - /obj/item/fish/goldfish/three_eyes name = "three-eyed goldfish" desc = "A goldfish with an extra half a pair of eyes. You wonder what it's been feeding on lately..." @@ -53,21 +50,15 @@ ), ) -/obj/item/fish/goldfish/three_eyes/get_fish_taste() - return list("raw fish" = 2.5, "chemical waste" = 0.5) - /obj/item/fish/goldfish/three_eyes/gill name = "McGill" desc = "A great rubber duck tool for Lawyers who can't get a grasp over their case. It looks kinda different today..." compatible_types = list(/obj/item/fish/goldfish, /obj/item/fish/goldfish/three_eyes) beauty = FISH_BEAUTY_GREAT - fish_flags = parent_type::fish_flags & ~FISH_FLAG_SHOW_IN_CATALOG + show_in_catalog = FALSE stable_population = 1 random_case_rarity = FISH_RARITY_NOPE -/obj/item/fish/goldfish/three_eyes/gill/get_fish_taste() - return list("raw fish" = 2.5, "objection" = 1) - /obj/item/fish/angelfish name = "angelfish" desc = "Young Angelfish often live in groups, while adults prefer solitary life. They become territorial and aggressive toward other fish when they reach adulthood." @@ -148,12 +139,9 @@ /datum/fish_trait/electrogenesis, ) //anxiety naturally limits the amount of zipzaps per tank, so they are stronger alone - electrogenesis_power = 6.7 MEGA JOULES + electrogenesis_power = 20 MEGA JOULES beauty = FISH_BEAUTY_GOOD -/obj/item/fish/zipzap/get_fish_taste() - return list("raw fish" = 2, "anxiety" = 1) - /obj/item/fish/tadpole name = "tadpole" desc = "The larval spawn of an amphibian. A very minuscle, round creature with a long tail it uses to swim around." @@ -179,9 +167,6 @@ RegisterSignal(src, COMSIG_FISH_BEFORE_GROWING, PROC_REF(growth_checks)) RegisterSignal(src, COMSIG_FISH_FINISH_GROWING, PROC_REF(on_growth)) -/obj/item/fish/tadpole/make_edible() - return - /obj/item/fish/tadpole/set_status(new_status, silent = FALSE) . = ..() if(status == FISH_DEAD) diff --git a/code/modules/fishing/fish/types/holographic.dm b/code/modules/fishing/fish/types/holographic.dm index 64de7d866d695..dfcdbeedb6b61 100644 --- a/code/modules/fishing/fish/types/holographic.dm +++ b/code/modules/fishing/fish/types/holographic.dm @@ -3,7 +3,7 @@ name = "holographic goldfish" desc = "A holographic representation of a common goldfish, slowly flickering out, removed from its holo-habitat." icon_state = /obj/item/fish/goldfish::icon_state - fish_flags = parent_type::fish_flags & ~(FISH_FLAG_SHOW_IN_CATALOG|FISH_FLAG_EXPERIMENT_SCANNABLE) + show_in_catalog = FALSE random_case_rarity = FISH_RARITY_NOPE dedicated_in_aquarium_icon_state = /obj/item/fish/goldfish::dedicated_in_aquarium_icon_state aquarium_vc_color = /obj/item/fish/goldfish::aquarium_vc_color @@ -13,9 +13,11 @@ average_size = /obj/item/fish/goldfish::average_size average_weight = /obj/item/fish/goldfish::average_weight required_fluid_type = AQUARIUM_FLUID_ANADROMOUS + grind_results = null fillet_type = null death_text = "%SRC gently disappears." fish_traits = list(/datum/fish_trait/no_mating) //just to be sure, these shouldn't reproduce + experisci_scannable = FALSE beauty = /obj/item/fish/goldfish::beauty /obj/item/fish/holo/Initialize(mapload, apply_qualities = TRUE) @@ -26,9 +28,6 @@ return holo_area.linked.add_to_spawned(src) -/obj/item/fish/holo/make_edible(weight_val) - return - /obj/item/fish/holo/set_status(new_status, silent = FALSE) . = ..() if(status == FISH_DEAD) diff --git a/code/modules/fishing/fish/types/mining.dm b/code/modules/fishing/fish/types/mining.dm index 0b29143dd5b8e..7614f259e5939 100644 --- a/code/modules/fishing/fish/types/mining.dm +++ b/code/modules/fishing/fish/types/mining.dm @@ -37,12 +37,6 @@ RegisterSignal(src, COMSIG_FISH_BEFORE_GROWING, PROC_REF(growth_checks)) RegisterSignal(src, COMSIG_FISH_FINISH_GROWING, PROC_REF(on_growth)) -/obj/item/fish/chasm_crab/get_fish_taste() - return list("raw crab" = 2) - -/obj/item/fish/chasm_crab/get_fish_taste_cooked() - return list("cooked crab" = 2) - ///A chasm crab growth speed is determined by its initial weight and size, ergo bigger crabs for faster lobstrosities /obj/item/fish/chasm_crab/update_size_and_weight(new_size = average_size, new_weight = average_weight) . = ..() @@ -64,11 +58,6 @@ AddComponent(/datum/component/fish_growth, lob_type, initial(growth_rate) * 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) SIGNAL_HANDLER var/hunger = CLAMP01((world.time - last_feeding) / feeding_frequency) @@ -136,9 +125,6 @@ evolution_types = list(/datum/fish_evolution/mastodon) beauty = FISH_BEAUTY_UGLY -/obj/item/fish/boned/make_edible(weight_val) - return //it's all bones and no meat. - /obj/item/fish/lavaloop name = "lavaloop fish" desc = "Due to its curvature, it can be used as make-shift boomerang." @@ -178,12 +164,6 @@ effect_on_success = /obj/effect/temp_visual/guardian/phase,\ ) -/obj/item/fish/lavaloop/get_fish_taste() - return list("chewy fish" = 2) - -/obj/item/fish/lavaloop/get_food_types() - return SEAFOOD|MEAT|GORE //Well-cooked in lava - /obj/item/fish/lavaloop/proc/explode_on_user(mob/living/user) var/obj/item/bodypart/arm/active_arm = user.get_active_hand() active_arm?.dismember() diff --git a/code/modules/fishing/fish/types/ruins.dm b/code/modules/fishing/fish/types/ruins.dm index 153a5bc3b7b7c..da9e8388c0c44 100644 --- a/code/modules/fishing/fish/types/ruins.dm +++ b/code/modules/fishing/fish/types/ruins.dm @@ -8,7 +8,7 @@ pixel_x = -16 sprite_width = 12 sprite_height = 7 - fish_flags = parent_type::fish_flags & ~FISH_FLAG_SHOW_IN_CATALOG + show_in_catalog = FALSE random_case_rarity = FISH_RARITY_NOPE fishing_difficulty_modifier = 30 required_fluid_type = AQUARIUM_FLUID_ANY_WATER @@ -26,9 +26,6 @@ fish_traits = list(/datum/fish_trait/heavy, /datum/fish_trait/amphibious, /datum/fish_trait/revival, /datum/fish_trait/carnivore, /datum/fish_trait/predator, /datum/fish_trait/aggressive) beauty = FISH_BEAUTY_BAD -/obj/item/fish/mastodon/make_edible(weight_val) - return //it's all bones and gibs. - ///From the cursed spring /obj/item/fish/soul name = "soulfish" @@ -39,7 +36,7 @@ average_size = 60 average_weight = 1200 stable_population = 4 - fish_flags = parent_type::fish_flags & ~FISH_FLAG_SHOW_IN_CATALOG + show_in_catalog = FALSE beauty = FISH_BEAUTY_EXCELLENT fish_movement_type = /datum/fish_movement/choppy //Glideless legacy movement? in my fishing minigame? favorite_bait = list( @@ -53,15 +50,6 @@ required_temperature_max = MIN_AQUARIUM_TEMP+38 random_case_rarity = FISH_RARITY_NOPE -/obj/item/fish/soul/get_food_types() - return MEAT|RAW|GORE //Not-so-quite-seafood - -/obj/item/fish/soul/get_fish_taste() - return list("meat" = 2, "soulfulness" = 1) - -/obj/item/fish/soul/get_fish_taste_cooked() - return list("cooked meat" = 2) - ///From the cursed spring /obj/item/fish/skin_crab name = "skin crab" @@ -72,7 +60,7 @@ average_size = 40 average_weight = 750 stable_population = 5 - fish_flags = parent_type::fish_flags & ~FISH_FLAG_SHOW_IN_CATALOG + show_in_catalog = FALSE beauty = FISH_BEAUTY_GREAT favorite_bait = list( list( @@ -83,8 +71,3 @@ fillet_type = /obj/item/food/meat/slab/rawcrab random_case_rarity = FISH_RARITY_NOPE -/obj/item/fish/skin_crab/get_fish_taste() - return list("raw crab" = 2) - -/obj/item/fish/skin_crab/get_fish_taste_cooked() - return list("cooked crab" = 2) diff --git a/code/modules/fishing/fish/types/saltwater.dm b/code/modules/fishing/fish/types/saltwater.dm index afb14436fadfc..0271c7f300876 100644 --- a/code/modules/fishing/fish/types/saltwater.dm +++ b/code/modules/fishing/fish/types/saltwater.dm @@ -14,9 +14,6 @@ required_temperature_min = MIN_AQUARIUM_TEMP+22 required_temperature_max = MIN_AQUARIUM_TEMP+30 -/obj/item/fish/clownfish/get_fish_taste() - return list("raw fish" = 2, "something funny" = 1) - /obj/item/fish/clownfish/lube name = "lubefish" desc = "A clownfish exposed to cherry-flavored lube for far too long. First discovered the days following a cargo incident around the seas of Europa, when thousands of thousands of thousands..." @@ -230,15 +227,9 @@ required_temperature_max = MIN_AQUARIUM_TEMP+26 fish_traits = list(/datum/fish_trait/heavy, /datum/fish_trait/carnivore, /datum/fish_trait/predator, /datum/fish_trait/ink, /datum/fish_trait/camouflage, /datum/fish_trait/wary) -/obj/item/fish/squid/get_fish_taste() - return list("raw mollusk" = 2) - -/obj/item/fish/squid/get_fish_taste_cooked() - return list("cooked mollusk" = 2, "tenderness" = 0.5) - /obj/item/fish/monkfish name = "monkfish" - desc = "A member of the Lophiid family of anglerfish. It goes by several different names, however none of them will make it look any prettier, nor be any less delicious." + desc = "A member of the Lophiid family of anglerfish. It goes by several different names, however none of them will make it look any prettier, nor any less delicious." icon_state = "monkfish" required_fluid_type = AQUARIUM_FLUID_SALTWATER sprite_height = 7 diff --git a/code/modules/fishing/fish/types/station.dm b/code/modules/fishing/fish/types/station.dm index baf104ae14f2f..8dd459452ab91 100644 --- a/code/modules/fishing/fish/types/station.dm +++ b/code/modules/fishing/fish/types/station.dm @@ -20,20 +20,6 @@ ) beauty = FISH_BEAUTY_DISGUSTING -/obj/item/fish/ratfish/get_fish_taste() - return list("vermin" = 2, "maintenance" = 1) - -/obj/item/fish/ratfish/get_fish_taste_cooked() - return list("cooked vermin" = 2, "burned fur" = 0.5) - -/obj/item/fish/ratfish/get_food_types() - return MEAT|RAW|GORE //Not-so-quite-seafood - -/obj/item/fish/ratfish/get_base_edible_reagents_to_add() - var/list/return_list = ..() - return_list[/datum/reagent/rat_spit] = 1 - return return_list - /obj/item/fish/ratfish/Initialize(mapload, apply_qualities = TRUE) . = ..() //stable pop reflects the config for how many mice migrate. powerful... @@ -57,9 +43,6 @@ evolution_types = list(/datum/fish_evolution/purple_sludgefish) beauty = FISH_BEAUTY_NULL -/obj/item/fish/sludgefish/get_fish_taste() - return list("raw fish" = 2, "eau de toilet" = 1) - /obj/item/fish/sludgefish/purple name = "purple sludgefish" desc = "A misshapen, fragile, loosely fish-like living goop. This one has developed sexual reproduction mechanisms, and a purple tint to boot." @@ -74,12 +57,13 @@ icon_state_dead = "slimefish_dead" sprite_width = 7 sprite_height = 7 - fish_flags = parent_type::fish_flags & ~FISH_DO_FLOP_ANIM //it already has a cute bouncy wiggle. :3 + do_flop_animation = FALSE //it already has a cute bouncy wiggle. :3 random_case_rarity = FISH_RARITY_VERY_RARE required_fluid_type = AQUARIUM_FLUID_ANADROMOUS stable_population = 4 health = 150 fillet_type = /obj/item/slime_extract/grey + grind_results = list(/datum/reagent/toxin/slimejelly = 10) fish_traits = list(/datum/fish_trait/toxin_immunity, /datum/fish_trait/crossbreeder) favorite_bait = list( list( @@ -94,9 +78,3 @@ ) required_temperature_min = MIN_AQUARIUM_TEMP+20 beauty = FISH_BEAUTY_GREAT - -/obj/item/fish/slimefish/get_food_types() - return SEAFOOD|TOXIC - -/obj/item/fish/slimefish/get_base_edible_reagents_to_add() - return list(/datum/reagent/toxin/slimejelly = 5) diff --git a/code/modules/fishing/fish/types/syndicate.dm b/code/modules/fishing/fish/types/syndicate.dm index bf99f4302818e..a3e9a8519b4f3 100644 --- a/code/modules/fishing/fish/types/syndicate.dm +++ b/code/modules/fishing/fish/types/syndicate.dm @@ -13,9 +13,6 @@ required_temperature_max = MIN_AQUARIUM_TEMP+40 beauty = FISH_BEAUTY_BAD -/obj/item/fish/emulsijack/get_fish_taste() - return list("raw fish" = 2, "acid" = 1) //no scales - /obj/item/fish/donkfish name = "donk co. company patent donkfish" desc = "A lab-grown donkfish. Its invention was an accident for the most part, as it was intended to be consumed in donk pockets. Unfortunately, it tastes horrible, so it has now become a pseudo-mascot." @@ -49,7 +46,6 @@ /datum/fish_trait/mixotroph, /datum/fish_trait/electrogenesis, ) - electrogenesis_power = 0.9 MEGA JOULES beauty = FISH_BEAUTY_UGLY /obj/item/fish/chainsawfish @@ -97,9 +93,6 @@ . = ..() AddElement(/datum/element/update_icon_updates_onmob) -/obj/item/fish/chainsawfish/get_fish_taste() - return list("raw fish" = 2.5, "anger" = 1) - /obj/item/fish/chainsawfish/update_icon_state() if(status == FISH_DEAD) inhand_icon_state = "chainsawfish_dead" @@ -208,13 +201,7 @@ /obj/item/fish, ) -/obj/item/fish/pike/armored/get_fish_taste() - return list("raw fish" = 2.5, "metal" = 1) - -/obj/item/fish/pike/armored/get_fish_taste() - return list("cooked fish" = 2.5, "metal" = 1) - -/obj/item/fish/pike/armored/get_force_rank() +/obj/item/fish/swordfish/get_force_rank() switch(w_class) if(WEIGHT_CLASS_TINY) force -= 11 diff --git a/code/modules/fishing/fish/types/tiziran.dm b/code/modules/fishing/fish/types/tiziran.dm index b6fd43709f2d6..a39e82ce6c422 100644 --- a/code/modules/fishing/fish/types/tiziran.dm +++ b/code/modules/fishing/fish/types/tiziran.dm @@ -24,21 +24,10 @@ required_fluid_type = AQUARIUM_FLUID_SALTWATER stable_population = 4 fillet_type = /obj/item/food/fishmeat/gunner_jellyfish - fish_traits = list(/datum/fish_trait/hallucinogenic) required_temperature_min = MIN_AQUARIUM_TEMP+24 required_temperature_max = MIN_AQUARIUM_TEMP+32 beauty = FISH_BEAUTY_GOOD -/obj/item/fish/gunner_jellyfish/Initialize(mapload, apply_qualities = TRUE) - . = ..() - AddElement(/datum/element/quality_food_ingredient, FOOD_COMPLEXITY_2) - -/obj/item/fish/gunner_jellyfish/get_fish_taste() - return list("cold jelly" = 2) - -/obj/item/fish/gunner_jellyfish/get_fish_taste_cooked() - return list("crunchy tenderness" = 2) - /obj/item/fish/needlefish name = "needlefish" desc = "A tiny, transparent fish which resides in large schools in the oceans of Tizira. A common food for other, larger fish." @@ -78,9 +67,3 @@ /obj/item/fish/armorfish/Initialize(mapload, apply_qualities = TRUE) . = ..() add_traits(list(TRAIT_FISHING_BAIT, TRAIT_GOOD_QUALITY_BAIT), INNATE_TRAIT) - -/obj/item/fish/chasm_crab/get_fish_taste() - return list("raw prawn" = 2) - -/obj/item/fish/chasm_crab/get_fish_taste_cooked() - return list("cooked prawn" = 2) diff --git a/code/modules/fishing/fish_catalog.dm b/code/modules/fishing/fish_catalog.dm index 4f329861ff93c..f0880804f8eb0 100644 --- a/code/modules/fishing/fish_catalog.dm +++ b/code/modules/fishing/fish_catalog.dm @@ -3,13 +3,8 @@ name = "Fish Encyclopedia" desc = "Indexes all fish known to mankind (and related species)." icon_state = "fishbook" - custom_price = PAYCHECK_CREW * 2 starting_content = "Lot of fish stuff" //book wrappers could use cleaning so this is not necessary -/obj/item/book/manual/fish_catalog/Initialize(mapload) - . = ..() - AddComponent(/datum/component/adjust_fishing_difficulty, -4, ITEM_SLOT_HANDS) - /obj/item/book/manual/fish_catalog/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) @@ -21,10 +16,11 @@ var/static/fish_info if(!fish_info) fish_info = list() - for(var/obj/item/fish/fish as anything in subtypesof(/obj/item/fish)) - if(!(initial(fish.fish_flags) & FISH_FLAG_SHOW_IN_CATALOG)) - continue + for(var/_fish_type as anything in subtypesof(/obj/item/fish)) + var/obj/item/fish/fish = _fish_type var/list/fish_data = list() + if(!initial(fish.show_in_catalog)) + continue fish_data["name"] = initial(fish.name) fish_data["desc"] = initial(fish.desc) fish_data["fluid"] = initial(fish.required_fluid_type) @@ -41,9 +37,27 @@ else fish_data["feed"] = "[AQUARIUM_COMPANY] Fish Feed" fish_data["fishing_tips"] = build_fishing_tips(fish) - fish_data["beauty"] = SSfishing.fish_properties[fish][FISH_PROPERTIES_BEAUTY_SCORE] - + var/beauty_score = initial(fish.beauty) + switch(beauty_score) + if(-INFINITY to FISH_BEAUTY_DISGUSTING) + beauty_score = "OH HELL NAW!" + if(FISH_BEAUTY_DISGUSTING to FISH_BEAUTY_UGLY) + beauty_score = "☆☆☆☆☆" + if(FISH_BEAUTY_UGLY to FISH_BEAUTY_BAD) + beauty_score = "★☆☆☆☆" + if(FISH_BEAUTY_BAD to FISH_BEAUTY_NULL) + beauty_score = "★★☆☆☆" + if(FISH_BEAUTY_NULL to FISH_BEAUTY_GENERIC) + beauty_score = "★★★☆☆" + if(FISH_BEAUTY_GENERIC to FISH_BEAUTY_GOOD) + beauty_score = "★★★★☆" + if(FISH_BEAUTY_GOOD to FISH_BEAUTY_GREAT) + beauty_score = "★★★★★" + if(FISH_BEAUTY_GREAT to INFINITY) + beauty_score = "★★★★★★" + fish_data["beauty"] = beauty_score fish_info += list(fish_data) + // TODO: Custom entries for unusual stuff .["fish_info"] = fish_info .["sponsored_by"] = AQUARIUM_COMPANY @@ -54,12 +68,12 @@ return initial(bait_item.name) if(islist(bait)) var/list/special_identifier = bait - switch(special_identifier[FISH_BAIT_TYPE]) - if(FISH_BAIT_FOODTYPE) - return jointext(bitfield_to_list(special_identifier[FISH_BAIT_VALUE], FOOD_FLAGS_IC),",") - if(FISH_BAIT_REAGENT) - var/datum/reagent/prototype = special_identifier[FISH_BAIT_VALUE] - return "[initial(prototype.name)] (at least [special_identifier[FISH_BAIT_AMOUNT]]u)" + switch(special_identifier["Type"]) + if("Foodtype") + return jointext(bitfield_to_list(special_identifier["Value"], FOOD_FLAGS_IC),",") + if("Reagent") + var/datum/reagent/prototype = special_identifier["Value"] + return "[initial(prototype.name)] (at least [special_identifier["Amount"]]u)" else stack_trace("Unknown bait identifier in fish favourite/disliked list") return "SOMETHING VERY WEIRD" @@ -77,8 +91,8 @@ spot_descriptions += source.catalog_description .["spots"] = english_list(spot_descriptions, nothing_text = "Unknown") var/list/fish_list_properties = SSfishing.fish_properties - var/list/fav_bait = fish_list_properties[fishy][FISH_PROPERTIES_FAV_BAIT] - var/list/disliked_bait = fish_list_properties[fishy][FISH_PROPERTIES_BAD_BAIT] + var/list/fav_bait = fish_list_properties[fishy][NAMEOF(fishy, favorite_bait)] + var/list/disliked_bait = fish_list_properties[fishy][NAMEOF(fishy, disliked_bait)] var/list/bait_list = list() // Favourite/Disliked bait for(var/bait_type_or_trait in fav_bait) @@ -90,7 +104,7 @@ .["disliked_bait"] = english_list(bait_list, nothing_text = "None") // Fish traits description var/list/trait_descriptions = list() - var/list/fish_traits = fish_list_properties[fishy][FISH_PROPERTIES_TRAITS] + var/list/fish_traits = fish_list_properties[fishy][NAMEOF(fishy, fish_traits)] var/fish_difficulty = initial(fishy.fishing_difficulty_modifier) for(var/fish_trait in fish_traits) var/datum/fish_trait/trait = GLOB.fish_traits[fish_trait] diff --git a/code/modules/fishing/fish_movement.dm b/code/modules/fishing/fish_movement.dm index b288161b19237..a328903617f62 100644 --- a/code/modules/fishing/fish_movement.dm +++ b/code/modules/fishing/fish_movement.dm @@ -53,10 +53,6 @@ else long_jump_chance *= master.difficulty -/datum/fish_movement/proc/reset_difficulty_values() - short_jump_chance = initial(short_jump_chance) - long_jump_chance = initial(long_jump_chance) - ///The main proc, called by minigame every SSfishing tick while it's in the 'active' phase. /datum/fish_movement/proc/move_fish(seconds_per_tick) times_fired++ @@ -194,12 +190,6 @@ plunging_speed += round(plunging_speed * master.difficulty * 0.03) fish_idle_velocity += plunging_speed //so it can be safely subtracted if the fish starts at the bottom. -/datum/fish_movement/plunger/reset_difficulty_values() - . = ..() - if(is_plunging) - fish_idle_velocity -= plunging_speed - plunging_speed = initial(plunging_speed) - /datum/fish_movement/plunger/move_fish(seconds_per_tick) var/fish_area = FISHING_MINIGAME_AREA - master.fish_height if(is_plunging) diff --git a/code/modules/fishing/fishing_equipment.dm b/code/modules/fishing/fishing_equipment.dm index 7fb33da74ffad..e20f6c54a9104 100644 --- a/code/modules/fishing/fishing_equipment.dm +++ b/code/modules/fishing/fishing_equipment.dm @@ -16,8 +16,6 @@ var/list/fishing_line_traits /// Color of the fishing line var/line_color = COLOR_GRAY - ///The description given to the autowiki - var/wiki_desc = "A generic fishing line. Without one, the casting range of the rod will be significantly hampered." /obj/item/fishing_line/reinforced name = "reinforced fishing line reel" @@ -25,7 +23,6 @@ icon_state = "reel_green" fishing_line_traits = FISHING_LINE_REINFORCED line_color = "#2b9c2b" - wiki_desc = "Allows you to fish in lava and plasma rivers and lakes." /obj/item/fishing_line/cloaked name = "cloaked fishing line reel" @@ -33,7 +30,6 @@ icon_state = "reel_white" fishing_line_traits = FISHING_LINE_CLOAKED line_color = "#82cfdd" - wiki_desc = "Fishing anxious and wary fish will be easier with this equipped." /obj/item/fishing_line/bouncy name = "flexible fishing line reel" @@ -41,7 +37,6 @@ icon_state = "reel_red" fishing_line_traits = FISHING_LINE_BOUNCY line_color = "#99313f" - wiki_desc = "It reduces the progression loss during the fishing minigame." /obj/item/fishing_line/sinew name = "fishing sinew" @@ -49,7 +44,6 @@ icon_state = "reel_sinew" fishing_line_traits = FISHING_LINE_REINFORCED|FISHING_LINE_STIFF line_color = "#d1cca3" - wiki_desc = "Crafted from sinew. It allows you to fish in lava and plasma like the reinforced line, but it'll make the minigame harder." /** * A special line reel that let you skip the biting phase of the minigame, netting you a completion bonus, @@ -62,9 +56,6 @@ icon_state = "reel_auto" fishing_line_traits = FISHING_LINE_AUTOREEL line_color = "#F88414" - wiki_desc = "Automatically starts the minigame once the fish bites the bait. It also spin fishing lures for you without needing an input. \ - It can also be used to snag in objects from a distance more rapidly.
    \ - It requires the Advanced Fishing Technology Node to be researched to be printed." /obj/item/fishing_line/auto_reel/Initialize(mapload) . = ..() @@ -127,8 +118,7 @@ var/rod_overlay_icon_state = "hook_overlay" /// What subtype of `/obj/item/chasm_detritus` do we fish out of chasms? Defaults to `/obj/item/chasm_detritus`. var/chasm_detritus_type = /datum/chasm_detritus - ///The description given to the autowiki - var/wiki_desc = "A generic fishing hook. You won't be able to fish without one." + /** * Simple getter proc for hooks to implement special hook bonuses for @@ -172,7 +162,6 @@ icon_state = "treasure" rod_overlay_icon_state = "hook_treasure_overlay" chasm_detritus_type = /datum/chasm_detritus/restricted/objects - wiki_desc = "It vastly improves the chances of catching things other than fish." /obj/item/fishing_hook/magnet/Initialize(mapload) . = ..() @@ -201,14 +190,13 @@ icon_state = "gold_shiny" fishing_hook_traits = FISHING_HOOK_SHINY rod_overlay_icon_state = "hook_shiny_overlay" - wiki_desc = "It's used to attract shiny-loving fish and make them easier to catch." /obj/item/fishing_hook/weighted name = "weighted hook" icon_state = "weighted" fishing_hook_traits = FISHING_HOOK_WEIGHTED rod_overlay_icon_state = "hook_weighted_overlay" - wiki_desc = "It reduces the bounce that happens when you hit the boundaries of the minigame bar." + /obj/item/fishing_hook/rescue name = "rescue hook" @@ -216,8 +204,6 @@ icon_state = "rescue" rod_overlay_icon_state = "hook_rescue_overlay" chasm_detritus_type = /datum/chasm_detritus/restricted/bodies - wiki_desc = "A hook used to rescue bodies whom have fallen into chasms. \ - You won't catch fish with it, nor it can't be used for fishing outside of chasms, though it can still be used to reel in people and items from unreachable locations.." /obj/item/fishing_hook/rescue/can_be_hooked(atom/target) return ..() || isliving(target) @@ -247,7 +233,6 @@ name = "bone hook" desc = "A simple hook carved from sharpened bone" icon_state = "hook_bone" - wiki_desc = "A generic fishing hook carved out of sharpened bone. Bone fishing rods come pre-equipped with it." /obj/item/fishing_hook/stabilized name = "gyro-stabilized hook" @@ -255,8 +240,6 @@ icon_state = "gyro" fishing_hook_traits = FISHING_HOOK_BIDIRECTIONAL rod_overlay_icon_state = "hook_gyro_overlay" - wiki_desc = "It allows you to move both up (left-click) and down (right-click) during the minigame while negating gravity.
    \ - It requires the Advanced Fishing Technology Node to be researched to be printed." /obj/item/fishing_hook/stabilized/examine(mob/user) . = ..() @@ -269,9 +252,6 @@ w_class = WEIGHT_CLASS_NORMAL fishing_hook_traits = FISHING_HOOK_NO_ESCAPE|FISHING_HOOK_NO_ESCAPE|FISHING_HOOK_KILL rod_overlay_icon_state = "hook_jaws_overlay" - wiki_desc = "A beartrap-looking hook that makes losing the fishing minigame impossible (Unless you drop the rod or get stunned). However it'll hurt the fish and eventually kill it. \ - Funnily enough, you can snag in people with it too. It won't hurt them like a actual beartrap, but it'll still slow them down.
    \ - It has to be bought from the black market uplink." /obj/item/fishing_hook/jaws/can_be_hooked(atom/target) return ..() || isliving(target) @@ -287,9 +267,6 @@ icon_state = "fishing" inhand_icon_state = "artistic_toolbox" material_flags = NONE - custom_price = PAYCHECK_CREW * 3 - ///How much holding this affects fishing difficulty - var/fishing_modifier = -2 /obj/item/storage/toolbox/fishing/Initialize(mapload) . = ..() @@ -298,7 +275,6 @@ /obj/item/fishing_rod, )) atom_storage.exception_hold = exception_cache - AddComponent(/datum/component/adjust_fishing_difficulty, -2, ITEM_SLOT_HANDS) /obj/item/storage/toolbox/fishing/PopulateContents() new /obj/item/bait_can/worm(src) @@ -329,7 +305,6 @@ desc = "Contains EVERYTHING (almost) you need for your fishing trip." icon_state = "gold" inhand_icon_state = "toolbox_gold" - fishing_modifier = -7 /obj/item/storage/toolbox/fishing/master/PopulateContents() new /obj/item/fishing_rod/telescopic/master(src) @@ -344,7 +319,6 @@ /obj/item/storage/box/fishing_hooks name = "fishing hook set" illustration = "fish" - custom_price = PAYCHECK_CREW * 2 /obj/item/storage/box/fishing_hooks/PopulateContents() new /obj/item/fishing_hook/magnet(src) @@ -361,7 +335,6 @@ /obj/item/storage/box/fishing_lines name = "fishing line set" illustration = "fish" - custom_price = PAYCHECK_CREW * 2 /obj/item/storage/box/fishing_lines/PopulateContents() new /obj/item/fishing_line/bouncy(src) @@ -410,7 +383,6 @@ icon_state = "plasticbox" foldable_result = null illustration = "fish" - custom_price = PAYCHECK_CREW * 9 /obj/item/storage/box/fishing_lures/PopulateContents() new /obj/item/paper/lures_instructions(src) diff --git a/code/modules/fishing/fishing_minigame.dm b/code/modules/fishing/fishing_minigame.dm index 073158b8fdc0f..fc30d2aa6970f 100644 --- a/code/modules/fishing/fishing_minigame.dm +++ b/code/modules/fishing/fishing_minigame.dm @@ -32,8 +32,6 @@ ///The standard pixel height of the fish (minus a pixel on each direction for the sake of a better looking sprite) #define MINIGAME_FISH_HEIGHT 4 -GLOBAL_LIST_EMPTY(fishing_challenges_by_user) - /datum/fishing_challenge /// When the ui minigame phase started var/start_time @@ -63,8 +61,6 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) var/obj/item/fishing_rod/used_rod /// float visual var/obj/effect/fishing_float/float - ///The physical fishing spot our float is hovering - var/atom/location /// Background icon state from fishing_hud.dmi var/background = "background_default" /// Fish icon state from fishing_hud.dmi @@ -111,21 +107,31 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) ///The background as shown in the minigame, and the holder of the other visual overlays var/atom/movable/screen/fishing_hud/fishing_hud -/datum/fishing_challenge/New(datum/component/fishing_spot/comp, obj/item/fishing_rod/rod, mob/user) +/datum/fishing_challenge/New(datum/component/fishing_spot/comp, reward_path, obj/item/fishing_rod/rod, mob/user) src.user = user - used_rod = rod - location = comp.parent - float = new(get_turf(location), location) + src.reward_path = reward_path + src.used_rod = rod + var/atom/spot = comp.parent + float = new(get_turf(spot), spot) float.spin_frequency = rod.spin_frequency - RegisterSignal(location, COMSIG_QDELETING, PROC_REF(on_spot_gone)) - RegisterSignal(comp, COMSIG_QDELETING, PROC_REF(on_spot_gone)) + RegisterSignal(spot, COMSIG_QDELETING, PROC_REF(on_spot_gone)) RegisterSignal(comp.fish_source, COMSIG_FISHING_SOURCE_INTERRUPT_CHALLENGE, PROC_REF(interrupt_challenge)) - comp.fish_source.RegisterSignal(src, COMSIG_FISHING_CHALLENGE_ROLL_REWARD, TYPE_PROC_REF(/datum/fish_source, roll_reward_minigame)) - comp.fish_source.RegisterSignal(src, COMSIG_FISHING_CHALLENGE_GET_DIFFICULTY, TYPE_PROC_REF(/datum/fish_source, calculate_difficulty_minigame)) - comp.fish_source.RegisterSignal(user, COMSIG_MOB_COMPLETE_FISHING, TYPE_PROC_REF(/datum/fish_source, on_challenge_completed)) + comp.fish_source.RegisterSignal(src, COMSIG_FISHING_CHALLENGE_COMPLETED, TYPE_PROC_REF(/datum/fish_source, on_challenge_completed)) background = comp.fish_source.background - SEND_SIGNAL(user, COMSIG_MOB_BEGIN_FISHING, src) - GLOB.fishing_challenges_by_user[user] = src + + /// Fish minigame properties + if(ispath(reward_path,/obj/item/fish)) + var/obj/item/fish/fish = reward_path + var/movement_path = initial(fish.fish_movement_type) + mover = new movement_path(src) + // Apply fish trait modifiers + var/list/fish_list_properties = SSfishing.fish_properties + var/list/fish_traits = fish_list_properties[fish][NAMEOF(fish, fish_traits)] + for(var/fish_trait in fish_traits) + var/datum/fish_trait/trait = GLOB.fish_traits[fish_trait] + trait.minigame_mod(rod, user, src) + else + mover = new /datum/fish_movement(src) /// Enable special parameters if(rod.line) @@ -151,8 +157,24 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) completion_loss += user.mind?.get_skill_modifier(/datum/skill/fishing, SKILL_VALUE_MODIFIER)/5 + if(special_effects & FISHING_MINIGAME_RULE_KILL && ispath(reward_path,/obj/item/fish)) + RegisterSignal(comp.fish_source, COMSIG_FISH_SOURCE_REWARD_DISPENSED, PROC_REF(hurt_fish)) + + difficulty += comp.fish_source.calculate_difficulty(reward_path, rod, user, src) + difficulty = clamp(round(difficulty), FISHING_EASY_DIFFICULTY - 5, 100) + + if(difficulty > FISHING_EASY_DIFFICULTY) + completion -= MAX_FISH_COMPLETION_MALUS * (difficulty * 0.01) + + if(HAS_MIND_TRAIT(user, TRAIT_REVEAL_FISH)) + fish_icon = GLOB.specific_fish_icons[reward_path] || FISH_ICON_DEF + + mover.adjust_to_difficulty() + + bait_height -= round(difficulty * BAIT_HEIGHT_DIFFICULTY_MALUS) + bait_pixel_height = round(MINIGAME_BAIT_HEIGHT * (bait_height/initial(bait_height)), 1) + /datum/fishing_challenge/Destroy(force) - GLOB.fishing_challenges_by_user -= user if(!completed) complete(win = FALSE) if(fishing_line) @@ -163,12 +185,12 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) SStgui.close_uis(src) user = null used_rod = null - location = null QDEL_NULL(mover) return ..() /datum/fishing_challenge/proc/send_alert(message) - location?.balloon_alert(user, message) + var/turf/float_turf = get_turf(float) + float_turf?.balloon_alert(user, message) /datum/fishing_challenge/proc/on_spot_gone(datum/source) SIGNAL_HANDLER @@ -197,11 +219,12 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) active_effects = bitfield_to_list(special_effects & FISHING_MINIGAME_ACTIVE_EFFECTS) // If fishing line breaks los / rod gets dropped / deleted RegisterSignal(used_rod, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_attack_self)) + ADD_TRAIT(user, TRAIT_GONE_FISHING, WEAKREF(src)) user.add_mood_event("fishing", /datum/mood_event/fishing) RegisterSignal(user, COMSIG_MOB_CLICKON, PROC_REF(handle_click)) start_baiting_phase() to_chat(user, span_notice("You start fishing...")) - playsound(location, 'sound/effects/splash.ogg', 100) + playsound(float, 'sound/effects/splash.ogg', 100) ///Set the timers for lure that need to be spun at intervals. /datum/fishing_challenge/proc/set_lure_timers() @@ -243,7 +266,7 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) /datum/fishing_challenge/proc/on_float_or_user_move(datum/source) SIGNAL_HANDLER - if(!user.CanReach(location)) + if(!user.CanReach(float)) user.balloon_alert(user, "too far!") interrupt() @@ -312,6 +335,8 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) if(phase == MINIGAME_PHASE) remove_minigame_hud() if(!QDELETED(user)) + UnregisterSignal(user, SIGNAL_REMOVETRAIT(TRAIT_GONE_FISHING)) + user.remove_traits(list(TRAIT_GONE_FISHING, TRAIT_ACTIVELY_FISHING), WEAKREF(src)) if(start_time) var/seconds_spent = (world.time - start_time) * 0.1 if(!(special_effects & FISHING_MINIGAME_RULE_NO_EXP)) @@ -320,13 +345,12 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) 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) - SEND_SIGNAL(user, COMSIG_MOB_COMPLETE_FISHING, src, win) + playsound(float, 'sound/effects/bigsplash.ogg', 100) + SEND_SIGNAL(src, COMSIG_FISHING_CHALLENGE_COMPLETED, user, win) if(!QDELETED(src)) qdel(src) /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 last_baiting_click = world.time if(penalty) @@ -346,13 +370,8 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) /datum/fishing_challenge/proc/start_biting_phase() phase = BITING_PHASE - - var/list/rewards = list() - SEND_SIGNAL(src, COMSIG_FISHING_CHALLENGE_ROLL_REWARD, used_rod, user, location, rewards) - if(length(rewards)) - reward_path = pick(rewards) - playsound(location, 'sound/effects/fish_splash.ogg', 100) - + // Trashing animation + playsound(float, 'sound/effects/fish_splash.ogg', 100) if(HAS_MIND_TRAIT(user, TRAIT_REVEAL_FISH)) switch(fish_icon) if(FISH_ICON_DEF) @@ -421,61 +440,7 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) var/damage = CEILING((world.time - start_time)/10 * FISH_DAMAGE_PER_SECOND, 1) reward.adjust_health(reward.health - damage) -/datum/fishing_challenge/proc/get_difficulty() - var/list/difficulty_holder = list(0) - SEND_SIGNAL(src, COMSIG_FISHING_CHALLENGE_GET_DIFFICULTY, reward_path, used_rod, user, difficulty_holder) - difficulty = difficulty_holder[1] - //If you manage to be so well-equipped and skilled to completely crush the difficulty, just skip to the reward. - if(difficulty <= 0) - complete(TRUE) - return FALSE - difficulty = clamp(round(difficulty), FISHING_MINIMUM_DIFFICULTY, 100) - return TRUE - -/datum/fishing_challenge/proc/update_difficulty() - if(phase != MINIGAME_PHASE) - return - var/old_difficulty = difficulty - //early return if the difficulty is the same or we crush the minigame all the way to 0 difficulty - if(!get_difficulty() || difficulty == old_difficulty) - return - bait_height = initial(bait_height) - experience_multiplier -= difficulty * FISHING_SKILL_DIFFIULTY_EXP_MULT - mover.reset_difficulty_values() - adjust_to_difficulty() - -/datum/fishing_challenge/proc/adjust_to_difficulty() - mover.adjust_to_difficulty() - bait_height -= round(difficulty * BAIT_HEIGHT_DIFFICULTY_MALUS) - bait_pixel_height = round(MINIGAME_BAIT_HEIGHT * (bait_height/initial(bait_height)), 1) - experience_multiplier += difficulty * FISHING_SKILL_DIFFIULTY_EXP_MULT - fishing_hud.hud_bait.adjust_to_difficulty(src) - -///Get the difficulty and other variables, than start the minigame /datum/fishing_challenge/proc/start_minigame_phase(auto_reel = FALSE) - SEND_SIGNAL(user, COMSIG_MOB_BEGIN_FISHING_MINIGAME, src) - if(!get_difficulty()) //we totalized 0 or less difficulty, instant win. - return - - if(difficulty > FISHING_DEFAULT_DIFFICULTY) - completion -= MAX_FISH_COMPLETION_MALUS * (difficulty * 0.01) - - if(HAS_MIND_TRAIT(user, TRAIT_REVEAL_FISH)) - fish_icon = GLOB.specific_fish_icons[reward_path] || FISH_ICON_DEF - - /// Fish minigame properties - if(ispath(reward_path,/obj/item/fish)) - var/obj/item/fish/fish = reward_path - var/movement_path = initial(fish.fish_movement_type) - mover = new movement_path(src) - // Apply fish trait modifiers - var/list/fish_traits = SSfishing.fish_properties[fish][FISH_PROPERTIES_TRAITS] - for(var/fish_trait in fish_traits) - var/datum/fish_trait/trait = GLOB.fish_traits[fish_trait] - trait.minigame_mod(used_rod, user, src) - else - mover = new /datum/fish_movement(src) - if(auto_reel) completion *= 1.3 else @@ -493,14 +458,11 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) fish_position = rand(0, (FISHING_MINIGAME_AREA - fish_height) * 0.8) var/diff_dist = 100 + difficulty bait_position = clamp(round(fish_position + rand(-diff_dist, diff_dist) - bait_height * 0.5), 0, FISHING_MINIGAME_AREA - bait_height) - if(!prepare_minigame_hud()) get_stack_trace("couldn't prepare minigame hud for a fishing challenge.") //just to be sure. This shouldn't happen. qdel(src) return - - adjust_to_difficulty() - + ADD_TRAIT(user, TRAIT_ACTIVELY_FISHING, WEAKREF(src)) phase = MINIGAME_PHASE deltimer(next_phase_timer) if((FISHING_MINIGAME_RULE_KILL in special_effects) && ispath(reward_path,/obj/item/fish)) @@ -508,6 +470,7 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) var/wait_time = (initial(fish.health) / FISH_DAMAGE_PER_SECOND) SECONDS addtimer(CALLBACK(src, PROC_REF(win_anyway)), wait_time, TIMER_DELETE_ME) start_time = world.time + experience_multiplier += difficulty * FISHING_SKILL_DIFFIULTY_EXP_MULT ///Throws a stack with prefixed text. /datum/fishing_challenge/proc/get_stack_trace(init_text) @@ -733,24 +696,18 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) icon = 'icons/hud/fishing_hud.dmi' icon_state = "bait" vis_flags = VIS_INHERIT_ID - ///The stored value we used to squish the bar based on the difficulty - var/current_vertical_transform /atom/movable/screen/hud_bait/Initialize(mapload, datum/hud/hud_owner, datum/fishing_challenge/challenge) . = ..() if(!challenge || challenge.bait_pixel_height == MINIGAME_BAIT_HEIGHT) return - adjust_to_difficulty(challenge) - -/atom/movable/screen/hud_bait/proc/adjust_to_difficulty(datum/fishing_challenge/challenge) - if(current_vertical_transform) - transform = transform.Scale(1, 1/current_vertical_transform) - pixel_z = 0 - var/list/icon_dimensions = get_icon_dimensions(icon) - var/icon_height = icon_dimensions["height"] - current_vertical_transform = challenge.bait_pixel_height/MINIGAME_BAIT_HEIGHT - transform = transform.Scale(1, current_vertical_transform) - pixel_z = -icon_height * (1 - current_vertical_transform) * 0.5 + var/static/icon_height + if(!icon_height) + var/list/icon_dimensions = get_icon_dimensions(icon) + icon_height = icon_dimensions["height"] + var/height_percent_diff = challenge.bait_pixel_height/MINIGAME_BAIT_HEIGHT + transform = transform.Scale(1, height_percent_diff) + pixel_z = -icon_height * (1 - height_percent_diff) * 0.5 /atom/movable/screen/hud_fish icon = 'icons/hud/fishing_hud.dmi' @@ -788,12 +745,8 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) /obj/effect/fishing_float/Initialize(mapload, atom/spot) . = ..() - if(!spot) - return if(ismovable(spot)) // we want the float and therefore the fishing line to stay connected with the fishing spot. RegisterSignal(spot, COMSIG_MOVABLE_MOVED, PROC_REF(follow_movable)) - SET_BASE_PIXEL(spot.pixel_x, spot.pixel_y) - SET_BASE_VISUAL_PIXEL(spot.pixel_w, spot.pixel_z) /obj/effect/fishing_float/proc/follow_movable(atom/movable/source) SIGNAL_HANDLER diff --git a/code/modules/fishing/fishing_portal_machine.dm b/code/modules/fishing/fishing_portal_machine.dm index f322bf92c78e3..8b157cbebfff3 100644 --- a/code/modules/fishing/fishing_portal_machine.dm +++ b/code/modules/fishing/fishing_portal_machine.dm @@ -11,46 +11,6 @@ ///The current fishing spot loaded in var/datum/component/fishing_spot/active - ///A list of fishing spot it's linked to with a multitool. - var/list/linked_fishing_spots - ///The maximum number of fishing spots it can be linked to - var/max_fishing_spots = 1 - ///If true, the fishing portal can stay connected to a linked fishing spot even on different z-levels - var/long_range_link = FALSE - -/obj/machinery/fishing_portal_generator/Initialize(mapload) - . = ..() - var/static/list/tool_screentips = list( - TOOL_MULTITOOL = list( - SCREENTIP_CONTEXT_LMB = "Link", - SCREENTIP_CONTEXT_RMB = "Unlink fishing spots" - ), - ) - AddElement(/datum/element/contextual_screentip_tools, tool_screentips) - ADD_TRAIT(src, TRAIT_UNLINKABLE_FISHING_SPOT, INNATE_TRAIT) - -/obj/machinery/fishing_portal_generator/Destroy() - deactivate() - linked_fishing_spots = null - return ..() - -///Higher tier parts let you link to more fishing spots at once and eventually let you connect through different zlevels. -/obj/machinery/fishing_portal_generator/RefreshParts() - . = ..() - max_fishing_spots = 0 - long_range_link = FALSE - for(var/datum/stock_part/matter_bin/matter_bin in component_parts) - max_fishing_spots += matter_bin.tier * 0.5 - max_fishing_spots = ROUND_UP(max_fishing_spots) - for(var/datum/stock_part/capacitor/capacitor in component_parts) - if(capacitor.tier >= 3) - long_range_link = TRUE - if(!long_range_link) - check_fishing_spot_z() - if(length(linked_fishing_spots) > max_fishing_spots) - if(active) - deactivate() - linked_fishing_spots.len = max_fishing_spots /obj/machinery/fishing_portal_generator/on_set_panel_open() update_appearance() @@ -61,94 +21,9 @@ default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS -/obj/machinery/fishing_portal_generator/multitool_act(mob/living/user, obj/item/multitool/tool) - if(machine_stat & NOPOWER) - balloon_alert(user, "no power!") - return ITEM_INTERACT_BLOCKING - var/unlink = tool.buffer == src - tool.set_buffer(unlink ? null : src) - balloon_alert(user, "fish-porter [unlink ? "un" : ""]linked") - if(!unlink) - tool.item_flags |= ITEM_HAS_CONTEXTUAL_SCREENTIPS - RegisterSignal(tool, COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET, PROC_REF(multitool_context)) - RegisterSignal(tool, COMSIG_MULTITOOL_REMOVE_BUFFER, PROC_REF(multitool_unbuffered)) - return ITEM_INTERACT_SUCCESS - -/obj/machinery/fishing_portal_generator/multitool_act_secondary(mob/living/user, obj/item/tool) - if(machine_stat & NOPOWER) - balloon_alert(user, "no power!") - return ITEM_INTERACT_BLOCKING - if(!length(linked_fishing_spots)) - balloon_alert(user, "nothing to unlink!") - return ITEM_INTERACT_BLOCKING - var/list/fishing_list = list() - var/id = 1 - for(var/atom/spot as anything in linked_fishing_spots) - var/choice_name = "[spot.name] ([id])" - fishing_list[choice_name] = spot - id++ - var/list/choices = list() - for(var/radial_name in fishing_list) - var/datum/fish_source/source = fishing_list[radial_name] - var/mutable_appearance/appearance = mutable_appearance('icons/hud/radial_fishing.dmi', source.radial_state) - appearance.add_overlay('icons/hud/radial_fishing.dmi', "minus_sign") - choices[radial_name] = appearance - - 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) - return - var/atom/spot = fishing_list[choice] - if(QDELETED(spot) || !(spot in linked_fishing_spots) || !can_interact(user)) - return - unlink_fishing_spot(spot) - balloon_alert(user, "fishing spot unlinked") - -/obj/machinery/fishing_portal_generator/proc/multitool_context(obj/item/source, list/context, atom/target, mob/living/user) - SIGNAL_HANDLER - if(HAS_TRAIT(target, TRAIT_FISHING_SPOT) && !HAS_TRAIT(target, TRAIT_UNLINKABLE_FISHING_SPOT)) - context[SCREENTIP_CONTEXT_LMB] = "Link to fish-porter" - return CONTEXTUAL_SCREENTIP_SET - return NONE - -/obj/machinery/fishing_portal_generator/proc/multitool_unbuffered(datum/source, datum/buffer) - SIGNAL_HANDLER - UnregisterSignal(source, list(COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET, COMSIG_MULTITOOL_REMOVE_BUFFER)) - -///Called when using a multitool on any other fishing source. -/obj/machinery/fishing_portal_generator/proc/link_fishing_spot(datum/fish_source/source, atom/spot, mob/living/user) - if(istype(spot, /obj/machinery/fishing_portal_generator)) //Don't link it to itself or other fishing portals. - return - if(length(linked_fishing_spots) >= max_fishing_spots) - spot.balloon_alert(user, "cannot link more!") - return ITEM_INTERACT_BLOCKING - for(var/other_spot in linked_fishing_spots) - var/datum/fish_source/stored = linked_fishing_spots[other_spot] - if(stored == source) - spot.balloon_alert(user, "already linked!") - playsound(src, 'sound/machines/buzz-sigh.ogg', 15, FALSE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) - return ITEM_INTERACT_BLOCKING - if(HAS_TRAIT(spot, TRAIT_UNLINKABLE_FISHING_SPOT)) - spot.balloon_alert(user, "unlinkable fishing spot!") - playsound(src, 'sound/machines/buzz-sigh.ogg', 15, FALSE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) - return ITEM_INTERACT_BLOCKING - LAZYSET(linked_fishing_spots, spot, source) - RegisterSignal(spot, SIGNAL_REMOVETRAIT(TRAIT_FISHING_SPOT), PROC_REF(unlink_fishing_spot)) - spot.balloon_alert(user, "fishing spot linked") - playsound(spot, 'sound/machines/ping.ogg', 15, TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) - return ITEM_INTERACT_SUCCESS - -/obj/machinery/fishing_portal_generator/proc/unlink_fishing_spot(atom/spot) - SIGNAL_HANDLER - var/datum/fish_source/source = linked_fishing_spots[spot] - if(active?.fish_source == source) - deactivate() - LAZYREMOVE(linked_fishing_spots, spot) - UnregisterSignal(spot, SIGNAL_REMOVETRAIT(TRAIT_FISHING_SPOT)) - /obj/machinery/fishing_portal_generator/examine(mob/user) . = ..() - . += span_notice("You can unlock further portal settings by completing fish scanning experiments, \ - or by connecting it to other fishing spots with a multitool.") + . += span_notice("You can unlock further portal settings by completing fish scanning experiments.") /obj/machinery/fishing_portal_generator/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) @@ -172,78 +47,19 @@ if(!active) return . += "portal_on" - var/datum/fish_source/portal = active.fish_source + var/datum/fish_source/portal/portal = active.fish_source . += portal.overlay_state . += emissive_appearance(icon, "portal_emissive", src) -/obj/machinery/fishing_portal_generator/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) - . = ..() - check_fishing_spot_z() - -/obj/machinery/fishing_portal_generator/proc/check_fishing_spot_z() - if(!active || long_range_link || istype(active.fish_source, /datum/fish_source/portal)) - return - var/turf/new_turf = get_turf(src) - if(!new_turf) - deactivate() - return - for(var/atom/spot as anything in linked_fishing_spots) - if(linked_fishing_spots[spot] != active.fish_source) - continue - var/turf/turf = get_turf(spot) - if(turf.z != new_turf.z && !(is_station_level(turf.z) && is_station_level(new_turf.z))) - deactivate() - -/obj/machinery/fishing_portal_generator/proc/activate(datum/fish_source/selected_source, mob/user) - if(QDELETED(selected_source)) - return - if(machine_stat & NOPOWER) - balloon_alert(user, "no power!") - return ITEM_INTERACT_BLOCKING - if(!istype(selected_source, /datum/fish_source/portal)) //likely from a linked fishing spot - var/abort = TRUE - for(var/atom/spot as anything in linked_fishing_spots) - if(linked_fishing_spots[spot] != selected_source) - continue - if(long_range_link) - abort = FALSE - var/turf/spot_turf = get_turf(spot) - var/turf/turf = get_turf(src) - if(turf.z == spot_turf.z || (is_station_level(turf.z) && is_station_level(spot_turf.z))) - abort = FALSE - if(!abort) - RegisterSignal(spot, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(on_fishing_spot_z_level_changed)) - break - if(abort) - balloon_alert(user, "cannot reach linked!") - return - +/obj/machinery/fishing_portal_generator/proc/activate(datum/fish_source/selected_source) active = AddComponent(/datum/component/fishing_spot, selected_source) - ADD_TRAIT(src, TRAIT_CATCH_AND_RELEASE, INNATE_TRAIT) - if(use_power != NO_POWER_USE) - use_power = ACTIVE_POWER_USE + use_power = ACTIVE_POWER_USE update_icon() /obj/machinery/fishing_portal_generator/proc/deactivate() - if(!active) - return - if(!istype(active.fish_source, /datum/fish_source/portal)) - for(var/atom/spot as anything in linked_fishing_spots) - if(linked_fishing_spots[spot] == active.fish_source) - UnregisterSignal(spot, COMSIG_MOVABLE_Z_CHANGED) QDEL_NULL(active) - - REMOVE_TRAIT(src, TRAIT_CATCH_AND_RELEASE, INNATE_TRAIT) - if(!QDELETED(src)) - if(use_power != NO_POWER_USE) - use_power = IDLE_POWER_USE - update_icon() - -/obj/machinery/fishing_portal_generator/proc/on_fishing_spot_z_level_changed(atom/spot, turf/old_turf, turf/new_turf, same_z_layer) - SIGNAL_HANDLER - var/turf/turf = get_turf(src) - if(turf.z != new_turf.z && !(is_station_level(turf.z) && is_station_level(new_turf.z))) - deactivate() + use_power = IDLE_POWER_USE + update_icon() /obj/machinery/fishing_portal_generator/on_set_is_operational(old_value) if(old_value) @@ -272,24 +88,18 @@ var/datum/fish_source/portal/reward = GLOB.preset_fish_sources[experiment.fish_source_reward] available_fish_sources[reward.radial_name] = reward - var/id = 1 - for(var/atom/spot as anything in linked_fishing_spots) - var/choice_name = "[spot.name] ([id])" - available_fish_sources[choice_name] = linked_fishing_spots[spot] - id++ - if(length(available_fish_sources) == 1) - activate(default, user) + activate(default) return var/list/choices = list() for(var/radial_name in available_fish_sources) - var/datum/fish_source/source = available_fish_sources[radial_name] + var/datum/fish_source/portal/source = available_fish_sources[radial_name] choices[radial_name] = image(icon = 'icons/hud/radial_fishing.dmi', icon_state = source.radial_state) 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)) return - activate(available_fish_sources[choice], user) + activate(available_fish_sources[choice]) /obj/machinery/fishing_portal_generator/emagged obj_flags = parent_type::obj_flags | EMAGGED diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index f18637e3b35ca..291994731c9e3 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -17,12 +17,8 @@ var/cast_range = 3 /// Fishing minigame difficulty modifier (additive) var/difficulty_modifier = 0 - /// Explaination of rod functionality shown in the ui and the autowiki + /// Explaination of rod functionality shown in the ui var/ui_description = "A classic fishing rod, with no special qualities." - /// More explaination shown in the wiki after ui_description - var/wiki_description = "" - /// Is this fishing rod shown in the wiki - var/show_in_wiki = TRUE var/obj/item/bait var/obj/item/fishing_line/line = /obj/item/fishing_line @@ -79,7 +75,7 @@ /obj/item/fishing_rod/add_item_context(obj/item/source, list/context, atom/target, mob/living/user) . = ..() - var/gone_fishing = GLOB.fishing_challenges_by_user[user] + var/gone_fishing = HAS_TRAIT(user, TRAIT_GONE_FISHING) if(currently_hooked || gone_fishing) context[SCREENTIP_CONTEXT_LMB] = (gone_fishing && spin_frequency) ? "Spin" : "Reel in" if(!gone_fishing) @@ -220,7 +216,7 @@ return BEAM_CANCEL_DRAW /obj/item/fishing_rod/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - //this prevent trying to use telekinesis to fish (which would be broken anyway), also whacking people with a rod. + //this prevent trying to use telekinesis to fish (which would be broken anyway) if(!user.contains(src) || (user.combat_mode && !isturf(interacting_with)) ||HAS_TRAIT(interacting_with, TRAIT_COMBAT_MODE_SKIP_INTERACTION)) return ..() return ranged_interact_with_atom(interacting_with, user, modifiers) @@ -299,11 +295,10 @@ /obj/item/fishing_rod/proc/get_fishing_overlays() . = list() var/line_color = line?.line_color || default_line_color - /// Line part by the rod. - if(reel_overlay) - var/mutable_appearance/reel_appearance = mutable_appearance(icon, reel_overlay) - reel_appearance.color = line_color - . += reel_appearance + /// Line part by the rod, always visible + var/mutable_appearance/reel_appearance = mutable_appearance(icon, reel_overlay) + reel_appearance.color = line_color + . += reel_appearance // Line & hook is also visible when only bait is equipped but it uses default appearances then if(hook || bait) @@ -411,7 +406,7 @@ /// Ideally this will be replaced with generic slotted storage datum + display /obj/item/fishing_rod/proc/use_slot(slot, mob/user, obj/item/new_item) - if(fishing_line || GLOB.fishing_challenges_by_user[user]) + if(fishing_line || HAS_TRAIT(user, TRAIT_GONE_FISHING)) return var/obj/item/current_item switch(slot) @@ -485,12 +480,10 @@ /obj/item/fishing_rod/unslotted hook = null line = null - show_in_wiki = FALSE /obj/item/fishing_rod/bone name = "bone fishing rod" desc = "A humble rod, made with whatever happened to be on hand." - ui_description = "A fishing rod crafted with leather, sinew and bones." icon_state = "fishing_rod_bone" reel_overlay = "reel_bone" default_line_color = "red" @@ -502,11 +495,9 @@ icon_state = "fishing_rod_telescopic" desc = "A lightweight, ergonomic, easy to store telescopic fishing rod. " inhand_icon_state = null - custom_price = PAYCHECK_CREW * 9 force = 0 w_class = WEIGHT_CLASS_NORMAL ui_description = "A collapsible fishing rod that can fit within a backpack." - wiki_description = "It has to be bought from Cargo." reel_overlay = "reel_telescopic" ///The force of the item when extended. var/active_force = 8 @@ -545,7 +536,7 @@ if(HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) return //the fishing minigame uses the attack_self signal to let the user end it early without having to drop the rod. - if(GLOB.fishing_challenges_by_user[user]) + if(HAS_TRAIT(user, TRAIT_GONE_FISHING)) return COMPONENT_BLOCK_TRANSFORM ///Gives feedback to the user, makes it show up inhand, toggles whether it can be used for fishing. @@ -556,20 +547,15 @@ if(user) balloon_alert(user, active ? "extended" : "collapsed") playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE) - update_appearance() + update_appearance(UPDATE_OVERLAYS) QDEL_NULL(fishing_line) return COMPONENT_NO_DEFAULT_MESSAGE -/obj/item/fishing_rod/telescopic/update_icon_state() - . = ..() - icon_state = "[initial(icon_state)][!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE) ? "_collapsed" : ""]" - /obj/item/fishing_rod/telescopic/master name = "master fishing rod" desc = "The mythical rod of a lost fisher king. Said to be imbued with un-paralleled fishing power. There's writing on the back of the pole. \"中国航天制造\"" difficulty_modifier = -10 - ui_description = "A mythical telescopic fishing rod that makes fishing quite easier." - wiki_description = null + ui_description = "This rod makes fishing easy even for an absolute beginner." icon_state = "fishing_rod_master" reel_overlay = "reel_master" active_force = 13 //It's that sturdy @@ -580,8 +566,7 @@ /obj/item/fishing_rod/tech name = "advanced fishing rod" desc = "An embedded universal constructor along with micro-fusion generator makes this marvel of technology never run out of bait. Interstellar treaties prevent using it outside of recreational fishing. And you can fish with this. " - ui_description = "A rod with an infinite supply of synthetic bait. Doubles as an Experi-Scanner for fish." - wiki_description = "It requires the Advanced Fishing Technology Node to be researched to be printed." + ui_description = "This rod has an infinite supply of synth-bait. Also doubles as an Experi-Scanner for fish." icon_state = "fishing_rod_science" reel_overlay = "reel_science" bait = /obj/item/food/bait/doughball/synthetic/unconsumable @@ -705,7 +690,4 @@ override_origin_pixel_x = lefthand ? lefthand_n_px : righthand_n_px override_origin_pixel_y = lefthand ? lefthand_n_py : righthand_n_py - override_origin_pixel_x += origin.pixel_x - override_origin_pixel_y += origin.pixel_y - #undef FISHING_ROD_REEL_CAST_RANGE diff --git a/code/modules/fishing/sources/_fish_source.dm b/code/modules/fishing/sources/_fish_source.dm index 38455068ce22e..a63c087fcc652 100644 --- a/code/modules/fishing/sources/_fish_source.dm +++ b/code/modules/fishing/sources/_fish_source.dm @@ -72,46 +72,28 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons()) var/list/currently_on_regen /// Text shown as baloon alert when you roll a dud in the table var/duds = list("it was nothing", "the hook is empty") - /// Baseline difficulty for fishing in this spot. THIS IS ADDED TO THE DEFAULT DIFFICULTY OF THE MINIGAME (15) + /// Baseline difficulty for fishing in this spot var/fishing_difficulty = FISHING_DEFAULT_DIFFICULTY /// How the spot type is described in fish catalog section about fish sources, will be skipped if null var/catalog_description /// Background image name from /datum/asset/simple/fishing_minigame var/background = "background_default" - /// It true, repeated and large explosions won't be as efficient. This is usually for fish sources that cover multiple turfs (i.e. rivers, oceans). + /// It true, repeated and large explosions won't be as efficient. This is usually meant for global fish sources. var/explosive_malus = FALSE /// If explosive_malus is true, this will be used to keep track of the turfs where an explosion happened for when we'll spawn the loot. var/list/exploded_turfs - ///When linked to a fishing portal, this will be the icon_state of this option in the radial menu - var/radial_state = "default" - ///When selected by the fishing portal, this will be the icon_state of the overlay shown on the machine. - var/overlay_state = "portal_aquarium" /// Mindless mobs that can fish will never pull up items on this list var/static/list/profound_fisher_blacklist = typecacheof(list( /mob/living/basic/mining/lobstrosity, /obj/structure/closet/crate/necropolis/tendril, )) - - ///List of multipliers used to make fishes more common compared to everything else depending on bait quality, indexed from best to worst. - var/static/weight_result_multiplier = list( - TRAIT_GREAT_QUALITY_BAIT = 9, - TRAIT_GOOD_QUALITY_BAIT = 3.5, - TRAIT_BASIC_QUALITY_BAIT = 2, - ) - ///List of exponents used to level out the table weight differences between fish depending on bait quality. - var/static/weight_leveling_exponents = list( - TRAIT_GREAT_QUALITY_BAIT = 0.7, - TRAIT_GOOD_QUALITY_BAIT = 0.55, - TRAIT_BASIC_QUALITY_BAIT = 0.4, - ) - /datum/fish_source/New() if(!PERFORM_ALL_TESTS(focus_only/fish_sources_tables)) return for(var/path in fish_counts) if(!(path in fish_table)) - stack_trace("path [path] found in the 'fish_counts' list but not in the 'fish_table'") + stack_trace("path [path] found in the 'fish_counts' list but not in the fish_table one of [type]") /datum/fish_source/Destroy() exploded_turfs = null @@ -132,19 +114,6 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons()) /datum/fish_source/proc/on_start_fishing(obj/item/fishing_rod/rod, mob/fisherman, atom/parent) return -///Comsig proc from the fishing minigame for 'calculate_difficulty' -/datum/fish_source/proc/calculate_difficulty_minigame(datum/fishing_challenge/challenge, reward_path, obj/item/fishing_rod/rod, mob/fisherman, list/difficulty_holder) - SIGNAL_HANDLER - SHOULD_NOT_OVERRIDE(TRUE) - difficulty_holder[1] += calculate_difficulty(reward_path, rod, fisherman) - - // Difficulty modifier added by the fisher's skill level - if(!(challenge.special_effects & FISHING_MINIGAME_RULE_NO_EXP)) - difficulty_holder[1] += fisherman.mind?.get_skill_modifier(/datum/skill/fishing, SKILL_VALUE_MODIFIER) - - if(challenge.special_effects & FISHING_MINIGAME_RULE_KILL) - challenge.RegisterSignal(src, COMSIG_FISH_SOURCE_REWARD_DISPENSED, TYPE_PROC_REF(/datum/fishing_challenge, hurt_fish)) - /** * Calculates the difficulty of the minigame: * @@ -204,13 +173,7 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons()) . += additive_mod . *= multiplicative_mod -///Comsig proc from the fishing minigame for 'roll_reward' -/datum/fish_source/proc/roll_reward_minigame(datum/source, obj/item/fishing_rod/rod, mob/fisherman, atom/location, list/rewards) - SIGNAL_HANDLER - SHOULD_NOT_OVERRIDE(TRUE) - rewards += roll_reward(rod, fisherman, location) - -/// Returns a typepath or a special value which we use for spawning dispensing a reward later. +/// In case you want more complex rules for specific spots /datum/fish_source/proc/roll_reward(obj/item/fishing_rod/rod, mob/fisherman, atom/location) return pick_weight(get_modified_fish_table(rod, fisherman, location)) || FISHING_DUD @@ -226,21 +189,21 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons()) SEND_SIGNAL(src, COMSIG_FISHING_SOURCE_INTERRUPT_CHALLENGE, reason) /** - * Proc called when the COMSIG_MOB_COMPLETE_FISHING signal is sent. + * Proc called when the COMSIG_FISHING_CHALLENGE_COMPLETED signal is sent. * Check if we've succeeded. If so, write into memory and dispense the reward. */ -/datum/fish_source/proc/on_challenge_completed(mob/user, datum/fishing_challenge/challenge, success) +/datum/fish_source/proc/on_challenge_completed(datum/fishing_challenge/source, mob/user, success) SIGNAL_HANDLER SHOULD_CALL_PARENT(TRUE) - UnregisterSignal(user, COMSIG_MOB_COMPLETE_FISHING) if(!success) return - var/turf/fishing_spot = get_turf(challenge.float) - var/atom/movable/reward = dispense_reward(challenge.reward_path, user, fishing_spot) - if(reward) - user.add_mob_memory(/datum/memory/caught_fish, protagonist = user, deuteragonist = reward.name) - SEND_SIGNAL(challenge.used_rod, COMSIG_FISHING_ROD_CAUGHT_FISH, reward, user) - challenge.used_rod.consume_bait(reward) + var/obj/item/fish/caught = source.reward_path + user.add_mob_memory(/datum/memory/caught_fish, protagonist = user, deuteragonist = initial(caught.name)) + var/turf/fishing_spot = get_turf(source.float) + var/atom/movable/reward = dispense_reward(source.reward_path, user, fishing_spot) + if(source.used_rod) + SEND_SIGNAL(source.used_rod, COMSIG_FISHING_ROD_CAUGHT_FISH, reward, user) + source.used_rod.consume_bait(reward) /// Gives out the reward if possible /datum/fish_source/proc/dispense_reward(reward_path, mob/fisherman, turf/fishing_spot) @@ -263,11 +226,7 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons()) /datum/fish_source/proc/simple_dispense_reward(reward_path, atom/spawn_location, turf/fishing_spot) if(isnull(reward_path)) return null - var/area/area = get_area(fishing_spot) - if(!(area.area_flags & UNLIMITED_FISHING) && !isnull(fish_counts[reward_path])) // This is limited count result - //Somehow, we're trying to spawn an expended reward. - if(fish_counts[reward_path] <= 0) - return null + if(reward_path in fish_counts) // This is limited count result fish_counts[reward_path] -= 1 var/regen_time = fish_count_regen?[reward_path] if(regen_time) @@ -279,16 +238,13 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons()) SEND_SIGNAL(src, COMSIG_FISH_SOURCE_REWARD_DISPENSED, reward) return reward -/datum/fish_source/proc/regen_count(reward_path) - if(!LAZYACCESS(currently_on_regen, reward_path)) - return +/datum/fish_source/proc/regen_count(reward_path, regen_time) fish_counts[reward_path] += 1 currently_on_regen[reward_path] -= 1 - if(currently_on_regen[reward_path] <= 0) + if(!currently_on_regen[reward_path]) LAZYREMOVE(currently_on_regen, reward_path) - return - var/regen_time = fish_count_regen[reward_path] - addtimer(CALLBACK(src, PROC_REF(regen_count), reward_path), regen_time) + else + addtimer(CALLBACK(src, PROC_REF(regen_count), reward_path), regen_time) /// Spawns a reward from a atom path right where the fisherman is. Part of the dispense_reward() logic. /datum/fish_source/proc/spawn_reward(reward_path, atom/spawn_location, turf/fishing_spot) @@ -308,28 +264,31 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons()) /datum/fish_source/proc/get_fish_table() var/list/table = fish_table.Copy() for(var/result in table) - if(!isnull(fish_counts[result]) && fish_counts[result] <= 0) + if(fish_counts[result] == 0) table -= result return table /// Builds a fish weights table modified by bait/rod/user properties /datum/fish_source/proc/get_modified_fish_table(obj/item/fishing_rod/rod, mob/fisherman, atom/location) var/obj/item/bait = rod.bait - ///An exponent used to level out the table weight differences between fish depending on bait quality. + ///An exponent used to level out the difference in probabilities between fishes/mobs on the table depending on bait quality. var/leveling_exponent = 0 ///Multiplier used to make fishes more common compared to everything else. var/result_multiplier = 1 - var/list/final_table = get_fish_table() + var/list/final_table = fish_table.Copy() if(bait) - for(var/trait in weight_result_multiplier) - if(HAS_TRAIT(bait, trait)) - result_multiplier = weight_result_multiplier[trait] - leveling_exponent = weight_leveling_exponents[trait] - break - + if(HAS_TRAIT(bait, TRAIT_GREAT_QUALITY_BAIT)) + result_multiplier = 9 + leveling_exponent = 0.5 + else if(HAS_TRAIT(bait, TRAIT_GOOD_QUALITY_BAIT)) + result_multiplier = 3.5 + leveling_exponent = 0.25 + else if(HAS_TRAIT(bait, TRAIT_BASIC_QUALITY_BAIT)) + result_multiplier = 2 + leveling_exponent = 0.1 if(HAS_TRAIT(rod, TRAIT_ROD_REMOVE_FISHING_DUD)) final_table -= FISHING_DUD @@ -349,7 +308,7 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons()) if(mult > 1 && HAS_TRAIT(bait, TRAIT_BAIT_ALLOW_FISHING_DUD)) final_table -= FISHING_DUD else - final_table[result] = round(final_table[result] * FISH_WEIGHT_MULT_WITHOUT_BAIT, 1) //Fishing without bait is not going to be easy + final_table[result] = round(final_table[result] * 0.15, 1) //Fishing without bait is not going to be easy // Apply fish trait modifiers final_table[result] = get_fish_trait_catch_mods(final_table[result], result, rod, fisherman, location) @@ -357,29 +316,25 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons()) if(final_table[result] <= 0) final_table -= result - + ///here we even out the chances of fishie based on bait quality: better baits lead rarer fishes being more common. if(leveling_exponent) - level_out_fish(final_table, leveling_exponent) + var/highest_fish_weight + var/list/collected_fish_weights = list() + for(var/fishable in final_table) + if(ispath(fishable, /obj/item/fish)) + var/fish_weight = fish_table[fishable] + collected_fish_weights[fishable] = fish_weight + if(fish_weight > highest_fish_weight) + highest_fish_weight = fish_weight + + for(var/fish in collected_fish_weights) + var/difference = highest_fish_weight - collected_fish_weights[fish] + if(!difference) + continue + final_table[fish] += round(difference**leveling_exponent, 1) return final_table -///A proc that levels out the weights of various fish, leading to rarer fishes being more common. -/datum/fish_source/proc/level_out_fish(list/table, exponent) - var/highest_fish_weight - var/list/collected_fish_weights = list() - for(var/fishable in table) - if(ispath(fishable, /obj/item/fish)) - var/fish_weight = table[fishable] - collected_fish_weights[fishable] = fish_weight - if(fish_weight > highest_fish_weight) - highest_fish_weight = fish_weight - - for(var/fish in collected_fish_weights) - var/difference = highest_fish_weight - collected_fish_weights[fish] - if(!difference) - continue - table[fish] += round(difference**exponent, 1) - /datum/fish_source/proc/get_fish_trait_catch_mods(weight, obj/item/fish/fish, obj/item/fishing_rod/rod, mob/user, atom/location) if(!ispath(fish, /obj/item/fish)) return weight @@ -398,7 +353,7 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons()) if(!ispath(reward, /obj/item/fish)) continue var/obj/item/fish/prototype = reward - if(initial(prototype.fish_flags) & FISH_FLAG_SHOW_IN_CATALOG) + if(initial(prototype.show_in_catalog)) return TRUE return FALSE @@ -414,7 +369,7 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons()) if(!ispath(reward, /obj/item/fish)) continue var/obj/item/fish/prototype = reward - if(initial(prototype.fish_flags) & FISH_FLAG_SHOW_IN_CATALOG) + if(initial(prototype.show_in_catalog)) var/init_name = initial(prototype.name) if(rod) var/init_weight = fish_table[reward] @@ -425,7 +380,7 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons()) if(weight/init_weight >= 3.5) init_name = "init_name" else if(weight < init_weight) - init_name = span_small(init_name) + init_name = span_small(reward) known_fishes += init_name if(!length(known_fishes)) @@ -470,119 +425,3 @@ GLOBAL_LIST_INIT(specific_fish_icons, generate_specific_fish_icons()) reward.pixel_y = rand(-9, 9) if(severity >= EXPLODE_DEVASTATE) reward.ex_act(EXPLODE_LIGHT) - -///Called when releasing a fish in a fishing spot with the TRAIT_CATCH_AND_RELEASE trait. -/datum/fish_source/proc/readd_fish(obj/item/fish/fish, mob/living/releaser) - var/is_morbid = HAS_MIND_TRAIT(releaser, TRAIT_MORBID) - var/is_naive = HAS_MIND_TRAIT(releaser, TRAIT_NAIVE) - if(fish.status == FISH_DEAD) //ded fish won't repopulate the sea. - if(is_naive || is_morbid) - releaser.add_mood_event("fish_released", /datum/mood_event/fish_released, is_morbid && !is_naive, fish) - return - if(((fish.type in fish_table) != is_morbid) || is_naive) - releaser.add_mood_event("fish_released", /datum/mood_event/fish_released, is_morbid && !is_naive, fish) - if(isnull(fish_counts[fish.type])) //This fish can be caught indefinitely so it won't matter. - return - //If this fish population isn't recovering from recent losses, we just increase it. - if(!LAZYACCESS(currently_on_regen, fish.type)) - fish_counts[fish.type] += 1 - else - regen_count(fish.type) - -/** - * Called by /datum/autowiki/fish_sources unless the catalog entry for this fish source is null. - * It should Return a list of entries with keys named "name", "icon", "weight" and "notes" - * detailing the contents of this fish source. - */ -/datum/fish_source/proc/generate_wiki_contents(datum/autowiki/fish_sources/wiki) - var/list/data = list() - var/list/only_fish = list() - - var/total_weight = 0 - var/total_weight_without_bait = 0 - var/total_weight_no_fish = 0 - - var/list/tables_by_quality = list() - var/list/total_weight_by_quality = list() - var/list/total_weight_by_quality_no_fish = list() - - for(var/obj/item/fish/fish as anything in fish_table) - var/weight = fish_table[fish] - if(fish != FISHING_DUD) - total_weight += weight - if(!ispath(fish, /obj/item/fish)) - total_weight_without_bait += weight - total_weight_no_fish += weight - continue - if(initial(fish.fish_flags) & FISH_FLAG_SHOW_IN_CATALOG) - only_fish += fish - total_weight_without_bait += round(fish_table[fish] * FISH_WEIGHT_MULT_WITHOUT_BAIT, 1) - - for(var/trait in weight_result_multiplier) - var/list/table_copy = fish_table.Copy() - table_copy -= FISHING_DUD - var/exponent = weight_leveling_exponents[trait] - var/multiplier = weight_result_multiplier[trait] - for(var/fish as anything in table_copy) - if(!ispath(fish, /obj/item/fish)) - continue - table_copy[fish] = round(table_copy[fish] * multiplier, 1) - - level_out_fish(table_copy, exponent) - tables_by_quality[trait] = table_copy - - var/tot_weight = 0 - var/tot_weight_no_fish = 0 - for(var/result in table_copy) - var/weight = table_copy[result] - tot_weight += weight - if(!ispath(result, /obj/item/fish)) - tot_weight_no_fish += weight - total_weight_by_quality[trait] = tot_weight - total_weight_by_quality_no_fish[trait] = tot_weight_no_fish - - //show the improved weights in ascending orders for fish. - tables_by_quality = reverseList(tables_by_quality) - - if(FISHING_DUD in fish_table) - data += LIST_VALUE_WRAP_LISTS(list( - FISH_SOURCE_AUTOWIKI_NAME = FISH_SOURCE_AUTOWIKI_DUD, - FISH_SOURCE_AUTOWIKI_ICON = "", - FISH_SOURCE_AUTOWIKI_WEIGHT = PERCENT(fish_table[FISHING_DUD]/total_weight_without_bait), - FISH_SOURCE_AUTOWIKI_WEIGHT_SUFFIX = "WITHOUT A BAIT", - FISH_SOURCE_AUTOWIKI_NOTES = "Unless you have a magnet or rescue hook or you know what you're doing, always use a bait", - )) - - for(var/obj/item/fish/fish as anything in only_fish) - var/weight = fish_table[fish] - var/deets = "Can be caught indefinitely" - if(fish in fish_counts) - deets = "It's quite rare and can only be caught up to [fish_counts[fish]] times" - if(fish in fish_count_regen) - deets += " every [DisplayTimeText(fish::breeding_timeout)]" - var/list/weight_deets = list() - for(var/trait in tables_by_quality) - weight_deets += "[round(PERCENT(tables_by_quality[trait][fish]/total_weight_by_quality[trait]), 0.1)]%" - var/weight_suffix = "([english_list(weight_deets, and_text = ", ")])" - data += LIST_VALUE_WRAP_LISTS(list( - FISH_SOURCE_AUTOWIKI_NAME = wiki.escape_value(full_capitalize(initial(fish.name))), - FISH_SOURCE_AUTOWIKI_ICON = FISH_AUTOWIKI_FILENAME(fish), - FISH_SOURCE_AUTOWIKI_WEIGHT = PERCENT(weight/total_weight), - FISH_SOURCE_AUTOWIKI_WEIGHT_SUFFIX = weight_suffix, - FISH_SOURCE_AUTOWIKI_NOTES = deets, - )) - - if(total_weight_no_fish) //There are things beside fish that we can catch. - var/list/weight_deets = list() - for(var/trait in tables_by_quality) - weight_deets += "[round(PERCENT(total_weight_by_quality_no_fish[trait]/total_weight_by_quality[trait]), 0.1)]%" - var/weight_suffix = "([english_list(weight_deets, and_text = ", ")])" - data += LIST_VALUE_WRAP_LISTS(list( - FISH_SOURCE_AUTOWIKI_NAME = FISH_SOURCE_AUTOWIKI_OTHER, - FISH_SOURCE_AUTOWIKI_ICON = FISH_SOURCE_AUTOWIKI_QUESTIONMARK, - FISH_SOURCE_AUTOWIKI_WEIGHT = PERCENT(total_weight_no_fish/total_weight), - FISH_SOURCE_AUTOWIKI_WEIGHT_SUFFIX = weight_suffix, - FISH_SOURCE_AUTOWIKI_NOTES = "Who knows what it may be. Try and find out", - )) - - return data diff --git a/code/modules/fishing/sources/source_types.dm b/code/modules/fishing/sources/source_types.dm index ef2cdf87989a1..6aea78b994368 100644 --- a/code/modules/fishing/sources/source_types.dm +++ b/code/modules/fishing/sources/source_types.dm @@ -68,7 +68,6 @@ /obj/item/fish/pike = 4 MINUTES, ) fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 5 - explosive_malus = TRUE /datum/fish_source/sand catalog_description = "Sand" @@ -80,7 +79,6 @@ /obj/item/coin/gold = 3, ) fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 20 - explosive_malus = TRUE /datum/fish_source/cursed_spring catalog_description = null //it's a secret (sorta, I know you're reading this) @@ -94,7 +92,6 @@ /obj/item/fishing_rod/telescopic/master = 1, ) fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 25 - explosive_malus = TRUE /datum/fish_source/portal fish_table = list( @@ -106,9 +103,12 @@ /obj/item/fish/goldfish/three_eyes = 3, ) catalog_description = "Aquarium dimension (Fishing portal generator)" - radial_state = "fish_tank" ///The name of this option shown in the radial menu on the fishing portal generator var/radial_name = "Aquarium" + ///The icon state shown for this option in the radial menu + var/radial_state = "fish_tank" + ///The icon state of the overlay shown on the machine when active. + var/overlay_state = "portal_aquarium" /datum/fish_source/portal/beach fish_table = list( @@ -255,7 +255,7 @@ fish_table[reward_path] = rand(1, 4) ///Difficulty has to be calculated before the rest, because of how it influences jump chances -/datum/fish_source/portal/random/calculate_difficulty(datum/fishing_challenge/challenge, result, obj/item/fishing_rod/rod, mob/fisherman) +/datum/fish_source/portal/random/calculate_difficulty(result, obj/item/fishing_rod/rod, mob/fisherman, datum/fishing_challenge/challenge) . = ..() . += rand(-10, 15) @@ -370,7 +370,7 @@ fish_table = list( FISHING_DUD = 20, /obj/item/fish/ratfish = 10, - /obj/item/fish/slimefish = 4, + /obj/item/fish/slimefish = 4 ) fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 10 @@ -401,21 +401,6 @@ ) fishing_difficulty = FISHING_EASY_DIFFICULTY -/datum/fish_source/holographic/on_fishing_spot_init(datum/component/fishing_spot/spot) - ADD_TRAIT(spot.parent, TRAIT_UNLINKABLE_FISHING_SPOT, REF(src)) //You would have to be inside the holodeck anyway... - -/datum/fish_source/holographic/on_fishing_spot_del(datum/component/fishing_spot/spot) - REMOVE_TRAIT(spot.parent, TRAIT_UNLINKABLE_FISHING_SPOT, REF(src)) - -/datum/fish_source/holographic/generate_wiki_contents(datum/autowiki/fish_sources/wiki) - var/obj/item/fish/prototype = /obj/item/fish/holo/checkered - return LIST_VALUE_WRAP_LISTS(list( - FISH_SOURCE_AUTOWIKI_NAME = "Holographic Fish", - FISH_SOURCE_AUTOWIKI_ICON = FISH_AUTOWIKI_FILENAME(prototype), - FISH_SOURCE_AUTOWIKI_WEIGHT = 100, - FISH_SOURCE_AUTOWIKI_NOTES = "Holographic fish disappears outside the Holodeck", - )) - /datum/fish_source/holographic/reason_we_cant_fish(obj/item/fishing_rod/rod, mob/fisherman, atom/parent) . = ..() if(!istype(get_area(fisherman), /area/station/holodeck)) @@ -460,7 +445,7 @@ fish_table = list( FISHING_DUD = 25, /obj/item/food/grown/grass = 25, - FISHING_RANDOM_SEED = 16, + RANDOM_SEED = 16, /obj/item/seeds/grass = 6, /obj/item/seeds/random = 1, /mob/living/basic/frog = 1, @@ -469,55 +454,13 @@ fish_counts = list( /obj/item/food/grown/grass = 10, /obj/item/seeds/grass = 4, - FISHING_RANDOM_SEED = 4, + RANDOM_SEED = 4, /obj/item/seeds/random = 1, /mob/living/basic/frog = 1, /mob/living/basic/axolotl = 1, ) fishing_difficulty = FISHING_EASY_DIFFICULTY - 5 -/datum/fish_source/hydro_tray/generate_wiki_contents(datum/autowiki/fish_sources/wiki) - var/list/data = list() - var/total_weight = 0 - var/critter_weight = 0 - var/seed_weight = 0 - var/other_weight = 0 - var/dud_weight = fish_table[FISHING_DUD] - for(var/content in fish_table) - var/weight = fish_table[content] - total_weight += weight - if(ispath(content, /mob/living)) - critter_weight += weight - else if(ispath(content, /obj/item/food/grown) || ispath(content, /obj/item/seeds) || content == FISHING_RANDOM_SEED) - seed_weight += weight - else if(content != FISHING_DUD) - other_weight += weight - - data += LIST_VALUE_WRAP_LISTS(list( - FISH_SOURCE_AUTOWIKI_NAME = FISH_SOURCE_AUTOWIKI_DUD, - FISH_SOURCE_AUTOWIKI_DUD = "", - FISH_SOURCE_AUTOWIKI_WEIGHT = PERCENT(dud_weight/total_weight), - FISH_SOURCE_AUTOWIKI_WEIGHT_SUFFIX = "WITHOUT A BAIT", - FISH_SOURCE_AUTOWIKI_NOTES = "", - )) - - data += LIST_VALUE_WRAP_LISTS(list( - FISH_SOURCE_AUTOWIKI_NAME = "Critter", - FISH_SOURCE_AUTOWIKI_DUD = "", - FISH_SOURCE_AUTOWIKI_WEIGHT = PERCENT(critter_weight/total_weight), - FISH_SOURCE_AUTOWIKI_NOTES = "A small creature, usually a frog or an axolotl", - )) - - if(other_weight) - data += LIST_VALUE_WRAP_LISTS(list( - FISH_SOURCE_AUTOWIKI_NAME = "Other Stuff", - FISH_SOURCE_AUTOWIKI_DUD = "", - FISH_SOURCE_AUTOWIKI_WEIGHT = PERCENT(other_weight/total_weight), - FISH_SOURCE_AUTOWIKI_NOTES = "Other stuff, who knows...", - )) - - return data - /datum/fish_source/hydro_tray/reason_we_cant_fish(obj/item/fishing_rod/rod, mob/fisherman, atom/parent) if(!istype(parent, /obj/machinery/hydroponics/constructable)) return ..() diff --git a/code/modules/food_and_drinks/machinery/deep_fryer.dm b/code/modules/food_and_drinks/machinery/deep_fryer.dm index 92270d92fd0e2..322c0a42c5557 100644 --- a/code/modules/food_and_drinks/machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/machinery/deep_fryer.dm @@ -154,7 +154,7 @@ GLOBAL_LIST_INIT(oilfry_blacklisted_items, typecacheof(list( reagents.trans_to(frying, oil_use * seconds_per_tick, multiplier = fry_speed * 3) //Fried foods gain more of the reagent thanks to space magic grease_level += prob(grease_increase_chance) * grease_Increase_amount - cook_time += fry_speed * seconds_per_tick SECONDS + cook_time += fry_speed * seconds_per_tick if(cook_time >= DEEPFRYER_COOKTIME && !frying_fried) frying_fried = TRUE //frying... frying... fried playsound(src.loc, 'sound/machines/ding.ogg', 50, TRUE) diff --git a/code/modules/food_and_drinks/machinery/smartfridge.dm b/code/modules/food_and_drinks/machinery/smartfridge.dm index ed0e5d448cd25..b80a37a0ce6a7 100644 --- a/code/modules/food_and_drinks/machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/machinery/smartfridge.dm @@ -203,7 +203,7 @@ /// Returns details related to the fridge structure /obj/machinery/smartfridge/proc/structure_examine() - . = list() + . = "" if(welded_down) . += span_info("It's moorings are firmly [EXAMINE_HINT("welded")] to the floor.") diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm index 282910007dd81..c04edf6fee79d 100644 --- a/code/modules/food_and_drinks/recipes/food_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm @@ -1,6 +1,5 @@ /datum/crafting_recipe/food mass_craftable = TRUE - crafting_flags = parent_type::crafting_flags | CRAFT_TRANSFERS_REAGENTS | CRAFT_CLEARS_REAGENTS /datum/crafting_recipe/food/on_craft_completion(mob/user, atom/result) SHOULD_CALL_PARENT(TRUE) diff --git a/code/modules/food_and_drinks/recipes/soup_mixtures.dm b/code/modules/food_and_drinks/recipes/soup_mixtures.dm index c69de62fbfc97..446782d00cbf4 100644 --- a/code/modules/food_and_drinks/recipes/soup_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/soup_mixtures.dm @@ -245,7 +245,7 @@ // Everything else will just get fried if(isnull(ingredient.reagents) && !is_type_in_list(ingredient, required_ingredients)) - ingredient.AddElement(/datum/element/fried_item, 30 SECONDS) + ingredient.AddElement(/datum/element/fried_item, 30) continue // Things that had reagents or ingredients in the soup will get deleted diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm index 8798f7cd8806c..c965526bcb1c6 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm @@ -13,14 +13,6 @@ result = /obj/item/food/donut/plain category = CAT_PASTRY -// It is so stupid that we have to do this but because food crafting clears all reagents that got added during init, -// here we are adding it again (but only for crafting, maploaded and spawned donuts work fine). -// Until the issues with crafted items' reagents are resolved this will have to do -/datum/crafting_recipe/food/donut/on_craft_completion(mob/user, atom/result) - . = ..() - var/obj/item/food/donut/donut_result = result - if(donut_result.is_decorated) - donut_result.reagents.add_reagent(/datum/reagent/consumable/sprinkles, 1) /datum/crafting_recipe/food/donut/chaos name = "Chaos donut" diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index 39b5615c385d7..6fe7fdbc57d94 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -694,10 +694,6 @@ begin_day = 14 begin_month = DECEMBER -/datum/holiday/monkey/celebrate() - . = ..() - SSstation.setup_trait(/datum/station_trait/job/pun_pun) - /datum/holiday/doomsday name = "Mayan Doomsday Anniversary" begin_day = 21 diff --git a/code/modules/hydroponics/grown/onion.dm b/code/modules/hydroponics/grown/onion.dm index 4287bf9eb3ec9..0d33c3e1f395d 100644 --- a/code/modules/hydroponics/grown/onion.dm +++ b/code/modules/hydroponics/grown/onion.dm @@ -48,7 +48,7 @@ /obj/item/food/grown/onion/red/make_processable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/onion_slice/red, 2, 15, screentip_verb = "Cut") -/obj/item/food/grown/onion/UsedforProcessing(mob/living/user, obj/item/I, list/chosen_option, list/created_atoms) +/obj/item/food/grown/onion/UsedforProcessing(mob/living/user, obj/item/I, list/chosen_option) var/datum/effect_system/fluid_spread/smoke/chem/cry_about_it = new //Since the onion is destroyed when it's sliced, var/splat_location = get_turf(src) //we need to set up the smoke beforehand cry_about_it.attach(splat_location) diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index cf1875c8efed5..9b2cbdfae40fb 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -603,7 +603,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/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 8981b90d1cab0..041ff97b73cee 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -139,8 +139,8 @@ context[SCREENTIP_CONTEXT_LMB] = "Lock mutation" return CONTEXTUAL_SCREENTIP_SET - // Edibles can be composted (most of the times). - if(IS_EDIBLE(held_item) && HAS_TRAIT(held_item, TRAIT_UNCOMPOSTABLE)) + // Edibles and pills can be composted. + if(IS_EDIBLE(held_item) || istype(held_item, /obj/item/reagent_containers/pill)) context[SCREENTIP_CONTEXT_LMB] = "Compost" return CONTEXTUAL_SCREENTIP_SET @@ -855,10 +855,7 @@ var/visi_msg = "" var/transfer_amount - if(IS_EDIBLE(reagent_source)) - if(HAS_TRAIT(reagent_source, TRAIT_UNCOMPOSTABLE)) - to_chat(user, "[reagent_source] cannot be composted in its current state") - return + if(IS_EDIBLE(reagent_source) || istype(reagent_source, /obj/item/reagent_containers/pill)) visi_msg="[user] composts [reagent_source], spreading it through [target]" transfer_amount = reagent_source.reagents.total_volume SEND_SIGNAL(reagent_source, COMSIG_ITEM_ON_COMPOSTED, user) @@ -1090,14 +1087,10 @@ /obj/machinery/hydroponics/click_ctrl(mob/user) if(!anchored) return NONE - - update_use_power(ACTIVE_POWER_USE) - if(!powered()) to_chat(user, span_warning("[name] has no power.")) update_use_power(NO_POWER_USE) return CLICK_ACTION_BLOCKING - set_self_sustaining(!self_sustaining) to_chat(user, span_notice("You [self_sustaining ? "activate" : "deactivated"] [src]'s autogrow function[self_sustaining ? ", maintaining the tray's health while using high amounts of power" : ""].")) return CLICK_ACTION_SUCCESS diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 86847f011738b..18197c006b51e 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, max_length = MAX_NAME_LEN)) + var/newplantname = reject_bad_text(tgui_input_text(user, "Write a new plant name", "Plant Name", plantname, 20)) 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, max_length = MAX_DESC_LEN) + var/newdesc = tgui_input_text(user, "Write a new seed description", "Seed Description", desc, 180) 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, max_length = MAX_DESC_LEN) + var/newproductdesc = tgui_input_text(user, "Write a new product description", "Product Description", productdesc, 180) 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 4029e5c395419..651b3d6f3b647 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, max_length = MUSIC_MAXLINECHARS) + var/newline = tgui_input_text(user, "Enter your line", parent.name) 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], max_length = MUSIC_MAXLINECHARS) + var/new_line_text = tgui_input_text(user, "Enter your line ", parent.name, lines[line_to_edit], 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/_job.dm b/code/modules/jobs/job_types/_job.dm index 41ff0c058cebc..81d42b051dff8 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -220,20 +220,10 @@ dna.species.pre_equip_species_outfit(equipping, src, visual_only) equip_outfit_and_loadout(equipping.get_outfit(consistent), player_client?.prefs, visual_only) -/datum/job/proc/announce_head(mob/living/carbon/human/human, channels) //tells the given channel that the given mob is the new department head. See communications.dm for valid channels. - if(!human) - return - var/obj/machinery/announcement_system/system - var/list/available_machines = list() - for(var/obj/machinery/announcement_system/announce as anything in GLOB.announcement_systems) - if(announce.newhead_toggle) - available_machines += announce - break - if(!length(available_machines)) - return - system = pick(available_machines) - //timer because these should come after the captain announcement - SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_addtimer), CALLBACK(system, TYPE_PROC_REF(/obj/machinery/announcement_system, announce), AUTO_ANNOUNCE_NEWHEAD, human.real_name, human.job, channels), 1)) +/datum/job/proc/announce_head(mob/living/carbon/human/H, channels) //tells the given channel that the given mob is the new department head. See communications.dm for valid channels. + if(H && GLOB.announcement_systems.len) + //timer because these should come after the captain announcement + SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_addtimer), CALLBACK(pick(GLOB.announcement_systems), TYPE_PROC_REF(/obj/machinery/announcement_system, announce), "NEWHEAD", H.real_name, H.job, channels), 1)) //If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1 /datum/job/proc/player_old_enough(client/player) @@ -391,10 +381,10 @@ if(visualsOnly) return - var/datum/job/equipped_job = SSjob.get_job_type(jobtype) + var/datum/job/equipped_job = SSjob.GetJobType(jobtype) if(!equipped_job) - equipped_job = SSjob.get_job(equipped.job) + equipped_job = SSjob.GetJob(equipped.job) var/obj/item/card/id/card = equipped.wear_id diff --git a/code/modules/jobs/job_types/chaplain/chaplain_costumes.dm b/code/modules/jobs/job_types/chaplain/chaplain_costumes.dm index 0968569ae33af..637177adffbcd 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/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm index dc36796c4d1cf..26a43fa775192 100644 --- a/code/modules/jobs/job_types/cook.dm +++ b/code/modules/jobs/job_types/cook.dm @@ -82,7 +82,7 @@ /datum/outfit/job/cook/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() - var/datum/job/cook/other_chefs = SSjob.get_job_type(jobtype) + var/datum/job/cook/other_chefs = SSjob.GetJobType(jobtype) if(other_chefs) // If there's other Chefs, you're a Cook if(other_chefs.cooks > 0)//Cooks id_trim = /datum/id_trim/job/cook diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm index 258b2b322f1b9..00bd8790d9bd0 100644 --- a/code/modules/jobs/job_types/detective.dm +++ b/code/modules/jobs/job_types/detective.dm @@ -29,14 +29,13 @@ mail_goodies = list( /obj/item/storage/fancy/cigarettes = 25, - /obj/item/ammo_box/c38 = 20, + /obj/item/ammo_box/c38 = 25, /obj/item/ammo_box/c38/dumdum = 5, /obj/item/ammo_box/c38/hotshot = 5, /obj/item/ammo_box/c38/iceblox = 5, /obj/item/ammo_box/c38/match = 5, /obj/item/ammo_box/c38/trac = 5, - /obj/item/card/id/advanced/plainclothes = 5, - /obj/item/storage/belt/holster/detective/full = 1, + /obj/item/storage/belt/holster/detective/full = 1 ) family_heirlooms = list(/obj/item/reagent_containers/cup/glass/bottle/whiskey) @@ -50,8 +49,6 @@ name = "Detective" jobtype = /datum/job/detective - id = /obj/item/card/id/advanced/plainclothes - id_trim = /datum/id_trim/job/detective uniform = /obj/item/clothing/under/rank/security/detective suit = /obj/item/clothing/suit/jacket/det_suit diff --git a/code/modules/jobs/job_types/station_trait/veteran_advisor.dm b/code/modules/jobs/job_types/station_trait/veteran_advisor.dm index f8a0f2f801d31..6fcb8d94707f5 100644 --- a/code/modules/jobs/job_types/station_trait/veteran_advisor.dm +++ b/code/modules/jobs/job_types/station_trait/veteran_advisor.dm @@ -37,19 +37,10 @@ allow_bureaucratic_error = FALSE job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS -/datum/job/veteran_advisor/get_default_roundstart_spawn_point() - for(var/obj/effect/landmark/start/spawn_point as anything in GLOB.start_landmarks_list) - if(spawn_point.name != "Security Officer") - continue - . = spawn_point - if(spawn_point.used) //so we can revert to spawning them on top of eachother if something goes wrong - continue - spawn_point.used = TRUE - break - if(!.) // Try to fall back to "our" landmark - . = ..() - if(!.) - log_mapping("Job [title] ([type]) couldn't find a round start spawn point.") +/datum/job/veteran_advisor/get_roundstart_spawn_point() //Spawning at Brig where Officers spawn + if (length(GLOB.start_landmarks_list["Security Officer"])) + return pick(GLOB.start_landmarks_list["Security Officer"]) + return ..() /datum/job/veteran_advisor/after_spawn(mob/living/spawned, client/player_client) . = ..() diff --git a/code/modules/language/_language_holder.dm b/code/modules/language/_language_holder.dm index a368186a5137b..b6dea2d4e0e28 100644 --- a/code/modules/language/_language_holder.dm +++ b/code/modules/language/_language_holder.dm @@ -37,10 +37,10 @@ Key procs /datum/language_holder /// Lazyassoclist of all understood languages - var/list/understood_languages + var/list/understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM)) /// Lazyassoclist of languages that can be spoken. /// Tongue organ may also set limits beyond this list. - var/list/spoken_languages + var/list/spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM)) /// Lazyassoclist of blocked languages. /// Used to prevent understanding and speaking certain languages, ie for certain mobs, mutations etc. var/list/blocked_languages @@ -503,21 +503,14 @@ GLOBAL_LIST_INIT(prototype_language_holders, init_language_holder_prototypes()) /datum/language/nekomimetic = list(LANGUAGE_ATOM), ) -// Given to atoms by default -/datum/language_holder/atom_basic - understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM)) - spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM)) - -// Explicitly empty one for readability /datum/language_holder/empty understood_languages = null spoken_languages = null -// Has all the languages known (via "mind") /datum/language_holder/universal understood_languages = null spoken_languages = null /datum/language_holder/universal/New() . = ..() - grant_all_languages(source = LANGUAGE_MIND) + grant_all_languages() diff --git a/code/modules/library/bibles.dm b/code/modules/library/bibles.dm index 42194d932e865..4b9b4ae61d153 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 7f5f010563a5a..5ae9afcdcbe49 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", max_length = MAX_PAPER_LENGTH, multiline = TRUE) + var/content = tgui_input_text(user, "Write your book's contents (HTML NOT allowed)", "Book Contents", 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", max_length = MAX_NAME_LEN) + var/author = tgui_input_text(user, "Write the author's name", "Author Name") if(!user.can_perform_action(src) || !user.can_write(attacking_item)) return if(!author) diff --git a/code/modules/mafia/controller.dm b/code/modules/mafia/controller.dm index d4edbb37f411e..f6b46c3430dc9 100644 --- a/code/modules/mafia/controller.dm +++ b/code/modules/mafia/controller.dm @@ -602,18 +602,13 @@ GLOBAL_LIST_INIT(mafia_role_by_alignment, setup_mafia_role_by_alignment()) outfit_to_distribute = player_outfit for(var/datum/mafia_role/role as anything in all_roles) - var/mob/living/carbon/human/human = new(get_turf(role.assigned_landmark)) - human.add_traits(list( - TRAIT_NOFIRE, - TRAIT_NOBREATH, - TRAIT_CANNOT_CRYSTALIZE, - TRAIT_PERMANENTLY_MORTAL, - TRAIT_GODMODE, - ), MAFIA_TRAIT) - human.equipOutfit(outfit_to_distribute) - RegisterSignal(human, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(display_votes)) + var/mob/living/carbon/human/H = new(get_turf(role.assigned_landmark)) + H.add_traits(list(TRAIT_NOFIRE, TRAIT_NOBREATH, TRAIT_CANNOT_CRYSTALIZE, TRAIT_PERMANENTLY_MORTAL), MAFIA_TRAIT) + H.equipOutfit(outfit_to_distribute) + H.status_flags |= GODMODE + RegisterSignal(H, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(display_votes)) var/obj/item/modular_computer/modpc = role.player_pda - role.register_body(human) + role.register_body(H) if(modpc) player_role_lookup[modpc] = role else diff --git a/code/modules/mapfluff/ruins/icemoonruin_code/hotsprings.dm b/code/modules/mapfluff/ruins/icemoonruin_code/hotsprings.dm index 6952dd0af588b..7c674e98e24a1 100644 --- a/code/modules/mapfluff/ruins/icemoonruin_code/hotsprings.dm +++ b/code/modules/mapfluff/ruins/icemoonruin_code/hotsprings.dm @@ -11,7 +11,6 @@ */ /turf/open/water/cursed_spring - name = "cursed spring" baseturfs = /turf/open/water/cursed_spring planetary_atmos = TRUE initial_gas_mix = ICEMOON_DEFAULT_ATMOS diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm b/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm index c49b5c1399625..26fdfcbb90bb0 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm @@ -3,6 +3,7 @@ /obj/machinery/vending/syndichem name = "\improper SyndiChem" desc = "A vending machine full of grenades and grenade accessories. Sponsored by Donk Co." + req_access = list(ACCESS_SYNDICATE) products = list(/obj/item/stack/cable_coil = 5, /obj/item/assembly/igniter = 20, /obj/item/assembly/prox_sensor = 5, diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/museum.dm b/code/modules/mapfluff/ruins/objects_and_mobs/museum.dm index aac22db015b20..57f20abb1aa19 100644 --- a/code/modules/mapfluff/ruins/objects_and_mobs/museum.dm +++ b/code/modules/mapfluff/ruins/objects_and_mobs/museum.dm @@ -159,7 +159,7 @@ mask = /obj/item/clothing/mask/fakemoustache/italian /obj/machinery/vending/hotdog/museum - all_products_free = TRUE + onstation_override = TRUE /obj/machinery/vending/hotdog/museum/screwdriver_act(mob/living/user, obj/item/attack_item) return NONE @@ -199,6 +199,6 @@ var/obj/structure/toilet/destination = pick(partners) forceMove(destination) destination.w_items += w_class - LAZYADD(destination.cistern_items, src) + destination.contents += src #undef CAFE_KEYCARD_TOILETS diff --git a/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm b/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm index fa39b7063ae12..e06c9bbb03608 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm @@ -13,46 +13,41 @@ GLOBAL_VAR_INIT(fscpassword, generate_password()) . = ..() password = "[GLOB.fscpassword]" -/obj/machinery/vending/medical/syndicate/cybersun +/obj/machinery/vending/medical/syndicate_access/cybersun name = "\improper CyberMed ++" desc = "An advanced vendor that dispenses medical drugs, both recreational and medicinal." - products = list( - /obj/item/reagent_containers/syringe = 4, - /obj/item/healthanalyzer = 4, - /obj/item/reagent_containers/pill/patch/libital = 5, - /obj/item/reagent_containers/pill/patch/aiuri = 5, - /obj/item/reagent_containers/cup/bottle/multiver = 1, - /obj/item/reagent_containers/cup/bottle/syriniver = 1, - /obj/item/reagent_containers/cup/bottle/epinephrine = 3, - /obj/item/reagent_containers/cup/bottle/morphine = 3, - /obj/item/reagent_containers/cup/bottle/potass_iodide = 1, - /obj/item/reagent_containers/cup/bottle/salglu_solution = 3, - /obj/item/reagent_containers/syringe/antiviral = 5, - /obj/item/reagent_containers/medigel/libital = 2, - /obj/item/reagent_containers/medigel/aiuri = 2, - /obj/item/reagent_containers/medigel/sterilizine = 1, - ) + products = list(/obj/item/reagent_containers/syringe = 4, + /obj/item/healthanalyzer = 4, + /obj/item/reagent_containers/pill/patch/libital = 5, + /obj/item/reagent_containers/pill/patch/aiuri = 5, + /obj/item/reagent_containers/cup/bottle/multiver = 1, + /obj/item/reagent_containers/cup/bottle/syriniver = 1, + /obj/item/reagent_containers/cup/bottle/epinephrine = 3, + /obj/item/reagent_containers/cup/bottle/morphine = 3, + /obj/item/reagent_containers/cup/bottle/potass_iodide = 1, + /obj/item/reagent_containers/cup/bottle/salglu_solution = 3, + /obj/item/reagent_containers/syringe/antiviral = 5, + /obj/item/reagent_containers/medigel/libital = 2, + /obj/item/reagent_containers/medigel/aiuri = 2, + /obj/item/reagent_containers/medigel/sterilizine = 1) contraband = list(/obj/item/reagent_containers/cup/bottle/cold = 2, - /obj/item/restraints/handcuffs = 4, - /obj/item/storage/backpack/duffelbag/syndie/surgery = 1, - /obj/item/storage/medkit/tactical = 1, - ) - premium = list( - /obj/item/storage/pill_bottle/psicodine = 2, - /obj/item/reagent_containers/hypospray/medipen = 3, - /obj/item/reagent_containers/hypospray/medipen/atropine = 2, - /obj/item/storage/medkit/regular = 3, - /obj/item/storage/medkit/brute = 1, - /obj/item/storage/medkit/fire = 1, - /obj/item/storage/medkit/toxin = 1, - /obj/item/storage/medkit/o2 = 1, - /obj/item/storage/medkit/advanced = 1, - /obj/item/defibrillator/loaded = 1, - /obj/item/wallframe/defib_mount = 1, - /obj/item/sensor_device = 2, - /obj/item/pinpointer/crew = 2, - /obj/item/shears = 1, - ) + /obj/item/restraints/handcuffs = 4, + /obj/item/storage/backpack/duffelbag/syndie/surgery = 1, + /obj/item/storage/medkit/tactical = 1) + premium = list(/obj/item/storage/pill_bottle/psicodine = 2, + /obj/item/reagent_containers/hypospray/medipen = 3, + /obj/item/reagent_containers/hypospray/medipen/atropine = 2, + /obj/item/storage/medkit/regular = 3, + /obj/item/storage/medkit/brute = 1, + /obj/item/storage/medkit/fire = 1, + /obj/item/storage/medkit/toxin = 1, + /obj/item/storage/medkit/o2 = 1, + /obj/item/storage/medkit/advanced = 1, + /obj/item/defibrillator/loaded = 1, + /obj/item/wallframe/defib_mount = 1, + /obj/item/sensor_device = 2, + /obj/item/pinpointer/crew = 2, + /obj/item/shears = 1) /////////// forgottenship lore diff --git a/code/modules/mapfluff/ruins/spaceruin_code/hauntedtradingpost.dm b/code/modules/mapfluff/ruins/spaceruin_code/hauntedtradingpost.dm index 958fa51fcc109..03bd6c224deda 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/hauntedtradingpost.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/hauntedtradingpost.dm @@ -115,14 +115,16 @@ // [Hazards & Traps] //cyborg holobarriers that die when the boss dies, how exciting -#define SELFDESTRUCT_QUEUE "hauntedtradingpost_sd" //make sure it matches the AI cores ID /obj/structure/holosign/barrier/cyborg/cybersun_ai_shield desc = "A fragile holographic energy field projected by an AI core. It keeps unwanted humanoids at safe distance." /obj/structure/holosign/barrier/cyborg/cybersun_ai_shield/Initialize(mapload) . = ..() - if(mapload) //shouldnt queue when we arent even part of a ruin, probably admin shitspawned - SSqueuelinks.add_to_queue(src, SELFDESTRUCT_QUEUE) + GLOB.selfdestructs_when_boss_dies += src + +/obj/structure/holosign/barrier/cyborg/cybersun_ai_shield/Destroy() + GLOB.selfdestructs_when_boss_dies -= src + return ..() //smes that produces power, until the boss dies then it self destructs and you gotta make your own power /obj/machinery/power/smes/magical/cybersun @@ -134,7 +136,12 @@ /obj/machinery/power/smes/magical/cybersun/Initialize(mapload) . = ..() if(donk_ai_slave) - SSqueuelinks.add_to_queue(src, SELFDESTRUCT_QUEUE) + GLOB.selfdestructs_when_boss_dies += src + +/obj/machinery/power/smes/magical/cybersun/Destroy() + if(donk_ai_slave) + GLOB.selfdestructs_when_boss_dies -= src + return ..() //this is a trigger for traps involving doors and shutters //doors get closed and bolted, shutters get cycled open/closed @@ -158,31 +165,19 @@ var/suicide_pact = FALSE //id of the suicide pact this tripwire is in var/suicide_pact_id +GLOBAL_LIST_EMPTY(tripwire_suicide_pact) /obj/machinery/button/door/invisible_tripwire/Initialize(mapload) . = ..() - if(donk_ai_slave) - SSqueuelinks.add_to_queue(src, SELFDESTRUCT_QUEUE) - if(suicide_pact && suicide_pact_id != null) - SSqueuelinks.add_to_queue(src, suicide_pact_id) - . = INITIALIZE_HINT_LATELOAD + if(donk_ai_slave == TRUE) + GLOB.selfdestructs_when_boss_dies += src + if(suicide_pact == TRUE && suicide_pact_id != null) + GLOB.tripwire_suicide_pact += src var/static/list/loc_connections = list( COMSIG_ATOM_ENTERED = PROC_REF(on_entered), ) AddElement(/datum/element/connect_loc, loc_connections) -/obj/machinery/button/door/invisible_tripwire/post_machine_initialize() - . = ..() - if(!suicide_pact || isnull(SSqueuelinks.queues[suicide_pact_id])) - return // we got beat to it - SSqueuelinks.pop_link(suicide_pact_id) - -/obj/machinery/button/door/invisible_tripwire/MatchedLinks(id, list/partners) - if(id != suicide_pact_id) - return - for(var/partner in partners) - RegisterSignal(partner, COMSIG_PUZZLE_COMPLETED, TYPE_PROC_REF(/datum, selfdelete)) - /obj/machinery/button/door/invisible_tripwire/proc/on_entered(atom/source, atom/movable/victim) SIGNAL_HANDLER if(!isliving(victim)) @@ -199,10 +194,20 @@ INVOKE_ASYNC(src, TYPE_PROC_REF(/atom, interact), victim) if(multiuse && uses_remaining != 1) return - if(suicide_pact && suicide_pact_id) - SEND_SIGNAL(src, COMSIG_PUZZLE_COMPLETED) + if(suicide_pact&& suicide_pact_id) + for (var/obj/machinery/button/door/invisible_tripwire/pact_member in GLOB.tripwire_suicide_pact) + if(src.suicide_pact_id == pact_member.suicide_pact_id) + qdel(pact_member) qdel(src) + +/obj/machinery/button/door/invisible_tripwire/Destroy() + if(donk_ai_slave) + GLOB.selfdestructs_when_boss_dies -= src + if(suicide_pact && suicide_pact_id) + GLOB.tripwire_suicide_pact -= src + return ..() + //door button that destroys itself when it is pressed /obj/machinery/button/door/selfdestructs icon_state= "button-warning" @@ -266,8 +271,13 @@ proximity_monitor?.set_range(trigger_range) my_turf = get_turf(src) host_machine = locate(/obj/machinery) in loc - if(donk_ai_slave) - SSqueuelinks.add_to_queue(src, SELFDESTRUCT_QUEUE) + if(donk_ai_slave == TRUE) + GLOB.selfdestructs_when_boss_dies += src + +/obj/effect/overloader_trap/Destroy() + if(donk_ai_slave == TRUE) + GLOB.selfdestructs_when_boss_dies -= src + return ..() /obj/effect/overloader_trap/proc/check_faction(mob/target) for(var/faction1 in faction) @@ -371,4 +381,3 @@ damage = 30 wound_bonus = -50 -#undef SELFDESTRUCT_QUEUE diff --git a/code/modules/mining/boulder_processing/_boulder_processing.dm b/code/modules/mining/boulder_processing/_boulder_processing.dm index 834d8d08f807e..ab72e4ebae57b 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 up to [boulders_processing_count] boulders at a time.") + . += span_notice("Can process upto [boulders_processing_count] boulders at a time.") if(anchored) - . += span_notice("It's [EXAMINE_HINT("anchored")] in place.") + . += span_notice("Its [EXAMINE_HINT("anchored")] in place.") else . += span_warning("It needs to be [EXAMINE_HINT("anchored")] to start operations.") - . += span_notice("Its maintenance panel can be [EXAMINE_HINT("screwed")] [panel_open ? "closed" : "open"].") + . += span_notice("Its maintainence 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 it first!") + balloon_alert(user, "anchor 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 658eb97d5632f..9b9186968918b 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 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")].") + . += 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")].") if(anchored) - . += span_notice("It's [EXAMINE_HINT("anchored")] in place.") + . += span_notice("Its [EXAMINE_HINT("anchored")] in place.") else . += span_warning("It needs to be [EXAMINE_HINT("anchored")] to start operations.") - . += span_notice("Its maintenance panel can be [EXAMINE_HINT("screwed")] [panel_open ? "closed" : "open"].") + . += span_notice("Its maintainence 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,9 +127,7 @@ var/result = pre_collect_boulder() if(result == TURF_BLOCKED_BY_BOULDER) - balloon_alert(user, "no space!") - else if(result) - balloon_alert(user, "teleporting...") + balloon_alert(user, "no space") COOLDOWN_START(src, manual_teleport_cooldown, TELEPORTATION_TIME) return TRUE @@ -164,9 +162,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) @@ -181,9 +179,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) @@ -194,7 +192,7 @@ if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN || panel_open) return if(!anchored) - balloon_alert(user, "anchor it first!") + balloon_alert(user, "anchor first!") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN toggle_auto_on(user) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -213,7 +211,7 @@ balloon_alert(user, "close panel first!") return if(!anchored) - balloon_alert(user, "anchor it first!") + balloon_alert(user, "anchor first!") return if(!is_operational || machine_stat & (BROKEN | NOPOWER)) return @@ -230,7 +228,7 @@ if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN || panel_open) return if(!anchored) - balloon_alert(user, "unanchored!") + balloon_alert(user, "anchor first!") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN toggle_auto_on(user) @@ -241,7 +239,7 @@ if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN || panel_open) return if(!anchored) - balloon_alert(user, "unanchored!") + balloon_alert(user, "anchor first!") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN toggle_auto_on(user) diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 1da0a7db6a394..6a276e830726b 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -49,6 +49,7 @@ ) //technically it's huge and bulky, but this provides an incentive to use it AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=20) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) /obj/item/kinetic_crusher/Destroy() QDEL_LIST(trophies) @@ -174,11 +175,10 @@ playsound(user, 'sound/weapons/empty.ogg', 100, TRUE) update_appearance() -/obj/item/kinetic_crusher/on_saboteur(datum/source, disrupt_duration) - . = ..() +/obj/item/kinetic_crusher/proc/on_saboteur(datum/source, disrupt_duration) set_light_on(FALSE) playsound(src, 'sound/weapons/empty.ogg', 100, TRUE) - return TRUE + return COMSIG_SABOTEUR_SUCCESS /obj/item/kinetic_crusher/update_icon_state() inhand_icon_state = "crusher[HAS_TRAIT(src, TRAIT_WIELDED)]" // this is not icon_state and not supported by 2hcomponent diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index 3783b5f592cd1..649acabfcae4a 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -38,7 +38,6 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) var/obj/structure/extraction_point/extraction_point = point_ref.resolve() if(isnull(extraction_point)) GLOB.total_extraction_beacons.Remove(point_ref) - continue if(extraction_point.beacon_network in beacon_networks) possible_beacons += extraction_point if(!length(possible_beacons)) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 3a1e88d5af13b..f833e15d3f3de 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -8,7 +8,6 @@ resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF can_install_electronics = FALSE paint_jobs = null - can_weld_shut = FALSE /obj/structure/closet/crate/necropolis/tendril desc = "It's watching you suspiciously. You need a skeleton key to open it." diff --git a/code/modules/mining/lavaland/tendril_loot.dm b/code/modules/mining/lavaland/tendril_loot.dm index 2ded64c17aaea..0403e17ad796a 100644 --- a/code/modules/mining/lavaland/tendril_loot.dm +++ b/code/modules/mining/lavaland/tendril_loot.dm @@ -425,7 +425,8 @@ if(!user) return - user.remove_traits(list(TRAIT_GODMODE, TRAIT_NO_TRANSFORM), REF(src)) + user.status_flags &= ~GODMODE + REMOVE_TRAIT(user, TRAIT_NO_TRANSFORM, REF(src)) user.forceMove(get_turf(src)) user.visible_message(span_danger("[user] pops back into reality!")) @@ -436,7 +437,8 @@ setDir(user.dir) user.forceMove(src) - user.add_traits(list(TRAIT_GODMODE, TRAIT_NO_TRANSFORM), REF(src)) + ADD_TRAIT(user, TRAIT_NO_TRANSFORM, REF(src)) + user.status_flags |= GODMODE user_ref = WEAKREF(user) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 5d96aace182a8..53fd78cf94d49 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -160,7 +160,6 @@ close_sound = 'sound/machines/trapdoor/trapdoor_shut.ogg' set_dir_on_move = TRUE can_buckle = TRUE - can_weld_shut = FALSE /// Whether we're on a set of rails or just on the ground var/on_rails = FALSE diff --git a/code/modules/mob/camera/camera.dm b/code/modules/mob/camera/camera.dm index eb0d787f64b49..b4ddc8cd9c8b4 100644 --- a/code/modules/mob/camera/camera.dm +++ b/code/modules/mob/camera/camera.dm @@ -4,10 +4,10 @@ density = FALSE move_force = INFINITY move_resist = INFINITY + status_flags = GODMODE // You can't damage it. mouse_opacity = MOUSE_OPACITY_TRANSPARENT invisibility = INVISIBILITY_ABSTRACT // No one can see us sight = SEE_SELF - status_flags = NONE /// Toggles if the camera can move on shuttles var/move_on_shuttle = FALSE /// Toggles if the camera can use emotes @@ -15,7 +15,6 @@ /mob/camera/Initialize(mapload) . = ..() - ADD_TRAIT(src, TRAIT_GODMODE, INNATE_TRAIT) SSpoints_of_interest.make_point_of_interest(src) if(!move_on_shuttle) ADD_TRAIT(src, TRAIT_BLOCK_SHUTTLE_MOVEMENT, INNATE_TRAIT) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index f3b48b438b8ae..fbece48ddab86 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -127,7 +127,7 @@ return GENERIC_JOB_UNAVAILABLE_ERROR /mob/dead/new_player/proc/IsJobUnavailable(rank, latejoin = FALSE) - var/datum/job/job = SSjob.get_job(rank) + var/datum/job/job = SSjob.GetJob(rank) if(!(job.job_flags & JOB_NEW_PLAYER_JOINABLE)) return JOB_UNAVAILABLE_GENERIC if((job.current_positions >= job.total_positions) && job.total_positions != -1) @@ -172,9 +172,9 @@ SSticker.queued_players -= src SSticker.queue_delay = 4 - var/datum/job/job = SSjob.get_job(rank) + var/datum/job/job = SSjob.GetJob(rank) - if(!SSjob.assign_role(src, job, TRUE)) + if(!SSjob.AssignRole(src, job, TRUE)) tgui_alert(usr, "There was an unexpected error putting you into your requested job. If you cannot join with any job, you should contact an admin.") return FALSE @@ -187,7 +187,7 @@ CRASH("Failed to create a character for latejoin.") transfer_character() - SSjob.equip_rank(character, job, character.client) + SSjob.EquipRank(character, job, character.client) job.after_latejoin_spawn(character) #define IS_NOT_CAPTAIN 0 diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index fb3b97066e0bf..49ac17d48ece9 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -88,13 +88,13 @@ for(var/job in job_preferences) if(job_preferences[job] > highest_pref) - preview_job = SSjob.get_job(job) + preview_job = SSjob.GetJob(job) highest_pref = job_preferences[job] return preview_job /datum/preferences/proc/render_new_preview_appearance(mob/living/carbon/human/dummy/mannequin, show_job_clothes = TRUE) - var/datum/job/no_job = SSjob.get_job_type(/datum/job/unassigned) + var/datum/job/no_job = SSjob.GetJobType(/datum/job/unassigned) var/datum/job/preview_job = get_highest_priority_job() || no_job if(preview_job) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 708d8bbdd0702..2d22c11ee71f8 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -586,19 +586,19 @@ hud_used.build_hand_slots() //GetAllContents that is reasonable and not stupid -/mob/living/proc/get_all_gear(accessories = TRUE, recursive = TRUE) - var/list/processing_list = get_equipped_items(INCLUDE_POCKETS | INCLUDE_HELD | (accessories ? INCLUDE_ACCESSORIES : NONE)) +/mob/living/proc/get_all_gear() + var/list/processing_list = get_equipped_items(INCLUDE_POCKETS | INCLUDE_ACCESSORIES | INCLUDE_HELD) list_clear_nulls(processing_list) // handles empty hands var/i = 0 while(i < length(processing_list)) var/atom/A = processing_list[++i] - if(A.atom_storage && recursive) + if(A.atom_storage) processing_list += A.atom_storage.return_inv() return processing_list /// Returns a list of things that the provided mob has, including any storage-capable implants. -/mob/living/proc/gather_belongings(accessories = TRUE, recursive = TRUE) - var/list/belongings = get_all_gear(accessories, recursive) +/mob/living/proc/gather_belongings() + var/list/belongings = get_all_gear() for (var/obj/item/implant/storage/internal_bag in implants) belongings += internal_bag.contents return belongings diff --git a/code/modules/mob/living/basic/basic_defense.dm b/code/modules/mob/living/basic/basic_defense.dm index 9a7ddef3ce0f2..646cabe339d42 100644 --- a/code/modules/mob/living/basic/basic_defense.dm +++ b/code/modules/mob/living/basic/basic_defense.dm @@ -159,7 +159,7 @@ ..() /mob/living/basic/update_stat() - if(HAS_TRAIT(src, TRAIT_GODMODE)) + if(status_flags & GODMODE) return if(stat != DEAD) if(health <= 0) diff --git a/code/modules/mob/living/basic/bots/_bots.dm b/code/modules/mob/living/basic/bots/_bots.dm index be7ce8bc5ddc5..cc6ac85c6cbc4 100644 --- a/code/modules/mob/living/basic/bots/_bots.dm +++ b/code/modules/mob/living/basic/bots/_bots.dm @@ -538,7 +538,6 @@ 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() @@ -559,7 +558,8 @@ GLOBAL_LIST_INIT(command_strings, list( // process control input switch(command) if("patroloff") - set_patrol_off() + bot_reset() //HOLD IT!! //OBJECTION!! + set_mode_flags(bot_mode_flags & ~BOT_MODE_AUTOPATROL) if("patrolon") set_mode_flags(bot_mode_flags | BOT_MODE_AUTOPATROL) if("summon") @@ -567,9 +567,6 @@ 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 fd89168ddf4f1..a0abbbfd48b40 100644 --- a/code/modules/mob/living/basic/bots/bot_ai.dm +++ b/code/modules/mob/living/basic/bots/bot_ai.dm @@ -48,12 +48,6 @@ 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 @@ -81,7 +75,7 @@ /datum/ai_controller/basic_controller/bot/proc/reset_bot() SIGNAL_HANDLER - CancelActions() + if(!length(reset_keys)) return for(var/key in reset_keys) @@ -136,6 +130,7 @@ 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 @@ -200,6 +195,8 @@ /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/drone/interaction.dm b/code/modules/mob/living/basic/drone/interaction.dm index 58b7cd88ef287..0b0247c1c45f3 100644 --- a/code/modules/mob/living/basic/drone/interaction.dm +++ b/code/modules/mob/living/basic/drone/interaction.dm @@ -32,7 +32,7 @@ return ..() /mob/living/basic/drone/mob_try_pickup(mob/living/user, instant=FALSE) - if(stat == DEAD || HAS_TRAIT(src, TRAIT_GODMODE)) + if(stat == DEAD || status_flags & GODMODE) return return ..() diff --git a/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm index fcb61892e5714..d1b1aebf9eb00 100644 --- a/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm +++ b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm @@ -146,7 +146,10 @@ obj_damage = 15 ai_controller = /datum/ai_controller/basic_controller/gorilla/lesser butcher_results = list(/obj/item/food/meat/slab/gorilla = 2) - current_size = 0.75 + +/mob/living/basic/gorilla/lesser/Initialize(mapload) + . = ..() + transform *= 0.75 /// Cargo's wonderful mascot, the tranquil box-carrying ape /mob/living/basic/gorilla/cargorilla @@ -164,21 +167,4 @@ ADD_TRAIT(src, TRAIT_PACIFISM, INNATE_TRAIT) AddComponent(/datum/component/crate_carrier) -/// A version of the gorilla achieved by reaching enough genetic damage as a monkey -/mob/living/basic/gorilla/genetics - name = "Lab Gorilla" - maxHealth = 180 - health = 180 - desc = "A gorilla created via \"advanced genetic science\". While not quite as strong as their wildborne brethren, this simian still packs a punch." - melee_damage_lower = 15 - melee_damage_upper = 18 - obj_damage = 25 - speed = 0.1 - paralyze_chance = 0 - current_size = 0.9 - -/mob/living/basic/gorilla/genetics/Initialize(mapload) - . = ..() - qdel(GetComponent(/datum/component/amputating_limbs)) - #undef GORILLA_HANDS_LAYER diff --git a/code/modules/mob/living/basic/guardian/guardian_verbs.dm b/code/modules/mob/living/basic/guardian/guardian_verbs.dm index b69fac878209a..80a2af7db7a27 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", max_length = MAX_MESSAGE_LEN) + var/input = tgui_input_text(src, "Enter a message to tell your summoner", "Guardian") 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", max_length = MAX_MESSAGE_LEN) + var/input = tgui_input_text(owner, "Enter a message to tell your guardian", "Message") StartCooldown() if (!input) return FALSE diff --git a/code/modules/mob/living/basic/health_adjustment.dm b/code/modules/mob/living/basic/health_adjustment.dm index ca98f98eb8e91..bae9d7b9e57b5 100644 --- a/code/modules/mob/living/basic/health_adjustment.dm +++ b/code/modules/mob/living/basic/health_adjustment.dm @@ -4,12 +4,12 @@ * Arguments: * * amount The amount that will be used to adjust the mob's health * * updating_health If the mob's health should be immediately updated to the new value - * * forced If we should force update the adjustment of the mob's health no matter the restrictions, like TRAIT_GODMODE + * * forced If we should force update the adjustment of the mob's health no matter the restrictions, like GODMODE * returns the net change in bruteloss after applying the damage amount */ /mob/living/basic/proc/adjust_health(amount, updating_health = TRUE, forced = FALSE) . = FALSE - if(!forced && HAS_TRAIT(src, TRAIT_GODMODE)) + if(!forced && (status_flags & GODMODE)) return 0 . = bruteloss // bruteloss value before applying damage bruteloss = round(clamp(bruteloss + amount, 0, maxHealth * 2), DAMAGE_PRECISION) diff --git a/code/modules/mob/living/basic/lavaland/bileworm/bileworm_actions.dm b/code/modules/mob/living/basic/lavaland/bileworm/bileworm_actions.dm index ca07c1a043ed5..f023215d7dd5c 100644 --- a/code/modules/mob/living/basic/lavaland/bileworm/bileworm_actions.dm +++ b/code/modules/mob/living/basic/lavaland/bileworm/bileworm_actions.dm @@ -19,14 +19,14 @@ return playsound(burrower, 'sound/effects/break_stone.ogg', 50, TRUE) new /obj/effect/temp_visual/mook_dust(get_turf(burrower)) - ADD_TRAIT(burrower, TRAIT_GODMODE, REF(src)) + burrower.status_flags |= GODMODE burrower.SetInvisibility(INVISIBILITY_MAXIMUM, id=type) burrower.forceMove(unburrow_turf) //not that it's gonna die with godmode but still SLEEP_CHECK_DEATH(rand(0.7 SECONDS, 1.2 SECONDS), burrower) playsound(burrower, 'sound/effects/break_stone.ogg', 50, TRUE) new /obj/effect/temp_visual/mook_dust(unburrow_turf) - REMOVE_TRAIT(burrower, TRAIT_GODMODE, REF(src)) + burrower.status_flags &= ~GODMODE burrower.RemoveInvisibility(type) /datum/action/cooldown/mob_cooldown/resurface/proc/get_unburrow_turf(mob/living/burrower, atom/target) @@ -108,14 +108,14 @@ return //this will give up on devouring the target which is fine by me playsound(devourer, 'sound/effects/break_stone.ogg', 50, TRUE) new /obj/effect/temp_visual/mook_dust(get_turf(devourer)) - ADD_TRAIT(devourer, TRAIT_GODMODE, REF(src)) + devourer.status_flags |= GODMODE devourer.SetInvisibility(INVISIBILITY_MAXIMUM, id=type) devourer.forceMove(devour_turf) //not that it's gonna die with godmode but still SLEEP_CHECK_DEATH(rand(0.7 SECONDS, 1.2 SECONDS), devourer) playsound(devourer, 'sound/effects/break_stone.ogg', 50, TRUE) new /obj/effect/temp_visual/mook_dust(devour_turf) - REMOVE_TRAIT(devourer, TRAIT_GODMODE, REF(src)) + devourer.status_flags &= ~GODMODE devourer.RemoveInvisibility(type) if(!(target in devour_turf)) to_chat(devourer, span_warning("Someone stole your dinner!")) diff --git a/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers.dm b/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers.dm index 6b822d490de78..f9e1d458ef2ed 100644 --- a/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers.dm +++ b/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers.dm @@ -139,12 +139,12 @@ can_breed = FALSE gender = NEUTER ai_controller = /datum/ai_controller/basic_controller/gutlunch/gutlunch_baby - current_size = 0.6 ///list of stats we inherited var/datum/gutlunch_inherited_stats/inherited_stats /mob/living/basic/mining/gutlunch/grub/Initialize(mapload) . = ..() + transform = transform.Scale(0.6, 0.6) AddComponent(\ /datum/component/growth_and_differentiation,\ growth_time = 3 MINUTES,\ 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 856ff315d0c1e..1bae1b3035379 100644 --- a/code/modules/mob/living/basic/lavaland/legion/legion_ai.dm +++ b/code/modules/mob/living/basic/lavaland/legion/legion_ai.dm @@ -66,9 +66,6 @@ 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/parrot/poly.dm b/code/modules/mob/living/basic/pets/parrot/poly.dm index f825788decd98..cba3dd6e588e3 100644 --- a/code/modules/mob/living/basic/pets/parrot/poly.dm +++ b/code/modules/mob/living/basic/pets/parrot/poly.dm @@ -191,9 +191,9 @@ name = "The Ghost of Poly" desc = "Doomed to squawk the Earth." color = "#FFFFFF77" + status_flags = GODMODE sentience_type = SENTIENCE_BOSS //This is so players can't mindswap into ghost poly to become a literal god incorporeal_move = INCORPOREAL_MOVE_BASIC - status_flags = NONE butcher_results = list(/obj/item/ectoplasm = 1) ai_controller = /datum/ai_controller/basic_controller/parrot/ghost speech_probability_rate = 1 @@ -202,7 +202,7 @@ /mob/living/basic/parrot/poly/ghost/Initialize(mapload) // block anything and everything that could possibly happen with writing memory for ghosts memory_saved = TRUE - add_traits(list(TRAIT_GODMODE, TRAIT_DONT_WRITE_MEMORY), INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_DONT_WRITE_MEMORY, INNATE_TRAIT) RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) return ..() diff --git a/code/modules/mob/living/basic/ruin_defender/cybersun_aicore.dm b/code/modules/mob/living/basic/ruin_defender/cybersun_aicore.dm index 7b27da8d9778e..e9b62f9deaf2e 100644 --- a/code/modules/mob/living/basic/ruin_defender/cybersun_aicore.dm +++ b/code/modules/mob/living/basic/ruin_defender/cybersun_aicore.dm @@ -31,8 +31,8 @@ var/datum/action/cooldown/mob_cooldown/targeted_mob_ability/donk_laser //is this being used as part of the haunted trading post ruin? if true, stuff there will self destruct when this mob dies var/donk_ai_master = FALSE - /// the queue id for the stuff that selfdestructs when we die - var/selfdestruct_queue_id = "hauntedtradingpost_sd" +// list of stuff tagged to self destruct when this mob dies +GLOBAL_LIST_EMPTY(selfdestructs_when_boss_dies) /mob/living/basic/cybersun_ai_core/Initialize(mapload) . = ..() @@ -45,20 +45,21 @@ BARRAGE_ABILITY_TYPEPATH = BB_CYBERSUN_CORE_BARRAGE, ) grant_actions_by_list(innate_actions) - if(mapload && donk_ai_master) - return INITIALIZE_HINT_LATELOAD - -/mob/living/basic/cybersun_ai_core/LateInitialize() - SSqueuelinks.add_to_queue(src, selfdestruct_queue_id) - SSqueuelinks.pop_link(selfdestruct_queue_id) - -/mob/living/basic/cybersun_ai_core/MatchedLinks(id, list/partners) // id == queue id (for multiple queue objects) - if(id != selfdestruct_queue_id) - return - for(var/datum/partner as anything in partners) // all our partners in the selfdestruct queue are now registered to qdel if I die - partner.RegisterSignal(src, COMSIG_QDELETING, TYPE_PROC_REF(/datum, selfdelete)) /mob/living/basic/cybersun_ai_core/death(gibbed) + if(donk_ai_master == TRUE) + //disable all the tripwire traps + for (var/obj/item/pressure_plate/puzzle/invisible_tripwire as anything in GLOB.selfdestructs_when_boss_dies) + qdel(invisible_tripwire) + //and the electric overload traps + for (var/obj/effect/overloader_trap as anything in GLOB.selfdestructs_when_boss_dies) + qdel(overloader_trap) + //then disable the AI defence holograms + for (var/obj/structure/holosign/barrier/cyborg/cybersun_ai_shield as anything in GLOB.selfdestructs_when_boss_dies) + qdel(cybersun_ai_shield) + //then the power generator + for (var/obj/machinery/power/smes/magical/cybersun as anything in GLOB.selfdestructs_when_boss_dies) + qdel(cybersun) do_sparks(number = 5, source = src) return ..() diff --git a/code/modules/mob/living/basic/ruin_defender/flesh.dm b/code/modules/mob/living/basic/ruin_defender/flesh.dm index f95a949faa27f..359705ecff2bd 100644 --- a/code/modules/mob/living/basic/ruin_defender/flesh.dm +++ b/code/modules/mob/living/basic/ruin_defender/flesh.dm @@ -83,7 +83,7 @@ victim.visible_message(span_warning("[victim]'s [current_bodypart.name] instinctively starts feeling [candidate]!")) if (!victim.anchored && !prob(victim.combat_mode ? LIVING_FLESH_COMBAT_TOUCH_CHANCE : LIVING_FLESH_TOUCH_CHANCE)) - INVOKE_ASYNC(victim, TYPE_PROC_REF(/atom/movable, start_pulling), candidate, supress_message = TRUE) + victim.start_pulling(candidate, supress_message = TRUE) return var/active_hand = victim.active_hand_index diff --git a/code/modules/mob/living/basic/ruin_defender/living_floor.dm b/code/modules/mob/living/basic/ruin_defender/living_floor.dm index ce4fbc53f51fa..105838f0c55dd 100644 --- a/code/modules/mob/living/basic/ruin_defender/living_floor.dm +++ b/code/modules/mob/living/basic/ruin_defender/living_floor.dm @@ -26,7 +26,7 @@ icon_living = "floor" mob_size = MOB_SIZE_HUGE mob_biotypes = MOB_SPECIAL - status_flags = NONE + status_flags = GODMODE //nothing but crowbars may kill us death_message = "" unsuitable_atmos_damage = 0 minimum_survivable_temperature = 0 @@ -52,7 +52,7 @@ /mob/living/basic/living_floor/Initialize(mapload) . = ..() - add_traits(list(TRAIT_GODMODE, TRAIT_IMMOBILIZED), INNATE_TRAIT) //nothing but crowbars may kill us + ADD_TRAIT(src, TRAIT_IMMOBILIZED, INNATE_TRAIT) var/static/list/connections = list(COMSIG_ATOM_ENTERED = PROC_REF(look_aggro), COMSIG_ATOM_EXITED = PROC_REF(look_deaggro)) AddComponent(/datum/component/connect_range, tracked = src, connections = connections, range = 1, works_in_containers = FALSE) diff --git a/code/modules/mob/living/basic/space_fauna/bear/_bear.dm b/code/modules/mob/living/basic/space_fauna/bear/_bear.dm index d13df29806409..f4a1267e9db70 100644 --- a/code/modules/mob/living/basic/space_fauna/bear/_bear.dm +++ b/code/modules/mob/living/basic/space_fauna/bear/_bear.dm @@ -42,7 +42,7 @@ /mob/living/basic/bear/Initialize(mapload) . = ..() - add_traits(list(TRAIT_SPACEWALK, TRAIT_FENCE_CLIMBER, TRAIT_SNOWSTORM_IMMUNE), INNATE_TRAIT) + add_traits(list(TRAIT_SPACEWALK, TRAIT_FENCE_CLIMBER), INNATE_TRAIT) AddElement(/datum/element/ai_retaliate) AddComponent(/datum/component/tree_climber, climbing_distance = 15) AddElement(/datum/element/swabable, CELL_LINE_TABLE_BEAR, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) @@ -90,16 +90,16 @@ maxHealth = 250 health = 250 faction = list(FACTION_NEUTRAL) - status_flags = CANPUSH /mob/living/basic/bear/snow/ancient name = "ancient polar bear" desc = "A grizzled old polar bear, its hide thick enough to make it impervious to almost all weapons." + status_flags = CANPUSH | GODMODE gold_core_spawnable = NO_SPAWN -/mob/living/basic/bear/snow/ancient/Initialize(mapload) +/mob/living/basic/bear/snow/Initialize(mapload) . = ..() - ADD_TRAIT(src, TRAIT_GODMODE, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_SNOWSTORM_IMMUNE, INNATE_TRAIT) /mob/living/basic/bear/russian name = "combat bear" diff --git a/code/modules/mob/living/basic/space_fauna/demon/demon.dm b/code/modules/mob/living/basic/space_fauna/demon/demon.dm index eb424cdce49d4..21eaf66a3e869 100644 --- a/code/modules/mob/living/basic/space_fauna/demon/demon.dm +++ b/code/modules/mob/living/basic/space_fauna/demon/demon.dm @@ -66,7 +66,7 @@ if(isnull(antag_type) || mind.has_antag_datum(antag_type)) return // we weren't built for this proc to run - mind.set_assigned_role(SSjob.get_job_type(/datum/job/slaughter_demon)) + mind.set_assigned_role(SSjob.GetJobType(/datum/job/slaughter_demon)) mind.special_role = ROLE_SLAUGHTER_DEMON mind.add_antag_datum(antag_type) diff --git a/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm b/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm index 62b6a8da7e6aa..a154ba9da0c65 100644 --- a/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm +++ b/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm @@ -125,7 +125,7 @@ return TRUE generated_objectives_and_spells = TRUE - mind.set_assigned_role(SSjob.get_job_type(/datum/job/revenant)) + mind.set_assigned_role(SSjob.GetJobType(/datum/job/revenant)) mind.special_role = ROLE_REVENANT SEND_SOUND(src, sound('sound/effects/ghost.ogg')) mind.add_antag_datum(/datum/antagonist/revenant) 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 8fc79080cac84..790879b0de2c1 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]", max_length = MAX_MESSAGE_LEN) + var/new_directive = tgui_input_text(owner, "Enter the new directive", "Create directive", "[current_directive]") 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", max_length = MAX_MESSAGE_LEN) + var/input = tgui_input_text(owner, "Input a command for your legions to follow.", "Command") if(!input || QDELETED(src) || QDELETED(owner) || !IsAvailable(feedback = TRUE)) return spider_command(owner, input) diff --git a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/inflation.dm b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/inflation.dm index a25b3c52ad8fc..bba6e0eb460c6 100644 --- a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/inflation.dm +++ b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/inflation.dm @@ -58,12 +58,13 @@ return FALSE RegisterSignal(fugu, COMSIG_MOB_STATCHANGE, PROC_REF(check_death)) fugu.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/inflated) - fugu.add_traits(list(TRAIT_FUGU_GLANDED, TRAIT_GODMODE), TRAIT_STATUS_EFFECT(id)) + ADD_TRAIT(fugu, TRAIT_FUGU_GLANDED, TRAIT_STATUS_EFFECT(id)) fugu.AddElement(/datum/element/wall_tearer, allow_reinforced = FALSE) fugu.mob_size = MOB_SIZE_LARGE fugu.icon_state = "Fugu1" fugu.melee_damage_lower = 15 fugu.melee_damage_upper = 20 + fugu.status_flags |= GODMODE fugu.obj_damage = 60 fugu.ai_controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, TRUE) fugu.ai_controller.CancelActions() @@ -75,11 +76,12 @@ return // Check again in case you changed mob after application but somehow kept the status effect UnregisterSignal(fugu, COMSIG_MOB_STATCHANGE) fugu.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/inflated) - fugu.remove_traits(list(TRAIT_FUGU_GLANDED, TRAIT_GODMODE), TRAIT_STATUS_EFFECT(id)) + REMOVE_TRAIT(fugu, TRAIT_FUGU_GLANDED, TRAIT_STATUS_EFFECT(id)) fugu.RemoveElement(/datum/element/wall_tearer, allow_reinforced = FALSE) fugu.mob_size = MOB_SIZE_SMALL fugu.melee_damage_lower = 0 fugu.melee_damage_upper = 0 + fugu.status_flags &= ~GODMODE if (fugu.stat != DEAD) fugu.icon_state = "Fugu0" fugu.obj_damage = 0 diff --git a/code/modules/mob/living/basic/vermin/mouse.dm b/code/modules/mob/living/basic/vermin/mouse.dm index 5b8aad138fe10..7361e4be7b310 100644 --- a/code/modules/mob/living/basic/vermin/mouse.dm +++ b/code/modules/mob/living/basic/vermin/mouse.dm @@ -1,6 +1,6 @@ /mob/living/basic/mouse name = "mouse" - desc = "This cute little guy just loves the taste of insulated electrical cables. Isn't he adorable?" + desc = "This cute little guy just loves the taste of uninsulated electrical cables. Isn't he adorable?" icon_state = "mouse_gray" icon_living = "mouse_gray" icon_dead = "mouse_gray_dead" diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index dfe669a7092ed..1eae92026308f 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -122,7 +122,7 @@ //Makes a blood drop, leaking amt units of blood from the mob /mob/living/carbon/proc/bleed(amt) - if(!blood_volume || HAS_TRAIT(src, TRAIT_GODMODE)) + if(!blood_volume || (status_flags & GODMODE)) return blood_volume = max(blood_volume - amt, 0) diff --git a/code/modules/mob/living/brain/life.dm b/code/modules/mob/living/brain/life.dm index 7ffe49951ec26..9bebeac70ec83 100644 --- a/code/modules/mob/living/brain/life.dm +++ b/code/modules/mob/living/brain/life.dm @@ -14,7 +14,7 @@ handle_emp_damage(seconds_per_tick, times_fired) /mob/living/brain/update_stat() - if(HAS_TRAIT(src, TRAIT_GODMODE)) + if(status_flags & GODMODE) return if(health > HEALTH_THRESHOLD_DEAD) return diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm index d883cbc635950..7d4255d54d50b 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_length = MAX_NAME_LEN) + var/input_seed = tgui_input_text(user, "Enter a personality seed", "Enter seed", ask_role, MAX_NAME_LEN) if(isnull(input_seed)) return CLICK_ACTION_BLOCKING if(!user.can_perform_action(src)) @@ -137,7 +137,7 @@ GLOBAL_VAR(posibrain_notify_cooldown) brainmob.timeofdeath = transferred_user.timeofdeath brainmob.set_stat(CONSCIOUS) if(brainmob.mind) - brainmob.mind.set_assigned_role(SSjob.get_job_type(posibrain_job_path)) + brainmob.mind.set_assigned_role(SSjob.GetJobType(posibrain_job_path)) if(transferred_user.mind) transferred_user.mind.transfer_to(brainmob) @@ -160,7 +160,7 @@ GLOBAL_VAR(posibrain_notify_cooldown) var/policy = get_policy(ROLE_POSIBRAIN) if(policy) to_chat(brainmob, policy) - brainmob.mind.set_assigned_role(SSjob.get_job_type(posibrain_job_path)) + brainmob.mind.set_assigned_role(SSjob.GetJobType(posibrain_job_path)) brainmob.set_stat(CONSCIOUS) visible_message(new_mob_message) 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 21a09d82a6965..999ec07f41a65 100644 --- a/code/modules/mob/living/carbon/alien/adult/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/adult/alien_powers.dm @@ -135,7 +135,7 @@ Doesn't work on other aliens/AI.*/ if(!chosen_recipient) return FALSE - var/to_whisper = tgui_input_text(owner, title = "Alien Whisper", max_length = MAX_MESSAGE_LEN) + var/to_whisper = tgui_input_text(owner, title = "Alien Whisper") 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/alien/adult/queen.dm b/code/modules/mob/living/carbon/alien/adult/queen.dm index a925b4c5460ea..4387f7db3eca0 100644 --- a/code/modules/mob/living/carbon/alien/adult/queen.dm +++ b/code/modules/mob/living/carbon/alien/adult/queen.dm @@ -168,9 +168,10 @@ span_noticealien("The queen has granted you a promotion to Praetorian!"), ) - var/mob/living/carbon/alien/lucky_winner = to_promote - var/mob/living/carbon/alien/adult/royal/praetorian/new_prae = new(lucky_winner.loc) - lucky_winner.alien_evolve(new_prae) + var/mob/living/carbon/alien/adult/royal/praetorian/new_prae = new(to_promote.loc) + to_promote.mind.transfer_to(new_prae) + + qdel(to_promote) qdel(src) return TRUE diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 9744bcbada7e5..f587b9d00160c 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -23,13 +23,6 @@ unique_name = TRUE var/static/regex/alien_name_regex = new("alien (larva|sentinel|drone|hunter|praetorian|queen)( \\(\\d+\\))?") - var/static/list/xeno_allowed_items = typecacheof(list( - /obj/item/clothing/mask/facehugger, - /obj/item/toy/basketball, // playing ball against a xeno is rigged since they cannot be disarmed, their game is out of this world - /obj/item/toy/toy_xeno, - /obj/item/sticker, //funny ~Jimmyl - /obj/item/toy/plush/rouny, - )) /mob/living/carbon/alien/Initialize(mapload) add_verb(src, /mob/living/proc/mob_sleep) @@ -44,11 +37,6 @@ . = ..() if(alien_speed) update_alien_speed() - LoadComponent( \ - /datum/component/itempicky, \ - xeno_allowed_items, \ - span_alien("Your claws lack the dexterity to hold %TARGET."), \ - CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_has_trait), src, TRAIT_ADVANCEDTOOLUSER)) /mob/living/carbon/alien/create_internal_organs() organs += new /obj/item/organ/internal/brain/alien @@ -143,11 +131,6 @@ Des: Removes all infected images from the alien. mind.name = new_xeno.real_name mind.transfer_to(new_xeno) - var/obj/item/organ/internal/stomach/alien/melting_pot = get_organ_slot(ORGAN_SLOT_STOMACH) - var/obj/item/organ/internal/stomach/alien/frying_pan = new_xeno.get_organ_slot(ORGAN_SLOT_STOMACH) - if(istype(melting_pot) && istype(frying_pan)) - for (var/atom/movable/poor_sod as anything in melting_pot.stomach_contents) - frying_pan.consume_thing(poor_sod) qdel(src) /// Changes the name of the xeno we are evolving into in order to keep the same numerical identifier the old xeno had. @@ -166,6 +149,9 @@ Des: Removes all infected images from the alien. set_name() +/mob/living/carbon/alien/can_hold_items(obj/item/I) + return (I && (I.item_flags & XENOMORPH_HOLDABLE || ISADVANCEDTOOLUSER(src)) && ..()) + /mob/living/carbon/alien/on_lying_down(new_lying_angle) . = ..() update_icons() diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 52f7b8dfc4789..147079ae720c3 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -11,7 +11,7 @@ /mob/living/carbon/alien/larva/update_stat() - if(HAS_TRAIT(src, TRAIT_GODMODE)) + if(status_flags & GODMODE) return if(stat != DEAD) if(health <= -maxHealth || !get_organ_by_type(/obj/item/organ/internal/brain)) diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 7bd7d7aec49af..f7ecd3075171e 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -3,7 +3,7 @@ return..() /mob/living/carbon/alien/check_breath(datum/gas_mixture/breath) - if(HAS_TRAIT(src, TRAIT_GODMODE)) + if(status_flags & GODMODE) return if(!breath || (breath.total_moles() == 0)) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 597769f11f271..d1ec6d7e88038 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -23,6 +23,7 @@ flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH layer = MOB_LAYER max_integrity = 100 + item_flags = XENOMORPH_HOLDABLE slowdown = 2 var/stat = CONSCIOUS //UNCONSCIOUS is the idle state in this case diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 0edeeb7fb70f3..2f539cc2f9aaa 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -550,7 +550,7 @@ //Updates the mob's health from bodyparts and mob damage variables /mob/living/carbon/updatehealth() - if(HAS_TRAIT(src, TRAIT_GODMODE)) + if(status_flags & GODMODE) return var/total_burn = 0 var/total_brute = 0 @@ -835,7 +835,7 @@ /mob/living/carbon/update_stat() - if(HAS_TRAIT(src, TRAIT_GODMODE)) + if(status_flags & GODMODE) return if(stat != DEAD) if(health <= HEALTH_THRESHOLD_DEAD && !HAS_TRAIT(src, TRAIT_NODEATH)) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index dd1d59ebc1043..ae0ad9c6662bf 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -311,12 +311,6 @@ if(HAS_TRAIT(src, TRAIT_BADTOUCH)) to_chat(helper, span_warning("[src] looks visibly upset as you pat [p_them()] on the head.")) - //DOPPLER EDIT ADDITION BEGIN - Excitable quirk! 🐶 - if(HAS_TRAIT(src, TRAIT_EXCITABLE)) - var/obj/item/organ/external/tail/src_tail = get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) - if(src_tail && !(src_tail.wag_flags & WAG_WAGGING)) - emote("wag") - //DOPPLER EDIT ADDITION END else if ((helper.zone_selected == BODY_ZONE_PRECISE_GROIN) && !isnull(src.get_organ_by_type(/obj/item/organ/external/tail))) helper.visible_message(span_notice("[helper] pulls on [src]'s tail!"), \ diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index ccbf735bd85aa..b781b296bc882 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -10,7 +10,6 @@ sharpness = NONE, attack_direction = null, attacking_item, - wound_clothing = TRUE, ) // Spread damage should always have def zone be null if(spread_damage) @@ -47,7 +46,6 @@ sharpness = NONE, attack_direction = null, attacking_item, - wound_clothing = TRUE, ) // Add relevant DR modifiers into blocked value to pass to parent @@ -105,7 +103,7 @@ . = heal_overall_damage(brute = abs(amount), required_bodytype = required_bodytype, updating_health = updating_health, forced = forced) /mob/living/carbon/setBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) - if(!forced && HAS_TRAIT(src, TRAIT_GODMODE)) + if(!forced && (status_flags & GODMODE)) return FALSE var/current = getBruteLoss() var/diff = amount - current @@ -122,7 +120,7 @@ . = heal_overall_damage(burn = abs(amount), required_bodytype = required_bodytype, updating_health = updating_health, forced = forced) /mob/living/carbon/setFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) - if(!forced && HAS_TRAIT(src, TRAIT_GODMODE)) + if(!forced && (status_flags & GODMODE)) return FALSE var/current = getFireLoss() var/diff = amount - current @@ -152,7 +150,7 @@ apply_status_effect(/datum/status_effect/incapacitating/stamcrit) /** - * If an organ exists in the slot requested, and we are capable of taking damage (we don't have TRAIT_GODMODE), call the damage proc on that organ. + * If an organ exists in the slot requested, and we are capable of taking damage (we don't have [GODMODE] on), call the damage proc on that organ. * * Arguments: * * slot - organ slot, like [ORGAN_SLOT_HEART] @@ -164,14 +162,14 @@ */ /mob/living/carbon/adjustOrganLoss(slot, amount, maximum, required_organ_flag = NONE) var/obj/item/organ/affected_organ = get_organ_slot(slot) - if(!affected_organ || HAS_TRAIT(src, TRAIT_GODMODE)) + if(!affected_organ || (status_flags & GODMODE)) return FALSE if(required_organ_flag && !(affected_organ.organ_flags & required_organ_flag)) return FALSE return affected_organ.apply_organ_damage(amount, maximum) /** - * If an organ exists in the slot requested, and we are capable of taking damage (we don't have TRAIT_GODMODE), call the set damage proc on that organ, which can + * If an organ exists in the slot requested, and we are capable of taking damage (we don't have [GODMODE] on), call the set damage proc on that organ, which can * set or clear the failing variable on that organ, making it either cease or start functions again, unlike adjustOrganLoss. * * Arguments: @@ -183,7 +181,7 @@ */ /mob/living/carbon/setOrganLoss(slot, amount, required_organ_flag = NONE) var/obj/item/organ/affected_organ = get_organ_slot(slot) - if(!affected_organ || HAS_TRAIT(src, TRAIT_GODMODE)) + if(!affected_organ || (status_flags & GODMODE)) return FALSE if(required_organ_flag && !(affected_organ.organ_flags & required_organ_flag)) return FALSE @@ -269,7 +267,7 @@ */ /mob/living/carbon/take_bodypart_damage(brute = 0, burn = 0, updating_health = TRUE, required_bodytype, check_armor = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE) . = FALSE - if(HAS_TRAIT(src, TRAIT_GODMODE)) + if(status_flags & GODMODE) return var/list/obj/item/bodypart/parts = get_damageable_bodyparts(required_bodytype) if(!parts.len) @@ -316,7 +314,7 @@ /mob/living/carbon/take_overall_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, forced = FALSE, required_bodytype) . = FALSE - if(!forced && HAS_TRAIT(src, TRAIT_GODMODE)) + if(!forced && (status_flags & GODMODE)) return // treat negative args as positive brute = abs(brute) diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index dc03dce8541fb..2053fd3920c58 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -237,7 +237,7 @@ if(!key) npc_message = "[t_He] [t_is] totally catatonic. The stresses of life in deep-space must have been too much for [t_him]. Any recovery is unlikely." else if(!client) - npc_message ="[t_He] [t_has] a blank, absent-minded stare and appears completely unresponsive to anything. [t_He] may snap out of it soon." + npc_message = "[t_He] [t_has] a blank, absent-minded stare and [t_has] been completely unresponsive to anything for [round(((world.time - lastclienttime) / (1 MINUTES)),1)] minutes. [t_He] may snap out of it soon." // DOPPLER EDIT CHANGE - SSD_INDICATOR - ORIGINAL: npc_message ="[t_He] [t_has] a blank, absent-minded stare and appears completely unresponsive to anything. [t_He] may snap out of it soon." if(npc_message) // give some space since this is usually near the end ADD_NEWLINE_IF_NECESSARY(.) @@ -472,33 +472,26 @@ return /mob/living/carbon/human/get_hud_examine_info(mob/living/user) - . = list() - var/perpname = get_face_name(get_id_name("")) - var/title = "" if(perpname && (HAS_TRAIT(user, TRAIT_SECURITY_HUD) || HAS_TRAIT(user, TRAIT_MEDICAL_HUD)) && (user.stat == CONSCIOUS || isobserver(user)) && user != src) var/datum/record/crew/target_record = find_record(perpname) if(target_record) . += "Rank: [target_record.rank]" . += "\[Front photo\]\[Side photo\]" if(HAS_TRAIT(user, TRAIT_MEDICAL_HUD) && HAS_TRAIT(user, TRAIT_SECURITY_HUD)) - title = separator_hr("Medical & Security Analysis") + . += separator_hr("Medical & Security Analysis") . += get_medhud_examine_info(user, target_record) + . += "
    " . += get_sechud_examine_info(user, target_record) else if(HAS_TRAIT(user, TRAIT_MEDICAL_HUD)) - title = separator_hr("Medical Analysis") + . += separator_hr("Medical Analysis") . += get_medhud_examine_info(user, target_record) else if(HAS_TRAIT(user, TRAIT_SECURITY_HUD)) - title = separator_hr("Security Analysis") + . += separator_hr("Security Analysis") . += get_sechud_examine_info(user, target_record) - // applies the separator correctly without an extra line break - if(title && length(.)) - .[1] = title + .[1] - return . - /// Collects information displayed about src when examined by a user with a medical HUD. /mob/living/carbon/proc/get_medhud_examine_info(mob/living/user, datum/record/crew/target_record) . = list() @@ -518,6 +511,7 @@ . += "\[Record Missing\]" . += "\[Medical evaluation\]" . += "\[See quirks\]" + . = jointext(., "
    ") /// Collects information displayed about src when examined by a user with a security HUD. /mob/living/carbon/proc/get_sechud_examine_info(mob/living/user, datum/record/crew/target_record) @@ -540,6 +534,7 @@ . += "\[Add citation\]\ \[Add crime\]\ \[Add note\]" + . = jointext(., "
    ") /mob/living/carbon/human/examine_more(mob/user) . = ..() @@ -563,9 +558,4 @@ age_text = "withering away" . += list(span_notice("[p_They()] appear[p_s()] to be [age_text].")) - if(istype(w_uniform, /obj/item/clothing/under)) - var/obj/item/clothing/under/undershirt = w_uniform - if(undershirt.has_sensor == BROKEN_SENSORS) - . += list(span_notice("The [undershirt]'s medical sensors are sparking.")) - #undef ADD_NEWLINE_IF_NECESSARY diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 948a3f90ea31d..dec49c2e0f726 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -1240,10 +1240,10 @@ GLOBAL_LIST_EMPTY(features_by_species) // 40% for level 3 damage on humans to scream in pain if (humi.stat < UNCONSCIOUS && (prob(burn_damage) * 10) / 4) - INVOKE_ASYNC(humi, TYPE_PROC_REF(/mob, emote), "scream") + humi.emote("scream") // Apply the damage to all body parts - humi.apply_damage(burn_damage, BURN, spread_damage = TRUE, wound_clothing = FALSE) + humi.apply_damage(burn_damage, BURN, spread_damage = TRUE) // For cold damage, we cap at the threshold if you're dead if(humi.getFireLoss() >= abs(HEALTH_THRESHOLD_DEAD) && humi.stat == DEAD) @@ -1259,11 +1259,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, wound_clothing = FALSE) + humi.apply_damage(COLD_DAMAGE_LEVEL_1 * damage_mod * seconds_per_tick, damage_type) else if(humi.coretemperature in 120 to 200) - humi.apply_damage(COLD_DAMAGE_LEVEL_2 * damage_mod * seconds_per_tick, damage_type, wound_clothing = FALSE) + humi.apply_damage(COLD_DAMAGE_LEVEL_2 * damage_mod * seconds_per_tick, damage_type) else - humi.apply_damage(COLD_DAMAGE_LEVEL_3 * damage_mod * seconds_per_tick, damage_type, wound_clothing = FALSE) + humi.apply_damage(COLD_DAMAGE_LEVEL_3 * damage_mod * seconds_per_tick, damage_type) /** * Used to apply burn wounds on random limbs @@ -1312,7 +1312,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, wound_clothing = FALSE) + humi.apply_damage(burn_damage * seconds_per_tick, BURN, bodypart) /// 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) @@ -1406,9 +1406,10 @@ GLOBAL_LIST_EMPTY(features_by_species) for (var/preference_type in GLOB.preference_entries) var/datum/preference/preference = GLOB.preference_entries[preference_type] + if ( \ (preference.relevant_inherent_trait in inherent_traits) \ - || (preference.relevant_external_organ in get_mut_organs()) \ + || (preference.relevant_external_organ in mutant_organs) \ || (preference.relevant_head_flag && check_head_flags(preference.relevant_head_flag)) \ || (preference.relevant_body_markings in body_markings) \ ) @@ -1456,24 +1457,23 @@ GLOBAL_LIST_EMPTY(features_by_species) /datum/species/proc/get_sneeze_sound(mob/living/carbon/human/human) return -/datum/species/proc/get_mut_organs(include_brain = TRUE) - var/list/mut_organs = list() - mut_organs += mutant_organs - if (include_brain) - mut_organs += mutantbrain - mut_organs += mutantheart - mut_organs += mutantlungs - mut_organs += mutanteyes - mut_organs += mutantears - mut_organs += mutanttongue - mut_organs += mutantliver - mut_organs += mutantstomach - mut_organs += mutantappendix - list_clear_nulls(mut_organs) - return mut_organs - /datum/species/proc/get_types_to_preload() - return get_mut_organs(FALSE) + var/list/to_store = list() + to_store += mutant_organs + for(var/obj/item/organ/horny as anything in mutant_organs) + to_store += horny //Haha get it? + + //Don't preload brains, cause reuse becomes a horrible headache + to_store += mutantheart + to_store += mutantlungs + to_store += mutanteyes + to_store += mutantears + to_store += mutanttongue + to_store += mutantliver + to_store += mutantstomach + to_store += mutantappendix + //We don't cache mutant hands because it's not constrained enough, too high a potential for failure + return to_store /** diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index 23b1ad5126694..f13e90719c1dc 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -1,16 +1,13 @@ /mob/living/carbon/human/dummy real_name = "Test Dummy" + status_flags = GODMODE|CANPUSH mouse_drag_pointer = MOUSE_INACTIVE_POINTER visual_only_organs = TRUE var/in_use = FALSE INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) -/mob/living/carbon/human/dummy/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_GODMODE, INNATE_TRAIT) - /mob/living/carbon/human/dummy/Destroy() in_use = FALSE return ..() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 903d489846ab2..5f008af504590 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -322,7 +322,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", max_length = MAX_MESSAGE_LEN) + var/citation_name = tgui_input_text(human_user, "Citation crime", "Security HUD") 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 @@ -337,7 +337,7 @@ return if(href_list["add_crime"]) - var/crime_name = tgui_input_text(human_user, "Crime name", "Security HUD", max_length = MAX_MESSAGE_LEN) + var/crime_name = tgui_input_text(human_user, "Crime name", "Security HUD") if(!target_record || !crime_name || !allowed_access || !human_user.canUseHUD() || !HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) return @@ -350,7 +350,7 @@ return if(href_list["add_note"]) - var/new_note = tgui_input_text(human_user, "Security note", "Security Records", max_length = MAX_MESSAGE_LEN, multiline = TRUE) + var/new_note = tgui_input_text(human_user, "Security note", "Security Records", multiline = TRUE) if(!target_record || !new_note || !allowed_access || !human_user.canUseHUD() || !HAS_TRAIT(human_user, TRAIT_SECURITY_HUD)) return @@ -1074,17 +1074,6 @@ if(use_random_name) fully_replace_character_name(real_name, generate_random_mob_name()) -///Proc used to prevent syndicate monkeys and player-selectable Pun Pun able to use objects while stuck in monkey mode. -/mob/living/carbon/human/proc/make_clever_and_no_dna_scramble() - dna.add_mutation(/datum/mutation/human/clever) - // Can't make them human or nonclever. At least not with the easy and boring way out. - for(var/datum/mutation/human/mutation as anything in dna.mutations) - mutation.mutadone_proof = TRUE - mutation.instability = 0 - - // Extra backup! - ADD_TRAIT(src, TRAIT_NO_DNA_SCRAMBLE, SPECIES_TRAIT) - /mob/living/carbon/human/species/abductor race = /datum/species/abductor diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 3e2248914dcf0..84b2aa8534d7b 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -317,7 +317,7 @@ clone.pitch = pitch dna.transfer_identity(clone, transfer_SE = TRUE, transfer_species = TRUE) - clone.dress_up_as_job(SSjob.get_job(job)) + clone.dress_up_as_job(SSjob.GetJob(job)) for(var/datum/quirk/original_quircks as anything in quirks) clone.add_quirk(original_quircks.type, override_client = client) diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm index 7d996bfc1bc5e..fc23160ac013e 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -841,15 +841,13 @@ generate/load female uniform sprites matching all previously decided variables var/mutable_appearance/standing // this is the actual resulting MA var/icon/building_icon // used to construct an icon across multiple procs before converting it to MA - /// DOPPLER SHIFT REMOVAL BEGIN - see below; migrating this down to better support hybrids of female critter + digi or other legs - /*if(female_uniform) + if(female_uniform) building_icon = wear_female_version( icon_state = t_state, icon = file2use, type = female_uniform, greyscale_colors = greyscale_colors, - )*/ - /// DOPPLER SHIFT REMOVAL END + ) if(!isinhands && is_digi && (supports_variations_flags & CLOTHING_DIGITIGRADE_MASK)) building_icon = wear_digi_version( base_icon = building_icon || icon(file2use, t_state), @@ -857,15 +855,6 @@ generate/load female uniform sprites matching all previously decided variables greyscale_config = digitigrade_greyscale_config_worn || greyscale_config_worn, greyscale_colors = digitigrade_greyscale_colors || greyscale_colors || color, ) - /// DOPPLER SHIFT ADDITION BEGIN - we migrate this down here & use building_icon to allow for auto-generated digi sprites to still support ladies - if(female_uniform) - building_icon = wear_female_version( - icon_state = t_state, - icon = istype(building_icon) ? building_icon : file2use, - type = female_uniform, - greyscale_colors = greyscale_colors, - ) - /// DOPPLER SHIFT ADDITION END if(building_icon) standing = mutable_appearance(building_icon, layer = -layer2use) diff --git a/code/modules/mob/living/carbon/human/monkey.dm b/code/modules/mob/living/carbon/human/monkey.dm index de7eb94f39f3f..e63b35ab42af4 100644 --- a/code/modules/mob/living/carbon/human/monkey.dm +++ b/code/modules/mob/living/carbon/human/monkey.dm @@ -48,11 +48,6 @@ GLOBAL_DATUM(the_one_and_only_punpun, /mob/living/carbon/human/species/monkey/pu var/memory_saved = FALSE /mob/living/carbon/human/species/monkey/punpun/Initialize(mapload) - // 1 Pun Pun should exist - REGISTER_REQUIRED_MAP_ITEM(1, 1) - if(mapload && (locate(/datum/station_trait/job/pun_pun) in SSstation.station_traits)) - new /obj/effect/landmark/start/pun_pun(loc) //Pun Pun is a crewmember, and may late-join. - return INITIALIZE_HINT_QDEL Read_Memory() var/name_to_use = name @@ -70,8 +65,8 @@ GLOBAL_DATUM(the_one_and_only_punpun, /mob/living/carbon/human/species/monkey/pu if(!GLOB.the_one_and_only_punpun && mapload) GLOB.the_one_and_only_punpun = src - else if(GLOB.the_one_and_only_punpun) - ADD_TRAIT(src, TRAIT_DONT_WRITE_MEMORY, INNATE_TRAIT) //faaaaaaake! + // 1 Pun Pun should exist + REGISTER_REQUIRED_MAP_ITEM(1, 1) fully_replace_character_name(real_name, name_to_use) diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm index 0f27f0e47e69b..669b4f6b18dbc 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -54,7 +54,7 @@ default_color = new_ethereal.dna.features["ethcolor"] RegisterSignal(new_ethereal, COMSIG_ATOM_EMAG_ACT, PROC_REF(on_emag_act)) RegisterSignal(new_ethereal, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp_act)) - RegisterSignal(new_ethereal, COMSIG_ATOM_SABOTEUR_ACT, PROC_REF(hit_by_saboteur)) + RegisterSignal(new_ethereal, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) RegisterSignal(new_ethereal, COMSIG_LIGHT_EATER_ACT, PROC_REF(on_light_eater)) RegisterSignal(new_ethereal, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(refresh_light_color)) ethereal_light = new_ethereal.mob_light(light_type = /obj/effect/dummy/lighting_obj/moblight/species) @@ -71,7 +71,7 @@ UnregisterSignal(former_ethereal, list( COMSIG_ATOM_EMAG_ACT, COMSIG_ATOM_EMP_ACT, - COMSIG_ATOM_SABOTEUR_ACT, + COMSIG_HIT_BY_SABOTEUR, COMSIG_LIGHT_EATER_ACT, COMSIG_LIVING_HEALTH_UPDATE, )) @@ -124,13 +124,14 @@ if(EMP_HEAVY) addtimer(CALLBACK(src, PROC_REF(stop_emp), source), 20 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) //We're out for 20 seconds -/datum/species/ethereal/proc/hit_by_saboteur(mob/living/carbon/human/source, disrupt_duration) +/datum/species/ethereal/proc/on_saboteur(mob/living/carbon/human/source, disrupt_duration) + SIGNAL_HANDLER EMPeffect = TRUE refresh_light_color(source) to_chat(source, span_warning("Something inside of you crackles in a bad way.")) source.take_bodypart_damage(burn = 3, wound_bonus = CANT_WOUND) addtimer(CALLBACK(src, PROC_REF(stop_emp), source), disrupt_duration, TIMER_UNIQUE|TIMER_OVERRIDE) - return TRUE + return COMSIG_SABOTEUR_SUCCESS /datum/species/ethereal/proc/on_emag_act(mob/living/carbon/human/source, mob/user) SIGNAL_HANDLER 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 bcf0e1c0de2de..811ae45ea8cb3 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", max_length = MAX_MESSAGE_LEN) + var/msg = tgui_input_text(telepath, title = "Telepathy") 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/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index db6ad1a80e3fd..01531b77d63a9 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -147,7 +147,7 @@ /mob/living/carbon/proc/check_breath(datum/gas_mixture/breath) . = TRUE - if(HAS_TRAIT(src, TRAIT_GODMODE)) + if(status_flags & GODMODE) failed_last_breath = FALSE clear_alert(ALERT_NOT_ENOUGH_OXYGEN) return @@ -665,8 +665,6 @@ * * capped (optional) default True used to cap step mode */ /mob/living/carbon/adjust_bodytemperature(amount, min_temp=0, max_temp=INFINITY, use_insulation=FALSE, use_steps=FALSE, capped=TRUE) - if(HAS_TRAIT(src, TRAIT_HYPOTHERMIC) && amount > 0) //Prevent warming up - return // apply insulation to the amount of change if(use_insulation) amount *= (1 - get_insulation_protection(bodytemperature + amount)) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index a6078afc9d521..1ae6d3357e594 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -16,7 +16,6 @@ * * 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. */ @@ -32,7 +31,6 @@ sharpness = NONE, attack_direction = null, attacking_item, - wound_clothing = TRUE, ) SHOULD_CALL_PARENT(TRUE) var/damage_amount = damage @@ -42,7 +40,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, wound_clothing) + SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMAGE, damage_amount, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item) var/damage_dealt = 0 switch(damagetype) @@ -59,7 +57,6 @@ 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 @@ -78,7 +75,6 @@ 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 @@ -93,7 +89,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, wound_clothing) + SEND_SIGNAL(src, COMSIG_MOB_AFTER_APPLY_DAMAGE, damage_dealt, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item) return damage_dealt /** @@ -270,7 +266,7 @@ return bruteloss /mob/living/proc/can_adjust_brute_loss(amount, forced, required_bodytype) - if(!forced && HAS_TRAIT(src, TRAIT_GODMODE)) + if(!forced && (status_flags & GODMODE)) return FALSE if(SEND_SIGNAL(src, COMSIG_LIVING_ADJUST_BRUTE_DAMAGE, BRUTE, amount, forced) & COMPONENT_IGNORE_CHANGE) return FALSE @@ -289,7 +285,7 @@ /mob/living/proc/setBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) - if(!forced && HAS_TRAIT(src, TRAIT_GODMODE)) + if(!forced && (status_flags & GODMODE)) return FALSE . = bruteloss bruteloss = amount @@ -305,7 +301,7 @@ /mob/living/proc/can_adjust_oxy_loss(amount, forced, required_biotype, required_respiration_type) if(!forced) - if(HAS_TRAIT(src, TRAIT_GODMODE)) + if(status_flags & GODMODE) return FALSE if (required_respiration_type) var/obj/item/organ/internal/lungs/affected_lungs = get_organ_slot(ORGAN_SLOT_LUNGS) @@ -332,7 +328,7 @@ /mob/living/proc/setOxyLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL, required_respiration_type = ALL) if(!forced) - if(HAS_TRAIT(src, TRAIT_GODMODE)) + if(status_flags & GODMODE) return FALSE var/obj/item/organ/internal/lungs/affected_lungs = get_organ_slot(ORGAN_SLOT_LUNGS) @@ -354,7 +350,7 @@ return toxloss /mob/living/proc/can_adjust_tox_loss(amount, forced, required_biotype = ALL) - if(!forced && (HAS_TRAIT(src, TRAIT_GODMODE) || !(mob_biotypes & required_biotype))) + if(!forced && ((status_flags & GODMODE) || !(mob_biotypes & required_biotype))) return FALSE if(SEND_SIGNAL(src, COMSIG_LIVING_ADJUST_TOX_DAMAGE, TOX, amount, forced) & COMPONENT_IGNORE_CHANGE) return FALSE @@ -389,7 +385,7 @@ /mob/living/proc/setToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) - if(!forced && HAS_TRAIT(src, TRAIT_GODMODE)) + if(!forced && (status_flags & GODMODE)) return FALSE if(!forced && !(mob_biotypes & required_biotype)) return FALSE @@ -405,7 +401,7 @@ return fireloss /mob/living/proc/can_adjust_fire_loss(amount, forced, required_bodytype) - if(!forced && HAS_TRAIT(src, TRAIT_GODMODE)) + if(!forced && (status_flags & GODMODE)) return FALSE if(SEND_SIGNAL(src, COMSIG_LIVING_ADJUST_BURN_DAMAGE, BURN, amount, forced) & COMPONENT_IGNORE_CHANGE) return FALSE @@ -423,7 +419,7 @@ updatehealth() /mob/living/proc/setFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) - if(!forced && HAS_TRAIT(src, TRAIT_GODMODE)) + if(!forced && (status_flags & GODMODE)) return 0 . = fireloss fireloss = amount @@ -446,7 +442,7 @@ return staminaloss /mob/living/proc/can_adjust_stamina_loss(amount, forced, required_biotype = ALL) - if(!forced && (!(mob_biotypes & required_biotype) || HAS_TRAIT(src, TRAIT_GODMODE))) + if(!forced && (!(mob_biotypes & required_biotype) || status_flags & GODMODE)) return FALSE if(SEND_SIGNAL(src, COMSIG_LIVING_ADJUST_STAMINA_DAMAGE, STAMINA, amount, forced) & COMPONENT_IGNORE_CHANGE) return FALSE @@ -468,7 +464,7 @@ return delta /mob/living/proc/setStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE, required_biotype = ALL) - if(!forced && HAS_TRAIT(src, TRAIT_GODMODE)) + if(!forced && (status_flags & GODMODE)) return 0 if(!forced && !(mob_biotypes & required_biotype)) return 0 diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 59bc1a9f4d8ed..7c2af9a15724e 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -11,7 +11,6 @@ */ /mob/living/proc/Life(seconds_per_tick = SSMOBS_DT, times_fired) set waitfor = FALSE - SHOULD_NOT_SLEEP(TRUE) var/signal_result = SEND_SIGNAL(src, COMSIG_LIVING_LIFE, seconds_per_tick, times_fired) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index fc494befd9053..005eff4d542c8 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -798,7 +798,7 @@ /mob/living/proc/updatehealth() - if(HAS_TRAIT(src, TRAIT_GODMODE)) + if(status_flags & GODMODE) return set_health(maxHealth - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()) update_stat() @@ -1438,7 +1438,7 @@ * Returns a mob (what our mob turned into) or null (if we failed). */ /mob/living/proc/wabbajack(what_to_randomize, change_flags = WABBAJACK) - if(stat == DEAD || HAS_TRAIT(src, TRAIT_GODMODE) || HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) + if(stat == DEAD || (GODMODE & status_flags) || HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return if(SEND_SIGNAL(src, COMSIG_LIVING_PRE_WABBAJACKED, what_to_randomize) & STOP_WABBAJACK) @@ -2254,9 +2254,6 @@ 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) @@ -2742,7 +2739,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", max_length = MAX_NAME_LEN) + var/picked_name = tgui_input_text(admin, "Name the guardian, leave empty to let player name it.", "Guardian Controller") 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/living_defense.dm b/code/modules/mob/living/living_defense.dm index 6f2fe9afd8970..88525b91bd874 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -539,7 +539,7 @@ return 20 /mob/living/narsie_act() - if(HAS_TRAIT(src, TRAIT_GODMODE) || QDELETED(src)) + if(status_flags & GODMODE || QDELETED(src)) return if(GLOB.cult_narsie && GLOB.cult_narsie.souls_needed[src]) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index fc488471861d3..92c853ba72c4c 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -345,12 +345,7 @@ 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", - max_length = MAX_MESSAGE_LEN, - ) + var/reason = tgui_input_text(src, "What is the nature of your emergency? ([CALL_SHUTTLE_REASON_LENGTH] characters required.)", "Confirm Shuttle Call") if(incapacitated) return @@ -783,26 +778,12 @@ button_icon = 'icons/mob/actions/actions_AI.dmi' button_icon_state = "ai_malf_core" -/datum/action/innate/core_return/Grant(mob/new_owner) - . = ..() - RegisterSignal(new_owner, COMSIG_SILICON_AI_VACATE_APC, PROC_REF(returned_to_core)) - -/datum/action/innate/core_return/proc/returned_to_core(datum/source) - SIGNAL_HANDLER - - Remove(source) - UnregisterSignal(source, COMSIG_SILICON_AI_VACATE_APC) - /datum/action/innate/core_return/Activate() var/obj/machinery/power/apc/apc = owner.loc if(!istype(apc)) to_chat(owner, span_notice("You are already in your Main Core.")) return - if(SEND_SIGNAL(owner, COMSIG_SILICON_AI_CORE_STATUS) & COMPONENT_CORE_ALL_GOOD) - apc.malfvacate() - else - to_chat(owner, span_danger("Linked core not detected!")) - return + apc.malfvacate() qdel(src) /mob/living/silicon/ai/proc/toggle_camera_light() @@ -1039,7 +1020,7 @@ malf_picker.processing_time += 10 var/area/apcarea = apc.area - 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"] + var/datum/ai_module/destructive/nuke_station/doom_n_boom = locate(/datum/ai_module/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)) @@ -1191,7 +1172,7 @@ /mob/living/silicon/ai/get_exp_list(minutes) . = ..() - var/datum/job/ai/ai_job_ref = SSjob.get_job_type(/datum/job/ai) + var/datum/job/ai/ai_job_ref = SSjob.GetJobType(/datum/job/ai) .[ai_job_ref.title] = minutes diff --git a/code/modules/mob/living/silicon/ai/ai_say.dm b/code/modules/mob/living/silicon/ai/ai_say.dm index efb2366ca1234..a71074f9a014c 100644 --- a/code/modules/mob/living/silicon/ai/ai_say.dm +++ b/code/modules/mob/living/silicon/ai/ai_say.dm @@ -99,13 +99,7 @@ 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, - max_length = MAX_MESSAGE_LEN, - ) + 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) 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 4adfe057c59fb..b11f125d38ce4 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 - battery-- + 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-- else // Gain Power if (battery < 200) @@ -47,7 +47,7 @@ return !T || !A || ((!A.power_equip || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/vehicle/sealed/mecha))) /mob/living/silicon/ai/updatehealth() - if(HAS_TRAIT(src, TRAIT_GODMODE)) + if(status_flags & GODMODE) return var/old_health = health @@ -63,7 +63,7 @@ SEND_SIGNAL(src, COMSIG_LIVING_HEALTH_UPDATE) /mob/living/silicon/ai/update_stat() - if(HAS_TRAIT(src, TRAIT_GODMODE)) + if(status_flags & GODMODE) return if(stat != DEAD) if(health <= HEALTH_THRESHOLD_DEAD) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 1d3562d9dfb08..2f670c5fbe21b 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -19,6 +19,7 @@ AddElement(/datum/element/ridable, /datum/component/riding/creature/cyborg) RegisterSignal(src, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, PROC_REF(charge)) RegisterSignal(src, COMSIG_LIGHT_EATER_ACT, PROC_REF(on_light_eater)) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) robot_modules_background = new() robot_modules_background.icon_state = "block" @@ -451,13 +452,12 @@ return COMPONENT_BLOCK_LIGHT_EATER /// special handling for getting shot with a light disruptor/saboteur e.g. the fisher -/mob/living/silicon/robot/on_saboteur(datum/source, disrupt_duration) - . = ..() +/mob/living/silicon/robot/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER if(lamp_enabled) toggle_headlamp(TRUE) balloon_alert(src, "headlamp off!") - COOLDOWN_START(src, disabled_time, disrupt_duration) - return TRUE + return COMSIG_SABOTEUR_SUCCESS /** * Handles headlamp smashing @@ -489,9 +489,6 @@ */ /mob/living/silicon/robot/proc/toggle_headlamp(turn_off = FALSE, update_color = FALSE) //if both lamp is enabled AND the update_color flag is on, keep the lamp on. Otherwise, if anything listed is true, disable the lamp. - if(!COOLDOWN_FINISHED(src, disabled_time)) - balloon_alert(src, "disrupted!") - return FALSE if(!(update_color && lamp_enabled) && (turn_off || lamp_enabled || update_color || !lamp_functional || stat || low_power_mode)) set_light_on(lamp_functional && stat != DEAD && lamp_doom) //If the lamp isn't broken and borg isn't dead, doomsday borgs cannot disable their light fully. set_light_color(COLOR_RED) //This should only matter for doomsday borgs, as any other time the lamp will be off and the color not seen @@ -666,7 +663,7 @@ return ..() /mob/living/silicon/robot/update_stat() - if(HAS_TRAIT(src, TRAIT_GODMODE)) + if(status_flags & GODMODE) return if(stat != DEAD) if(health <= -maxHealth) //die only once @@ -1015,7 +1012,7 @@ /mob/living/silicon/robot/get_exp_list(minutes) . = ..() - var/datum/job/cyborg/cyborg_job_ref = SSjob.get_job_type(/datum/job/cyborg) + var/datum/job/cyborg/cyborg_job_ref = SSjob.GetJobType(/datum/job/cyborg) .[cyborg_job_ref.title] = minutes diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 3ab7b25f8268d..16da8d89783af 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -287,7 +287,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real if (!getBruteLoss()) to_chat(user, span_warning("[src] is already in good condition!")) return - if (!tool.tool_start_check(user, amount=1, heat_required = HIGH_TEMPERATURE_REQUIRED)) //The welder has 1u of fuel consumed by its afterattack, so we don't need to worry about taking any away. + if (!tool.tool_start_check(user, amount=1)) //The welder has 1u of fuel consumed by its afterattack, so we don't need to worry about taking any away. return if(src == user) to_chat(user, span_notice("You start fixing yourself...")) diff --git a/code/modules/mob/living/silicon/robot/robot_defines.dm b/code/modules/mob/living/silicon/robot/robot_defines.dm index e85dba4a134d3..e6af597bc60b7 100644 --- a/code/modules/mob/living/silicon/robot/robot_defines.dm +++ b/code/modules/mob/living/silicon/robot/robot_defines.dm @@ -42,8 +42,6 @@ ///If this is a path, this gets created as an object in Initialize. var/obj/item/stock_parts/power_store/cell = /obj/item/stock_parts/power_store/cell/high - ///If we've been forcibly disabled for a temporary amount of time. - COOLDOWN_DECLARE(disabled_time) ///If the lamp isn't broken. var/lamp_functional = TRUE ///If the lamp is turned on diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 68579730e8dd0..dbfe987cac57a 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_length = MAX_NAME_LEN) + var/new_id = tgui_input_text(user, "Enter ID", "ID Assignment", id, MAX_NAME_LEN) if(new_id) set_id(new_id) name = "\improper MULEbot [new_id]" diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index d946367f6c3bd..ea09441687202 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -143,6 +143,7 @@ ) AddElement(/datum/element/connect_loc, loc_connections) AddComponent(/datum/component/security_vision, judgement_criteria = NONE, update_judgement_criteria = CALLBACK(src, PROC_REF(judgement_criteria))) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) /mob/living/simple_animal/bot/secbot/Destroy() QDEL_NULL(weapon) @@ -166,12 +167,12 @@ GLOB.move_manager.stop_looping(src) last_found = world.time -/mob/living/simple_animal/bot/secbot/on_saboteur(datum/source, disrupt_duration) - . = ..() +/mob/living/simple_animal/bot/secbot/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER if(!(security_mode_flags & SECBOT_SABOTEUR_AFFECTED)) security_mode_flags |= SECBOT_SABOTEUR_AFFECTED addtimer(CALLBACK(src, PROC_REF(remove_saboteur_effect)), disrupt_duration) - return TRUE + return COMSIG_SABOTEUR_SUCCESS /mob/living/simple_animal/bot/secbot/proc/remove_saboteur_effect() security_mode_flags &= ~SECBOT_SABOTEUR_AFFECTED diff --git a/code/modules/mob/living/simple_animal/damage_procs.dm b/code/modules/mob/living/simple_animal/damage_procs.dm index 075b40afeeba7..7a8a2fcb63b91 100644 --- a/code/modules/mob/living/simple_animal/damage_procs.dm +++ b/code/modules/mob/living/simple_animal/damage_procs.dm @@ -4,11 +4,11 @@ * Arguments: * * amount The amount that will be used to adjust the mob's health * * updating_health If the mob's health should be immediately updated to the new value - * * forced If we should force update the adjustment of the mob's health no matter the restrictions, like TRAIT_GODMODE + * * forced If we should force update the adjustment of the mob's health no matter the restrictions, like GODMODE */ /mob/living/simple_animal/proc/adjustHealth(amount, updating_health = TRUE, forced = FALSE) . = FALSE - if(forced || !HAS_TRAIT(src, TRAIT_GODMODE)) + if(forced || !(status_flags & GODMODE)) bruteloss = round(clamp(bruteloss + amount, 0, maxHealth * 2), DAMAGE_PRECISION) if(updating_health) updatehealth() diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 5b0cfdcc51e7e..0803d96a706b9 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -254,8 +254,8 @@ return FALSE if(ismob(the_target)) //Target is in godmode, ignore it. - var/mob/mob = the_target - if(HAS_TRAIT(mob, TRAIT_GODMODE)) + var/mob/M = the_target + if(M.status_flags & GODMODE) return FALSE if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 3cfc4e7dd35c7..cde5ecdbc05a8 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -356,7 +356,7 @@ for(var/obj/item/to_strip in new_clown.get_equipped_items()) new_clown.dropItemToGround(to_strip) - new_clown.dress_up_as_job(SSjob.get_job_type(/datum/job/clown)) + new_clown.dress_up_as_job(SSjob.GetJobType(/datum/job/clown)) clowned_mob_refs += clown_ref return TRUE @@ -527,7 +527,8 @@ . = ..() if(isliving(arrived) && holder_animal) var/mob/living/possessor = arrived - possessor.add_traits(list(TRAIT_UNDENSE, TRAIT_NO_TRANSFORM, TRAIT_GODMODE), STASIS_MUTE) + possessor.add_traits(list(TRAIT_UNDENSE, TRAIT_NO_TRANSFORM), STASIS_MUTE) + possessor.status_flags |= GODMODE possessor.mind.transfer_to(holder_animal) var/datum/action/exit_possession/escape = new(holder_animal) escape.Grant(holder_animal) @@ -535,7 +536,8 @@ /obj/structure/closet/stasis/dump_contents(kill = TRUE) for(var/mob/living/possessor in src) - possessor.remove_traits(list(TRAIT_UNDENSE, TRAIT_NO_TRANSFORM, TRAIT_GODMODE), STASIS_MUTE) + possessor.remove_traits(list(TRAIT_UNDENSE, TRAIT_NO_TRANSFORM), STASIS_MUTE) + possessor.status_flags &= ~GODMODE if(kill || !isanimal_or_basicmob(loc)) possessor.investigate_log("has died from [src].", INVESTIGATE_DEATHS) possessor.death(FALSE) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 831589ceaf632..2d16cc169202a 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -175,7 +175,7 @@ return FALSE return ..() -/mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags = NONE, separation = " ") // DOPPLER EDIT ADDITION - separation +/mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags = NONE) if(swooping & SWOOP_INVULNERABLE) //to suppress attack messages without overriding every single proc that could send a message saying we got hit return return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 3d1b56d77e131..6bf09bc5a490e 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -72,40 +72,29 @@ Difficulty: Hard /datum/action/innate/megafauna_attack/cross_blasts, /datum/action/innate/megafauna_attack/blink_spam) - /// range on burst aoe - var/burst_range = 3 - /// range on cross blast beams - var/beam_range = 5 - /// how fast chasers are currently - var/chaser_speed = 3 - /// base delay for major attacks - var/major_attack_cooldown = 6 SECONDS - /// base delay for spawning chasers - var/chaser_cooldown_time = 10.1 SECONDS - /// the current chaser cooldown - COOLDOWN_DECLARE(chaser_cooldown) - /// base delay for making arenas - var/arena_cooldown_time = 20 SECONDS - COOLDOWN_DECLARE(arena_cooldown) - /// if we're doing something that requires us to stand still and not attack - var/blinking = FALSE - /// weakref to our "home base" beacon - var/datum/weakref/spawned_beacon_ref - /// If we are sitting at home base and not doing anything - var/sitting_at_center = TRUE - /// timer id for any active attempts to "go home" - var/respawn_timer_id = null + var/burst_range = 3 //range on burst aoe + var/beam_range = 5 //range on cross blast beams + var/chaser_speed = 3 //how fast chasers are currently + var/major_attack_cooldown = 6 SECONDS //base cooldown for major attacks + var/chaser_cooldown_time = 10.1 SECONDS //base cooldown for spawning chasers + var/chaser_cooldown = 0 + var/arena_cooldown_time = 20 SECONDS //base cooldown for making arenas + var/arena_cooldown = 0 + var/blinking = FALSE //if we're doing something that requires us to stand still and not attack + var/obj/effect/hierophant/spawned_beacon //the beacon we teleport back to + var/timeout_time = 15 //after this many Life() ticks with no target, we return to our beacon + var/did_reset = TRUE //if we timed out, returned to our beacon, and healed some var/list/kill_phrases = list("Wsyvgi sj irivkc xettih. Vitemvmrk...", "Irivkc wsyvgi jsyrh. Vitemvmrk...", "Jyip jsyrh. Egxmzexmrk vitemv gcgpiw...", "Kix fiex. Liepmrk...") var/list/target_phrases = list("Xevkix psgexih.", "Iriqc jsyrh.", "Eguymvih xevkix.") /mob/living/simple_animal/hostile/megafauna/hierophant/Initialize(mapload) . = ..() - spawned_beacon_ref = WEAKREF(new /obj/effect/hierophant(loc)) + spawned_beacon = new(loc) AddComponent(/datum/component/boss_music, 'sound/lavaland/hiero_boss.ogg', 145 SECONDS) /mob/living/simple_animal/hostile/megafauna/hierophant/Destroy() - QDEL_NULL(spawned_beacon_ref) - return ..() + QDEL_NULL(spawned_beacon) + . = ..() /datum/action/innate/megafauna_attack/blink name = "Blink To Target" @@ -138,11 +127,11 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/hierophant/update_cooldowns(list/cooldown_updates, ignore_staggered = FALSE) . = ..() if(cooldown_updates[COOLDOWN_UPDATE_SET_CHASER]) - COOLDOWN_START(src, chaser_cooldown, cooldown_updates[COOLDOWN_UPDATE_SET_CHASER]) + chaser_cooldown = world.time + cooldown_updates[COOLDOWN_UPDATE_SET_CHASER] if(cooldown_updates[COOLDOWN_UPDATE_ADD_CHASER]) chaser_cooldown += cooldown_updates[COOLDOWN_UPDATE_ADD_CHASER] if(cooldown_updates[COOLDOWN_UPDATE_SET_ARENA]) - COOLDOWN_START(src, arena_cooldown, cooldown_updates[COOLDOWN_UPDATE_SET_ARENA]) + arena_cooldown = world.time + cooldown_updates[COOLDOWN_UPDATE_SET_ARENA] if(cooldown_updates[COOLDOWN_UPDATE_ADD_ARENA]) arena_cooldown += cooldown_updates[COOLDOWN_UPDATE_ADD_ARENA] @@ -190,7 +179,7 @@ Difficulty: Hard possibilities += "cross_blast_spam" if(get_dist(src, target) > 2) possibilities += "blink_spam" - if(COOLDOWN_FINISHED(src, chaser_cooldown)) + if(chaser_cooldown < world.time) if(prob(anger_modifier * 2)) possibilities = list("chaser_swarm") else @@ -205,7 +194,7 @@ Difficulty: Hard chaser_swarm(blink_counter, target_slowness, cross_counter) return - if(COOLDOWN_FINISHED(src, chaser_cooldown)) //if chasers are off cooldown, fire some! + if(chaser_cooldown < world.time) //if chasers are off cooldown, fire some! var/obj/effect/temp_visual/hierophant/chaser/C = new /obj/effect/temp_visual/hierophant/chaser(loc, src, target, chaser_speed, FALSE) update_cooldowns(list(COOLDOWN_UPDATE_SET_CHASER = chaser_cooldown_time)) if((prob(anger_modifier) || target.Adjacent(src)) && target != src) @@ -322,7 +311,7 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/hierophant/proc/arena_trap(mob/victim) //trap a target in an arena var/turf/T = get_turf(victim) - if(!istype(victim) || victim.stat == DEAD || !T || !COOLDOWN_FINISHED(src, arena_cooldown)) + if(!istype(victim) || victim.stat == DEAD || !T || arena_cooldown > world.time) return if((istype(get_area(T), /area/ruin/unpowered/hierophant) || istype(get_area(src), /area/ruin/unpowered/hierophant)) && victim != src) return @@ -408,30 +397,23 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/hierophant/proc/burst(turf/original, spread_speed) hierophant_burst(src, original, burst_range, spread_speed) -/mob/living/simple_animal/hostile/megafauna/hierophant/GiveTarget(new_target) +/mob/living/simple_animal/hostile/megafauna/hierophant/Life(seconds_per_tick = SSMOBS_DT, times_fired) . = ..() - if(!isnull(new_target)) - deltimer(respawn_timer_id) - respawn_timer_id = null - return - if(respawn_timer_id || client || !spawned_beacon_ref) - return - respawn_timer_id = addtimer(CALLBACK(src, PROC_REF(send_me_home)), 30 SECONDS, flags = TIMER_STOPPABLE|TIMER_DELETE_ME) - -/mob/living/simple_animal/hostile/megafauna/hierophant/proc/send_me_home() - respawn_timer_id = null - var/obj/effect/hierophant/beacon = spawned_beacon_ref.resolve() - if(!beacon || client) - return - sitting_at_center = TRUE - visible_message(span_hierophant_warning("\"Vixyvrmrk xs fewi...\"")) - blink(beacon) - adjustHealth(min((health - maxHealth) * 0.5, -250)) //heal for 50% of our missing health, minimum 10% of maximum health - wander = FALSE - if(health > maxHealth * 0.9) - visible_message(span_hierophant("\"Vitemvw gsqtpixi. Stivexmrk ex qebmqyq ijjmgmirgc.\"")) - else - visible_message(span_hierophant("\"Vitemvw gsqtpixi. Stivexmsrep ijjmgmirgc gsqtvsqmwih.\"")) + if(. && spawned_beacon && !QDELETED(spawned_beacon) && !client) + if(target || loc == spawned_beacon.loc) + timeout_time = initial(timeout_time) + else + timeout_time-- + if(timeout_time <= 0 && !did_reset) + did_reset = TRUE + visible_message(span_hierophant_warning("\"Vixyvrmrk xs fewi...\"")) + blink(spawned_beacon) + adjustHealth(min((health - maxHealth) * 0.5, -250)) //heal for 50% of our missing health, minimum 10% of maximum health + wander = FALSE + if(health > maxHealth * 0.9) + visible_message(span_hierophant("\"Vitemvw gsqtpixi. Stivexmrk ex qebmqyq ijjmgmirgc.\"")) + else + visible_message(span_hierophant("\"Vitemvw gsqtpixi. Stivexmsrep ijjmgmirgc gsqtvsqmwih.\"")) /mob/living/simple_animal/hostile/megafauna/hierophant/death() if(health > 0 || stat == DEAD) @@ -462,15 +444,14 @@ Difficulty: Hard . = ..() if(. && target && !targets_the_same) visible_message(span_hierophant_warning("\"[pick(target_phrases)]\"")) - var/obj/effect/hierophant/beacon = spawned_beacon_ref.resolve() - if(beacon && loc == beacon.loc && sitting_at_center) + if(spawned_beacon && loc == spawned_beacon.loc && did_reset) arena_trap(src) /mob/living/simple_animal/hostile/megafauna/hierophant/adjustHealth(amount, updating_health = TRUE, forced = FALSE) . = ..() if(src && . && !blinking) wander = TRUE - sitting_at_center = FALSE + did_reset = FALSE /mob/living/simple_animal/hostile/megafauna/hierophant/AttackingTarget(atom/attacked_target) if(!blinking) @@ -515,7 +496,7 @@ Difficulty: Hard ..() /mob/living/simple_animal/hostile/megafauna/hierophant/proc/calculate_rage() //how angry we are overall - sitting_at_center = FALSE //oh hey we're doing SOMETHING, clearly we might need to heal if we recall + did_reset = FALSE //oh hey we're doing SOMETHING, clearly we might need to heal if we recall anger_modifier = clamp(((maxHealth - health) / 42),0,50) burst_range = initial(burst_range) + round(anger_modifier * 0.08) beam_range = initial(beam_range) + round(anger_modifier * 0.12) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm index 821045b51690d..bb3b6874f043c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm @@ -50,7 +50,7 @@ /datum/action/innate/elite_attack/rage, /datum/action/innate/elite_attack/call_children) - COOLDOWN_DECLARE(random_tentacle) + var/rand_tent = 0 var/list/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/children_list = list() /mob/living/simple_animal/hostile/asteroid/elite/broodmother/Initialize(mapload) @@ -108,16 +108,15 @@ . = ..() if(!.) //Checks if they are dead as a rock. return - if(health >= maxHealth * 0.5 || !COOLDOWN_FINISHED(src, random_tentacle)) - return - COOLDOWN_START(src, random_tentacle, 3 SECONDS) - var/tentacle_amount = 5 - if(health < maxHealth * 0.25) - tentacle_amount = 10 - var/list/possible_turfs = RANGE_TURFS(5, get_turf(src)) - for(var/i in 1 to tentacle_amount) - var/turf/innsmouth = pick_n_take(possible_turfs) - new /obj/effect/goliath_tentacle/broodmother(innsmouth, src) + if(health < maxHealth * 0.5 && rand_tent < world.time) + rand_tent = world.time + 30 + var/tentacle_amount = 5 + if(health < maxHealth * 0.25) + tentacle_amount = 10 + var/tentacle_loc = spiral_range_turfs(5, get_turf(src)) + for(var/i in 1 to tentacle_amount) + var/turf/t = pick_n_take(tentacle_loc) + new /obj/effect/goliath_tentacle/broodmother(t, src) /mob/living/simple_animal/hostile/asteroid/elite/broodmother/proc/tentacle_patch(target) ranged_cooldown = world.time + 15 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm index b177cc651ecaa..30afc69c8b3e9 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm @@ -158,11 +158,10 @@ /mob/living/simple_animal/hostile/retaliate/goose/Life(seconds_per_tick = SSMOBS_DT, times_fired) . = ..() - if(!choking || stat) - return - do_jitter_animation(50) - if(SPT_PROB(10, seconds_per_tick)) - INVOKE_ASYNC(src, PROC_REF(emote), "gasp") + if(choking && !stat) + do_jitter_animation(50) + if(SPT_PROB(10, seconds_per_tick)) + emote("gasp") /mob/living/simple_animal/hostile/retaliate/goose/proc/suffocate() if(!choking) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 179b50710c1d3..9d5041fe870a4 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -234,7 +234,7 @@ . += "There appears to be [icon2html(access_card, user)] \a [access_card] pinned to [p_them()]." /mob/living/simple_animal/update_stat() - if(HAS_TRAIT(src, TRAIT_GODMODE)) + if(status_flags & GODMODE) return if(stat != DEAD) if(health <= 0) @@ -389,8 +389,8 @@ if(see_invisible < the_target.invisibility) return FALSE if(ismob(the_target)) - var/mob/mob = the_target - if(HAS_TRAIT(mob, TRAIT_GODMODE)) + var/mob/M = the_target + if(M.status_flags & GODMODE) return FALSE if (isliving(the_target)) var/mob/living/L = the_target diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 7bf067c7a120a..c0e2058f23ed2 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -10,7 +10,7 @@ /mob/living/proc/check_stun_immunity(check_flags = CANSTUN, force_stun = FALSE) SHOULD_CALL_PARENT(TRUE) - if(HAS_TRAIT(src, TRAIT_GODMODE)) + if(status_flags & GODMODE) return TRUE if(force_stun) // Does not take priority over god mode? I guess @@ -385,7 +385,7 @@ /mob/living/proc/Sleeping(amount) //Can't go below remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_SLEEP, amount) & COMPONENT_NO_STUN) return - if(HAS_TRAIT(src, TRAIT_GODMODE)) + if(status_flags & GODMODE) return var/datum/status_effect/incapacitating/sleeping/S = IsSleeping() if(S) @@ -397,7 +397,7 @@ /mob/living/proc/SetSleeping(amount) //Sets remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_SLEEP, amount) & COMPONENT_NO_STUN) return - if(HAS_TRAIT(src, TRAIT_GODMODE)) + if(status_flags & GODMODE) return var/datum/status_effect/incapacitating/sleeping/S = IsSleeping() if(amount <= 0) @@ -412,7 +412,7 @@ /mob/living/proc/AdjustSleeping(amount) //Adds to remaining duration if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_SLEEP, amount) & COMPONENT_NO_STUN) return - if(HAS_TRAIT(src, TRAIT_GODMODE)) + if(status_flags & GODMODE) return var/datum/status_effect/incapacitating/sleeping/S = IsSleeping() if(S) @@ -425,7 +425,7 @@ /mob/living/proc/PermaSleeping() if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_SLEEP, -1) & COMPONENT_NO_STUN) return - if(HAS_TRAIT(src, TRAIT_GODMODE)) + if(status_flags & GODMODE) return var/datum/status_effect/incapacitating/sleeping/S = IsSleeping() if(S) diff --git a/code/modules/mob/living/taste.dm b/code/modules/mob/living/taste.dm index 28dbbc078c5af..72adcbb43df8b 100644 --- a/code/modules/mob/living/taste.dm +++ b/code/modules/mob/living/taste.dm @@ -52,31 +52,27 @@ return NONE /mob/living/carbon/get_liked_foodtypes() - if(HAS_TRAIT(src, TRAIT_AGEUSIA)) + var/obj/item/organ/internal/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE) + // No tongue, no tastin' + if(!tongue?.sense_of_taste || HAS_TRAIT(src, TRAIT_AGEUSIA)) return NONE // Handled in here since the brain trauma can't modify taste directly (/datum/brain_trauma/severe/flesh_desire) if(HAS_TRAIT(src, TRAIT_FLESH_DESIRE)) return GORE | MEAT - var/obj/item/organ/internal/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE) - . = tongue.liked_foodtypes - if(HAS_TRAIT(src, TRAIT_VEGETARIAN)) - . &= ~MEAT + return tongue.liked_foodtypes /** * Gets food flags that this mob dislikes **/ /mob/living/proc/get_disliked_foodtypes() - if(HAS_TRAIT(src, TRAIT_VEGETARIAN)) - return MEAT return NONE /mob/living/carbon/get_disliked_foodtypes() - if(HAS_TRAIT(src, TRAIT_AGEUSIA)) - return NONE var/obj/item/organ/internal/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE) - . = tongue.disliked_foodtypes - if(HAS_TRAIT(src, TRAIT_VEGETARIAN)) - . |= MEAT + // No tongue, no tastin' + if(!tongue?.sense_of_taste || HAS_TRAIT(src, TRAIT_AGEUSIA)) + return NONE + return tongue.disliked_foodtypes /** * Gets food flags that this mob hates @@ -87,8 +83,9 @@ /mob/living/carbon/get_toxic_foodtypes() var/obj/item/organ/internal/tongue/tongue = get_organ_slot(ORGAN_SLOT_TONGUE) + // No tongue, no tastin' if(!tongue) - return ..() + return TOXIC if(HAS_TRAIT(src, TRAIT_FLESH_DESIRE)) return VEGETABLES | DAIRY | FRUIT | FRIED return tongue.toxic_foodtypes diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index d86d3dd700d9c..8cffe1b766d60 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -266,7 +266,7 @@ * * ignored_mobs (optional) doesn't show any message to any mob in this list. * * visible_message_flags (optional) is the type of message being sent. */ -/atom/proc/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags = NONE, separation = " ") // DOPPLER EDIT ADDITION - separation +/atom/proc/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags = NONE) var/turf/T = get_turf(src) if(!T) return @@ -276,23 +276,12 @@ var/list/hearers = get_hearers_in_view(vision_distance, src) //caches the hearers and then removes ignored mobs. hearers -= ignored_mobs - //DOPPLER EDIT ADDITION BEGIN - AI QoL - for(var/mob/camera/ai_eye/ai_eye in hearers) - if(ai_eye.ai?.client && !(ai_eye.ai.stat == DEAD)) - hearers -= ai_eye - hearers |= ai_eye.ai - - for(var/obj/effect/overlay/holo_pad_hologram/holo in hearers) - if(holo.Impersonation?.client) - hearers |= holo.Impersonation - //DOPPLER EDIT ADDITION END - AI QoL - if(self_message) hearers -= src var/raw_msg = message if(visible_message_flags & EMOTE_MESSAGE) - message = "[src][separation][message]" // DOPPLER EDIT ADDITION - Better emotes + message = "[src] [message]" for(var/mob/M in hearers) if(!M.client) @@ -322,7 +311,7 @@ ///Adds the functionality to self_message. -/mob/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags = NONE, separation = " ") // DOPPLER EDIT ADDITION - separation +/mob/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags = NONE) . = ..() if(!self_message) return @@ -353,25 +342,13 @@ * * self_message (optional) is what the src mob hears. * * audible_message_flags (optional) is the type of message being sent. */ -/atom/proc/audible_message(message, deaf_message, hearing_distance = DEFAULT_MESSAGE_RANGE, self_message, audible_message_flags = NONE, separation = " ") // DOPPLER EDIT ADDITION - separation +/atom/proc/audible_message(message, deaf_message, hearing_distance = DEFAULT_MESSAGE_RANGE, self_message, audible_message_flags = NONE) var/list/hearers = get_hearers_in_view(hearing_distance, src) - - //DOPPLER EDIT ADDITION BEGIN - AI QoL - for(var/mob/camera/ai_eye/ai_eye in hearers) - if(ai_eye.ai?.client && !(ai_eye.ai.stat == DEAD)) - hearers -= ai_eye - hearers |= ai_eye.ai - - for(var/obj/effect/overlay/holo_pad_hologram/holo in hearers) - if(holo.Impersonation?.client) - hearers |= holo.Impersonation - //DOPPLER EDIT ADDITION END - AI QoL - if(self_message) hearers -= src var/raw_msg = message if(audible_message_flags & EMOTE_MESSAGE) - message = "[src][separation][message]" //DOPPLER EDIT CHANGE + message = "[src] [message]" for(var/mob/M in hearers) if(audible_message_flags & EMOTE_MESSAGE && runechat_prefs_check(M, audible_message_flags) && M.can_hear()) M.create_chat_message(src, raw_message = raw_msg, runechat_flags = audible_message_flags) @@ -388,7 +365,7 @@ * * deaf_message (optional) is what deaf people will see. * * hearing_distance (optional) is the range, how many tiles away the message can be heard. */ -/mob/audible_message(message, deaf_message, hearing_distance = DEFAULT_MESSAGE_RANGE, self_message, audible_message_flags = NONE, separation = " ") // DOPPLER EDIT ADDITION - separation +/mob/audible_message(message, deaf_message, hearing_distance = DEFAULT_MESSAGE_RANGE, self_message, audible_message_flags = NONE) . = ..() if(!self_message) return @@ -566,9 +543,9 @@ var/list/result = examinify.examine(src) var/atom_title = examinify.examine_title(src, thats = TRUE) SEND_SIGNAL(src, COMSIG_MOB_EXAMINING, examinify, result) - result_combined = (atom_title ? fieldset_block("[span_slightly_larger(atom_title)].", jointext(result, "
    "), "examine_block") : examine_block(jointext(result, "
    "))) + result_combined = (atom_title ? "[span_slightly_larger(separator_hr("[atom_title]."))]" : "") + jointext(result, "
    ") - to_chat(src, span_infoplain(result_combined)) + to_chat(src, examine_block(span_infoplain(result_combined))) SEND_SIGNAL(src, COMSIG_MOB_EXAMINATE, examinify) /mob/proc/blind_examine_check(atom/examined_thing) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 45e54a8475ca8..28de95ff94dd5 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -311,7 +311,7 @@ qdel(src) return new_crab -/mob/living/carbon/proc/gorillize(genetics_gorilla = FALSE) +/mob/living/carbon/proc/gorillize() if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT) @@ -327,8 +327,7 @@ regenerate_icons() icon = null SetInvisibility(INVISIBILITY_MAXIMUM) - var/gorilla_type = genetics_gorilla ? /mob/living/basic/gorilla/genetics : /mob/living/basic/gorilla - var/mob/living/basic/gorilla/new_gorilla = new gorilla_type(get_turf(src)) + var/mob/living/basic/gorilla/new_gorilla = new (get_turf(src)) new_gorilla.set_combat_mode(TRUE) if(mind) mind.transfer_to(new_gorilla) diff --git a/code/modules/mob_spawn/ghost_roles/unused_roles.dm b/code/modules/mob_spawn/ghost_roles/unused_roles.dm index d533c2365c47b..80f584d52c2b6 100644 --- a/code/modules/mob_spawn/ghost_roles/unused_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/unused_roles.dm @@ -273,7 +273,7 @@ /obj/effect/mob_spawn/ghost_role/human/syndicatespace/special(mob/living/new_spawn) . = ..() new_spawn.grant_language(/datum/language/codespeak, source = LANGUAGE_MIND) - var/datum/job/spawn_job = SSjob.get_job_type(spawner_job_path) + var/datum/job/spawn_job = SSjob.GetJobType(spawner_job_path) var/policy = get_policy(spawn_job.policy_index) if(policy) to_chat(new_spawn, span_bold("[policy]")) diff --git a/code/modules/mob_spawn/mob_spawn.dm b/code/modules/mob_spawn/mob_spawn.dm index ca724ab405857..c43164fb62a5f 100644 --- a/code/modules/mob_spawn/mob_spawn.dm +++ b/code/modules/mob_spawn/mob_spawn.dm @@ -274,7 +274,7 @@ spawned_mob.key = mob_possessor.key var/datum/mind/spawned_mind = spawned_mob.mind if(spawned_mind) - spawned_mob.mind.set_assigned_role_with_greeting(SSjob.get_job_type(spawner_job_path)) + spawned_mob.mind.set_assigned_role_with_greeting(SSjob.GetJobType(spawner_job_path)) spawned_mind.name = spawned_mob.real_name if(show_flavor) diff --git a/code/modules/mod/mod_core.dm b/code/modules/mod/mod_core.dm index 5c8d4a2e2ee47..2c9845afe4cfd 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(user, thing) + return item_interaction(thing, user) /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/mod_theme.dm b/code/modules/mod/mod_theme.dm index 76f9063df0b9c..15dcf4f9bef94 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -1369,7 +1369,7 @@ /obj/item/clothing/head/mod = list( UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, UNSEALED_INVISIBILITY = HIDEEARS|HIDEHAIR, - SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEYES|HIDEFACE|HIDESNOUT|HIDEANTENNAE, + SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEYES|HIDEFACE|HIDESNOUT, SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, CAN_OVERSLOT = TRUE, UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, @@ -1377,7 +1377,7 @@ ), /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_INVISIBILITY = HIDEJUMPSUIT|HIDEMUTWINGS, + SEALED_INVISIBILITY = HIDEJUMPSUIT, CAN_OVERSLOT = TRUE, UNSEALED_MESSAGE = CHESTPLATE_UNSEAL_MESSAGE, SEALED_MESSAGE = CHESTPLATE_SEAL_MESSAGE, diff --git a/code/modules/mod/modules/modules_antag.dm b/code/modules/mod/modules/modules_antag.dm index c67fd7755d8c6..8ae22e435839b 100644 --- a/code/modules/mod/modules/modules_antag.dm +++ b/code/modules/mod/modules/modules_antag.dm @@ -517,31 +517,18 @@ /obj/item/mod/module/infiltrator/on_suit_activation() mod.wearer.add_traits(traits_to_add, MOD_TRAIT) - RegisterSignal(mod.wearer, COMSIG_TRY_MODIFY_SPEECH, PROC_REF(on_speech_modification)) - var/obj/item/organ/internal/tongue/user_tongue = mod.wearer.get_organ_slot(ORGAN_SLOT_TONGUE) - user_tongue.temp_say_mod = "states" var/obj/item/clothing/head_cover = mod.get_part_from_slot(ITEM_SLOT_HEAD) if(istype(head_cover)) head_cover.flash_protect = FLASH_PROTECTION_WELDER_HYPER_SENSITIVE /obj/item/mod/module/infiltrator/on_suit_deactivation(deleting = FALSE) mod.wearer.remove_traits(traits_to_add, MOD_TRAIT) - UnregisterSignal(mod.wearer, COMSIG_TRY_MODIFY_SPEECH) - var/obj/item/organ/internal/tongue/user_tongue = mod.wearer.get_organ_slot(ORGAN_SLOT_TONGUE) - user_tongue.temp_say_mod = initial(user_tongue.temp_say_mod) if(deleting) return var/obj/item/clothing/head_cover = mod.get_part_from_slot(ITEM_SLOT_HEAD) if(istype(head_cover)) head_cover.flash_protect = initial(head_cover.flash_protect) -/obj/item/mod/module/infiltrator/proc/on_speech_modification(datum/source) - SIGNAL_HANDLER - if(!mod.active) - return - //Prevent speech modifications if the suit is active - return PREVENT_MODIFY_SPEECH - ///Medbeam - Medbeam but built into a modsuit /obj/item/mod/module/medbeam name = "MOD medical beamgun module" @@ -558,63 +545,3 @@ /obj/item/gun/medbeam/mod name = "MOD medbeam" - -/obj/item/mod/module/stealth/wraith - name = "MOD Wraith Cloaking Module" - desc = "A more destructive adaptation of the stealth module." - icon_state = "cloak_traitor" - stealth_alpha = 30 - module_type = MODULE_ACTIVE - cooldown_time = 2 SECONDS - -/obj/item/mod/module/stealth/wraith/on_select_use(atom/target) - . = ..() - if(!. || target == mod.wearer) - return - if(get_dist(mod.wearer, target) > 6) - balloon_alert(mod.wearer, "can't reach that!") - return - if(istype(target, /obj/machinery/power/apc)) //Bit too strong for a module so this is blacklisted - balloon_alert(mod.wearer, "cant disable apc!") - return - - var/list/things_to_disrupt = list(target) - if(isliving(target)) - var/mob/living/live_target = target - things_to_disrupt += live_target.get_all_gear() - - for(var/atom/disrupted as anything in things_to_disrupt) - if(disrupted.on_saboteur(src, 1 MINUTES)) - mod.add_charge(DEFAULT_CHARGE_DRAIN * 250) - -/obj/item/mod/module/stealth/wraith/on_suit_activation() - if(bumpoff) - RegisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP, PROC_REF(unstealth)) - RegisterSignal(mod.wearer, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(on_unarmed_attack)) - RegisterSignal(mod.wearer, COMSIG_ATOM_BULLET_ACT, PROC_REF(on_bullet_act)) - RegisterSignals(mod.wearer, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW, COMSIG_CARBON_CUFF_ATTEMPTED), PROC_REF(unstealth)) - animate(mod.wearer, alpha = stealth_alpha, time = 1.5 SECONDS) - drain_power(use_energy_cost) - -/obj/item/mod/module/stealth/wraith/on_suit_deactivation(deleting) - if(bumpoff) - UnregisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP) - UnregisterSignal(mod.wearer, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_MOB_ITEM_ATTACK, COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_BULLET_ACT, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW, COMSIG_CARBON_CUFF_ATTEMPTED)) - animate(mod.wearer, alpha = 255, time = 1.5 SECONDS) - -/obj/item/mod/module/stealth/wraith/unstealth(datum/source) - . = ..() - if(mod.active) - addtimer(CALLBACK(src, PROC_REF(on_suit_activation)), 5 SECONDS) - -/obj/item/mod/module/stealth/wraith/examine_more(mob/user) - . = ..() - . += span_info( \ - "The Wraith Module does not simply bend light around the user to obscure their visual pattern, \ - but actively attacks and overloads surrounding light emitting objects, repurposing this energy to power the suit. \ - It is possible that this technology has its origins in Spider Clan advancements, \ - but the exact source of the Wraith Module is highly disputed. \ - No group has stepped forward to claim it as their handiwork due to the political consequences of having stolen Spider Clan tech and their inevitable retaliation for such transgressions. \ - Most point fingers at Cybersun Industries, but murmurs suggest it could even be even more clandestine organizations amongst the Syndicate branches. \ - Whatever the case, if you are looking at one of these right now, don't show it to a space ninja." \ - ) diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index 2a2d29bb08f6a..3b7803a517aac 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -388,6 +388,12 @@ /// Maximum range we can set. var/max_range = 5 +/obj/item/mod/module/flashlight/on_suit_activation() + RegisterSignal(mod.wearer, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) + +/obj/item/mod/module/flashlight/on_suit_deactivation(deleting = FALSE) + UnregisterSignal(mod.wearer, COMSIG_HIT_BY_SABOTEUR) + /obj/item/mod/module/flashlight/on_activation() set_light_flags(light_flags | LIGHT_ATTACHED) set_light_on(active) @@ -397,11 +403,11 @@ set_light_flags(light_flags & ~LIGHT_ATTACHED) set_light_on(active) -/obj/item/mod/module/flashlight/on_saboteur(datum/source, disrupt_duration) - . = ..() +/obj/item/mod/module/flashlight/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER if(active) on_deactivation() - return TRUE + return COMSIG_SABOTEUR_SUCCESS /obj/item/mod/module/flashlight/on_process(seconds_per_tick) active_power_cost = base_power * light_range @@ -958,7 +964,7 @@ /obj/item/mod/module/fishing_glove name = "MOD fishing glove module" - desc = "A MOD module that takes in an external fishing rod to enable the user to fish without having to hold one, while also making it slightly easier." + desc = "A MOD module that takes in an external fishing rod to enable the user to fish without having to hold one." icon_state = "fishing_glove" complexity = 1 overlay_state_inactive = "fishing_glove" @@ -1013,20 +1019,17 @@ var/obj/item/gloves = mod?.get_part_from_slot(ITEM_SLOT_GLOVES) if(gloves && !QDELETED(mod)) qdel(gloves.GetComponent(/datum/component/profound_fisher)) - return ..() /obj/item/mod/module/fishing_glove/on_suit_activation() - var/obj/item/gloves = mod.get_part_from_slot(ITEM_SLOT_GLOVES) - if(!gloves) + if(!equipped) return - gloves.AddComponent(/datum/component/adjust_fishing_difficulty, 5) - if(equipped) + var/obj/item/gloves = mod.get_part_from_slot(ITEM_SLOT_GLOVES) + if(gloves) gloves.AddComponent(/datum/component/profound_fisher, equipped) /obj/item/mod/module/fishing_glove/on_suit_deactivation(deleting = FALSE) var/obj/item/gloves = mod.get_part_from_slot(ITEM_SLOT_GLOVES) if(gloves && !deleting) - qdel(gloves.GetComponent(/datum/component/adjust_fishing_difficulty)) qdel(gloves.GetComponent(/datum/component/profound_fisher)) /obj/item/mod/module/shock_absorber diff --git a/code/modules/mod/modules/modules_medical.dm b/code/modules/mod/modules/modules_medical.dm index 22c30cf5c36c2..0f44570201776 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(!isliving(target)) + if(!ishuman(target)) organ.forceMove(drop_location()) organ = null return diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index d8e41c67cb5d6..4f4a8fcc17016 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -139,6 +139,7 @@ UpdateDisplay() if(has_light) add_item_action(/datum/action/item_action/toggle_computer_light) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) if(inserted_disk) inserted_disk = new inserted_disk(src) if(internal_cell) @@ -752,16 +753,20 @@ update_item_action_buttons(force = TRUE) //force it because we added an overlay, not changed its icon return TRUE -//Disables the computer's flashlight/LED light, if it has one, for a given disrupt_duration. -/obj/item/modular_computer/on_saboteur(datum/source, disrupt_duration) - . = ..() +/** + * Disables the computer's flashlight/LED light, if it has one, for a given disrupt_duration. + * + * Called when sent COMSIG_HIT_BY_SABOTEUR. + */ +/obj/item/modular_computer/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER if(!has_light) return set_light_on(FALSE) update_appearance() update_item_action_buttons(force = TRUE) //force it because we added an overlay, not changed its icon COOLDOWN_START(src, disabled_time, disrupt_duration) - return TRUE + return COMSIG_SABOTEUR_SUCCESS /** * Sets the computer's light color, if it has a light. diff --git a/code/modules/modular_computers/computers/item/pda.dm b/code/modules/modular_computers/computers/item/pda.dm index 37021e4fb0f82..ae63639aef6f9 100644 --- a/code/modules/modular_computers/computers/item/pda.dm +++ b/code/modules/modular_computers/computers/item/pda.dm @@ -181,7 +181,7 @@ /obj/item/modular_computer/pda/proc/remove_pen(mob/user) - if(issilicon(user) || !user.can_perform_action(src, FORBID_TELEKINESIS_REACH | NEED_DEXTERITY)) //TK doesn't work even with this removed but here for readability + if(issilicon(user) || !user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) //TK doesn't work even with this removed but here for readability return if(inserted_item) @@ -326,9 +326,6 @@ starting_programs = list( /datum/computer_file/program/filemanager, /datum/computer_file/program/robotact, - /datum/computer_file/program/borg_monitor, - /datum/computer_file/program/atmosscan, - /datum/computer_file/program/crew_manifest, ) /obj/item/modular_computer/pda/silicon/Initialize(mapload) diff --git a/code/modules/modular_computers/computers/item/role_tablet_presets.dm b/code/modules/modular_computers/computers/item/role_tablet_presets.dm index 7c021c72cf4fb..cbd784b1ef0d4 100644 --- a/code/modules/modular_computers/computers/item/role_tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/role_tablet_presets.dm @@ -425,14 +425,6 @@ /datum/computer_file/program/borg_monitor, ) -/obj/item/modular_computer/pda/pun_pun - name = "monkey PDA" - greyscale_colors = "#ffcc66#914800" - starting_programs = list( - /datum/computer_file/program/bounty_board, - /datum/computer_file/program/emojipedia, - ) - /** * Non-roles */ 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 48966f2f2616f..6f5b116a930c0 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", max_length = MAX_MESSAGE_LEN) + var/message = tgui_input_text(user, "Message to be sent to remote cyborg", "Send Message") 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 d1ce57bda61d8..4c1a60a0c8697 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, max_length = MAX_MESSAGE_LEN) + reason = tgui_input_text(usr, "Reason", name) if(isnull(reason) || ..()) return diff --git a/code/modules/modular_computers/file_system/programs/jobmanagement.dm b/code/modules/modular_computers/file_system/programs/jobmanagement.dm index 2d51840886395..8d4db5ffb08d4 100644 --- a/code/modules/modular_computers/file_system/programs/jobmanagement.dm +++ b/code/modules/modular_computers/file_system/programs/jobmanagement.dm @@ -62,7 +62,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) switch(action) if("PRG_open_job") var/edit_job_target = params["target"] - var/datum/job/j = SSjob.get_job(edit_job_target) + var/datum/job/j = SSjob.GetJob(edit_job_target) if(!can_edit_job(j) || !can_open_job(j)) return TRUE if(opened_positions[edit_job_target] >= 0) @@ -74,7 +74,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) return TRUE if("PRG_close_job") var/edit_job_target = params["target"] - var/datum/job/j = SSjob.get_job(edit_job_target) + var/datum/job/j = SSjob.GetJob(edit_job_target) if(!can_edit_job(j) || !can_close_job(j)) return TRUE //Allow instant closing without cooldown if a position has been opened before @@ -87,7 +87,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) return TRUE if("PRG_priority") var/priority_target = params["target"] - var/datum/job/j = SSjob.get_job(priority_target) + var/datum/job/j = SSjob.GetJob(priority_target) if(!can_edit_job(j)) return TRUE if(j.total_positions <= j.current_positions) 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 3d7c735e4661c..6436e6be2b862 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, max_length = MAX_MESSAGE_LEN, encode = FALSE) + var/new_ringtone = tgui_input_text(user, "Enter a new ringtone", "Ringtone", ringtone, encode = FALSE) if(!computer.can_interact(user)) computer.balloon_alert(user, "can't reach!") return FALSE @@ -401,7 +401,7 @@ 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])" : ""]", max_length = MAX_MESSAGE_LEN, encode = FALSE) + 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)) /// Helper proc that sends a message to everyone diff --git a/code/modules/pai/card.dm b/code/modules/pai/card.dm index 35d707ec0f2ac..ccf0bae5f042b 100644 --- a/code/modules/pai/card.dm +++ b/code/modules/pai/card.dm @@ -27,6 +27,7 @@ update_appearance() SSpai.pai_card_list += src ADD_TRAIT(src, TRAIT_CASTABLE_LOC, INNATE_TRAIT) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) /obj/item/pai_card/attackby(obj/item/used, mob/user, params) if(pai && istype(used, /obj/item/encryptionkey)) @@ -70,8 +71,8 @@ emotion_icon = initial(emotion_icon) update_appearance() -/obj/item/pai_card/on_saboteur(datum/source, disrupt_duration) - . = ..() +/obj/item/pai_card/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER if(pai) return pai.on_saboteur(source, disrupt_duration) diff --git a/code/modules/pai/pai.dm b/code/modules/pai/pai.dm index 066a1146fd437..4268c040e2bcd 100644 --- a/code/modules/pai/pai.dm +++ b/code/modules/pai/pai.dm @@ -239,6 +239,7 @@ RegisterSignal(src, COMSIG_LIVING_CULT_SACRIFICED, PROC_REF(on_cult_sacrificed)) RegisterSignals(src, list(COMSIG_LIVING_ADJUST_BRUTE_DAMAGE, COMSIG_LIVING_ADJUST_BURN_DAMAGE), PROC_REF(on_shell_damaged)) RegisterSignal(src, COMSIG_LIVING_ADJUST_STAMINA_DAMAGE, PROC_REF(on_shell_weakened)) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) /mob/living/silicon/pai/make_laws() laws = new /datum/ai_laws/pai() @@ -259,7 +260,7 @@ return radio.screwdriver_act(user, tool) /mob/living/silicon/pai/updatehealth() - if(HAS_TRAIT(src, TRAIT_GODMODE)) + if(status_flags & GODMODE) return set_health(maxHealth - getBruteLoss() - getFireLoss()) update_stat() @@ -352,11 +353,11 @@ to_chat(src, span_danger("WARN: Holochasis range restrictions disabled.")) return TRUE -/mob/living/silicon/pai/on_saboteur(datum/source, disrupt_duration) - . = ..() +/mob/living/silicon/pai/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER set_silence_if_lower(disrupt_duration) balloon_alert(src, "muted!") - return TRUE + return COMSIG_SABOTEUR_SUCCESS /** * Resets the pAI and any emagged status. @@ -407,13 +408,7 @@ 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], - max_length = 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], 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 09858d8375b4b..fc1b986ce6d67 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", max_length = 128) + var/new_fax_name = tgui_input_text(user, "Enter a new name for the fax machine.", "New Fax Name", , 128) if (!new_fax_name) return ITEM_INTERACT_SUCCESS if (new_fax_name != fax_name) diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index 425ff9d38a403..eb29ca4b8b5c1 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -30,6 +30,7 @@ var/blending = FALSE //lets not take pictures while the previous is still processing! var/see_ghosts = CAMERA_NO_GHOSTS //for the spoop of it var/obj/item/disk/holodisk/disk + var/sound/custom_sound var/silent = FALSE var/picture_size_x = 2 var/picture_size_y = 2 @@ -117,7 +118,7 @@ return FALSE else if(user.client && !(get_turf(target) in get_hear(user.client.view, user))) return FALSE - else if(!(get_turf(target) in get_hear(CONFIG_GET(string/default_view), user))) + else if(!(get_turf(target) in get_hear(world.view, user))) return FALSE else if(isliving(loc)) if(!(get_turf(target) in view(world.view, loc))) @@ -251,9 +252,6 @@ if(print_picture_on_snap) printpicture(user, picture) - if(!silent) - playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 75, TRUE, -3) - /obj/item/camera/proc/printpicture(mob/user, datum/picture/picture) //Normal camera proc for creating photos pictures_left-- var/obj/item/photo/new_photo = new(get_turf(src), picture) diff --git a/code/modules/photography/camera/camera_image_capturing.dm b/code/modules/photography/camera/camera_image_capturing.dm index c9f8d8dbe8eca..64eeb192a2286 100644 --- a/code/modules/photography/camera/camera_image_capturing.dm +++ b/code/modules/photography/camera/camera_image_capturing.dm @@ -142,6 +142,12 @@ res.Blend(img, blendMode2iconMode(clone.blend_mode), xo, yo) CHECK_TICK + if(!silent) + if(istype(custom_sound)) //This is where the camera actually finishes its exposure. + playsound(loc, custom_sound, 75, TRUE, -3) + else + playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 75, TRUE, -3) + if(wipe_atoms) QDEL_LIST(atoms) else diff --git a/code/modules/photography/camera/other.dm b/code/modules/photography/camera/other.dm index 83e9a5fd28cac..166517d055fba 100644 --- a/code/modules/photography/camera/other.dm +++ b/code/modules/photography/camera/other.dm @@ -25,13 +25,7 @@ see_ghosts = CAMERA_SEE_GHOSTS_ORBIT /obj/item/camera/detective - name = "detective's camera" - desc = "A silent polaroid camera with extra capacity for crime investigations." - flash_enabled = FALSE - silent = TRUE + name = "Detective's camera" + desc = "A polaroid camera with extra capacity for crime investigations." pictures_max = 30 pictures_left = 30 - -/obj/item/camera/detective/after_picture(mob/user, datum/picture/picture) - . = ..() - user.playsound_local(get_turf(src), pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 35, TRUE) diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm index d6c3b5d803da3..b0c5035a1f845 100644 --- a/code/modules/power/apc/apc_main.dm +++ b/code/modules/power/apc/apc_main.dm @@ -223,6 +223,7 @@ register_context() addtimer(CALLBACK(src, PROC_REF(update)), 0.5 SECONDS) RegisterSignal(SSdcs, COMSIG_GLOB_GREY_TIDE, PROC_REF(grey_tide)) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) update_appearance() var/static/list/hovering_mob_typechecks = list( @@ -254,11 +255,12 @@ disconnect_terminal() return ..() -/obj/machinery/power/apc/on_saboteur(datum/source, disrupt_duration) - . = ..() +/obj/machinery/power/apc/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + disrupt_duration *= 0.1 // so, turns out, failure timer is in seconds, not deciseconds; without this, disruptions last 10 times as long as they probably should energy_fail(disrupt_duration) - return TRUE + return COMSIG_SABOTEUR_SUCCESS /obj/machinery/power/apc/on_set_is_operational(old_value) update_area_power_usage(!old_value) @@ -525,24 +527,20 @@ * 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(!QDELETED(cell) && cell.charge < cell.maxcharge) + if(cell && cell.charge < cell.maxcharge) last_charging = charging charging = APC_NOT_CHARGING if(isnull(area)) return var/total_static_energy_usage = 0 - 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] + 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. - 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) + draw_energy(total_static_energy_usage) /obj/machinery/power/apc/proc/late_process(seconds_per_tick) if(icon_update_needed) @@ -562,15 +560,9 @@ flicker_hacked_icon() //dont use any power from that channel if we shut that power channel off - 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_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 lastused_charge = charging == APC_CHARGING ? area.energy_usage[AREA_USAGE_APC_CHARGE] : 0 lastused_total = lastused_light + lastused_equip + lastused_environ + lastused_charge @@ -760,6 +752,21 @@ /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/apc/apc_malf.dm b/code/modules/power/apc/apc_malf.dm index b8fe1510c918d..1419e12c46be3 100644 --- a/code/modules/power/apc/apc_malf.dm +++ b/code/modules/power/apc/apc_malf.dm @@ -45,7 +45,7 @@ malf.ShutOffDoomsdayDevice() occupier = malf if (isturf(malf.loc)) // create a deactivated AI core if the AI isn't coming from an emergency mech shunt - malf.linked_core = new /obj/structure/ai_core/deactivated(malf.loc) + malf.linked_core = new /obj/structure/ai_core/deactivated malf.linked_core.remote_ai = malf // note that we do not set the deactivated core's core_mmi.brainmob malf.forceMove(src) // move INTO the APC, not to its tile if(!findtext(occupier.name, "APC Copy")) @@ -57,29 +57,22 @@ disk_pinpointers.switch_mode_to(TRACK_MALF_AI) //Pinpointer will track the shunted AI var/datum/action/innate/core_return/return_action = new return_action.Grant(occupier) - SEND_SIGNAL(src, COMSIG_SILICON_AI_OCCUPY_APC, occupier) - SEND_SIGNAL(occupier, COMSIG_SILICON_AI_OCCUPY_APC, occupier) occupier.cancel_camera() /obj/machinery/power/apc/proc/malfvacate(forced) if(!occupier) return - SEND_SIGNAL(occupier, COMSIG_SILICON_AI_VACATE_APC, occupier) - SEND_SIGNAL(src, COMSIG_SILICON_AI_VACATE_APC, occupier) - if(forced) - occupier.forceMove(drop_location()) - INVOKE_ASYNC(occupier, TYPE_PROC_REF(/mob/living, death)) - occupier.gib(DROP_ALL_REMAINS) - occupier = null - return if(occupier.linked_core) occupier.shunted = FALSE occupier.forceMove(occupier.linked_core.loc) qdel(occupier.linked_core) occupier.cancel_camera() - occupier = null - else - stack_trace("An AI: [occupier] has vacated an APC with no linked core and without being gibbed.") + return + to_chat(occupier, span_danger("Primary core damaged, unable to return core processes.")) + if(forced) + occupier.forceMove(drop_location()) + INVOKE_ASYNC(occupier, TYPE_PROC_REF(/mob/living, death)) + occupier.gib(DROP_ALL_REMAINS) if(!occupier.nuking) //Pinpointers go back to tracking the nuke disk, as long as the AI (somehow) isn't mid-nuking. for(var/obj/item/pinpointer/nuke/disk_pinpointers in GLOB.pinpointer_list) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 5c68bb8f4c8b0..f68319f4205fb 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -577,10 +577,6 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri /obj/item/stack/cable_coil/proc/try_heal_loop(atom/interacting_with, mob/living/user, repeating = FALSE) var/mob/living/carbon/human/attacked_humanoid = interacting_with - var/obj/item/clothing/under/uniform = attacked_humanoid.w_uniform - if(uniform.repair_sensors(src, user)) - return ITEM_INTERACT_SUCCESS - var/obj/item/bodypart/affecting = attacked_humanoid.get_bodypart(check_zone(user.zone_selected)) if(isnull(affecting) || !IS_ROBOTIC_LIMB(affecting)) return NONE diff --git a/code/modules/power/floodlight.dm b/code/modules/power/floodlight.dm index 7799018a238a3..38354241f9a4b 100644 --- a/code/modules/power/floodlight.dm +++ b/code/modules/power/floodlight.dm @@ -69,34 +69,33 @@ if(state == FLOODLIGHT_NEEDS_SECURING) icon_state = "floodlight_c3" state = FLOODLIGHT_NEEDS_LIGHTS - return ITEM_INTERACT_SUCCESS + return TRUE else if(state == FLOODLIGHT_NEEDS_LIGHTS) icon_state = "floodlight_c2" state = FLOODLIGHT_NEEDS_SECURING - return ITEM_INTERACT_SUCCESS - return ITEM_INTERACT_BLOCKING + return TRUE + return FALSE /obj/structure/floodlight_frame/wrench_act(mob/living/user, obj/item/tool) if(state != FLOODLIGHT_NEEDS_WIRES) - return ITEM_INTERACT_BLOCKING + return FALSE - balloon_alert(user, "deconstructing...") if(!tool.use_tool(src, user, 30, volume=50)) - return ITEM_INTERACT_BLOCKING + return TRUE new /obj/item/stack/sheet/iron(loc, 5) qdel(src) - return ITEM_INTERACT_SUCCESS + return TRUE /obj/structure/floodlight_frame/wirecutter_act(mob/living/user, obj/item/tool) if(state != FLOODLIGHT_NEEDS_SECURING) - return ITEM_INTERACT_BLOCKING + return FALSE icon_state = "floodlight_c1" state = FLOODLIGHT_NEEDS_WIRES new /obj/item/stack/cable_coil(loc, 5) - return ITEM_INTERACT_SUCCESS + return TRUE /obj/structure/floodlight_frame/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/stack/cable_coil) && state == FLOODLIGHT_NEEDS_WIRES) @@ -110,11 +109,8 @@ 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(L.status != LIGHT_BROKEN) // light tube not broken. + if(state == FLOODLIGHT_NEEDS_LIGHTS && L.status != 2) //Ready for a light tube, and not broken. new /obj/machinery/power/floodlight(loc) qdel(src) qdel(O) @@ -154,6 +150,7 @@ /obj/machinery/power/floodlight/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_OBJ_PAINTED, TYPE_PROC_REF(/obj/machinery/power/floodlight, on_color_change)) //update light color when color changes + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) register_context() /obj/machinery/power/floodlight/proc/on_color_change(obj/machinery/power/flood_light, mob/user, obj/item/toy/crayon/spraycan/spraycan, is_dark_color) @@ -299,10 +296,10 @@ /obj/machinery/power/floodlight/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/power/floodlight/on_saboteur(datum/source, disrupt_duration) - . = ..() +/obj/machinery/power/floodlight/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER atom_break(ENERGY) // technically, - return TRUE + return COMSIG_SABOTEUR_SUCCESS /obj/machinery/power/floodlight/atom_break(damage_flag) . = ..() diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm index 431f2095b0a69..889ca7244e8f7 100644 --- a/code/modules/power/lighting/light.dm +++ b/code/modules/power/lighting/light.dm @@ -116,6 +116,7 @@ // Light projects out backwards from the dir of the light set_light(l_dir = REVERSE_DIR(dir)) RegisterSignal(src, COMSIG_LIGHT_EATER_ACT, PROC_REF(on_light_eater)) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) AddElement(/datum/element/atmos_sensitive, mapload) AddElement(/datum/element/contextual_screentip_bare_hands, rmb_text = "Remove bulb") if(break_if_moved) @@ -687,10 +688,10 @@ tube?.burn() return -/obj/machinery/light/on_saboteur(datum/source, disrupt_duration) - . = ..() +/obj/machinery/light/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER break_light_tube() - return TRUE + return COMSIG_SABOTEUR_SUCCESS /obj/machinery/light/proc/grey_tide(datum/source, list/grey_tide_areas) SIGNAL_HANDLER diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 3fb98970ba4d6..c31870f2ad080 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) || !local_apc.operating) + if(isnull(local_apc)) 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) || !my_apc.operating || QDELETED(my_apc.cell)) + if(isnull(my_apc) || QDELETED(my_apc.cell)) return FALSE return my_apc.cell.use(amount, force = force) @@ -228,9 +228,8 @@ return amount //Shuttles get free power, don't ask why var/obj/machinery/power/apc/local_apc = home.apc - if(isnull(local_apc) || !local_apc.operating) + if(!local_apc) 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/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index e7cc039c72df9..c4e3127aa5c9f 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -896,11 +896,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/proc/supermatter_zap(atom/zapstart = src, range = 5, zap_str = 3.2 MEGA JOULES, zap_flags = ZAP_SUPERMATTER_FLAGS, list/targets_hit = list(), zap_cutoff = 1.2 MEGA JOULES, power_level = 0, zap_icon = DEFAULT_ZAP_ICON_STATE, color = null) if(QDELETED(zapstart)) return - if(zap_cutoff <= 0) - stack_trace("/obj/machinery/supermatter_zap() was called with a non-positive value") - return - if(zap_str <= 0) // Just in case something scales zap_str and zap_cutoff to 0. - return . = zapstart.dir //If the strength of the zap decays past the cutoff, we stop if(zap_str < zap_cutoff) diff --git a/code/modules/power/supermatter/supermatter_extra_effects.dm b/code/modules/power/supermatter/supermatter_extra_effects.dm index 5d4c3474d59f6..b6cc1b792bdcf 100644 --- a/code/modules/power/supermatter/supermatter_extra_effects.dm +++ b/code/modules/power/supermatter/supermatter_extra_effects.dm @@ -130,10 +130,9 @@ if(zap_count >= 1) playsound(loc, 'sound/weapons/emitter2.ogg', 100, TRUE, extrarange = 10) var/delta_time = (SSmachines.times_fired - last_high_energy_zap_perspective_machines) * SSmachines.wait / (1 SECONDS) - if(delta_time) - for(var/i in 1 to zap_count) - supermatter_zap(src, range, clamp(internal_energy * 3200, 6.4e6, 3.2e7) * delta_time, flags, zap_cutoff = src.zap_cutoff * delta_time, power_level = internal_energy, zap_icon = src.zap_icon) - last_high_energy_zap_perspective_machines = SSmachines.times_fired + for(var/i in 1 to zap_count) + supermatter_zap(src, range, clamp(internal_energy * 3200, 6.4e6, 3.2e7) * delta_time, flags, zap_cutoff = src.zap_cutoff * delta_time, power_level = internal_energy, zap_icon = src.zap_icon) + last_high_energy_zap_perspective_machines = SSmachines.times_fired if(prob(5)) supermatter_anomaly_gen(src, FLUX_ANOMALY, rand(5, 10)) if(prob(5)) diff --git a/code/modules/power/supermatter/supermatter_hit_procs.dm b/code/modules/power/supermatter/supermatter_hit_procs.dm index 57c86303a0ad6..6f01b5ff7e3f4 100644 --- a/code/modules/power/supermatter/supermatter_hit_procs.dm +++ b/code/modules/power/supermatter/supermatter_hit_procs.dm @@ -13,11 +13,11 @@ return NONE var/kiss_power = 0 - if (istype(projectile, /obj/projectile/kiss/death)) - kiss_power = 20000 - else if (istype(projectile, /obj/projectile/kiss)) - kiss_power = 60 - + switch(projectile.type) + if(/obj/projectile/kiss) + kiss_power = 60 + if(/obj/projectile/kiss/death) + kiss_power = 20000 if(!istype(projectile.firer, /obj/machinery/power/emitter)) investigate_log("has been hit by [projectile] fired by [key_name(projectile.firer)]", INVESTIGATE_ENGINE) diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index bbc1030f0d6ae..0e7957b65fb2f 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -187,8 +187,8 @@ /obj/energy_ball/proc/dust_mobs(atom/A) if(isliving(A)) - var/mob/living/living = A - if(living.incorporeal_move || HAS_TRAIT(living, TRAIT_GODMODE)) + var/mob/living/L = A + if(L.incorporeal_move || L.status_flags & GODMODE) return if(!iscarbon(A)) return diff --git a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm index 6d7d922514282..5331b5c92f8bc 100644 --- a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm +++ b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm @@ -53,10 +53,7 @@ ammo_type = /obj/item/ammo_casing/shotgun/incapacitate max_ammo = 3 -/obj/item/ammo_box/magazine/internal/shot/single - name = "single-barrel shotgun internal magazine" - max_ammo = 1 - -/obj/item/ammo_box/magazine/internal/shot/single/musket +/obj/item/ammo_box/magazine/internal/shot/musket name = "donk co musket internal magazine" ammo_type = /obj/item/ammo_casing/shotgun/fletchette + max_ammo = 1 diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index c3bb92eec7140..a895cbe88e44f 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 0317ead192882..888b784ddf86c 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/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index c3ba84d1cb8cd..9be59ffb5344b 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -287,6 +287,7 @@ can_be_sawn_off = TRUE pb_knockback = 3 // it's a super shotgun! + /obj/item/gun/ballistic/shotgun/doublebarrel/sawoff(mob/user) . = ..() if(.) @@ -342,32 +343,6 @@ return hook.try_fire_gun(target, user, params) return ..() -///An underpowered shotgun given to Pun Pun when the station job trait roll. -/obj/item/gun/ballistic/shotgun/monkey - name = "\improper Barback's Shot" - desc = "A chimp-sized, single-shot and break-action shotgun with an unpractical stock." - icon_state = "chimp_shottie" - inhand_icon_state = "shotgun" - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - inhand_x_dimension = 32 - inhand_y_dimension = 32 - force = 8 - obj_flags = CONDUCTS_ELECTRICITY - slot_flags = NONE - accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/single - obj_flags = UNIQUE_RENAME - w_class = WEIGHT_CLASS_NORMAL - weapon_weight = WEAPON_MEDIUM - semi_auto = TRUE - bolt_type = BOLT_TYPE_NO_BOLT - spread = 10 - projectile_damage_multiplier = 0.5 - projectile_wound_bonus = -25 - recoil = 1 - pin = /obj/item/firing_pin/monkey - pb_knockback = 1 - /obj/item/gun/ballistic/shotgun/musket name = "\improper Donk Co. Musket" icon = 'icons/obj/weapons/guns/ballistic.dmi' @@ -381,4 +356,4 @@ bolt_type = BOLT_TYPE_LOCKING bolt_wording = "bolt" internal_magazine = TRUE - accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/single/musket + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/musket diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 244e68e8b031c..d06a36056d1c0 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -141,7 +141,7 @@ // Can we weld? Plasma cutter does not use charge continuously. // Amount cannot be defaulted to 1: most of the code specifies 0 in the call. -/obj/item/gun/energy/plasmacutter/tool_use_check(mob/living/user, amount, heat_required) +/obj/item/gun/energy/plasmacutter/tool_use_check(mob/living/user, amount) if(QDELETED(cell)) balloon_alert(user, "no cell inserted!") return FALSE @@ -151,9 +151,6 @@ if(amount ? cell.charge < PLASMA_CUTTER_CHARGE_WELD * amount : cell.charge < PLASMA_CUTTER_CHARGE_WELD) balloon_alert(user, "not enough charge!") return FALSE - if(heat < heat_required) - to_chat(user, span_warning("[src] is not hot enough to complete this task!")) - return FALSE return TRUE diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm index 2a80c366f0346..2915e3e59bd6c 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 = 45 + damage = 55 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 = 35 + damage = 55 speed = 0.6 projectile_piercing = PASSMOB|PASSVEHICLE projectile_phasing = ~(PASSMOB|PASSVEHICLE) @@ -148,11 +148,12 @@ dismemberment = 0 //goes through clean. damage_type = BRUTE armour_penetration = 30 //very pointy. - wound_bonus = -100 - bare_wound_bonus = 0 + wound_bonus = -15 + bare_wound_bonus = 10 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/projectiles/projectile/special/saboteur.dm b/code/modules/projectiles/projectile/special/saboteur.dm index 5e7249b7d54aa..46fcc136c0927 100644 --- a/code/modules/projectiles/projectile/special/saboteur.dm +++ b/code/modules/projectiles/projectile/special/saboteur.dm @@ -1,9 +1,3 @@ -///Override on subtype to add behaviour. Whatever happens when we are sabotaged -/atom/proc/on_saboteur(datum/source, disrupt_duration) - SHOULD_CALL_PARENT(TRUE) - if(SEND_SIGNAL(src, COMSIG_ATOM_SABOTEUR_ACT, disrupt_duration) & COMSIG_SABOTEUR_SUCCESS) //Signal handles datums for the most part - return TRUE - /obj/projectile/energy/fisher name = "attenuated kinetic force" alpha = 0 @@ -25,7 +19,7 @@ var/success = FALSE for(var/atom/disrupted as anything in things_to_disrupt) - if(disrupted.on_saboteur(src, disrupt_duration)) + if(SEND_SIGNAL(disrupted, COMSIG_HIT_BY_SABOTEUR, disrupt_duration) & COMSIG_SABOTEUR_SUCCESS) success = TRUE if(success && ismob(firer)) diff --git a/code/modules/reagents/chemistry/chem_wiki_render.dm b/code/modules/reagents/chemistry/chem_wiki_render.dm index 34bc1e1a6f13e..2bb6bd7175bdc 100644 --- a/code/modules/reagents/chemistry/chem_wiki_render.dm +++ b/code/modules/reagents/chemistry/chem_wiki_render.dm @@ -9,12 +9,7 @@ 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", - max_length = MAX_MESSAGE_LEN, - ) //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") //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/holder/holder.dm b/code/modules/reagents/chemistry/holder/holder.dm index 593bc6d471092..f084a7eaa39d4 100644 --- a/code/modules/reagents/chemistry/holder/holder.dm +++ b/code/modules/reagents/chemistry/holder/holder.dm @@ -204,12 +204,11 @@ * * * [list_reagents][list] - list to add. Format it like this: list(/datum/reagent/toxin = 10, "beer" = 15) * * [data][list] - additional data to add - * * [added_purity][number] - an override to the default purity for each reagent to add. */ -/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data = null, added_purity = null) +/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data = null) for(var/r_id in list_reagents) var/amt = list_reagents[r_id] - add_reagent(r_id, amt, data, added_purity = added_purity) + add_reagent(r_id, amt, data) /** * Removes a specific reagent. can supress reactions if needed @@ -590,11 +589,10 @@ */ /datum/reagents/proc/multiply_reagents(multiplier = 1) var/list/cached_reagents = reagent_list - if(!total_volume || multiplier == 1) + if(!total_volume) return var/change = (multiplier - 1) //Get the % change for(var/datum/reagent/reagent as anything in cached_reagents) - _multiply_reagent(reagent, change) if(change > 0) add_reagent(reagent.type, reagent.volume * change, added_purity = reagent.purity, ignore_splitting = reagent.chemical_flags & REAGENT_DONOTSPLIT) else @@ -603,28 +601,6 @@ update_total() handle_reactions() -/** - * Multiplies a single inside this holder by a specific amount - * Arguments - * * reagent_path - The path of the reagent we want to multiply the volume of. - * * multiplier - the amount to multiply each reagent by - */ -/datum/reagents/proc/multiply_single_reagent(reagent_path, multiplier = 1) - var/datum/reagent/reagent = locate(reagent_path) in reagent_list - if(!reagent || multiplier == 1) - return - var/change = (multiplier - 1) //Get the % change - _multiply_reagent(reagent, change) - update_total() - handle_reactions() - -///Proc containing the operations called by both multiply_reagents() and multiply_single_reagent() -/datum/reagents/proc/_multiply_reagent(datum/reagent/reagent, change) - if(change > 0) - add_reagent(reagent.type, reagent.volume * change, added_purity = reagent.purity, ignore_splitting = reagent.chemical_flags & REAGENT_DONOTSPLIT) - else - remove_reagent(reagent.type, abs(reagent.volume * change)) //absolute value to prevent a double negative situation (removing -50% would be adding 50%) - /// Updates [/datum/reagents/var/total_volume] /datum/reagents/proc/update_total() var/list/cached_reagents = reagent_list diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index b7266ca0fe375..5f665d876afaa 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -346,7 +346,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_length = MAX_NAME_LEN) + var/name = tgui_input_text(ui.user, "What do you want to name this recipe?", "Recipe Name", 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 87ba535a149c6..237dcb862af50 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -474,13 +474,11 @@ item_name_default = "[master_reagent.name] [item_name_default]" if(!(initial(selected_container.reagent_flags) & OPENCONTAINER)) // Closed containers get both reagent name and units in the name item_name_default = "[master_reagent.name] [item_name_default] ([volume_in_each]u)" - var/item_name = tgui_input_text( - usr, + var/item_name = tgui_input_text(usr, "Container name", "Name", item_name_default, - max_length = MAX_NAME_LEN, - ) + MAX_NAME_LEN) if(!item_name) return FALSE diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index c41ab8ffca521..5365be6fe8d7f 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -166,8 +166,8 @@ return exposed_obj.visible_message(span_warning("[exposed_obj] rapidly fries as it's splashed with hot oil! Somehow.")) - exposed_obj.AddElement(/datum/element/fried_item, volume SECONDS) - exposed_obj.reagents.add_reagent(src.type, reac_volume, reagtemp = holder.chem_temp) + exposed_obj.AddElement(/datum/element/fried_item, volume) + exposed_obj.reagents.add_reagent(src.type, reac_volume) /datum/reagent/consumable/nutriment/fat/expose_mob(mob/living/exposed_mob, methods = TOUCH, reac_volume, show_message = TRUE, touch_protection = 0) . = ..() diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 6f28d12964771..18d02ba2e31fc 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2950,7 +2950,7 @@ //This is intended to a be a scarce reagent to gate certain drugs and toxins with. Do not put in a synthesizer. Renewable sources of this reagent should be inefficient. /datum/reagent/lead name = "Lead" - description = "A dull metallic element with a low melting point." + description = "A dull metalltic element with a low melting point." taste_description = "metal" reagent_state = SOLID color = "#80919d" diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 95f73e552be34..5e553fce962c5 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -326,19 +326,6 @@ else affected_mob.adjust_hallucinations(10 SECONDS * REM * seconds_per_tick) -/datum/reagent/toxin/mindbreaker/fish - name = "Jellyfish Hallucinogen" - description = "A hallucinogen structurally similar to the mindbreaker toxin, but with weaker molecular bonds, making it easily degradeable by heat." - -/datum/reagent/toxin/mindbreaker/fish/on_new(data) - . = ..() - if(holder?.my_atom) - RegisterSignals(holder.my_atom, list(COMSIG_ITEM_FRIED, TRAIT_FOOD_BBQ_GRILLED), PROC_REF(on_atom_cooked)) - -/datum/reagent/toxin/mindbreaker/fish/proc/on_atom_cooked(datum/source, cooking_time) - SIGNAL_HANDLER - holder.del_reagent(type) - /datum/reagent/toxin/plantbgone name = "Plant-B-Gone" description = "A harmful toxic mixture to kill plantlife. Do not ingest!" diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 8e2353555be5d..bff4d526333be 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -41,7 +41,7 @@ required_other = TRUE /datum/chemical_reaction/sodiumchloride/pre_reaction_other_checks(datum/reagents/holder) - . = ..() + . = ..() if(holder.has_reagent(/datum/reagent/consumable/liquidelectricity) || holder.has_reagent(/datum/reagent/consumable/liquidelectricity/enriched)) return FALSE @@ -990,16 +990,3 @@ var/location = get_turf(holder.my_atom) for(var/i in 1 to created_volume) new /obj/item/stack/sheet/hauntium(location) - -/datum/chemical_reaction/fish_hallucinogen_degradation - results = list(/datum/reagent/consumable/nutriment/protein = 0.1) - required_reagents = list(/datum/reagent/toxin/mindbreaker/fish = 1) - required_temp = 363.15 // 90° - optimal_temp = 450 - rate_up_lim = 8 - temp_exponent_factor = 1.5 - optimal_ph_min = 2 - optimal_ph_max = 10 - thermic_constant = 80 - H_ion_release = 2 - reaction_tags = REACTION_TAG_EASY diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 21d076e949fd7..13eaffca3a898 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -147,7 +147,7 @@ var/obj/item/food_item = new chosen(T) ADD_TRAIT(food_item, TRAIT_FOOD_SILVER, INNATE_TRAIT) if(prob(5))//Fry it! - food_item.AddElement(/datum/element/fried_item, rand(15, 60) SECONDS) + food_item.AddElement(/datum/element/fried_item, rand(15, 60)) if(prob(5))//Grill it! food_item.AddElement(/datum/element/grilled_item, rand(30 SECONDS, 100 SECONDS)) if(prob(50)) diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 15c79e4c150b9..75fc8aef8920c 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_length = MAX_NAME_LEN) + var/custom_label = tgui_input_text(user, "What would you like to label the blood pack?", "Blood Pack", name, MAX_NAME_LEN) if(!user.can_perform_action(src)) return if(user.get_active_held_item() != tool) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index fa768e67695ff..f9cf10e1068d9 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -81,14 +81,14 @@ if(tank_volume && (damage_flag == BULLET || damage_flag == LASER)) boom() -/obj/structure/reagent_dispensers/attackby(obj/item/attacking_item, mob/user, params) - if(attacking_item.is_refillable()) +/obj/structure/reagent_dispensers/attackby(obj/item/W, mob/user, params) + if(W.is_refillable()) return FALSE //so we can refill them via their afterattack. - if(istype(attacking_item, /obj/item/assembly_holder) && accepts_rig) + if(istype(W, /obj/item/assembly_holder) && accepts_rig) if(rig) balloon_alert(user, "another device is in the way!") return ..() - var/obj/item/assembly_holder/holder = attacking_item + var/obj/item/assembly_holder/holder = W if(!(locate(/obj/item/assembly/igniter) in holder.assemblies)) return ..() @@ -109,8 +109,8 @@ user.balloon_alert_to_viewers("attached rig") return - if(istype(attacking_item, /obj/item/stack/sheet/iron) && can_be_tanked) - var/obj/item/stack/sheet/iron/metal_stack = attacking_item + if(istype(W, /obj/item/stack/sheet/iron) && can_be_tanked) + var/obj/item/stack/sheet/iron/metal_stack = W metal_stack.use(1) var/obj/structure/reagent_dispensers/plumbed/storage/new_tank = new /obj/structure/reagent_dispensers/plumbed/storage(drop_location()) new_tank.reagents.maximum_volume = reagents.maximum_volume @@ -293,39 +293,27 @@ // if this sucks, feel free to change it, but make sure the damn thing will log. thanks. return ..() -/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/attacking_item, mob/user, params) - if(attacking_item.tool_behaviour != TOOL_WELDER) - return ..() - - var/obj/item/weldingtool/refilling_welder = attacking_item - if(istype(refilling_welder) && !refilling_welder.welding) - if(refilling_welder.reagents.has_reagent(/datum/reagent/fuel, refilling_welder.max_fuel)) - to_chat(user, span_warning("Your [refilling_welder.name] is already full!")) +/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/I, mob/living/user, params) + if(I.tool_behaviour == TOOL_WELDER) + if(!reagents.has_reagent(/datum/reagent/fuel)) + to_chat(user, span_warning("[src] is out of fuel!")) return - reagents.trans_to(refilling_welder, refilling_welder.max_fuel, transferred_by = user) - user.visible_message(span_notice("[user] refills [user.p_their()] [refilling_welder.name]."), span_notice("You refill [refilling_welder].")) - playsound(src, 'sound/effects/refill.ogg', 50, TRUE) - refilling_welder.update_appearance() - return - - var/obj/item/lighter/refilling_lighter = attacking_item - if(istype(refilling_lighter) && !refilling_lighter.lit) - if(refilling_lighter.reagents.has_reagent(/datum/reagent/fuel, refilling_lighter.maximum_fuel)) - to_chat(user, span_warning("Your [refilling_lighter.name] is already full!")) - return - reagents.trans_to(refilling_lighter, refilling_lighter.maximum_fuel, transferred_by = user) - user.visible_message(span_notice("[user] refills [user.p_their()] [refilling_lighter.name]."), span_notice("You refill [refilling_lighter].")) - playsound(src, 'sound/effects/refill.ogg', 25, TRUE) + var/obj/item/weldingtool/W = I + if(istype(W) && !W.welding) + if(W.reagents.has_reagent(/datum/reagent/fuel, W.max_fuel)) + to_chat(user, span_warning("Your [W.name] is already full!")) + return + reagents.trans_to(W, W.max_fuel, transferred_by = user) + user.visible_message(span_notice("[user] refills [user.p_their()] [W.name]."), span_notice("You refill [W].")) + playsound(src, 'sound/effects/refill.ogg', 50, TRUE) + W.update_appearance() + else + user.visible_message(span_danger("[user] catastrophically fails at refilling [user.p_their()] [I.name]!"), span_userdanger("That was stupid of you.")) + log_bomber(user, "detonated a", src, "via welding tool") + boom() return - if(!reagents.has_reagent(/datum/reagent/fuel)) - to_chat(user, span_warning("[src] is out of fuel!")) - return - user.visible_message( - span_danger("[user] catastrophically fails at refilling [user.p_their()] [attacking_item.name]!"), - span_userdanger("That was stupid of you.")) - log_bomber(user, "detonated a", src, "via [attacking_item.name]") - boom() + return ..() /obj/structure/reagent_dispensers/fueltank/large name = "high capacity fuel tank" diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 4930136b25bd7..dbcabfab19677 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -120,7 +120,7 @@ to_chat(user, span_notice("You [panel_open ? "remove":"attach"] the screws around the power connection.")) return else if(I.tool_behaviour == TOOL_WELDER && panel_open) - if(!I.tool_start_check(user, amount=1, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!I.tool_start_check(user, amount=1)) return to_chat(user, span_notice("You start slicing the floorweld off \the [src]...")) @@ -165,11 +165,9 @@ user.visible_message(span_notice("[user.name] places \the [I] into \the [src]."), span_notice("You place \the [I] into \the [src].")) /// Mouse drop another mob or self -/obj/machinery/disposal/mouse_drop_receive(atom/target, mob/living/user, params) - if(isliving(target)) +/obj/machinery/disposal/mouse_drop_receive(mob/living/target, mob/living/user, params) + if(istype(target)) stuff_mob_in(target, user) - if(istype(target, /obj/structure/closet/body_bag) && (user.mobility_flags & (MOBILITY_PICKUP|MOBILITY_STAND) == (MOBILITY_PICKUP|MOBILITY_STAND))) - stuff_bodybag_in(target, user) /// Handles stuffing a grabbed mob into the disposal /obj/machinery/disposal/proc/stuff_mob_in(mob/living/target, mob/living/user) @@ -178,65 +176,33 @@ if (iscyborg(user)) var/mob/living/silicon/robot/borg = user if (!borg.model || !borg.model.canDispose) - return FALSE + return else - return FALSE + return if(!isturf(user.loc)) //No magically doing it from inside closets - return FALSE + return if(target.buckled || target.has_buckled_mobs()) - return FALSE + return if(target.mob_size > MOB_SIZE_HUMAN) to_chat(user, span_warning("[target] doesn't fit inside [src]!")) - return FALSE + return add_fingerprint(user) if(user == target) user.visible_message(span_warning("[user] starts climbing into [src]."), span_notice("You start climbing into [src]...")) else target.visible_message(span_danger("[user] starts putting [target] into [src]."), span_userdanger("[user] starts putting you into [src]!")) - if(!do_after(user, 2 SECONDS, target) || QDELETED(src)) - return FALSE - target.forceMove(src) - if(user == target) - user.visible_message(span_warning("[user] climbs into [src]."), span_notice("You climb into [src].")) - else - target.visible_message(span_danger("[user] places [target] in [src]."), span_userdanger("[user] places you in [src].")) - log_combat(user, target, "stuffed", addition="into [src]") - update_appearance() - return TRUE - -/obj/machinery/disposal/proc/stuff_bodybag_in(obj/structure/closet/body_bag/bag, mob/living/user) - if(!length(bag.contents)) - bag.undeploy_bodybag(src) - qdel(bag) - user.visible_message( - span_warning("[user] stuffs the empty [bag.name] into [src]."), - span_notice("You stuff the empty [bag.name] into [src].") - ) - return TRUE - - user.visible_message( - span_warning("[user] starts putting [bag] into [src]."), - span_notice("You start putting [bag] into [src]...") - ) - - if(!do_after(user, 4 SECONDS, bag) || QDELETED(src)) - return FALSE - - user.visible_message( - span_warning("[user] places [bag] in [src]."), - span_notice("You place [bag] in [src].") - ) - - if(!length(bag.contents)) - bag.undeploy_bodybag(src) - qdel(bag) - else - bag.add_fingerprint(user) - bag.forceMove(src) - - add_fingerprint(user) - update_appearance() - return TRUE + if(do_after(user, 2 SECONDS, target)) + if (!loc) + return + target.forceMove(src) + if(user == target) + user.visible_message(span_warning("[user] climbs into [src]."), span_notice("You climb into [src].")) + . = TRUE + else + target.visible_message(span_danger("[user] places [target] in [src]."), span_userdanger("[user] places you in [src].")) + log_combat(user, target, "stuffed", addition="into [src]") + . = TRUE + update_appearance() /obj/machinery/disposal/relaymove(mob/living/user, direction) attempt_escape(user) diff --git a/code/modules/recycling/disposal/construction.dm b/code/modules/recycling/disposal/construction.dm index 8e0f4dad6f40f..13f43b1f4a419 100644 --- a/code/modules/recycling/disposal/construction.dm +++ b/code/modules/recycling/disposal/construction.dm @@ -152,7 +152,7 @@ to_chat(user, span_warning("A disposals machine already exists here!")) return TRUE - if(!I.tool_start_check(user, amount=1, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!I.tool_start_check(user, amount=1)) return TRUE to_chat(user, span_notice("You start welding the [pipename] in place...")) diff --git a/code/modules/recycling/disposal/outlet.dm b/code/modules/recycling/disposal/outlet.dm index 63c3c83edd18c..6773e574d3542 100644 --- a/code/modules/recycling/disposal/outlet.dm +++ b/code/modules/recycling/disposal/outlet.dm @@ -83,7 +83,7 @@ /obj/structure/disposaloutlet/welder_act(mob/living/user, obj/item/I) ..() - if(!I.tool_start_check(user, amount=1, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!I.tool_start_check(user, amount=1)) return TRUE playsound(src, 'sound/items/welder2.ogg', 100, TRUE) diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm index b08323e66e4aa..9a1ad786e7220 100644 --- a/code/modules/recycling/disposal/pipe.dm +++ b/code/modules/recycling/disposal/pipe.dm @@ -156,7 +156,7 @@ if(!can_be_deconstructed(user)) return TRUE - if(!I.tool_start_check(user, amount=1, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!I.tool_start_check(user, amount=1)) return TRUE to_chat(user, span_notice("You start slicing [src]...")) diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 280d074c7ff19..a61bf0f59445b 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -216,7 +216,6 @@ layer = BELOW_OBJ_LAYER pass_flags_self = PASSSTRUCTURE interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND - w_class = WEIGHT_CLASS_GIGANTIC /obj/item/delivery/big/interact(mob/user) if(!attempt_pre_unwrap_contents(user)) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index ac90479afc33b..0420c732637a1 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -113,7 +113,7 @@ other types of metals and chemistry for reagents). * Args: * - stored_research - The techweb that's storing us. */ -/obj/item/disk/design_disk/proc/on_upload(datum/techweb/stored_research, atom/research_source) +/obj/item/disk/design_disk/proc/on_upload(datum/techweb/stored_research) return /obj/item/disk/design_disk/bepis @@ -134,9 +134,9 @@ other types of metals and chemistry for reagents). blueprints += new_entry ///Unhide and research our node so we show up in the R&D console. -/obj/item/disk/design_disk/bepis/on_upload(datum/techweb/stored_research, atom/research_source) +/obj/item/disk/design_disk/bepis/on_upload(datum/techweb/stored_research) stored_research.hidden_nodes -= bepis_node.id - stored_research.research_node(bepis_node, force = TRUE, auto_adjust_cost = FALSE, research_source = research_source) + stored_research.research_node(bepis_node, force = TRUE, auto_adjust_cost = FALSE) /** * Subtype of Bepis tech disk diff --git a/code/modules/research/designs/electronics_designs.dm b/code/modules/research/designs/electronics_designs.dm index b1da9f2c1c05d..ce607639e22dc 100644 --- a/code/modules/research/designs/electronics_designs.dm +++ b/code/modules/research/designs/electronics_designs.dm @@ -33,19 +33,7 @@ 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/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 + build_path = /obj/item/surveillance_upgrade category = list( RND_CATEGORY_AI + RND_SUBCATEGORY_AI_UPGRADES ) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 517eb7c5b9ee4..d4dde8732a0e9 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -123,7 +123,7 @@ Nothing else in the console has ID requirements. user.investigate_log("researched [id]([json_encode(price)]) on techweb id [stored_research.id].", INVESTIGATE_RESEARCH) if(istype(stored_research, /datum/techweb/science)) SSblackbox.record_feedback("associative", "science_techweb_unlock", 1, list("id" = "[id]", "name" = TN.display_name, "price" = "[json_encode(price)]", "time" = ISOtime())) - if(stored_research.research_node_id(id, research_source = src)) + if(stored_research.research_node_id(id)) say("Successfully researched [TN.display_name].") var/logname = "Unknown" if(HAS_AI_ACCESS(user)) @@ -161,9 +161,6 @@ Nothing else in the console has ID requirements. balloon_alert(user, "security protocols disabled") playsound(src, SFX_SPARKS, 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) obj_flags |= EMAGGED - var/obj/item/circuitboard/computer/rdconsole/board = circuit - if(!(board.obj_flags & EMAGGED)) - board.silence_announcements = TRUE locked = FALSE return TRUE @@ -365,7 +362,7 @@ Nothing else in the console has ID requirements. if(D) stored_research.add_design(D, TRUE) say("Uploading blueprints from disk.") - d_disk.on_upload(stored_research, src) + d_disk.on_upload(stored_research) return TRUE if (params["type"] == RND_TECH_DISK) if (QDELETED(t_disk)) diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm index 3da8fe4e1c957..1a5a387551178 100644 --- a/code/modules/research/techweb/_techweb.dm +++ b/code/modules/research/techweb/_techweb.dm @@ -317,7 +317,11 @@ var/points_rewarded if(completed_experiment.points_reward) add_point_list(completed_experiment.points_reward) - points_rewarded = ",[refund > 0 ? " and" : ""] rewarding [completed_experiment.get_points_reward_text()]" + points_rewarded = ",[refund > 0 ? " and" : ""] rewarding " + var/list/english_list_keys = list() + for(var/points_type in completed_experiment.points_reward) + english_list_keys += "[completed_experiment.points_reward[points_type]] [points_type]" + points_rewarded += "[english_list(english_list_keys)] points" result_text += points_rewarded result_text += "!" @@ -361,10 +365,10 @@ return TRUE -/datum/techweb/proc/research_node_id(id, force, auto_update_points, get_that_dosh_id, atom/research_source) - return research_node(SSresearch.techweb_node_by_id(id), force, auto_update_points, get_that_dosh_id, research_source) +/datum/techweb/proc/research_node_id(id, force, auto_update_points, get_that_dosh_id) + return research_node(SSresearch.techweb_node_by_id(id), force, auto_update_points, get_that_dosh_id) -/datum/techweb/proc/research_node(datum/techweb_node/node, force = FALSE, auto_adjust_cost = TRUE, get_that_dosh = TRUE, atom/research_source) +/datum/techweb/proc/research_node(datum/techweb_node/node, force = FALSE, auto_adjust_cost = TRUE, get_that_dosh = TRUE) if(!istype(node)) return FALSE update_node_status(node) diff --git a/code/modules/research/techweb/_techweb_node.dm b/code/modules/research/techweb/_techweb_node.dm index b6d3bd74d6979..23ad6fd213dba 100644 --- a/code/modules/research/techweb/_techweb_node.dm +++ b/code/modules/research/techweb/_techweb_node.dm @@ -42,12 +42,6 @@ var/show_on_wiki = TRUE /// Hidden Mech nodes unlocked when mech fabricator emaged. var/illegal_mech_node = FALSE - /** - * If set, the researched node will be announced on these channels by an announcement system - * with 'announce_research_node' set to TRUE when researched by the station. - * Not every node has to be announced if you want, some are best kept a little "subtler", like Illegal Weapons. - */ - var/list/announce_channels /datum/techweb_node/error_node id = "ERROR" @@ -115,25 +109,5 @@ return techweb_point_display_generic(get_price(TN)) ///Proc called when the Station (Science techweb specific) researches a node. -/datum/techweb_node/proc/on_station_research(atom/research_source) - SHOULD_CALL_PARENT(TRUE) - var/channels_to_use = announce_channels - if(istype(research_source, /obj/machinery/computer/rdconsole)) - var/obj/machinery/computer/rdconsole/console = research_source - var/obj/item/circuitboard/computer/rdconsole/board = console.circuit - if(board.silence_announcements) - return - if(board.obj_flags & EMAGGED) - channels_to_use = list(RADIO_CHANNEL_COMMON) - if(!length(channels_to_use) || starting_node) - return - var/obj/machinery/announcement_system/system - var/list/available_machines = list() - for(var/obj/machinery/announcement_system/announce as anything in GLOB.announcement_systems) - if(announce.announce_research_node) - available_machines += announce - break - if(!length(available_machines)) - return - system = pick(available_machines) - system.announce(AUTO_ANNOUNCE_NODE, display_name, channels = channels_to_use) +/datum/techweb_node/proc/on_station_research() + SHOULD_CALL_PARENT(FALSE) diff --git a/code/modules/research/techweb/nodes/alien_nodes.dm b/code/modules/research/techweb/nodes/alien_nodes.dm index 331b91bae61ff..58e8dbfc68f1f 100644 --- a/code/modules/research/techweb/nodes/alien_nodes.dm +++ b/code/modules/research/techweb/nodes/alien_nodes.dm @@ -30,7 +30,6 @@ hidden = TRUE /datum/techweb_node/alientech/on_station_research() - . = ..() SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_ALIENTECH] = TRUE /datum/techweb_node/alien_engi @@ -60,7 +59,6 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) hidden = TRUE - announce_channels = list(RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/alien_surgery id = TECHWEB_NODE_ALIEN_SURGERY @@ -101,4 +99,3 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) discount_experiments = list(/datum/experiment/scanning/points/slime/hard = TECHWEB_TIER_5_POINTS) hidden = TRUE - announce_channels = list(RADIO_CHANNEL_MEDICAL) diff --git a/code/modules/research/techweb/nodes/atmos_nodes.dm b/code/modules/research/techweb/nodes/atmos_nodes.dm index a61a6a6b094c1..f1ec74b50f482 100644 --- a/code/modules/research/techweb/nodes/atmos_nodes.dm +++ b/code/modules/research/techweb/nodes/atmos_nodes.dm @@ -48,7 +48,6 @@ /datum/experiment/ordnance/gaseous/bz, /datum/experiment/ordnance/gaseous/noblium, ) - announce_channels = list(RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/plasma_control id = TECHWEB_NODE_PLASMA_CONTROL @@ -64,7 +63,6 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) required_experiments = list(/datum/experiment/ordnance/gaseous/plasma) - announce_channels = list(RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/fusion id = TECHWEB_NODE_FUSION @@ -86,7 +84,6 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) discount_experiments = list(/datum/experiment/ordnance/gaseous/nitrous_oxide = TECHWEB_TIER_3_POINTS) - announce_channels = list(RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/exp_tools id = TECHWEB_NODE_EXP_TOOLS @@ -108,7 +105,6 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) discount_experiments = list(/datum/experiment/ordnance/gaseous/bz = TECHWEB_TIER_4_POINTS) - announce_channels = list(RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/rcd_upgrade id = TECHWEB_NODE_RCD_UPGRADE @@ -126,4 +122,3 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) discount_experiments = list(/datum/experiment/ordnance/gaseous/noblium = TECHWEB_TIER_5_POINTS) - announce_channels = list(RADIO_CHANNEL_ENGINEERING) diff --git a/code/modules/research/techweb/nodes/bepis_nodes.dm b/code/modules/research/techweb/nodes/bepis_nodes.dm index f477569aea5a3..baefd8c11d048 100644 --- a/code/modules/research/techweb/nodes/bepis_nodes.dm +++ b/code/modules/research/techweb/nodes/bepis_nodes.dm @@ -1,5 +1,3 @@ -//Nodes that are found inside Bepis Disks. - /datum/techweb_node/light_apps id = TECHWEB_NODE_LIGHT_APPS display_name = "Illumination Applications" @@ -12,7 +10,6 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) hidden = TRUE experimental = TRUE - announce_channels = list(RADIO_CHANNEL_COMMON) /datum/techweb_node/extreme_office id = TECHWEB_NODE_EXTREME_OFFICE @@ -25,7 +22,6 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) hidden = TRUE experimental = TRUE - announce_channels = list(RADIO_CHANNEL_COMMON) /datum/techweb_node/spec_eng id = TECHWEB_NODE_SPEC_ENG @@ -38,7 +34,6 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) hidden = TRUE experimental = TRUE - announce_channels = list(RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/aus_security id = TECHWEB_NODE_AUS_SECURITY @@ -51,7 +46,6 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) hidden = TRUE experimental = TRUE - announce_channels = list(RADIO_CHANNEL_SECURITY) /datum/techweb_node/interrogation id = TECHWEB_NODE_INTERROGATION @@ -64,7 +58,6 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) hidden = TRUE experimental = TRUE - announce_channels = list(RADIO_CHANNEL_SECURITY) /datum/techweb_node/sticky_advanced id = TECHWEB_NODE_STICKY_ADVANCED @@ -77,7 +70,6 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) hidden = TRUE experimental = TRUE - announce_channels = list(RADIO_CHANNEL_COMMON) /datum/techweb_node/tackle_advanced id = TECHWEB_NODE_TACKLE_ADVANCED @@ -91,7 +83,6 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) hidden = TRUE experimental = TRUE - announce_channels = list(RADIO_CHANNEL_SECURITY) /datum/techweb_node/mod_experimental id = TECHWEB_NODE_MOD_EXPERIMENTAL @@ -106,7 +97,6 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) hidden = TRUE experimental = TRUE - announce_channels = list(RADIO_CHANNEL_COMMON) /datum/techweb_node/posisphere id = TECHWEB_NODE_POSITRONIC_SPHERE @@ -118,4 +108,3 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) hidden = TRUE experimental = TRUE - announce_channels = list(RADIO_CHANNEL_SCIENCE) diff --git a/code/modules/research/techweb/nodes/biology_nodes.dm b/code/modules/research/techweb/nodes/biology_nodes.dm index 25f9163ab48c4..7b553445a9c2a 100644 --- a/code/modules/research/techweb/nodes/biology_nodes.dm +++ b/code/modules/research/techweb/nodes/biology_nodes.dm @@ -14,7 +14,6 @@ "mod_reagent_scanner", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) - announce_channels = list(RADIO_CHANNEL_MEDICAL) /datum/techweb_node/cytology id = TECHWEB_NODE_CYTOLOGY @@ -61,7 +60,6 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) discount_experiments = list(/datum/experiment/scanning/people/mutant = TECHWEB_TIER_4_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE) // Botany root node /datum/techweb_node/botany_equip @@ -90,7 +88,6 @@ "portaseeder", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) - announce_channels = list(RADIO_CHANNEL_SERVICE) /datum/techweb_node/selection id = TECHWEB_NODE_SELECTION @@ -104,4 +101,3 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) required_experiments = list(/datum/experiment/scanning/random/plants/wild) discount_experiments = list(/datum/experiment/scanning/random/plants/traits = TECHWEB_TIER_3_POINTS) - announce_channels = list(RADIO_CHANNEL_SERVICE) diff --git a/code/modules/research/techweb/nodes/cyborg_nodes.dm b/code/modules/research/techweb/nodes/cyborg_nodes.dm index eeeed268be552..8a9d09807d627 100644 --- a/code/modules/research/techweb/nodes/cyborg_nodes.dm +++ b/code/modules/research/techweb/nodes/cyborg_nodes.dm @@ -44,7 +44,6 @@ "borg_upgrade_restart", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/borg_service id = TECHWEB_NODE_BORG_SERVICES @@ -60,7 +59,6 @@ "borg_upgrade_service_cookbook", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/borg_mining id = TECHWEB_NODE_BORG_MINING @@ -73,7 +71,6 @@ "borg_upgrade_diamonddrill", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/borg_medical id = TECHWEB_NODE_BORG_MEDICAL @@ -90,7 +87,6 @@ "borg_upgrade_surgicalomnitool", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/borg_utility id = TECHWEB_NODE_BORG_UTILITY @@ -109,7 +105,6 @@ "borg_upgrade_trashofholding", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/borg_utility/New() . = ..() @@ -128,7 +123,6 @@ "borg_upgrade_inducer", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE) // Implants root node /datum/techweb_node/passive_implants @@ -150,7 +144,6 @@ "c38_trac", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) - announce_channels = list(RADIO_CHANNEL_SECURITY, RADIO_CHANNEL_MEDICAL) /datum/techweb_node/cyber/cyber_implants id = TECHWEB_NODE_CYBER_IMPLANTS @@ -164,7 +157,6 @@ "ci-herculean", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL) /datum/techweb_node/cyber/New() ..() @@ -182,7 +174,6 @@ "ci-antistun", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL) /datum/techweb_node/cyber/integrated_toolsets id = TECHWEB_NODE_INTERGRATED_TOOLSETS @@ -195,7 +186,6 @@ "ci-surgery", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL) /datum/techweb_node/cyber/cyber_organs id = TECHWEB_NODE_CYBER_ORGANS @@ -212,7 +202,6 @@ "cybernetic_heart_tier2", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL) /datum/techweb_node/cyber/cyber_organs_upgraded id = TECHWEB_NODE_CYBER_ORGANS_UPGRADED @@ -232,7 +221,6 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) required_experiments = list(/datum/experiment/scanning/people/augmented_organs) - announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL) /datum/techweb_node/cyber/cyber_organs_adv id = TECHWEB_NODE_CYBER_ORGANS_ADV @@ -248,4 +236,3 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) discount_experiments = list(/datum/experiment/scanning/people/android = TECHWEB_TIER_5_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL) diff --git a/code/modules/research/techweb/nodes/engi_nodes.dm b/code/modules/research/techweb/nodes/engi_nodes.dm index 0d8572130fb80..949b880d1f23a 100644 --- a/code/modules/research/techweb/nodes/engi_nodes.dm +++ b/code/modules/research/techweb/nodes/engi_nodes.dm @@ -42,7 +42,6 @@ "super_cell", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) - announce_channels = list(RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/parts_adv id = TECHWEB_NODE_PARTS_ADV @@ -60,7 +59,6 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) required_experiments = list(/datum/experiment/scanning/points/machinery_tiered_scan/tier2_any) - announce_channels = list(RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/parts_bluespace @@ -80,7 +78,6 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) discount_experiments = list(/datum/experiment/scanning/points/machinery_tiered_scan/tier3_any = TECHWEB_TIER_4_POINTS) - announce_channels = list(RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/telecomms id = TECHWEB_NODE_TELECOMS @@ -170,7 +167,6 @@ "tray_goggles", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) - announce_channels = list(RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/holographics id = TECHWEB_NODE_HOLOGRAPHICS @@ -215,7 +211,6 @@ "ci-sechud", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) - announce_channels = list(RADIO_CHANNEL_ENGINEERING, RADIO_CHANNEL_SECURITY, RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL) /datum/techweb_node/night_vision id = TECHWEB_NODE_NIGHT_VISION @@ -231,4 +226,3 @@ "security_hud_night", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) - announce_channels = list(RADIO_CHANNEL_ENGINEERING, RADIO_CHANNEL_SECURITY, RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL) diff --git a/code/modules/research/techweb/nodes/mech_nodes.dm b/code/modules/research/techweb/nodes/mech_nodes.dm index 82d6484bf0225..b09957076d712 100644 --- a/code/modules/research/techweb/nodes/mech_nodes.dm +++ b/code/modules/research/techweb/nodes/mech_nodes.dm @@ -36,7 +36,6 @@ "mech_radio", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/mech_clown id = TECHWEB_NODE_MECH_CLOWN @@ -61,7 +60,6 @@ "borg_transform_clown", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_SECURITY) //The dread upon security when they hear this... /datum/techweb_node/mech_medical id = TECHWEB_NODE_MECH_MEDICAL @@ -98,7 +96,6 @@ "clarke_peri", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_SUPPLY) /datum/techweb_node/mech_combat id = TECHWEB_NODE_MECH_COMBAT @@ -115,7 +112,6 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) required_experiments = list(/datum/experiment/scanning/random/mecha_equipped_scan) - announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/mech_assault id = TECHWEB_NODE_MECH_ASSAULT @@ -136,7 +132,6 @@ "durand_targ", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/mech_light id = TECHWEB_NODE_MECH_LIGHT @@ -157,7 +152,6 @@ "gygax_targ", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/mech_heavy id = TECHWEB_NODE_MECH_HEAVY @@ -178,7 +172,6 @@ "savannah_ivanov_targ", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/mech_infiltrator id = TECHWEB_NODE_MECH_INFILTRATOR @@ -199,7 +192,6 @@ "phazon_targ", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/justice id = "mecha_justice" @@ -230,7 +222,6 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) discount_experiments = list(/datum/experiment/scanning/random/mecha_damage_scan = TECHWEB_TIER_4_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/mech_firearms id = TECHWEB_NODE_MECH_FIREARMS @@ -246,7 +237,6 @@ "mech_carbine_ammo", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/mech_heavy_arms id = TECHWEB_NODE_MECH_HEAVY_ARMS @@ -262,7 +252,6 @@ "mech_missile_rack_ammo", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/mech_equip_bluespace id = TECHWEB_NODE_MECH_EQUIP_BLUESPACE @@ -275,4 +264,3 @@ "mech_wormhole_gen", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE) diff --git a/code/modules/research/techweb/nodes/medbay_nodes.dm b/code/modules/research/techweb/nodes/medbay_nodes.dm index 897a2edf18e43..fababbc55e748 100644 --- a/code/modules/research/techweb/nodes/medbay_nodes.dm +++ b/code/modules/research/techweb/nodes/medbay_nodes.dm @@ -60,7 +60,6 @@ "fluid_ducts", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) - announce_channels = list(RADIO_CHANNEL_MEDICAL) /datum/techweb_node/medbay_equip_adv id = TECHWEB_NODE_MEDBAY_EQUIP_ADV @@ -80,7 +79,6 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) required_experiments = list(/datum/experiment/scanning/reagent/haloperidol) - announce_channels = list(RADIO_CHANNEL_MEDICAL) /datum/techweb_node/cryostasis id = TECHWEB_NODE_CRYOSTASIS @@ -96,4 +94,3 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) discount_experiments = list(/datum/experiment/scanning/reagent/cryostylane = TECHWEB_TIER_4_POINTS) - announce_channels = list(RADIO_CHANNEL_MEDICAL) diff --git a/code/modules/research/techweb/nodes/mining_nodes.dm b/code/modules/research/techweb/nodes/mining_nodes.dm index 1bfa3a9284ad5..d8a6539caa3ff 100644 --- a/code/modules/research/techweb/nodes/mining_nodes.dm +++ b/code/modules/research/techweb/nodes/mining_nodes.dm @@ -48,7 +48,6 @@ "mesons", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) - announce_channels = list(RADIO_CHANNEL_SUPPLY) /datum/techweb_node/low_pressure_excavation id = TECHWEB_NODE_LOW_PRESSURE_EXCAVATION @@ -68,7 +67,6 @@ "borg_upgrade_hypermod", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) - announce_channels = list(RADIO_CHANNEL_SUPPLY) /datum/techweb_node/plasma_mining id = TECHWEB_NODE_PLASMA_MINING @@ -80,7 +78,6 @@ "plasmacutter_adv", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) - announce_channels = list(RADIO_CHANNEL_SUPPLY) /datum/techweb_node/bitrunning id = TECHWEB_NODE_BITRUNNING @@ -93,7 +90,6 @@ "netpod", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) - announce_channels = list(RADIO_CHANNEL_SUPPLY) /datum/techweb_node/mining_adv id = TECHWEB_NODE_MINING_ADV @@ -106,4 +102,3 @@ "mech_diamond_drill", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) - announce_channels = list(RADIO_CHANNEL_SUPPLY) diff --git a/code/modules/research/techweb/nodes/modsuit_nodes.dm b/code/modules/research/techweb/nodes/modsuit_nodes.dm index cc31a1fc1ef77..955389f61aeba 100644 --- a/code/modules/research/techweb/nodes/modsuit_nodes.dm +++ b/code/modules/research/techweb/nodes/modsuit_nodes.dm @@ -36,7 +36,6 @@ "mod_sign_radio", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/mod_entertainment id = TECHWEB_NODE_MOD_ENTERTAINMENT @@ -50,7 +49,6 @@ "mod_waddle", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_SERVICE) /datum/techweb_node/mod_medical id = TECHWEB_NODE_MOD_MEDICAL @@ -65,7 +63,6 @@ "mod_patienttransport", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL) /datum/techweb_node/mod_engi id = TECHWEB_NODE_MOD_ENGI @@ -80,7 +77,6 @@ "mod_mister_atmos", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/mod_security id = TECHWEB_NODE_MOD_SECURITY @@ -99,7 +95,6 @@ "mod_criminalcapture", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_SECURITY) /datum/techweb_node/mod_medical_adv id = TECHWEB_NODE_MOD_MEDICAL_ADV @@ -113,7 +108,6 @@ "mod_statusreadout", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL) /datum/techweb_node/mod_engi_adv id = TECHWEB_NODE_MOD_ENGI_ADV @@ -128,7 +122,6 @@ "mod_storage_expanded", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_ENGINEERING) /datum/techweb_node/mod_engi_adv/New() if(HAS_TRAIT(SSstation, STATION_TRAIT_RADIOACTIVE_NEBULA)) //we'll really need the rad protection modsuit module @@ -146,4 +139,3 @@ "mod_kinesis", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE) diff --git a/code/modules/research/techweb/nodes/research_nodes.dm b/code/modules/research/techweb/nodes/research_nodes.dm index f05199ab65e68..b70d9582681ce 100644 --- a/code/modules/research/techweb/nodes/research_nodes.dm +++ b/code/modules/research/techweb/nodes/research_nodes.dm @@ -28,7 +28,6 @@ "bluespace_crystal", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/applied_bluespace id = TECHWEB_NODE_APPLIED_BLUESPACE @@ -50,7 +49,6 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) required_experiments = list(/datum/experiment/scanning/points/bluespace_crystal) - announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL, RADIO_CHANNEL_SERVICE, RADIO_CHANNEL_SUPPLY) /datum/techweb_node/bluespace_travel id = TECHWEB_NODE_BLUESPACE_TRAVEL @@ -69,7 +67,6 @@ "swapper", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/anomaly_research id = TECHWEB_NODE_ANOMALY_RESEARCH @@ -82,7 +79,6 @@ "reactive_armour", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/anomaly_shells id = TECHWEB_NODE_ANOMALY_SHELLS @@ -98,4 +94,3 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) discount_experiments = list(/datum/experiment/scanning/points/anomalies = TECHWEB_TIER_5_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE) diff --git a/code/modules/research/techweb/nodes/robo_nodes.dm b/code/modules/research/techweb/nodes/robo_nodes.dm index 2b43ba0e4257c..ff018e85b7c9a 100644 --- a/code/modules/research/techweb/nodes/robo_nodes.dm +++ b/code/modules/research/techweb/nodes/robo_nodes.dm @@ -51,7 +51,6 @@ "remove_module", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) - announce_channels = list(RADIO_CHANNEL_SCIENCE) /datum/techweb_node/ai/New() . = ..() @@ -69,7 +68,7 @@ /datum/techweb_node/ai_laws id = TECHWEB_NODE_AI_LAWS - display_name = "Advanced AI Upgrades" + display_name = "Advanced AI Laws" 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,7 +93,5 @@ "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/techweb/nodes/security_nodes.dm b/code/modules/research/techweb/nodes/security_nodes.dm index 97d2036207c56..2d3dd63864f25 100644 --- a/code/modules/research/techweb/nodes/security_nodes.dm +++ b/code/modules/research/techweb/nodes/security_nodes.dm @@ -39,8 +39,6 @@ "electropack", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) - announce_channels = list(RADIO_CHANNEL_SECURITY) - /datum/techweb_node/riot_supression id = TECHWEB_NODE_RIOT_SUPRESSION @@ -57,7 +55,6 @@ "bola_energy", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) - announce_channels = list(RADIO_CHANNEL_SECURITY) /datum/techweb_node/explosives id = TECHWEB_NODE_EXPLOSIVES @@ -71,7 +68,6 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) required_experiments = list(/datum/experiment/ordnance/explosive/lowyieldbomb) - announce_channels = list(RADIO_CHANNEL_SECURITY, RADIO_CHANNEL_MEDICAL) /datum/techweb_node/exotic_ammo id = TECHWEB_NODE_EXOTIC_AMMO @@ -85,7 +81,6 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) discount_experiments = list(/datum/experiment/ordnance/explosive/highyieldbomb = TECHWEB_TIER_4_POINTS) - announce_channels = list(RADIO_CHANNEL_SECURITY) /datum/techweb_node/electric_weapons id = TECHWEB_NODE_ELECTRIC_WEAPONS @@ -99,7 +94,6 @@ "lasershell", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) - announce_channels = list(RADIO_CHANNEL_SECURITY) /datum/techweb_node/beam_weapons id = TECHWEB_NODE_BEAM_WEAPONS @@ -111,4 +105,3 @@ "nuclear_gun", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) - announce_channels = list(RADIO_CHANNEL_SECURITY) diff --git a/code/modules/research/techweb/nodes/service_nodes.dm b/code/modules/research/techweb/nodes/service_nodes.dm index a2f6b03007109..3735dc41b3b2c 100644 --- a/code/modules/research/techweb/nodes/service_nodes.dm +++ b/code/modules/research/techweb/nodes/service_nodes.dm @@ -51,7 +51,6 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) discount_experiments = list(/datum/experiment/scanning/random/janitor_trash = TECHWEB_TIER_2_POINTS) - announce_channels = list(RADIO_CHANNEL_SERVICE) /datum/techweb_node/consoles id = TECHWEB_NODE_CONSOLES @@ -79,7 +78,6 @@ "bounty_pad", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) - announce_channels = list(RADIO_CHANNEL_SERVICE) /datum/techweb_node/gaming id = TECHWEB_NODE_GAMING @@ -147,7 +145,6 @@ "roastingstick", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) - announce_channels = list(RADIO_CHANNEL_SERVICE) // Fishing root node /datum/techweb_node/fishing_equip diff --git a/code/modules/research/techweb/nodes/surgery_nodes.dm b/code/modules/research/techweb/nodes/surgery_nodes.dm index 7af1dacf1df91..4be7a3256ac70 100644 --- a/code/modules/research/techweb/nodes/surgery_nodes.dm +++ b/code/modules/research/techweb/nodes/surgery_nodes.dm @@ -20,7 +20,6 @@ "surgery_heal_burn_upgrade", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) - announce_channels = list(RADIO_CHANNEL_MEDICAL) /datum/techweb_node/surgery_adv id = TECHWEB_NODE_SURGERY_ADV @@ -38,7 +37,6 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) required_experiments = list(/datum/experiment/autopsy/human) - announce_channels = list(RADIO_CHANNEL_MEDICAL) /datum/techweb_node/surgery_exp id = TECHWEB_NODE_SURGERY_EXP @@ -69,7 +67,6 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) discount_experiments = list(/datum/experiment/autopsy/nonhuman = TECHWEB_TIER_3_POINTS) - announce_channels = list(RADIO_CHANNEL_MEDICAL) /datum/techweb_node/surgery_tools id = TECHWEB_NODE_SURGERY_TOOLS @@ -83,4 +80,3 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) discount_experiments = list(/datum/experiment/autopsy/xenomorph = TECHWEB_TIER_4_POINTS) - announce_channels = list(RADIO_CHANNEL_MEDICAL) diff --git a/code/modules/research/techweb/techweb_types.dm b/code/modules/research/techweb/techweb_types.dm index 407008b284497..f5532e9e53f9d 100644 --- a/code/modules/research/techweb/techweb_types.dm +++ b/code/modules/research/techweb/techweb_types.dm @@ -6,10 +6,10 @@ organization = "Nanotrasen" should_generate_points = TRUE -/datum/techweb/science/research_node(datum/techweb_node/node, force = FALSE, auto_adjust_cost = TRUE, get_that_dosh = TRUE, atom/research_source) +/datum/techweb/science/research_node(datum/techweb_node/node, force = FALSE, auto_adjust_cost = TRUE, get_that_dosh = TRUE) . = ..() if(.) - node.on_station_research(research_source) + node.on_station_research() /datum/techweb/oldstation id = "CHARLIE" diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index 227f1be5165dd..832d266723d13 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -11,7 +11,8 @@ var/originalcolor /datum/status_effect/rainbow_protection/on_apply() - owner.add_traits(list(TRAIT_GODMODE, TRAIT_PACIFISM), TRAIT_STATUS_EFFECT(id)) + owner.status_flags |= GODMODE + ADD_TRAIT(owner, TRAIT_PACIFISM, /datum/status_effect/rainbow_protection) owner.visible_message(span_warning("[owner] shines with a brilliant rainbow light."), span_notice("You feel protected by an unknown force!")) originalcolor = owner.color @@ -22,8 +23,9 @@ return ..() /datum/status_effect/rainbow_protection/on_remove() + owner.status_flags &= ~GODMODE owner.color = originalcolor - owner.remove_traits(list(TRAIT_GODMODE, TRAIT_PACIFISM), TRAIT_STATUS_EFFECT(id)) + REMOVE_TRAIT(owner, TRAIT_PACIFISM, /datum/status_effect/rainbow_protection) owner.visible_message(span_notice("[owner] stops glowing, the rainbow light fading away."), span_warning("You no longer feel protected...")) @@ -104,7 +106,7 @@ RegisterSignal(owner, COMSIG_LIVING_RESIST, PROC_REF(breakCube)) cube = new /obj/structure/ice_stasis(get_turf(owner)) owner.forceMove(cube) - ADD_TRAIT(owner, TRAIT_GODMODE, TRAIT_STATUS_EFFECT(id)) + owner.status_flags |= GODMODE return ..() /datum/status_effect/frozenstasis/tick(seconds_between_ticks) @@ -119,7 +121,7 @@ /datum/status_effect/frozenstasis/on_remove() if(cube) qdel(cube) - REMOVE_TRAIT(owner, TRAIT_GODMODE, TRAIT_STATUS_EFFECT(id)) + owner.status_flags &= ~GODMODE UnregisterSignal(owner, COMSIG_LIVING_RESIST) /datum/status_effect/slime_clone diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 72d79b20ec53f..9a416372a28ae 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, max_length = MAX_MESSAGE_LEN, multiline = TRUE) + potion_reason = tgui_input_text(user, "Enter reason for offering potion", "Intelligence Potion", potion_reason, multiline = TRUE) return CLICK_ACTION_SUCCESS /obj/item/slimepotion/slime/sentience/attack(mob/living/dumb_mob, mob/user) diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index 3cbe494c8d0fb..484fa32ac8777 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -153,10 +153,9 @@ /obj/structure/table/abductor/wabbajack/right desc = "It wakes so you may sleep." -/** - * Bar staff, mobs with the TRAIT_GODMODE trait (as long as they stay in the shuttle) - * that just want to make sure people have drinks and a good shuttle time. - */ +// Bar staff, GODMODE mobs(as long as they stay in the shuttle) that just want to make sure people have drinks +// and a good time. + /mob/living/basic/drone/snowflake/bardrone name = "Bardrone" desc = "A barkeeping drone, a robot built to tend bars." diff --git a/code/modules/spells/spell_types/jaunt/_jaunt.dm b/code/modules/spells/spell_types/jaunt/_jaunt.dm index c4255dc175be4..207a7ed8b5be4 100644 --- a/code/modules/spells/spell_types/jaunt/_jaunt.dm +++ b/code/modules/spells/spell_types/jaunt/_jaunt.dm @@ -25,11 +25,6 @@ return ..() -/datum/action/cooldown/spell/jaunt/PreActivate(atom/target) - if(SEND_SIGNAL(target, COMSIG_MOB_PRE_JAUNT, target) & COMPONENT_BLOCK_JAUNT) - return FALSE - . = ..() - /datum/action/cooldown/spell/jaunt/before_cast(atom/cast_on) return ..() | SPELL_NO_FEEDBACK // Don't do the feedback until after we're jaunting diff --git a/code/modules/spells/spell_types/list_target/telepathy.dm b/code/modules/spells/spell_types/list_target/telepathy.dm index 861fc49732dfc..9d512f5a0b9ac 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]", max_length = MAX_MESSAGE_LEN) + message = tgui_input_text(owner, "What do you wish to whisper to [cast_on]?", "[src]") if(QDELETED(src) || QDELETED(owner) || QDELETED(cast_on) || !can_cast_spell()) return . | SPELL_CANCEL_CAST diff --git a/code/modules/spells/spell_types/self/mime_vow.dm b/code/modules/spells/spell_types/self/mime_vow.dm index 3d1c44dabd608..d4e34880b534d 100644 --- a/code/modules/spells/spell_types/self/mime_vow.dm +++ b/code/modules/spells/spell_types/self/mime_vow.dm @@ -32,6 +32,6 @@ cast_on.log_message("broke [cast_on.p_their()] vow of silence.", LOG_GAME) cast_on.add_mood_event("vow", /datum/mood_event/broken_vow) REMOVE_TRAIT(cast_on, TRAIT_MIMING, "[type]") - var/datum/job/mime/mime_job = SSjob.get_job(JOB_MIME) + var/datum/job/mime/mime_job = SSjob.GetJob(JOB_MIME) mime_job.total_positions += 1 qdel(src) diff --git a/code/modules/spells/spell_types/self/rod_form.dm b/code/modules/spells/spell_types/self/rod_form.dm index 6f26ab167195f..9989c4420c086 100644 --- a/code/modules/spells/spell_types/self/rod_form.dm +++ b/code/modules/spells/spell_types/self/rod_form.dm @@ -138,7 +138,8 @@ our_wizard = WEAKREF(wizard) wizard.forceMove(src) - wizard.add_traits(list(TRAIT_GODMODE, TRAIT_MAGICALLY_PHASED, TRAIT_NO_TRANSFORM), REF(src)) + wizard.status_flags |= GODMODE + wizard.add_traits(list(TRAIT_MAGICALLY_PHASED, TRAIT_NO_TRANSFORM), REF(src)) /** * Eject our current wizard, removing them from the rod @@ -149,7 +150,8 @@ if(QDELETED(wizard)) return - wizard.remove_traits(list(TRAIT_GODMODE, TRAIT_MAGICALLY_PHASED, TRAIT_NO_TRANSFORM), REF(src)) + wizard.status_flags &= ~GODMODE + wizard.remove_traits(list(TRAIT_MAGICALLY_PHASED, TRAIT_NO_TRANSFORM), REF(src)) wizard.forceMove(get_turf(src)) our_wizard = null 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 e7602a214f18f..b1efaabd2a826 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", max_length = MAX_MESSAGE_LEN) + command = tgui_input_text(cast_on, "Speak with the Voice of God", "Command") if(QDELETED(src) || QDELETED(cast_on) || !can_cast_spell()) return . | SPELL_CANCEL_CAST if(!command) diff --git a/code/modules/spells/spell_types/shapeshift/_shape_status.dm b/code/modules/spells/spell_types/shapeshift/_shape_status.dm index 2f8d53eeac203..cffd9804ea588 100644 --- a/code/modules/spells/spell_types/shapeshift/_shape_status.dm +++ b/code/modules/spells/spell_types/shapeshift/_shape_status.dm @@ -174,9 +174,7 @@ var/damage_to_apply = owner.maxHealth * (caster_mob.get_total_damage() / caster_mob.maxHealth) owner.apply_damage(damage_to_apply, source_spell.convert_damage_type, forced = TRUE, spread_damage = TRUE, wound_bonus = CANT_WOUND) - // Only transfer blood if both mobs are supposed to have a blood volume - if (initial(owner.blood_volume) > 0 && initial(caster_mob.blood_volume) > 0 && !HAS_TRAIT(owner, TRAIT_NOBLOOD) && !HAS_TRAIT(caster_mob, TRAIT_NOBLOOD)) - owner.blood_volume = caster_mob.blood_volume + owner.blood_volume = caster_mob.blood_volume for(var/datum/action/bodybound_action as anything in caster_mob.actions) if(bodybound_action.target != caster_mob) @@ -214,9 +212,8 @@ caster_mob.fully_heal(HEAL_DAMAGE) // Remove all of our damage before setting our health to a proportion of the former transformed mob's health var/damage_to_apply = caster_mob.maxHealth * (owner.get_total_damage() / owner.maxHealth) caster_mob.apply_damage(damage_to_apply, source_spell.convert_damage_type, forced = TRUE, spread_damage = TRUE, wound_bonus = CANT_WOUND) - // Only transfer blood if both mobs are supposed to have a blood volume - if (initial(owner.blood_volume) > 0 && initial(caster_mob.blood_volume) > 0 && !HAS_TRAIT(owner, TRAIT_NOBLOOD) && !HAS_TRAIT(caster_mob, TRAIT_NOBLOOD)) - caster_mob.blood_volume = owner.blood_volume + + caster_mob.blood_volume = owner.blood_volume /datum/status_effect/shapechange_mob/from_spell/on_shape_death(datum/source, gibbed) var/datum/action/cooldown/spell/shapeshift/source_spell = source_weakref.resolve() diff --git a/code/modules/surgery/advanced/brainwashing.dm b/code/modules/surgery/advanced/brainwashing.dm index 5509f925cfd10..21870ae57b8df 100644 --- a/code/modules/surgery/advanced/brainwashing.dm +++ b/code/modules/surgery/advanced/brainwashing.dm @@ -65,7 +65,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", max_length = MAX_MESSAGE_LEN) + objective = tgui_input_text(user, "Choose the objective to imprint on your victim's brain", "Brainwashing") 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 2a16c2a4922c1..296f818e58744 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -457,12 +457,11 @@ * 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, wound_clothing = TRUE) +/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) SHOULD_CALL_PARENT(TRUE) var/hit_percent = forced ? 1 : (100-blocked)/100 @@ -470,7 +469,7 @@ return FALSE if (!forced) if(!isnull(owner)) - if (HAS_TRAIT(owner, TRAIT_GODMODE)) + if (owner.status_flags & GODMODE) return FALSE if (SEND_SIGNAL(owner, COMSIG_CARBON_LIMB_DAMAGED, src, brute, burn) & COMPONENT_PREVENT_LIMB_DAMAGE) return FALSE @@ -536,7 +535,7 @@ return // now we have our wounding_type and are ready to carry on with wounds and dealing the actual damage if(wounding_dmg >= WOUND_MINIMUM_DAMAGE && wound_bonus != CANT_WOUND) - check_wounding(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus, attack_direction, damage_source = damage_source, wound_clothing = wound_clothing) + check_wounding(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus, attack_direction, damage_source = damage_source) 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/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index c53443503fdd5..5579cb64d83d5 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -9,7 +9,9 @@ if(!owner || (bodypart_flags & BODYPART_UNREMOVABLE)) return FALSE var/mob/living/carbon/limb_owner = owner - if(HAS_TRAIT(limb_owner, TRAIT_GODMODE) || HAS_TRAIT(limb_owner, TRAIT_NODISMEMBER)) + if(limb_owner.status_flags & GODMODE) + return FALSE + if(HAS_TRAIT(limb_owner, TRAIT_NODISMEMBER)) return FALSE var/obj/item/bodypart/affecting = limb_owner.get_bodypart(BODY_ZONE_CHEST) diff --git a/code/modules/surgery/bodyparts/wounds.dm b/code/modules/surgery/bodyparts/wounds.dm index 66278669d8c64..93d61b091d9c0 100644 --- a/code/modules/surgery/bodyparts/wounds.dm +++ b/code/modules/surgery/bodyparts/wounds.dm @@ -1,8 +1,8 @@ /// 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, wound_clothing) +/obj/item/bodypart/proc/painless_wound_roll(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus, sharpness=NONE) SHOULD_CALL_PARENT(TRUE) - if(!owner || wounding_dmg <= WOUND_MINIMUM_DAMAGE || wound_bonus == CANT_WOUND || HAS_TRAIT(owner, TRAIT_GODMODE)) + if(!owner || wounding_dmg <= WOUND_MINIMUM_DAMAGE || wound_bonus == CANT_WOUND || (owner.status_flags & GODMODE)) return var/mangled_state = get_mangled_state() @@ -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, wound_clothing) + return check_wounding(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus) /** * check_wounding() is where we handle rolling for, selecting, and applying a wound if we meet the criteria @@ -47,13 +47,12 @@ * * 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, wound_clothing) +/obj/item/bodypart/proc/check_wounding(woundtype, damage, wound_bonus, bare_wound_bonus, attack_direction, damage_source) SHOULD_CALL_PARENT(TRUE) RETURN_TYPE(/datum/wound) - if(HAS_TRAIT(owner, TRAIT_NEVER_WOUNDED) || HAS_TRAIT(owner, TRAIT_GODMODE)) + if(HAS_TRAIT(owner, TRAIT_NEVER_WOUNDED) || (owner.status_flags & GODMODE)) return // note that these are fed into an exponent, so these are magnified @@ -73,7 +72,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, wound_clothing) + injury_roll += check_woundings_mods(woundtype, damage, wound_bonus, bare_wound_bonus) var/list/series_wounding_mods = check_series_wounding_mods() if(injury_roll > WOUND_DISMEMBER_OUTRIGHT_THRESH && prob(get_damage() / max_damage * 100) && can_dismember()) @@ -241,7 +240,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, wound_clothing) +/obj/item/bodypart/proc/check_woundings_mods(wounding_type, damage, wound_bonus, bare_wound_bonus) SHOULD_CALL_PARENT(TRUE) var/armor_ablation = 0 @@ -253,12 +252,10 @@ 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) - // 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(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) if(!armor_ablation) injury_mod += bare_wound_bonus diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index c4987ae5c4786..83474363c6cf2 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -85,8 +85,6 @@ if(isnull(step)) return FALSE var/obj/item/tool = user.get_active_held_item() - if(tool) - tool = tool.get_proxy_attacker_for(target, user) if(step.try_op(user, target, user.zone_selected, tool, src, try_to_fail)) return TRUE if(tool && tool.tool_behaviour) //Mechanic organ manipulation isn't done with just surgery tools @@ -213,24 +211,13 @@ if(isnull(chosen_organ)) return SURGERY_STEP_FAIL target_organ = chosen_organ - - if(user && target && user.Adjacent(target)) - //tool check - var/obj/item/held_tool = user.get_active_held_item() - if(held_tool) - held_tool = held_tool.get_proxy_attacker_for(target, user) - if(held_tool != tool) - return SURGERY_STEP_FAIL - - //organ check + if(user && target && user.Adjacent(target) && user.get_active_held_item() == tool) target_organ = organs[target_organ] if(!target_organ) return SURGERY_STEP_FAIL if(target_organ.organ_flags & ORGAN_UNREMOVABLE) to_chat(user, span_warning("[target_organ] is too well connected to take out!")) return SURGERY_STEP_FAIL - - //start operation display_results( user, target, diff --git a/code/modules/surgery/organs/external/_visual_organs.dm b/code/modules/surgery/organs/external/_visual_organs.dm index 74399838f1f6b..a31debceab6b1 100644 --- a/code/modules/surgery/organs/external/_visual_organs.dm +++ b/code/modules/surgery/organs/external/_visual_organs.dm @@ -27,7 +27,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times ///If not null, overrides the appearance with this sprite accessory datum var/sprite_accessory_override -/**accessory_type is optional if you haven't set sprite_datums for the object, and is used mostly to generate sprite_datums from a persons DNA +/**accessory_type is optional if you havent set sprite_datums for the object, and is used mostly to generate sprite_datums from a persons DNA * For _mob_sprite we make a distinction between "Round Snout" and "round". Round Snout is the name of the sprite datum, while "round" would be part of the sprite * I'm sorry */ @@ -263,11 +263,6 @@ Unlike normal organs, we're actually inside a persons limbs at all times /datum/bodypart_overlay/mutant/antennae/get_base_icon_state() return burnt ? burn_datum.icon_state : sprite_datum.icon_state -/datum/bodypart_overlay/mutant/antennae/can_draw_on_bodypart(mob/living/carbon/human/human) - if(!(human.head?.flags_inv & HIDEANTENNAE)) - return TRUE - return FALSE - ///The leafy hair of a podperson /obj/item/organ/external/pod_hair name = "podperson hair" diff --git a/code/modules/surgery/organs/external/restyling.dm b/code/modules/surgery/organs/external/restyling.dm index 097f8b53bd744..f862d9e9c0867 100644 --- a/code/modules/surgery/organs/external/restyling.dm +++ b/code/modules/surgery/organs/external/restyling.dm @@ -1,4 +1,4 @@ -//Contains a bunch of procs for different types, but in the end it just lets you restyle the bodypart overlay so that's why it's here +//Contains a bunch of procs for different types, but in the end it just lets you restyle the bodypart overlay so thats why its here ///Helper proc to fetch a list of styles a player might want to restyle their features into during the round : returns list("Cabbage" = /datum/sprite_accessory/cabbage) /obj/item/organ/proc/get_valid_restyles() @@ -22,7 +22,7 @@ if(src.body_zone == body_zone) INVOKE_ASYNC(src, PROC_REF(attempt_feature_restyle), source, trimmer, original_target, body_zone, restyle_type, style_speed) -///Invoke async so we don't break signals +///Invoke async so we dont break signals /obj/item/bodypart/proc/on_attempt_feature_restyle(atom/source, mob/living/trimmer, atom/movable/original_target, body_zone, restyle_type, style_speed) SIGNAL_HANDLER @@ -41,7 +41,7 @@ target_organ = valid_features[1] if(2 to INFINITY) var/choose_options = list() - var/name_to_organ = list() //literally so I don't have to loop again after someone's made their choice + var/name_to_organ = list() //literally so I dont have to loop again after someones made their choice for(var/obj/item/organ/organ_choice as anything in valid_features) choose_options[organ_choice.name] = image(organ_choice) name_to_organ[organ_choice.name] = organ_choice @@ -56,7 +56,7 @@ target_organ.attempt_feature_restyle(source, trimmer, original_target, body_zone, restyle_type, style_speed) -///Invoke async so we don't break signals +///Invoke async so we dont break signals /obj/item/organ/proc/on_attempt_feature_restyle(atom/source, mob/living/trimmer, atom/movable/original_target, body_zone, restyle_type, style_speed) SIGNAL_HANDLER diff --git a/code/modules/surgery/organs/external/wings/moth_wings.dm b/code/modules/surgery/organs/external/wings/moth_wings.dm index a76b60325ff6d..87b944622aa09 100644 --- a/code/modules/surgery/organs/external/wings/moth_wings.dm +++ b/code/modules/surgery/organs/external/wings/moth_wings.dm @@ -35,7 +35,7 @@ /obj/item/organ/external/wings/moth/proc/update_float_move() SIGNAL_HANDLER - if(can_fly()) + if(!isspaceturf(owner.loc) && !burnt) var/datum/gas_mixture/current = owner.loc.return_air() if(current && (current.return_pressure() >= ONE_ATMOSPHERE*0.85)) //as long as there's reasonable pressure and no gravity, flight is possible ADD_TRAIT(owner, TRAIT_FREE_FLOAT_MOVEMENT, REF(src)) @@ -43,16 +43,6 @@ REMOVE_TRAIT(owner, TRAIT_FREE_FLOAT_MOVEMENT, REF(src)) -///Checks if our wings are usable -/obj/item/organ/external/wings/moth/proc/can_fly() - if(ishuman(owner)) - var/mob/living/carbon/human/human_owner = owner - if(human_owner.wear_suit?.flags_inv & HIDEMUTWINGS) - return FALSE //Can't fly with hidden wings - if(isspaceturf(owner.loc) || burnt) - return FALSE //No flight in space/burnt wings - return TRUE - ///check if our wings can burn off ;_; /obj/item/organ/external/wings/moth/proc/try_burn_wings(mob/living/carbon/human/human) SIGNAL_HANDLER diff --git a/code/modules/surgery/organs/internal/_internal_organ.dm b/code/modules/surgery/organs/internal/_internal_organ.dm index 8b7bd35493127..9f67fb3d89914 100644 --- a/code/modules/surgery/organs/internal/_internal_organ.dm +++ b/code/modules/surgery/organs/internal/_internal_organ.dm @@ -17,7 +17,7 @@ /obj/item/organ/internal/on_mob_remove(mob/living/carbon/organ_owner, special = FALSE) . = ..() - if((organ_flags & ORGAN_VITAL) && !special && !HAS_TRAIT(organ_owner, TRAIT_GODMODE)) + if((organ_flags & ORGAN_VITAL) && !special && !(organ_owner.status_flags & GODMODE)) if(organ_owner.stat != DEAD) organ_owner.investigate_log("has been killed by losing a vital organ ([src]).", INVESTIGATE_DEATHS) organ_owner.death() diff --git a/code/modules/surgery/organs/internal/ears/_ears.dm b/code/modules/surgery/organs/internal/ears/_ears.dm index 9fd0d89adfdd8..53b95b54d9bcf 100644 --- a/code/modules/surgery/organs/internal/ears/_ears.dm +++ b/code/modules/surgery/organs/internal/ears/_ears.dm @@ -64,7 +64,7 @@ * * ddeaf: Handles temporary deafness, 1 ddeaf = 2 seconds of deafness, by default (with no multiplier) */ /obj/item/organ/internal/ears/proc/adjustEarDamage(ddmg = 0, ddeaf = 0) - if(HAS_TRAIT(owner, TRAIT_GODMODE)) + if(owner.status_flags & GODMODE) update_temp_deafness() return @@ -85,7 +85,7 @@ if(isnull(owner)) return - if(HAS_TRAIT(owner, TRAIT_GODMODE)) + if(owner.status_flags & GODMODE) deaf = 0 if(deaf > 0) diff --git a/code/modules/surgery/organs/internal/eyes/_eyes.dm b/code/modules/surgery/organs/internal/eyes/_eyes.dm index 6d7d24631f6a4..e15f3cdf161b5 100644 --- a/code/modules/surgery/organs/internal/eyes/_eyes.dm +++ b/code/modules/surgery/organs/internal/eyes/_eyes.dm @@ -145,19 +145,8 @@ //var/obj/item/bodypart/head/my_head = parent.get_bodypart(BODY_ZONE_HEAD) /// DOPPLER SHIFT REMOVAL if(my_head) if(my_head.head_flags & HEAD_EYECOLOR) - 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 - + eye_right.color = eye_color_right + eye_left.color = eye_color_left 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 4a80f1857a0df..5cdb27942358b 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/lungs/_lungs.dm b/code/modules/surgery/organs/internal/lungs/_lungs.dm index 5f435fff98ebb..9b38803dd7743 100644 --- a/code/modules/surgery/organs/internal/lungs/_lungs.dm +++ b/code/modules/surgery/organs/internal/lungs/_lungs.dm @@ -592,7 +592,7 @@ * * breather: A carbon mob that is using the lungs to breathe. */ /obj/item/organ/internal/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather) - if(HAS_TRAIT(breather, TRAIT_GODMODE)) + if(breather.status_flags & GODMODE) breather.failed_last_breath = FALSE breather.clear_alert(ALERT_NOT_ENOUGH_OXYGEN) return FALSE diff --git a/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm b/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm index 7df01c516a319..887df31e3fff8 100644 --- a/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm +++ b/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm @@ -10,7 +10,7 @@ /obj/item/organ/internal/stomach/ethereal/Initialize(mapload) . = ..() - cell = new /obj/item/stock_parts/power_store/cell/ethereal(src) + cell = new /obj/item/stock_parts/power_store/cell/ethereal(null) /obj/item/organ/internal/stomach/ethereal/Destroy() QDEL_NULL(cell) diff --git a/code/modules/surgery/organs/internal/tongue/_tongue.dm b/code/modules/surgery/organs/internal/tongue/_tongue.dm index 786f93263268b..b7a8a33588d87 100644 --- a/code/modules/surgery/organs/internal/tongue/_tongue.dm +++ b/code/modules/surgery/organs/internal/tongue/_tongue.dm @@ -600,7 +600,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list()) say_mod = "meows" liked_foodtypes = SEAFOOD | ORANGES | BUGS | GORE disliked_foodtypes = GROSS | CLOTH | RAW - organ_traits = list(TRAIT_WOUND_LICKER, TRAIT_FISH_EATER) + organ_traits = list(TRAIT_WOUND_LICKER) /obj/item/organ/internal/tongue/jelly name = "jelly tongue" 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 4ed51e77e42d6..f2d9abae41669 100644 --- a/code/modules/surgery/organs/internal/vocal_cords/_vocal_cords.dm +++ b/code/modules/surgery/organs/internal/vocal_cords/_vocal_cords.dm @@ -60,7 +60,7 @@ . = ..() if(!.) return - var/command = tgui_input_text(owner, "Speak with the Voice of God", "Command", max_length = MAX_MESSAGE_LEN) + var/command = tgui_input_text(owner, "Speak with the Voice of God", "Command") if(!command) return if(QDELETED(src) || QDELETED(owner)) @@ -101,7 +101,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", max_length = MAX_MESSAGE_LEN) + var/message = tgui_input_text(owner, "Resonate a message to all nearby golems", "Resonate") if(!message) return if(QDELETED(src) || QDELETED(owner)) diff --git a/code/modules/surgery/revival.dm b/code/modules/surgery/revival.dm index 5ade25890ecb6..e0111feb52231 100644 --- a/code/modules/surgery/revival.dm +++ b/code/modules/surgery/revival.dm @@ -47,13 +47,6 @@ 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.dm b/code/modules/surgery/surgery.dm index d23267fa326bd..a555548e43268 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -124,8 +124,6 @@ if(isnull(step)) return FALSE var/obj/item/tool = user.get_active_held_item() - if(tool) - tool = tool.get_proxy_attacker_for(target, user) if(step.try_op(user, target, user.zone_selected, tool, src, try_to_fail)) return TRUE if(tool && tool.item_flags & SURGICAL_TOOL) //Just because you used the wrong tool it doesn't mean you meant to whack the patient with it diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 8b20184b38ab0..336e76b4d70c2 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -178,7 +178,7 @@ target.clear_mood_event(SURGERY_MOOD_CATEGORY) //incase they gained the trait mid-surgery. has the added side effect that if someone has a bad surgical memory/mood and gets drunk & goes back to surgery, they'll forget they hated it, which is kinda funny imo. 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 switch(surgery_state) diff --git a/code/modules/tgui_input/say_modal/modal.dm b/code/modules/tgui_input/say_modal/modal.dm index b8087609022e2..bc3f8f314e021 100644 --- a/code/modules/tgui_input/say_modal/modal.dm +++ b/code/modules/tgui_input/say_modal/modal.dm @@ -86,7 +86,7 @@ if(!payload?["channel"]) CRASH("No channel provided to an open TGUI-Say") window_open = TRUE - if(payload["channel"] != OOC_CHANNEL && payload["channel"] != ADMIN_CHANNEL && payload["channel"] != LOOC_CHANNEL) // DOPPLER EDIT CHANGE (Add LOOC_CHANNEL) + if(payload["channel"] != OOC_CHANNEL && payload["channel"] != ADMIN_CHANNEL) start_thinking() if(!client.typing_indicators) log_speech_indicators("[key_name(client)] started typing at [loc_name(client.mob)], indicators DISABLED.") diff --git a/code/modules/tgui_input/say_modal/speech.dm b/code/modules/tgui_input/say_modal/speech.dm index 32d524eb0146a..0d95b855a15ff 100644 --- a/code/modules/tgui_input/say_modal/speech.dm +++ b/code/modules/tgui_input/say_modal/speech.dm @@ -10,7 +10,7 @@ /datum/tgui_say/proc/alter_entry(payload) var/entry = payload["entry"] /// No OOC leaks - if(!entry || payload["channel"] == OOC_CHANNEL || payload["channel"] == ME_CHANNEL || payload["channel"] == LOOC_CHANNEL) // DOPPLER EDIT CHANGE - VERBS + if(!entry || payload["channel"] == OOC_CHANNEL || payload["channel"] == ME_CHANNEL) return pick(hurt_phrases) /// Random trimming for larger sentences if(length(entry) > 50) @@ -47,16 +47,6 @@ if(ADMIN_CHANNEL) SSadmin_verbs.dynamic_invoke_verb(client, /datum/admin_verb/cmd_admin_say, entry) return TRUE - // DOPPLER EDIT ADDITION START - VERBS - if(LOOC_CHANNEL) - client.looc(entry) - return TRUE - if(WHIS_CHANNEL) - client.mob.whisper_verb(entry) - return TRUE - if(DO_CHANNEL) - client.mob.do_verb(entry) - // DOPPLER EDIT ADDITION END return FALSE /** diff --git a/code/modules/tgui_input/text.dm b/code/modules/tgui_input/text.dm index 2476ec163422c..ec94fbd6766ac 100644 --- a/code/modules/tgui_input/text.dm +++ b/code/modules/tgui_input/text.dm @@ -15,7 +15,7 @@ * * encode - Toggling this determines if input is filtered via html_encode. Setting this to FALSE gives raw input. * * timeout - The timeout of the textbox, after which the modal will close and qdel itself. Set to zero for no timeout. */ -/proc/tgui_input_text(mob/user, message = "", title = "Text Input", default, max_length = INFINITY, multiline = FALSE, encode = TRUE, timeout = 0, ui_state = GLOB.always_state) +/proc/tgui_input_text(mob/user, message = "", title = "Text Input", default, max_length = MAX_MESSAGE_LEN, multiline = FALSE, encode = TRUE, timeout = 0, ui_state = GLOB.always_state) if (!user) user = usr if (!istype(user)) diff --git a/code/modules/transport/tram/tram_doors.dm b/code/modules/transport/tram/tram_doors.dm index 6d5231db96c56..653b5cbabb527 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(src, user, TRUE) + try_to_crowbar(null, user, TRUE) return TRUE /** diff --git a/code/modules/transport/tram/tram_floors.dm b/code/modules/transport/tram/tram_floors.dm index ca3d018b48fe3..f267ccf5cdc84 100644 --- a/code/modules/transport/tram/tram_floors.dm +++ b/code/modules/transport/tram/tram_floors.dm @@ -266,7 +266,7 @@ if(atom_integrity >= max_integrity) to_chat(user, span_warning("[src] is already in good condition!")) return ITEM_INTERACT_SUCCESS - if(!tool.tool_start_check(user, amount = 0, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!tool.tool_start_check(user, amount = 0)) return FALSE to_chat(user, span_notice("You begin repairing [src]...")) var/integrity_to_repair = max_integrity - atom_integrity diff --git a/code/modules/transport/tram/tram_structures.dm b/code/modules/transport/tram/tram_structures.dm index 1eed69c84ffb0..368223d11653b 100644 --- a/code/modules/transport/tram/tram_structures.dm +++ b/code/modules/transport/tram/tram_structures.dm @@ -155,7 +155,7 @@ if(atom_integrity >= max_integrity) to_chat(user, span_warning("[src] is already in good condition!")) return ITEM_INTERACT_SUCCESS - if(!tool.tool_start_check(user, amount = 0, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!tool.tool_start_check(user, amount = 0)) return FALSE to_chat(user, span_notice("You begin repairing [src]...")) if(tool.use_tool(src, user, 4 SECONDS, volume = 50)) @@ -579,7 +579,7 @@ return FALSE /obj/structure/tram/spoiler/welder_act(mob/living/user, obj/item/tool) - if(!tool.tool_start_check(user, amount = 1, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!tool.tool_start_check(user, amount = 1)) return FALSE if(atom_integrity >= max_integrity) diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 826edbfdf33f0..95b7f4a4634d8 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -292,9 +292,6 @@ #include "weird_food.dm" #include "wizard_loadout.dm" #include "worn_icons.dm" -// DOPPLER EDIT START -#include "~doppler\automapper.dm" -// DOPPLER EDIT END // END_INCLUDE #ifdef REFERENCE_TRACKING_DEBUG //Don't try and parse this file if ref tracking isn't turned on. IE: don't parse ref tracking please mr linter #include "find_reference_sanity.dm" diff --git a/code/modules/unit_tests/anonymous_themes.dm b/code/modules/unit_tests/anonymous_themes.dm index 99cd4f82802ac..a58f60eab3bd7 100644 --- a/code/modules/unit_tests/anonymous_themes.dm +++ b/code/modules/unit_tests/anonymous_themes.dm @@ -12,7 +12,7 @@ client.prefs.write_preference(GLOB.preference_entries[/datum/preference/name/real_name], "Prefs Biddle") - human.apply_prefs_job(client, SSjob.get_job_type(/datum/job/assistant)) + human.apply_prefs_job(client, SSjob.GetJobType(/datum/job/assistant)) TEST_ASSERT_NOTEQUAL(human.real_name, "Prefs Biddle", "apply_prefs_job didn't randomize human name with an anonymous theme") TEST_ASSERT_EQUAL(client.prefs.read_preference(/datum/preference/name/real_name), "Prefs Biddle", "Anonymous theme overrode original prefs") diff --git a/code/modules/unit_tests/dummy_spawn.dm b/code/modules/unit_tests/dummy_spawn.dm index 6ec59eaaa506c..ed359f962b7d0 100644 --- a/code/modules/unit_tests/dummy_spawn.dm +++ b/code/modules/unit_tests/dummy_spawn.dm @@ -16,7 +16,7 @@ /datum/unit_test/dummy_spawn_outfit/Run() var/mob/living/carbon/human/dummy/lad = allocate(/mob/living/carbon/human/dummy) for(var/datum/job/one_two_three as anything in subtypesof(/datum/job)) - var/datum/job/can_you_hear_this = SSjob.get_job_type(one_two_three) + var/datum/job/can_you_hear_this = SSjob.GetJobType(one_two_three) if(!can_you_hear_this) log_test("\tJob type [one_two_three] could not be retrieved from SSjob") continue diff --git a/code/modules/unit_tests/fish_unit_tests.dm b/code/modules/unit_tests/fish_unit_tests.dm index 809bf60d230a8..2fb2487f7810d 100644 --- a/code/modules/unit_tests/fish_unit_tests.dm +++ b/code/modules/unit_tests/fish_unit_tests.dm @@ -1,5 +1,4 @@ #define TRAIT_FISH_TESTING "made_you_read_this" -#define FISH_REAGENT_AMOUNT (10 * FISH_WEIGHT_GRIND_TO_BITE_MULT) ///Ensures that all fish have an aquarium icon state and that sprite_width and sprite_height have been set. /datum/unit_test/fish_aquarium_icons @@ -21,26 +20,11 @@ /datum/unit_test/fish_size_weight /datum/unit_test/fish_size_weight/Run() - - var/obj/structure/table/table = allocate(/obj/structure/table) - var/obj/item/fish/testdummy/fish = new /obj/item/fish/testdummy (table.loc) - allocated += fish - var/datum/reagent/reagent = fish.reagents?.has_reagent(/datum/reagent/fishdummy) - TEST_ASSERT(reagent, "the test fish doesn't have the test reagent.[fish.reagents ? "" : " It doesn't even have a reagent holder."]") - var/expected_units = FISH_REAGENT_AMOUNT * fish.weight / FISH_WEIGHT_BITE_DIVISOR - TEST_ASSERT_EQUAL(reagent.volume, expected_units, "the test fish has [reagent.volume] units of the test reagent when it should have [expected_units]") + var/obj/item/fish/fish = allocate(/obj/item/fish/testdummy) + TEST_ASSERT_EQUAL(fish.grind_results[/datum/reagent], 20, "the test fish has [fish.grind_results[/datum/reagent]] units of reagent when it should have 20") TEST_ASSERT_EQUAL(fish.w_class, WEIGHT_CLASS_BULKY, "the test fish has w_class of [fish.w_class] when it should have been [WEIGHT_CLASS_BULKY]") - var/mob/living/carbon/human/consistent/chef = allocate(/mob/living/carbon/human/consistent) - var/obj/item/knife/kitchen/blade = allocate(/obj/item/knife/kitchen) - var/fish_fillet_type = fish.fillet_type - var/expected_num_fillets = fish.expected_num_fillets - blade.melee_attack_chain(chef, fish) - var/counted_fillets = 0 - for(var/atom/movable/content as anything in table.loc.contents) - if(istype(content, fish_fillet_type)) - counted_fillets++ - allocated += content - TEST_ASSERT_EQUAL(counted_fillets, expected_num_fillets, "the test fish yielded [counted_fillets] fillets when it should have been [expected_num_fillets]") + var/expected_num_fillets = round(FISH_SIZE_BULKY_MAX / FISH_FILLET_NUMBER_SIZE_DIVISOR * 2, 1) + TEST_ASSERT_EQUAL(fish.num_fillets, expected_num_fillets, "the test fish has [fish.num_fillets] number of fillets when it should have [expected_num_fillets]") ///Checks that fish breeding works correctly. /datum/unit_test/fish_breeding @@ -83,7 +67,7 @@ /datum/unit_test/fish_scanning/Run() var/scannable_fishes = 0 for(var/obj/item/fish/fish_prototype as anything in subtypesof(/obj/item/fish)) - if(initial(fish_prototype.fish_flags) & FISH_FLAG_EXPERIMENT_SCANNABLE) + if(initial(fish_prototype.experisci_scannable)) scannable_fishes++ for(var/datum/experiment/scanning/fish/fish_scan as anything in typesof(/datum/experiment/scanning/fish)) fish_scan = new fish_scan @@ -100,12 +84,6 @@ fish_traits = list(/datum/fish_trait/dummy) stable_population = INFINITY breeding_timeout = 0 - fish_flags = parent_type::fish_flags & ~(FISH_FLAG_SHOW_IN_CATALOG|FISH_FLAG_EXPERIMENT_SCANNABLE) - var/expected_num_fillets = 0 //used to know how many fillets should be gotten out of this fish - -/obj/item/fish/testdummy/add_fillet_type() - expected_num_fillets = ..() - return expected_num_fillets /obj/item/fish/testdummy/two fish_traits = list(/datum/fish_trait/dummy/two) @@ -114,7 +92,7 @@ incompatible_traits = list(/datum/fish_trait/dummy/two) inheritability = 100 diff_traits_inheritability = 100 - reagents_to_add = list(/datum/reagent/fishdummy = FISH_REAGENT_AMOUNT) + reagents_to_add = list(/datum/reagent = 10) /datum/fish_trait/dummy/apply_to_fish(obj/item/fish/fish) . = ..() @@ -123,10 +101,6 @@ /datum/fish_trait/dummy/two incompatible_traits = list(/datum/fish_trait/dummy) -/datum/reagent/fishdummy - name = "fish test reagent" - description = "It smells fishy." - /obj/structure/aquarium/traits allow_breeding = TRUE var/obj/item/fish/testdummy/crossbreeder/crossbreeder @@ -190,54 +164,6 @@ . = ..() probability = 0 //works around the global list initialization skipping abstract/impossible evolutions. -///A test that checks that fishing portals can be linked and function as expected -/datum/unit_test/fish_portal_gen_linking - -/datum/unit_test/fish_portal_gen_linking/Run() - var/mob/living/carbon/human/consistent/user = allocate(/mob/living/carbon/human/consistent) - var/obj/machinery/fishing_portal_generator/portal = allocate(/obj/machinery/fishing_portal_generator/no_power) - var/obj/structure/toilet/unit_test/fishing_spot = new(get_turf(user)) //This is deleted during the test - var/obj/structure/moisture_trap/extra_spot = allocate(/obj/structure/moisture_trap) - var/obj/machinery/hydroponics/constructable/inaccessible = allocate(/obj/machinery/hydroponics/constructable) - ADD_TRAIT(inaccessible, TRAIT_UNLINKABLE_FISHING_SPOT, INNATE_TRAIT) - var/obj/item/multitool/tool = allocate(/obj/item/multitool) - var/datum/fish_source/toilet/fish_source = GLOB.preset_fish_sources[/datum/fish_source/toilet] - - portal.max_fishing_spots = 1 //We've no scrying orb to know if it'll be buffed or nerfed this in the future. We only have space for one here. - portal.activate(fish_source, user) - TEST_ASSERT(!portal.active, "[portal] was activated with a fish source from an unlinked fishing spot") - portal.multitool_act(user, tool) - TEST_ASSERT_EQUAL(tool.buffer, portal, "[portal] wasn't set as buffer for [tool]") - tool.melee_attack_chain(user, fishing_spot) - TEST_ASSERT_EQUAL(LAZYACCESS(portal.linked_fishing_spots, fishing_spot), fish_source, "We tried linking [portal] to the fishing spot but didn't succeed.") - portal.activate(fish_source, user) - TEST_ASSERT(portal.active?.fish_source == fish_source, "[portal] can't acces a fish source from a linked fishing spot") - //Let's move the fishing spot away. This is fine as long as the portal moves to another z level, away from the toilet - var/turf/other_z_turf = pick(GLOB.newplayer_start) - portal.forceMove(other_z_turf) - TEST_ASSERT(!portal.active, "[portal] (not upgraded) is still active though the fishing spot is on another z-level.[portal.z == fishing_spot.z ? " Actually they're still on the same level!" : ""]") - portal.long_range_link = TRUE - portal.activate(fish_source, user) - TEST_ASSERT(portal.active?.fish_source == fish_source, "[portal] can't acces a fish source from a linked fishing spot on a different z-level despite being upgraded") - fishing_spot.forceMove(other_z_turf) - portal.forceMove(get_turf(user)) - TEST_ASSERT(portal.active?.fish_source == fish_source, "[portal] (upgraded) deactivated while changing z-level") - tool.melee_attack_chain(user, extra_spot) - TEST_ASSERT_EQUAL(length(portal.linked_fishing_spots), 1, "We managed to link to another fishing spot when there's only space for one") - TEST_ASSERT_EQUAL(LAZYACCESS(portal.linked_fishing_spots, fishing_spot), fish_source, "linking to another fishing spot fouled up the other linked spots") - QDEL_NULL(fishing_spot) - TEST_ASSERT(!portal.active, "[portal] is still linked to the fish source of the deleted fishing spot it's associated to") - tool.melee_attack_chain(user, inaccessible) - TEST_ASSERT(!length(portal.linked_fishing_spots), "We managed to link to an unlinkable fishing spot") - -/obj/machinery/fishing_portal_generator/no_power - use_power = NO_POWER_USE - -/obj/structure/toilet/unit_test/Initialize(mapload) - . = ..() - if(!HAS_TRAIT(src, TRAIT_FISHING_SPOT)) //Ensure this toilet has a fishing spot because only maploaded ones have it. - AddElement(/datum/element/lazy_fishing_spot, /datum/fish_source/toilet) - // we want no default spawns in this unit test /datum/chasm_detritus/restricted/bodies/no_defaults default_contents_chance = 0 @@ -345,113 +271,23 @@ 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 +/datum/unit_test/explosive_fishing -/datum/unit_test/fish_sources/Run() - var/datum/fish_source/source = GLOB.preset_fish_sources[/datum/fish_source/unit_test_explosive] +/datum/unit_test/explosive_fishing/Run() + var/datum/fish_source/source = GLOB.preset_fish_sources[/datum/fish_source/unit_test] source.spawn_reward_from_explosion(run_loc_floor_bottom_left, 1) if(source.fish_counts[/obj/item/wrench]) TEST_FAIL("The unit test item wasn't removed/spawned from fish_table during 'spawn_reward_from_explosion'.") - ///From here, we check that the profound_fisher as well as fish source procs for rolling rewards don't fail. - source = GLOB.preset_fish_sources[/datum/fish_source/unit_test_profound_fisher] - run_loc_floor_bottom_left.AddElement(/datum/element/lazy_fishing_spot, /datum/fish_source/unit_test_profound_fisher) - var/mob/living/basic/fisher = allocate(/mob/living/basic) - fisher.AddComponent(/datum/component/profound_fisher) - fisher.set_combat_mode(FALSE) - fisher.melee_attack(run_loc_floor_bottom_left, ignore_cooldown = TRUE) - if(source.fish_counts[/obj/item/fish/testdummy] != 1) - TEST_FAIL("The unit test profound fisher didn't catch the test fish on a lazy fishing spot (element)") - - ///For good measure, let's try it again, but with the component this time, and a human mob and gloves - run_loc_floor_bottom_left.RemoveElement(/datum/element/lazy_fishing_spot, /datum/fish_source/unit_test_profound_fisher) - var/datum/component/comp = run_loc_floor_bottom_left.AddComponent(/datum/component/fishing_spot, source) - var/mob/living/carbon/human/consistent/angler = allocate(/mob/living/carbon/human/consistent) - var/obj/item/clothing/gloves/noodling = allocate(/obj/item/clothing/gloves) - noodling.AddComponent(/datum/component/profound_fisher) - angler.equip_to_slot(noodling, ITEM_SLOT_GLOVES) - - angler.UnarmedAttack(run_loc_floor_bottom_left, proximity_flag = TRUE) - if(source.fish_counts[/obj/item/fish/testdummy]) - TEST_FAIL("The unit test profound fisher didn't catch the test fish on a fishing spot (component)") - qdel(comp) - - ///As a final test, let's see how it goes with a fish source containing every single fish subtype. - comp = run_loc_floor_bottom_left.AddComponent(/datum/component/fishing_spot, GLOB.preset_fish_sources[/datum/fish_source/unit_test_all_fish]) - fisher.melee_attack(run_loc_floor_bottom_left, ignore_cooldown = TRUE) - qdel(comp) - -/datum/fish_source/unit_test_explosive +/datum/fish_source/unit_test fish_table = list( /obj/item/wrench = 1, - /obj/item/screwdriver = INFINITY, //infinite weight, so if fish counts doesn't work as intended, this'll be always picked. + /obj/item/screwdriver = INFINITY, ) fish_counts = list( /obj/item/wrench = 1, - /obj/item/screwdriver = 0, //this should never be picked. + /obj/item/screwdriver = 0, ) -/datum/fish_source/unit_test_profound_fisher - fish_table = list(/obj/item/fish/testdummy = 1) - fish_counts = list(/obj/item/fish/testdummy = 2) - -/datum/fish_source/unit_test_all_fish - -/datum/fish_source/unit_test_all_fish/New() - for(var/fish_type as anything in subtypesof(/obj/item/fish)) - fish_table[fish_type] = 10 - return ..() - -/datum/unit_test/edible_fish - -/datum/unit_test/edible_fish/Run() - var/obj/item/fish/fish = allocate(/obj/item/fish/testdummy/food) - var/datum/component/edible/edible = fish.GetComponent(/datum/component/edible) - TEST_ASSERT(edible, "Fish is not edible") - edible.eat_time = 0 - TEST_ASSERT(fish.GetComponent(/datum/component/infective), "Fish doesn't have the infective component") - var/bite_size = edible.bite_consumption - - var/mob/living/carbon/human/consistent/gourmet = allocate(/mob/living/carbon/human/consistent) - - var/food_quality = edible.get_perceived_food_quality(gourmet) - TEST_ASSERT(food_quality < 0, "Humans don't seem to dislike raw, unprocessed fish when they should") - ADD_TRAIT(gourmet, TRAIT_FISH_EATER, TRAIT_FISH_TESTING) - food_quality = edible.get_perceived_food_quality(gourmet) - TEST_ASSERT(food_quality >= LIKED_FOOD_QUALITY_CHANGE, "mobs with the TRAIT_FISH_EATER traits don't seem to like fish when they should") - REMOVE_TRAIT(gourmet, TRAIT_FISH_EATER, TRAIT_FISH_TESTING) - - fish.attack(gourmet, gourmet) - TEST_ASSERT(gourmet.has_reagent(/datum/reagent/consumable/nutriment/protein), "Human doesn't have ingested protein after eating fish") - TEST_ASSERT(gourmet.has_reagent(/datum/reagent/blood), "Human doesn't have ingested blood after eating fish") - TEST_ASSERT(gourmet.has_reagent(/datum/reagent/fishdummy), "Human doesn't have the reagent from /datum/fish_trait/dummy after eating fish") - - TEST_ASSERT_EQUAL(fish.status, FISH_DEAD, "The fish is not dead, despite having sustained enough damage that it should. health: [fish.health]") - - var/obj/item/organ/internal/stomach/belly = gourmet.get_organ_slot(ORGAN_SLOT_STOMACH) - belly.reagents.clear_reagents() - - fish.set_status(FISH_ALIVE) - TEST_ASSERT(!fish.bites_amount, "bites_amount wasn't reset after the fish revived") - - fish.update_size_and_weight(fish.size, FISH_WEIGHT_BITE_DIVISOR) - fish.AddElement(/datum/element/fried_item, FISH_SAFE_COOKING_DURATION) - TEST_ASSERT_EQUAL(fish.status, FISH_DEAD, "The fish didn't die after being cooked") - TEST_ASSERT(bite_size < edible.bite_consumption, "The bite_consumption value hasn't increased after being cooked (it removes blood but doubles protein). Value: [bite_size]") - TEST_ASSERT(!(edible.foodtypes & (RAW|GORE)), "Fish still has the GORE and/or RAW foodtypes flags after being cooked") - TEST_ASSERT(!fish.GetComponent(/datum/component/infective), "Fish still has the infective component after being cooked for long enough") - - - food_quality = edible.get_perceived_food_quality(gourmet) - TEST_ASSERT(food_quality >= 0, "Humans still dislike fish, even when it's cooked") - fish.attack(gourmet, gourmet) - TEST_ASSERT(!gourmet.has_reagent(/datum/reagent/blood), "Human has ingested blood from eating a fish when it shouldn't since the fish has been cooked") - - TEST_ASSERT(QDELETED(fish), "The fish is not being deleted, despite having sustained enough bites. Reagents volume left: [fish.reagents.total_volume]") - -/obj/item/fish/testdummy/food - average_weight = FISH_WEIGHT_BITE_DIVISOR * 2 //One bite, it's death; the other, it's gone. - -#undef FISH_REAGENT_AMOUNT #undef TRAIT_FISH_TESTING diff --git a/code/modules/unit_tests/mob_damage.dm b/code/modules/unit_tests/mob_damage.dm index 7496eb644344c..64b12b8f477e8 100644 --- a/code/modules/unit_tests/mob_damage.dm +++ b/code/modules/unit_tests/mob_damage.dm @@ -289,8 +289,8 @@ /datum/unit_test/mob_damage/proc/test_godmode(mob/living/carbon/human/consistent/dummy) // Heal up, so that errors from the previous tests we won't cause this one to fail dummy.fully_heal(HEAL_DAMAGE) - // add godmode - ADD_TRAIT(dummy, TRAIT_GODMODE, TRAIT_GENERIC) + // flip godmode bit to 1 + dummy.status_flags ^= GODMODE // Apply 9 damage and then heal it if(!test_apply_damage(dummy, amount = 9, expected = 0)) @@ -306,8 +306,8 @@ if(!test_apply_damage(dummy, amount = -11, forced = TRUE)) TEST_FAIL("ABOVE FAILURE: failed test_godmode! godmode did not respect forced = TRUE") - // remove godmode - REMOVE_TRAIT(dummy, TRAIT_GODMODE, TRAIT_GENERIC) + // flip godmode bit back to 0 + dummy.status_flags ^= GODMODE /// Testing biotypes /datum/unit_test/mob_damage/proc/test_biotypes(mob/living/carbon/human/consistent/dummy) diff --git a/code/modules/unit_tests/security_officer_distribution.dm b/code/modules/unit_tests/security_officer_distribution.dm index 05d62eeab351c..e268aab709f38 100644 --- a/code/modules/unit_tests/security_officer_distribution.dm +++ b/code/modules/unit_tests/security_officer_distribution.dm @@ -68,7 +68,7 @@ var/mob/living/carbon/human/new_character = allocate(/mob/living/carbon/human/consistent) new_character.mind_initialize() - new_character.mind.set_assigned_role(SSjob.get_job_type(/datum/job/security_officer)) + new_character.mind.set_assigned_role(SSjob.GetJobType(/datum/job/security_officer)) new_player.new_character = new_character new_player.mock_client = mock_client diff --git a/code/modules/unit_tests/stack_singular_name.dm b/code/modules/unit_tests/stack_singular_name.dm index 0d043c588e6ee..739efb54d6a4b 100644 --- a/code/modules/unit_tests/stack_singular_name.dm +++ b/code/modules/unit_tests/stack_singular_name.dm @@ -1,12 +1,12 @@ /** * Goes through every subtype of /obj/item/stack to check for a singular name, var/singular_name. - * Everything within the blacklist does not need to be tested because it exists to be overridden. + * Everything within the blacklist does not need to be tested because it exists to be overriden. * This test will fail if a subtype of /obj/item/stack is missing a singular name. */ /datum/unit_test/stack_singular_name /datum/unit_test/stack_singular_name/Run() - var/list/blacklist = list( // all of these are generally parents that exist to be overridden; ex. /obj/item/stack/license_plates exists to branch into /filled and /empty + var/list/blacklist = list( // all of these are generally parents that exist to be overriden; ex. /obj/item/stack/license_plates exists to branch into /filled and /empty /obj/item/stack/sheet, /obj/item/stack/sheet/mineral, /obj/item/stack/license_plates, diff --git a/code/modules/unit_tests/strange_reagent.dm b/code/modules/unit_tests/strange_reagent.dm index bcdf89f0a9c8c..e5e385b86fd6d 100644 --- a/code/modules/unit_tests/strange_reagent.dm +++ b/code/modules/unit_tests/strange_reagent.dm @@ -24,7 +24,7 @@ var/is_basic = istype(target, /mob/living/basic) var/is_simple = istype(target, /mob/living/simple_animal) // check some basic stuff - if(HAS_TRAIT(target, TRAIT_GODMODE)) + if(target.status_flags & GODMODE) continue if(!(target.mob_biotypes & MOB_ORGANIC)) continue diff --git a/code/modules/unit_tests/traitor.dm b/code/modules/unit_tests/traitor.dm index 974888b3a0df4..012370d935643 100644 --- a/code/modules/unit_tests/traitor.dm +++ b/code/modules/unit_tests/traitor.dm @@ -11,7 +11,7 @@ possible_jobs += rank for(var/job_name in possible_jobs) - var/datum/job/job = SSjob.get_job(job_name) + var/datum/job/job = SSjob.GetJob(job_name) var/mob/living/player = allocate(job.spawn_type) player.mind_initialize() var/datum/mind/mind = player.mind diff --git a/code/modules/unit_tests/traitor_mail_content_check.dm b/code/modules/unit_tests/traitor_mail_content_check.dm index b2ecfe2ef24a2..6d14d9d1428d3 100644 --- a/code/modules/unit_tests/traitor_mail_content_check.dm +++ b/code/modules/unit_tests/traitor_mail_content_check.dm @@ -5,6 +5,6 @@ var/mob/living/carbon/human/person = allocate(/mob/living/carbon/human/consistent) person.mind_initialize() var/obj/item/mail/traitor/test_mail = allocate(/obj/item/mail/traitor) - person.mind.set_assigned_role(SSjob.get_job_type(/datum/job/captain)) + person.mind.set_assigned_role(SSjob.GetJobType(/datum/job/captain)) test_mail.initialize_for_recipient(person.mind) TEST_ASSERT_EQUAL(test_mail.contents.len, 0, "/obj/item/mail/traitor should not have items after initialize_for_recipient proc!") diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm index c4cfd2410d261..be9d558687d8c 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 = 12 + cost = 10 restricted_roles = list(JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER, JOB_ATMOSPHERIC_TECHNICIAN) /datum/uplink_item/role_restricted/magillitis_serum @@ -364,7 +364,7 @@ Please note that these are free-range monkeys that don't react with Mutadone." item = /obj/item/antag_spawner/loadout/monkey_man cost = 6 - restricted_roles = list(JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST, JOB_GENETICIST, JOB_ASSISTANT, JOB_MIME, JOB_CLOWN, JOB_PUN_PUN) + restricted_roles = list(JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST, JOB_GENETICIST, JOB_ASSISTANT, JOB_MIME, JOB_CLOWN) restricted = TRUE refundable = TRUE @@ -375,7 +375,7 @@ item = /obj/item/storage/toolbox/guncase/monkeycase cost = 4 limited_stock = 3 - restricted_roles = list(JOB_ASSISTANT, JOB_MIME, JOB_CLOWN, JOB_PUN_PUN) + restricted_roles = list(JOB_ASSISTANT, JOB_MIME, JOB_CLOWN) restricted = TRUE refundable = FALSE diff --git a/code/modules/uplink/uplink_items/suits.dm b/code/modules/uplink/uplink_items/suits.dm index 2839a6d2d1eff..b66cce4eaece7 100644 --- a/code/modules/uplink/uplink_items/suits.dm +++ b/code/modules/uplink/uplink_items/suits.dm @@ -80,9 +80,3 @@ progression_minimum = 90 MINUTES cost = 16 cant_discount = TRUE - -/datum/uplink_item/suits/modsuit/Wraith - name = "MODsuit wraith cloaking module" - desc = "A MODsuit module that grants to the user Optical camouflage and the ability to overload light sources to recharge suit power." - item = /obj/item/mod/module/stealth/wraith - cost = 3 diff --git a/code/modules/vehicles/_vehicle.dm b/code/modules/vehicles/_vehicle.dm index 77f56700e48ae..7da8fc0314b10 100644 --- a/code/modules/vehicles/_vehicle.dm +++ b/code/modules/vehicles/_vehicle.dm @@ -138,7 +138,6 @@ remove_control_flags(M, ALL) remove_passenger_actions(M) LAZYREMOVE(occupants, M) -// LAZYREMOVE(contents, M) cleanup_actions_for_mob(M) after_remove_occupant(M) return TRUE diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index 4aa28d6fe5a47..aa9a963a1013c 100644 --- a/code/modules/vehicles/atv.dm +++ b/code/modules/vehicles/atv.dm @@ -82,7 +82,7 @@ if(atom_integrity >= max_integrity) balloon_alert(user, "it's not damaged!") return - if(!W.tool_start_check(user, amount=1, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!W.tool_start_check(user, amount=1)) return user.balloon_alert_to_viewers("started welding [src]", "started repairing [src]") audible_message(span_hear("You hear welding.")) diff --git a/code/modules/vehicles/bicycle.dm b/code/modules/vehicles/bicycle.dm index cc40b7d80ef06..cc0643be02601 100644 --- a/code/modules/vehicles/bicycle.dm +++ b/code/modules/vehicles/bicycle.dm @@ -33,7 +33,7 @@ if(atom_integrity >= max_integrity) balloon_alert(user, "it's not damaged!") return - if(!W.tool_start_check(user, amount=1, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!W.tool_start_check(user, amount=1)) return user.balloon_alert_to_viewers("started welding [src]", "started repairing [src]") audible_message(span_hear("You hear welding.")) diff --git a/code/modules/vehicles/cars/vim.dm b/code/modules/vehicles/cars/vim.dm index 56e1da7528d95..dfcd604ef144d 100644 --- a/code/modules/vehicles/cars/vim.dm +++ b/code/modules/vehicles/cars/vim.dm @@ -68,7 +68,7 @@ if(atom_integrity >= max_integrity) balloon_alert(user, "it's not damaged!") return - if(!W.tool_start_check(user, amount=1, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!W.tool_start_check(user, amount=1)) return user.balloon_alert_to_viewers("started welding [src]", "started repairing [src]") audible_message(span_hear("You hear welding.")) diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index 4755631dfeb0a..846d6a6434b1e 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -229,6 +229,7 @@ ui_view.generate_view("mech_view_[REF(src)]") RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) RegisterSignal(src, COMSIG_LIGHT_EATER_ACT, PROC_REF(on_light_eater)) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) spark_system = new spark_system.set_up(2, 0, src) @@ -339,12 +340,11 @@ ai.investigate_log("has been gibbed by having their mech destroyed.", INVESTIGATE_DEATHS) ai.gib(DROP_ALL_REMAINS) //No wreck, no AI to recover else - mob_exit(ai, silent = TRUE, forced = TRUE) // so we dont ghost the AI + mob_exit(ai,silent = TRUE, forced = TRUE) // so we dont ghost the AI continue - else - mob_exit(occupant, forced = TRUE) - if(!isbrain(occupant)) // who would win.. 1 brain vs 1 sleep proc.. - occupant.SetSleeping(destruction_sleep_duration) + mob_exit(occupant, forced = TRUE) + if(!isbrain(occupant)) // who would win.. 1 brain vs 1 sleep proc.. + occupant.SetSleeping(destruction_sleep_duration) if(wreckage) var/obj/structure/mecha_wreckage/WR = new wreckage(loc, unlucky_ai) @@ -832,11 +832,11 @@ remove_action_type_from_mob(/datum/action/vehicle/sealed/mecha/mech_toggle_lights, occupant) return COMPONENT_BLOCK_LIGHT_EATER -/obj/vehicle/sealed/mecha/on_saboteur(datum/source, disrupt_duration) - . = ..() +/obj/vehicle/sealed/mecha/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER if(mecha_flags &= HAS_LIGHTS && light_on) set_light_on(FALSE) - return TRUE + return COMSIG_SABOTEUR_SUCCESS /// Apply corresponding accesses /obj/vehicle/sealed/mecha/proc/update_access() diff --git a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm index f89ddb9e274c2..c19aede50d93b 100644 --- a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm @@ -32,15 +32,6 @@ 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 @@ -180,7 +171,7 @@ /** - * Handles attempted refills of the extinguisher. + * Handles attemted refills of the extinguisher. * * The mech can only refill an extinguisher that is in front of it. * Only water tank objects can be used. @@ -319,7 +310,7 @@ if(!(mecha.mecha_flags & PANEL_OPEN)) //non-removable upgrade, so lets make sure the pilot or owner has their say. to_chat(user, span_warning("[mecha] panel must be open in order to allow this conversion kit.")) return FALSE - if(LAZYLEN(mecha.occupants)) //We're actually making a new mech and swapping things over, it might get weird if players are involved + if(LAZYLEN(mecha.occupants)) //We're actualy making a new mech and swapping things over, it might get weird if players are involved to_chat(user, span_warning("[mecha] must be unoccupied before this conversion kit can be applied.")) return FALSE if(!mecha.cell) //Turns out things break if the cell is missing diff --git a/code/modules/vehicles/mecha/mecha_ai_interaction.dm b/code/modules/vehicles/mecha/mecha_ai_interaction.dm index 4259dff5c3426..cec3d867e2b6a 100644 --- a/code/modules/vehicles/mecha/mecha_ai_interaction.dm +++ b/code/modules/vehicles/mecha/mecha_ai_interaction.dm @@ -102,6 +102,7 @@ AI.eyeobj?.RegisterSignal(src, COMSIG_MOVABLE_MOVED, TYPE_PROC_REF(/mob/camera/ai_eye, update_visibility)) AI.controlled_equipment = src AI.remote_control = src + AI.ShutOffDoomsdayDevice() add_occupant(AI) to_chat(AI, AI.can_dominate_mechs ? span_greenannounce("Takeover of [name] complete! You are now loaded onto the onboard computer. Do not attempt to leave the station sector!") :\ span_notice("You have been uploaded to a mech's onboard computer.")) diff --git a/code/modules/vehicles/mecha/mecha_control_console.dm b/code/modules/vehicles/mecha/mecha_control_console.dm index a9dbca0e07db0..d31bd5a5bd290 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", max_length = MAX_MESSAGE_LEN) + var/message = tgui_input_text(usr, "Input message", "Transmit message") var/obj/vehicle/sealed/mecha/M = MT.chassis if(trim(message) && M) to_chat(M.occupants, message) diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm index 8634ff88591e7..1237c931b33a5 100644 --- a/code/modules/vehicles/mecha/mecha_defense.dm +++ b/code/modules/vehicles/mecha/mecha_defense.dm @@ -406,7 +406,7 @@ if(atom_integrity >= max_integrity) balloon_alert(user, "it's not damaged!") return - if(!W.tool_start_check(user, amount=1, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!W.tool_start_check(user, amount=1)) return user.balloon_alert_to_viewers("started welding [src]", "started repairing [src]") audible_message(span_hear("You hear welding.")) diff --git a/code/modules/vehicles/mecha/mecha_mob_interaction.dm b/code/modules/vehicles/mecha/mecha_mob_interaction.dm index 18f04c056e18e..a1e398f6f90cf 100644 --- a/code/modules/vehicles/mecha/mecha_mob_interaction.dm +++ b/code/modules/vehicles/mecha/mecha_mob_interaction.dm @@ -115,13 +115,12 @@ mob_container = brain.container else if(isAI(M)) var/mob/living/silicon/ai/AI = M - mob_container = AI //stop listening to this signal, as the static update is now handled by the eyeobj's setLoc AI.eyeobj?.UnregisterSignal(src, COMSIG_MOVABLE_MOVED) AI.eyeobj?.forceMove(newloc) //kick the eye out as well - AI.controlled_equipment = null - AI.remote_control = null if(forced) + AI.controlled_equipment = null + AI.remote_control = null if(!AI.linked_core) //if the victim AI has no core if (!AI.can_shunt || !length(AI.hacked_apcs)) AI.investigate_log("has been gibbed by being forced out of their mech.", INVESTIGATE_DEATHS) @@ -131,30 +130,31 @@ AI.gib(DROP_ALL_REMAINS) AI = null mecha_flags &= ~SILICON_PILOT - return ..() + return else var/obj/machinery/power/apc/emergency_shunt_apc = pick(AI.hacked_apcs) emergency_shunt_apc.malfoccupy(AI) //get shunted into a random APC (you don't get to choose which) AI = null mecha_flags &= ~SILICON_PILOT - return ..() - if(!forced && !silent) - to_chat(AI, span_notice("Returning to core...")) - mecha_flags &= ~SILICON_PILOT - newloc = get_turf(AI.linked_core) - qdel(AI.linked_core) - AI.forceMove(newloc) - if(forced) - to_chat(AI, span_danger("ZZUZULU.ERR--ERRR-NEUROLOG-- PERCEP--- DIST-B**@")) - for(var/count in 1 to 5) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(do_sparks), rand(10, 20), FALSE, AI), count SECONDS) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(empulse), get_turf(AI), /*heavy_range = */10, /*light_range = */20), 10 SECONDS) - return ..() + return + newloc = get_turf(AI.linked_core) + qdel(AI.linked_core) + AI.forceMove(newloc) + else + if(!silent) + to_chat(AI, span_notice("Returning to core...")) + AI.controlled_equipment = null + AI.remote_control = null + mob_container = AI + newloc = get_turf(AI.linked_core) + qdel(AI.linked_core) + AI.forceMove(newloc) else if(isliving(M)) mob_container = M else return ..() var/mob/living/ejector = M + mecha_flags &= ~SILICON_PILOT mob_container.forceMove(newloc)//ejecting mob container log_message("[mob_container] moved out.", LOG_MECHA) SStgui.close_user_uis(M, src) diff --git a/code/modules/vehicles/sealed.dm b/code/modules/vehicles/sealed.dm index 1c96c90ae68ef..821a69d8f8269 100644 --- a/code/modules/vehicles/sealed.dm +++ b/code/modules/vehicles/sealed.dm @@ -92,10 +92,8 @@ if(!istype(M)) return FALSE remove_occupant(M) - if(!isAI(M))//This is the ONE mob we don't want to be moved to the vehicle that should be handled when used + if(!isAI(M))//This is the ONE mob we dont want to be moved to the vehicle that should be handeled when used M.forceMove(exit_location(M)) - else - return TRUE if(randomstep) var/turf/target_turf = get_step(exit_location(M), pick(GLOB.cardinals)) M.throw_at(target_turf, 5, 10) @@ -171,5 +169,4 @@ /obj/vehicle/sealed/proc/on_entered_supermatter(atom/movable/vehicle, atom/movable/supermatter) SIGNAL_HANDLER for (var/mob/passenger as anything in occupants) - if(!isAI(passenger)) - passenger.Bump(supermatter) + passenger.Bump(supermatter) diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm index 6726fb02ef150..c8cab1a7dc1cd 100644 --- a/code/modules/vehicles/secway.dm +++ b/code/modules/vehicles/secway.dm @@ -44,7 +44,7 @@ if(atom_integrity >= max_integrity) balloon_alert(user, "it's not damaged!") return - if(!W.tool_start_check(user, amount=1, heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!W.tool_start_check(user, amount=1)) return user.balloon_alert_to_viewers("started welding [src]", "started repairing [src]") audible_message(span_hear("You hear welding.")) diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 1db108ffe1a41..9299c77347d8c 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -187,23 +187,16 @@ GLOBAL_LIST_EMPTY(vending_machines_to_restock) /** * Is this item on station or not * - * if it doesn't originate from off-station during mapload, all_products_free gets automatically set to TRUE if it was unset previously. + * if it doesn't originate from off-station during mapload, everything is free * if it's off-station during mapload, it's also safe from the brand intelligence event */ var/onstation = TRUE /** - * DO NOT APPLY THIS GLOBALLY. For mapping var edits only. - * A variable to change on a per instance basis that allows the instance to avoid having onstation set for them during mapload. - * Setting this to TRUE means that the vending machine is treated as if it were still onstation if it spawns off-station during mapload. - * Useful to specify an off-station machine that will be affected by machine-brand intelligence for whatever reason. + * A variable to change on a per instance basis on the map that allows the instance + * to ignore whether it's on the station or not. + * Useful to force cost and ID requirements. DO NOT APPLY THIS GLOBALLY. */ var/onstation_override = FALSE - /** - * If this is set to TRUE, all products sold by the vending machine are free (cost nothing). - * If unset, this will get automatically set to TRUE during init if the machine originates from off-station during mapload. - * Defaults to null, set it to TRUE or FALSE explicitly on a per-machine basis if you want to force it to be a certain value. - */ - var/all_products_free ///Items that the players have loaded into the vendor var/list/vending_machine_input = list() @@ -267,10 +260,8 @@ GLOBAL_LIST_EMPTY(vending_machines_to_restock) if(!is_station_level(z)) if(!onstation_override) onstation = FALSE - if(isnull(all_products_free)) // Only auto-set the free products var if we haven't explicitly assigned a value to it yet. - all_products_free = TRUE if(circuit) - circuit.all_products_free = all_products_free //sync up the circuit so the pricing schema is carried over if it's reconstructed. + circuit.onstation = onstation //sync up the circuit so the pricing schema is carried over if it's reconstructed. else if(HAS_TRAIT(SSstation, STATION_TRAIT_VENDING_SHORTAGE)) for (var/datum/data/vending_product/product_record as anything in product_records + coin_records + hidden_records) @@ -284,9 +275,9 @@ GLOBAL_LIST_EMPTY(vending_machines_to_restock) if(tiltable && prob(6)) // 1 in 17 chance to start tilted (as an additional hint to the station trait behind it) INVOKE_ASYNC(src, PROC_REF(tilt), loc) credits_contained = 0 // If it's tilted, it's been looted, so no credits for you. - else if(circuit) - all_products_free = circuit.all_products_free //if it was constructed outside mapload, sync the vendor up with the circuit's var so you can't bypass price requirements by moving / reconstructing it off station. - if(!all_products_free) + else if(circuit && (circuit.onstation != onstation)) //check if they're not the same to minimize the amount of edited values. + onstation = circuit.onstation //if it was constructed outside mapload, sync the vendor up with the circuit's var so you can't bypass price requirements by moving / reconstructing it off station. + if(onstation && !onstation_override) AddComponent(/datum/component/payment, 0, SSeconomy.get_dep_account(payment_department), PAYMENT_VENDING) GLOB.vending_machines_to_restock += src //We need to keep track of the final onstation vending machines so we can keep them restocked. register_context() @@ -1227,7 +1218,6 @@ GLOBAL_LIST_EMPTY(vending_machines_to_restock) /obj/machinery/vending/ui_static_data(mob/user) var/list/data = list() data["onstation"] = onstation - data["all_products_free"] = all_products_free data["department"] = payment_department data["jobDiscount"] = DEPARTMENT_DISCOUNT data["product_records"] = list() @@ -1804,9 +1794,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, 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) + 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) last_slogan = world.time + rand(0, slogan_delay) return diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index e0e079b6e8cc6..8211b05553d8b 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -224,6 +224,7 @@ GLOBAL_VAR_INIT(all_autodrobe_items, (autodrobe_costumes_items +\ icon_state = "theater" icon_deny = "theater-deny" panel_type = "panel16" + req_access = list(ACCESS_THEATRE) product_slogans = "Dress for success!;Suited and booted!;It's show time!;Why leave style up to fate? Use AutoDrobe!" vend_reply = "Thank you for using AutoDrobe!" @@ -235,7 +236,7 @@ GLOBAL_VAR_INIT(all_autodrobe_items, (autodrobe_costumes_items +\ default_price = PAYCHECK_CREW * 0.8 //Default of 40. extra_price = PAYCHECK_COMMAND payment_department = ACCOUNT_SRV - light_mask = "theater-light-mask" + light_mask="theater-light-mask" /obj/machinery/vending/autodrobe/Initialize(mapload) product_categories = list( @@ -280,6 +281,9 @@ GLOBAL_VAR_INIT(all_autodrobe_items, (autodrobe_costumes_items +\ . = ..() +/obj/machinery/vending/autodrobe/all_access + desc = "A vending machine for costumes. This model appears to have no access restrictions." + req_access = null /obj/item/vending_refill/autodrobe machine_name = "AutoDrobe" icon_state = "refill_costume" diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm index f05dcb3e9f17f..791b1c6f71562 100644 --- a/code/modules/vending/boozeomat.dm +++ b/code/modules/vending/boozeomat.dm @@ -85,13 +85,19 @@ product_slogans = "I hope nobody asks me for a bloody cup o' tea...;Alcohol is humanity's friend. Would you abandon a friend?;Quite delighted to serve you!;Is nobody thirsty on this station?" product_ads = "Drink up!;Booze is good for you!;Alcohol is humanity's best friend.;Quite delighted to serve you!;Care for a nice, cold beer?;Nothing cures you like booze!;Have a sip!;Have a drink!;Have a beer!;Beer is good for you!;Only the finest alcohol!;Best quality booze since 2053!;Award-winning wine!;Maximum alcohol!;Man loves beer.;A toast for progress!" + req_access = list(ACCESS_BAR) refill_canister = /obj/item/vending_refill/boozeomat default_price = PAYCHECK_CREW * 0.9 extra_price = PAYCHECK_COMMAND payment_department = ACCOUNT_SRV light_mask = "boozeomat-light-mask" -/obj/machinery/vending/boozeomat/syndicate +/obj/machinery/vending/boozeomat/all_access + desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one. This model appears to have no access restrictions." + req_access = null + +/obj/machinery/vending/boozeomat/syndicate_access + req_access = list(ACCESS_SYNDICATE) age_restrictions = FALSE initial_language_holder = /datum/language_holder/syndicate diff --git a/code/modules/vending/cartridge.dm b/code/modules/vending/cartridge.dm index ccc13b7de720a..7c4a2c9578d70 100644 --- a/code/modules/vending/cartridge.dm +++ b/code/modules/vending/cartridge.dm @@ -19,7 +19,7 @@ default_price = PAYCHECK_COMMAND extra_price = PAYCHECK_COMMAND * 2.5 payment_department = ACCOUNT_SRV - light_mask = "cart-light-mask" + light_mask="cart-light-mask" /obj/item/vending_refill/cart machine_name = "PTech" diff --git a/code/modules/vending/cigarette.dm b/code/modules/vending/cigarette.dm index 902e34e04f06c..61379e5635468 100644 --- a/code/modules/vending/cigarette.dm +++ b/code/modules/vending/cigarette.dm @@ -75,7 +75,7 @@ machine_name = "ShadyCigs Deluxe" icon_state = "refill_smoke" -/obj/machinery/vending/cigarette/pre_throw(obj/item/thrown_item) - if(istype(thrown_item, /obj/item/lighter)) - var/obj/item/lighter/thrown_lighter = thrown_item - thrown_lighter.set_lit(TRUE) +/obj/machinery/vending/cigarette/pre_throw(obj/item/I) + if(istype(I, /obj/item/lighter)) + var/obj/item/lighter/L = I + L.set_lit(TRUE) diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm index d9fddd07f1731..dd4a4dd4b99b5 100644 --- a/code/modules/vending/cola.dm +++ b/code/modules/vending/cola.dm @@ -36,6 +36,7 @@ extra_price = PAYCHECK_CREW payment_department = ACCOUNT_SRV + /obj/item/vending_refill/cola machine_name = "Robust Softdrinks" icon_state = "refill_cola" diff --git a/code/modules/vending/engineering.dm b/code/modules/vending/engineering.dm index f360b89a07fae..48da7e27b1286 100644 --- a/code/modules/vending/engineering.dm +++ b/code/modules/vending/engineering.dm @@ -5,6 +5,7 @@ icon_state = "engi" icon_deny = "engi-deny" panel_type = "panel10" + req_access = list(ACCESS_ENGINE_EQUIP) products = list( /obj/item/clothing/under/rank/engineering/chief_engineer = 4, /obj/item/clothing/under/rank/engineering/engineer = 4, diff --git a/code/modules/vending/engivend.dm b/code/modules/vending/engivend.dm index f33f746b6b76f..1522d0047b098 100644 --- a/code/modules/vending/engivend.dm +++ b/code/modules/vending/engivend.dm @@ -4,6 +4,7 @@ icon_state = "engivend" icon_deny = "engivend-deny" panel_type = "panel10" + req_access = list(ACCESS_ENGINE_EQUIP) products = list( /obj/item/clothing/glasses/meson/engine = 2, /obj/item/clothing/glasses/welding = 3, diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index 98a77c7f40c3d..d1a237eaf640f 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -45,19 +45,6 @@ /obj/item/stack/pipe_cleaner_coil/random = 10, ), ), - list( - "name" = "Fishing", - "icon" = "fish", - "products" = list( - /obj/item/storage/toolbox/fishing = 2, - /obj/item/storage/box/fishing_hooks = 2, - /obj/item/storage/box/fishing_lines = 2, - /obj/item/storage/box/fishing_lures = 2, - /obj/item/book/manual/fish_catalog = 5, - /obj/item/fish_analyzer = 2, - /obj/item/fishing_rod/telescopic = 1, - ), - ), list( "name" = "Skillchips", "icon" = "floppy-disk", diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index be78e15847d13..2209f550fce28 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -5,6 +5,7 @@ icon_deny = "med-deny" panel_type = "panel11" product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!" + req_access = list(ACCESS_MEDICAL) products = list( /obj/item/stack/medical/gauze = 8, /obj/item/reagent_containers/syringe = 12, @@ -44,11 +45,13 @@ machine_name = "NanoMed Plus" icon_state = "refill_medical" -/obj/machinery/vending/medical/syndicate +/obj/machinery/vending/medical/syndicate_access name = "\improper SyndiMed Plus" + req_access = list(ACCESS_SYNDICATE) initial_language_holder = /datum/language_holder/syndicate /obj/machinery/vending/medical/infested_frigate + req_access = list("theatre") products = list( /obj/item/stack/medical/gauze = 0, /obj/item/reagent_containers/syringe = 7, @@ -72,6 +75,7 @@ icon_deny = "drug-deny" panel_type = "panel11" product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!" + req_access = list(ACCESS_MEDICAL) products = list( /obj/item/reagent_containers/pill/patch/libital = 5, /obj/item/reagent_containers/pill/patch/aiuri = 5, @@ -89,17 +93,17 @@ /obj/item/reagent_containers/medigel/libital = 2, /obj/item/reagent_containers/medigel/aiuri = 2, /obj/item/reagent_containers/medigel/sterilizine = 1, - ) + ) contraband = list( /obj/item/reagent_containers/pill/tox = 3, /obj/item/reagent_containers/pill/morphine = 4, /obj/item/reagent_containers/pill/multiver = 6, - ) + ) premium = list( /obj/item/reagent_containers/medigel/synthflesh = 2, /obj/item/storage/pill_bottle/psicodine = 2, /obj/item/storage/pill_bottle/sansufentanyl = 1, - ) + ) default_price = 50 extra_price = 100 payment_department = ACCOUNT_MED diff --git a/code/modules/vending/robotics.dm b/code/modules/vending/robotics.dm index 8496404195386..8796e8d756192 100644 --- a/code/modules/vending/robotics.dm +++ b/code/modules/vending/robotics.dm @@ -6,6 +6,7 @@ icon_deny = "robotics-deny" panel_type = "panel14" light_mask = "robotics-light-mask" + req_access = list(ACCESS_ROBOTICS) products = list( /obj/item/clothing/suit/toggle/labcoat = 4, /obj/item/clothing/under/rank/rnd/roboticist = 4, diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm index a86f5562862d9..7bed3ccec0645 100644 --- a/code/modules/vending/security.dm +++ b/code/modules/vending/security.dm @@ -6,6 +6,7 @@ icon_deny = "sec-deny" panel_type = "panel6" light_mask = "sec-light-mask" + req_access = list(ACCESS_SECURITY) products = list( /obj/item/restraints/handcuffs = 8, /obj/item/restraints/handcuffs/cable/zipties = 10, @@ -37,14 +38,14 @@ extra_price = PAYCHECK_COMMAND * 1.5 payment_department = ACCOUNT_SEC -/obj/machinery/vending/security/pre_throw(obj/item/thrown_item) - if(isgrenade(thrown_item)) - var/obj/item/grenade/thrown_grenade = thrown_item - thrown_grenade.arm_grenade() - else if(istype(thrown_item, /obj/item/flashlight)) - var/obj/item/flashlight/thrown_flashlight = thrown_item - thrown_flashlight.set_light_on(TRUE) - thrown_flashlight.update_brightness() +/obj/machinery/vending/security/pre_throw(obj/item/I) + if(isgrenade(I)) + var/obj/item/grenade/G = I + G.arm_grenade() + else if(istype(I, /obj/item/flashlight)) + var/obj/item/flashlight/F = I + F.set_light_on(TRUE) + F.update_brightness() /obj/item/vending_refill/security machine_name = "SecTech" diff --git a/code/modules/vending/subtype.dm b/code/modules/vending/subtype.dm index 360eb46defd31..3a1a04ff6e764 100644 --- a/code/modules/vending/subtype.dm +++ b/code/modules/vending/subtype.dm @@ -10,7 +10,7 @@ circuit = null product_slogans = "Spawn \" too annoying? Too lazy to open game panel? This one's for you!;Subtype vendor, for all your debugging woes!" default_price = 0 - all_products_free = TRUE + onstation = FALSE /// Spawns coders by default var/type_to_vend = /obj/item/food/grown/citrus diff --git a/code/modules/vending/sustenance.dm b/code/modules/vending/sustenance.dm index 5b54b6bbca464..a1d11c307277e 100644 --- a/code/modules/vending/sustenance.dm +++ b/code/modules/vending/sustenance.dm @@ -36,7 +36,7 @@ desc = "A vending machine which vends food, as required by section 47-C of the NT's Prisoner Ethical Treatment Agreement. \ This one, however, processes labor points for its products if the user is incarcerated." icon_state = "sustenance_labor" - all_products_free = FALSE + onstation_override = TRUE displayed_currency_icon = "digging" displayed_currency_name = " LP" diff --git a/code/modules/wiremod/components/admin/input_request.dm b/code/modules/wiremod/components/admin/input_request.dm index 3961003d43ac5..13dfacba35784 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", max_length = MAX_MESSAGE_LEN) + var/player_input = tgui_input_text(player, "Input a value", "Input value") if(isnull(player_input)) return input_response.set_output(player_input) diff --git a/code/modules/wiremod/components/atom/direction.dm b/code/modules/wiremod/components/atom/direction.dm index 1b14e6505a443..c2bbd5026c8c8 100644 --- a/code/modules/wiremod/components/atom/direction.dm +++ b/code/modules/wiremod/components/atom/direction.dm @@ -13,7 +13,6 @@ /// The result from the output var/datum/port/output/output - var/datum/port/output/distance // Directions outputs var/datum/port/output/north @@ -31,10 +30,9 @@ . += create_ui_notice("Maximum Range: [max_range] tiles", "orange", "info") /obj/item/circuit_component/direction/populate_ports() - input_port = add_input_port("Targeted Entity", PORT_TYPE_ATOM) + input_port = add_input_port("Organism", PORT_TYPE_ATOM) output = add_output_port("Direction", PORT_TYPE_STRING) - distance = add_output_port("Distance", PORT_TYPE_NUMBER) north = add_output_port("North", PORT_TYPE_SIGNAL) east = add_output_port("East", PORT_TYPE_SIGNAL) @@ -47,9 +45,8 @@ if(!object) return var/turf/location = get_location() - var/measured_distance = get_dist(location, object) - if(object.z != location.z || measured_distance > max_range) + if(object.z != location.z || get_dist(location, object) > max_range) output.set_output(null) return @@ -64,6 +61,3 @@ east.set_output(COMPONENT_SIGNAL) if(direction & WEST) west.set_output(COMPONENT_SIGNAL) - - distance.set_output(measured_distance) - diff --git a/code/modules/wiremod/components/bci/thought_listener.dm b/code/modules/wiremod/components/bci/thought_listener.dm index ed6226a4e491f..aa788b1a4be88 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", "", max_length = MAX_MESSAGE_LEN) + var/message = tgui_input_text(owner, input_desc.value ? input_desc.value : "", input_name.value ? input_name.value : "Thought Listener", "") if(QDELETED(owner) || owner.stat >= SOFT_CRIT) return output.set_output(message) diff --git a/code/modules/wiremod/components/math/binary_conversion.dm b/code/modules/wiremod/components/math/binary_conversion.dm index 8ef4067b955fe..8d90019b28c89 100644 --- a/code/modules/wiremod/components/math/binary_conversion.dm +++ b/code/modules/wiremod/components/math/binary_conversion.dm @@ -37,15 +37,6 @@ if(!length(bit_array)) return - var/to_convert = number.value - var/is_negative - if(number.value < 0) - is_negative = TRUE - to_convert = -to_convert - var/len = length(bit_array) - for(var/iteration in 1 to len) + for(var/iteration in 1 to length(bit_array)) var/datum/port/output/bit = bit_array[iteration] - if(iteration == 1 && is_negative) - bit.set_output(1) - continue - bit.set_output(!!(to_convert & (1<< (len - iteration)))) + bit.set_output(number.value & (2 ** (iteration - 1))) diff --git a/code/modules/wiremod/core/component.dm b/code/modules/wiremod/core/component.dm index 07f3a5b55a379..02e88e53c2381 100644 --- a/code/modules/wiremod/core/component.dm +++ b/code/modules/wiremod/core/component.dm @@ -15,7 +15,6 @@ lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' custom_materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT) - w_class = WEIGHT_CLASS_TINY /// The name of the component shown on the UI var/display_name = "Generic" diff --git a/code/modules/wiremod/core/integrated_circuit.dm b/code/modules/wiremod/core/integrated_circuit.dm index 8afc963b5a321..db1fd8ac588c0 100644 --- a/code/modules/wiremod/core/integrated_circuit.dm +++ b/code/modules/wiremod/core/integrated_circuit.dm @@ -16,7 +16,6 @@ GLOBAL_LIST_EMPTY_TYPED(integrated_circuits, /obj/item/integrated_circuit) inhand_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' - w_class = WEIGHT_CLASS_TINY /// The name that appears on the shell. var/display_name = "" diff --git a/code/modules/wiremod/shell/compact_remote.dm b/code/modules/wiremod/shell/compact_remote.dm index 3bf216a4c326e..0697a449dbeba 100644 --- a/code/modules/wiremod/shell/compact_remote.dm +++ b/code/modules/wiremod/shell/compact_remote.dm @@ -13,7 +13,6 @@ righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE - w_class = WEIGHT_CLASS_TINY /obj/item/compact_remote/Initialize(mapload) . = ..() diff --git a/code/modules/wiremod/shell/controller.dm b/code/modules/wiremod/shell/controller.dm index f68dd0c50b200..ae0eb01b36763 100644 --- a/code/modules/wiremod/shell/controller.dm +++ b/code/modules/wiremod/shell/controller.dm @@ -14,7 +14,6 @@ righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE - w_class = WEIGHT_CLASS_SMALL /obj/item/controller/Initialize(mapload) . = ..() diff --git a/code/modules/wiremod/shell/keyboard.dm b/code/modules/wiremod/shell/keyboard.dm index 505c89e0dde54..0b28959aa9c69 100644 --- a/code/modules/wiremod/shell/keyboard.dm +++ b/code/modules/wiremod/shell/keyboard.dm @@ -8,7 +8,6 @@ righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE - w_class = WEIGHT_CLASS_SMALL /obj/item/keyboard_shell/Initialize(mapload) . = ..() @@ -49,7 +48,7 @@ to_chat(user, span_warning("You start mashing keys at random!")) return - var/message = tgui_input_text(user, "Input your text", "Keyboard", max_length = MAX_MESSAGE_LEN) + var/message = tgui_input_text(user, "Input your text", "Keyboard") entity.set_output(user) output.set_output(message) signal.set_output(COMPONENT_SIGNAL) diff --git a/code/modules/wiremod/shell/scanner.dm b/code/modules/wiremod/shell/scanner.dm index 29a061a535a28..f32f91fa76f2e 100644 --- a/code/modules/wiremod/shell/scanner.dm +++ b/code/modules/wiremod/shell/scanner.dm @@ -13,7 +13,6 @@ righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE - w_class = WEIGHT_CLASS_SMALL /obj/item/wiremod_scanner/Initialize(mapload) . = ..() diff --git a/code/modules/wiremod/shell/shell_items.dm b/code/modules/wiremod/shell/shell_items.dm index bad787033f967..06929e3a04c8e 100644 --- a/code/modules/wiremod/shell/shell_items.dm +++ b/code/modules/wiremod/shell/shell_items.dm @@ -39,7 +39,6 @@ name = "drone assembly" icon_state = "setup_medium_med-open" shell_to_spawn = /mob/living/circuit_drone - w_class = WEIGHT_CLASS_SMALL /obj/item/shell/server name = "server assembly" @@ -53,7 +52,6 @@ icon_state = "construction" shell_to_spawn = /obj/machinery/door/airlock/shell screw_delay = 10 SECONDS - w_class = WEIGHT_CLASS_BULKY /obj/item/shell/dispenser name = "circuit dispenser assembly" @@ -64,7 +62,6 @@ name = "brain-computer interface assembly" icon_state = "bci-open" shell_to_spawn = /obj/item/organ/internal/cyberimp/bci - w_class = WEIGHT_CLASS_TINY /obj/item/shell/scanner_gate name = "scanner gate assembly" diff --git a/config/config.txt b/config/config.txt index d676e0d045646..192f90a001b7a 100644 --- a/config/config.txt +++ b/config/config.txt @@ -270,7 +270,7 @@ NOTE_FRESH_DAYS 91.31055 ## Notes older then this will be completely faded out. NOTE_STALE_DAYS 365.2422 -## Uncomment to allow drastic performance enhancement measures to turn on automatically once there are equal or more clients than the configured amount (will also prompt admin for veto) +## Uncomment to allow drastic performence enhancemet measures to turn on automatically once there are equal or more clients than the configured amount (will also prompt admin for veto) #AUTO_LAG_SWITCH_POP 75 ##Note: all population caps can be used with each other if desired. @@ -297,7 +297,7 @@ EXTREME_POPCAP_MESSAGE The server is currently serving a high number of users, f BYOND_MEMBER_BYPASS_POPCAP ## Notify admins when a new player connects for the first x days a player's been around. (0 for first connection only, -1 for never) -## Requires database +## Requres database NOTIFY_NEW_PLAYER_AGE 0 ## Notify admins when a player connects if their byond account was created in the last X days @@ -305,7 +305,7 @@ NOTIFY_NEW_PLAYER_AGE 0 NOTIFY_NEW_PLAYER_ACCOUNT_AGE 1 ## Notify the irc channel when a new player makes their first connection -## Requires database +## Requres database #IRC_FIRST_CONNECTION_ALERT ## Discord ID of a role that should be pinged when a new player makes their first connection @@ -409,13 +409,13 @@ SECOND_CLICK_LIMIT 15 MINUTE_CLICK_LIMIT 400 ##Error handling related options -## The "cooldown" time for each occurrence of a unique error +## The "cooldown" time for each occurence of a unique error #ERROR_COOLDOWN 600 -## How many occurrences before the next will silence them +## How many occurences before the next will silence them #ERROR_LIMIT 90 ## How long a unique error will be silenced for #ERROR_SILENCE_TIME 6000 -##How long to wait between messaging admins about occurrences of a unique error +##How long to wait between messaging admins about occurences of a unique error #ERROR_MSG_DELAY 50 diff --git a/config/doppler/config_doppler.txt b/config/doppler/config_doppler.txt index e70481c4dcfd1..0da710789294f 100644 --- a/config/doppler/config_doppler.txt +++ b/config/doppler/config_doppler.txt @@ -4,3 +4,5 @@ COMBAT_INDICATOR ## How long until someone can be put in cryo if they are SSD, default is 9000 (15 minutes) CRYO_MIN_SSD_TIME 9000 +## Primitive demihumans +ROUNDSTART_RACES primitive_felinid diff --git a/config/game_options.txt b/config/game_options.txt index 3f7581c325413..c91249b198409 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -145,11 +145,11 @@ ALLOW_RANDOM_EVENTS #FORBID_STATION_TRAITS ## Multiplier for earliest start time of dangerous events. -## Set to 0 to make dangerous events available from round start. +## Set to 0 to make dangerous events avaliable from round start. EVENTS_MIN_TIME_MUL 1 ## Multiplier for minimal player count (players = alive non-AFK humans) for dangerous events to start. -## Set to 0 to make dangerous events available for all populations. +## Set to 0 to make dangerous events avaliable for all populations. EVENTS_MIN_PLAYERS_MUL 1 ## The lower bound, in deciseconds, for how soon another random event can be scheduled. @@ -195,7 +195,7 @@ CONFIG_GATEWAY_CHANCE 0 ## ACCESS ### ## If the number of players ready at round starts exceeds this threshold, JOBS_HAVE_MINIMAL_ACCESS will automatically be enabled. Otherwise, it will be disabled. -## This is useful for accommodating both low and high population rounds on the same server. +## This is useful for accomodating both low and high population rounds on the same server. ## Comment this out or set to 0 to disable this automatic toggle. MINIMAL_ACCESS_THRESHOLD 20 @@ -208,7 +208,7 @@ MINIMAL_ACCESS_THRESHOLD 20 ## Uncomment to give assistants maint access. #ASSISTANTS_HAVE_MAINT_ACCESS -## Uncoment to give security maint access. Note that if you deactivate JOBS_HAVE_MINIMAL_ACCESS security already gets maint from that. +## Uncoment to give security maint access. Note that if you dectivate JOBS_HAVE_MINIMAL_ACCESS security already gets maint from that. #SECURITY_HAS_MAINT_ACCESS ## Uncomment to give everyone maint access. @@ -242,7 +242,7 @@ NEAR_DEATH_EXPERIENCE ## Set to 0/commented out for "off", silicons will just start with Asimov. ## Set to 1 for "custom", silicons will start with the custom laws defined in silicon_laws.txt. (If silicon_laws.txt is empty, the AI will spawn with asimov and Custom boards will auto-delete.) ## Set to 2 for "random", silicons will start with a random lawset picked from random laws specified below. -## Set to 3 for "weighted random", using values in "silicon_weights.txt", a law will be selected, with weights specified in that file. +## Set to 3 for "weighted random", using values in "silicon_weights.txt", a law will be selected, with weights specifed in that file. ## Set to 4 for "specified", silicons will start with an existing lawset. (If no specified lawset is identified, the AI will spawn with asimov.) @@ -350,7 +350,7 @@ SILICON_MAX_LAW_AMOUNT 12 ## Roundstart Races ##------------------------------------------------------------------------------------------- -## Uncommenting races will allow them to be chosen at roundstart while join_with_muntant_race is on. You'll need at least one. +## Uncommenting races will allow them to be choosen at roundstart while join_with_muntant_race is on. You'll need at least one. ## See code/__DEFINES/DNA.dm for more options than the ones below. @@ -368,7 +368,6 @@ ROUNDSTART_RACES slugcat ROUNDSTART_RACES anthromorph ROUNDSTART_RACES aquatic ROUNDSTART_RACES insectoid -ROUNDSTART_RACES primitive_felinid ## Races that are better than humans in some ways, but worse in others ROUNDSTART_RACES ethereal @@ -468,7 +467,7 @@ ARRIVALS_SHUTTLE_DOCK_WINDOW 55 ## Uncomment to prevent late join players from spawning if the arrivals shuttle is depressurized #ARRIVALS_SHUTTLE_REQUIRE_SAFE_LATEJOIN -## How many wirechewing rodents you want to spawn on exposed maintenance wires at the start of the round. You may wish to set this to 0 if you're testing powernets. +## How many wirechewing rodents you want to spawn on exposed maintenane wires at the start of the round. You may wish to set this to 0 if you're testing powernets. MICE_ROUNDSTART 10 diff --git a/config/iceruinblacklist.txt b/config/iceruinblacklist.txt index bad7f15f9793b..420a9d79a28fc 100644 --- a/config/iceruinblacklist.txt +++ b/config/iceruinblacklist.txt @@ -5,40 +5,28 @@ ##RESPAWN #_maps/RandomRuins/AnywhereRuins/golem_ship.dmm -#_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm -#_maps/RandomRuins/IceRuins/icemoon_underground_hermit.dmm -#_maps/RandomRuins/IceRuins/doppler/icemoon_underground_icewalker_upper.dmm -#_maps/RandomRuins/IceRuins/doppler/icemoon_underground_icewalker_lower.dmm ##MEGAFAUNA #_maps/RandomRuins/IceRuins/icemoon_surface_mining_site.dmm #_maps/RandomRuins/IceRuins/icemoon_underground_mining_site.dmm -#_maps/RandomRuins/IceRuins/icemoon_underground_lavaland.dmm #_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm +#_maps/RandomRuins/IceRuins/icemoon_underground_lavaland.dmm ##MISC -#_maps/RandomRuins/AnywhereRuins/fountain_hall.dmm -#_maps/RandomRuins/IceRuins/icemoon_surface_asteroid.dmm -#_maps/RandomRuins/IceRuins/icemoon_surface_bughabitat.dmm -#_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm #_maps/RandomRuins/IceRuins/icemoon_surface_gas.dmm #_maps/RandomRuins/IceRuins/icemoon_surface_lust.dmm +#_maps/RandomRuins/IceRuins/icemoon_surface_asteroid.dmm +#_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm #_maps/RandomRuins/IceRuins/icemoon_surface_phonebooth.dmm #_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm #_maps/RandomRuins/IceRuins/icemoon_surface_smoking_room.dmm -#_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_homestead.dmm -#_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm +#_maps/RandomRuins/IceRuins/icemoon_underground_puzzle.dmm #_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm -#_maps/RandomRuins/IceRuins/icemoon_underground_bathhouse.dmm -#_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm -#_maps/RandomRuins/IceRuins/icemoon_underground_hotsprings.dmm #_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm -#_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm -#_maps/RandomRuins/IceRuins/icemoon_underground_puzzle.dmm -#_maps/RandomRuins/IceRuins/icemoon_underground_syndielab.dmm #_maps/RandomRuins/IceRuins/icemoon_underground_wrath.dmm - -##DOPPLER -#_maps/RandomRuins/IceRuins/doppler/icemoon_underground_abandoned_icewalker_den.dmm -#_maps/RandomRuins/IceRuins/doppler/icemoon_underground_abandoned_sacred_temple.dmm -#_maps/RandomRuins/IceRuins/doppler/icemoon_underground_magical_hotsprings.dmm +#_maps/RandomRuins/IceRuins/icemoon_underground_bathhouse.dmm +#_maps/RandomRuins/AnywhereRuins/fountain_hall.dmm +#_maps/RandomRuins/IceRuins/icemoon_underground_hotsprings.dmm +#_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_homestead.dmm +#_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm +#_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm diff --git a/config/jukebox_music/LICENSE.txt b/config/jukebox_music/LICENSE.txt index b7335a9ba634c..8a9d5dd3739bc 100644 --- a/config/jukebox_music/LICENSE.txt +++ b/config/jukebox_music/LICENSE.txt @@ -19,10 +19,10 @@ Do not remove this notice. ---EXAMPLES (NOT PART OF ANY LICENSE)--- -These are examples of properly attributed and licensed sounds. +These are examples of properly attrubuted and licensed sounds. They are not an actual part of any license under any circumstance. -title5.ogg was created by Mya Quinn on February 28, 2557. It is licensed under a Combative Clowning 3.0 HO-NK license (http://example.com/license/url/). +title5.ogg was created by Mya Quinn on Feburary 28, 2557. It is licensed under a Combative Clowning 3.0 HO-NK license (http://example.com/license/url/). Unless otherwise noted all sounds were created by Cuban Pete on July 26, 2555. They are licensed under the RUMBABEAT Public License.(http://example.com/license/url/). diff --git a/config/policy.json b/config/policy.json index a21428f65182c..ade2a200f5c7c 100644 --- a/config/policy.json +++ b/config/policy.json @@ -1,5 +1,5 @@ { "How do I set policy?": "Policy is set in this file. It's simply setting the key to the text to show up.", - "Where is policy shown?": "Most, but not all policy text, is displayed when relevant, such as on gaining a role.", + "Where is policy shown?": "Most, but not all policy text, is displayed when releveant, such as on gaining a role.", "What can I all set policy of?": "Antagonist typepaths, mob typepaths, species typepaths, special roles, and some extra special policy keys are all valid. Consult the code." } diff --git a/config/resources.txt b/config/resources.txt index 318730caa55d1..6a053d8cbba57 100644 --- a/config/resources.txt +++ b/config/resources.txt @@ -1,6 +1,6 @@ # External resources # Set this to the location of a .zip with the server's .rsc inside of it. -# If you set this multiple times, the server will rotate between the links. +# If you set this mutiple times, the server will rotate between the links. # To use this, the compile option PRELOAD_RSC must be set to 0 to keep byond from preloading resources # Resource urls can not be encrypted (https://), as they are downloaded by byond, not IE, and byond can't into encryption diff --git a/config/title_music/LICENSE.txt b/config/title_music/LICENSE.txt index 9f331a4e72b23..3f1576d19dfbb 100644 --- a/config/title_music/LICENSE.txt +++ b/config/title_music/LICENSE.txt @@ -19,10 +19,10 @@ Do not remove this notice. ---EXAMPLES (NOT PART OF ANY LICENSE)--- -These are examples of properly attributed and licensed sounds. +These are examples of properly attrubuted and licensed sounds. They are not an actual part of any license under any circumstance. -title5.ogg was created by Mya Quinn on February 28, 2557. It is licensed under a Combative Clowning 3.0 HO-NK license (http://example.com/license/url/). +title5.ogg was created by Mya Quinn on Feburary 28, 2557. It is licensed under a Combative Clowning 3.0 HO-NK license (http://example.com/license/url/). Unless otherwise noted all sounds were created by Cuban Pete on July 26, 2555. They are licensed under the RUMBABEAT Public License.(http://example.com/license/url/). diff --git a/config/title_screens/LICENSE.txt b/config/title_screens/LICENSE.txt index 7b1ee62f7d3da..f137cde825a73 100644 --- a/config/title_screens/LICENSE.txt +++ b/config/title_screens/LICENSE.txt @@ -19,10 +19,10 @@ Do not remove this notice. ---EXAMPLES (NOT PART OF ANY LICENSE)--- -These are examples of properly attributed and licensed images. +These are examples of properly attrubuted and licensed images. They are not an actual part of any license under any circumstance. -rare+foobar.png was created by Mya Quinn on February 28, 2557. It is licensed under a Combative Clowning 3.0 HO-NK license (http://example.com/license/url/). +rare+foobar.png was created by Mya Quinn on Feburary 28, 2557. It is licensed under a Combative Clowning 3.0 HO-NK license (http://example.com/license/url/). Unless otherwise noted all images were created by Cuban Pete on July 26, 2555. They are licensed under the RUMBABEAT Public License.(http://example.com/license/url/). diff --git a/html/changelogs/AutoChangeLog-pr-86117.yml b/html/changelogs/AutoChangeLog-pr-86117.yml new file mode 100644 index 0000000000000..67d1fa86818eb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86117.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "beams now take into account the pixel offsets of both origin and target more accurately.." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86351.yml b/html/changelogs/AutoChangeLog-pr-86351.yml new file mode 100644 index 0000000000000..09debea0e55a2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86351.yml @@ -0,0 +1,4 @@ +author: "lbnesquik" +delete-after: True +changes: + - rscadd: "Add a capacity upgrade for janitorial cyborg light replacers" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86494.yml b/html/changelogs/AutoChangeLog-pr-86494.yml new file mode 100644 index 0000000000000..67bef920b9281 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86494.yml @@ -0,0 +1,4 @@ +author: "Rhials" +delete-after: True +changes: + - bugfix: "Modifies the mapping around the icebox cliffside, guaranteeing a bit more openness." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-86568.yml b/html/changelogs/AutoChangeLog-pr-86568.yml new file mode 100644 index 0000000000000..e72dc3cc6ffd5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-86568.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - code_imp: "Fixed multiple minor logic issues with code found by OpenDream's new pragma" \ No newline at end of file diff --git a/html/changelogs/archive/2024-09.yml b/html/changelogs/archive/2024-09.yml index 2dd9ac000774d..34998e0e1c1ab 100644 --- a/html/changelogs/archive/2024-09.yml +++ b/html/changelogs/archive/2024-09.yml @@ -238,448 +238,3 @@ properly when swapping character slots - bugfix: fixed a race condition that was causing carpotoxin to cause liver damage to felinids despite being immune -2024-09-10: - Ghommie: - - bugfix: beams now take into account the pixel offsets of both origin and target - more accurately.. - Rhials: - - bugfix: Modifies the mapping around the icebox cliffside, guaranteeing a bit more - openness. - SmArtKar: - - code_imp: Fixed multiple minor logic issues with code found by OpenDream's new - pragma - lbnesquik: - - rscadd: Add a capacity upgrade for janitorial cyborg light replacers -2024-09-11: - 00-Steven: - - bugfix: Fixed being buckled to medical/roller beds making you always use the headrest - as a footrest. - - bugfix: Fixed bedsheets/diskies/plushies/etc put on medical/roller beds facing - the wrong direction. - - bugfix: Fixed bedsheets/diskies/plushies/etc put on any bed facing the wrong direction - on some beds. - - image: Ian bedsheets actually have more than one direction, and so can be put - on beds properly. - Absolucy: - - rscadd: Tomato smudges on the floor are now considered valid to bloodcrawl into - and out of. - Ben10Omintrix: - - bugfix: deers now correctly emote with nearby friends - - bugfix: fixes being able to transform into polymorphed mobs by riding them - Bisar: - - balance: AIs piloting mechs no longer die if they hit the supermatter, nor do - they harmlessly snap back to their core. The shock now causes them to produce - a massive EMP. - - balance: Undid a balance change I did during the malf AI refactor. The doomsday - countdown will no longer stop if a malf AI dominates a mech. - - bugfix: Fixed a few bugs with AI shunting and AI mech death. - - bugfix: The binary conversion circuit component should work again. - - code_imp: The component also now supports representing negative numbers. - BumbertoEko: - - bugfix: Mimes french kisses now activate the sm - DaCoolBoss: - - bugfix: Added missing entries to server config file iceruinblacklist.txt - EnterTheJake: - - rscadd: New Heretic Side Knowledge, Void Prison. - - rscadd: New Void Spell Void Conduit has now replaced Void Blast. - - balance: Void Chill is now a stacking debuff, upon reaching the cap, makes the - target unable to heat up. - - balance: Aristocrat's way now grants immunity to ice and water slips on cold turfs. - - balance: ' Void Cloak now grants low pressure resistance when visible.' - - balance: Void Phase and Void pull have received a minor CD reduction. - - balance: Seeking Blade now applies a couple of stacks of void chill. - - balance: ' Void Heretic Ascension has been overhauled, it''s now protects the - heretic from projectiles, destroys windows and airlocks and applies void chills - to non heretics.' - - image: Void Blade and Void Chill have received some new sprites. - Ghommie: - - bugfix: Fixes mystery boxes breaking after a single use. - Melbert: - - qol: You can watch entertainment monitors from up to seven tiles away, though - you still need to be adjacent(or telekinetic, or a silicon) if you want to change - the channel. - - qol: The way examine looks has been updated. - - qol: A person's ID card no longer appears with a big icon on examine. You can - now click on their ID card (in the chat box) to get a bigger picture of it, - as well as information about them. - - refactor: Much of examine backend code has been refactored, report any odd looking - text. - - bugfix: Trash cannons can be filled with fuel and fired again - SmArtKar: - - bugfix: Fixed missing felinid ear preference - - bugfix: Fixed locker shoving closing and opening the locker thrice, sending its - victim to the backrooms - - bugfix: You no longer return to the station cuffed after being sacrificed by a - heretic - SuperNovaa41: - - bugfix: Fixes getting negative moodlet from fire while immune - SyncIt21: - - bugfix: Mediborg omnitool displays error message for wrong tool in surgery step - hack-wrench: - - rscadd: tape recorder now records speaker name - r3dj4ck0424: - - bugfix: The Syndicate have cleared up the static preventing them from sending - their battlecruisers to Birdshot Station. Watch out, crew! -2024-09-12: - LT3: - - qol: Quick repair suit sensors by hitting yourself with cable coil - - qol: Improved feedback for broken suit sensors - - bugfix: Ctrl+click on equipped uniforms enables suit sensors as expected - Melbert: - - bugfix: Med/sec hud examine - SmArtKar: - - bugfix: You can no longer pick up large parcels with evidence bags due to them - being normal-sized items - carlarctg: - - rscadd: Added an increasing chance for malfunction on repeated failed polling - for MM helmets -2024-09-13: - Bisar: - - bugfix: Fixed up a couple of Void Heretic rework descriptions. - EnterTheJake: - - rscadd: The Wraith Cloaking Module is now available in the uplink, costs 3 TC. - - code_imp: the saboteur handgun now uses a generic proc rather than a signal - Ghommie: - - balance: With enough preparation, good skills and equipment, you can manage to - skip the minigame phase of fishing by reducing the difficulty all the way down - to 0. - - balance: Fish electrogenesis now scales with size. - - rscadd: Pun Pun is a playable crewmember during Monkey Day (14 December). - - bugfix: Fixing fishing not caring whether a reward is limited or not. - Melbert: - - refactor: Storage and Tables are now a lower priority action, meaning some uses - of items on storage should work... better, now. Here's hoping at least, report - any oddities. - - refactor: 'Note: For an overwhelming majority of items, **combat mode** will attempt - to attack/insert into the target, while **non-combat-mode** will attempt to - use on a target. This means screwdrivering or emagging a MODsuit must be done - on non-combat-mode, as combat mode will simply put the screwdriver or emag into - its storage. Same applies to tables, though when in doubt, RMB may help (for - things which are also weapons, like mops).' - - refactor: Refactored escape pod storage, now they actually properly show as unlocked - on red alert and above. - Rhials: - - balance: Teleport blocker implants now prevent implantees from jaunting. - SmArtKar: - - bugfix: You no longer die from bloodloss after polymorphing back from an ahealed - simplemob - Xander3359: - - qol: Infiltrator mod hides your voice - - bugfix: Infiltrator suit now hides moth wings/antenna - - bugfix: hidden moth wings are no longer capable of flight -2024-09-14: - FlufflesTheDog: - - bugfix: Echolocation no longer breaks when witnessing a hologram - - bugfix: Echolocation no longer breaks when witnessing a fulton extraction - - bugfix: Humanoid NPCs are no longer invisible to echolocation users - JohnFulpWillard: - - rscadd: Lighters now use and require welding fuel to work, but can be used as - a welding tool for tasks that don't require much heat. - LT3: - - qol: Medical HUD and crew console can now detect broken (shorted out) suit sensors - needing repair - Oxotnak: - - rscadd: health analyzer now able to print scanned results via Ctrl-shift-click! - - qol: text from healthscan proc now use < br > - Rhials: - - bugfix: Removes some doubled-up railings on the wizard den/ragin' mages shuttle. - SmArtKar: - - code_imp: Minor obsession code cleanup - - admin: Admins can now see players who were previously obsessed but had been "cured" - from the trauma - TheBoondock: - - balance: double the melting point of hull and halves the thermal transfer so plasma - fire should lose less heat and harder to melt it - Timberpoes: - - bugfix: Having the Overflow Role set to On will properly ensure you get that role - at a High priority as intended by the game code. - - bugfix: Job selection is now a little bit more random. Fixes an unintentional - bias in random job assignment that could lead to feast-or-famine for roles where - everyone is assigned one job and nobody is assigned another job. - Vect0r2: - - qol: Adds an additional cable from birdshot SMES units - - qol: Adds two air pumps to birdshot science - - bugfix: bird engineering storage is now connected to the powernet - carlarctg: - - bugfix: The recharging relics now work on ethereal cells. - - balance: EMP now affects ethereal's hunger. - mc-oofert: - - rscadd: you may weld a crate - - code_imp: that one cool haunted donk outpost ruins tripwires and such use a subsystem - instead of globals. no real gameplay effect -2024-09-15: - Ben10Omintrix: - - bugfix: fixes basic AI that are supposed to pause during actions not pausing - Bisar: - - qol: The 'direction' circuit component now also returns the distance of its target. - - balance: Most circuit shells and the generic component and generic circuit have - had their size reduced. - - balance: The airlock circuit shell has had its size increased. - DaCoolBoss: - - rscadd: Adds the Syndicate Lab to the Icemoon ruin pool. - IndieanaJones: - - balance: Gorillas made from giving monkeys genetic damage are weaker than their - normal counterparts. - LT3: - - bugfix: Fixed a mislabelled corpse disposal in Icebox medbay, probably less dead - bodies showing up in cargo - - bugfix: Fixed certain clothing sending suit sensor data when it shouldn't be capable - SmArtKar: - - image: Updated glowing yellow extract sprite - - image: Tanks inside of tank holders have received new sprites - - image: Added a new sprite for mediborg surgical saws - - spellcheck: Fixed a typo in DeForest medical crates - - code_imp: Non-innate engraving blockers should work now (none as of now) - - balance: Humans that never had a player controlling them no longer count towards - changeling absorption counter - TheSmallBlue: - - qol: The z-level button got a refresh! It's now applied to more places and it - should be simpler to use. - Thunder12345: - - bugfix: 'Delta: The disposal unit in the curator''s office is now properly connected - to the disposals system.' - Zytolg: - - qol: The Birdshot Tool Storage has been resupplied. New tools are at the crews - displosal. -2024-09-16: - Ghommie: - - bugfix: Fishing with baits works again. - - bugfix: Water turfs from the crashed site ruin on lavaland are no longer named - "lavaland atmos". - - bugfix: Fixed morbid mobs (coroners) not enjoying room beauty and aquariums in - their own weird ways. - - rscadd: You an now release fish after catching it for a positive moodlet (or to - repopulate certain fishing spot with rare fish). - - bugfix: Bitrunning fishing spots no longer deplete limited loot from outside the - virtual reality. - - bugfix: The treasure chest from the beach is no longer anchored to the floor. - - bugfix: Fixed aquarium props not showing up inside the aquarium. - - admin: godmode is now a datum trait instead of a bitflag. This means the process - for toggling it is a little different now. - - rscadd: Whole, unprocessed fish is now edible. However it's pretty much reccomended - to grill or fry it for over 30 spess seconds before attempting to eat it. - - bugfix: germ-covered, dirty food no longer tries to infect you through contact. - - bugfix: Fixed the offsets of the chimp shotgun when held. - - qol: Add a screentip to shields and pillows' right-click function (shoving people). - - rscadd: Automated announcement systems now announce researched nodes to their - respective departments. You can stop this by either disabling the announcement - systems or by using a multitool on the circuitboard of the console you're researching - nodes from. - - bugfix: Fixed the force of swordfish and armored pikes - - rscadd: Gave the detective an ID that can flipped to look like an assistant ID. - - balance: The detective camera is now silent and doesn't flash. - Jewelry-x: - - spellcheck: fixed typos on heretic's "Lionhunter's Rifle" - vinylspiders: - - bugfix: fixes being able to use chuunibyou shouts while mute - - bugfix: fixed crafted donuts not getting any sprinkles, ever -2024-09-17: - Ghommie: - - bugfix: You once again need to right click to use tackling gloves. - Melbert: - - qol: You can dump bodybags (with people inside them) down disposals - MelokGleb: - - spellcheck: busser is now Busser (with big B) - Pickle-Coding: - - bugfix: Fixes high energy supermatter zaps arcing through an unusually high amount - of objects and ignoring grounding rods. - PowerfulBacon: - - rscadd: Implements the ability to lint for required neighbors in maplint. - - rscadd: Adds conditional linting rules in maplint, allowing a lint to apply only - if certain conditions are met (Variable is/isn't set, Variable is/isn't a value, - Variable matches a regex). - SmArtKar: - - refactor: Refactored how examines display item properties. A lot of them are now - displayed as tags that you can hover over to receive details about, like item - size, resistances and materials an object is made of. - - qol: Protection classes now better elaborate on thermal resistances of items, - displaying the exact temperatures they can protect you from. - - bugfix: You can now craft things on tiles with windoors and railings on them. - - qol: Added a small vertical margin to ID card image in new examine panel to ensure - that it doesn't collide with text - - bugfix: Your UI no longer breaks after being kidnapped by a contractor - - qol: Being kidnapped by a contractor no longer dumps all of your boxes and belts - - bugfix: Dismantling walls with plasma cutters works once more - Time-Green: - - bugfix: Fixes plasmamen having all external organ species preferences - vinylspiders: - - bugfix: smartfridges and drying racks will now display their examine text information - mutlilined -2024-09-18: - Bumtickley00: - - bugfix: Penlights can once again be used to look at people's eyes and mouth. - Ghommie: - - bugfix: examining fishing spots while wielding a rod (with sufficient skill) now - works. - - rscadd: Your current clothes and what chair you sit on can now influence the difficulty - of fishing minigames. Having a bare minimum of fishing skill will let you distinguish - which objects can help and which won't, so keep an eye out. Holding fishing - toolboxes, fish analyzers or fish catalogs can also help. - Jewelry-x: - - bugfix: fixes description for blob reagents - SmArtKar: - - bugfix: Changing ID card's trim now properly adjusts linked bank account's job, - allowing you to receive bounties for your new job - - bugfix: Fixed petrification not removing NOBLOOD trait after ending - - bugfix: Fixed veteran advisor not spawning on security officer landmarks - SyncIt21: - - bugfix: borgs can perform organ manipulation surgery again - deathrobotpunch: - - rscadd: Added new fishing category to games vendor -2024-09-19: - Bisar: - - bugfix: Xenomorph restrictions on items they can pick up have had their determining - logic made more _robust_. - - code_imp: The itempicky component (restricts what can be picked up via a whitelist) - can now, optionally, have a callback fed to it to determine cases of bypassing - that whitelist. - DaCoolBoss: - - spellcheck: Fixed typos in lead's description. - - spellcheck: Mice now love the taste of insulated electrical cables, not uninsulated - ones. - Ghommie: - - rscadd: You can now link fishing portal generators to other fishing spots with - a multitool. The number of fishing spots that can be linked at once and whether - the link can be activated from different z levels depends on the tier of the - stock parts it's built with. - - rscadd: You can pet fish while holding them. Be wary of petting aggressive fish. - Goat: - - bugfix: lockers and crates with no access requirements can now be renamed by anyone - Jewelry-x: - - bugfix: fixed a bug that allows autogrow to be turned on with no power. - - qol: made blob antag panel easier to read and more organized - - spellcheck: fixed a few typos in the blob panel - Kocma-san: - - bugfix: fixed disposal pipes on metastation, deltastation and icebox - SmArtKar: - - bugfix: Vore victims no longer get digested instantly when you evolve - - bugfix: Collars can no longer be used to null a pet's name - - bugfix: Snow bears are no longer impervious to all sources of damage - - bugfix: Cameras, living floors and ghost of poly no longer can be pushed around -2024-09-20: - EnterTheJake: - - balance: Security Flashbangs can no longer be primed for instant detonation. - Goat: - - 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. - Jewelry-x: - - bugfix: Lobby crew manifest has colour again - - qol: made it clearer that the expansion in space failed for blob instead of wildly - flailing at space. - LT3: - - bugfix: Fixed missing examine text for the yellow medical HUD border regarding - suit sensors - SmArtKar: - - 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 - SmArtKar, Kapu: - - bugfix: Agent ID cards no longer display broken text when you put non-letter symbols - as your name - SyncIt21: - - bugfix: apc breaker properly shuts off all power - Vect0r2: - - rscadd: Added the remote power AI disk - - code_imp: made it possible to easily add new AI upgrade disks - WebcomicArtist: - - 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. - carlarctg: - - 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. - thegrb93: - - bugfix: Downstream species not getting internals they need when joining ERT -2024-09-21: - 00-Steven: - - 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. - Bisar: - - balance: Meteor shielding is now purchasable at cargo even if it isn't the current - station goal. - DaCoolBoss: - - 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.' - Deadgebert: - - 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. - FlufflesTheDog: - - bugfix: Icebox's virology airlock cycles properly again - Hardly3D: - - image: Resprited Short Bangs 2 & Double Buns - Iajret: - - bugfix: Mining mods can be charged with plasma once again - LT3: - - spellcheck: Fruit crate description now correctly warns that it contains lemons - Melbert: - - balance: Laser pointers have a 50% chance to fail when used on people wearing - eyepatches - - qol: Deceased and asleep humanoids will now close their eyes - MelokGleb: - - bugfix: doors in museum now work correctly - Rhials: - - bugfix: You can no longer backdoor security records using the Metastation Central - bitrunner domain. - SmArtKar: - - bugfix: Fixed wallmounts not being mountable by using a screwdriver on them - - bugfix: Fixed robotic revival surgery showing up for simplemobs - Xackii: - - bugfix: Gateway museum keycard now spawns in toilet properly. - carlarctg: - - bugfix: Legions borne from mimes can no longer talk - - spellcheck: Removes caps from many improper items - - qol: Adds shorthand alt-click for removing tanks from TTVs and adds context for - it - san7890: - - 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. -2024-09-22: - Ben10Omintrix: - - bugfix: botkeeper now displays bot's correct states! - Goat: - - bugfix: Virtual pirates were yelled at by the virtual syndicate and no longer - have virtual syndicate headsets. - GregariousJB: - - rscadd: 'Added three programs to cyborg PDAs: SiliConnect, AtmoZphere, and Crew - Manifest' - Kocma-san: - - bugfix: '"Visible to Network" in the fax interface is now displayed correctly' - LT3: - - bugfix: Fixed incomplete floodlights calling all light tubes broken - Likteer: - - bugfix: Plasmamen envirohelmets no longer erroneously apply a slowdown. - Rhials: - - bugfix: The Meta Central Virtual Domain now uses the proper ghost role spawner, - meaning you can't eavesdrop on syndie comms using their headset. - SyncIt21: - - bugfix: moving or rotating a mech will cancel its hydraulic clamp action - carlarctg: - - qol: Durathread vests now fit botany items as well as armor items - - code_imp: Botany suits now all inherit the same list - - 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. diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index d8b68c88d3812..7923b4e9f1ea9 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/hud/lobby/signup_button.dmi b/icons/hud/lobby/signup_button.dmi index e015fa71948a3..bc5f1f7f24ac0 100644 Binary files a/icons/hud/lobby/signup_button.dmi and b/icons/hud/lobby/signup_button.dmi differ diff --git a/icons/hud/radial_fishing.dmi b/icons/hud/radial_fishing.dmi index 6870698fbe689..65fd55176b7c8 100644 Binary files a/icons/hud/radial_fishing.dmi and b/icons/hud/radial_fishing.dmi differ diff --git a/icons/hud/screen_alert.dmi b/icons/hud/screen_alert.dmi index 96a990090f518..10d0b741f0b7c 100644 Binary files a/icons/hud/screen_alert.dmi and b/icons/hud/screen_alert.dmi differ diff --git a/icons/hud/screen_alien.dmi b/icons/hud/screen_alien.dmi index 5f3806dc7bb57..21d7cde0b0383 100644 Binary files a/icons/hud/screen_alien.dmi and b/icons/hud/screen_alien.dmi differ diff --git a/icons/hud/screen_clockwork.dmi b/icons/hud/screen_clockwork.dmi index 809dfe8f1a833..17e0c92972e25 100644 Binary files a/icons/hud/screen_clockwork.dmi and b/icons/hud/screen_clockwork.dmi differ diff --git a/icons/hud/screen_cyborg.dmi b/icons/hud/screen_cyborg.dmi index 2c737ea115f3a..0b17f099607f9 100644 Binary files a/icons/hud/screen_cyborg.dmi and b/icons/hud/screen_cyborg.dmi differ diff --git a/icons/hud/screen_detective.dmi b/icons/hud/screen_detective.dmi index 818bbcfc78b6f..9704ca96f4c12 100644 Binary files a/icons/hud/screen_detective.dmi and b/icons/hud/screen_detective.dmi differ diff --git a/icons/hud/screen_glass.dmi b/icons/hud/screen_glass.dmi index 3cf16106cd868..6b6d9d515c5f0 100644 Binary files a/icons/hud/screen_glass.dmi and b/icons/hud/screen_glass.dmi differ diff --git a/icons/hud/screen_midnight.dmi b/icons/hud/screen_midnight.dmi index 5de157be030f4..8a6f2e1e8e06c 100644 Binary files a/icons/hud/screen_midnight.dmi and b/icons/hud/screen_midnight.dmi differ diff --git a/icons/hud/screen_operative.dmi b/icons/hud/screen_operative.dmi index 5fbaa7c5d5d24..73afee5b3ca40 100644 Binary files a/icons/hud/screen_operative.dmi and b/icons/hud/screen_operative.dmi differ diff --git a/icons/hud/screen_plasmafire.dmi b/icons/hud/screen_plasmafire.dmi index d8b669c96c805..b0b2c7999c92d 100644 Binary files a/icons/hud/screen_plasmafire.dmi and b/icons/hud/screen_plasmafire.dmi differ diff --git a/icons/hud/screen_retro.dmi b/icons/hud/screen_retro.dmi index f3621569d76d1..a0d5abf3be511 100644 Binary files a/icons/hud/screen_retro.dmi and b/icons/hud/screen_retro.dmi differ diff --git a/icons/hud/screen_slimecore.dmi b/icons/hud/screen_slimecore.dmi index a6160087ab889..84a7abec2be5f 100644 Binary files a/icons/hud/screen_slimecore.dmi and b/icons/hud/screen_slimecore.dmi differ diff --git a/icons/hud/screen_trasenknox.dmi b/icons/hud/screen_trasenknox.dmi index 4e17feb5211d0..00ad01258a36a 100644 Binary files a/icons/hud/screen_trasenknox.dmi and b/icons/hud/screen_trasenknox.dmi differ diff --git a/icons/mob/actions/actions_ecult.dmi b/icons/mob/actions/actions_ecult.dmi index d287622f898e5..3ce72ae54ffe7 100644 Binary files a/icons/mob/actions/actions_ecult.dmi and b/icons/mob/actions/actions_ecult.dmi differ diff --git a/icons/mob/huds/hud.dmi b/icons/mob/huds/hud.dmi index 3739113f824ae..086e886bab7b2 100644 Binary files a/icons/mob/huds/hud.dmi and b/icons/mob/huds/hud.dmi differ diff --git a/icons/mob/human/human_face.dmi b/icons/mob/human/human_face.dmi index 9c6c333f05b29..5b3b141c7edb0 100644 Binary files a/icons/mob/human/human_face.dmi and b/icons/mob/human/human_face.dmi differ diff --git a/icons/mob/inhands/64x64_lefthand.dmi b/icons/mob/inhands/64x64_lefthand.dmi index 4ef1c071abfa2..14f35aa9ef050 100644 Binary files a/icons/mob/inhands/64x64_lefthand.dmi and b/icons/mob/inhands/64x64_lefthand.dmi differ diff --git a/icons/mob/inhands/64x64_righthand.dmi b/icons/mob/inhands/64x64_righthand.dmi index 5d087c0b36f9c..102417e36f5b7 100644 Binary files a/icons/mob/inhands/64x64_righthand.dmi and b/icons/mob/inhands/64x64_righthand.dmi differ diff --git a/icons/mob/silicon/robot_items.dmi b/icons/mob/silicon/robot_items.dmi index bece0211ec8ef..2cb809fe2724b 100644 Binary files a/icons/mob/silicon/robot_items.dmi and b/icons/mob/silicon/robot_items.dmi differ diff --git a/icons/obj/bedsheets.dmi b/icons/obj/bedsheets.dmi index 46fb26ebb1863..daa0c3cdd7904 100644 Binary files a/icons/obj/bedsheets.dmi and b/icons/obj/bedsheets.dmi differ diff --git a/icons/obj/canisters.dmi b/icons/obj/canisters.dmi index 0b38b08f98cf1..1555cf0a4782e 100644 Binary files a/icons/obj/canisters.dmi and b/icons/obj/canisters.dmi differ diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index 738d3e51a3a93..dcfb7f482ae4c 100644 Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ diff --git a/icons/obj/clothing/modsuit/mod_modules.dmi b/icons/obj/clothing/modsuit/mod_modules.dmi index 9d5600dab8073..5cab83c56d5b2 100644 Binary files a/icons/obj/clothing/modsuit/mod_modules.dmi and b/icons/obj/clothing/modsuit/mod_modules.dmi differ diff --git a/icons/obj/fishing.dmi b/icons/obj/fishing.dmi index 9c6a535fd839e..2344d2b8ed9e6 100644 Binary files a/icons/obj/fishing.dmi and b/icons/obj/fishing.dmi differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 0a953cff78272..2bda7341e518f 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/icons/obj/storage/box.dmi b/icons/obj/storage/box.dmi index 79f7eff2a678d..747fb5462c7df 100644 Binary files a/icons/obj/storage/box.dmi and b/icons/obj/storage/box.dmi differ diff --git a/icons/obj/storage/crates.dmi b/icons/obj/storage/crates.dmi index 5f8fecab7a0ff..a5a26c285a7d6 100644 Binary files a/icons/obj/storage/crates.dmi and b/icons/obj/storage/crates.dmi differ diff --git a/icons/obj/weapons/cannons.dmi b/icons/obj/weapons/cannons.dmi index 93b43b19239bd..b9735ba0aef9f 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 2dab0cb3d8d08..971bdaf4d2041 100644 Binary files a/icons/obj/weapons/guns/ammo.dmi and b/icons/obj/weapons/guns/ammo.dmi differ diff --git a/icons/obj/weapons/guns/ballistic.dmi b/icons/obj/weapons/guns/ballistic.dmi index ef61f1d24949d..4ebb17baec329 100644 Binary files a/icons/obj/weapons/guns/ballistic.dmi and b/icons/obj/weapons/guns/ballistic.dmi differ diff --git a/icons/obj/weapons/khopesh.dmi b/icons/obj/weapons/khopesh.dmi index 7c0d54a7140b9..6f4a040f6a410 100644 Binary files a/icons/obj/weapons/khopesh.dmi and b/icons/obj/weapons/khopesh.dmi differ diff --git a/icons/turf/overlays.dmi b/icons/turf/overlays.dmi index cfa61de424971..2b78f1ae40b41 100644 Binary files a/icons/turf/overlays.dmi and b/icons/turf/overlays.dmi differ diff --git a/modular_doppler/cryosleep/code/job.dm b/modular_doppler/cryosleep/code/job.dm index f7d9af2c6d07f..fcd218d473918 100644 --- a/modular_doppler/cryosleep/code/job.dm +++ b/modular_doppler/cryosleep/code/job.dm @@ -1,8 +1,8 @@ /datum/controller/subsystem/job/proc/FreeRole(rank) if(!rank) return - job_debug("Freeing role: [rank]") - var/datum/job/job = get_job(rank) + JobDebug("Freeing role: [rank]") + var/datum/job/job = GetJob(rank) if(!job) return FALSE job.current_positions = max(0, job.current_positions - 1) @@ -11,8 +11,8 @@ /datum/controller/subsystem/job/proc/OccupyRole(rank) if(!rank) return FALSE - job_debug("Occupying role: [rank]") - var/datum/job/job = get_job(rank) + JobDebug("Occupying role: [rank]") + var/datum/job/job = GetJob(rank) if(!job || job.current_positions >= job.total_positions) return FALSE job.current_positions = job.current_positions + 1 diff --git a/modular_doppler/enterprise_resource_planning/code/breasts.dm b/modular_doppler/enterprise_resource_planning/code/breasts.dm index 28263478d6471..cf2a8ea4772cc 100644 --- a/modular_doppler/enterprise_resource_planning/code/breasts.dm +++ b/modular_doppler/enterprise_resource_planning/code/breasts.dm @@ -261,93 +261,3 @@ /datum/sprite_accessory/breasts/pair/size12 name = "Pair 12" icon_state = "pair_12" - -/datum/sprite_accessory/breasts/pair/typeA - name = "Type A" - icon_state = "pair_type_a" - -/datum/sprite_accessory/breasts/pair/typeB - name = "Type B" - icon_state = "pair_type_b" - -/datum/sprite_accessory/breasts/pair/typeC - name = "Type C" - icon_state = "pair_type_c" - -/datum/sprite_accessory/breasts/pair/typeD - name = "Type D" - icon_state = "pair_type_d" - -/// SKINTONE VERSIONS -/datum/sprite_accessory/breasts/skintone - icon = 'modular_doppler/enterprise_resource_planning/icons/mob/breasts_skintone.dmi' - name = "Skintone Bare" - icon_state = "bare" - -/datum/sprite_accessory/breasts/skintone/pair - name = "Skintone Pair 0" - icon_state = "pair_0" - -/datum/sprite_accessory/breasts/skintone/pair/size1 - name = "Skintone Pair 1" - icon_state = "pair_1" - -/datum/sprite_accessory/breasts/skintone/pair/size2 - name = "Skintone Pair 2" - icon_state = "pair_2" - -/datum/sprite_accessory/breasts/skintone/pair/size3 - name = "Skintone Pair 3" - icon_state = "pair_3" - -/datum/sprite_accessory/breasts/skintone/pair/size4 - name = "Skintone Pair 4" - icon_state = "pair_4" - -/datum/sprite_accessory/breasts/skintone/pair/size5 - name = "Skintone Pair 5" - icon_state = "pair_5" - -/datum/sprite_accessory/breasts/skintone/pair/size6 - name = "Skintone Pair 6" - icon_state = "pair_6" - -/datum/sprite_accessory/breasts/skintone/pair/size7 - name = "Skintone Pair 7" - icon_state = "pair_7" - -/datum/sprite_accessory/breasts/skintone/pair/size8 - name = "Skintone Pair 8" - icon_state = "pair_8" - -/datum/sprite_accessory/breasts/skintone/pair/size9 - name = "Skintone Pair 9" - icon_state = "pair_9" - -/datum/sprite_accessory/breasts/skintone/pair/size10 - name = "Skintone Pair 10" - icon_state = "pair_10" - -/datum/sprite_accessory/breasts/skintone/pair/size11 - name = "Skintone Pair 11" - icon_state = "pair_11" - -/datum/sprite_accessory/breasts/skintone/pair/size12 - name = "Skintone Pair 12" - icon_state = "pair_12" - -/datum/sprite_accessory/breasts/skintone/pair/typeA - name = "Skintone Pair Type A" - icon_state = "pair_type_a" - -/datum/sprite_accessory/breasts/skintone/pair/typeB - name = "Skintone Pair Type B" - icon_state = "pair_type_b" - -/datum/sprite_accessory/breasts/skintone/pair/typeC - name = "Skintone Pair Type C" - icon_state = "pair_type_c" - -/datum/sprite_accessory/breasts/skintone/pair/typeD - name = "Skintone Pair Type D" - icon_state = "pair_type_d" diff --git a/modular_doppler/enterprise_resource_planning/icons/mob/breasts.dmi b/modular_doppler/enterprise_resource_planning/icons/mob/breasts.dmi index 13d51740359a3..b08334e0dbc98 100644 Binary files a/modular_doppler/enterprise_resource_planning/icons/mob/breasts.dmi and b/modular_doppler/enterprise_resource_planning/icons/mob/breasts.dmi differ diff --git a/modular_doppler/enterprise_resource_planning/icons/organs.dmi b/modular_doppler/enterprise_resource_planning/icons/organs.dmi index 0649e0705ac54..51dc172e8527c 100644 Binary files a/modular_doppler/enterprise_resource_planning/icons/organs.dmi and b/modular_doppler/enterprise_resource_planning/icons/organs.dmi differ diff --git a/modular_doppler/hearthkin/primitive_catgirls/code/clothing.dm b/modular_doppler/hearthkin/primitive_catgirls/code/clothing.dm index 7e48b3b337cc8..15e6e8a61451f 100644 --- a/modular_doppler/hearthkin/primitive_catgirls/code/clothing.dm +++ b/modular_doppler/hearthkin/primitive_catgirls/code/clothing.dm @@ -50,7 +50,7 @@ body_parts_covered = GROIN|CHEST greyscale_config = /datum/greyscale_config/primitive_catgirl_tunic greyscale_config_worn = /datum/greyscale_config/primitive_catgirl_tunic/worn - greyscale_colors = "#ccd1db#dce0f2#594032" + greyscale_colors = "#cec8bf#faece4#594032" flags_1 = IS_PLAYER_COLORABLE_1 has_sensor = FALSE @@ -124,18 +124,15 @@ // Shoes /obj/item/clothing/shoes/winterboots/ice_boots/primitive_catgirl_boots - name = "primitive hiking boots" - desc = "A pair of heavy boots lined with fur and with soles special built to prevent slipping on ice." - icon_state = "boots" - icon = 'modular_doppler/hearthkin/primitive_catgirls/icons/clothing_greyscale.dmi' - worn_icon = 'modular_doppler/hearthkin/primitive_catgirls/icons/clothing_greyscale.dmi' - supports_variations_flags = CLOTHING_NO_VARIATION - supported_bodyshapes = null - bodyshape_icon_files = null - greyscale_config = /datum/greyscale_config/primitive_catgirl_boots - greyscale_config_worn = /datum/greyscale_config/primitive_catgirl_boots/worn - greyscale_colors = "#594032#cec8bf" - flags_1 = IS_PLAYER_COLORABLE_1 + name = "primitive hiking boots" + desc = "A pair of heavy boots lined with fur and with soles special built to prevent slipping on ice." + icon_state = "boots" + icon = 'modular_doppler/hearthkin/primitive_catgirls/icons/clothing_greyscale.dmi' + worn_icon = 'modular_doppler/hearthkin/primitive_catgirls/icons/clothing_greyscale.dmi' + greyscale_config = /datum/greyscale_config/primitive_catgirl_boots + greyscale_config_worn = /datum/greyscale_config/primitive_catgirl_boots/worn + greyscale_colors = "#594032#cec8bf" + flags_1 = IS_PLAYER_COLORABLE_1 // Neck diff --git a/modular_doppler/hearthkin/primitive_catgirls/code/clothing_vendor.dm b/modular_doppler/hearthkin/primitive_catgirls/code/clothing_vendor.dm index 9ac3a81dfed89..04fe22a194a53 100644 --- a/modular_doppler/hearthkin/primitive_catgirls/code/clothing_vendor.dm +++ b/modular_doppler/hearthkin/primitive_catgirls/code/clothing_vendor.dm @@ -27,10 +27,10 @@ /obj/item/clothing/neck/large_scarf/primitive_catgirl_off_white = 5, /obj/item/clothing/neck/infinity_scarf/primitive_catgirl_blue = 5, // /obj/item/clothing/neck/mantle/recolorable/primitive_catgirl_off_white = 5, - /obj/item/clothing/neck/ranger_poncho/ = 5, - /obj/item/clothing/neck/wide_cape = 5, - /obj/item/clothing/neck/robe_cape = 5, - /obj/item/clothing/neck/long_cape = 5, + // /obj/item/clothing/neck/ranger_poncho/primitive_catgirl_leather = 5, + // /obj/item/clothing/neck/wide_cape = 5, + // /obj/item/clothing/neck/robe_cape = 5, + // /obj/item/clothing/neck/long_cape = 5, // /obj/item/clothing/glasses/eyepatch/wrap = 5, /obj/item/clothing/head/primitive_catgirl_ferroniere = 5, /obj/item/clothing/head/pelt/snow_tiger = 5, diff --git a/modular_doppler/hearthkin/primitive_catgirls/code/spawner.dm b/modular_doppler/hearthkin/primitive_catgirls/code/spawner.dm index 3b5e5170d0192..d10dfa45615c9 100644 --- a/modular_doppler/hearthkin/primitive_catgirls/code/spawner.dm +++ b/modular_doppler/hearthkin/primitive_catgirls/code/spawner.dm @@ -286,10 +286,6 @@ /datum/crafting_recipe/black_pelt_bed, /datum/crafting_recipe/white_pelt_bed, /datum/crafting_recipe/frozen_breath, - /datum/crafting_recipe/black_pelts_rug, - /datum/crafting_recipe/white_pelts_rug, - /datum/crafting_recipe/bronze_calling_horn, - /datum/crafting_recipe/hearthkin_rune_stone, ) /datum/antagonist/primitive_catgirl/Destroy() diff --git a/modular_doppler/hearthkin/primitive_catgirls/icons/clothing_greyscale.dmi b/modular_doppler/hearthkin/primitive_catgirls/icons/clothing_greyscale.dmi index bebaf23cfab2f..4599c4404da66 100644 Binary files a/modular_doppler/hearthkin/primitive_catgirls/icons/clothing_greyscale.dmi and b/modular_doppler/hearthkin/primitive_catgirls/icons/clothing_greyscale.dmi differ diff --git a/modular_doppler/hearthkin/primitive_production/code/ceramics.dm b/modular_doppler/hearthkin/primitive_production/code/ceramics.dm index 80c849bd2fb29..a7105a0ca4359 100644 --- a/modular_doppler/hearthkin/primitive_production/code/ceramics.dm +++ b/modular_doppler/hearthkin/primitive_production/code/ceramics.dm @@ -140,11 +140,6 @@ GLOBAL_LIST_INIT(clay_recipes, list ( \ icon_state = "clay_bowl" custom_materials = null -/obj/item/reagent_containers/cup/bowl/ceramic/update_icon_state() - if(!reagents.total_volume) - icon_state = "clay_bowl" - return ..() - /obj/item/ceramic/cup name = "ceramic cup" desc = "A piece of clay with high walls, in the shape of a cup. It can hold 120 units." diff --git a/modular_doppler/hearthkin/primitive_structures/code/furniture.dm b/modular_doppler/hearthkin/primitive_structures/code/furniture.dm index 96c4b9833472d..92333fc129b87 100644 --- a/modular_doppler/hearthkin/primitive_structures/code/furniture.dm +++ b/modular_doppler/hearthkin/primitive_structures/code/furniture.dm @@ -71,66 +71,3 @@ ) result = /obj/structure/bed/double/pelt/black - -// Hearthkin Exclusive Decorations -/obj/structure/rugs/pelt/ - name = "white pelts rug" - desc = "A luxurious rug, made from bear pelts." - icon_state = "fur_rug_white" - icon = 'modular_doppler/hearthkin/primitive_structures/icons/fur_rugs.dmi' - resistance_flags = FLAMMABLE - max_integrity = 100 - integrity_failure = 0.35 - bound_height = 64 - -//Deconstruct code -/obj/structure/rugs/pelt/attackby(obj/item/attacking_item, mob/user, params) - if(!istype(attacking_item, /obj/item/knife/)) - return ..() - balloon_alert_to_viewers("cutting...") - if(!do_after(user, 5 SECONDS, target = src)) - balloon_alert_to_viewers("stopped cutting") - return FALSE - deconstruct(TRUE) - -/obj/structure/rugs/pelt/atom_deconstruct(disassembled) - var/obj/item/stack/sheet/animalhide/goliath_hide/polar_bear_hide/polar_bear_hide = new(drop_location(), 4) - transfer_fingerprints_to(polar_bear_hide) - return ..() - -//Anchor code -/obj/structure/rugs/pelt/click_ctrl(mob/user) - set_anchored(!anchored) - balloon_alert(user, "[anchored ? "secured" : "unsecured"]") - -//Crafting code - -/datum/crafting_recipe/white_pelts_rug - name = "White Pelts Rug" - category = CAT_FURNITURE - //recipe given to icecats as part of their spawner/team setting - crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED | CRAFT_ONE_PER_TURF - - reqs = list( - /obj/item/stack/sheet/animalhide/goliath_hide/polar_bear_hide = 4, - ) - - result = /obj/structure/rugs/pelt/ - -/obj/structure/rugs/pelt/black - name = "black pelts rug" - desc = "A luxurious rug, made from bear pelts, and black dye." - icon_state = "fur_rug_black" - icon = 'modular_doppler/hearthkin/primitive_structures/icons/fur_rugs.dmi' - -/datum/crafting_recipe/black_pelts_rug - name = "Black Pelts Rug" - category = CAT_FURNITURE - //recipe given to icecats as part of their spawner/team setting - crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED | CRAFT_ONE_PER_TURF - - reqs = list( - /obj/item/stack/sheet/animalhide/goliath_hide/polar_bear_hide = 4, - ) - - result = /obj/structure/rugs/pelt/black diff --git a/modular_doppler/hearthkin/tribal_extended/code/crafting.dm b/modular_doppler/hearthkin/tribal_extended/code/crafting.dm index 7aa15b77916e1..b6705ad928954 100644 --- a/modular_doppler/hearthkin/tribal_extended/code/crafting.dm +++ b/modular_doppler/hearthkin/tribal_extended/code/crafting.dm @@ -19,7 +19,7 @@ fill_icon_state = "fullbowl" fill_icon = 'icons/obj/mining_zones/ash_flora.dmi' -/obj/item/reagent_containers/cup/bowl/wood_bowl/update_icon_state() +/obj/item/reagent_containers/cup/bowl/mushroom_bowl/update_icon_state() if(!reagents.total_volume) icon_state = "wood_bowl" return ..() diff --git a/modular_doppler/modular_antagonists/sapper_gang/sapper_event.dm b/modular_doppler/modular_antagonists/sapper_gang/sapper_event.dm index a2819bc00a325..1f07beb93e9a3 100644 --- a/modular_doppler/modular_antagonists/sapper_gang/sapper_event.dm +++ b/modular_doppler/modular_antagonists/sapper_gang/sapper_event.dm @@ -55,7 +55,7 @@ var/datum/team/sapper/gang = new new_character.forceMove(pick_n_take(spawn_locs)) - new_character.mind.set_assigned_role(SSjob.get_job_type(/datum/job/space_sapper)) + new_character.mind.set_assigned_role(SSjob.GetJobType(/datum/job/space_sapper)) new_character.mind.special_role = ROLE_SPACE_SAPPER new_character.mind.add_antag_datum(/datum/antagonist/sapper, gang) new_character.mind.active = TRUE @@ -122,7 +122,7 @@ var/list/mind_list = list(mind_one, mind_two) for(var/datum/mind/minds as anything in mind_list) - minds.set_assigned_role(SSjob.get_job_type(/datum/job/space_sapper)) + minds.set_assigned_role(SSjob.GetJobType(/datum/job/space_sapper)) minds.special_role = ROLE_SPACE_SAPPER minds.active = TRUE diff --git a/modular_doppler/modular_cosmetics/code/neck/collar.dm b/modular_doppler/modular_cosmetics/code/neck/collar.dm index b104efadfebdb..431c519d85bc7 100644 --- a/modular_doppler/modular_cosmetics/code/neck/collar.dm +++ b/modular_doppler/modular_cosmetics/code/neck/collar.dm @@ -21,6 +21,12 @@ if(treat_path) new treat_path(src) +// incompatible storage by default stops attack chain, but this does not, allows pen renaming +// Cherrypicking tgstation #85512 may have broken this and I cannot presently be bothered trying to debug it if it is broken +/* +/obj/item/clothing/neck/human_petcollar/storage_insert_on_interacted_with(datum/storage/storage, obj/item/inserted, mob/living/user) + return is_type_in_typecache(inserted, storage.can_hold)*/ + /obj/item/clothing/neck/human_petcollar/leather name = "leather pet collar" icon_state = "leather" diff --git a/modular_doppler/modular_crafting/code/sheet_types.dm b/modular_doppler/modular_crafting/code/sheet_types.dm index 2298df03d11cb..f9e2ef3710918 100644 --- a/modular_doppler/modular_crafting/code/sheet_types.dm +++ b/modular_doppler/modular_crafting/code/sheet_types.dm @@ -48,7 +48,6 @@ GLOBAL_LIST_INIT(doppler_plasteel_recipes, list( GLOBAL_LIST_INIT(doppler_rod_recipes, list( new/datum/stack_recipe("crutch", /obj/item/cane/crutch, 3, time = 1 SECONDS, category = CAT_TOOLS), new/datum/stack_recipe("torch mount", /obj/item/wallframe/torch_mount, 2, category = CAT_MISC), - new/datum/stack_recipe("towel bin", /obj/structure/towel_bin/empty, 2, time = 0.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY, category = CAT_CONTAINERS), )) /obj/item/stack/rods/get_main_recipes() @@ -93,7 +92,6 @@ GLOBAL_LIST_INIT(doppler_cardboard_recipes, list( // Cloth GLOBAL_LIST_INIT(doppler_cloth_recipes, list( - new/datum/stack_recipe("towel", /obj/item/towel, 2, category = CAT_CLOTHING), new/datum/stack_recipe("eyepatch", /obj/item/clothing/glasses/eyepatch, 2, category = CAT_CLOTHING), new/datum/stack_recipe("xenoarch bag", /obj/item/storage/bag/xenoarch, 4, category = CAT_CONTAINERS), )) diff --git a/modular_doppler/modular_customization/accessories/code/non_species_specific/canine_accessories/canine_tail.dm b/modular_doppler/modular_customization/accessories/code/non_species_specific/canine_accessories/canine_tail.dm index c839611e43ae8..1067cde310ef0 100644 --- a/modular_doppler/modular_customization/accessories/code/non_species_specific/canine_accessories/canine_tail.dm +++ b/modular_doppler/modular_customization/accessories/code/non_species_specific/canine_accessories/canine_tail.dm @@ -13,10 +13,6 @@ name = "Straight" icon_state = "straighttail" -/datum/sprite_accessory/tails/dog/shortpup - name = "Short" - icon_state = "shortpup" - /datum/sprite_accessory/tails/fox icon = 'modular_doppler/modular_customization/accessories/icons/non_species_specific/canine/canine_tail.dmi' diff --git a/modular_doppler/modular_customization/accessories/icons/aquatic/aquatic_snouts.dmi b/modular_doppler/modular_customization/accessories/icons/aquatic/aquatic_snouts.dmi index a338cf5fe3674..658f4d7aa80fe 100644 Binary files a/modular_doppler/modular_customization/accessories/icons/aquatic/aquatic_snouts.dmi and b/modular_doppler/modular_customization/accessories/icons/aquatic/aquatic_snouts.dmi differ diff --git a/modular_doppler/modular_customization/accessories/icons/lizard/lizard_ears.dmi b/modular_doppler/modular_customization/accessories/icons/lizard/lizard_ears.dmi index d67369f7e096e..a71281c70bd02 100644 Binary files a/modular_doppler/modular_customization/accessories/icons/lizard/lizard_ears.dmi and b/modular_doppler/modular_customization/accessories/icons/lizard/lizard_ears.dmi differ diff --git a/modular_doppler/modular_customization/accessories/icons/lizard/lizard_tail.dmi b/modular_doppler/modular_customization/accessories/icons/lizard/lizard_tail.dmi index d156e0c34c105..ec96697b74a64 100644 Binary files a/modular_doppler/modular_customization/accessories/icons/lizard/lizard_tail.dmi and b/modular_doppler/modular_customization/accessories/icons/lizard/lizard_tail.dmi differ diff --git a/modular_doppler/modular_customization/accessories/icons/lizard/lizard_tail_big.dmi b/modular_doppler/modular_customization/accessories/icons/lizard/lizard_tail_big.dmi index 8746eaa276bc5..806881a8979a5 100644 Binary files a/modular_doppler/modular_customization/accessories/icons/lizard/lizard_tail_big.dmi and b/modular_doppler/modular_customization/accessories/icons/lizard/lizard_tail_big.dmi differ diff --git a/modular_doppler/modular_customization/accessories/icons/non_species_specific/canine/canine_tail.dmi b/modular_doppler/modular_customization/accessories/icons/non_species_specific/canine/canine_tail.dmi index 4bbd8281b47a1..ffa8c0d0a88eb 100644 Binary files a/modular_doppler/modular_customization/accessories/icons/non_species_specific/canine/canine_tail.dmi and b/modular_doppler/modular_customization/accessories/icons/non_species_specific/canine/canine_tail.dmi differ diff --git a/modular_doppler/modular_customization/organs/external/tail.dm b/modular_doppler/modular_customization/organs/external/tail.dm index 61919ffa6298c..3b884cd900808 100644 --- a/modular_doppler/modular_customization/organs/external/tail.dm +++ b/modular_doppler/modular_customization/organs/external/tail.dm @@ -1,56 +1,8 @@ -/// Tail storage datum -/datum/storage/tail - insert_preposition = "on" - silent = FALSE - max_slots = 1 - max_specific_storage = WEIGHT_CLASS_SMALL - max_total_storage = 50 - do_rustle = FALSE - screen_start_x = 12 - screen_pixel_x = 22 - -/datum/storage/tail/New( - atom/parent, - max_slots, - max_specific_storage, - max_total_storage, -) - . = ..() - set_holdable(list( - /obj/item/, - )) - /// Monkey tail // now waggable! /obj/item/organ/external/tail/monkey - name = "monkey tail" wag_flags = WAG_ABLE -/obj/item/organ/external/tail/monkey/Initialize(mapload) - . = ..() - create_storage(storage_type = /datum/storage/tail) - AddComponent(/datum/component/accessable_storage/organ) - -/// Mouse tail -// Monkey and mouse tail get a (secret) additional inventory slot -/obj/item/organ/external/tail/mouse - name = "mouse tail" - preference = "feature_mouse_tail" - dna_block = null - wag_flags = WAG_ABLE - bodypart_overlay = /datum/bodypart_overlay/mutant/tail/mouse - -/obj/item/organ/external/tail/mouse/Initialize(mapload) - . = ..() - create_storage(storage_type = /datum/storage/tail) - AddComponent(/datum/component/accessable_storage/organ) - -/datum/bodypart_overlay/mutant/tail/mouse - feature_key = "tail_other" - -/datum/bodypart_overlay/mutant/tail/mouse/get_global_feature_list() - return SSaccessories.tails_list_mouse - /// Dog tail // Buffs people if they're closeby while you're wagging it! /obj/item/organ/external/tail/dog @@ -125,6 +77,20 @@ /datum/bodypart_overlay/mutant/tail/bunny/get_global_feature_list() return SSaccessories.tails_list_bunny +/// Mouse tail +// +/obj/item/organ/external/tail/mouse + preference = "feature_mouse_tail" + dna_block = null + wag_flags = WAG_ABLE + bodypart_overlay = /datum/bodypart_overlay/mutant/tail/mouse + +/datum/bodypart_overlay/mutant/tail/mouse + feature_key = "tail_other" + +/datum/bodypart_overlay/mutant/tail/mouse/get_global_feature_list() + return SSaccessories.tails_list_mouse + /// Bird tail // /obj/item/organ/external/tail/bird diff --git a/modular_doppler/modular_customization/preferences/antennae.dm b/modular_doppler/modular_customization/preferences/antennae.dm index 801dcff44a552..714e2c8f88695 100644 --- a/modular_doppler/modular_customization/preferences/antennae.dm +++ b/modular_doppler/modular_customization/preferences/antennae.dm @@ -37,32 +37,3 @@ /datum/preference/choiced/moth_antennae/create_default_value() return /datum/sprite_accessory/moth_antennae/none::name - - - -/// Overwrite lives here -// Moth antennae have their own bespoke RGB code. -/datum/bodypart_overlay/mutant/antennae/color_image(image/overlay, draw_layer, obj/item/bodypart/limb) - if(limb == null) - return ..() - if(limb.owner == null) - return ..() - var/color_intended = COLOR_WHITE - - var/tcol_1 = limb.owner.dna.features["antennae_color_1"] - var/tcol_2 = limb.owner.dna.features["antennae_color_2"] - var/tcol_3 = limb.owner.dna.features["antennae_color_3"] - if(tcol_1 && tcol_2 && tcol_3) - //this is beyond ugly but it works - var/r1 = hex2num(copytext(tcol_1, 2, 4)) / 255.0 - var/g1 = hex2num(copytext(tcol_1, 4, 6)) / 255.0 - var/b1 = hex2num(copytext(tcol_1, 6, 8)) / 255.0 - var/r2 = hex2num(copytext(tcol_2, 2, 4)) / 255.0 - var/g2 = hex2num(copytext(tcol_2, 4, 6)) / 255.0 - var/b2 = hex2num(copytext(tcol_2, 6, 8)) / 255.0 - var/r3 = hex2num(copytext(tcol_3, 2, 4)) / 255.0 - var/g3 = hex2num(copytext(tcol_3, 4, 6)) / 255.0 - var/b3 = hex2num(copytext(tcol_3, 6, 8)) / 255.0 - color_intended = list(r1,g1,b1, r2,g2,b2, r3,g3,b3) - overlay.color = color_intended - return overlay diff --git a/modular_doppler/modular_customization/preferences/tail.dm b/modular_doppler/modular_customization/preferences/tail.dm index aead2b774c7b5..fceec22b81806 100644 --- a/modular_doppler/modular_customization/preferences/tail.dm +++ b/modular_doppler/modular_customization/preferences/tail.dm @@ -124,7 +124,7 @@ /datum/preference/choiced/lizard_tail/icon_for(value) var/datum/sprite_accessory/chosen_tail = SSaccessories.tails_list_lizard[value] - return generate_back_icon(chosen_tail, "tail") + return generate_tail_icon(chosen_tail) // Cat /datum/preference/choiced/tail_human // it's a lie @@ -148,7 +148,7 @@ /datum/preference/choiced/tail_human/icon_for(value) var/datum/sprite_accessory/chosen_tail = SSaccessories.tails_list_human[value] - return generate_back_icon(chosen_tail, "tail") + return generate_tail_icon(chosen_tail) // Dog /datum/preference/choiced/dog_tail @@ -178,7 +178,7 @@ /datum/preference/choiced/dog_tail/icon_for(value) var/datum/sprite_accessory/chosen_tail = SSaccessories.tails_list_dog[value] - return generate_back_icon(chosen_tail, "tail") + return generate_tail_icon(chosen_tail) // Fox /datum/preference/choiced/fox_tail @@ -208,7 +208,7 @@ /datum/preference/choiced/fox_tail/icon_for(value) var/datum/sprite_accessory/chosen_tail = SSaccessories.tails_list_fox[value] - return generate_back_icon(chosen_tail, "tail") + return generate_tail_icon(chosen_tail) // Bunny /datum/preference/choiced/bunny_tail @@ -238,7 +238,7 @@ /datum/preference/choiced/bunny_tail/icon_for(value) var/datum/sprite_accessory/chosen_tail = SSaccessories.tails_list_bunny[value] - return generate_back_icon(chosen_tail, "tail") + return generate_tail_icon(chosen_tail) // Mouse /datum/preference/choiced/mouse_tail @@ -268,7 +268,7 @@ /datum/preference/choiced/mouse_tail/icon_for(value) var/datum/sprite_accessory/chosen_tail = SSaccessories.tails_list_mouse[value] - return generate_back_icon(chosen_tail, "tail") + return generate_tail_icon(chosen_tail) // Bird /datum/preference/choiced/bird_tail @@ -298,7 +298,7 @@ /datum/preference/choiced/bird_tail/icon_for(value) var/datum/sprite_accessory/chosen_tail = SSaccessories.tails_list_bird[value] - return generate_back_icon(chosen_tail, "tail") + return generate_tail_icon(chosen_tail) // Monkey /datum/preference/choiced/monkey_tail @@ -322,7 +322,7 @@ /datum/preference/choiced/monkey_tail/icon_for(value) var/datum/sprite_accessory/chosen_tail = SSaccessories.tails_list_monkey[value] - return generate_back_icon(chosen_tail, "tail") + return generate_tail_icon(chosen_tail) // Deer /datum/preference/choiced/deer_tail @@ -352,7 +352,7 @@ /datum/preference/choiced/deer_tail/icon_for(value) var/datum/sprite_accessory/chosen_tail = SSaccessories.tails_list_deer[value] - return generate_back_icon(chosen_tail, "tail") + return generate_tail_icon(chosen_tail) // Fish /datum/preference/choiced/fish_tail @@ -382,7 +382,7 @@ /datum/preference/choiced/fish_tail/icon_for(value) var/datum/sprite_accessory/chosen_tail = SSaccessories.tails_list_fish[value] - return generate_back_icon(chosen_tail, "tail") + return generate_tail_icon(chosen_tail) // Bug /datum/preference/choiced/bug_tail @@ -412,7 +412,7 @@ /datum/preference/choiced/bug_tail/icon_for(value) var/datum/sprite_accessory/chosen_tail = SSaccessories.tails_list_bug[value] - return generate_back_icon(chosen_tail, "tail") + return generate_tail_icon(chosen_tail) // Synth /datum/preference/choiced/synth_tail @@ -442,7 +442,7 @@ /datum/preference/choiced/synth_tail/icon_for(value) var/datum/sprite_accessory/chosen_tail = SSaccessories.tails_list_synth[value] - return generate_back_icon(chosen_tail, "tail") + return generate_tail_icon(chosen_tail) // Humanoid /datum/preference/choiced/humanoid_tail @@ -472,59 +472,32 @@ /datum/preference/choiced/humanoid_tail/icon_for(value) var/datum/sprite_accessory/chosen_tail = SSaccessories.tails_list_humanoid[value] - return generate_back_icon(chosen_tail, "tail") + return generate_tail_icon(chosen_tail) -#define WIDTH_WINGS_FILE 45 -#define HEIGHT_WINGS_FILE 34 -#define WIDTH_BIGTAILS_FILE 64 -#define HEIGHT_BIGTAILS_FILE 32 /// Proc to gen that icon // We don't wanna copy paste this -/datum/preference/choiced/proc/generate_back_icon(chosen_tail, key) +/datum/preference/choiced/proc/generate_tail_icon(chosen_tail) var/datum/sprite_accessory/sprite_accessory = chosen_tail var/icon/final_icon = icon('icons/mob/human/bodyparts_greyscale.dmi', "human_chest_m", NORTH) if (sprite_accessory.icon_state != "none") - var/icon/markings_icon_1 = icon(sprite_accessory.icon, "m_[key]_[sprite_accessory.icon_state]_BEHIND", NORTH) + var/icon/markings_icon_1 = icon(sprite_accessory.icon, "m_tail_[sprite_accessory.icon_state]_BEHIND", NORTH) markings_icon_1.Blend(COLOR_RED, ICON_MULTIPLY) - var/icon/markings_icon_2 = icon(sprite_accessory.icon, "m_[key]_[sprite_accessory.icon_state]_BEHIND_2", NORTH) + var/icon/markings_icon_2 = icon(sprite_accessory.icon, "m_tail_[sprite_accessory.icon_state]_BEHIND_2", NORTH) markings_icon_2.Blend(COLOR_VIBRANT_LIME, ICON_MULTIPLY) - var/icon/markings_icon_3 = icon(sprite_accessory.icon, "m_[key]_[sprite_accessory.icon_state]_BEHIND_3", NORTH) + var/icon/markings_icon_3 = icon(sprite_accessory.icon, "m_tail_[sprite_accessory.icon_state]_BEHIND_3", NORTH) markings_icon_3.Blend(COLOR_BLUE, ICON_MULTIPLY) - // A couple icon files use this plus-size setup; autocrop to generate better icons where possible - if(markings_icon_1.Width() == WIDTH_WINGS_FILE && markings_icon_1.Height() == HEIGHT_WINGS_FILE) - markings_icon_1.Crop(8, 2, 39, 33) - markings_icon_2.Crop(8, 2, 39, 33) - markings_icon_3.Crop(8, 2, 39, 33) - if(markings_icon_1.Width() == WIDTH_BIGTAILS_FILE && markings_icon_1.Height() == HEIGHT_BIGTAILS_FILE) // Plus-size tail files are simpler - markings_icon_1.Crop(17, 1, 48, 32) - markings_icon_2.Crop(17, 1, 48, 32) - markings_icon_3.Crop(17, 1, 48, 32) - // finally apply icons - markings_icon_1.Blend(final_icon, ICON_OVERLAY) - markings_icon_2.Blend(final_icon, ICON_OVERLAY) - markings_icon_3.Blend(final_icon, ICON_OVERLAY) final_icon.Blend(markings_icon_1, ICON_OVERLAY) final_icon.Blend(markings_icon_2, ICON_OVERLAY) final_icon.Blend(markings_icon_3, ICON_OVERLAY) - /// == front breaker == - var/icon/markings_icon_1_f = icon(sprite_accessory.icon, "m_[key]_[sprite_accessory.icon_state]_FRONT", NORTH) + // front breaker + var/icon/markings_icon_1_f = icon(sprite_accessory.icon, "m_tail_[sprite_accessory.icon_state]_FRONT", NORTH) markings_icon_1_f.Blend(COLOR_RED, ICON_MULTIPLY) - var/icon/markings_icon_2_f = icon(sprite_accessory.icon, "m_[key]_[sprite_accessory.icon_state]_FRONT_2", NORTH) + var/icon/markings_icon_2_f = icon(sprite_accessory.icon, "m_tail_[sprite_accessory.icon_state]_FRONT_2", NORTH) markings_icon_2_f.Blend(COLOR_VIBRANT_LIME, ICON_MULTIPLY) - var/icon/markings_icon_3_f = icon(sprite_accessory.icon, "m_[key]_[sprite_accessory.icon_state]_FRONT_3", NORTH) + var/icon/markings_icon_3_f = icon(sprite_accessory.icon, "m_tail_[sprite_accessory.icon_state]_FRONT_3", NORTH) markings_icon_3_f.Blend(COLOR_BLUE, ICON_MULTIPLY) - // A couple icon files use this plus-size setup; autocrop to generate better icons where possible - if(markings_icon_1_f.Width() == WIDTH_WINGS_FILE && markings_icon_1_f.Height() == HEIGHT_WINGS_FILE) - markings_icon_1_f.Crop(8, 2, 39, 33) - markings_icon_2_f.Crop(8, 2, 39, 33) - markings_icon_3_f.Crop(8, 2, 39, 33) - else if(markings_icon_1_f.Width() == WIDTH_BIGTAILS_FILE && markings_icon_1_f.Height() == HEIGHT_BIGTAILS_FILE) // Plus-size tail files are simpler - markings_icon_1_f.Crop(17, 1, 48, 32) - markings_icon_2_f.Crop(17, 1, 48, 32) - markings_icon_3_f.Crop(17, 1, 48, 32) - // finally apply icons final_icon.Blend(markings_icon_1_f, ICON_OVERLAY) final_icon.Blend(markings_icon_2_f, ICON_OVERLAY) final_icon.Blend(markings_icon_3_f, ICON_OVERLAY) diff --git a/modular_doppler/modular_customization/preferences/wings.dm b/modular_doppler/modular_customization/preferences/wings.dm index 1b38e70719a88..ee7f9e00feaa2 100644 --- a/modular_doppler/modular_customization/preferences/wings.dm +++ b/modular_doppler/modular_customization/preferences/wings.dm @@ -87,7 +87,9 @@ /datum/preference/choiced/wings/icon_for(value) var/datum/sprite_accessory/wings = SSaccessories.wings_list_more[value] - return generate_back_icon(wings, "wings") + var/icon/final_icon = icon(wings.icon, "m_wings_[wings.icon_state]_BEHIND") + final_icon.Blend(icon(wings.icon, "m_wings_[wings.icon_state]_FRONT"), ICON_OVERLAY) + return final_icon // Moth Wings /datum/preference/choiced/moth_wings @@ -142,32 +144,3 @@ overlay.color = limb.owner.dna.features["wings_color_3"] return overlay return ..() - - - -/// Overwrite lives here -// Moth wings have their own bespoke RGB code. -/datum/bodypart_overlay/mutant/wings/moth/color_image(image/overlay, draw_layer, obj/item/bodypart/limb) - if(limb == null) - return ..() - if(limb.owner == null) - return ..() - var/color_intended = COLOR_WHITE - - var/tcol_1 = limb.owner.dna.features["wings_color_1"] - var/tcol_2 = limb.owner.dna.features["wings_color_2"] - var/tcol_3 = limb.owner.dna.features["wings_color_3"] - if(tcol_1 && tcol_2 && tcol_3) - //this is beyond ugly but it works - var/r1 = hex2num(copytext(tcol_1, 2, 4)) / 255.0 - var/g1 = hex2num(copytext(tcol_1, 4, 6)) / 255.0 - var/b1 = hex2num(copytext(tcol_1, 6, 8)) / 255.0 - var/r2 = hex2num(copytext(tcol_2, 2, 4)) / 255.0 - var/g2 = hex2num(copytext(tcol_2, 4, 6)) / 255.0 - var/b2 = hex2num(copytext(tcol_2, 6, 8)) / 255.0 - var/r3 = hex2num(copytext(tcol_3, 2, 4)) / 255.0 - var/g3 = hex2num(copytext(tcol_3, 4, 6)) / 255.0 - var/b3 = hex2num(copytext(tcol_3, 6, 8)) / 255.0 - color_intended = list(r1,g1,b1, r2,g2,b2, r3,g3,b3) - overlay.color = color_intended - return overlay diff --git a/modular_doppler/modular_customization/tri_color/wings.dm b/modular_doppler/modular_customization/tri_color/wings.dm index c30f75c2edbd4..5b622618db7bc 100644 --- a/modular_doppler/modular_customization/tri_color/wings.dm +++ b/modular_doppler/modular_customization/tri_color/wings.dm @@ -4,12 +4,6 @@ data[SUPPLEMENTAL_FEATURE_KEY] = /datum/preference/tri_color/wings_color::savefile_key return data -// Gotta add to the selector for moths too -/datum/preference/choiced/moth_wings/compile_constant_data() - var/list/data = ..() - data[SUPPLEMENTAL_FEATURE_KEY] = /datum/preference/tri_color/wings_color::savefile_key - return data - /// Wing colors! /datum/preference/tri_color/wings_color priority = PREFERENCE_PRIORITY_BODY_TYPE diff --git a/modular_doppler/modular_species/species_types/monkey/monkeys.dm b/modular_doppler/modular_species/species_types/monkey/monkeys.dm index 229240748a77c..ced89b5e92caa 100644 --- a/modular_doppler/modular_species/species_types/monkey/monkeys.dm +++ b/modular_doppler/modular_species/species_types/monkey/monkeys.dm @@ -2,7 +2,3 @@ var/list/features = ..() features["tail_monkey"] = /datum/sprite_accessory/tails/monkey/default::name return features - -/mob/living/carbon/human/species/monkey/punpun/Initialize(mapload) - . = ..() - add_quirk(/datum/quirk/excitable) diff --git a/modular_doppler/overwrites/huds/hud.dmi b/modular_doppler/overwrites/huds/hud.dmi index 4084f10c8acc8..740cda12a557f 100644 Binary files a/modular_doppler/overwrites/huds/hud.dmi and b/modular_doppler/overwrites/huds/hud.dmi differ diff --git a/modular_doppler/modular_quirks/paycheck_rations/code/quirk.dm b/modular_doppler/paycheck_rations/code/quirk.dm similarity index 100% rename from modular_doppler/modular_quirks/paycheck_rations/code/quirk.dm rename to modular_doppler/paycheck_rations/code/quirk.dm diff --git a/modular_doppler/modular_quirks/paycheck_rations/code/rationpacks.dm b/modular_doppler/paycheck_rations/code/rationpacks.dm similarity index 98% rename from modular_doppler/modular_quirks/paycheck_rations/code/rationpacks.dm rename to modular_doppler/paycheck_rations/code/rationpacks.dm index e8cea85c98349..fba4e2dc1fd70 100644 --- a/modular_doppler/modular_quirks/paycheck_rations/code/rationpacks.dm +++ b/modular_doppler/paycheck_rations/code/rationpacks.dm @@ -1,7 +1,7 @@ /obj/item/storage/box/spaceman_ration name = "unlabeled ration container" desc = "You get the feeling you sholdn't have been sent this one?" - icon = 'modular_doppler/modular_quirks/paycheck_rations/icons/food_containers.dmi' + icon = 'modular_doppler/paycheck_rations/icons/food_containers.dmi' icon_state = "plants" illustration = null /// How many storage slots this has, yes I'm being lazy diff --git a/modular_doppler/modular_quirks/paycheck_rations/code/reagents.dm b/modular_doppler/paycheck_rations/code/reagents.dm similarity index 88% rename from modular_doppler/modular_quirks/paycheck_rations/code/reagents.dm rename to modular_doppler/paycheck_rations/code/reagents.dm index 46a40b9a4e51e..56322d87e07b7 100644 --- a/modular_doppler/modular_quirks/paycheck_rations/code/reagents.dm +++ b/modular_doppler/paycheck_rations/code/reagents.dm @@ -1,25 +1,25 @@ /obj/item/reagent_containers/condiment/flour/small_ration name = "small flour sack" desc = "A maritime ration-sized portion of flour, containing just enough to make a single good loaf of bread to fuel the day." - icon = 'modular_doppler/modular_quirks/paycheck_rations/icons/food_containers.dmi' + icon = 'modular_doppler/paycheck_rations/icons/food_containers.dmi' list_reagents = list(/datum/reagent/consumable/flour = 15) /obj/item/reagent_containers/condiment/rice/small_ration name = "small rice sack" desc = "A maritime ration-sized portion of rice, containing just enough to make the universe's saddest rice dish." - icon = 'modular_doppler/modular_quirks/paycheck_rations/icons/food_containers.dmi' + icon = 'modular_doppler/paycheck_rations/icons/food_containers.dmi' list_reagents = list(/datum/reagent/consumable/rice = 10) /obj/item/reagent_containers/condiment/sugar/small_ration name = "small sugar sack" desc = "A maritime ration-sized portion of sugar, containing just enough to make the day just a tiny bit sweeter." - icon = 'modular_doppler/modular_quirks/paycheck_rations/icons/food_containers.dmi' + icon = 'modular_doppler/paycheck_rations/icons/food_containers.dmi' list_reagents = list(/datum/reagent/consumable/sugar = 10) /obj/item/reagent_containers/condiment/small_ration_korta_flour name = "small korta flour sack" desc = "A maritime ration-sized portion of korta flour, containing just enough to make a single good loaf of bread to fuel the day." - icon = 'modular_doppler/modular_quirks/paycheck_rations/icons/food_containers.dmi' + icon = 'modular_doppler/paycheck_rations/icons/food_containers.dmi' icon_state = "flour_korta" inhand_icon_state = "carton" lefthand_file = 'icons/mob/inhands/items/drinks_lefthand.dmi' @@ -30,13 +30,13 @@ /obj/item/reagent_containers/condiment/soymilk/small_ration name = "small soy milk" desc = "It's soy milk. White and nutritious goodness! This one is significantly smaller than normal cartons; just enough to make some rootdough with." - icon = 'modular_doppler/modular_quirks/paycheck_rations/icons/food_containers.dmi' + icon = 'modular_doppler/paycheck_rations/icons/food_containers.dmi' list_reagents = list(/datum/reagent/consumable/soymilk = 15) /obj/item/reagent_containers/condiment/milk/small_ration name = "small milk" desc = "It's milk. White and nutritious goodness! This one is significantly smaller than normal cartons; just enough to make some cheese with." - icon = 'modular_doppler/modular_quirks/paycheck_rations/icons/food_containers.dmi' + icon = 'modular_doppler/paycheck_rations/icons/food_containers.dmi' list_reagents = list(/datum/reagent/consumable/milk = 15) /obj/item/reagent_containers/cup/glass/bottle/small/tiny diff --git a/modular_doppler/modular_quirks/paycheck_rations/code/ticket_book.dm b/modular_doppler/paycheck_rations/code/ticket_book.dm similarity index 86% rename from modular_doppler/modular_quirks/paycheck_rations/code/ticket_book.dm rename to modular_doppler/paycheck_rations/code/ticket_book.dm index a8bec74e5b59d..fff8b99c5419e 100644 --- a/modular_doppler/modular_quirks/paycheck_rations/code/ticket_book.dm +++ b/modular_doppler/paycheck_rations/code/ticket_book.dm @@ -1,7 +1,7 @@ /obj/item/storage/ration_ticket_book name = "ration ticket book" desc = "A small booklet able to hold all your ration tickets. More will be available here as your paychecks come in." - icon = 'modular_doppler/modular_quirks/paycheck_rations/icons/tickets.dmi' + icon = 'modular_doppler/paycheck_rations/icons/tickets.dmi' icon_state = "ticket_book" w_class = WEIGHT_CLASS_SMALL diff --git a/modular_doppler/modular_quirks/paycheck_rations/code/tickets.dm b/modular_doppler/paycheck_rations/code/tickets.dm similarity index 86% rename from modular_doppler/modular_quirks/paycheck_rations/code/tickets.dm rename to modular_doppler/paycheck_rations/code/tickets.dm index f088e6d043688..0bc59df2f2a1c 100644 --- a/modular_doppler/modular_quirks/paycheck_rations/code/tickets.dm +++ b/modular_doppler/paycheck_rations/code/tickets.dm @@ -1,7 +1,7 @@ /obj/item/paper/paperslip/ration_ticket name = "ration ticket - standard" desc = "A little slip of paper that'll slot right into any cargo console and put your alotted food ration on the next shuttle to the station." - icon = 'modular_doppler/modular_quirks/paycheck_rations/icons/tickets.dmi' + icon = 'modular_doppler/paycheck_rations/icons/tickets.dmi' icon_state = "ticket_food" default_raw_text = "Redeem this ticket in the nearest supply console to receive benefits." color = COLOR_OFF_WHITE @@ -24,9 +24,9 @@ // List of meat options we get var/list/radial_meat_options = list( - "Standard Meats" = image(icon = 'modular_doppler/modular_quirks/paycheck_rations/icons/food_containers.dmi', icon_state = "meats"), - "Seafood Meats" = image(icon = 'modular_doppler/modular_quirks/paycheck_rations/icons/food_containers.dmi', icon_state = "meats_fish"), - "Tizirian Meats" = image(icon = 'modular_doppler/modular_quirks/paycheck_rations/icons/food_containers.dmi', icon_state = "meats_lizard"), + "Standard Meats" = image(icon = 'modular_doppler/paycheck_rations/icons/food_containers.dmi', icon_state = "meats"), + "Seafood Meats" = image(icon = 'modular_doppler/paycheck_rations/icons/food_containers.dmi', icon_state = "meats_fish"), + "Tizirian Meats" = image(icon = 'modular_doppler/paycheck_rations/icons/food_containers.dmi', icon_state = "meats_lizard"), ) var/meats_choice = show_radial_menu(user, object_we_attack, radial_meat_options, require_near = TRUE) @@ -47,10 +47,10 @@ // List of produce options we get var/list/radial_produce_options = list( - "Standard Produce" = image(icon = 'modular_doppler/modular_quirks/paycheck_rations/icons/food_containers.dmi', icon_state = "plants"), - "Alternative Produce" = image(icon = 'modular_doppler/modular_quirks/paycheck_rations/icons/food_containers.dmi', icon_state = "plants_alt"), - "Mothic Produce" = image(icon = 'modular_doppler/modular_quirks/paycheck_rations/icons/food_containers.dmi', icon_state = "plants_moth"), - "Tizirian Produce" = image(icon = 'modular_doppler/modular_quirks/paycheck_rations/icons/food_containers.dmi', icon_state = "plants_lizard"), + "Standard Produce" = image(icon = 'modular_doppler/paycheck_rations/icons/food_containers.dmi', icon_state = "plants"), + "Alternative Produce" = image(icon = 'modular_doppler/paycheck_rations/icons/food_containers.dmi', icon_state = "plants_alt"), + "Mothic Produce" = image(icon = 'modular_doppler/paycheck_rations/icons/food_containers.dmi', icon_state = "plants_moth"), + "Tizirian Produce" = image(icon = 'modular_doppler/paycheck_rations/icons/food_containers.dmi', icon_state = "plants_lizard"), ) var/produce_choice = show_radial_menu(user, object_we_attack, radial_produce_options, require_near = TRUE) @@ -77,8 +77,8 @@ // List of flour options we get var/list/radial_flour_options = list( - "Standard Flour" = image(icon = 'modular_doppler/modular_quirks/paycheck_rations/icons/food_containers.dmi', icon_state = "flour"), - "Korta Flour" = image(icon = 'modular_doppler/modular_quirks/paycheck_rations/icons/food_containers.dmi', icon_state = "flour_korta"), + "Standard Flour" = image(icon = 'modular_doppler/paycheck_rations/icons/food_containers.dmi', icon_state = "flour"), + "Korta Flour" = image(icon = 'modular_doppler/paycheck_rations/icons/food_containers.dmi', icon_state = "flour_korta"), ) var/flour_choice = show_radial_menu(user, object_we_attack, radial_flour_options, require_near = TRUE) diff --git a/modular_doppler/modular_quirks/paycheck_rations/icons/food_containers.dmi b/modular_doppler/paycheck_rations/icons/food_containers.dmi similarity index 100% rename from modular_doppler/modular_quirks/paycheck_rations/icons/food_containers.dmi rename to modular_doppler/paycheck_rations/icons/food_containers.dmi diff --git a/modular_doppler/modular_quirks/paycheck_rations/icons/tickets.dmi b/modular_doppler/paycheck_rations/icons/tickets.dmi similarity index 100% rename from modular_doppler/modular_quirks/paycheck_rations/icons/tickets.dmi rename to modular_doppler/paycheck_rations/icons/tickets.dmi diff --git a/sound/attributions.txt b/sound/attributions.txt index aa3cd0bf37fae..3a2468205d027 100644 --- a/sound/attributions.txt +++ b/sound/attributions.txt @@ -94,8 +94,6 @@ 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/ @@ -214,4 +212,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 +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 diff --git a/strings/fishing_tips.txt b/strings/fishing_tips.txt index 6b25cc5e5391c..eda70bb425286 100644 --- a/strings/fishing_tips.txt +++ b/strings/fishing_tips.txt @@ -15,8 +15,6 @@ You may find worms by digging through sand, ash and snow. You can revive fish by using a Lazarus Injector on them. However, using Strange Reagent would be a smarter option here. You can feed fish outside of an aquarium by tapping them with a can of fish feed. More fishing rods and fish cases can be printed at the autolathe. -You can link the fish portal generator to other fishing spots with a multitool. The maximum amount of fishing spots that can be linked and whether or not the link works on different z-levels depends on the quality of the machinery components. -The actual name of the fishing portal generator is 'fish-porter 3000'. They're totally the same thing however. Seeking alternative ways to catch fish without bothering to do it yourself? Explosives can be thrown at fishing spots to get several (dead) fishes in a pinch. You can raise lobstrosities from chasm chrabs. However, lobstrosities can only be tamed with spare limbs or lavaloop fish while still young. Lavaloop fish make for dangerous yet somewhat effective throwing weapons against big fauna. @@ -24,7 +22,7 @@ The fishing portal generator has different modules, all of which can be unlocked A fish's traits influence how you can catch them. Carnivore fish will ignore dough balls, and herbivore fish ignore anything that's not from botany. Telescopic fishing rods can be bought from cargo. Once grown from chrabs and tamed, lobstrosities can be heeded to fish on fishing spots for you. -Aquariums can be upgraded to bioelectricity generators with a specific kit. From there, you can add electric-generating fish like the anxious zip zap to generate power for the station. +Aquariums can be upgraded to bioelectricity generators can a specific kit. From there, you can add electric-generating fish like the anxious zip zap to generate power. Getting better at fishing will net you some small additional advantages, such as receiving more information when examining a fish or a fishing spot. The size and weight of a fish can influence the amount of reagents and fillets you can harvest from them, their force as a weapon and how easy it is to store them in containers. While most fish make for shoddy weapons, a few, like the swordfish and the chainsawfish, can be quite powerful. In general, the bigger they are, the more forceful they get. @@ -35,15 +33,12 @@ Some species of fish can be bred into new species under the right conditions. Most fish don't survive outside water, so get them somewhere safe like an aquarium or a fish case, or even a toilet or a moisture trap! No matter how you look at it, most people won't care about fishing. Don't let that stop you. They're just jealous. To fish on ice you have to puncture the ice layer with a pick or shovel first. -Depending on the kinds of fish inside it and whether they're alive or dead, an aquarium can improve the beauty of the room or worsen it. +Depending on the kind of fish inside it and whether they're alive or dead, an aquarium can improve the beauty of the room or worsen it. Almost all fish can be ground in an All-in-one-Grinder. Don't think too hard about how you're fitting a giant fish into a blender. Nanotrasen technology is weird like that. The sludgefish from the toilets can be used as a steady supply of cheap fish and fillets due to its self-reproducing behaviour. However it's quite fragile. In a jiffy, you can scoop tadpoles from ponds with your bare hands, place them inside aquariums and quickly raise them into frogs. The legendary fishing hat isn't just cosmetic. Space carps (as well as young lobstrosities and frogs) do truly fear those who wear it. Have you ever heard a lobster or crab talk? Well, neither have I, but they say they're quite the fishy punsters. -You can get an experiscanner from science to perform fish scanning experiments, which can unlock more modules for the fishing portal, as well as fishing technology nodes (better equipment) to research. -Fish is, of course, edible. Is it safe to eat raw? Well, if you've strong stomach, otherwise your best option is to cook it for a at least half a spessman minute if you don't want to catch nasty diseases. -After researching the Advanced Fishing Technology Node, you can print special fishing gloves that let you fish without having to carry around a fishing rod. There's one pair that even trains athletics on top of fishing.You can get an experiscanner from science to perform fish scanning experiments, which can unlock more modules for the fishing portal, as well as fishing technology nodes (better equipment) for research. +You can get an experiscanner from science to perform fish scanning experiments, which can unlock more modules for the fishing portal, as well as fishing technology nodes (better equipment) for research. If you have enough credits, you can buy a set of fishing lures from cargo. Each lure allows you to catch different species of fish and won't get consumed, however they need to be spun at intervals to work. -Various clothing and handheld items, as well as chairs you sit on, can make fishing easier (or sometimes harder). A trained fisherman can tell what can help and what won't, so keep an eye out. -This may sound silly, but (live) squids and their ink sacs can be used as weapons to temporarily blind foes. \ No newline at end of file +This may sound silly, but squids and their ink sacs can be used as weapons to temporarily blind people. \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index 239e8323ae23e..e16c312f32ab3 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -397,11 +397,8 @@ #include "code\__DEFINES\traits\macros.dm" #include "code\__DEFINES\traits\sources.dm" #include "code\__DEFINES\~doppler_defines\access.dm" -#include "code\__DEFINES\~doppler_defines\admin.dm" #include "code\__DEFINES\~doppler_defines\armor_defines.dm" #include "code\__DEFINES\~doppler_defines\atom_hud.dm" -#include "code\__DEFINES\~doppler_defines\automapper.dm" -#include "code\__DEFINES\~doppler_defines\banning.dm" #include "code\__DEFINES\~doppler_defines\cells.dm" #include "code\__DEFINES\~doppler_defines\colony_fabricator_misc.dm" #include "code\__DEFINES\~doppler_defines\declarations.dm" @@ -413,7 +410,6 @@ #include "code\__DEFINES\~doppler_defines\keybindings.dm" #include "code\__DEFINES\~doppler_defines\living.dm" #include "code\__DEFINES\~doppler_defines\loadout.dm" -#include "code\__DEFINES\~doppler_defines\logging.dm" #include "code\__DEFINES\~doppler_defines\manufacturer_strings.dm" #include "code\__DEFINES\~doppler_defines\mobfactions.dm" #include "code\__DEFINES\~doppler_defines\mobs.dm" @@ -423,12 +419,10 @@ #include "code\__DEFINES\~doppler_defines\reagent_forging_tools.dm" #include "code\__DEFINES\~doppler_defines\reskin_defines.dm" #include "code\__DEFINES\~doppler_defines\role_preferences.dm" -#include "code\__DEFINES\~doppler_defines\say.dm" #include "code\__DEFINES\~doppler_defines\signals.dm" #include "code\__DEFINES\~doppler_defines\sound.dm" #include "code\__DEFINES\~doppler_defines\span.dm" #include "code\__DEFINES\~doppler_defines\species.dm" -#include "code\__DEFINES\~doppler_defines\speech_channels.dm" #include "code\__DEFINES\~doppler_defines\strippable.dm" #include "code\__DEFINES\~doppler_defines\techweb_nodes.dm" #include "code\__DEFINES\~doppler_defines\traits.dm" @@ -547,10 +541,7 @@ #include "code\__HELPERS\paths\sssp.dm" #include "code\__HELPERS\sorts\helpers.dm" #include "code\__HELPERS\sorts\sort_instance.dm" -#include "code\__HELPERS\~doppler_helpers\chat.dm" #include "code\__HELPERS\~doppler_helpers\global_lists.dm" -#include "code\__HELPERS\~doppler_helpers\logging.dm" -#include "code\__HELPERS\~doppler_helpers\verbs.dm" #include "code\_globalvars\_regexes.dm" #include "code\_globalvars\admin.dm" #include "code\_globalvars\arcade.dm" @@ -597,7 +588,6 @@ #include "code\_globalvars\traits\_traits.dm" #include "code\_globalvars\traits\admin_tooling.dm" #include "code\_globalvars\~doppler_globalvars\bitfields.dm" -#include "code\_globalvars\~doppler_globalvars\configuration.dm" #include "code\_globalvars\~doppler_globalvars\objective.dm" #include "code\_globalvars\~doppler_globalvars\religion.dm" #include "code\_js\byjax.dm" @@ -1071,7 +1061,6 @@ #include "code\datums\components\_component.dm" #include "code\datums\components\acid.dm" #include "code\datums\components\action_item_overlay.dm" -#include "code\datums\components\adjust_fishing_difficulty.dm" #include "code\datums\components\admin_popup.dm" #include "code\datums\components\aggro_emote.dm" #include "code\datums\components\ai_has_target_timer.dm" @@ -1761,7 +1750,6 @@ #include "code\datums\proximity_monitor\fields\gravity.dm" #include "code\datums\proximity_monitor\fields\projectile_dampener.dm" #include "code\datums\proximity_monitor\fields\timestop.dm" -#include "code\datums\proximity_monitor\fields\void_storm.dm" #include "code\datums\quirks\_quirk.dm" #include "code\datums\quirks\_quirk_constant_data.dm" #include "code\datums\quirks\negative_quirks\addict.dm" @@ -2378,7 +2366,7 @@ #include "code\game\objects\items\charter.dm" #include "code\game\objects\items\choice_beacon.dm" #include "code\game\objects\items\chromosome.dm" -#include "code\game\objects\items\cigarettes.dm" +#include "code\game\objects\items\cigs_lighters.dm" #include "code\game\objects\items\climbingrope.dm" #include "code\game\objects\items\clown_items.dm" #include "code\game\objects\items\control_wand.dm" @@ -2418,7 +2406,6 @@ #include "code\game\objects\items\kitchen.dm" #include "code\game\objects\items\knives.dm" #include "code\game\objects\items\latexballoon.dm" -#include "code\game\objects\items\lighter.dm" #include "code\game\objects\items\machine_wand.dm" #include "code\game\objects\items\mail.dm" #include "code\game\objects\items\maintenance_loot.dm" @@ -2793,7 +2780,6 @@ #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" @@ -3264,16 +3250,13 @@ #include "code\modules\antagonists\heretic\magic\star_blast.dm" #include "code\modules\antagonists\heretic\magic\star_touch.dm" #include "code\modules\antagonists\heretic\magic\void_cold_cone.dm" -#include "code\modules\antagonists\heretic\magic\void_conduit.dm" #include "code\modules\antagonists\heretic\magic\void_phase.dm" -#include "code\modules\antagonists\heretic\magic\void_prison.dm" #include "code\modules\antagonists\heretic\magic\void_pull.dm" #include "code\modules\antagonists\heretic\magic\wave_of_desperation.dm" #include "code\modules\antagonists\heretic\status_effects\buffs.dm" #include "code\modules\antagonists\heretic\status_effects\debuffs.dm" #include "code\modules\antagonists\heretic\status_effects\ghoul.dm" #include "code\modules\antagonists\heretic\status_effects\mark_effects.dm" -#include "code\modules\antagonists\heretic\status_effects\void_chill.dm" #include "code\modules\antagonists\heretic\structures\carving_knife.dm" #include "code\modules\antagonists\heretic\structures\lock_final.dm" #include "code\modules\antagonists\heretic\structures\mawed_crucible.dm" @@ -3568,7 +3551,6 @@ #include "code\modules\atmospherics\machinery\portable\scrubber.dm" #include "code\modules\autowiki\autowiki.dm" #include "code\modules\autowiki\pages\base.dm" -#include "code\modules\autowiki\pages\fishing.dm" #include "code\modules\autowiki\pages\soup.dm" #include "code\modules\autowiki\pages\stockparts.dm" #include "code\modules\autowiki\pages\techweb.dm" @@ -4499,7 +4481,6 @@ #include "code\modules\jobs\job_types\station_trait\bridge_assistant.dm" #include "code\modules\jobs\job_types\station_trait\cargo_gorilla.dm" #include "code\modules\jobs\job_types\station_trait\human_ai.dm" -#include "code\modules\jobs\job_types\station_trait\pun_pun.dm" #include "code\modules\jobs\job_types\station_trait\veteran_advisor.dm" #include "code\modules\keybindings\bindings_atom.dm" #include "code\modules\keybindings\bindings_client.dm" @@ -5192,7 +5173,6 @@ #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" @@ -5255,7 +5235,6 @@ #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" @@ -6451,13 +6430,8 @@ #include "modular_doppler\accessable_storage\accessable_storage.dm" #include "modular_doppler\accessable_storage\item.dm" #include "modular_doppler\accessable_storage\strippable.dm" -#include "modular_doppler\administration\code\preferences.dm" #include "modular_doppler\administration\code\whitelisting.dm" #include "modular_doppler\advanced_reskin\code\advanced_reskin.dm" -#include "modular_doppler\automapper\code\area_spawn_entries.dm" -#include "modular_doppler\automapper\code\area_spawn_subsystem.dm" -#include "modular_doppler\automapper\code\automap_template.dm" -#include "modular_doppler\automapper\code\automapper_subsystem.dm" #include "modular_doppler\cell_component\code\cell_component.dm" #include "modular_doppler\colony_fabricator\code\cargo_packs.dm" #include "modular_doppler\colony_fabricator\code\colony_fabricator.dm" @@ -6477,11 +6451,6 @@ #include "modular_doppler\colony_fabricator\code\construction\manual_door.dm" #include "modular_doppler\colony_fabricator\code\construction\turfs.dm" #include "modular_doppler\colony_fabricator\code\construction\windows.dm" -#include "modular_doppler\colony_fabricator\code\design_datums\appliances.dm" -#include "modular_doppler\colony_fabricator\code\design_datums\construction.dm" -#include "modular_doppler\colony_fabricator\code\design_datums\equipment.dm" -#include "modular_doppler\colony_fabricator\code\design_datums\flatpack_machines.dm" -#include "modular_doppler\colony_fabricator\code\design_datums\tools.dm" #include "modular_doppler\colony_fabricator\code\design_datums\fabricator_flag_additions\computer_board.dm" #include "modular_doppler\colony_fabricator\code\design_datums\fabricator_flag_additions\construction.dm" #include "modular_doppler\colony_fabricator\code\design_datums\fabricator_flag_additions\equipment.dm" @@ -6511,7 +6480,6 @@ #include "modular_doppler\cryosleep\code\jobs.dm" #include "modular_doppler\cryosleep\code\mind.dm" #include "modular_doppler\cryosleep\code\mood.dm" -#include "modular_doppler\cryosleep\code\objective.dm" #include "modular_doppler\deforest_medical_items\code\cargo_packs.dm" #include "modular_doppler\deforest_medical_items\code\healing_stack_items.dm" #include "modular_doppler\deforest_medical_items\code\illegal_injectors.dm" @@ -6526,7 +6494,6 @@ #include "modular_doppler\deforest_medical_items\code\medstation_designs\blood.dm" #include "modular_doppler\deforest_medical_items\code\medstation_designs\medical.dm" #include "modular_doppler\emotes\code\emotes.dm" -#include "modular_doppler\emotes\code\hologram.dm" #include "modular_doppler\emotes\code\added_emotes\animal_sounds.dm" #include "modular_doppler\emotes\code\added_emotes\human_things.dm" #include "modular_doppler\emotes\code\added_emotes\robot_sounds.dm" @@ -6569,15 +6536,11 @@ #include "modular_doppler\hearthkin\primitive_production\code\farming.dm" #include "modular_doppler\hearthkin\primitive_production\code\glassblowing.dm" #include "modular_doppler\hearthkin\primitive_production\code\misc.dm" -#include "modular_doppler\hearthkin\primitive_production\code\primitive_surgery.dm" -#include "modular_doppler\hearthkin\primitive_production\code\primitive_tools.dm" #include "modular_doppler\hearthkin\primitive_production\code\production_skill.dm" #include "modular_doppler\hearthkin\primitive_production\code\wormfarm.dm" -#include "modular_doppler\hearthkin\primitive_structures\code\calling_horn.dm" #include "modular_doppler\hearthkin\primitive_structures\code\fencing.dm" #include "modular_doppler\hearthkin\primitive_structures\code\fuelwell.dm" #include "modular_doppler\hearthkin\primitive_structures\code\furniture.dm" -#include "modular_doppler\hearthkin\primitive_structures\code\hearthkin_rune_stone.dm" #include "modular_doppler\hearthkin\primitive_structures\code\railroad.dm" #include "modular_doppler\hearthkin\primitive_structures\code\storage_structures.dm" #include "modular_doppler\hearthkin\primitive_structures\code\totally_thatch_roof.dm" @@ -6606,9 +6569,6 @@ #include "modular_doppler\kahraman_equipment\code\clothing\clothing.dm" #include "modular_doppler\kahraman_equipment\code\clothing\mod.dm" #include "modular_doppler\kahraman_equipment\code\clothing\storage.dm" -#include "modular_doppler\kahraman_equipment\code\organic_printer_designs\clothing.dm" -#include "modular_doppler\kahraman_equipment\code\organic_printer_designs\equipment.dm" -#include "modular_doppler\kahraman_equipment\code\organic_printer_designs\resources.dm" #include "modular_doppler\languages\language_datums.dm" #include "modular_doppler\loadout_categories\loadout_checkers.dm" #include "modular_doppler\loadout_categories\categories\belts.dm" @@ -6633,7 +6593,6 @@ #include "modular_doppler\modular_antagonists\sapper_gang\code\paper_premade.dm" #include "modular_doppler\modular_antagonists\sapper_gang\code\sapperpad.dm" #include "modular_doppler\modular_cosmetics\code\jacket_pockets.dm" -#include "modular_doppler\modular_cosmetics\code\towels.dm" #include "modular_doppler\modular_cosmetics\code\uniform_overrides.dm" #include "modular_doppler\modular_cosmetics\code\face\basemasks.dm" #include "modular_doppler\modular_cosmetics\code\hands\rings.dm" @@ -6726,7 +6685,6 @@ #include "modular_doppler\modular_customization\preferences\snout.dm" #include "modular_doppler\modular_customization\preferences\tail.dm" #include "modular_doppler\modular_customization\preferences\wings.dm" -#include "modular_doppler\modular_customization\tri_color\antennae.dm" #include "modular_doppler\modular_customization\tri_color\body_marking_lizard.dm" #include "modular_doppler\modular_customization\tri_color\body_marking_moth.dm" #include "modular_doppler\modular_customization\tri_color\cap.dm" @@ -6745,11 +6703,7 @@ #include "modular_doppler\modular_food_drinks_and_chems\food_and_drinks\drink_reagents.dm" #include "modular_doppler\modular_food_drinks_and_chems\food_and_drinks\drinks.dm" #include "modular_doppler\modular_food_drinks_and_chems\food_and_drinks\drinks_recipes.dm" -#include "modular_doppler\modular_hydroponics\code\honeysuckle.dm" -#include "modular_doppler\modular_hydroponics\code\tea_coffee.dm" #include "modular_doppler\modular_items\invisible_gear.dm" -#include "modular_doppler\modular_mapping\areas\ruins.dm" -#include "modular_doppler\modular_mapping\ruins\icemoon.dm" #include "modular_doppler\modular_medical\code\carbon_update_icons.dm" #include "modular_doppler\modular_medical\medical_designs\medical_designs.dm" #include "modular_doppler\modular_medical\reagents\medicine.dm" @@ -6760,12 +6714,6 @@ #include "modular_doppler\modular_medical\wounds\muscle.dm" #include "modular_doppler\modular_medical\wounds\wound_effects.dm" #include "modular_doppler\modular_mob_spawn\code\mob_spawn.dm" -#include "modular_doppler\modular_quirks\excitable\quirk.dm" -#include "modular_doppler\modular_quirks\paycheck_rations\code\quirk.dm" -#include "modular_doppler\modular_quirks\paycheck_rations\code\rationpacks.dm" -#include "modular_doppler\modular_quirks\paycheck_rations\code\reagents.dm" -#include "modular_doppler\modular_quirks\paycheck_rations\code\ticket_book.dm" -#include "modular_doppler\modular_quirks\paycheck_rations\code\tickets.dm" #include "modular_doppler\modular_sounds\code\sounds.dm" #include "modular_doppler\modular_species\code\bloodsplatter.dm" #include "modular_doppler\modular_species\overwrites\code\species.dm" @@ -6795,10 +6743,11 @@ #include "modular_doppler\modular_weapons\manufacturer_examine\code\gun_company_additions.dm" #include "modular_doppler\modular_weapons\manufacturer_examine\code\manufacturer_element.dm" #include "modular_doppler\obj_flags_doppler\code\objs.dm" -#include "modular_doppler\objects_and_structures\code\icemoon_tiles.dm" -#include "modular_doppler\objects_and_structures\code\sauna_oven.dm" -#include "modular_doppler\objects_and_structures\code\towel_bins.dm" -#include "modular_doppler\objects_and_structures\code\watercloset.dm" +#include "modular_doppler\paycheck_rations\code\quirk.dm" +#include "modular_doppler\paycheck_rations\code\rationpacks.dm" +#include "modular_doppler\paycheck_rations\code\reagents.dm" +#include "modular_doppler\paycheck_rations\code\ticket_book.dm" +#include "modular_doppler\paycheck_rations\code\tickets.dm" #include "modular_doppler\pixel_shift\living.dm" #include "modular_doppler\pixel_shift\living_movement.dm" #include "modular_doppler\pixel_shift\code\pixel_shift_component.dm" @@ -6829,14 +6778,6 @@ #include "modular_doppler\vending_machines\code\vendor_food.dm" #include "modular_doppler\vending_machines\code\vendor_snacks.dm" #include "modular_doppler\vending_machines\code\vendors.dm" -#include "modular_doppler\verbs\code\communication.dm" -#include "modular_doppler\verbs\code\do_checks.dm" -#include "modular_doppler\verbs\code\do_verbs.dm" -#include "modular_doppler\verbs\code\log_category_game.dm" -#include "modular_doppler\verbs\code\looc.dm" -#include "modular_doppler\verbs\code\preferences.dm" -#include "modular_doppler\verbs\code\say.dm" -#include "modular_doppler\verbs\code\subtle.dm" #include "modular_doppler\wargaming\code\game_kit.dm" #include "modular_doppler\wargaming\code\holograms.dm" #include "modular_doppler\wargaming\code\projectors.dm" diff --git a/tgui/packages/tgui-panel/chat/constants.ts b/tgui/packages/tgui-panel/chat/constants.ts index 56378b8bc54b5..57ad525a9a9aa 100644 --- a/tgui/packages/tgui-panel/chat/constants.ts +++ b/tgui/packages/tgui-panel/chat/constants.ts @@ -53,7 +53,7 @@ export const MESSAGE_TYPES = [ type: MESSAGE_TYPE_LOCALCHAT, name: 'Local', description: 'In-character local messages (say, emote, etc)', - selector: '.say, .emote, .looc', // DOPPLER EDIT ADDITION - LOOC + selector: '.say, .emote', }, { type: MESSAGE_TYPE_RADIO, @@ -86,7 +86,7 @@ export const MESSAGE_TYPES = [ type: MESSAGE_TYPE_OOC, name: 'OOC', description: 'The bluewall of global OOC messages', - selector: '.ooc, .adminooc, .adminobserverooc, .oocplain, .looc, .rlooc', // DOPPLER EDIT ADDITION - LOOC AND RLOOC + selector: '.ooc, .adminooc, .adminobserverooc, .oocplain', }, { type: MESSAGE_TYPE_ADMINPM, diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss index 78be30f5d4c9f..25f4eabd45d86 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss @@ -1012,7 +1012,6 @@ em { width: 3em; // a css guru can probably dehardcode this later height: auto; margin-right: 12px; - margin-top: 6px; } .img_by_text_container .img_text { @@ -1189,40 +1188,3 @@ $border-width-px: $border-width * 1px; background-color: darken(map.get($alert-stripe-colors, $color-name), 5); } } - -/* DOPPLER EDIT ADDITION START - DARK MODE CLASSES */ - -.looc { - color: #d8b555; -} - -.rlooc { - color: #b09448; -} - -.pink { - color: #ff00ff; - font-weight: bold; -} - -.brown { - color: #3d2009; - font-weight: bold; -} - -.cyan { - color: #0ea1e6; - font-weight: bold; -} - -.orange { - color: #b8761a; - font-weight: bold; -} - -.yellow { - color: #c7b72c; - font-weight: bold; -} - -// DOPPLER EDIT ADDITION END diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss index 51ff6ac35b03f..b9caf24ddd81f 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss @@ -1030,7 +1030,6 @@ h2.alert { width: 2.5em; // a css guru can probably dehardcode this later height: auto; margin-right: 12px; - margin-top: 6px; } .img_by_text_container .img_text { @@ -1213,41 +1212,3 @@ $border-width-px: $border-width * 1px; ); } } - -/* DOPPLER EDIT ADDITION START - LIGHT MODE CLASSES */ - -.looc { - color: #6699cc; - font-weight: bold; -} - -.rlooc { - color: #507294; - font-weight: bold; -} - -.pink { - color: #ff00ff; - font-weight: bold; -} - -.brown { - color: #3d2009; - font-weight: bold; -} - -.cyan { - color: #0ea1e6; - font-weight: bold; -} - -.orange { - color: #b8761a; - font-weight: bold; -} - -.yellow { - color: #c7b72c; - font-weight: bold; -} -// DOPPLER EDIT ADDITION END diff --git a/tgui/packages/tgui-say/ChannelIterator.test.ts b/tgui/packages/tgui-say/ChannelIterator.test.ts index 93891ce5fc57a..15e9812e702ec 100644 --- a/tgui/packages/tgui-say/ChannelIterator.test.ts +++ b/tgui/packages/tgui-say/ChannelIterator.test.ts @@ -11,11 +11,6 @@ describe('ChannelIterator', () => { expect(channelIterator.current()).toBe('Say'); expect(channelIterator.next()).toBe('Radio'); expect(channelIterator.next()).toBe('Me'); - // DOPPLER EDIT ADDITION START - expect(channelIterator.next()).toBe('Whis'); - expect(channelIterator.next()).toBe('LOOC'); - expect(channelIterator.next()).toBe('Do'); - // DOPPLER EDIT ADDITION END expect(channelIterator.next()).toBe('OOC'); expect(channelIterator.next()).toBe('Say'); // Admin is blacklisted so it should be skipped }); diff --git a/tgui/packages/tgui-say/ChannelIterator.ts b/tgui/packages/tgui-say/ChannelIterator.ts index b30c36bacd8d9..136806927e95e 100644 --- a/tgui/packages/tgui-say/ChannelIterator.ts +++ b/tgui/packages/tgui-say/ChannelIterator.ts @@ -1,14 +1,4 @@ -export type Channel = - | 'Say' - | 'Radio' - | 'Me' - // DOPPLER EDIT ADDITION START - | 'Whis' - | 'LOOC' - | 'Do' - // DOPPLER EDIT ADDITION END - | 'OOC' - | 'Admin'; +export type Channel = 'Say' | 'Radio' | 'Me' | 'OOC' | 'Admin'; /** * ### ChannelIterator @@ -18,18 +8,7 @@ export type Channel = */ export class ChannelIterator { private index: number = 0; - private readonly channels: Channel[] = [ - 'Say', - 'Radio', - 'Me', - // DOPPLER EDIT ADDITION - 'Whis', - 'LOOC', - 'Do', - // DOPPLER EDIT ADDITION - 'OOC', - 'Admin', - ]; + private readonly channels: Channel[] = ['Say', 'Radio', 'Me', 'OOC', 'Admin']; private readonly blacklist: Channel[] = ['Admin']; private readonly quiet: Channel[] = ['OOC', 'Admin']; diff --git a/tgui/packages/tgui-say/styles/colors.scss b/tgui/packages/tgui-say/styles/colors.scss index aa53224b732ec..a6b492247187b 100644 --- a/tgui/packages/tgui-say/styles/colors.scss +++ b/tgui/packages/tgui-say/styles/colors.scss @@ -26,11 +26,6 @@ $_channel_map: ( 'Supp': #b88646, 'Svc': #6ca729, 'Synd': #8f4a4b, - // NOVA EDIT ADDITION START - 'Whis': #7c7fd9, - 'LOOC': #ffceb6, - 'Do': #59da7e, - // NOVA EDIT ADDITION END ); $channel_keys: map.keys($_channel_map) !default; diff --git a/tgui/packages/tgui/interfaces/AntagInfoBlob.tsx b/tgui/packages/tgui/interfaces/AntagInfoBlob.tsx index 725efb056e266..dfb2bd5bb2c89 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoBlob.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoBlob.tsx @@ -49,7 +49,7 @@ const Overview = (props) => { You haven't revealed your true form yet! - You must succumb to the infection. Find somewhere safe and pop! + You must be succumb to the infection. Find somewhere safe and pop! ); @@ -109,22 +109,15 @@ const Basics = (props) => { You will be able to manually place your blob core by pressing the - Place Blob Core button in the bottom right corner of the screen.{' '} -
    -
    - If you are the blob infection, you can place the core where you are - standing by pressing the pop button on the top left corner of the - screen. + Place Blob Core button in the bottom right corner of the screen.
    In addition to the buttons on your HUD, there are a few click shortcuts to speed up expansion and defense. - Click = Expand Blob
    - Middle Mouse Click = Rally Spores
    - Ctrl Click = Create Shield Blob
    - Alt Click = Remove Blob
    + Click = Expand Blob | Middle Mouse Click = Rally Spores | Ctrl Click = + Create Shield Blob | Alt Click = Remove Blob
    Attempting to talk will send a message to all other overminds, @@ -140,9 +133,9 @@ const Minions = (props) => { - This unit can be produced from factories for a cost. They are hard to - kill, powerful, and moderately smart. The factory used to create one - will become fragile and briefly unable to produce spores. + Defenders that can be produced from factories for a cost, and are hard + to kill, powerful, and moderately smart. The factory used to create + one will become fragile and briefly unable to produce spores. Produced automatically from factories, these are weak, but can be @@ -159,21 +152,18 @@ const Structures = (props) => { Normal Blobs will expand your reach and can be upgraded into special - blobs that perform certain functions. Bear in mind that expanding into - space has an 80% chance of failing! + blobs that perform certain functions.
    You can upgrade normal blobs into the following types of blob: - - Strong blobs are expensive but take more damage. In additon, they are - fireproof and can block air, use these to protect yourself from - station fires. - - - Upgrading strong blobs creates reflective blobs, capable of reflecting - most projectiles at the cost of the strong blob's extra health. + + Strong and expensive blobs which take more damage. In additon, they + are fireproof and can block air, use these to protect yourself from + station fires. Upgrading them again will result in a reflective blob, + capable of reflecting most projectiles at the cost of the strong + blob's extra health. Blobs which produce more resources for you, build as many of these as diff --git a/tgui/packages/tgui/interfaces/AutomatedAnnouncement.tsx b/tgui/packages/tgui/interfaces/AutomatedAnnouncement.tsx index f88b2da67f4f5..f08ee83fd4ffd 100644 --- a/tgui/packages/tgui/interfaces/AutomatedAnnouncement.tsx +++ b/tgui/packages/tgui/interfaces/AutomatedAnnouncement.tsx @@ -9,29 +9,16 @@ const TOOLTIP_TEXT = ` %RANK with their job. `; -const TOOLTIP_NODE = ` - %NODE will be replaced with the researched node. -`; - type Data = { arrivalToggle: BooleanLike; arrival: string; newheadToggle: BooleanLike; newhead: string; - node_toggle: BooleanLike; - node_message: string; }; export const AutomatedAnnouncement = (props) => { const { act, data } = useBackend(); - const { - arrivalToggle, - arrival, - newheadToggle, - newhead, - node_toggle, - node_message, - } = data; + const { arrivalToggle, arrival, newheadToggle, newhead } = data; return ( @@ -103,40 +90,6 @@ export const AutomatedAnnouncement = (props) => { -
    act('node_toggle')} - /> - } - > - - - } - > - - act('node_message', { - newText: value, - }) - } - /> - - -
    ); diff --git a/tgui/packages/tgui/interfaces/CrewManifest.jsx b/tgui/packages/tgui/interfaces/CrewManifest.jsx index 6557dda31f4b9..4039eb8fc3a2f 100644 --- a/tgui/packages/tgui/interfaces/CrewManifest.jsx +++ b/tgui/packages/tgui/interfaces/CrewManifest.jsx @@ -1,5 +1,5 @@ import { Icon, Section, Table, Tooltip } from 'tgui-core/components'; -import { classes } from '../../common/react'; +import { classes } from 'tgui-core/react'; import { useBackend } from '../backend'; import { Window } from '../layouts'; diff --git a/tgui/packages/tgui/interfaces/Fax.tsx b/tgui/packages/tgui/interfaces/Fax.tsx index 1cefc44448bf2..059997456b55d 100644 --- a/tgui/packages/tgui/interfaces/Fax.tsx +++ b/tgui/packages/tgui/interfaces/Fax.tsx @@ -61,7 +61,7 @@ export const Fax = (props) => {
    {data.fax_id} - {data.visible ? 'true' : 'false'} + {data.visible ? true : false}
    = { - name: 'Antennae Color', - component: FeatureTriColorInput, -}; - export const has_fluff: FeatureToggle = { name: 'Add Part: Fluff', category: 'GAMEPLAY', diff --git a/tgui/packages/tgui/interfaces/StripMenu.tsx b/tgui/packages/tgui/interfaces/StripMenu.tsx index aeb020a75e863..01b559735df98 100644 --- a/tgui/packages/tgui/interfaces/StripMenu.tsx +++ b/tgui/packages/tgui/interfaces/StripMenu.tsx @@ -217,7 +217,7 @@ const SLOTS: Record< tail: { displayName: 'tail', gridSpot: getGridSpotKey([3, 3]), - image: 'inventory-tail.png', + image: 'inventory-belt.png', }, /* Doppler station addition end */ }; diff --git a/tgui/packages/tgui/interfaces/Vending.tsx b/tgui/packages/tgui/interfaces/Vending.tsx index ab4ea98a583ea..64b62c86c62e4 100644 --- a/tgui/packages/tgui/interfaces/Vending.tsx +++ b/tgui/packages/tgui/interfaces/Vending.tsx @@ -18,7 +18,6 @@ import { DmIcon, Input } from '../components'; import { Window } from '../layouts'; type VendingData = { - all_products_free: boolean; onstation: boolean; department: string; jobDiscount: number; @@ -219,7 +218,7 @@ const ProductDisplay = (props: { } = props; const { stock, - all_products_free, + onstation, user, displayed_currency_icon, displayed_currency_name, @@ -232,7 +231,7 @@ const ProductDisplay = (props: { title="Products" buttons={ - {!all_products_free && user && ( + {!!onstation && user && ( {(user && user.cash) || 0} {displayed_currency_name}{' '} @@ -278,15 +277,15 @@ const ProductDisplay = (props: { const VendingRow = (props) => { const { data } = useBackend(); const { custom, product, productStock } = props; - const { access, department, jobDiscount, all_products_free, user } = data; - const free = all_products_free || product.price === 0; + const { access, department, jobDiscount, onstation, user } = data; + const free = !onstation || product.price === 0; const discount = !product.premium && department === user?.department; const remaining = custom ? product.amount : productStock.amount; const redPrice = Math.round(product.price * jobDiscount); const disabled = remaining === 0 || - (!all_products_free && !user) || - (!all_products_free && + (onstation && !user) || + (onstation && !access && (discount ? redPrice : product.price) > user?.cash); diff --git a/tgui/packages/tgui/interfaces/common/JobToIcon.ts b/tgui/packages/tgui/interfaces/common/JobToIcon.ts index d2a473f3b058e..74927a2ff08bb 100644 --- a/tgui/packages/tgui/interfaces/common/JobToIcon.ts +++ b/tgui/packages/tgui/interfaces/common/JobToIcon.ts @@ -54,6 +54,5 @@ export const JOB2ICON = { 'Station Engineer': 'gears', 'Syndicate Operative': 'dragon', 'Veteran Security Advisor': 'ribbon', - 'Pun Pun': 'paw', Warden: 'handcuffs', } as const; diff --git a/tools/UpdatePaths/Scripts/85141_drying_rack_rename.txt b/tools/UpdatePaths/Scripts/99999_drying_rack_rename.txt similarity index 100% rename from tools/UpdatePaths/Scripts/85141_drying_rack_rename.txt rename to tools/UpdatePaths/Scripts/99999_drying_rack_rename.txt diff --git a/tools/maplint/README.md b/tools/maplint/README.md index 7f9930231a756..82ee0bd0ced54 100644 --- a/tools/maplint/README.md +++ b/tools/maplint/README.md @@ -130,57 +130,3 @@ help: Pugs haven't existed on Sol since 2450. /mob/dog/pug: banned: true ``` - -### `when` - Conditional Rules - -Sometimes it may be necessary for a rule to be given conditions which have to be met before it needs to be applied. All children of the when node must be satisfied for the rule to execute. - -If we wanted to create a rule which disallows the placement of access helpers when an airlock's access has been manually set via a variable edit, then we could make the following rule: - -```yml -/obj/machinery/door/airlock: - when: - - req_access_txt is set - banned_neighbors: - - /obj/effect/mapping_helper/airlock/access -``` - -The following conditions are valid: -- **{var_name} is set**: The variable named *var_name* has been modified. -- **{var_name} is not set**: The variable named *var_name* has not been modified. -- **{var_name} is '{value}'**: The variable named *var_name* has a specific value. -- **{var_name} is not '{value}'**: The variable named *var_name* does not have a specific value. -- **{var_name} like '{regex}'**: The variable named *var_name* matches the provided regex. - -#### `any` - -The any node may be added as a child to the when node to specify that it will be satisfied if any of its child conditions are met. - -```yml -/mob/dog: - # Rule only applies when the dog is any of the following breeds - when: - - any: - - breed is 'labrador' - - breed is 'pug' - - breed is 'corgi' - # These breeds of dogs must have a dogbed - required_neighbors: - - /obj/dogbed -``` - -#### `all` - -The all node may be added as a child to the when node to specify that it will be satisfied only when all of its child conditions are met. Note that the `all` node only makes sense to use when the parent node is an `any` node, as the default behaviour of `when` is to require all conditions to be met. - -```yml -/mob/dog: - # Rule only applies if the dog breed is capitalised and has an owner - when: - - all: - - breed like '[A-Z][a-z]*' - - owner is set - # These dogs must have a dogbed for their owner - required_neighbors: - - /obj/dogbed -``` diff --git a/tools/maplint/source/common.py b/tools/maplint/source/common.py index 44f0abaf01162..6fc0080009acb 100644 --- a/tools/maplint/source/common.py +++ b/tools/maplint/source/common.py @@ -29,12 +29,8 @@ def __str__(self) -> str: class Filename: path: str - def __str__(self) -> str: - return self.path - @dataclass class Null: - def __str__(self) -> str: - return "null" + pass Constant = str | float | Filename | Typepath | Null | list['Constant'] | dict['Constant', 'Constant'] diff --git a/tools/maplint/source/lint.py b/tools/maplint/source/lint.py index 0847b10ed7161..ee86d29be52b4 100644 --- a/tools/maplint/source/lint.py +++ b/tools/maplint/source/lint.py @@ -1,5 +1,5 @@ import re -from typing import Optional, Union +from typing import Optional from .common import Constant, Typepath from .dmm import DMM, Content @@ -41,7 +41,7 @@ def matches_path(self, path: Typepath): return self.typepath.segments == path.segments[:len(self.typepath.segments)] -class AtomNeighbor: +class BannedNeighbor: identical: bool = False typepath: Optional[TypepathExtra] = None pattern: Optional[re.Pattern] = None @@ -84,12 +84,6 @@ def matches(self, identified: Content, neighbor: Content): return False - def to_string(self) -> str: - if (self.typepath is not None): - return self.typepath.typepath.path - elif (self.pattern is not None): - return self.pattern.pattern - Choices = list[Constant] | re.Pattern def extract_choices(data, key) -> Optional[Choices]: @@ -159,151 +153,10 @@ def run(self, identified: Content) -> str: return f"This variable is not allowed for this type." -# Base class for conditional rules -class ConditionalRule: - def is_met(self, identified: Content) -> bool: - raise NotImplementedError("This method should be implemented by subclasses.") - - def match_string(self, parent_intersection: bool) -> str: - raise NotImplementedError("This method should be implemented by subclasses") - -# A single conditional expression -class WhenCondition(ConditionalRule): - condition: str - match_set: Optional[re.Match[str]] - match_not_set: Optional[re.Match[str]] - match_equal: Optional[re.Match[str]] - match_not_equal: Optional[re.Match[str]] - match_like: Optional[re.Match[str]] - - def __init__(self, condition: str): - self.condition = condition - self.match_set = re.match("(.+) is set", condition) - self.match_not_set = re.match("(.+) is not set", condition) - self.match_equal = re.match("(.+) is '(.+)'", condition) - self.match_not_equal = re.match("(.+) is not '(.+)'", condition) - self.match_like = re.match("(.+) like '(.+)'", condition) - matches = 0 - if self.match_set is not None: - matches = matches + 1 - if self.match_not_set is not None: - matches = matches + 1 - if self.match_equal is not None: - matches = matches + 1 - if self.match_not_equal is not None: - matches = matches + 1 - if self.match_like is not None: - matches = matches + 1 - if (matches != 1): - raise RuntimeError(f"Conditional rule must be either is set, is not set, is 'value', is not 'value', or like 'regex'. Instead found: {condition}") - - def is_met(self, identified: Content) -> bool: - var_edits = identified.var_edits - - if self.match_set is not None: - var_name = self.match_set.group(1) - return var_name in var_edits - - elif self.match_not_set is not None: - var_name = self.match_not_set.group(1) - return var_name not in var_edits - - elif self.match_equal is not None: - var_name = self.match_equal.group(1) - expected_value = self.match_equal.group(2) - if var_name not in var_edits: - return False - if (isinstance(var_edits[var_name], float)): - # If something is a float (number), check it as an int and a float - # Hack for integer value parsing - if var_edits[var_name] % 1 == 0: - return str(int(var_edits[var_name])).strip() == expected_value.strip() - return str(var_edits[var_name]).strip() == expected_value.strip() - - elif self.match_not_equal is not None: - var_name = self.match_not_equal.group(1) - unexpected_value = self.match_not_equal.group(2) - if var_name not in var_edits: - return True - if (isinstance(var_edits[var_name], float)): - # If something is a float (number), check it as an int and a float - # Hack for integer value parsing - if var_edits[var_name] % 1 == 0: - return str(int(var_edits[var_name])).strip() != expected_value.strip() - return str(var_edits[var_name]).strip() != expected_value.strip() - - elif self.match_like is not None: - var_name = self.match_like.group(1) - pattern = self.match_like.group(2) - return (var_name in var_edits) and re.match(pattern, str(var_edits[var_name])) - - return False - - def match_string(self, parent_intersection: bool) -> str: - return self.condition - -# A conditional group (Joining with AND and OR) -class WhenGroup(ConditionalRule): - conditions: list[ConditionalRule] - all_group: bool - - def __init__(self, conditions: list[Union[dict, str]], all_group: bool = True): - self.conditions = [self.parse_condition(condition) for condition in conditions] - self.all_group = all_group - - def parse_condition(self, condition: Union[dict, str]) -> ConditionalRule: - if isinstance(condition, dict): - if "all" in condition: - return WhenGroup(condition["all"], all_group=True) - elif "any" in condition: - return WhenGroup(condition["any"], all_group=False) - else: - raise RuntimeError(f"Unknown conditional group in when clause: {list(condition.keys())[0]}") - elif isinstance(condition, str): - return WhenCondition(condition) - else: - raise RuntimeError(f"Invalid condition type: {type(condition)}") - - def is_met(self, identified: Content) -> bool: - if self.all_group: - # For `all` group, all conditions must be met - return all(condition.is_met(identified) for condition in self.conditions) - else: - # For `any` group, only one condition must be met - return any(condition.is_met(identified) for condition in self.conditions) - - # Add parenthesis where required - def match_string(self, parent_intersection: bool) -> str: - match_symbol = " and " if self.all_group else " or " - match_text = match_symbol.join(condition.match_string(self.all_group) for condition in self.conditions); - if (self.all_group == False and parent_intersection == True and len(self.conditions) > 1): - return f"({match_text})" - else: - return match_text - -class When: - root_group: WhenGroup - - def __init__(self, conditions: list[Union[dict, str]]): - expect(isinstance(conditions, list), "when must be a list of conditions.") - # Default to 'all' group if there are multiple conditions with no explicit 'any' or 'all' - if len(conditions) > 1 and not any(isinstance(cond, dict) for cond in conditions): - self.root_group = WhenGroup(conditions, all_group=True) - else: - self.root_group = WhenGroup(conditions) - - def evaluate(self, identified: Content) -> bool: - return self.root_group.is_met(identified) - - def match_string(self) -> str: - return f" when {self.root_group.match_string(True)}"; - class Rules: banned: bool = False - banned_neighbors: list[AtomNeighbor] = [] + banned_neighbors: list[BannedNeighbor] = [] banned_variables: bool | list[BannedVariable] = [] - required_neighbors: list[AtomNeighbor] = [] - when: Optional[When] = None def __init__(self, data): expect(isinstance(data, dict), "Lint rules must be a dictionary.") @@ -318,19 +171,9 @@ def __init__(self, data): expect(isinstance(banned_neighbors_data, list) or isinstance(banned_neighbors_data, dict), "banned_neighbors must be a list, or a dictionary keyed by type.") if isinstance(banned_neighbors_data, dict): - self.banned_neighbors = [AtomNeighbor(typepath, data) for typepath, data in banned_neighbors_data.items()] - else: - self.banned_neighbors = [AtomNeighbor(typepath) for typepath in banned_neighbors_data] - - if "required_neighbors" in data: - required_neighbors_data = data.pop("required_neighbors") - - expect(isinstance(required_neighbors_data, list) or isinstance(required_neighbors_data, dict), "required_neighbors must be a list, or a dictionary keyed by type.") - - if isinstance(required_neighbors_data, dict): - self.required_neighbors = [AtomNeighbor(typepath, data) for typepath, data in required_neighbors_data.items()] + self.banned_neighbors = [BannedNeighbor(typepath, data) for typepath, data in banned_neighbors_data.items()] else: - self.required_neighbors = [AtomNeighbor(typepath) for typepath in required_neighbors_data] + self.banned_neighbors = [BannedNeighbor(typepath) for typepath in banned_neighbors_data] if "banned_variables" in data: banned_variables_data = data.pop("banned_variables") @@ -344,41 +187,24 @@ def __init__(self, data): else: self.banned_variables = [BannedVariable(variable) for variable in banned_variables_data] - if "when" in data: - self.when = When(data.pop("when")) - expect(len(data) == 0, f"Unknown lint rules: {', '.join(data.keys())}.") def run(self, identified: Content, contents: list[Content], identified_index) -> list[MaplintError]: failures: list[MaplintError] = [] - when_text = self.when.match_string() if self.when is not None else "" - - # If a when is present and is unmet, skip evaluation of this rule - if self.when and not self.when.evaluate(identified): - return failures if self.banned: - failures.append(fail_content(identified, f"Typepath {identified.path} is banned{when_text}.")) + failures.append(fail_content(identified, f"Typepath {identified.path} is banned.")) for banned_neighbor in self.banned_neighbors: for neighbor in contents[:identified_index] + contents[identified_index + 1:]: if not banned_neighbor.matches(identified, neighbor): continue - failures.append(fail_content(identified, f"Typepath {identified.path} has a banned neighbor{when_text}: {neighbor.path}")) - - for required_neighbor in self.required_neighbors: - found = False - for neighbor in contents[:identified_index] + contents[identified_index + 1:]: - if required_neighbor.matches(identified, neighbor): - found = True - break - if found == False: - failures.append(fail_content(identified, f"Typepath {identified.path} is missing a required neighbor{when_text}: {required_neighbor.to_string()}")) + failures.append(fail_content(identified, f"Typepath {identified.path} has a banned neighbor: {neighbor.path}")) if self.banned_variables == True: if len(identified.var_edits) > 0: - failures.append(fail_content(identified, f"Typepath {identified.path} should not have any variable edits{when_text}.")) + failures.append(fail_content(identified, f"Typepath {identified.path} should not have any variable edits.")) else: assert isinstance(self.banned_variables, list) for banned_variable in self.banned_variables: @@ -386,14 +212,13 @@ def run(self, identified: Content, contents: list[Content], identified_index) -> ban_reason = banned_variable.run(identified) if ban_reason is None: continue - failures.append(fail_content(identified, f"Typepath {identified.path} has a banned variable (set to {identified.var_edits[banned_variable.variable]}){when_text}: {banned_variable.variable}. {ban_reason}")) + failures.append(fail_content(identified, f"Typepath {identified.path} has a banned variable (set to {identified.var_edits[banned_variable.variable]}): {banned_variable.variable}. {ban_reason}")) return failures class Lint: help: Optional[str] = None rules: dict[TypepathExtra, Rules] - disabled: bool = False def __init__(self, data): expect(isinstance(data, dict), "Lint must be a dictionary.") diff --git a/tools/pull_request_hooks/changelogParser.js b/tools/pull_request_hooks/changelogParser.js index 3d9bfc8668954..df4e4b2e9123a 100644 --- a/tools/pull_request_hooks/changelogParser.js +++ b/tools/pull_request_hooks/changelogParser.js @@ -42,7 +42,7 @@ function parseChangelogBody(lines, openTag) { const entry = CHANGELOG_KEYS_TO_ENTRY[type]; - if (!entry || entry.placeholders.includes(description)) { + if (entry.placeholders.includes(description)) { continue; } diff --git a/tools/pull_request_hooks/tests/flakyTestPayloads/chat_client.txt b/tools/pull_request_hooks/tests/flakyTestPayloads/chat_client.txt index c39a060ffcf20..b9e0e2a2bce3f 100644 --- a/tools/pull_request_hooks/tests/flakyTestPayloads/chat_client.txt +++ b/tools/pull_request_hooks/tests/flakyTestPayloads/chat_client.txt @@ -168,12 +168,12 @@ 2022-10-27T05:36:15.8312384Z hint: Using 'master' as the name for the initial branch. This default branch name 2022-10-27T05:36:15.8313365Z hint: is subject to change. To configure the initial branch name to use in all 2022-10-27T05:36:15.8313842Z hint: of your new repositories, which will suppress this warning, call: -2022-10-27T05:36:15.8314167Z hint: +2022-10-27T05:36:15.8314167Z hint: 2022-10-27T05:36:15.8314756Z hint: git config --global init.defaultBranch -2022-10-27T05:36:15.8315053Z hint: +2022-10-27T05:36:15.8315053Z hint: 2022-10-27T05:36:15.8315481Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2022-10-27T05:36:15.8316041Z hint: 'development'. The just-created branch can be renamed via this command: -2022-10-27T05:36:15.8316354Z hint: +2022-10-27T05:36:15.8316354Z hint: 2022-10-27T05:36:15.8316650Z hint: git branch -m 2022-10-27T05:36:15.8337002Z Initialized empty Git repository in /home/runner/work/tgstation/tgstation/.git/ 2022-10-27T05:36:15.8348424Z [command]/usr/bin/git remote add origin https://github.com/tgstation/tgstation @@ -190,213 +190,213 @@ 2022-10-27T05:36:15.9381545Z ##[endgroup] 2022-10-27T05:36:15.9383025Z ##[group]Fetching the repository 2022-10-27T05:36:15.9392584Z [command]/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --progress --no-recurse-submodules --depth=1 origin +deb5c38b8299183d179ee993b8c40179d42cff9b:refs/remotes/pull/70831/merge -2022-10-27T05:36:16.3561666Z remote: Enumerating objects: 12549, done. -2022-10-27T05:36:16.3568675Z remote: Counting objects: 0% (1/12549) -2022-10-27T05:36:16.3571032Z remote: Counting objects: 1% (126/12549) -2022-10-27T05:36:16.3576947Z remote: Counting objects: 2% (251/12549) -2022-10-27T05:36:16.3590550Z remote: Counting objects: 3% (377/12549) -2022-10-27T05:36:16.3591870Z remote: Counting objects: 4% (502/12549) -2022-10-27T05:36:16.3629704Z remote: Counting objects: 5% (628/12549) -2022-10-27T05:36:16.3630882Z remote: Counting objects: 6% (753/12549) -2022-10-27T05:36:16.3633986Z remote: Counting objects: 7% (879/12549) -2022-10-27T05:36:16.3662523Z remote: Counting objects: 8% (1004/12549) -2022-10-27T05:36:16.3663123Z remote: Counting objects: 9% (1130/12549) -2022-10-27T05:36:16.3664088Z remote: Counting objects: 10% (1255/12549) -2022-10-27T05:36:16.3664584Z remote: Counting objects: 11% (1381/12549) -2022-10-27T05:36:16.3665108Z remote: Counting objects: 12% (1506/12549) -2022-10-27T05:36:16.3665639Z remote: Counting objects: 13% (1632/12549) -2022-10-27T05:36:16.3666161Z remote: Counting objects: 14% (1757/12549) -2022-10-27T05:36:16.3666781Z remote: Counting objects: 15% (1883/12549) -2022-10-27T05:36:16.3667203Z remote: Counting objects: 16% (2008/12549) -2022-10-27T05:36:16.3667759Z remote: Counting objects: 17% (2134/12549) -2022-10-27T05:36:16.3668424Z remote: Counting objects: 18% (2259/12549) -2022-10-27T05:36:16.3668772Z remote: Counting objects: 19% (2385/12549) -2022-10-27T05:36:16.3686549Z remote: Counting objects: 20% (2510/12549) -2022-10-27T05:36:16.3687142Z remote: Counting objects: 21% (2636/12549) -2022-10-27T05:36:16.3693091Z remote: Counting objects: 22% (2761/12549) -2022-10-27T05:36:16.3695805Z remote: Counting objects: 23% (2887/12549) -2022-10-27T05:36:16.3696270Z remote: Counting objects: 24% (3012/12549) -2022-10-27T05:36:16.3696611Z remote: Counting objects: 25% (3138/12549) -2022-10-27T05:36:16.3696933Z remote: Counting objects: 26% (3263/12549) -2022-10-27T05:36:16.3697238Z remote: Counting objects: 27% (3389/12549) -2022-10-27T05:36:16.3697557Z remote: Counting objects: 28% (3514/12549) -2022-10-27T05:36:16.3700568Z remote: Counting objects: 29% (3640/12549) -2022-10-27T05:36:16.3701206Z remote: Counting objects: 30% (3765/12549) -2022-10-27T05:36:16.3701530Z remote: Counting objects: 31% (3891/12549) -2022-10-27T05:36:16.3702027Z remote: Counting objects: 32% (4016/12549) -2022-10-27T05:36:16.3704376Z remote: Counting objects: 33% (4142/12549) -2022-10-27T05:36:16.3705536Z remote: Counting objects: 34% (4267/12549) -2022-10-27T05:36:16.3706001Z remote: Counting objects: 35% (4393/12549) -2022-10-27T05:36:16.3706528Z remote: Counting objects: 36% (4518/12549) -2022-10-27T05:36:16.3707049Z remote: Counting objects: 37% (4644/12549) -2022-10-27T05:36:16.3707535Z remote: Counting objects: 38% (4769/12549) -2022-10-27T05:36:16.3707879Z remote: Counting objects: 39% (4895/12549) -2022-10-27T05:36:16.3708856Z remote: Counting objects: 40% (5020/12549) -2022-10-27T05:36:16.3714163Z remote: Counting objects: 41% (5146/12549) -2022-10-27T05:36:16.3716186Z remote: Counting objects: 42% (5271/12549) -2022-10-27T05:36:16.3720394Z remote: Counting objects: 43% (5397/12549) -2022-10-27T05:36:16.3725239Z remote: Counting objects: 44% (5522/12549) -2022-10-27T05:36:16.3727509Z remote: Counting objects: 45% (5648/12549) -2022-10-27T05:36:16.3728407Z remote: Counting objects: 46% (5773/12549) -2022-10-27T05:36:16.3733411Z remote: Counting objects: 47% (5899/12549) -2022-10-27T05:36:16.3734826Z remote: Counting objects: 48% (6024/12549) -2022-10-27T05:36:16.3736029Z remote: Counting objects: 49% (6150/12549) -2022-10-27T05:36:16.3736752Z remote: Counting objects: 50% (6275/12549) -2022-10-27T05:36:16.3737119Z remote: Counting objects: 51% (6400/12549) -2022-10-27T05:36:16.3740552Z remote: Counting objects: 52% (6526/12549) -2022-10-27T05:36:16.3741109Z remote: Counting objects: 53% (6651/12549) -2022-10-27T05:36:16.3742348Z remote: Counting objects: 54% (6777/12549) -2022-10-27T05:36:16.3745824Z remote: Counting objects: 55% (6902/12549) -2022-10-27T05:36:16.3746239Z remote: Counting objects: 56% (7028/12549) -2022-10-27T05:36:16.3748976Z remote: Counting objects: 57% (7153/12549) -2022-10-27T05:36:16.3752389Z remote: Counting objects: 58% (7279/12549) -2022-10-27T05:36:16.3753090Z remote: Counting objects: 59% (7404/12549) -2022-10-27T05:36:16.3753587Z remote: Counting objects: 60% (7530/12549) -2022-10-27T05:36:16.3753969Z remote: Counting objects: 61% (7655/12549) -2022-10-27T05:36:16.3755897Z remote: Counting objects: 62% (7781/12549) -2022-10-27T05:36:16.3758566Z remote: Counting objects: 63% (7906/12549) -2022-10-27T05:36:16.3760370Z remote: Counting objects: 64% (8032/12549) -2022-10-27T05:36:16.3763888Z remote: Counting objects: 65% (8157/12549) -2022-10-27T05:36:16.3765292Z remote: Counting objects: 66% (8283/12549) -2022-10-27T05:36:16.3765656Z remote: Counting objects: 67% (8408/12549) -2022-10-27T05:36:16.3767729Z remote: Counting objects: 68% (8534/12549) -2022-10-27T05:36:16.3769245Z remote: Counting objects: 69% (8659/12549) -2022-10-27T05:36:16.3772503Z remote: Counting objects: 70% (8785/12549) -2022-10-27T05:36:16.3773802Z remote: Counting objects: 71% (8910/12549) -2022-10-27T05:36:16.3774655Z remote: Counting objects: 72% (9036/12549) -2022-10-27T05:36:16.3775188Z remote: Counting objects: 73% (9161/12549) -2022-10-27T05:36:16.3778186Z remote: Counting objects: 74% (9287/12549) -2022-10-27T05:36:16.3778933Z remote: Counting objects: 75% (9412/12549) -2022-10-27T05:36:16.3780943Z remote: Counting objects: 76% (9538/12549) -2022-10-27T05:36:16.3781397Z remote: Counting objects: 77% (9663/12549) -2022-10-27T05:36:16.3782023Z remote: Counting objects: 78% (9789/12549) -2022-10-27T05:36:16.3782511Z remote: Counting objects: 79% (9914/12549) -2022-10-27T05:36:16.3784693Z remote: Counting objects: 80% (10040/12549) -2022-10-27T05:36:16.3785644Z remote: Counting objects: 81% (10165/12549) -2022-10-27T05:36:16.3786373Z remote: Counting objects: 82% (10291/12549) -2022-10-27T05:36:16.3787171Z remote: Counting objects: 83% (10416/12549) -2022-10-27T05:36:16.3788291Z remote: Counting objects: 84% (10542/12549) -2022-10-27T05:36:16.3789701Z remote: Counting objects: 85% (10667/12549) -2022-10-27T05:36:16.3791529Z remote: Counting objects: 86% (10793/12549) -2022-10-27T05:36:16.3792061Z remote: Counting objects: 87% (10918/12549) -2022-10-27T05:36:16.3792440Z remote: Counting objects: 88% (11044/12549) -2022-10-27T05:36:16.3792863Z remote: Counting objects: 89% (11169/12549) -2022-10-27T05:36:16.3793298Z remote: Counting objects: 90% (11295/12549) -2022-10-27T05:36:16.3795291Z remote: Counting objects: 91% (11420/12549) -2022-10-27T05:36:16.3796533Z remote: Counting objects: 92% (11546/12549) -2022-10-27T05:36:16.3804544Z remote: Counting objects: 93% (11671/12549) -2022-10-27T05:36:16.3804980Z remote: Counting objects: 94% (11797/12549) -2022-10-27T05:36:16.3809019Z remote: Counting objects: 95% (11922/12549) -2022-10-27T05:36:16.3812297Z remote: Counting objects: 96% (12048/12549) -2022-10-27T05:36:16.3812832Z remote: Counting objects: 97% (12173/12549) -2022-10-27T05:36:16.3813378Z remote: Counting objects: 98% (12299/12549) -2022-10-27T05:36:16.3822622Z remote: Counting objects: 99% (12424/12549) -2022-10-27T05:36:16.3823331Z remote: Counting objects: 100% (12549/12549) -2022-10-27T05:36:16.3823824Z remote: Counting objects: 100% (12549/12549), done. -2022-10-27T05:36:16.4028339Z remote: Compressing objects: 0% (1/10965) -2022-10-27T05:36:16.4147149Z remote: Compressing objects: 1% (110/10965) -2022-10-27T05:36:16.4301715Z remote: Compressing objects: 2% (220/10965) -2022-10-27T05:36:16.4468059Z remote: Compressing objects: 3% (329/10965) -2022-10-27T05:36:16.4473482Z remote: Compressing objects: 4% (439/10965) -2022-10-27T05:36:16.4543661Z remote: Compressing objects: 5% (549/10965) -2022-10-27T05:36:16.4673953Z remote: Compressing objects: 6% (658/10965) -2022-10-27T05:36:16.4966036Z remote: Compressing objects: 7% (768/10965) -2022-10-27T05:36:16.5309645Z remote: Compressing objects: 8% (878/10965) -2022-10-27T05:36:16.5681068Z remote: Compressing objects: 9% (987/10965) -2022-10-27T05:36:16.6184895Z remote: Compressing objects: 10% (1097/10965) -2022-10-27T05:36:17.1107044Z remote: Compressing objects: 11% (1207/10965) -2022-10-27T05:36:17.2060689Z remote: Compressing objects: 12% (1316/10965) -2022-10-27T05:36:17.3922950Z remote: Compressing objects: 13% (1426/10965) -2022-10-27T05:36:17.3936933Z remote: Compressing objects: 13% (1501/10965) -2022-10-27T05:36:17.4040840Z remote: Compressing objects: 14% (1536/10965) -2022-10-27T05:36:17.4460571Z remote: Compressing objects: 15% (1645/10965) -2022-10-27T05:36:17.4619358Z remote: Compressing objects: 16% (1755/10965) -2022-10-27T05:36:17.4790041Z remote: Compressing objects: 17% (1865/10965) -2022-10-27T05:36:17.4934830Z remote: Compressing objects: 18% (1974/10965) -2022-10-27T05:36:17.5257200Z remote: Compressing objects: 19% (2084/10965) -2022-10-27T05:36:17.5516516Z remote: Compressing objects: 20% (2193/10965) -2022-10-27T05:36:17.5561317Z remote: Compressing objects: 21% (2303/10965) -2022-10-27T05:36:17.5795622Z remote: Compressing objects: 22% (2413/10965) -2022-10-27T05:36:17.6401406Z remote: Compressing objects: 23% (2522/10965) -2022-10-27T05:36:17.6654061Z remote: Compressing objects: 24% (2632/10965) -2022-10-27T05:36:17.6828486Z remote: Compressing objects: 25% (2742/10965) -2022-10-27T05:36:17.7044480Z remote: Compressing objects: 26% (2851/10965) -2022-10-27T05:36:17.7222440Z remote: Compressing objects: 27% (2961/10965) -2022-10-27T05:36:17.7713784Z remote: Compressing objects: 28% (3071/10965) -2022-10-27T05:36:17.7980639Z remote: Compressing objects: 29% (3180/10965) -2022-10-27T05:36:17.8260312Z remote: Compressing objects: 30% (3290/10965) -2022-10-27T05:36:17.8653550Z remote: Compressing objects: 31% (3400/10965) -2022-10-27T05:36:17.8786759Z remote: Compressing objects: 32% (3509/10965) -2022-10-27T05:36:17.9127781Z remote: Compressing objects: 33% (3619/10965) -2022-10-27T05:36:17.9521720Z remote: Compressing objects: 34% (3729/10965) -2022-10-27T05:36:17.9910080Z remote: Compressing objects: 35% (3838/10965) -2022-10-27T05:36:18.0204335Z remote: Compressing objects: 36% (3948/10965) -2022-10-27T05:36:18.0597196Z remote: Compressing objects: 37% (4058/10965) -2022-10-27T05:36:18.0964696Z remote: Compressing objects: 38% (4167/10965) -2022-10-27T05:36:18.1358555Z remote: Compressing objects: 39% (4277/10965) -2022-10-27T05:36:18.1549596Z remote: Compressing objects: 40% (4386/10965) -2022-10-27T05:36:18.1861724Z remote: Compressing objects: 41% (4496/10965) -2022-10-27T05:36:18.2100005Z remote: Compressing objects: 42% (4606/10965) -2022-10-27T05:36:18.2479949Z remote: Compressing objects: 43% (4715/10965) -2022-10-27T05:36:18.2787209Z remote: Compressing objects: 44% (4825/10965) -2022-10-27T05:36:18.3002217Z remote: Compressing objects: 45% (4935/10965) -2022-10-27T05:36:18.3304059Z remote: Compressing objects: 46% (5044/10965) -2022-10-27T05:36:18.3627827Z remote: Compressing objects: 47% (5154/10965) -2022-10-27T05:36:18.3769101Z remote: Compressing objects: 48% (5264/10965) -2022-10-27T05:36:18.3833369Z remote: Compressing objects: 49% (5373/10965) -2022-10-27T05:36:18.4021233Z remote: Compressing objects: 49% (5403/10965) -2022-10-27T05:36:18.4232973Z remote: Compressing objects: 50% (5483/10965) -2022-10-27T05:36:18.4496802Z remote: Compressing objects: 51% (5593/10965) -2022-10-27T05:36:18.4760000Z remote: Compressing objects: 52% (5702/10965) -2022-10-27T05:36:18.5061635Z remote: Compressing objects: 53% (5812/10965) -2022-10-27T05:36:18.5273446Z remote: Compressing objects: 54% (5922/10965) -2022-10-27T05:36:18.5546118Z remote: Compressing objects: 55% (6031/10965) -2022-10-27T05:36:18.5809381Z remote: Compressing objects: 56% (6141/10965) -2022-10-27T05:36:18.6147456Z remote: Compressing objects: 57% (6251/10965) -2022-10-27T05:36:18.6311320Z remote: Compressing objects: 58% (6360/10965) -2022-10-27T05:36:18.6614446Z remote: Compressing objects: 59% (6470/10965) -2022-10-27T05:36:18.6930160Z remote: Compressing objects: 60% (6579/10965) -2022-10-27T05:36:18.7250175Z remote: Compressing objects: 61% (6689/10965) -2022-10-27T05:36:18.7426580Z remote: Compressing objects: 62% (6799/10965) -2022-10-27T05:36:18.7654931Z remote: Compressing objects: 63% (6908/10965) -2022-10-27T05:36:18.8010761Z remote: Compressing objects: 64% (7018/10965) -2022-10-27T05:36:18.8152846Z remote: Compressing objects: 65% (7128/10965) -2022-10-27T05:36:18.8473982Z remote: Compressing objects: 66% (7237/10965) -2022-10-27T05:36:18.8539428Z remote: Compressing objects: 67% (7347/10965) -2022-10-27T05:36:18.8540163Z remote: Compressing objects: 68% (7457/10965) -2022-10-27T05:36:18.8621595Z remote: Compressing objects: 69% (7566/10965) -2022-10-27T05:36:18.8622122Z remote: Compressing objects: 70% (7676/10965) -2022-10-27T05:36:18.8625855Z remote: Compressing objects: 71% (7786/10965) -2022-10-27T05:36:18.8626847Z remote: Compressing objects: 72% (7895/10965) -2022-10-27T05:36:18.8627930Z remote: Compressing objects: 73% (8005/10965) -2022-10-27T05:36:18.8629224Z remote: Compressing objects: 74% (8115/10965) -2022-10-27T05:36:18.8630011Z remote: Compressing objects: 75% (8224/10965) -2022-10-27T05:36:18.8630611Z remote: Compressing objects: 76% (8334/10965) -2022-10-27T05:36:18.8658429Z remote: Compressing objects: 77% (8444/10965) -2022-10-27T05:36:18.8659128Z remote: Compressing objects: 78% (8553/10965) -2022-10-27T05:36:18.8659555Z remote: Compressing objects: 79% (8663/10965) -2022-10-27T05:36:18.8688825Z remote: Compressing objects: 80% (8772/10965) -2022-10-27T05:36:18.8779984Z remote: Compressing objects: 81% (8882/10965) -2022-10-27T05:36:18.8780591Z remote: Compressing objects: 82% (8992/10965) -2022-10-27T05:36:18.8839685Z remote: Compressing objects: 83% (9101/10965) -2022-10-27T05:36:18.8906377Z remote: Compressing objects: 84% (9211/10965) -2022-10-27T05:36:18.8909267Z remote: Compressing objects: 85% (9321/10965) -2022-10-27T05:36:18.8909956Z remote: Compressing objects: 86% (9430/10965) -2022-10-27T05:36:18.8910536Z remote: Compressing objects: 87% (9540/10965) -2022-10-27T05:36:18.8911145Z remote: Compressing objects: 88% (9650/10965) -2022-10-27T05:36:18.8911776Z remote: Compressing objects: 89% (9759/10965) -2022-10-27T05:36:18.8951128Z remote: Compressing objects: 90% (9869/10965) -2022-10-27T05:36:18.9127733Z remote: Compressing objects: 91% (9979/10965) -2022-10-27T05:36:18.9128171Z remote: Compressing objects: 92% (10088/10965) -2022-10-27T05:36:18.9128609Z remote: Compressing objects: 93% (10198/10965) -2022-10-27T05:36:18.9133927Z remote: Compressing objects: 94% (10308/10965) -2022-10-27T05:36:18.9152257Z remote: Compressing objects: 95% (10417/10965) -2022-10-27T05:36:18.9166692Z remote: Compressing objects: 96% (10527/10965) -2022-10-27T05:36:18.9178013Z remote: Compressing objects: 97% (10637/10965) -2022-10-27T05:36:18.9188202Z remote: Compressing objects: 98% (10746/10965) -2022-10-27T05:36:18.9202595Z remote: Compressing objects: 99% (10856/10965) -2022-10-27T05:36:18.9203422Z remote: Compressing objects: 100% (10965/10965) -2022-10-27T05:36:18.9204293Z remote: Compressing objects: 100% (10965/10965), done. +2022-10-27T05:36:16.3561666Z remote: Enumerating objects: 12549, done. +2022-10-27T05:36:16.3568675Z remote: Counting objects: 0% (1/12549) +2022-10-27T05:36:16.3571032Z remote: Counting objects: 1% (126/12549) +2022-10-27T05:36:16.3576947Z remote: Counting objects: 2% (251/12549) +2022-10-27T05:36:16.3590550Z remote: Counting objects: 3% (377/12549) +2022-10-27T05:36:16.3591870Z remote: Counting objects: 4% (502/12549) +2022-10-27T05:36:16.3629704Z remote: Counting objects: 5% (628/12549) +2022-10-27T05:36:16.3630882Z remote: Counting objects: 6% (753/12549) +2022-10-27T05:36:16.3633986Z remote: Counting objects: 7% (879/12549) +2022-10-27T05:36:16.3662523Z remote: Counting objects: 8% (1004/12549) +2022-10-27T05:36:16.3663123Z remote: Counting objects: 9% (1130/12549) +2022-10-27T05:36:16.3664088Z remote: Counting objects: 10% (1255/12549) +2022-10-27T05:36:16.3664584Z remote: Counting objects: 11% (1381/12549) +2022-10-27T05:36:16.3665108Z remote: Counting objects: 12% (1506/12549) +2022-10-27T05:36:16.3665639Z remote: Counting objects: 13% (1632/12549) +2022-10-27T05:36:16.3666161Z remote: Counting objects: 14% (1757/12549) +2022-10-27T05:36:16.3666781Z remote: Counting objects: 15% (1883/12549) +2022-10-27T05:36:16.3667203Z remote: Counting objects: 16% (2008/12549) +2022-10-27T05:36:16.3667759Z remote: Counting objects: 17% (2134/12549) +2022-10-27T05:36:16.3668424Z remote: Counting objects: 18% (2259/12549) +2022-10-27T05:36:16.3668772Z remote: Counting objects: 19% (2385/12549) +2022-10-27T05:36:16.3686549Z remote: Counting objects: 20% (2510/12549) +2022-10-27T05:36:16.3687142Z remote: Counting objects: 21% (2636/12549) +2022-10-27T05:36:16.3693091Z remote: Counting objects: 22% (2761/12549) +2022-10-27T05:36:16.3695805Z remote: Counting objects: 23% (2887/12549) +2022-10-27T05:36:16.3696270Z remote: Counting objects: 24% (3012/12549) +2022-10-27T05:36:16.3696611Z remote: Counting objects: 25% (3138/12549) +2022-10-27T05:36:16.3696933Z remote: Counting objects: 26% (3263/12549) +2022-10-27T05:36:16.3697238Z remote: Counting objects: 27% (3389/12549) +2022-10-27T05:36:16.3697557Z remote: Counting objects: 28% (3514/12549) +2022-10-27T05:36:16.3700568Z remote: Counting objects: 29% (3640/12549) +2022-10-27T05:36:16.3701206Z remote: Counting objects: 30% (3765/12549) +2022-10-27T05:36:16.3701530Z remote: Counting objects: 31% (3891/12549) +2022-10-27T05:36:16.3702027Z remote: Counting objects: 32% (4016/12549) +2022-10-27T05:36:16.3704376Z remote: Counting objects: 33% (4142/12549) +2022-10-27T05:36:16.3705536Z remote: Counting objects: 34% (4267/12549) +2022-10-27T05:36:16.3706001Z remote: Counting objects: 35% (4393/12549) +2022-10-27T05:36:16.3706528Z remote: Counting objects: 36% (4518/12549) +2022-10-27T05:36:16.3707049Z remote: Counting objects: 37% (4644/12549) +2022-10-27T05:36:16.3707535Z remote: Counting objects: 38% (4769/12549) +2022-10-27T05:36:16.3707879Z remote: Counting objects: 39% (4895/12549) +2022-10-27T05:36:16.3708856Z remote: Counting objects: 40% (5020/12549) +2022-10-27T05:36:16.3714163Z remote: Counting objects: 41% (5146/12549) +2022-10-27T05:36:16.3716186Z remote: Counting objects: 42% (5271/12549) +2022-10-27T05:36:16.3720394Z remote: Counting objects: 43% (5397/12549) +2022-10-27T05:36:16.3725239Z remote: Counting objects: 44% (5522/12549) +2022-10-27T05:36:16.3727509Z remote: Counting objects: 45% (5648/12549) +2022-10-27T05:36:16.3728407Z remote: Counting objects: 46% (5773/12549) +2022-10-27T05:36:16.3733411Z remote: Counting objects: 47% (5899/12549) +2022-10-27T05:36:16.3734826Z remote: Counting objects: 48% (6024/12549) +2022-10-27T05:36:16.3736029Z remote: Counting objects: 49% (6150/12549) +2022-10-27T05:36:16.3736752Z remote: Counting objects: 50% (6275/12549) +2022-10-27T05:36:16.3737119Z remote: Counting objects: 51% (6400/12549) +2022-10-27T05:36:16.3740552Z remote: Counting objects: 52% (6526/12549) +2022-10-27T05:36:16.3741109Z remote: Counting objects: 53% (6651/12549) +2022-10-27T05:36:16.3742348Z remote: Counting objects: 54% (6777/12549) +2022-10-27T05:36:16.3745824Z remote: Counting objects: 55% (6902/12549) +2022-10-27T05:36:16.3746239Z remote: Counting objects: 56% (7028/12549) +2022-10-27T05:36:16.3748976Z remote: Counting objects: 57% (7153/12549) +2022-10-27T05:36:16.3752389Z remote: Counting objects: 58% (7279/12549) +2022-10-27T05:36:16.3753090Z remote: Counting objects: 59% (7404/12549) +2022-10-27T05:36:16.3753587Z remote: Counting objects: 60% (7530/12549) +2022-10-27T05:36:16.3753969Z remote: Counting objects: 61% (7655/12549) +2022-10-27T05:36:16.3755897Z remote: Counting objects: 62% (7781/12549) +2022-10-27T05:36:16.3758566Z remote: Counting objects: 63% (7906/12549) +2022-10-27T05:36:16.3760370Z remote: Counting objects: 64% (8032/12549) +2022-10-27T05:36:16.3763888Z remote: Counting objects: 65% (8157/12549) +2022-10-27T05:36:16.3765292Z remote: Counting objects: 66% (8283/12549) +2022-10-27T05:36:16.3765656Z remote: Counting objects: 67% (8408/12549) +2022-10-27T05:36:16.3767729Z remote: Counting objects: 68% (8534/12549) +2022-10-27T05:36:16.3769245Z remote: Counting objects: 69% (8659/12549) +2022-10-27T05:36:16.3772503Z remote: Counting objects: 70% (8785/12549) +2022-10-27T05:36:16.3773802Z remote: Counting objects: 71% (8910/12549) +2022-10-27T05:36:16.3774655Z remote: Counting objects: 72% (9036/12549) +2022-10-27T05:36:16.3775188Z remote: Counting objects: 73% (9161/12549) +2022-10-27T05:36:16.3778186Z remote: Counting objects: 74% (9287/12549) +2022-10-27T05:36:16.3778933Z remote: Counting objects: 75% (9412/12549) +2022-10-27T05:36:16.3780943Z remote: Counting objects: 76% (9538/12549) +2022-10-27T05:36:16.3781397Z remote: Counting objects: 77% (9663/12549) +2022-10-27T05:36:16.3782023Z remote: Counting objects: 78% (9789/12549) +2022-10-27T05:36:16.3782511Z remote: Counting objects: 79% (9914/12549) +2022-10-27T05:36:16.3784693Z remote: Counting objects: 80% (10040/12549) +2022-10-27T05:36:16.3785644Z remote: Counting objects: 81% (10165/12549) +2022-10-27T05:36:16.3786373Z remote: Counting objects: 82% (10291/12549) +2022-10-27T05:36:16.3787171Z remote: Counting objects: 83% (10416/12549) +2022-10-27T05:36:16.3788291Z remote: Counting objects: 84% (10542/12549) +2022-10-27T05:36:16.3789701Z remote: Counting objects: 85% (10667/12549) +2022-10-27T05:36:16.3791529Z remote: Counting objects: 86% (10793/12549) +2022-10-27T05:36:16.3792061Z remote: Counting objects: 87% (10918/12549) +2022-10-27T05:36:16.3792440Z remote: Counting objects: 88% (11044/12549) +2022-10-27T05:36:16.3792863Z remote: Counting objects: 89% (11169/12549) +2022-10-27T05:36:16.3793298Z remote: Counting objects: 90% (11295/12549) +2022-10-27T05:36:16.3795291Z remote: Counting objects: 91% (11420/12549) +2022-10-27T05:36:16.3796533Z remote: Counting objects: 92% (11546/12549) +2022-10-27T05:36:16.3804544Z remote: Counting objects: 93% (11671/12549) +2022-10-27T05:36:16.3804980Z remote: Counting objects: 94% (11797/12549) +2022-10-27T05:36:16.3809019Z remote: Counting objects: 95% (11922/12549) +2022-10-27T05:36:16.3812297Z remote: Counting objects: 96% (12048/12549) +2022-10-27T05:36:16.3812832Z remote: Counting objects: 97% (12173/12549) +2022-10-27T05:36:16.3813378Z remote: Counting objects: 98% (12299/12549) +2022-10-27T05:36:16.3822622Z remote: Counting objects: 99% (12424/12549) +2022-10-27T05:36:16.3823331Z remote: Counting objects: 100% (12549/12549) +2022-10-27T05:36:16.3823824Z remote: Counting objects: 100% (12549/12549), done. +2022-10-27T05:36:16.4028339Z remote: Compressing objects: 0% (1/10965) +2022-10-27T05:36:16.4147149Z remote: Compressing objects: 1% (110/10965) +2022-10-27T05:36:16.4301715Z remote: Compressing objects: 2% (220/10965) +2022-10-27T05:36:16.4468059Z remote: Compressing objects: 3% (329/10965) +2022-10-27T05:36:16.4473482Z remote: Compressing objects: 4% (439/10965) +2022-10-27T05:36:16.4543661Z remote: Compressing objects: 5% (549/10965) +2022-10-27T05:36:16.4673953Z remote: Compressing objects: 6% (658/10965) +2022-10-27T05:36:16.4966036Z remote: Compressing objects: 7% (768/10965) +2022-10-27T05:36:16.5309645Z remote: Compressing objects: 8% (878/10965) +2022-10-27T05:36:16.5681068Z remote: Compressing objects: 9% (987/10965) +2022-10-27T05:36:16.6184895Z remote: Compressing objects: 10% (1097/10965) +2022-10-27T05:36:17.1107044Z remote: Compressing objects: 11% (1207/10965) +2022-10-27T05:36:17.2060689Z remote: Compressing objects: 12% (1316/10965) +2022-10-27T05:36:17.3922950Z remote: Compressing objects: 13% (1426/10965) +2022-10-27T05:36:17.3936933Z remote: Compressing objects: 13% (1501/10965) +2022-10-27T05:36:17.4040840Z remote: Compressing objects: 14% (1536/10965) +2022-10-27T05:36:17.4460571Z remote: Compressing objects: 15% (1645/10965) +2022-10-27T05:36:17.4619358Z remote: Compressing objects: 16% (1755/10965) +2022-10-27T05:36:17.4790041Z remote: Compressing objects: 17% (1865/10965) +2022-10-27T05:36:17.4934830Z remote: Compressing objects: 18% (1974/10965) +2022-10-27T05:36:17.5257200Z remote: Compressing objects: 19% (2084/10965) +2022-10-27T05:36:17.5516516Z remote: Compressing objects: 20% (2193/10965) +2022-10-27T05:36:17.5561317Z remote: Compressing objects: 21% (2303/10965) +2022-10-27T05:36:17.5795622Z remote: Compressing objects: 22% (2413/10965) +2022-10-27T05:36:17.6401406Z remote: Compressing objects: 23% (2522/10965) +2022-10-27T05:36:17.6654061Z remote: Compressing objects: 24% (2632/10965) +2022-10-27T05:36:17.6828486Z remote: Compressing objects: 25% (2742/10965) +2022-10-27T05:36:17.7044480Z remote: Compressing objects: 26% (2851/10965) +2022-10-27T05:36:17.7222440Z remote: Compressing objects: 27% (2961/10965) +2022-10-27T05:36:17.7713784Z remote: Compressing objects: 28% (3071/10965) +2022-10-27T05:36:17.7980639Z remote: Compressing objects: 29% (3180/10965) +2022-10-27T05:36:17.8260312Z remote: Compressing objects: 30% (3290/10965) +2022-10-27T05:36:17.8653550Z remote: Compressing objects: 31% (3400/10965) +2022-10-27T05:36:17.8786759Z remote: Compressing objects: 32% (3509/10965) +2022-10-27T05:36:17.9127781Z remote: Compressing objects: 33% (3619/10965) +2022-10-27T05:36:17.9521720Z remote: Compressing objects: 34% (3729/10965) +2022-10-27T05:36:17.9910080Z remote: Compressing objects: 35% (3838/10965) +2022-10-27T05:36:18.0204335Z remote: Compressing objects: 36% (3948/10965) +2022-10-27T05:36:18.0597196Z remote: Compressing objects: 37% (4058/10965) +2022-10-27T05:36:18.0964696Z remote: Compressing objects: 38% (4167/10965) +2022-10-27T05:36:18.1358555Z remote: Compressing objects: 39% (4277/10965) +2022-10-27T05:36:18.1549596Z remote: Compressing objects: 40% (4386/10965) +2022-10-27T05:36:18.1861724Z remote: Compressing objects: 41% (4496/10965) +2022-10-27T05:36:18.2100005Z remote: Compressing objects: 42% (4606/10965) +2022-10-27T05:36:18.2479949Z remote: Compressing objects: 43% (4715/10965) +2022-10-27T05:36:18.2787209Z remote: Compressing objects: 44% (4825/10965) +2022-10-27T05:36:18.3002217Z remote: Compressing objects: 45% (4935/10965) +2022-10-27T05:36:18.3304059Z remote: Compressing objects: 46% (5044/10965) +2022-10-27T05:36:18.3627827Z remote: Compressing objects: 47% (5154/10965) +2022-10-27T05:36:18.3769101Z remote: Compressing objects: 48% (5264/10965) +2022-10-27T05:36:18.3833369Z remote: Compressing objects: 49% (5373/10965) +2022-10-27T05:36:18.4021233Z remote: Compressing objects: 49% (5403/10965) +2022-10-27T05:36:18.4232973Z remote: Compressing objects: 50% (5483/10965) +2022-10-27T05:36:18.4496802Z remote: Compressing objects: 51% (5593/10965) +2022-10-27T05:36:18.4760000Z remote: Compressing objects: 52% (5702/10965) +2022-10-27T05:36:18.5061635Z remote: Compressing objects: 53% (5812/10965) +2022-10-27T05:36:18.5273446Z remote: Compressing objects: 54% (5922/10965) +2022-10-27T05:36:18.5546118Z remote: Compressing objects: 55% (6031/10965) +2022-10-27T05:36:18.5809381Z remote: Compressing objects: 56% (6141/10965) +2022-10-27T05:36:18.6147456Z remote: Compressing objects: 57% (6251/10965) +2022-10-27T05:36:18.6311320Z remote: Compressing objects: 58% (6360/10965) +2022-10-27T05:36:18.6614446Z remote: Compressing objects: 59% (6470/10965) +2022-10-27T05:36:18.6930160Z remote: Compressing objects: 60% (6579/10965) +2022-10-27T05:36:18.7250175Z remote: Compressing objects: 61% (6689/10965) +2022-10-27T05:36:18.7426580Z remote: Compressing objects: 62% (6799/10965) +2022-10-27T05:36:18.7654931Z remote: Compressing objects: 63% (6908/10965) +2022-10-27T05:36:18.8010761Z remote: Compressing objects: 64% (7018/10965) +2022-10-27T05:36:18.8152846Z remote: Compressing objects: 65% (7128/10965) +2022-10-27T05:36:18.8473982Z remote: Compressing objects: 66% (7237/10965) +2022-10-27T05:36:18.8539428Z remote: Compressing objects: 67% (7347/10965) +2022-10-27T05:36:18.8540163Z remote: Compressing objects: 68% (7457/10965) +2022-10-27T05:36:18.8621595Z remote: Compressing objects: 69% (7566/10965) +2022-10-27T05:36:18.8622122Z remote: Compressing objects: 70% (7676/10965) +2022-10-27T05:36:18.8625855Z remote: Compressing objects: 71% (7786/10965) +2022-10-27T05:36:18.8626847Z remote: Compressing objects: 72% (7895/10965) +2022-10-27T05:36:18.8627930Z remote: Compressing objects: 73% (8005/10965) +2022-10-27T05:36:18.8629224Z remote: Compressing objects: 74% (8115/10965) +2022-10-27T05:36:18.8630011Z remote: Compressing objects: 75% (8224/10965) +2022-10-27T05:36:18.8630611Z remote: Compressing objects: 76% (8334/10965) +2022-10-27T05:36:18.8658429Z remote: Compressing objects: 77% (8444/10965) +2022-10-27T05:36:18.8659128Z remote: Compressing objects: 78% (8553/10965) +2022-10-27T05:36:18.8659555Z remote: Compressing objects: 79% (8663/10965) +2022-10-27T05:36:18.8688825Z remote: Compressing objects: 80% (8772/10965) +2022-10-27T05:36:18.8779984Z remote: Compressing objects: 81% (8882/10965) +2022-10-27T05:36:18.8780591Z remote: Compressing objects: 82% (8992/10965) +2022-10-27T05:36:18.8839685Z remote: Compressing objects: 83% (9101/10965) +2022-10-27T05:36:18.8906377Z remote: Compressing objects: 84% (9211/10965) +2022-10-27T05:36:18.8909267Z remote: Compressing objects: 85% (9321/10965) +2022-10-27T05:36:18.8909956Z remote: Compressing objects: 86% (9430/10965) +2022-10-27T05:36:18.8910536Z remote: Compressing objects: 87% (9540/10965) +2022-10-27T05:36:18.8911145Z remote: Compressing objects: 88% (9650/10965) +2022-10-27T05:36:18.8911776Z remote: Compressing objects: 89% (9759/10965) +2022-10-27T05:36:18.8951128Z remote: Compressing objects: 90% (9869/10965) +2022-10-27T05:36:18.9127733Z remote: Compressing objects: 91% (9979/10965) +2022-10-27T05:36:18.9128171Z remote: Compressing objects: 92% (10088/10965) +2022-10-27T05:36:18.9128609Z remote: Compressing objects: 93% (10198/10965) +2022-10-27T05:36:18.9133927Z remote: Compressing objects: 94% (10308/10965) +2022-10-27T05:36:18.9152257Z remote: Compressing objects: 95% (10417/10965) +2022-10-27T05:36:18.9166692Z remote: Compressing objects: 96% (10527/10965) +2022-10-27T05:36:18.9178013Z remote: Compressing objects: 97% (10637/10965) +2022-10-27T05:36:18.9188202Z remote: Compressing objects: 98% (10746/10965) +2022-10-27T05:36:18.9202595Z remote: Compressing objects: 99% (10856/10965) +2022-10-27T05:36:18.9203422Z remote: Compressing objects: 100% (10965/10965) +2022-10-27T05:36:18.9204293Z remote: Compressing objects: 100% (10965/10965), done. 2022-10-27T05:36:18.9643118Z Receiving objects: 0% (1/12549) 2022-10-27T05:36:19.5343020Z Receiving objects: 1% (126/12549) 2022-10-27T05:36:19.5547619Z Receiving objects: 2% (251/12549), 1.75 MiB | 3.48 MiB/s @@ -501,7 +501,7 @@ 2022-10-27T05:36:23.5654171Z Receiving objects: 97% (12173/12549), 126.98 MiB | 28.99 MiB/s 2022-10-27T05:36:23.5827062Z Receiving objects: 98% (12299/12549), 126.98 MiB | 28.99 MiB/s 2022-10-27T05:36:23.5872285Z Receiving objects: 99% (12424/12549), 126.98 MiB | 28.99 MiB/s -2022-10-27T05:36:23.5873322Z remote: Total 12549 (delta 1601), reused 7183 (delta 1450), pack-reused 0 +2022-10-27T05:36:23.5873322Z remote: Total 12549 (delta 1601), reused 7183 (delta 1450), pack-reused 0 2022-10-27T05:36:23.5902379Z Receiving objects: 100% (12549/12549), 126.98 MiB | 28.99 MiB/s 2022-10-27T05:36:23.5903011Z Receiving objects: 100% (12549/12549), 139.13 MiB | 29.83 MiB/s, done. 2022-10-27T05:36:23.5950353Z Resolving deltas: 0% (0/1601) @@ -653,22 +653,22 @@ 2022-10-27T05:36:25.7674090Z Updating files: 100% (11578/11578) 2022-10-27T05:36:25.7675326Z Updating files: 100% (11578/11578), done. 2022-10-27T05:36:25.7839712Z Note: switching to 'refs/remotes/pull/70831/merge'. -2022-10-27T05:36:25.7840374Z +2022-10-27T05:36:25.7840374Z 2022-10-27T05:36:25.7841364Z You are in 'detached HEAD' state. You can look around, make experimental 2022-10-27T05:36:25.7842184Z changes and commit them, and you can discard any commits you make in this 2022-10-27T05:36:25.7842925Z state without impacting any branches by switching back to a branch. -2022-10-27T05:36:25.7843345Z +2022-10-27T05:36:25.7843345Z 2022-10-27T05:36:25.7843670Z If you want to create a new branch to retain commits you create, you may 2022-10-27T05:36:25.7844575Z do so (now or later) by using -c with the switch command. Example: -2022-10-27T05:36:25.7844969Z +2022-10-27T05:36:25.7844969Z 2022-10-27T05:36:25.7845632Z git switch -c -2022-10-27T05:36:25.7845974Z +2022-10-27T05:36:25.7845974Z 2022-10-27T05:36:25.7846184Z Or undo this operation with: -2022-10-27T05:36:25.7846473Z +2022-10-27T05:36:25.7846473Z 2022-10-27T05:36:25.7846644Z git switch - -2022-10-27T05:36:25.7846900Z +2022-10-27T05:36:25.7846900Z 2022-10-27T05:36:25.7847288Z Turn off this advice by setting config variable advice.detachedHead to false -2022-10-27T05:36:25.7847742Z +2022-10-27T05:36:25.7847742Z 2022-10-27T05:36:25.7848217Z HEAD is now at deb5c38 Merge 9618404f9ee7f23400ea062d5dacb13fda53ca75 into 8bb8ca9d67375d0bd58ceacbc6346f9e92fef872 2022-10-27T05:36:25.7902871Z ##[endgroup] 2022-10-27T05:36:25.7967741Z [command]/usr/bin/git log -1 --format='%H' @@ -702,9 +702,9 @@ 2022-10-27T05:36:28.8183412Z bash tools/ci/install_rust_g.sh 2022-10-27T05:36:28.8240260Z shell: /usr/bin/bash -e {0} 2022-10-27T05:36:28.8240552Z ##[endgroup] -2022-10-27T05:36:28.9970393Z +2022-10-27T05:36:28.9970393Z 2022-10-27T05:36:28.9971552Z WARNING: apt does not have a stable CLI interface. Use with caution in scripts. -2022-10-27T05:36:28.9972082Z +2022-10-27T05:36:28.9972082Z 2022-10-27T05:36:29.1160704Z Hit:1 http://azure.archive.ubuntu.com/ubuntu focal InRelease 2022-10-27T05:36:29.1162032Z Get:2 http://azure.archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB] 2022-10-27T05:36:29.1173928Z Get:3 http://azure.archive.ubuntu.com/ubuntu focal-backports InRelease [108 kB] @@ -752,9 +752,9 @@ 2022-10-27T05:36:41.8619438Z Building dependency tree... 2022-10-27T05:36:41.8635085Z Reading state information... 2022-10-27T05:36:41.9709754Z 40 packages can be upgraded. Run 'apt list --upgradable' to see them. -2022-10-27T05:36:41.9833939Z +2022-10-27T05:36:41.9833939Z 2022-10-27T05:36:41.9834743Z WARNING: apt does not have a stable CLI interface. Use with caution in scripts. -2022-10-27T05:36:41.9835161Z +2022-10-27T05:36:41.9835161Z 2022-10-27T05:36:42.0520184Z Reading package lists... 2022-10-27T05:36:42.3196647Z Building dependency tree... 2022-10-27T05:36:42.3215128Z Reading state information... @@ -782,7 +782,7 @@ 2022-10-27T05:36:43.9483382Z Preconfiguring packages ... 2022-10-27T05:36:44.0566590Z Fetched 4528 kB in 1s (5511 kB/s) 2022-10-27T05:36:44.0950557Z Selecting previously unselected package gcc-11-base:i386. -2022-10-27T05:36:44.1257600Z (Reading database ... +2022-10-27T05:36:44.1257600Z (Reading database ... 2022-10-27T05:36:44.1257941Z (Reading database ... 5% 2022-10-27T05:36:44.1258207Z (Reading database ... 10% 2022-10-27T05:36:44.1258475Z (Reading database ... 15% @@ -869,98 +869,98 @@ 2022-10-27T05:36:49.4001691Z Setting up BYOND. 2022-10-27T05:36:49.4159362Z % Total % Received % Xferd Average Speed Time Time Time Current 2022-10-27T05:36:49.4160632Z Dload Upload Total Spent Left Speed -2022-10-27T05:36:49.4160890Z +2022-10-27T05:36:49.4160890Z 2022-10-27T05:36:49.5018021Z 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 2022-10-27T05:36:49.5019163Z 100 4021k 100 4021k 0 0 46.1M 0 --:--:-- --:--:-- --:--:-- 46.1M 2022-10-27T05:36:49.5066653Z Archive: byond.zip 2022-10-27T05:36:49.5067255Z creating: byond/ 2022-10-27T05:36:49.5068302Z creating: byond/key/ 2022-10-27T05:36:49.5068798Z creating: byond/web/ -2022-10-27T05:36:49.5070185Z inflating: byond/web/child.dms -2022-10-27T05:36:49.5071730Z inflating: byond/web/button.dms -2022-10-27T05:36:49.5073932Z inflating: byond/web/input.dms -2022-10-27T05:36:49.5074416Z inflating: byond/web/text.dms -2022-10-27T05:36:49.5198750Z inflating: byond/web/webclient.dart.js -2022-10-27T05:36:49.5199410Z inflating: byond/web/verbmenu.dms -2022-10-27T05:36:49.5200216Z inflating: byond/web/defaultSkin.dms -2022-10-27T05:36:49.5201953Z inflating: byond/web/hotbar.dms -2022-10-27T05:36:49.5203581Z inflating: byond/web/label.dms -2022-10-27T05:36:49.5204889Z inflating: byond/web/alert.dms -2022-10-27T05:36:49.5206329Z inflating: byond/web/message.dms -2022-10-27T05:36:49.5207259Z inflating: byond/web/drag.png -2022-10-27T05:36:49.5208742Z inflating: byond/web/map.dms -2022-10-27T05:36:49.5210398Z inflating: byond/web/splashlogo.png -2022-10-27T05:36:49.5210926Z inflating: byond/web/drop.png -2022-10-27T05:36:49.5332544Z inflating: byond/web/ext.js -2022-10-27T05:36:49.5333175Z inflating: byond/web/file.dms -2022-10-27T05:36:49.5334369Z inflating: byond/web/grid.dms -2022-10-27T05:36:49.5336323Z inflating: byond/web/bar.dms -2022-10-27T05:36:49.5339986Z inflating: byond/web/dpad.dms -2022-10-27T05:36:49.5341094Z inflating: byond/web/output.dms -2022-10-27T05:36:49.5343046Z inflating: byond/web/tab.dms -2022-10-27T05:36:49.5345100Z inflating: byond/web/info.dms -2022-10-27T05:36:49.5346744Z inflating: byond/web/color.dms -2022-10-27T05:36:49.5347953Z inflating: byond/web/gamepad.dms -2022-10-27T05:36:49.5349805Z inflating: byond/web/browser.dms -2022-10-27T05:36:49.5350264Z inflating: byond/web/status.dms -2022-10-27T05:36:49.5351241Z inflating: byond/web/any.dms -2022-10-27T05:36:49.5352302Z inflating: byond/web/pane.dms -2022-10-27T05:36:49.5354423Z inflating: byond/web/pop.dms -2022-10-27T05:36:49.5355613Z inflating: byond/license.txt -2022-10-27T05:36:49.5357084Z inflating: byond/legal.txt -2022-10-27T05:36:49.5358519Z inflating: byond/Makefile +2022-10-27T05:36:49.5070185Z inflating: byond/web/child.dms +2022-10-27T05:36:49.5071730Z inflating: byond/web/button.dms +2022-10-27T05:36:49.5073932Z inflating: byond/web/input.dms +2022-10-27T05:36:49.5074416Z inflating: byond/web/text.dms +2022-10-27T05:36:49.5198750Z inflating: byond/web/webclient.dart.js +2022-10-27T05:36:49.5199410Z inflating: byond/web/verbmenu.dms +2022-10-27T05:36:49.5200216Z inflating: byond/web/defaultSkin.dms +2022-10-27T05:36:49.5201953Z inflating: byond/web/hotbar.dms +2022-10-27T05:36:49.5203581Z inflating: byond/web/label.dms +2022-10-27T05:36:49.5204889Z inflating: byond/web/alert.dms +2022-10-27T05:36:49.5206329Z inflating: byond/web/message.dms +2022-10-27T05:36:49.5207259Z inflating: byond/web/drag.png +2022-10-27T05:36:49.5208742Z inflating: byond/web/map.dms +2022-10-27T05:36:49.5210398Z inflating: byond/web/splashlogo.png +2022-10-27T05:36:49.5210926Z inflating: byond/web/drop.png +2022-10-27T05:36:49.5332544Z inflating: byond/web/ext.js +2022-10-27T05:36:49.5333175Z inflating: byond/web/file.dms +2022-10-27T05:36:49.5334369Z inflating: byond/web/grid.dms +2022-10-27T05:36:49.5336323Z inflating: byond/web/bar.dms +2022-10-27T05:36:49.5339986Z inflating: byond/web/dpad.dms +2022-10-27T05:36:49.5341094Z inflating: byond/web/output.dms +2022-10-27T05:36:49.5343046Z inflating: byond/web/tab.dms +2022-10-27T05:36:49.5345100Z inflating: byond/web/info.dms +2022-10-27T05:36:49.5346744Z inflating: byond/web/color.dms +2022-10-27T05:36:49.5347953Z inflating: byond/web/gamepad.dms +2022-10-27T05:36:49.5349805Z inflating: byond/web/browser.dms +2022-10-27T05:36:49.5350264Z inflating: byond/web/status.dms +2022-10-27T05:36:49.5351241Z inflating: byond/web/any.dms +2022-10-27T05:36:49.5352302Z inflating: byond/web/pane.dms +2022-10-27T05:36:49.5354423Z inflating: byond/web/pop.dms +2022-10-27T05:36:49.5355613Z inflating: byond/license.txt +2022-10-27T05:36:49.5357084Z inflating: byond/legal.txt +2022-10-27T05:36:49.5358519Z inflating: byond/Makefile 2022-10-27T05:36:49.5358970Z creating: byond/man/ 2022-10-27T05:36:49.5359627Z creating: byond/man/man6/ -2022-10-27T05:36:49.5361148Z inflating: byond/man/man6/DreamDaemon.6 -2022-10-27T05:36:49.5361949Z inflating: byond/man/man6/DreamMaker.6 +2022-10-27T05:36:49.5361148Z inflating: byond/man/man6/DreamDaemon.6 +2022-10-27T05:36:49.5361949Z inflating: byond/man/man6/DreamMaker.6 2022-10-27T05:36:49.5362715Z creating: byond/lib/ 2022-10-27T05:36:49.5362992Z creating: byond/host/ -2022-10-27T05:36:49.5365318Z inflating: byond/host/readme.html -2022-10-27T05:36:49.5366506Z inflating: byond/host/readme-unix.txt +2022-10-27T05:36:49.5365318Z inflating: byond/host/readme.html +2022-10-27T05:36:49.5366506Z inflating: byond/host/readme-unix.txt 2022-10-27T05:36:49.5366902Z creating: byond/host/home/ 2022-10-27T05:36:49.5367533Z creating: byond/host/home/root/ 2022-10-27T05:36:49.5367822Z creating: byond/host/home/root/byond/ 2022-10-27T05:36:49.5368496Z creating: byond/host/home/root/byond/tools/ 2022-10-27T05:36:49.5369225Z creating: byond/host/home/root/byond/tools/root/ -2022-10-27T05:36:49.5374569Z inflating: byond/host/home/root/byond/tools/root/root.dmb +2022-10-27T05:36:49.5374569Z inflating: byond/host/home/root/byond/tools/root/root.dmb 2022-10-27T05:36:49.5375251Z creating: byond/host/shared/ 2022-10-27T05:36:49.5375559Z creating: byond/host/shared/byond/ 2022-10-27T05:36:49.5376268Z creating: byond/host/shared/byond/tools/ 2022-10-27T05:36:49.5376595Z creating: byond/host/shared/byond/tools/ftp/ -2022-10-27T05:36:49.5379616Z inflating: byond/host/shared/byond/tools/ftp/ftp.dmb +2022-10-27T05:36:49.5379616Z inflating: byond/host/shared/byond/tools/ftp/ftp.dmb 2022-10-27T05:36:49.5380174Z creating: byond/host/shared/byond/tools/admin/ -2022-10-27T05:36:49.5386313Z inflating: byond/host/shared/byond/tools/admin/admin.dmb +2022-10-27T05:36:49.5386313Z inflating: byond/host/shared/byond/tools/admin/admin.dmb 2022-10-27T05:36:49.5386945Z creating: byond/host/shared-web/ 2022-10-27T05:36:49.5387681Z creating: byond/host/shared-web/web/ 2022-10-27T05:36:49.5388584Z creating: byond/host/shared-web/web/tools/ 2022-10-27T05:36:49.5389008Z creating: byond/host/shared-web/web/tools/admin/ -2022-10-27T05:36:49.5394728Z inflating: byond/host/shared-web/web/tools/admin/index.dmb -2022-10-27T05:36:49.5403477Z inflating: byond/host/host.dmb -2022-10-27T05:36:49.5403779Z inflating: byond/host/host.start -2022-10-27T05:36:49.5405103Z inflating: byond/host/hostconf.orig -2022-10-27T05:36:49.5406328Z inflating: byond/host/hostconf.txt -2022-10-27T05:36:49.5407507Z inflating: byond/readme.txt +2022-10-27T05:36:49.5394728Z inflating: byond/host/shared-web/web/tools/admin/index.dmb +2022-10-27T05:36:49.5403477Z inflating: byond/host/host.dmb +2022-10-27T05:36:49.5403779Z inflating: byond/host/host.start +2022-10-27T05:36:49.5405103Z inflating: byond/host/hostconf.orig +2022-10-27T05:36:49.5406328Z inflating: byond/host/hostconf.txt +2022-10-27T05:36:49.5407507Z inflating: byond/readme.txt 2022-10-27T05:36:49.5407795Z creating: byond/bin/ -2022-10-27T05:36:49.5408558Z inflating: byond/bin/byondexec -2022-10-27T05:36:49.5411293Z inflating: byond/bin/DreamDownload -2022-10-27T05:36:49.6175092Z inflating: byond/bin/libbyond.so -2022-10-27T05:36:49.6348503Z inflating: byond/bin/libext.so -2022-10-27T05:36:49.6351968Z inflating: byond/bin/DreamDaemon -2022-10-27T05:36:49.6355363Z inflating: byond/bin/DreamMaker +2022-10-27T05:36:49.5408558Z inflating: byond/bin/byondexec +2022-10-27T05:36:49.5411293Z inflating: byond/bin/DreamDownload +2022-10-27T05:36:49.6175092Z inflating: byond/bin/libbyond.so +2022-10-27T05:36:49.6348503Z inflating: byond/bin/libext.so +2022-10-27T05:36:49.6351968Z inflating: byond/bin/DreamDaemon +2022-10-27T05:36:49.6355363Z inflating: byond/bin/DreamMaker 2022-10-27T05:36:49.6355666Z creating: byond/cfg/ -2022-10-27T05:36:49.6356545Z inflating: byond/cfg/release.txt +2022-10-27T05:36:49.6356545Z inflating: byond/cfg/release.txt 2022-10-27T05:36:49.6621069Z *************************** 2022-10-27T05:36:49.6621919Z Now run the following command: -2022-10-27T05:36:49.6629708Z +2022-10-27T05:36:49.6629708Z 2022-10-27T05:36:49.6640241Z source /home/runner/BYOND/byond/bin/byondsetup -2022-10-27T05:36:49.6652476Z +2022-10-27T05:36:49.6652476Z 2022-10-27T05:36:49.6657262Z If it generates errors, your shell is not compatible with 'sh', so you will 2022-10-27T05:36:49.6663166Z have to edit byondsetup and make it work with your shell. If the script works, you should be able to run DreamDaemon. -2022-10-27T05:36:49.6673259Z +2022-10-27T05:36:49.6673259Z 2022-10-27T05:36:49.6679431Z IMPORTANT: once you have the script working, you must add the above line 2022-10-27T05:36:49.6685348Z to your startup script. The name of your startup script depends on the 2022-10-27T05:36:49.6691552Z shell you use. Typical ones are .profile or .bash_profile. -2022-10-27T05:36:49.6701933Z +2022-10-27T05:36:49.6701933Z 2022-10-27T05:36:49.6708492Z Once everything is working, you can find out more about the software 2022-10-27T05:36:49.6714992Z by doing 'man DreamDaemon'. A host server has also been included 2022-10-27T05:36:49.6720470Z so edit host/hostconf.txt and boot up your world server! @@ -990,7 +990,7 @@ 2022-10-27T05:38:01.2726492Z Welcome BYOND! (5.0 Public Version 514.1588) 2022-10-27T05:38:23.7107759Z 864 global variables 2022-10-27T05:38:24.4933392Z World loaded at 05:38:24! -2022-10-27T05:38:24.5429202Z Running /tg/ revision: +2022-10-27T05:38:24.5429202Z Running /tg/ revision: 2022-10-27T05:38:24.5429682Z No commit information 2022-10-27T05:38:24.5512784Z Loading config file config.txt... 2022-10-27T05:38:24.5516700Z Loading config file maps.txt... @@ -1070,252 +1070,252 @@ 2022-10-27T05:39:58.4912316Z Initializations complete within 92.9 seconds! 2022-10-27T05:39:58.4984843Z Game start took 0s 2022-10-27T05:40:09.8744558Z ##[group]/datum/unit_test/log_mapping -2022-10-27T05:40:09.8745146Z +2022-10-27T05:40:09.8745146Z 2022-10-27T05:40:09.8836529Z PASS /datum/unit_test/log_mapping 0s 2022-10-27T05:40:09.8837396Z ##[endgroup] 2022-10-27T05:40:09.9419200Z ##[group]/datum/unit_test/ablative_hood_hud -2022-10-27T05:40:09.9756122Z +2022-10-27T05:40:09.9756122Z 2022-10-27T05:40:09.9757240Z PASS /datum/unit_test/ablative_hood_hud 0s 2022-10-27T05:40:09.9767210Z ##[endgroup] 2022-10-27T05:40:09.9978386Z ##[group]/datum/unit_test/ablative_hood_hud_with_helmet -2022-10-27T05:40:10.0279756Z +2022-10-27T05:40:10.0279756Z 2022-10-27T05:40:10.0281576Z PASS /datum/unit_test/ablative_hood_hud_with_helmet 0.1s 2022-10-27T05:40:10.0283498Z ##[endgroup] 2022-10-27T05:40:10.0512431Z ##[group]/datum/unit_test/achievements -2022-10-27T05:40:10.0640195Z +2022-10-27T05:40:10.0640195Z 2022-10-27T05:40:10.0641287Z PASS /datum/unit_test/achievements 0s 2022-10-27T05:40:10.0642374Z ##[endgroup] 2022-10-27T05:40:10.1012868Z ##[group]/datum/unit_test/anchored_mobs -2022-10-27T05:40:10.1014527Z +2022-10-27T05:40:10.1014527Z 2022-10-27T05:40:10.1015639Z PASS /datum/unit_test/anchored_mobs 0s 2022-10-27T05:40:10.1016975Z ##[endgroup] 2022-10-27T05:40:10.1197243Z ##[group]/datum/unit_test/anonymous_themes -2022-10-27T05:40:10.2699684Z +2022-10-27T05:40:10.2699684Z 2022-10-27T05:40:10.2701913Z PASS /datum/unit_test/anonymous_themes 0.1s 2022-10-27T05:40:10.2703812Z ##[endgroup] 2022-10-27T05:40:10.5198272Z ##[group]/datum/unit_test/autowiki -2022-10-27T05:40:11.9708692Z +2022-10-27T05:40:11.9708692Z 2022-10-27T05:40:11.9710297Z PASS /datum/unit_test/autowiki 1.4s 2022-10-27T05:40:11.9712149Z ##[endgroup] 2022-10-27T05:40:13.4185291Z ##[group]/datum/unit_test/autowiki_include_template -2022-10-27T05:40:13.4186047Z +2022-10-27T05:40:13.4186047Z 2022-10-27T05:40:13.4187111Z PASS /datum/unit_test/autowiki_include_template 0s 2022-10-27T05:40:13.4188008Z ##[endgroup] 2022-10-27T05:40:13.4380400Z ##[group]/datum/unit_test/barsigns_icon -2022-10-27T05:40:13.4634689Z +2022-10-27T05:40:13.4634689Z 2022-10-27T05:40:13.4639775Z PASS /datum/unit_test/barsigns_icon 0s 2022-10-27T05:40:13.4640487Z ##[endgroup] 2022-10-27T05:40:13.4808870Z ##[group]/datum/unit_test/barsigns_name -2022-10-27T05:40:13.4809440Z +2022-10-27T05:40:13.4809440Z 2022-10-27T05:40:13.4810053Z PASS /datum/unit_test/barsigns_name 0s 2022-10-27T05:40:13.4814000Z ##[endgroup] 2022-10-27T05:40:13.4979736Z ##[group]/datum/unit_test/bespoke_id -2022-10-27T05:40:13.4980383Z +2022-10-27T05:40:13.4980383Z 2022-10-27T05:40:13.4980997Z PASS /datum/unit_test/bespoke_id 0s 2022-10-27T05:40:13.5028459Z ##[endgroup] 2022-10-27T05:40:13.8488485Z ##[group]/datum/unit_test/binary_insert -2022-10-27T05:40:13.8488743Z +2022-10-27T05:40:13.8488743Z 2022-10-27T05:40:13.8489222Z PASS /datum/unit_test/binary_insert 0s 2022-10-27T05:40:13.8489803Z ##[endgroup] 2022-10-27T05:40:13.8653347Z ##[group]/datum/unit_test/bloody_footprints -2022-10-27T05:40:13.9003909Z +2022-10-27T05:40:13.9003909Z 2022-10-27T05:40:13.9004930Z PASS /datum/unit_test/bloody_footprints 0s 2022-10-27T05:40:13.9006088Z ##[endgroup] 2022-10-27T05:40:13.9232999Z ##[group]/datum/unit_test/breath_sanity -2022-10-27T05:40:13.9712567Z +2022-10-27T05:40:13.9712567Z 2022-10-27T05:40:13.9713383Z PASS /datum/unit_test/breath_sanity 0s 2022-10-27T05:40:13.9714142Z ##[endgroup] 2022-10-27T05:40:14.2982711Z ##[group]/datum/unit_test/breath_sanity_plasmamen -2022-10-27T05:40:14.3520354Z +2022-10-27T05:40:14.3520354Z 2022-10-27T05:40:14.3521354Z PASS /datum/unit_test/breath_sanity_plasmamen 0.1s 2022-10-27T05:40:14.3522294Z ##[endgroup] 2022-10-27T05:40:14.3742846Z ##[group]/datum/unit_test/breath_sanity_ashwalker -2022-10-27T05:40:14.4444122Z +2022-10-27T05:40:14.4444122Z 2022-10-27T05:40:14.4444950Z PASS /datum/unit_test/breath_sanity_ashwalker 0.1s 2022-10-27T05:40:14.4445682Z ##[endgroup] 2022-10-27T05:40:14.7716503Z ##[group]/datum/unit_test/cable_powernets -2022-10-27T05:40:14.7716741Z +2022-10-27T05:40:14.7716741Z 2022-10-27T05:40:14.7717211Z PASS /datum/unit_test/cable_powernets 0s 2022-10-27T05:40:14.7718214Z ##[endgroup] 2022-10-27T05:40:14.7883699Z ##[group]/datum/unit_test/card_mismatch -2022-10-27T05:40:14.7925710Z +2022-10-27T05:40:14.7925710Z 2022-10-27T05:40:14.7926265Z PASS /datum/unit_test/card_mismatch 0s 2022-10-27T05:40:14.7926794Z ##[endgroup] 2022-10-27T05:40:14.8965612Z ##[group]/datum/unit_test/chain_pull_through_space -2022-10-27T05:40:14.8993553Z +2022-10-27T05:40:14.8993553Z 2022-10-27T05:40:14.8994184Z PASS /datum/unit_test/chain_pull_through_space 0s 2022-10-27T05:40:14.8994797Z ##[endgroup] 2022-10-27T05:40:15.0324540Z ##[group]/datum/unit_test/chat_filter_sanity -2022-10-27T05:40:15.0326737Z +2022-10-27T05:40:15.0326737Z 2022-10-27T05:40:15.0327622Z PASS /datum/unit_test/chat_filter_sanity 0s 2022-10-27T05:40:15.0328606Z ##[endgroup] 2022-10-27T05:40:15.0495255Z ##[group]/datum/unit_test/circuit_component_category -2022-10-27T05:40:15.0495800Z +2022-10-27T05:40:15.0495800Z 2022-10-27T05:40:15.0496375Z PASS /datum/unit_test/circuit_component_category 0s 2022-10-27T05:40:15.0497189Z ##[endgroup] 2022-10-27T05:40:15.0662040Z ##[group]/datum/unit_test/closets -2022-10-27T05:40:16.7548466Z +2022-10-27T05:40:16.7548466Z 2022-10-27T05:40:16.7550247Z PASS /datum/unit_test/closets 1.7s 2022-10-27T05:40:16.7551113Z ##[endgroup] 2022-10-27T05:40:19.6808172Z ##[group]/datum/unit_test/harm_punch -2022-10-27T05:40:19.7377314Z +2022-10-27T05:40:19.7377314Z 2022-10-27T05:40:19.7378123Z PASS /datum/unit_test/harm_punch 0.1s 2022-10-27T05:40:19.7379056Z ##[endgroup] 2022-10-27T05:40:19.7662222Z ##[group]/datum/unit_test/harm_melee -2022-10-27T05:40:19.8341843Z +2022-10-27T05:40:19.8341843Z 2022-10-27T05:40:19.8342972Z PASS /datum/unit_test/harm_melee 0.1s 2022-10-27T05:40:19.8343692Z ##[endgroup] 2022-10-27T05:40:19.9635264Z ##[group]/datum/unit_test/harm_different_damage -2022-10-27T05:40:20.0266779Z +2022-10-27T05:40:20.0266779Z 2022-10-27T05:40:20.0267726Z PASS /datum/unit_test/harm_different_damage 0.1s 2022-10-27T05:40:20.0268642Z ##[endgroup] 2022-10-27T05:40:20.0557189Z ##[group]/datum/unit_test/attack_chain -2022-10-27T05:40:20.1137150Z +2022-10-27T05:40:20.1137150Z 2022-10-27T05:40:20.1138187Z PASS /datum/unit_test/attack_chain 0.1s 2022-10-27T05:40:20.1139596Z ##[endgroup] 2022-10-27T05:40:20.5189211Z ##[group]/datum/unit_test/disarm -2022-10-27T05:40:20.5901636Z +2022-10-27T05:40:20.5901636Z 2022-10-27T05:40:20.5902409Z PASS /datum/unit_test/disarm 0s 2022-10-27T05:40:20.5903484Z ##[endgroup] 2022-10-27T05:40:20.6186577Z ##[group]/datum/unit_test/component_duping -2022-10-27T05:40:20.6186976Z +2022-10-27T05:40:20.6186976Z 2022-10-27T05:40:20.6187696Z PASS /datum/unit_test/component_duping 0s 2022-10-27T05:40:20.6188587Z ##[endgroup] 2022-10-27T05:40:20.6351095Z ##[group]/datum/unit_test/confusion_symptom -2022-10-27T05:40:20.6638729Z +2022-10-27T05:40:20.6638729Z 2022-10-27T05:40:20.6639511Z PASS /datum/unit_test/confusion_symptom 0s 2022-10-27T05:40:20.6640205Z ##[endgroup] 2022-10-27T05:40:20.9863951Z ##[group]/datum/unit_test/connect_loc_basic -2022-10-27T05:40:20.9868536Z +2022-10-27T05:40:20.9868536Z 2022-10-27T05:40:20.9869090Z PASS /datum/unit_test/connect_loc_basic 0s 2022-10-27T05:40:20.9869728Z ##[endgroup] 2022-10-27T05:40:21.0030927Z ##[group]/datum/unit_test/connect_loc_change_turf -2022-10-27T05:40:21.0038393Z +2022-10-27T05:40:21.0038393Z 2022-10-27T05:40:21.0038866Z PASS /datum/unit_test/connect_loc_change_turf 0s 2022-10-27T05:40:21.0039436Z ##[endgroup] 2022-10-27T05:40:21.0207944Z ##[group]/datum/unit_test/connect_loc_multiple_on_turf -2022-10-27T05:40:21.0212290Z +2022-10-27T05:40:21.0212290Z 2022-10-27T05:40:21.0212902Z PASS /datum/unit_test/connect_loc_multiple_on_turf 0s 2022-10-27T05:40:21.0213675Z ##[endgroup] 2022-10-27T05:40:21.0384862Z ##[group]/datum/unit_test/crayon_naming -2022-10-27T05:40:21.0442694Z +2022-10-27T05:40:21.0442694Z 2022-10-27T05:40:21.0443459Z PASS /datum/unit_test/crayon_naming 0s 2022-10-27T05:40:21.0444098Z ##[endgroup] 2022-10-27T05:40:21.0612637Z ##[group]/datum/unit_test/dcs_get_id_from_arguments -2022-10-27T05:40:21.0613739Z +2022-10-27T05:40:21.0613739Z 2022-10-27T05:40:21.0614288Z PASS /datum/unit_test/dcs_get_id_from_arguments 0s 2022-10-27T05:40:21.0615542Z ##[endgroup] 2022-10-27T05:40:21.3899788Z ##[group]/datum/unit_test/designs -2022-10-27T05:40:21.3953573Z +2022-10-27T05:40:21.3953573Z 2022-10-27T05:40:21.3954536Z PASS /datum/unit_test/designs 0s 2022-10-27T05:40:21.3955578Z ##[endgroup] 2022-10-27T05:40:21.4124000Z ##[group]/datum/unit_test/dummy_spawn_species -2022-10-27T05:40:21.8463274Z +2022-10-27T05:40:21.8463274Z 2022-10-27T05:40:21.8464399Z PASS /datum/unit_test/dummy_spawn_species 0.4s 2022-10-27T05:40:21.8465523Z ##[endgroup] 2022-10-27T05:40:22.2717242Z ##[group]/datum/unit_test/dummy_spawn_outfit 2022-10-27T05:40:22.2939848Z Job type /datum/job/ai could not be retrieved from SSjob -2022-10-27T05:40:22.6546726Z +2022-10-27T05:40:22.6546726Z 2022-10-27T05:40:22.6548196Z PASS /datum/unit_test/dummy_spawn_outfit 0.4s 2022-10-27T05:40:22.6549521Z ##[endgroup] 2022-10-27T05:40:23.0435828Z ##[group]/datum/unit_test/dynamic_roundstart_ruleset_sanity -2022-10-27T05:40:23.0436113Z +2022-10-27T05:40:23.0436113Z 2022-10-27T05:40:23.0436663Z PASS /datum/unit_test/dynamic_roundstart_ruleset_sanity 0s 2022-10-27T05:40:23.0437218Z ##[endgroup] 2022-10-27T05:40:23.0606191Z ##[group]/datum/unit_test/dynamic_unique_antag_flags -2022-10-27T05:40:23.0606463Z +2022-10-27T05:40:23.0606463Z 2022-10-27T05:40:23.0606957Z PASS /datum/unit_test/dynamic_unique_antag_flags 0s 2022-10-27T05:40:23.0607492Z ##[endgroup] 2022-10-27T05:40:23.0772590Z ##[group]/datum/unit_test/egg_glands -2022-10-27T05:40:23.1272833Z +2022-10-27T05:40:23.1272833Z 2022-10-27T05:40:23.1273679Z PASS /datum/unit_test/egg_glands 0.1s 2022-10-27T05:40:23.1274499Z ##[endgroup] 2022-10-27T05:40:23.1948246Z ##[group]/datum/unit_test/emoting -2022-10-27T05:40:23.2276434Z +2022-10-27T05:40:23.2276434Z 2022-10-27T05:40:23.2277491Z PASS /datum/unit_test/emoting 0.1s 2022-10-27T05:40:23.2278590Z ##[endgroup] 2022-10-27T05:40:23.2495055Z ##[group]/datum/unit_test/food_edibility_check -2022-10-27T05:40:24.5133005Z +2022-10-27T05:40:24.5133005Z 2022-10-27T05:40:24.5133747Z PASS /datum/unit_test/food_edibility_check 1.3s 2022-10-27T05:40:24.5134589Z ##[endgroup] 2022-10-27T05:40:25.7459424Z ##[group]/datum/unit_test/atmospheric_gas_transfer -2022-10-27T05:40:25.7464252Z +2022-10-27T05:40:25.7464252Z 2022-10-27T05:40:25.7465453Z PASS /datum/unit_test/atmospheric_gas_transfer 0s 2022-10-27T05:40:25.7466947Z ##[endgroup] 2022-10-27T05:40:25.7637838Z ##[group]/datum/unit_test/get_turf_pixel -2022-10-27T05:40:25.7652899Z +2022-10-27T05:40:25.7652899Z 2022-10-27T05:40:25.7653755Z PASS /datum/unit_test/get_turf_pixel 0s 2022-10-27T05:40:25.7654716Z ##[endgroup] 2022-10-27T05:40:25.7832528Z ##[group]/datum/unit_test/greyscale_item_icon_states -2022-10-27T05:40:25.7897718Z +2022-10-27T05:40:25.7897718Z 2022-10-27T05:40:25.7898714Z PASS /datum/unit_test/greyscale_item_icon_states 0s 2022-10-27T05:40:25.7901777Z ##[endgroup] 2022-10-27T05:40:25.8065921Z ##[group]/datum/unit_test/greyscale_color_count -2022-10-27T05:40:25.8212040Z +2022-10-27T05:40:25.8212040Z 2022-10-27T05:40:25.8213076Z PASS /datum/unit_test/greyscale_color_count 0s 2022-10-27T05:40:25.8213890Z ##[endgroup] 2022-10-27T05:40:25.9569835Z ##[group]/datum/unit_test/hallucination_icons -2022-10-27T05:40:26.2007450Z +2022-10-27T05:40:26.2007450Z 2022-10-27T05:40:26.2008257Z PASS /datum/unit_test/hallucination_icons 0.3s 2022-10-27T05:40:26.2008960Z ##[endgroup] 2022-10-27T05:40:26.4177405Z ##[group]/datum/unit_test/heretic_knowledge -2022-10-27T05:40:26.4221118Z +2022-10-27T05:40:26.4221118Z 2022-10-27T05:40:26.4222209Z PASS /datum/unit_test/heretic_knowledge 0s 2022-10-27T05:40:26.4225335Z ##[endgroup] 2022-10-27T05:40:26.4398954Z ##[group]/datum/unit_test/heretic_main_paths -2022-10-27T05:40:26.4399640Z +2022-10-27T05:40:26.4399640Z 2022-10-27T05:40:26.4402394Z PASS /datum/unit_test/heretic_main_paths 0s 2022-10-27T05:40:26.4403358Z ##[endgroup] 2022-10-27T05:40:26.4569635Z ##[group]/datum/unit_test/heretic_rituals -2022-10-27T05:40:26.5341269Z +2022-10-27T05:40:26.5341269Z 2022-10-27T05:40:26.5342957Z PASS /datum/unit_test/heretic_rituals 0.1s 2022-10-27T05:40:26.5344455Z ##[endgroup] 2022-10-27T05:40:26.6072760Z ##[group]/datum/unit_test/hanukkah_2123 -2022-10-27T05:40:26.6074182Z +2022-10-27T05:40:26.6074182Z 2022-10-27T05:40:26.6075388Z PASS /datum/unit_test/hanukkah_2123 0s 2022-10-27T05:40:26.6076994Z ##[endgroup] 2022-10-27T05:40:26.6266212Z ##[group]/datum/unit_test/ramadan_2165 -2022-10-27T05:40:26.6266979Z +2022-10-27T05:40:26.6266979Z 2022-10-27T05:40:26.6268854Z PASS /datum/unit_test/ramadan_2165 0s 2022-10-27T05:40:26.6275155Z ##[endgroup] 2022-10-27T05:40:26.6571207Z ##[group]/datum/unit_test/thanksgiving_2020 -2022-10-27T05:40:26.6572398Z +2022-10-27T05:40:26.6572398Z 2022-10-27T05:40:26.6573397Z PASS /datum/unit_test/thanksgiving_2020 0s 2022-10-27T05:40:26.6574531Z ##[endgroup] 2022-10-27T05:40:26.6735186Z ##[group]/datum/unit_test/mother_3683 -2022-10-27T05:40:26.6735666Z +2022-10-27T05:40:26.6735666Z 2022-10-27T05:40:26.6736248Z PASS /datum/unit_test/mother_3683 0s 2022-10-27T05:40:26.6739224Z ##[endgroup] 2022-10-27T05:40:26.8572827Z ##[group]/datum/unit_test/hello_2020 -2022-10-27T05:40:26.8573482Z +2022-10-27T05:40:26.8573482Z 2022-10-27T05:40:26.8574272Z PASS /datum/unit_test/hello_2020 0s 2022-10-27T05:40:26.8577076Z ##[endgroup] 2022-10-27T05:40:26.8749478Z ##[group]/datum/unit_test/new_year_1983 -2022-10-27T05:40:26.8750152Z +2022-10-27T05:40:26.8750152Z 2022-10-27T05:40:26.8750832Z PASS /datum/unit_test/new_year_1983 0s 2022-10-27T05:40:26.8751724Z ##[endgroup] 2022-10-27T05:40:26.8919557Z ##[group]/datum/unit_test/moth_week_2020 -2022-10-27T05:40:26.8951500Z +2022-10-27T05:40:26.8951500Z 2022-10-27T05:40:26.8952208Z PASS /datum/unit_test/moth_week_2020 0s 2022-10-27T05:40:26.8952956Z ##[endgroup] 2022-10-27T05:40:27.3122958Z ##[group]/datum/unit_test/human_through_recycler -2022-10-27T05:40:27.3539454Z +2022-10-27T05:40:27.3539454Z 2022-10-27T05:40:27.3544496Z PASS /datum/unit_test/human_through_recycler 0s 2022-10-27T05:40:27.3549227Z ##[endgroup] 2022-10-27T05:40:27.3779548Z ##[group]/datum/unit_test/hydroponics_extractor_storage -2022-10-27T05:40:27.4123276Z +2022-10-27T05:40:27.4123276Z 2022-10-27T05:40:27.4124500Z PASS /datum/unit_test/hydroponics_extractor_storage 0.1s 2022-10-27T05:40:27.4125704Z ##[endgroup] 2022-10-27T05:40:27.4385047Z ##[group]/datum/unit_test/hydroponics_harvest -2022-10-27T05:40:27.5046209Z +2022-10-27T05:40:27.5046209Z 2022-10-27T05:40:27.5047429Z PASS /datum/unit_test/hydroponics_harvest 0.1s 2022-10-27T05:40:27.5048344Z ##[endgroup] 2022-10-27T05:40:27.5784276Z ##[group]/datum/unit_test/hydroponics_self_mutation -2022-10-27T05:40:27.6261832Z +2022-10-27T05:40:27.6261832Z 2022-10-27T05:40:27.6263089Z PASS /datum/unit_test/hydroponics_self_mutation 0.1s 2022-10-27T05:40:27.6264003Z ##[endgroup] 2022-10-27T05:40:27.9431720Z ##[group]/datum/unit_test/hydroponics_validate_genes -2022-10-27T05:40:27.9933945Z +2022-10-27T05:40:27.9933945Z 2022-10-27T05:40:27.9935126Z PASS /datum/unit_test/hydroponics_validate_genes 0s 2022-10-27T05:40:27.9936883Z ##[endgroup] 2022-10-27T05:40:28.0105063Z ##[group]/datum/unit_test/defined_inhand_icon_states @@ -1436,200 +1436,200 @@ 2022-10-27T05:40:29.1051631Z /obj/item/bonesetter does not have an inhand_icon_state value - Possible matching sprites for "bonesetter" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi' 2022-10-27T05:40:29.1052751Z /obj/item/blood_filter does not have an inhand_icon_state value - Possible matching sprites for "bloodfilter" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi' 2022-10-27T05:40:29.1055555Z /obj/item/mecha_ammo/flashbang does not have an inhand_icon_state value - Possible matching sprites for "flashbang" found in: 'icons/mob/inhands/equipment/security_righthand.dmi' & 'icons/mob/inhands/equipment/security_lefthand.dmi' -2022-10-27T05:40:29.1056050Z +2022-10-27T05:40:29.1056050Z 2022-10-27T05:40:29.1056364Z PASS /datum/unit_test/defined_inhand_icon_states 1s 2022-10-27T05:40:29.1057048Z ##[endgroup] 2022-10-27T05:40:30.3200151Z ##[group]/datum/unit_test/keybinding_init -2022-10-27T05:40:30.3200418Z +2022-10-27T05:40:30.3200418Z 2022-10-27T05:40:30.3201050Z PASS /datum/unit_test/keybinding_init 0s 2022-10-27T05:40:30.3201648Z ##[endgroup] 2022-10-27T05:40:30.3369516Z ##[group]/datum/unit_test/knockoff_component -2022-10-27T05:40:30.3974289Z +2022-10-27T05:40:30.3974289Z 2022-10-27T05:40:30.3975134Z PASS /datum/unit_test/knockoff_component 0s 2022-10-27T05:40:30.3975848Z ##[endgroup] 2022-10-27T05:40:30.4758006Z ##[group]/datum/unit_test/limbsanity -2022-10-27T05:40:30.5511170Z +2022-10-27T05:40:30.5511170Z 2022-10-27T05:40:30.5512056Z PASS /datum/unit_test/limbsanity 0.1s 2022-10-27T05:40:30.5513064Z ##[endgroup] 2022-10-27T05:40:30.5683011Z ##[group]/datum/unit_test/load_map_security 2022-10-27T05:40:30.5686279Z map directory not in whitelist: data/load_map_security_temp for map runtimestation -2022-10-27T05:40:30.5686559Z +2022-10-27T05:40:30.5686559Z 2022-10-27T05:40:30.5687309Z PASS /datum/unit_test/load_map_security 0s 2022-10-27T05:40:30.5688206Z ##[endgroup] 2022-10-27T05:40:30.5865089Z ##[group]/datum/unit_test/machine_disassembly -2022-10-27T05:40:30.5895192Z +2022-10-27T05:40:30.5895192Z 2022-10-27T05:40:30.5895755Z PASS /datum/unit_test/machine_disassembly 0s 2022-10-27T05:40:30.5896331Z ##[endgroup] 2022-10-27T05:40:30.6183397Z ##[group]/datum/unit_test/mecha_damage -2022-10-27T05:40:30.6691654Z +2022-10-27T05:40:30.6691654Z 2022-10-27T05:40:30.6692724Z PASS /datum/unit_test/mecha_damage 0s 2022-10-27T05:40:30.6693811Z ##[endgroup] 2022-10-27T05:40:30.7005279Z ##[group]/datum/unit_test/test_human_base -2022-10-27T05:40:30.7905422Z +2022-10-27T05:40:30.7905422Z 2022-10-27T05:40:30.7906225Z PASS /datum/unit_test/test_human_base 0s 2022-10-27T05:40:30.7906953Z ##[endgroup] 2022-10-27T05:40:30.8626902Z ##[group]/datum/unit_test/test_human_bone -2022-10-27T05:40:30.9519120Z +2022-10-27T05:40:30.9519120Z 2022-10-27T05:40:30.9520211Z PASS /datum/unit_test/test_human_bone 0.1s 2022-10-27T05:40:30.9521496Z ##[endgroup] 2022-10-27T05:40:31.2736006Z ##[group]/datum/unit_test/merge_type -2022-10-27T05:40:31.2741500Z +2022-10-27T05:40:31.2741500Z 2022-10-27T05:40:31.2744034Z PASS /datum/unit_test/merge_type 0s 2022-10-27T05:40:31.2745007Z ##[endgroup] 2022-10-27T05:40:31.2940088Z ##[group]/datum/unit_test/metabolization -2022-10-27T05:40:31.5116749Z +2022-10-27T05:40:31.5116749Z 2022-10-27T05:40:31.5119088Z PASS /datum/unit_test/metabolization 0.3s 2022-10-27T05:40:31.5120552Z ##[endgroup] 2022-10-27T05:40:31.8707226Z ##[group]/datum/unit_test/on_mob_end_metabolize -2022-10-27T05:40:31.9025163Z +2022-10-27T05:40:31.9025163Z 2022-10-27T05:40:31.9025867Z PASS /datum/unit_test/on_mob_end_metabolize 0.1s 2022-10-27T05:40:31.9026521Z ##[endgroup] 2022-10-27T05:40:32.5850525Z ##[group]/datum/unit_test/addictions -2022-10-27T05:40:32.6747518Z +2022-10-27T05:40:32.6747518Z 2022-10-27T05:40:32.6749097Z PASS /datum/unit_test/addictions 0.1s 2022-10-27T05:40:32.6749790Z ##[endgroup] 2022-10-27T05:40:32.8122227Z ##[group]/datum/unit_test/actions_moved_on_mind_transfer -2022-10-27T05:40:32.8435426Z +2022-10-27T05:40:32.8435426Z 2022-10-27T05:40:32.8437029Z PASS /datum/unit_test/actions_moved_on_mind_transfer 0s 2022-10-27T05:40:32.8438267Z ##[endgroup] 2022-10-27T05:40:32.8685143Z ##[group]/datum/unit_test/mob_faction -2022-10-27T05:40:37.0355455Z +2022-10-27T05:40:37.0355455Z 2022-10-27T05:40:37.0357124Z PASS /datum/unit_test/mob_faction 4.2s 2022-10-27T05:40:37.0358437Z ##[endgroup] 2022-10-27T05:40:46.3276946Z ##[group]/datum/unit_test/mob_spawn -2022-10-27T05:40:46.3478047Z +2022-10-27T05:40:46.3478047Z 2022-10-27T05:40:46.3479094Z PASS /datum/unit_test/mob_spawn 0s 2022-10-27T05:40:46.3480121Z ##[endgroup] 2022-10-27T05:40:46.5088900Z ##[group]/datum/unit_test/modsuit_checks -2022-10-27T05:40:46.7422166Z +2022-10-27T05:40:46.7422166Z 2022-10-27T05:40:46.7424741Z PASS /datum/unit_test/modsuit_checks 0.2s 2022-10-27T05:40:46.7426303Z ##[endgroup] 2022-10-27T05:40:46.9639966Z ##[group]/datum/unit_test/modular_map_loader -2022-10-27T05:40:46.9645920Z +2022-10-27T05:40:46.9645920Z 2022-10-27T05:40:46.9647042Z PASS /datum/unit_test/modular_map_loader 0s 2022-10-27T05:40:46.9648824Z ##[endgroup] 2022-10-27T05:40:46.9857078Z ##[group]/datum/unit_test/mouse_bite_cable -2022-10-27T05:40:46.9906436Z +2022-10-27T05:40:46.9906436Z 2022-10-27T05:40:46.9907445Z PASS /datum/unit_test/mouse_bite_cable 0s 2022-10-27T05:40:46.9908580Z ##[endgroup] 2022-10-27T05:40:47.0104524Z ##[group]/datum/unit_test/novaflower_burn -2022-10-27T05:40:47.0691141Z +2022-10-27T05:40:47.0691141Z 2022-10-27T05:40:47.0692760Z PASS /datum/unit_test/novaflower_burn 0s 2022-10-27T05:40:47.0694697Z ##[endgroup] 2022-10-27T05:40:47.4496213Z ##[group]/datum/unit_test/ntnetwork -2022-10-27T05:40:47.4517846Z +2022-10-27T05:40:47.4517846Z 2022-10-27T05:40:47.4518703Z PASS /datum/unit_test/ntnetwork 0s 2022-10-27T05:40:47.4519832Z ##[endgroup] 2022-10-27T05:40:47.4710883Z ##[group]/datum/unit_test/nuke_cinematic -2022-10-27T05:40:51.6544361Z +2022-10-27T05:40:51.6544361Z 2022-10-27T05:40:51.6546808Z PASS /datum/unit_test/nuke_cinematic 4.2s 2022-10-27T05:40:51.6548322Z ##[endgroup] 2022-10-27T05:40:51.9750957Z ##[group]/datum/unit_test/objectives_category -2022-10-27T05:40:51.9754837Z +2022-10-27T05:40:51.9754837Z 2022-10-27T05:40:51.9758911Z PASS /datum/unit_test/objectives_category 0s 2022-10-27T05:40:51.9762185Z ##[endgroup] 2022-10-27T05:40:51.9966795Z ##[group]/datum/unit_test/operating_table -2022-10-27T05:40:52.0501605Z +2022-10-27T05:40:52.0501605Z 2022-10-27T05:40:52.0502705Z PASS /datum/unit_test/operating_table 0.1s 2022-10-27T05:40:52.0503789Z ##[endgroup] 2022-10-27T05:40:52.1317881Z ##[group]/datum/unit_test/outfit_sanity -2022-10-27T05:41:01.7976872Z +2022-10-27T05:41:01.7976872Z 2022-10-27T05:41:01.7979182Z PASS /datum/unit_test/outfit_sanity 9.6s 2022-10-27T05:41:01.7980122Z ##[endgroup] 2022-10-27T05:41:11.4243742Z ##[group]/datum/unit_test/paintings -2022-10-27T05:41:11.4598558Z +2022-10-27T05:41:11.4598558Z 2022-10-27T05:41:11.4599629Z PASS /datum/unit_test/paintings 0s 2022-10-27T05:41:11.4600448Z ##[endgroup] 2022-10-27T05:41:11.4792755Z ##[group]/datum/unit_test/pills -2022-10-27T05:41:11.5083505Z +2022-10-27T05:41:11.5083505Z 2022-10-27T05:41:11.5084511Z PASS /datum/unit_test/pills 0.1s 2022-10-27T05:41:11.5085321Z ##[endgroup] 2022-10-27T05:41:11.5601428Z ##[group]/datum/unit_test/plane_double_transform -2022-10-27T05:41:11.5919033Z +2022-10-27T05:41:11.5919033Z 2022-10-27T05:41:11.5921018Z PASS /datum/unit_test/plane_double_transform 0s 2022-10-27T05:41:11.5922301Z ##[endgroup] 2022-10-27T05:41:11.6221465Z ##[group]/datum/unit_test/plane_dupe_detector -2022-10-27T05:41:11.6222004Z +2022-10-27T05:41:11.6222004Z 2022-10-27T05:41:11.6222655Z PASS /datum/unit_test/plane_dupe_detector 0s 2022-10-27T05:41:11.6223293Z ##[endgroup] 2022-10-27T05:41:11.6426244Z ##[group]/datum/unit_test/plantgrowth -2022-10-27T05:41:11.6982938Z +2022-10-27T05:41:11.6982938Z 2022-10-27T05:41:11.6984405Z PASS /datum/unit_test/plantgrowth 0s 2022-10-27T05:41:11.6985721Z ##[endgroup] 2022-10-27T05:41:11.7325573Z ##[group]/datum/unit_test/preference_species -2022-10-27T05:41:11.7325819Z +2022-10-27T05:41:11.7325819Z 2022-10-27T05:41:11.7328286Z PASS /datum/unit_test/preference_species 0s 2022-10-27T05:41:11.7329335Z ##[endgroup] 2022-10-27T05:41:11.7520773Z ##[group]/datum/unit_test/preferences_implement_everything -2022-10-27T05:41:18.7582701Z +2022-10-27T05:41:18.7582701Z 2022-10-27T05:41:18.7583967Z PASS /datum/unit_test/preferences_implement_everything 7s 2022-10-27T05:41:18.7674142Z ##[endgroup] 2022-10-27T05:41:25.7837961Z ##[group]/datum/unit_test/preferences_valid_savefile_key -2022-10-27T05:41:25.7840087Z +2022-10-27T05:41:25.7840087Z 2022-10-27T05:41:25.7841504Z PASS /datum/unit_test/preferences_valid_savefile_key 0s 2022-10-27T05:41:25.7842504Z ##[endgroup] 2022-10-27T05:41:25.8045081Z ##[group]/datum/unit_test/preferences_valid_main_feature_name -2022-10-27T05:41:25.8046166Z +2022-10-27T05:41:25.8046166Z 2022-10-27T05:41:25.8047192Z PASS /datum/unit_test/preferences_valid_main_feature_name 0s 2022-10-27T05:41:25.8049437Z ##[endgroup] 2022-10-27T05:41:25.8233566Z ##[group]/datum/unit_test/projectile_movetypes -2022-10-27T05:41:25.8234187Z +2022-10-27T05:41:25.8234187Z 2022-10-27T05:41:25.8235057Z PASS /datum/unit_test/projectile_movetypes 0s 2022-10-27T05:41:25.8238602Z ##[endgroup] 2022-10-27T05:41:25.8422043Z ##[group]/datum/unit_test/gun_go_bang -2022-10-27T05:41:25.9103045Z +2022-10-27T05:41:25.9103045Z 2022-10-27T05:41:25.9104017Z PASS /datum/unit_test/gun_go_bang 0.1s 2022-10-27T05:41:25.9105102Z ##[endgroup] 2022-10-27T05:41:25.9957966Z ##[group]/datum/unit_test/quirk_icons -2022-10-27T05:41:25.9958970Z +2022-10-27T05:41:25.9958970Z 2022-10-27T05:41:25.9960876Z PASS /datum/unit_test/quirk_icons 0s 2022-10-27T05:41:25.9961959Z ##[endgroup] 2022-10-27T05:41:26.0166772Z ##[group]/datum/unit_test/range_return -2022-10-27T05:41:26.0167357Z +2022-10-27T05:41:26.0167357Z 2022-10-27T05:41:26.0167980Z PASS /datum/unit_test/range_return 0s 2022-10-27T05:41:26.0222740Z ##[endgroup] 2022-10-27T05:41:26.0353132Z ##[group]/datum/unit_test/frame_stacking -2022-10-27T05:41:26.0914496Z +2022-10-27T05:41:26.0914496Z 2022-10-27T05:41:26.0915254Z PASS /datum/unit_test/frame_stacking 0s 2022-10-27T05:41:26.0916011Z ##[endgroup] 2022-10-27T05:41:26.1694918Z ##[group]/datum/unit_test/reagent_id_typos -2022-10-27T05:41:26.1727233Z +2022-10-27T05:41:26.1727233Z 2022-10-27T05:41:26.1728009Z PASS /datum/unit_test/reagent_id_typos 0s 2022-10-27T05:41:26.1728685Z ##[endgroup] 2022-10-27T05:41:26.1920271Z ##[group]/datum/unit_test/reagent_mob_expose -2022-10-27T05:41:26.2268321Z +2022-10-27T05:41:26.2268321Z 2022-10-27T05:41:26.2269120Z PASS /datum/unit_test/reagent_mob_expose 0.1s 2022-10-27T05:41:26.2269829Z ##[endgroup] 2022-10-27T05:41:26.2549234Z ##[group]/datum/unit_test/reagent_mob_procs -2022-10-27T05:41:26.2827770Z +2022-10-27T05:41:26.2827770Z 2022-10-27T05:41:26.2828618Z PASS /datum/unit_test/reagent_mob_procs 0s 2022-10-27T05:41:26.2829318Z ##[endgroup] 2022-10-27T05:41:26.3078178Z ##[group]/datum/unit_test/reagent_names -2022-10-27T05:41:27.1646047Z +2022-10-27T05:41:27.1646047Z 2022-10-27T05:41:27.1647510Z PASS /datum/unit_test/reagent_names 0.8s 2022-10-27T05:41:27.1649181Z ##[endgroup] 2022-10-27T05:41:27.9838180Z ##[group]/datum/unit_test/reagent_recipe_collisions -2022-10-27T05:41:28.4462173Z +2022-10-27T05:41:28.4462173Z 2022-10-27T05:41:28.4463469Z PASS /datum/unit_test/reagent_recipe_collisions 0.5s 2022-10-27T05:41:28.4464601Z ##[endgroup] 2022-10-27T05:41:28.8661632Z ##[group]/datum/unit_test/reagent_transfer -2022-10-27T05:41:28.8670725Z +2022-10-27T05:41:28.8670725Z 2022-10-27T05:41:28.8671943Z PASS /datum/unit_test/reagent_transfer 0s 2022-10-27T05:41:28.8673335Z ##[endgroup] 2022-10-27T05:41:28.8888500Z ##[group]/datum/unit_test/stop_drop_and_roll -2022-10-27T05:41:28.9156826Z +2022-10-27T05:41:28.9156826Z 2022-10-27T05:41:28.9160888Z PASS /datum/unit_test/stop_drop_and_roll 0.1s 2022-10-27T05:41:28.9162086Z ##[endgroup] 2022-10-27T05:41:28.9403341Z ##[group]/datum/unit_test/container_resist -2022-10-27T05:41:28.9744033Z +2022-10-27T05:41:28.9744033Z 2022-10-27T05:41:28.9746221Z PASS /datum/unit_test/container_resist 0s 2022-10-27T05:41:28.9748317Z ##[endgroup] 2022-10-27T05:41:29.0027065Z ##[group]/datum/unit_test/get_message_mods -2022-10-27T05:41:29.0268010Z +2022-10-27T05:41:29.0268010Z 2022-10-27T05:41:29.0269082Z PASS /datum/unit_test/get_message_mods 0s 2022-10-27T05:41:29.0270222Z ##[endgroup] 2022-10-27T05:41:29.0513097Z ##[group]/datum/unit_test/say_signal -2022-10-27T05:41:29.0526010Z +2022-10-27T05:41:29.0526010Z 2022-10-27T05:41:29.0526949Z PASS /datum/unit_test/say_signal 0s 2022-10-27T05:41:29.0528292Z ##[endgroup] 2022-10-27T05:41:29.0718244Z ##[group]/datum/unit_test/screenshot_antag_icons @@ -1663,12 +1663,12 @@ 2022-10-27T05:41:29.3355078Z screenshot_antag_icons_blobinfection was put in data/screenshots_new 2022-10-27T05:41:29.3368910Z screenshot_antag_icons_obsessed was put in data/screenshots_new 2022-10-27T05:41:29.3372287Z screenshot_antag_icons_malfaimidround was put in data/screenshots_new -2022-10-27T05:41:29.3372581Z +2022-10-27T05:41:29.3372581Z 2022-10-27T05:41:29.3373097Z PASS /datum/unit_test/screenshot_antag_icons 0.3s 2022-10-27T05:41:29.3373772Z ##[endgroup] 2022-10-27T05:41:29.6066997Z ##[group]/datum/unit_test/screenshot_basic 2022-10-27T05:41:29.6075525Z screenshot_basic_red was put in data/screenshots_new -2022-10-27T05:41:29.6078638Z +2022-10-27T05:41:29.6078638Z 2022-10-27T05:41:29.6082196Z PASS /datum/unit_test/screenshot_basic 0s 2022-10-27T05:41:29.6085438Z ##[endgroup] 2022-10-27T05:41:29.6308021Z ##[group]/datum/unit_test/screenshot_humanoids @@ -1725,112 +1725,112 @@ 2022-10-27T05:42:01.7655604Z screenshot_humanoids__datum_species_vampire was put in data/screenshots_new 2022-10-27T05:42:02.5637759Z screenshot_humanoids__datum_species_zombie was put in data/screenshots_new 2022-10-27T05:42:03.4341531Z screenshot_humanoids__datum_species_zombie_infectious was put in data/screenshots_new -2022-10-27T05:42:03.4342475Z +2022-10-27T05:42:03.4342475Z 2022-10-27T05:42:03.4433344Z PASS /datum/unit_test/screenshot_humanoids 33.8s 2022-10-27T05:42:03.4434057Z ##[endgroup] 2022-10-27T05:42:38.0137819Z ##[group]/datum/unit_test/screenshot_saturnx 2022-10-27T05:42:38.2805908Z screenshot_saturnx_invisibility was put in data/screenshots_new -2022-10-27T05:42:38.2806525Z +2022-10-27T05:42:38.2806525Z 2022-10-27T05:42:38.2807422Z PASS /datum/unit_test/screenshot_saturnx 0.2s 2022-10-27T05:42:38.2808381Z ##[endgroup] 2022-10-27T05:42:38.5125108Z ##[group]/datum/unit_test/security_officer_roundstart_distribution -2022-10-27T05:42:38.6313313Z +2022-10-27T05:42:38.6313313Z 2022-10-27T05:42:38.6314073Z PASS /datum/unit_test/security_officer_roundstart_distribution 0.1s 2022-10-27T05:42:38.6314848Z ##[endgroup] 2022-10-27T05:42:38.7844382Z ##[group]/datum/unit_test/security_officer_latejoin_distribution -2022-10-27T05:42:39.3108839Z +2022-10-27T05:42:39.3108839Z 2022-10-27T05:42:39.3109578Z PASS /datum/unit_test/security_officer_latejoin_distribution 0.5s 2022-10-27T05:42:39.3110392Z ##[endgroup] 2022-10-27T05:42:39.8689626Z ##[group]/datum/unit_test/security_levels -2022-10-27T05:42:39.8691007Z +2022-10-27T05:42:39.8691007Z 2022-10-27T05:42:39.8692358Z PASS /datum/unit_test/security_levels 0s 2022-10-27T05:42:39.8694155Z ##[endgroup] 2022-10-27T05:42:39.8954646Z ##[group]/datum/unit_test/servingtray -2022-10-27T05:42:39.9246160Z +2022-10-27T05:42:39.9246160Z 2022-10-27T05:42:39.9246828Z PASS /datum/unit_test/servingtray 0.1s 2022-10-27T05:42:39.9247596Z ##[endgroup] 2022-10-27T05:42:39.9527510Z ##[group]/datum/unit_test/simple_animal_freeze -2022-10-27T05:42:39.9538858Z +2022-10-27T05:42:39.9538858Z 2022-10-27T05:42:39.9539579Z PASS /datum/unit_test/simple_animal_freeze 0s 2022-10-27T05:42:39.9540575Z ##[endgroup] 2022-10-27T05:42:39.9737208Z ##[group]/datum/unit_test/siunit -2022-10-27T05:42:39.9737877Z +2022-10-27T05:42:39.9737877Z 2022-10-27T05:42:39.9739067Z PASS /datum/unit_test/siunit 0s 2022-10-27T05:42:39.9739970Z ##[endgroup] 2022-10-27T05:42:40.0059889Z ##[group]/datum/unit_test/slips -2022-10-27T05:42:40.0605319Z +2022-10-27T05:42:40.0605319Z 2022-10-27T05:42:40.0606405Z PASS /datum/unit_test/slips 0s 2022-10-27T05:42:40.0608008Z ##[endgroup] 2022-10-27T05:42:40.1167017Z ##[group]/datum/unit_test/spawn_humans -2022-10-27T05:42:45.1906375Z +2022-10-27T05:42:45.1906375Z 2022-10-27T05:42:45.1907903Z PASS /datum/unit_test/spawn_humans 5s 2022-10-27T05:42:45.1910749Z ##[endgroup] 2022-10-27T05:42:45.2427283Z ##[group]/datum/unit_test/spawn_mobs -2022-10-27T05:42:45.3357801Z +2022-10-27T05:42:45.3357801Z 2022-10-27T05:42:45.3359033Z PASS /datum/unit_test/spawn_mobs 0.1s 2022-10-27T05:42:45.3361725Z ##[endgroup] 2022-10-27T05:42:45.5043702Z ##[group]/datum/unit_test/species_change_clothing -2022-10-27T05:42:45.6048589Z +2022-10-27T05:42:45.6048589Z 2022-10-27T05:42:45.6049694Z PASS /datum/unit_test/species_change_clothing 0.1s 2022-10-27T05:42:45.6051771Z ##[endgroup] 2022-10-27T05:42:45.6837595Z ##[group]/datum/unit_test/species_change_organs -2022-10-27T05:42:45.7545977Z +2022-10-27T05:42:45.7545977Z 2022-10-27T05:42:45.7546831Z PASS /datum/unit_test/species_change_organs 0.1s 2022-10-27T05:42:45.7547563Z ##[endgroup] 2022-10-27T05:42:45.7836582Z ##[group]/datum/unit_test/species_config_sanity -2022-10-27T05:42:45.7840840Z +2022-10-27T05:42:45.7840840Z 2022-10-27T05:42:45.7842768Z PASS /datum/unit_test/species_config_sanity 0s 2022-10-27T05:42:45.7844337Z ##[endgroup] 2022-10-27T05:42:45.8022187Z ##[group]/datum/unit_test/species_unique_id -2022-10-27T05:42:45.8022866Z +2022-10-27T05:42:45.8022866Z 2022-10-27T05:42:45.8075321Z PASS /datum/unit_test/species_unique_id 0s 2022-10-27T05:42:45.8076400Z ##[endgroup] 2022-10-27T05:42:45.8351362Z ##[group]/datum/unit_test/species_whitelist_check -2022-10-27T05:42:45.8351724Z +2022-10-27T05:42:45.8351724Z 2022-10-27T05:42:45.8352365Z PASS /datum/unit_test/species_whitelist_check 0s 2022-10-27T05:42:45.8353142Z ##[endgroup] 2022-10-27T05:42:45.8533484Z ##[group]/datum/unit_test/spell_invocations -2022-10-27T05:42:45.8533768Z +2022-10-27T05:42:45.8533768Z 2022-10-27T05:42:45.8534255Z PASS /datum/unit_test/spell_invocations 0s 2022-10-27T05:42:45.8534811Z ##[endgroup] 2022-10-27T05:42:45.8839364Z ##[group]/datum/unit_test/mind_swap_spell -2022-10-27T05:42:45.9396663Z +2022-10-27T05:42:45.9396663Z 2022-10-27T05:42:45.9397306Z PASS /datum/unit_test/mind_swap_spell 0.1s 2022-10-27T05:42:45.9397999Z ##[endgroup] 2022-10-27T05:42:45.9707938Z ##[group]/datum/unit_test/spell_names -2022-10-27T05:42:45.9708233Z +2022-10-27T05:42:45.9708233Z 2022-10-27T05:42:45.9708764Z PASS /datum/unit_test/spell_names 0s 2022-10-27T05:42:45.9709443Z ##[endgroup] 2022-10-27T05:42:45.9892272Z ##[group]/datum/unit_test/shapeshift_spell_validity -2022-10-27T05:42:45.9896681Z +2022-10-27T05:42:45.9896681Z 2022-10-27T05:42:45.9897201Z PASS /datum/unit_test/shapeshift_spell_validity 0s 2022-10-27T05:42:45.9897727Z ##[endgroup] 2022-10-27T05:42:46.0425278Z ##[group]/datum/unit_test/shapeshift_spell -2022-10-27T05:42:46.3445398Z +2022-10-27T05:42:46.3445398Z 2022-10-27T05:42:46.3446335Z PASS /datum/unit_test/shapeshift_spell 0.3s 2022-10-27T05:42:46.3447239Z ##[endgroup] 2022-10-27T05:42:46.8200052Z ##[group]/datum/unit_test/shapeshift_holoparasites -2022-10-27T05:42:46.8537455Z +2022-10-27T05:42:46.8537455Z 2022-10-27T05:42:46.8539870Z PASS /datum/unit_test/shapeshift_holoparasites 0s 2022-10-27T05:42:46.8541451Z ##[endgroup] 2022-10-27T05:42:46.9292759Z ##[group]/datum/unit_test/spritesheets -2022-10-27T05:42:50.5944827Z +2022-10-27T05:42:50.5944827Z 2022-10-27T05:42:50.5945740Z PASS /datum/unit_test/spritesheets 3.6s 2022-10-27T05:42:50.5946612Z ##[endgroup] 2022-10-27T05:42:57.1137055Z ##[group]/datum/unit_test/stack_singular_name -2022-10-27T05:42:57.1142555Z +2022-10-27T05:42:57.1142555Z 2022-10-27T05:42:57.1145224Z PASS /datum/unit_test/stack_singular_name 0s 2022-10-27T05:42:57.1147574Z ##[endgroup] 2022-10-27T05:42:57.1358739Z ##[group]/datum/unit_test/stomach -2022-10-27T05:42:57.1694838Z +2022-10-27T05:42:57.1694838Z 2022-10-27T05:42:57.1695603Z PASS /datum/unit_test/stomach 0s 2022-10-27T05:42:57.1696272Z ##[endgroup] 2022-10-27T05:42:57.1961163Z ##[group]/datum/unit_test/strip_menu_ui_status -2022-10-27T05:42:57.2480737Z +2022-10-27T05:42:57.2480737Z 2022-10-27T05:42:57.2481561Z PASS /datum/unit_test/strip_menu_ui_status 0.1s 2022-10-27T05:42:57.2483682Z ##[endgroup] 2022-10-27T05:42:57.3124509Z ##[group]/datum/unit_test/subsystem_init -2022-10-27T05:42:57.3124738Z +2022-10-27T05:42:57.3124738Z 2022-10-27T05:42:57.3127230Z PASS /datum/unit_test/subsystem_init 0s 2022-10-27T05:42:57.3128294Z ##[endgroup] 2022-10-27T05:42:57.3335312Z ##[group]/datum/unit_test/suit_storage_icons @@ -2091,87 +2091,87 @@ 2022-10-27T05:42:59.4479594Z 255 - /obj/item/storage/lockbox/medal using invalid icon_state, "medalbox+l" 2022-10-27T05:42:59.4487494Z 256 - /obj/item/crowbar/red/caravan using invalid icon_state, "crowbar_caravan" 2022-10-27T05:42:59.4509453Z 257 - /obj/item/crowbar/drone using invalid icon_state, "crowbar_cyborg" -2022-10-27T05:42:59.4528797Z +2022-10-27T05:42:59.4528797Z 2022-10-27T05:42:59.4529293Z PASS /datum/unit_test/suit_storage_icons 2.1s 2022-10-27T05:42:59.4529946Z ##[endgroup] 2022-10-27T05:43:01.5221964Z ##[group]/datum/unit_test/amputation -2022-10-27T05:43:01.5815196Z +2022-10-27T05:43:01.5815196Z 2022-10-27T05:43:01.5817573Z PASS /datum/unit_test/amputation 0s 2022-10-27T05:43:01.5819941Z ##[endgroup] 2022-10-27T05:43:01.6143865Z ##[group]/datum/unit_test/brain_surgery -2022-10-27T05:43:01.6698394Z +2022-10-27T05:43:01.6698394Z 2022-10-27T05:43:01.6699379Z PASS /datum/unit_test/brain_surgery 0s 2022-10-27T05:43:01.6700065Z ##[endgroup] 2022-10-27T05:43:01.7064460Z ##[group]/datum/unit_test/head_transplant -2022-10-27T05:43:01.7910615Z +2022-10-27T05:43:01.7910615Z 2022-10-27T05:43:01.7911507Z PASS /datum/unit_test/head_transplant 0s 2022-10-27T05:43:01.7912215Z ##[endgroup] 2022-10-27T05:43:01.8771339Z ##[group]/datum/unit_test/multiple_surgeries -2022-10-27T05:43:01.9564190Z +2022-10-27T05:43:01.9564190Z 2022-10-27T05:43:01.9565672Z PASS /datum/unit_test/multiple_surgeries 0.1s 2022-10-27T05:43:01.9566988Z ##[endgroup] 2022-10-27T05:43:02.0451694Z ##[group]/datum/unit_test/start_tend_wounds -2022-10-27T05:43:02.1021559Z +2022-10-27T05:43:02.1021559Z 2022-10-27T05:43:02.1023113Z PASS /datum/unit_test/start_tend_wounds 0.1s 2022-10-27T05:43:02.1027806Z ##[endgroup] 2022-10-27T05:43:02.1334702Z ##[group]/datum/unit_test/tend_wounds -2022-10-27T05:43:02.2464864Z +2022-10-27T05:43:02.2464864Z 2022-10-27T05:43:02.2466455Z PASS /datum/unit_test/tend_wounds 0.1s 2022-10-27T05:43:02.2471798Z ##[endgroup] 2022-10-27T05:43:02.3971842Z ##[group]/datum/unit_test/auto_teleporter_linking -2022-10-27T05:43:02.4364172Z +2022-10-27T05:43:02.4364172Z 2022-10-27T05:43:02.4365748Z PASS /datum/unit_test/auto_teleporter_linking 0.1s 2022-10-27T05:43:02.4367360Z ##[endgroup] 2022-10-27T05:43:02.4786335Z ##[group]/datum/unit_test/tgui_create_message -2022-10-27T05:43:02.4787309Z +2022-10-27T05:43:02.4787309Z 2022-10-27T05:43:02.4792228Z PASS /datum/unit_test/tgui_create_message 0s 2022-10-27T05:43:02.4793589Z ##[endgroup] 2022-10-27T05:43:02.4990140Z ##[group]/datum/unit_test/timer_sanity -2022-10-27T05:43:02.4990770Z +2022-10-27T05:43:02.4990770Z 2022-10-27T05:43:02.4993590Z PASS /datum/unit_test/timer_sanity 0s 2022-10-27T05:43:02.4994358Z ##[endgroup] 2022-10-27T05:43:02.5179295Z ##[group]/datum/unit_test/traitor -2022-10-27T05:43:04.3257821Z +2022-10-27T05:43:04.3257821Z 2022-10-27T05:43:04.3259494Z PASS /datum/unit_test/traitor 1.8s 2022-10-27T05:43:04.3309007Z ##[endgroup] 2022-10-27T05:43:08.2246947Z ##[group]/datum/unit_test/verify_config_tags -2022-10-27T05:43:08.2248054Z +2022-10-27T05:43:08.2248054Z 2022-10-27T05:43:08.2249419Z PASS /datum/unit_test/verify_config_tags 0s 2022-10-27T05:43:08.2250078Z ##[endgroup] 2022-10-27T05:43:08.2441208Z ##[group]/datum/unit_test/wizard_loadout -2022-10-27T05:43:08.3578743Z +2022-10-27T05:43:08.3578743Z 2022-10-27T05:43:08.3580409Z PASS /datum/unit_test/wizard_loadout 0.1s 2022-10-27T05:43:08.3585004Z ##[endgroup] 2022-10-27T05:43:08.5073685Z ##[group]/datum/unit_test/find_reference_sanity -2022-10-27T05:43:08.5075807Z +2022-10-27T05:43:08.5075807Z 2022-10-27T05:43:08.5076772Z PASS /datum/unit_test/find_reference_sanity 0s 2022-10-27T05:43:08.5077672Z ##[endgroup] 2022-10-27T05:43:08.5272155Z ##[group]/datum/unit_test/find_reference_baseline -2022-10-27T05:43:08.5274693Z +2022-10-27T05:43:08.5274693Z 2022-10-27T05:43:08.5275872Z PASS /datum/unit_test/find_reference_baseline 0s 2022-10-27T05:43:08.5276640Z ##[endgroup] 2022-10-27T05:43:08.5468423Z ##[group]/datum/unit_test/find_reference_exotic -2022-10-27T05:43:08.5470529Z +2022-10-27T05:43:08.5470529Z 2022-10-27T05:43:08.5474746Z PASS /datum/unit_test/find_reference_exotic 0s 2022-10-27T05:43:08.5475293Z ##[endgroup] 2022-10-27T05:43:08.5665386Z ##[group]/datum/unit_test/find_reference_esoteric -2022-10-27T05:43:08.5669399Z +2022-10-27T05:43:08.5669399Z 2022-10-27T05:43:08.5676075Z PASS /datum/unit_test/find_reference_esoteric 0s 2022-10-27T05:43:08.5677072Z ##[endgroup] 2022-10-27T05:43:08.5866537Z ##[group]/datum/unit_test/find_reference_null_key_entry -2022-10-27T05:43:08.5868456Z +2022-10-27T05:43:08.5868456Z 2022-10-27T05:43:08.5869492Z PASS /datum/unit_test/find_reference_null_key_entry 0s 2022-10-27T05:43:08.5870146Z ##[endgroup] 2022-10-27T05:43:08.6166348Z ##[group]/datum/unit_test/find_reference_assoc_investigation -2022-10-27T05:43:08.6171705Z +2022-10-27T05:43:08.6171705Z 2022-10-27T05:43:08.6172220Z PASS /datum/unit_test/find_reference_assoc_investigation 0s 2022-10-27T05:43:08.6172854Z ##[endgroup] 2022-10-27T05:43:08.6356029Z ##[group]/datum/unit_test/find_reference_static_investigation -2022-10-27T05:43:08.8684547Z +2022-10-27T05:43:08.8684547Z 2022-10-27T05:43:08.8685577Z PASS /datum/unit_test/find_reference_static_investigation 0.2s 2022-10-27T05:43:08.8686517Z ##[endgroup] 2022-10-27T05:43:09.0881655Z ##[group]/datum/unit_test/monkey_business -2022-10-27T05:43:47.8646118Z +2022-10-27T05:43:47.8646118Z 2022-10-27T05:43:47.8647763Z PASS /datum/unit_test/monkey_business 38.8s 2022-10-27T05:43:47.8739017Z ##[endgroup] 2022-10-27T05:43:50.1651558Z ##[group]/datum/unit_test/create_and_destroy @@ -2330,12 +2330,12 @@ 2022-10-27T05:53:02.6649338Z Total size of all the files uploaded is 138917 bytes 2022-10-27T05:53:02.6650349Z File upload process has finished. Finalizing the artifact upload 2022-10-27T05:53:02.6917894Z Artifact has been finalized. All files have been successfully uploaded! -2022-10-27T05:53:02.6918592Z +2022-10-27T05:53:02.6918592Z 2022-10-27T05:53:02.6919221Z The raw size of all the files that were specified for upload is 139272 bytes 2022-10-27T05:53:02.6920199Z The size of all the files that were uploaded is 138917 bytes. This takes into account any gzip compression used to reduce the upload size, time and storage -2022-10-27T05:53:02.6920771Z -2022-10-27T05:53:02.6922015Z Note: The size of downloaded zips can differ significantly from the reported size. For more information see: https://github.com/actions/upload-artifact#zipped-artifact-downloads -2022-10-27T05:53:02.6922715Z +2022-10-27T05:53:02.6920771Z +2022-10-27T05:53:02.6922015Z Note: The size of downloaded zips can differ significantly from the reported size. For more information see: https://github.com/actions/upload-artifact#zipped-artifact-downloads +2022-10-27T05:53:02.6922715Z 2022-10-27T05:53:02.6923052Z Artifact test_artifacts_metastation has been successfully uploaded! 2022-10-27T05:53:02.7064563Z Post job cleanup. 2022-10-27T05:53:02.8553446Z [command]/usr/bin/git version @@ -2375,10 +2375,10 @@ 2022-10-27T05:53:02.9886079Z 2022-10-27 05:35:52+00:00 [Note] [Entrypoint]: Temporary server started. 2022-10-27T05:53:02.9886471Z '/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock' 2022-10-27T05:53:02.9888624Z Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it. -2022-10-27T05:53:02.9889273Z +2022-10-27T05:53:02.9889273Z 2022-10-27T05:53:02.9889568Z 2022-10-27 05:35:54+00:00 [Note] [Entrypoint]: Stopping temporary server 2022-10-27T05:53:02.9889969Z 2022-10-27 05:35:57+00:00 [Note] [Entrypoint]: Temporary server stopped -2022-10-27T05:53:02.9890280Z +2022-10-27T05:53:02.9890280Z 2022-10-27T05:53:02.9890742Z 2022-10-27 05:35:57+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up. 2022-10-27T05:53:02.9891394Z Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it. 2022-10-27T05:53:02.9891960Z Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it. @@ -2386,7 +2386,7 @@ 2022-10-27T05:53:02.9893146Z 2022-10-27T05:35:54.998452Z 10 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.31). 2022-10-27T05:53:02.9893808Z 2022-10-27T05:35:56.253546Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.31) MySQL Community Server - GPL. 2022-10-27T05:53:02.9898747Z 2022-10-27T05:35:57.259394Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead. -2022-10-27T05:53:02.9899246Z +2022-10-27T05:53:02.9899246Z 2022-10-27T05:53:02.9899947Z 2022-10-27T05:35:57.260761Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.31) starting as process 1 2022-10-27T05:53:02.9900440Z 2022-10-27T05:35:57.279827Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 2022-10-27T05:53:02.9900902Z 2022-10-27T05:35:57.478844Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. diff --git a/tools/ticked_file_enforcement/schemas/tgstation_dme.json b/tools/ticked_file_enforcement/schemas/tgstation_dme.json index 85d26ae000eae..7fe1840d75340 100644 --- a/tools/ticked_file_enforcement/schemas/tgstation_dme.json +++ b/tools/ticked_file_enforcement/schemas/tgstation_dme.json @@ -5,7 +5,6 @@ "excluded_files": [], "forbidden_includes": [ "code/modules/tgs/**/*.dm", - "code/modules/unit_tests/[!_]*.dm", - "code/modules/unit_tests/~doppler/[!_]*.dm" + "code/modules/unit_tests/[!_]*.dm" ] } diff --git a/tools/ticked_file_enforcement/ticked_file_enforcement.py b/tools/ticked_file_enforcement/ticked_file_enforcement.py index a7a4e615b1b82..86c399c73554b 100644 --- a/tools/ticked_file_enforcement/ticked_file_enforcement.py +++ b/tools/ticked_file_enforcement/ticked_file_enforcement.py @@ -55,12 +55,6 @@ def post_error(string): break elif not reading: continue - # DOPPLER EDIT START - Modular unit tests - elif line == "// DOPPLER EDIT START": - continue - elif line == "// DOPPLER EDIT END": - continue - # DOPPLER EDIT END lines.append(line) @@ -84,10 +78,6 @@ def post_error(string): dm_path = code_file.replace('/', '\\') else: dm_path = os.path.basename(code_file) - # DOPPLER EDIT START - Modular unit tests - have to append this because it gets removed; thank you TG, you made me cry so much - if("~doppler/" in code_file): - dm_path = "~doppler\\" + dm_path - # DOPPLER EDIT END included = f"#include \"{dm_path}\"" in lines