diff --git a/.editorconfig b/.editorconfig index 1cf10e78658..fe00766204b 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,14 +1,24 @@ +root = true + [*] insert_final_newline = true +trim_trailing_whitespace = true + +[*.dm] +end_of_line = crlf indent_style = tab indent_size = 4 -[*.yml] -indent_style = space -indent_size = 2 +[*.dmm] +end_of_line = crlf [*.py] indent_style = space +indent_size = 4 + +[*.yml] +indent_style = space +indent_size = 2 [/tgui/**/*.{js,styl,ract,json,html}] indent_style = space diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml index d18b3c2213e..e11d8daf70f 100644 --- a/.github/workflows/ci_suite.yml +++ b/.github/workflows/ci_suite.yml @@ -10,35 +10,157 @@ on: env: BYOND_MAJOR: 515 - BYOND_MINOR: 1636 + BYOND_MINOR: 1646 + SPACEMAN_DMM_VERSION: suite-1.9 jobs: - build: + run-linters: + if: ( !contains(github.event.head_commit.message, '[ci skip]') ) + name: Run Linters + runs-on: ubuntu-22.04 + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Setup cache + uses: actions/cache@v4 + with: + path: ~/SpacemanDMM + key: ${{ runner.os }}-spacemandmm-${{ hashFiles('dependencies.sh') }} + restore-keys: | + ${{ runner.os }}-spacemandmm- + - name: Restore Rust cache + uses: actions/cache@v4 + with: + path: ~/.cargo + key: ${{ runner.os }}-rust-${{ hashFiles('tools/ci/ci_dependencies.sh')}} + restore-keys: | + ${{ runner.os }}-rust- + - name: Install Tools + run: | + pip3 install setuptools + bash tools/ci/install_spaceman_dmm.sh dreamchecker + bash tools/ci/install_ripgrep.sh + tools/bootstrap/python -c '' + - name: Run Linters + run: | + bash tools/ci/check_filedirs.sh roguetown.dme + bash tools/ci/check_changelogs.sh + find . -name "*.php" -print0 | xargs -0 -n1 php -l + bash tools/ci/check_grep.sh + tools/bootstrap/python tools/ci/validate_dme.py < roguetown.dme + tools/bootstrap/python -m dmi.test + tools/bootstrap/python -m mapmerge2.dmm_test + ~/dreamchecker > ${GITHUB_WORKSPACE}/output-annotations.txt 2>&1 + - name: Annotate Lints + uses: yogstation13/DreamAnnotate@v2 + if: always() + with: + outputFile: output-annotations.txt + OpenDream: runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Python setup + uses: actions/setup-python@v4 + with: + python-version: '3.x' + - name: Setup Cache + uses: actions/cache@v4 + with: + path: $HOME/spaceman_dmm/$SPACEMAN_DMM_VERSION + key: ${{ runner.os }}-spacemandmm-${{ env.SPACEMAN_DMM_VERSION }} + - name: Install OpenDream + uses: robinraju/release-downloader@v1.9 + with: + repository: "OpenDreamProject/OpenDream" + tag: "latest" + fileName: "DMCompiler_linux-x64.tar.gz" + extract: true + - name: Run OpenDream + run: ./DMCompiler_linux-x64/DMCompiler roguetown.dme --suppress-unimplemented --skip-anything-typecheck --version=${BYOND_MAJOR}.${BYOND_MINOR} | python tools/od_annotator/__main__.py "$@" + compile_all_maps: + if: ( !contains(github.event.head_commit.message, '[ci skip]') ) + name: Compile Maps + runs-on: ubuntu-22.04 steps: - name: Checkout code - uses: actions/checkout@v2 - - - name: Install BYOND + uses: actions/checkout@v4 + - name: Setup cache + uses: actions/cache@v4 + with: + path: ~/BYOND + key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }} + - name: Compile All Maps run: | - sudo apt-get update -qq - sudo apt-get install -y make gcc unzip - wget http://www.byond.com/download/build/${{ env.BYOND_MAJOR }}/${{ env.BYOND_MAJOR }}.${{ env.BYOND_MINOR }}_byond_linux.zip - unzip ${BYOND_MAJOR}.${BYOND_MINOR}_byond_linux.zip bash tools/ci/install_byond.sh - - - name: Compile BYOND project + source $HOME/BYOND/byond/bin/byondsetup + python3 tools/ci/template_dm_generator.py + DreamMaker -DCIBUILDING -DCITESTING -DALL_MAPS roguetown.dme + run_all_tests: + if: ( !contains(github.event.head_commit.message, '[ci skip]') ) + name: Integration Tests + runs-on: ubuntu-22.04 + timeout-minutes: 30 + services: + mysql: + image: mysql:latest + env: + MYSQL_ROOT_PASSWORD: root + ports: + - 3306 + options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Restore BYOND cache + uses: actions/cache@v4 + with: + path: ~/BYOND + key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }} + - name: Setup database + run: | + sudo systemctl start mysql + mysql -u root -proot -e 'CREATE DATABASE tg_ci;' + mysql -u root -proot tg_ci < SQL/tgstation_schema.sql + mysql -u root -proot -e 'CREATE DATABASE tg_ci_prefixed;' + mysql -u root -proot tg_ci_prefixed < SQL/tgstation_schema_prefixed.sql + - name: Install rust-g + run: | + sudo dpkg --add-architecture i386 + sudo apt update || true + sudo apt install zlib1g-dev:i386 + bash tools/ci/install_rust_g.sh + - name: Compile and run tests run: | - ls -h $HOME/ + bash tools/ci/install_byond.sh source $HOME/BYOND/byond/bin/byondsetup - DreamMaker roguetown.dme - - - name: Check for errors - id: check-errors + DreamMaker -DCIBUILDING -ignore loop_checks roguetown.dme + bash tools/ci/run_server.sh roguetest + test_windows: + if: ( !contains(github.event.head_commit.message, '[ci skip]') ) + name: Windows Build + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + - name: Restore BYOND cache + uses: actions/cache@v4 + with: + path: C:\\byond + key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }} + restore-keys: | + ${{ runner.os }}-build-${{ secrets.CACHE_PURGE_KEY }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + - name: Compile + run: pwsh tools/ci/build.ps1 + env: + DM_EXE: "C:\\byond\\bin\\dm.exe" + - name: Create artifact run: | - if grep -q "error" *.log; then - echo "::error ::Compilation failed with errors." - exit 1 - else - echo "Compilation succeeded without critical errors." - fi + md deploy + bash tools/deploy.sh ./deploy + - name: Deploy artifact + uses: actions/upload-artifact@v4 + with: + name: deploy + path: deploy diff --git a/.gitignore b/.gitignore index f0150f26323..e0231918c55 100644 --- a/.gitignore +++ b/.gitignore @@ -220,3 +220,9 @@ tools/MapAtmosFixer/MapAtmosFixer/bin/* /config/ezdb.txt tgui/src/images/syndicate.svg tgui/src/images/nanotrasen.svg +/data + +/prof.dll + +# OpenDream-compiled DME +/roguetown.json diff --git a/README.md b/README.md index 9f7fd627d31..2a548f2caed 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,64 @@ -## Discord -Come join our [discord](https://discord.gg/YTp2GTzwyv)! +

+ Dreamkeep Stats +

DREAMKEEP

+

M-RP / H-RP Medieval Fantasy

+

+ +

+ + GitHub Contributors + + + Issues + + + GitHub pull requests + +

+ +

+ + BYOND Build + +

+ +
+ +| Community links | +|----------------------------------| +| [Discord](https://discord.gg/vJDHxXbqvv) | + +
+ +# LICENSE + +## Dreamkeep + +All original code and assets of this repository are under the [GNU Affero General Public License v3.0](https://www.gnu.org/licenses/agpl-3.0.en.html) unless otherwise indicated. + +## Dreamkeep - Proprietary + +The following assets are under a custom license as per original author's wishes, assets authored by Dreamkeep indicate collaborative work among it's artists, and may be credited within files. + +[ADDITIONAL TERMS](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/ADDITIONAL-TERMS.md) + +| Reference | Author | License | +|----------------------------------------------|---------------|------------| +| [licensed-dreamkeep](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-dreamkeep) | Dreamkeep | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-dreamkeep/LICENSE.md)| +| [licensed-eaglephntm](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-eaglephntm) | EaglePhntm | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-eaglephntm/LICENSE.md)| +| [licensed-feralope](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-feralope) | Feralope | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-feralope/LICENSE.md)| +| [licensed-feralope (helmsguard)](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_helmsguard/licensed-feralope) | Feralope | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_helmsguard/licensed-feralope/LICENSE.md)| +| [licensed-death-rattler](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_helmsguard/licensed-death-rattler) | Moribund/Luctus-Comptus | [License](https://github.com/StoneHedgeSS13/StoneHedge/tree/main/modular_stonehedge/licensed-death-rattler/LICENSE.md)| + +## TG + +All code after [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU AGPL v3](https://www.gnu.org/licenses/agpl-3.0.html). + +All code before [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU GPL v3](https://www.gnu.org/licenses/gpl-3.0.html). +(Including tools unless their readme specifies otherwise.) + +The TGS DMAPI is licensed as a subproject under the MIT license. + +See the footer of [code/__DEFINES/tgs.dm](./code/__DEFINES/tgs.dm) and [code/modules/tgs/LICENSE](./code/modules/tgs/LICENSE) for the MIT license. + +All other assets including icons and sound are under the [Creative Commons 3.0 BY-SA license](https://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated. diff --git a/SpacemanDMM.toml b/SpacemanDMM.toml index 72c13ce768f..d3e60e4740e 100644 --- a/SpacemanDMM.toml +++ b/SpacemanDMM.toml @@ -1,4 +1,56 @@ environment = "roguetown.dme" +[langserver] +dreamchecker = true + +[dmdoc] +use_typepath_names = true + +[code_standards] +disallow_relative_type_definitions = true +disallow_relative_proc_definitions = true + [debugger] engine = "auxtools" + +[diagnostics] +# Raised by DreamChecker +disabled_directive = "error" +sets_directive_twice = "error" +invalid_lint_directive_value = "error" +invalid_set_value = "error" +unknown_linter_setting = "error" +override_missing_keyword_arg = "error" +must_not_override = "error" +must_call_parent = "error" +final_var = "error" +private_proc = "error" +protected_proc = "error" +private_var = "error" +protected_var = "error" +must_be_pure = "error" +must_not_sleep = "error" +redefined_proc = "off" +ambiguous_in_lhs = "error" +ambiguous_not_bitwise = "error" +no_typehint_implicit_new = "error" +field_access_static_type = "error" +proc_call_static_type = "error" +proc_has_no_parent = "error" +no_operator_overload = "error" +unreachable_code = "error" +control_condition_static = "error" +if_condition_determinate = "error" +loop_condition_determinate = "error" + +# Raised by Lexer +integer_precision_loss = "error" + +# Raised by Parser +duplicate_include = "error" +macro_redefined = "error" +macro_undefined_no_definition = "error" + +[map_renderer.render_passes] +icon-smoothing = false +icon-smoothing-2016 = true diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index deb4cb6e29b..deb45d64e61 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -7,8 +7,8 @@ #include "map_files\Roguetown\roguetown.dmm" #include "map_files\Rogueworld\Rogueworld.dmm" - #ifdef TRAVISBUILDING + #ifdef CIBUILDING #include "templates.dm" #endif #endif -#endif \ No newline at end of file +#endif diff --git a/_maps/deepnorth.json b/_maps/deepnorth.json index 90eb4041f72..e827f08cccd 100644 --- a/_maps/deepnorth.json +++ b/_maps/deepnorth.json @@ -2,5 +2,5 @@ "map_name": "deepnorth", "map_path": "map_files/hearthstone", "map_file": "deepnorth.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Down": -1}] + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Down": true}] } diff --git a/_maps/dreamhold.json b/_maps/dreamhold.json index bfadd7ad705..93e00d0b4d1 100644 --- a/_maps/dreamhold.json +++ b/_maps/dreamhold.json @@ -2,7 +2,7 @@ "map_name": "Dreamhold", "map_path": "map_files/dreamhold", "map_file": "Dreamhold.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Down": -1}], + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Down": true}], "minetype": null, "space_empty_levels": 0, "space_ruin_levels": 0, diff --git a/_maps/elfkeep.dm b/_maps/elfkeep.dm deleted file mode 100644 index e96d1023448..00000000000 --- a/_maps/elfkeep.dm +++ /dev/null @@ -1 +0,0 @@ -#define FORCE_MAP "_maps/elfkeep.json" diff --git a/_maps/elfkeep.json b/_maps/elfkeep.json deleted file mode 100644 index 4ea6397051c..00000000000 --- a/_maps/elfkeep.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "map_name": "Elfkeep", - "map_path": "map_files/elfkeep", - "map_file": "elfkeep.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Down": -1}], - "minetype": null, - "space_empty_levels": 0, - "space_ruin_levels": 0, - "shuttles": { - "cargo": "cargo_rogue", - "ferry": "ferry_fancy", - "whiteship": "whiteship_box", - "emergency": "emergency_rogue" - } -} diff --git a/_maps/map_files/dreamhold/Dreamhold.dmm b/_maps/map_files/dreamhold/Dreamhold.dmm index 69dc842529f..c85a8a0b078 100644 --- a/_maps/map_files/dreamhold/Dreamhold.dmm +++ b/_maps/map_files/dreamhold/Dreamhold.dmm @@ -134,6 +134,12 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"aeO" = ( +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/rogue/cobble, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "afp" = ( /obj/structure/fluff/railing/border{ dir = 9 @@ -157,6 +163,15 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"ahf" = ( +/obj/structure/chair/bench/church/smallbench{ + dir = 8 + }, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "ahG" = ( /obj/effect/landmark/events/haunts, /turf/open/floor/rogue/cobblerock, @@ -181,6 +196,15 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"ajF" = ( +/obj/structure/flora/grass/jungle{ + icon_state = "grassa2" + }, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "ajI" = ( /obj/structure/spacevine/dendor, /turf/open/floor/rogue/hexstone, @@ -330,6 +354,12 @@ "aoy" = ( /turf/open/floor/rogue/hexstone, /area/rogue/outdoors/caves) +"aoF" = ( +/obj/structure/flora/newtree, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "apc" = ( /obj/structure/chair/stool/rogue, /turf/open/floor/rogue/blocks, @@ -347,13 +377,14 @@ name = "far stonehedge" }) "apN" = ( -/obj/structure/flora/grass/jungle/b, -/turf/closed/wall/mineral/rogue/decostone/mossy/blue{ - icon_state = "decostone-cand-blue" +/obj/structure/glowshroom{ + icon_state = "glowshroom2" }, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" +/obj/structure/spacevine/dendor, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors/exposed/church{ + first_time_text = "Druids Grove"; + name = "Grove" }) "aqh" = ( /obj/machinery/light/rogue/wallfire/candle/blue/r, @@ -448,6 +479,13 @@ }, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors/river) +"atW" = ( +/obj/structure/spacevine, +/obj/machinery/light/rogue/torchholder, +/turf/open/water/river{ + icon_state = "rockwd" + }, +/area/rogue/outdoors/river) "auh" = ( /obj/effect/decal/border/ruinedwood/inverted, /turf/open/floor/rogue/dirt/road, @@ -473,8 +511,8 @@ name = "Shores of the Emerald Coast" }) "auK" = ( +/obj/structure/closet/crate/chest/dungeon/mimic, /obj/effect/spawner/lootdrop/roguetown/dungeon/money, -/obj/structure/closet/crate/chest/dungeon/treasure, /turf/open/floor/rogue/naturalstone, /area/rogue/indoors/town/vault) "auO" = ( @@ -493,11 +531,22 @@ /turf/closed/wall/mineral/rogue/decostone/mossy/cand, /area/rogue/indoors/town/tavern) "avu" = ( -/obj/effect/landmark/events/haunts, -/turf/open/floor/rogue/dirt/road, +/turf/open/floor/rogue/cobble, /area/rogue/outdoors/rtfield{ first_time_text = null }) +"avB" = ( +/obj/structure/rack/rogue, +/obj/item/rogueweapon/sword/sabre, +/obj/item/rogueweapon/sword/sabre, +/obj/item/rogueweapon/huntingknife/idagger/steel, +/obj/item/rogueweapon/huntingknife/idagger/steel, +/obj/item/rogueweapon/huntingknife/idagger/steel, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "avG" = ( /obj/structure/fluff/railing/wood{ dir = 1; @@ -556,6 +605,16 @@ }, /turf/open/floor/rogue/blocks/green, /area/rogue/indoors/shelter/mountains) +"ayP" = ( +/obj/structure/mineral_door/wood/violet{ + lockid = "church"; + name = "Undercroft" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "azh" = ( /obj/structure/fluff/railing/wood{ dir = 4; @@ -740,10 +799,40 @@ /area/rogue/outdoors/exposed/tavern{ name = "Tavern Stables" }) +"aEn" = ( +/obj/structure/roguewindow/openclose{ + dir = 1 + }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, +/turf/open/floor/rogue/cobble/mossy, +/area/rogue/indoors/town/magician{ + first_time_text = "Ravenloft Academy"; + name = "Ravenloft Academy" + }) +"aEX" = ( +/obj/structure/chair/bench{ + dir = 4 + }, +/turf/open/floor/rogue/dirt, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "aFr" = ( /obj/machinery/light/rogue/wallfire/candle/blue/l, /turf/open/floor/rogue/hexstone, /area/rogue/indoors/town/bath) +"aFt" = ( +/obj/structure/closet/crate/chest/refilling/weapon, +/turf/open/water/cleanshallow, +/area/rogue/outdoors/caves) +"aFz" = ( +/obj/effect/mob_spawner/mossback, +/turf/open/water/cleanshallow, +/area/rogue/outdoors/caves) "aFA" = ( /obj/structure/fluff/railing/wood{ dir = 1; @@ -886,6 +975,7 @@ dir = 4 }, /obj/effect/decal/dirt, +/obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/cobble/mossy, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -935,6 +1025,13 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"aKv" = ( +/obj/item/reagent_containers/glass/cup/wooden, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "aKJ" = ( /obj/machinery/light/rogue/torchholder/l{ dir = 8 @@ -973,6 +1070,16 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"aMy" = ( +/obj/structure/table/wood{ + dir = 1; + icon_state = "longtable" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "aMz" = ( /obj/structure/flora/grass/jungle{ icon_state = "grassa1" @@ -1548,8 +1655,9 @@ name = "Shrine of Natures" }) "bhN" = ( +/obj/structure/closet/crate/chest/dungeon/treasure, +/obj/effect/spawner/trap, /obj/effect/spawner/lootdrop/roguetown/dungeon/money, -/obj/structure/closet/crate/chest/dungeon/mimic, /turf/open/floor/rogue/naturalstone, /area/rogue/indoors/town/vault) "biE" = ( @@ -1661,6 +1769,14 @@ first_time_text = "Shrine of Natures"; name = "Shrine of Natures" }) +"bmK" = ( +/obj/machinery/light/rogue/wallfire/candle/blue, +/obj/structure/chair/bench/church/smallbench, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "bnm" = ( /obj/structure/flora/roguetree/stump/log, /obj/effect/spawner/roguemap/tree, @@ -1782,13 +1898,9 @@ first_time_text = "Stonehedge" }) "brD" = ( -/obj/effect/landmark/start/priest, -/obj/structure/fluff/littlebanners/bluewhite, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) +/obj/structure/fermenting_barrel/water, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/shelter/bog) "brY" = ( /turf/open/water/river, /area/rogue/outdoors/caves) @@ -1891,6 +2003,10 @@ /area/rogue/under/cavewet/bogcaves) "bxo" = ( /obj/structure/bars/steel, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this." + }, /turf/open/water/swamp/deep, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -1988,13 +2104,20 @@ }) "bCD" = ( /obj/structure/closet/crate/roguecloset, +/obj/item/reagent_containers/glass/bottle/rogue/paralysispot, +/obj/item/reagent_containers/glass/bottle/rogue/soporpot, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/library) "bCN" = ( -/mob/living/simple_animal/hostile/rogue/skeleton/bow{ - name = "Skellter"; - faction = list("undead", "noble"ssssss) - }, +/obj/structure/rack/rogue, +/obj/item/rogueweapon/mace/cudgel, +/obj/item/storage/backpack/rogue/backpack/surgery, +/obj/item/rope/chain, +/obj/item/rope/chain, +/obj/item/rope/chain, +/obj/item/dildo/silver, +/obj/item/rogueweapon/mace/cudgel, +/obj/machinery/light/rogue/wallfire/candle/blue, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -2042,6 +2165,13 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"bFR" = ( +/obj/structure/stairs/stone, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "bGw" = ( /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/cobble/mossy, @@ -2251,6 +2381,13 @@ /obj/structure/fluff/statue/dragonr, /turf/open/water/cleanshallow, /area/rogue/outdoors/river) +"bOt" = ( +/obj/structure/bed/rogue/bedroll, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "bOu" = ( /obj/structure/flora/roguegrass/water/reeds, /turf/closed/wall/shroud, @@ -2262,7 +2399,8 @@ /obj/structure/closet/crate/chest, /obj/item/reagent_containers/food/snacks/grown/wheat, /obj/item/reagent_containers/food/snacks/grown/wheat, -/turf/open/floor/rogue/blocks/stonered/tiny, +/obj/structure/bars/grille, +/turf/open/transparent/openspace, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -2309,6 +2447,15 @@ /obj/structure/flora/roguegrass/water/reeds, /turf/open/floor/rogue/grass, /area/rogue/outdoors/river) +"bRi" = ( +/obj/structure/safeglowshroom{ + icon_state = "glowshroom3" + }, +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "bRj" = ( /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/shelter/bog) @@ -2403,6 +2550,14 @@ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" }) +"bUT" = ( +/obj/structure/flora/grass/jungle/b, +/obj/structure/spacevine/dendor, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors/exposed/church{ + first_time_text = "Druids Grove"; + name = "Grove" + }) "bVR" = ( /turf/open/floor/rogue/blocks/stone/stonepattern2, /area/rogue/outdoors/exposed/bath) @@ -2501,17 +2656,17 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) -"bYy" = ( -/obj/effect/landmark/event_spawn, -/turf/open/water/river{ - icon_state = "rockwd" - }, -/area/rogue/outdoors/river) "bYK" = ( -/obj/structure/flora/roguegrass, -/turf/open/floor/rogue/dirt, -/area/rogue/outdoors/rtfield{ - first_time_text = null +/obj/structure/mineral_door/wood/donjon{ + desc = "Armory"; + locked = 1; + lockid = "vault"; + name = "Treasury" + }, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" }) "bZv" = ( /obj/structure/flora/rogueshroom/happyrandom{ @@ -2640,6 +2795,16 @@ }, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/shelter/town) +"ces" = ( +/obj/structure/fluff/statue/gargoyle/moss/candles, +/obj/structure/fluff/psycross{ + name = "Divine Conduit" + }, +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "ceG" = ( /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/dirt/road, @@ -2800,10 +2965,19 @@ /turf/open/water/river, /area/rogue/outdoors/caves) "coD" = ( -/obj/structure/fluff/statue/tdummy, -/turf/open/floor/rogue/dirt/road, -/area/rogue/outdoors/rtfield{ - first_time_text = null +/obj/structure/rack/rogue, +/obj/item/rogueweapon/sword/estoc, +/obj/item/rogueweapon/sword/estoc, +/obj/item/rogueweapon/sword/rapier, +/obj/item/rogueweapon/sword/rapier, +/obj/item/clothing/head/roguetown/helmet/skullcap, +/obj/item/clothing/head/roguetown/helmet/skullcap, +/obj/item/clothing/head/roguetown/helmet/skullcap, +/obj/item/clothing/head/roguetown/helmet/skullcap, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" }) "coM" = ( /obj/structure/flora/roguegrass, @@ -2840,6 +3014,12 @@ }, /turf/open/floor/rogue/hexstone, /area/rogue/indoors/town/bath) +"cpy" = ( +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) "cqm" = ( /obj/structure/table/wood{ icon_state = "tablewood1" @@ -3152,6 +3332,15 @@ }, /turf/open/floor/rogue/dirt, /area/rogue/under/cavewet/bogcaves) +"cCV" = ( +/obj/structure/closet/dirthole/grave, +/obj/structure/flora/grass/jungle/b, +/obj/structure/gravemarker, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "cDz" = ( /turf/open/floor/rogue/dirt/ambush, /area/rogue/outdoors/river) @@ -3206,6 +3395,12 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"cGr" = ( +/obj/structure/well/fountain, +/turf/open/floor/rogue/cobble, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "cGx" = ( /obj/effect/decal/dirt{ dir = 1 @@ -3381,6 +3576,13 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"cNu" = ( +/obj/structure/bars/steel, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "cNM" = ( /obj/structure/flora/newtree, /obj/effect/decal/stone/mossy{ @@ -3511,6 +3713,13 @@ /obj/item/book/granter/spell/spells5e/boomingblade5e, /obj/item/book/granter/spell/spells5e/chilltouch5e, /obj/item/book/granter/spell/spells5e/bladeward5e, +/obj/structure/trap/fire{ + icon_state = "ward-red" + }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this." + }, /turf/open/floor/rogue/blocks/stone/stonepattern2, /area/rogue/indoors/town/library) "cTJ" = ( @@ -3525,7 +3734,16 @@ }) "cTS" = ( /obj/structure/roguewindow/openclose, -/obj/structure/bars/steel, +/obj/effect/forcefield{ + icon_state = "purplesparkles"; + name = "Warding Spell"; + desc = "It glimmers with potent magick!" + }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -3580,6 +3798,10 @@ }, /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors/river) +"cVC" = ( +/obj/structure/chair/bench/ultimacouch, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/shelter/town) "cVH" = ( /obj/structure/flora/roguegrass/water/reeds, /turf/open/water/cleanshallow, @@ -3593,6 +3815,12 @@ first_time_text = "Ravenloft Academy"; name = "Schoolgrounds" }) +"cVO" = ( +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "cWd" = ( /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/cobblerock, @@ -3655,6 +3883,10 @@ }, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors/caves) +"cXr" = ( +/obj/structure/closet/crate/chest/refilling/trait, +/turf/open/water/cleanshallow, +/area/rogue/outdoors/caves) "cXt" = ( /obj/structure/flora/roguegrass/water/reeds, /turf/open/water/river{ @@ -3876,10 +4108,14 @@ first_time_text = "The Twilight Woods" }) "dfJ" = ( -/obj/effect/landmark/events/haunts, -/turf/open/floor/rogue/grass, -/area/rogue/outdoors/rtfield{ - first_time_text = null +/obj/structure/closet/crate/drawer/inn, +/obj/item/natural/feather, +/obj/item/paper/scroll, +/obj/item/paper/scroll, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" }) "dfQ" = ( /obj/structure/flora/roguegrass/maneater/real{ @@ -3888,6 +4124,13 @@ /obj/structure/flora/roguegrass/water/reeds, /turf/open/water/swamp, /area/rogue/outdoors/river) +"dfT" = ( +/obj/structure/spacevine/dendor, +/turf/open/floor/rogue/shroud, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "dgg" = ( /obj/structure/fluff/railing/wood{ dir = 1; @@ -3901,6 +4144,16 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"dgn" = ( +/obj/structure/fluff/statue/gargoyle/moss, +/obj/structure/fluff/railing/border{ + dir = 8 + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "dgA" = ( /obj/item/natural/rock/cinnabar, /turf/open/floor/rogue/naturalstone, @@ -3976,11 +4229,11 @@ first_time_text = "The Dreamers Demesne.." }) "diM" = ( -/obj/structure/stairs/stone{ - dir = 4 - }, -/turf/open/floor/rogue/dirt, -/area/rogue/under/cavewet/bogcaves) +/obj/machinery/light/rogue/wallfire/candle/blue, +/obj/structure/roguemachine/camera, +/obj/effect/spawner/lootdrop/roguetown/dungeon/money, +/turf/open/floor/rogue/naturalstone, +/area/rogue/indoors/town/vault) "diU" = ( /obj/structure/flora/roguetree/stump/log, /turf/open/water/cleanshallow, @@ -4027,11 +4280,22 @@ dir = 1; icon_state = "longtable" }, +/obj/item/reagent_containers/glass/bowl, +/obj/item/reagent_containers/glass/bowl, +/obj/item/reagent_containers/glass/bowl, /turf/open/floor/rogue/blocks/stonered/tiny, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" }) +"dkn" = ( +/obj/structure/chair/bench{ + dir = 4 + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "dko" = ( /obj/structure/mineral_door/wood/window, /turf/open/floor/rogue/blocks/stone/stonepattern3, @@ -4069,6 +4333,14 @@ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" }) +"dlk" = ( +/obj/structure/closet/dirthole/closed, +/obj/structure/gravemarker, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "dlN" = ( /turf/closed/wall/mineral/rogue/stone/moss, /area/rogue/indoors/cave) @@ -4111,6 +4383,13 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"dmy" = ( +/obj/structure/safeglowshroom, +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "dmR" = ( /obj/structure/fluff/walldeco/wantedposter, /turf/open/floor/rogue/greenstone, @@ -4197,6 +4476,16 @@ /obj/structure/roguewindow/openclose{ dir = 4 }, +/obj/effect/forcefield{ + icon_state = "purplesparkles"; + name = "Warding Spell"; + desc = "It glimmers with potent magick!" + }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -4229,6 +4518,13 @@ /area/rogue/outdoors/rtfield{ first_time_text = null }) +"dqW" = ( +/obj/structure/closet/crate/coffin, +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "drI" = ( /obj/effect/landmark/events/haunts, /turf/open/floor/rogue/cobblerock, @@ -4314,6 +4610,13 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"dvC" = ( +/obj/structure/safeglowshroom, +/turf/open/water/cleanshallow, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "dvN" = ( /obj/structure/closet/crate/roguecloset/inn/south, /obj/item/kitchen/spoon/plastic, @@ -4343,6 +4646,13 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"dwm" = ( +/obj/structure/bookcase, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "dwn" = ( /obj/structure/flora/roguegrass, /obj/structure/glowshroom{ @@ -4438,15 +4748,12 @@ name = "Ravenloft Academy" }) "dzN" = ( -/obj/structure/closet/crate/chest, -/obj/item/scomstone, -/obj/item/scomstone, -/obj/item/scomstone, -/obj/item/scomstone, -/obj/item/scomstone, -/obj/item/scomstone, -/turf/open/floor/rogue/naturalstone, -/area/rogue/indoors/town/vault) +/obj/machinery/light/rogue/wallfire/candle/blue/l, +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "dzU" = ( /turf/open/floor/rogue/cobble/mossy, /area/rogue/indoors/town/bath{ @@ -4591,6 +4898,14 @@ }, /turf/open/floor/rogue/carpet, /area/rogue/indoors/town) +"dGW" = ( +/obj/structure/flora/grass/jungle{ + icon_state = "grassa1" + }, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "dGY" = ( /obj/structure/glowshroom{ icon_state = "glowshroom2" @@ -4607,6 +4922,16 @@ /area/rogue/outdoors/exposed/tavern{ name = "Tavern Stables" }) +"dHL" = ( +/obj/structure/bars/passage{ + name = "Holding Cell"; + redstone_id = "Hcell" + }, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "dId" = ( /obj/structure/stairs{ dir = 8 @@ -4718,7 +5043,7 @@ name = "Ravenloft Academy" }) "dOZ" = ( -/obj/structure/fluff/statue/tdummy, +/obj/structure/fluff/statue/tdummy2, /turf/open/floor/rogue/grass, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -5129,12 +5454,6 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) -"ebw" = ( -/obj/structure/stairs/stone{ - dir = 4 - }, -/turf/open/floor/rogue/dirt, -/area/rogue/outdoors/caves) "ebN" = ( /obj/structure/fluff/railing/wood{ dir = 4; @@ -5344,10 +5663,6 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) -"eju" = ( -/obj/effect/wisp, -/turf/open/floor/rogue/dirt/ambush, -/area/rogue/outdoors/caves) "ejZ" = ( /obj/structure/flora/ausbushes/sunnybush, /turf/open/floor/rogue/grass, @@ -5570,6 +5885,15 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) +"etP" = ( +/obj/item/reagent_containers/glass/bucket/wooden/spell_water, +/obj/item/natural/worms/leech, +/obj/item/natural/worms/leech/cheele, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "etX" = ( /obj/structure/flora/roguegrass, /obj/structure/flora/roguetree/happyrandom{ @@ -5725,10 +6049,6 @@ /area/rogue/indoors/town/bath{ first_time_text = "The Dreamers Demesne.." }) -"eAg" = ( -/obj/machinery/light/rogue/wallfire/candle/l, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/warehouse) "eAi" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/grass/jungle/b, @@ -5754,10 +6074,21 @@ /area/rogue/outdoors/woods{ first_time_text = "The Mountain Passe" }) +"eAD" = ( +/obj/structure/chair/stool/rogue, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "eAI" = ( /obj/item/natural/rock/gem, /turf/open/floor/rogue/naturalstone, /area/rogue/indoors/cave) +"eAR" = ( +/obj/effect/landmark/event_spawn, +/turf/open/water/cleanshallow, +/area/rogue/outdoors/river) "eBt" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/fermenting_barrel, @@ -5783,6 +6114,10 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"eCw" = ( +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, +/turf/open/floor/rogue/grass, +/area/rogue/indoors/shelter/bog) "eCy" = ( /obj/structure/flora/roguegrass/bush{ icon_state = "bush2" @@ -5828,10 +6163,7 @@ /turf/open/floor/carpet/red, /area/rogue/indoors/shelter/town) "eFh" = ( -/obj/item/bodypart/r_arm/rprosthetic/clock, -/obj/item/bodypart/l_leg/rprosthetic/clock, -/obj/item/bodypart/r_leg/rprosthetic/clock, -/obj/item/bodypart/l_arm/rprosthetic/clock, +/obj/structure/roguemachine/camera/left, /obj/effect/spawner/lootdrop/roguetown/dungeon/money, /turf/open/floor/rogue/naturalstone, /area/rogue/indoors/town/vault) @@ -5920,10 +6252,11 @@ /turf/open/floor/rogue/blocks/stone/stonepattern2, /area/rogue/indoors/town/library) "eJl" = ( -/obj/structure/flora/grass/jungle, -/turf/open/floor/rogue/grass, -/area/rogue/outdoors/rtfield{ - first_time_text = null +/obj/structure/fluff/statue/gargoyle/moss, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" }) "eJs" = ( /obj/structure/bed/rogue/inn/double, @@ -6002,6 +6335,13 @@ /obj/structure/flora/grass/jungle/b, /obj/machinery/light/rogue/wallfire/candle/blue/r, /turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) +"eLM" = ( +/obj/structure/spacevine/dendor, +/turf/open/floor/rogue/dirt, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" @@ -6043,6 +6383,9 @@ /area/rogue/indoors/town/bath) "eNl" = ( /obj/effect/wisp, +/obj/structure/flora/grass/jungle{ + icon_state = "grassa2" + }, /turf/open/transparent/glass, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; @@ -6064,6 +6407,14 @@ /obj/effect/mist, /turf/open/floor/rogue/dirt, /area/rogue/outdoors/caves) +"eOe" = ( +/obj/structure/lever/wall{ + dir = 8; + name = "Courtyard Portcullis"; + redstone_id = "rearmain" + }, +/turf/open/floor/rogue/blocks, +/area/rogue/indoors/shelter/bog) "eOm" = ( /obj/structure/fluff/statue/gargoyle/moss, /turf/open/floor/rogue/blocks/stone/stonepattern3, @@ -6139,6 +6490,11 @@ /obj/structure/roguewindow/stained/silver{ opacity = 0 }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/outdoors/river) "ePk" = ( @@ -6188,6 +6544,11 @@ }, /turf/open/floor/rogue/grass, /area/rogue/outdoors/exposed/bath) +"eRD" = ( +/obj/effect/landmark/start/bogguardsman, +/obj/structure/chair/stool/rogue, +/turf/open/floor/rogue/blocks, +/area/rogue/indoors/shelter/bog) "eRJ" = ( /obj/structure/closet/crate/chest/dungeon/mimic, /turf/open/floor/rogue/hexstone, @@ -6500,7 +6861,7 @@ }) "eZV" = ( /obj/structure/flora/grass/jungle/b, -/obj/structure/spacevine, +/obj/structure/fluff/statue/small, /turf/open/floor/rogue/blocks, /area/rogue/indoors/town/bath) "fah" = ( @@ -6583,16 +6944,6 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) -"fdl" = ( -/mob/living/simple_animal/hostile/rogue/skeleton/bow{ - name = "Vint"; - faction = list("undead", "noble"ssssss) - }, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "fdw" = ( /obj/structure/flora/newbranch/connector{ icon_state = "center-leaf1" @@ -6926,6 +7277,17 @@ "fro" = ( /turf/closed/mineral/rogue/bedrock, /area/rogue/indoors/shelter/town/roofs) +"frN" = ( +/obj/structure/closet/crate/chest, +/obj/item/rope/chain, +/obj/item/rope/chain, +/obj/item/rope, +/obj/item/rope, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "fsH" = ( /obj/structure/bearpelt, /turf/open/floor/rogue/ruinedwood/spiral, @@ -7160,6 +7522,13 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) +"fDe" = ( +/obj/effect/landmark/townpatrol, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "fDk" = ( /obj/structure/spider/stickyweb, /turf/open/floor/rogue/dirt, @@ -7237,6 +7606,13 @@ icon_state = "rockwd" }, /area/rogue/outdoors/river) +"fFQ" = ( +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "fFX" = ( /obj/structure/fluff/statue/knight/interior, /turf/open/floor/rogue/blocks/stone/stonepattern3, @@ -7586,6 +7962,14 @@ }, /turf/open/floor/rogue/twig/platform, /area/rogue/indoors/shelter/town) +"fVg" = ( +/obj/structure/closet/crate/coffin, +/obj/item/reagent_containers/glass/cup/silver, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "fVH" = ( /obj/structure/table/wood{ dir = 1; @@ -7610,6 +7994,15 @@ "fWg" = ( /obj/machinery/light/rogue/wallfire/candle/blue/l, /turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) +"fWY" = ( +/obj/item/burial_shroud, +/obj/structure/rack/rogue, +/obj/item/rogueweapon/shovel, +/turf/open/floor/rogue/cobblerock, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" @@ -7689,21 +8082,11 @@ first_time_text = "The Twilight Woods" }) "fZA" = ( -/obj/structure/roguemachine/vendor{ - keycontrol = "steward" - }, /obj/effect/decal/stone/blockedge, -/obj/effect/decal/stone/blockedge/blockedgeinvert, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/obj/item/scomstone/bad, -/turf/open/floor/rogue/ruinedwood/spiral, +/obj/structure/table/wood{ + icon_state = "tablewood1" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -7747,8 +8130,9 @@ /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town) "gar" = ( +/obj/structure/closet/crate/roguecloset, /turf/open/floor/rogue/blocks/stone/stonepattern2, -/area/rogue/indoors/town/warehouse) +/area/rogue/indoors/shelter/town) "gaZ" = ( /obj/structure/fluff/alch, /turf/open/floor/rogue/ruinedwood/spiral, @@ -7776,15 +8160,6 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) -"gbX" = ( -/obj/structure/chair/bench{ - dir = 8 - }, -/obj/effect/landmark/start/gravedigger, -/turf/open/floor/rogue/dirt/road, -/area/rogue/outdoors{ - first_time_text = "Stonehedge" - }) "gbY" = ( /obj/machinery/light/rogue/hearth, /obj/item/cooking/pan, @@ -7876,13 +8251,11 @@ }, /area/rogue/outdoors/river) "geQ" = ( -/obj/structure/flora/grass/jungle{ - icon_state = "grassa1" - }, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" +/obj/structure/chair/bench/couchablack, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" }) "gfe" = ( /obj/structure/flora/grass/jungle/b, @@ -8458,11 +8831,11 @@ first_time_text = "The Mountain Passe" }) "gGI" = ( -/obj/structure/flora/grass/jungle, -/turf/open/floor/rogue/grass, -/area/rogue/outdoors{ - first_time_text = "Stonehedge Borders"; - name = "far stonehedge" +/obj/machinery/light/rogue/wallfire/candle/blue, +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" }) "gHc" = ( /mob/living/simple_animal/butterfly, @@ -8477,6 +8850,15 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) +"gHx" = ( +/obj/structure/table/wood{ + icon_state = "longtable" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "gHF" = ( /obj/effect/decal/dirt{ dir = 1 @@ -8491,6 +8873,21 @@ }, /turf/open/floor/rogue/cobble, /area/rogue/indoors/shelter/town) +"gHR" = ( +/obj/item/natural/bundle/stick, +/obj/item/natural/bundle/stick, +/turf/open/floor/rogue/blocks/stone/stonepattern2, +/area/rogue/indoors/town/magician{ + first_time_text = "Ravenloft Academy"; + name = "Ravenloft Academy" + }) +"gIe" = ( +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/rogue/cobble, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "gIm" = ( /obj/structure/glowshroom, /turf/open/floor/rogue/grass, @@ -8507,6 +8904,13 @@ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" }) +"gIK" = ( +/obj/structure/closet/crate/coffin, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "gJm" = ( /obj/machinery/light/rogue/torchholder{ dir = 4 @@ -8536,6 +8940,14 @@ /obj/effect/landmark/start/bogguardsman, /turf/open/floor/rogue/blocks, /area/rogue/indoors/shelter/bog) +"gKW" = ( +/obj/structure/flora/newbranch/connector{ + dir = 1 + }, +/turf/open/transparent/openspace, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) "gLu" = ( /turf/closed/wall/mineral/rogue/decostone/end{ dir = 1 @@ -8566,6 +8978,19 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"gNI" = ( +/obj/structure/table/wood{ + dir = 1; + icon_state = "longtable_mid" + }, +/obj/structure/fluff/psycross{ + name = "Divine Conduit" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "gNW" = ( /obj/structure/flora/roguegrass/water/reeds, /obj/structure/glowshroom{ @@ -8591,6 +9016,13 @@ "gPq" = ( /turf/closed/mineral/random/rogue/high, /area/rogue/indoors/cave) +"gQG" = ( +/obj/item/clothing/wrists/roguetown/bracers/leather, +/obj/item/clothing/wrists/roguetown/bracers/leather, +/obj/item/clothing/wrists/roguetown/bracers, +/obj/item/clothing/wrists/roguetown/bracers, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/warehouse) "gQR" = ( /obj/structure/roguemachine/scomm/r, /obj/structure/flora/grass/jungle/b, @@ -8706,6 +9138,13 @@ /mob/living/simple_animal/hostile/retaliate/rogue/spider, /turf/open/floor/rogue/cobble/mossy, /area/rogue/under/cavewet/bogcaves) +"gXv" = ( +/obj/structure/table/wood{ + icon_state = "longtable" + }, +/obj/machinery/light/rogue/torchholder/l, +/turf/open/floor/rogue/blocks, +/area/rogue/indoors/shelter/bog) "gXN" = ( /obj/structure/flora/roguegrass/water/reeds, /obj/structure/flora/roguetree/happyrandom{ @@ -8753,6 +9192,10 @@ /obj/item/roguekey/blacksmith, /turf/open/floor/rogue/carpet, /area/rogue/indoors/shelter/town) +"gYE" = ( +/obj/structure/closet/crate/chest/refilling/treasure, +/turf/open/water/cleanshallow, +/area/rogue/outdoors/caves) "gYJ" = ( /obj/structure/flora/grass/jungle, /turf/closed/mineral/rogue/bedrock, @@ -8777,6 +9220,12 @@ dir = 1 }, /turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) +"gZN" = ( +/obj/effect/landmark/events/haunts, +/turf/open/floor/rogue/cobblerock, /area/rogue/outdoors/rtfield{ first_time_text = null }) @@ -8845,6 +9294,13 @@ icon_state = "rockwd" }, /area/rogue/outdoors/caves) +"hep" = ( +/obj/structure/bars/steel, +/turf/open/water/cleanshallow, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "heK" = ( /turf/open/water/bath, /area/rogue/indoors/shelter/bog) @@ -8924,6 +9380,12 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"hhP" = ( +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "hhT" = ( /obj/structure/fluff/clock{ pixel_y = 20 @@ -8943,6 +9405,20 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) +"hio" = ( +/obj/structure/roguewindow/stained/silver{ + opacity = 0 + }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, +/turf/open/floor/rogue/twig, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "his" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/chair/bench/church/smallbench{ @@ -8985,7 +9461,16 @@ /obj/structure/roguewindow/openclose{ dir = 1 }, -/obj/structure/bars/steel, +/obj/effect/forcefield{ + icon_state = "purplesparkles"; + name = "Warding Spell"; + desc = "It glimmers with potent magick!" + }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -9035,15 +9520,6 @@ /area/rogue/outdoors/rtfield{ first_time_text = null }) -"hlx" = ( -/obj/item/roguebin/trash{ - name = "Offerings" - }, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) "hlz" = ( /obj/structure/stairs{ dir = 8 @@ -9188,6 +9664,13 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"hqu" = ( +/obj/structure/closet/crate/coffin, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "hqE" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/ausbushes/palebush, @@ -9235,6 +9718,17 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"hta" = ( +/obj/effect/spawner/lootdrop/roguetown/dungeon/money, +/obj/item/bodypart/l_arm/rprosthetic/clock, +/obj/item/bodypart/r_leg/rprosthetic/clock, +/obj/item/bodypart/l_leg/rprosthetic/clock, +/obj/item/bodypart/r_arm/rprosthetic/clock, +/obj/item/signal_horn/blasting{ + name = "Enchanted Horn" + }, +/turf/open/floor/rogue/naturalstone, +/area/rogue/indoors/town/vault) "htw" = ( /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/rooftop{ @@ -9277,6 +9771,14 @@ name = "Seawater" }, /area/rogue/under/cavewet) +"huN" = ( +/obj/structure/fluff/railing/border, +/turf/open/floor/rogue/twig{ + dir = 4 + }, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) "huR" = ( /obj/structure/flora/roguegrass, /obj/structure/flora/ausbushes/ppflowers, @@ -9373,11 +9875,6 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) -"hyR" = ( -/obj/effect/mist, -/obj/structure/spawner/invisible/monster/minotaur, -/turf/open/floor/rogue/dirt, -/area/rogue/outdoors/caves) "hze" = ( /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/dirt, @@ -9419,6 +9916,20 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"hAi" = ( +/obj/item/clothing/cloak/stabard, +/obj/item/clothing/cloak/stabard, +/obj/item/clothing/cloak/stabard, +/obj/item/clothing/suit/roguetown/armor/chainmail, +/obj/item/clothing/suit/roguetown/armor/chainmail, +/obj/item/clothing/neck/roguetown/chaincoif/iron, +/obj/item/clothing/neck/roguetown/chaincoif/iron, +/obj/item/clothing/neck/roguetown/chaincoif/iron, +/obj/item/clothing/neck/roguetown/chaincoif/iron, +/obj/item/clothing/suit/roguetown/armor/chainmail, +/obj/item/clothing/suit/roguetown/armor/chainmail, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/warehouse) "hAj" = ( /obj/effect/decal/cleanable/cobweb, /obj/structure/closet/crate/roguecloset/inn/south, @@ -9473,13 +9984,6 @@ /obj/structure/fluff/littlebanners/greenblue, /turf/open/floor/rogue/grass, /area/rogue/outdoors/river) -"hCp" = ( -/obj/structure/bars/cemetery, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "hCL" = ( /obj/structure/flora/roguetree/stump/log, /turf/open/floor/rogue/naturalstone, @@ -9586,6 +10090,8 @@ "hGM" = ( /obj/structure/closet/crate/roguecloset/dark, /obj/item/book/granter/spell/spells5e/mending5e, +/obj/item/reagent_containers/food/snacks/store/cheesewheel, +/obj/item/reagent_containers/food/snacks/rogue/cheddar/aged, /turf/open/floor/rogue/blocks/stone/stonepattern2, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -9755,6 +10261,10 @@ /obj/structure/bed/rogue/inn/hay, /turf/open/floor/rogue/twig, /area/rogue/indoors/shelter/rtfield) +"hOu" = ( +/obj/item/storage/backpack/rogue/backpack/surgery, +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/shelter/bog) "hOZ" = ( /obj/structure/flora/grass/jungle{ icon_state = "grassa2" @@ -10067,6 +10577,15 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"iac" = ( +/obj/machinery/light/rogue/torchholder{ + dir = 4 + }, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "iaH" = ( /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town) @@ -10327,6 +10846,7 @@ /obj/item/reagent_containers/glass/bottle/rogue/manapot, /obj/item/reagent_containers/glass/bottle/rogue/manapot, /obj/item/reagent_containers/glass/bottle/rogue/manapot, +/obj/item/scrying, /turf/open/floor/bronze, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -10643,6 +11163,7 @@ /obj/effect/decal/dirt{ dir = 4 }, +/mob/living/carbon/human/species/human/smartnpc/townguard, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -10798,6 +11319,12 @@ "iDn" = ( /turf/open/floor/rogue/naturalstone, /area/rogue) +"iDC" = ( +/turf/closed/wall/shroud, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "iDK" = ( /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/outdoors/exposed/magiciantower{ @@ -11052,6 +11579,16 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) +"iQi" = ( +/obj/structure/table/wood{ + dir = 1; + icon_state = "longtable" + }, +/obj/machinery/light/rogue/torchholder/l{ + dir = 8 + }, +/turf/open/floor/rogue/blocks, +/area/rogue/indoors/shelter/bog) "iQZ" = ( /obj/structure/fermenting_barrel/water, /obj/structure/fluff/railing/wood{ @@ -11157,6 +11694,14 @@ }, /turf/closed/wall/mineral/rogue/stone/moss, /area/rogue/indoors/shelter/bog) +"iVn" = ( +/obj/structure/chair/bench{ + dir = 8 + }, +/turf/open/floor/rogue/dirt/road, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "iVv" = ( /obj/effect/wisp, /obj/structure/fluff/railing/wood{ @@ -11211,6 +11756,8 @@ /obj/item/reagent_containers/glass/bottle/rogue/manapot, /obj/item/reagent_containers/glass/bottle/rogue/manapot, /obj/item/reagent_containers/glass/bottle/rogue/manapot, +/obj/item/reagent_containers/glass/bottle/rogue/swiftnesspot, +/obj/item/reagent_containers/glass/bottle/rogue/virilitypot, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/library) "iYe" = ( @@ -11484,6 +12031,13 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"jja" = ( +/obj/structure/spacevine/dendor, +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "jkg" = ( /obj/machinery/light/rogue/oven/south, /turf/open/floor/rogue/tile, @@ -11660,6 +12214,25 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"jtN" = ( +/obj/structure/roguewindow/openclose{ + dir = 4 + }, +/obj/effect/forcefield{ + icon_state = "purplesparkles"; + name = "Warding Spell"; + desc = "It glimmers with potent magick!" + }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern2, +/area/rogue/indoors/town/magician{ + first_time_text = "Ravenloft Academy"; + name = "Ravenloft Academy" + }) "jud" = ( /obj/structure/flora/roguegrass/bush, /obj/structure/flora/grass/jungle/b, @@ -11699,11 +12272,9 @@ /turf/open/floor/rogue/blocks/stonered/tiny, /area/rogue/indoors/shelter/town) "juB" = ( -/obj/machinery/light/rogue/torchholder/l{ - dir = 8 - }, -/turf/open/floor/rogue/blocks, -/area/rogue/indoors/shelter/bog) +/mob/living/simple_animal/hostile/rogue/skeleton/guard/xbow/playersentry, +/turf/open/floor/rogue/greenstone, +/area/rogue/under/cavewet) "juO" = ( /obj/structure/closet/crate/roguecloset/inn/south, /obj/item/dildo/silver, @@ -11720,6 +12291,19 @@ /obj/structure/spacevine, /turf/open/floor/rogue/naturalstone, /area/rogue/under/cavewet/bogcaves) +"jwm" = ( +/obj/structure/rack/rogue, +/obj/item/rogueweapon/sword/cutlass, +/obj/item/rogueweapon/sword/cutlass, +/obj/item/rogueweapon/mace, +/obj/item/rogueweapon/mace, +/obj/item/rogueweapon/shield/tower, +/obj/item/rogueweapon/shield/tower, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "jwr" = ( /obj/structure/fluff/traveltile/forest{ aportalgoesto = "forest3"; @@ -11730,8 +12314,8 @@ first_time_text = "The Mountain Passe" }) "jwv" = ( -/obj/structure/stairs/stone, -/turf/open/floor/rogue/dirt, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/rogue/cobble, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; name = "far stonehedge" @@ -12020,13 +12604,10 @@ /area/rogue/indoors/shelter/bog) "jFL" = ( /obj/structure/flora/grass/jungle/b, -/obj/structure/flora/roguetree/happyrandom{ - desc = "An old, beloved tree that even elves could love."; - icon_state = "t3" - }, -/turf/open/floor/rogue/grass, -/area/rogue/outdoors/rtfield{ - first_time_text = null +/obj/structure/spacevine/dendor, +/turf/open/floor/rogue/dirt/road, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" }) "jGg" = ( /obj/structure/mineral_door/wood{ @@ -12114,6 +12695,14 @@ /turf/open/floor/rogue/rooftop/green{ dir = 8 }, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) +"jJw" = ( +/obj/structure/flora/wildplant/wild_herbs, +/obj/structure/spacevine/dendor, +/turf/open/floor/rogue/grass, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; name = "far stonehedge" @@ -12226,6 +12815,7 @@ /obj/structure/fluff/railing/wood{ dir = 4 }, +/obj/structure/spacevine/dendor, /turf/open/floor/rogue/shroud, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -12530,6 +13120,15 @@ dir = 4 }, /area/rogue/indoors/town) +"jXl" = ( +/obj/structure/fluff/walldeco/steward{ + name = "Appraiser Within" + }, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "jXx" = ( /obj/structure/fluff/statue/pillar{ name = "Wooden Support" @@ -12538,6 +13137,10 @@ /area/rogue/outdoors/rtfield{ first_time_text = null }) +"jYU" = ( +/obj/effect/mob_spawner/mossback, +/turf/open/water/cleanshallow, +/area/rogue/outdoors/river) "jYV" = ( /obj/structure/flora/roguegrass/water, /obj/item/natural/stone, @@ -12551,6 +13154,8 @@ /obj/item/grown/log/tree/small, /obj/item/grown/log/tree/small, /obj/item/grown/log/tree/small, +/mob/living/simple_animal/hostile/retaliate/rogue/saigabuck/tame, +/obj/structure/bed/rogue/inn/hay, /turf/open/floor/rogue/dirt, /area/rogue/indoors/shelter/bog) "jZo" = ( @@ -12633,7 +13238,7 @@ first_time_text = "The Twilight Woods" }) "kcf" = ( -/obj/structure/fluff/statue/lewd, +/obj/structure/fluff/statue/small, /turf/open/floor/rogue/blocks, /area/rogue/indoors/town/bath) "kct" = ( @@ -12686,6 +13291,16 @@ /obj/structure/roguewindow/openclose{ dir = 8 }, +/obj/effect/forcefield{ + icon_state = "purplesparkles"; + name = "Warding Spell"; + desc = "It glimmers with potent magick!" + }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/outdoors/exposed/magiciantower{ first_time_text = "Ravenloft Academy"; @@ -12716,6 +13331,13 @@ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" }) +"kfa" = ( +/obj/effect/landmark/townpatrol, +/turf/open/floor/rogue/dirt/road, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "kfO" = ( /obj/structure/flora/roguegrass/bush, /obj/machinery/light/rogue/wallfire/candle/blue, @@ -12745,6 +13367,18 @@ first_time_text = "Druids Grove"; name = "Grove" }) +"kgd" = ( +/obj/structure/rack/rogue, +/obj/item/rogueweapon/shield/tower/metal, +/obj/item/rogueweapon/shield/tower/metal, +/obj/item/rogueweapon/sword/falchion, +/obj/item/rogueweapon/sword/falchion, +/obj/machinery/light/rogue/wallfire/candle/blue, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "kgp" = ( /obj/effect/wisp, /turf/open/floor/rogue/grass, @@ -12832,6 +13466,12 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"kiG" = ( +/obj/structure/trap/fire{ + icon_state = "ward-red" + }, +/turf/open/water/swamp, +/area/rogue/outdoors/caves) "kjh" = ( /obj/structure/fluff/railing/wood{ dir = 1; @@ -12962,6 +13602,14 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) +"kno" = ( +/obj/effect/wisp, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "knB" = ( /obj/structure/flora/rogueshroom2, /turf/open/floor/rogue/dirt/nrich, @@ -12975,11 +13623,6 @@ }, /turf/open/floor/rogue/grass, /area/rogue/under/cavewet/bogcaves) -"knX" = ( -/obj/structure/closet/dirthole/closed/loot, -/obj/structure/gravemarker, -/turf/open/floor/rogue/dirt, -/area/rogue/outdoors/river) "koq" = ( /obj/structure/crabnest, /turf/open/water/cleanshallow, @@ -12994,6 +13637,9 @@ "kpm" = ( /obj/structure/closet/crate/chest, /obj/item/cooking/pan, +/obj/item/kitchen/rollingpin, +/obj/item/rogueweapon/huntingknife/stoneknife, +/obj/item/rogueweapon/huntingknife/stoneknife, /turf/open/floor/rogue/blocks/stonered/tiny, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -13113,10 +13759,22 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"ktL" = ( +/obj/effect/landmark/start/gravedigger, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "ktN" = ( /obj/machinery/light/rogue/hearth, /turf/open/floor/rogue/blocks/green, /area/rogue/indoors/shelter/mountains) +"ktO" = ( +/obj/structure/bed/rogue/inn/wool, +/obj/effect/landmark/start/shophand, +/turf/open/floor/rogue/blocks/stone/stonepattern2, +/area/rogue/indoors/shelter/town) "ktX" = ( /turf/open/floor/rogue/rooftop{ dir = 1 @@ -13170,6 +13828,15 @@ /obj/structure/flora/ausbushes/ywflowers, /turf/open/floor/rogue/grass, /area/rogue/outdoors/river) +"kwu" = ( +/obj/structure/safeglowshroom{ + icon_state = "glowshroom3" + }, +/turf/open/water/cleanshallow, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "kwE" = ( /turf/closed/mineral/random/rogue/med, /area/rogue/outdoors/caves) @@ -13206,9 +13873,11 @@ first_time_text = "The Dreamers Demesne.." }) "kAr" = ( -/mob/living/simple_animal/hostile/retaliate/rogue/mossback, -/turf/open/floor/rogue/dirt/ambush, -/area/rogue/outdoors/river) +/turf/open/floor/rogue/greenstone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "kAv" = ( /turf/closed, /area/rogue/outdoors/beach{ @@ -13311,6 +13980,14 @@ /obj/structure/flora/ausbushes/lavendergrass, /turf/open/floor/rogue/grass, /area/rogue/outdoors/river) +"kEw" = ( +/obj/structure/chair/bench{ + dir = 1 + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "kEE" = ( /obj/structure/rack/rogue{ pixel_y = 2 @@ -13431,6 +14108,8 @@ }) "kHF" = ( /obj/structure/closet/crate/chest, +/obj/item/reagent_containers/glass/bottle/rogue/fortitudepot, +/obj/item/reagent_containers/glass/bottle/rogue/luckpot, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/library) "kHH" = ( @@ -13445,14 +14124,11 @@ /turf/open/floor/rogue/greenstone, /area/rogue/indoors/shelter/bog) "kHI" = ( -/obj/structure/roguemachine/drugmachine{ - icon_state = "submit_anim"; - name = "UNDERMARKET VENDOR" - }, -/turf/closed/wall/mineral/rogue/wooddark/slitted, -/area/rogue/outdoors/beach{ - first_time_text = "Emerald Shores"; - name = "Shores of the Emerald Coast" +/obj/structure/spacevine/dendor, +/turf/open/floor/rogue/dirt, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" }) "kHM" = ( /obj/structure/flora/grass/jungle/b, @@ -13525,9 +14201,13 @@ first_time_text = "Stonehedge" }) "kMT" = ( -/obj/structure/fluff/statue/small, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/bath) +/obj/effect/landmark/events/haunts, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "kNb" = ( /obj/structure/flora/newbranch/connector{ dir = 5; @@ -13574,6 +14254,13 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"kOv" = ( +/mob/living/carbon/human/species/human/smartnpc/townguard, +/turf/open/floor/rogue/dirt, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "kOC" = ( /obj/structure/spacevine, /turf/closed/wall/mineral/rogue/stone/moss, @@ -13787,6 +14474,17 @@ /area/rogue/indoors/town/bath{ first_time_text = "The Dreamers Demesne.." }) +"kUu" = ( +/obj/item/clothing/suit/roguetown/armor/leather/studded, +/obj/item/clothing/suit/roguetown/armor/leather/studded, +/obj/item/clothing/under/roguetown/chainlegs/iron/studdedskirt, +/obj/item/clothing/under/roguetown/chainlegs/iron/studdedskirt, +/obj/structure/rack/rogue, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "kUS" = ( /obj/structure/flora/ausbushes/ppflowers, /turf/open/floor/rogue/dirt/road, @@ -13887,8 +14585,8 @@ name = "Shores of the Emerald Coast" }) "laG" = ( -/obj/structure/flora/grass/jungle/b, -/turf/open/floor/rogue/dirt, +/obj/structure/fluff/statue/tdummy2, +/turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/outdoors/rtfield{ first_time_text = null }) @@ -13993,6 +14691,15 @@ /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/greenstone, /area/rogue/indoors/shelter/mountains) +"lgP" = ( +/obj/structure/closet/crate/chest, +/obj/item/storage/roguebag, +/obj/item/storage/roguebag, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "lgU" = ( /turf/closed/wall/mineral/rogue/wooddark{ icon_state = "wooddark-k" @@ -14168,13 +14875,6 @@ /obj/structure/spawner/invisible/monster/mossback, /turf/open/water/swamp, /area/rogue/outdoors/caves) -"lmb" = ( -/obj/structure/fermenting_barrel/water, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "lme" = ( /obj/structure/fluff/railing/border{ dir = 6 @@ -14516,6 +15216,11 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) +"lCr" = ( +/obj/machinery/light/rogue/firebowl/standing/blue, +/obj/structure/spacevine, +/turf/open/floor/rogue/tile/bath, +/area/rogue/indoors/town/bath) "lCH" = ( /obj/machinery/light/rogue/torchholder{ dir = 8 @@ -14640,13 +15345,14 @@ name = "far stonehedge" }) "lIq" = ( -/obj/structure/lever/wall{ - dir = 8; - name = "Bogpath Gates"; - redstone_id = "rearmain" +/obj/structure/fluff/railing/border, +/turf/open/transparent/openspace, +/turf/open/floor/rogue/twig{ + dir = 4 }, -/turf/open/floor/rogue/herringbone, -/area/rogue/indoors/shelter/bog) +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) "lIv" = ( /obj/structure/rack/rogue, /obj/item/book/rogue/cooking, @@ -14706,6 +15412,16 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) +"lLf" = ( +/obj/structure/table/church{ + icon_state = "churchtable_end" + }, +/obj/item/rogueweapon/huntingknife/idagger/silver, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "lLg" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/newtree, @@ -14764,6 +15480,13 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"lPg" = ( +/obj/machinery/light/rogue/wallfire/candle/blue, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "lPh" = ( /obj/structure/table/wood{ dir = 10; @@ -14780,6 +15503,7 @@ "lRd" = ( /obj/structure/closet/crate/roguecloset/dark, /obj/item/slimepotion/lovepotion, +/obj/item/scrying, /turf/open/floor/bronze, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -14891,9 +15615,17 @@ name = "Ravenloft Academy" }) "lWm" = ( -/obj/structure/fermenting_barrel/random/beer, -/turf/open/floor/rogue/blocks, -/area/rogue/indoors/shelter/bog) +/obj/structure/fluff/railing/border{ + dir = 1; + pixel_x = -4 + }, +/turf/open/transparent/openspace, +/turf/open/floor/rogue/twig{ + dir = 4 + }, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) "lXv" = ( /obj/structure/fluff/walldeco/stone, /turf/closed/wall/mineral/rogue/decowood, @@ -14969,7 +15701,11 @@ /obj/structure/roguewindow/openclose{ dir = 4 }, -/obj/structure/bars/steel, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/cobble/mossy, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -15011,10 +15747,13 @@ name = "far stonehedge" }) "may" = ( -/obj/structure/mineral_door/bars{ - locked = 1; - lockid = "vault" - }, +/obj/structure/rack/rogue, +/obj/item/rogueweapon/flail, +/obj/item/rogueweapon/flail, +/obj/item/rogueweapon/duster, +/obj/item/rogueweapon/duster, +/obj/item/rogueweapon/duster, +/obj/item/rogueweapon/spear/billhook, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -15024,6 +15763,13 @@ /obj/structure/chair/stool/rogue, /turf/open/floor/rogue/naturalstone, /area/rogue/outdoors/caves) +"mba" = ( +/obj/structure/roguetent, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "mbk" = ( /obj/structure/fluff/railing/wood{ dir = 4; @@ -15113,6 +15859,11 @@ /obj/structure/roguewindow/stained/silver{ opacity = 0 }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/transparent/openspace, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; @@ -15173,6 +15924,13 @@ }, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/bath) +"mks" = ( +/obj/structure/fermenting_barrel/water, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "mkx" = ( /turf/closed/mineral/rogue/coal, /area/rogue/outdoors/caves) @@ -15584,7 +16342,7 @@ /obj/item/paper, /obj/item/paper, /obj/item/paper, -/turf/open/floor/rogue/ruinedwood/spiral, +/turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -15669,6 +16427,16 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) +"mAH" = ( +/obj/structure/lever{ + name = "Holding Cell Lever"; + redstone_id = "Hcell" + }, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "mAI" = ( /obj/structure/spacevine, /turf/open/transparent/openspace, @@ -16060,6 +16828,13 @@ /obj/machinery/light/rogue/campfire/densefire, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors/caves) +"mOd" = ( +/obj/structure/flora/grass/jungle/b, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, +/turf/open/floor/rogue/dirt, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "mOu" = ( /obj/effect/decal/border/ruinedwood{ dir = 8 @@ -16462,8 +17237,8 @@ first_time_text = "The Twilight Woods" }) "nfv" = ( -/obj/structure/flora/grass/jungle{ - icon_state = "grassa2" +/obj/structure/fluff/railing/border{ + dir = 8 }, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/church/chapel{ @@ -16633,6 +17408,23 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"nmf" = ( +/obj/structure/lever/wall{ + dir = 4; + redstone_id = "Advarmory"; + name = "Armory" + }, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) +"nmp" = ( +/turf/closed/wall/mineral/rogue/decostone/mossy/cand, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "nmt" = ( /obj/effect/landmark/start/barkeep, /mob/living/simple_animal/pet/cat{ @@ -16647,6 +17439,8 @@ /obj/machinery/light/rogue/torchholder/l{ dir = 8 }, +/mob/living/simple_animal/hostile/retaliate/rogue/saigabuck/tame, +/obj/structure/bed/rogue/inn/hay, /turf/open/floor/rogue/naturalstone, /area/rogue/indoors/shelter/bog) "nmS" = ( @@ -16740,10 +17534,6 @@ }, /turf/open/floor/rogue/grass, /area/rogue/outdoors/river) -"nqF" = ( -/obj/structure/spawner/invisible/monster/mossback, -/turf/open/water/cleanshallow, -/area/rogue/outdoors/caves) "nqU" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/ausbushes/sparsegrass, @@ -16865,6 +17655,14 @@ /obj/structure/bars/tough, /turf/open/transparent/openspace, /area/rogue) +"nvL" = ( +/obj/structure/closet/dirthole/grave, +/obj/structure/gravemarker, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "nvO" = ( /obj/machinery/light/rogue/torchholder{ dir = 1; @@ -17027,6 +17825,12 @@ }, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/shelter/town) +"nBi" = ( +/mob/living/carbon/human/species/human/smartnpc/townguard/brute, +/turf/open/floor/rogue/cobble/mossy, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "nBZ" = ( /obj/structure/chair/wood/rogue{ dir = 8 @@ -17159,6 +17963,26 @@ /area/rogue/indoors/town/bath{ first_time_text = "The Dreamers Demesne.." }) +"nGq" = ( +/obj/structure/flora/grass/jungle/b, +/obj/structure/fluff/railing/border{ + dir = 8 + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) +"nGA" = ( +/obj/structure/bars/passage{ + name = "Armory"; + redstone_id = "Advarmory" + }, +/turf/open/floor/rogue/blocks/bluestone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "nGJ" = ( /obj/structure/spacevine, /turf/open/floor/rogue/naturalstone, @@ -17258,12 +18082,11 @@ /turf/open/floor/rogue/blocks/green, /area/rogue/outdoors/river) "nLN" = ( -/obj/structure/roguewindow/openclose, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/magician{ - first_time_text = "Ravenloft Academy"; - name = "Ravenloft Academy" - }) +/obj/structure/trap/fire{ + icon_state = "ward-red" + }, +/turf/open/water/swamp/deep, +/area/rogue/outdoors/caves) "nLS" = ( /obj/structure/chair/bench/church/smallbench{ dir = 8 @@ -17659,6 +18482,14 @@ /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/cobble/mossy, /area/rogue/outdoors/exposed/tavern) +"nYE" = ( +/obj/structure/flora/grass/jungle/b, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "nYV" = ( /obj/structure/flora/newleaf{ icon_state = "center-leaf2" @@ -17956,11 +18787,21 @@ first_time_text = "Shrine of Natures"; name = "Shrine of Natures" }) +"orJ" = ( +/obj/structure/fermenting_barrel/water, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "orU" = ( -/obj/machinery/light/rogue/wallfire/candle/blue/r, -/obj/structure/fluff/statue/small, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/bath) +/turf/open/transparent/openspace, +/turf/open/floor/rogue/twig{ + dir = 4 + }, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) "osH" = ( /turf/open/floor/rogue/cobble, /area/rogue/outdoors/river) @@ -17993,9 +18834,25 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"otA" = ( +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "otT" = ( /turf/closed/wall/mineral/rogue/wooddark, /area/rogue/indoors/town) +"oum" = ( +/obj/item/burial_shroud, +/obj/structure/rack/rogue, +/obj/item/rogueweapon/shovel, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "ouB" = ( /obj/structure/stairs/stone, /turf/open/floor/rogue/blocks/green, @@ -18044,6 +18901,10 @@ /area/rogue/outdoors/river) "oxl" = ( /obj/structure/bars/steel, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this." + }, /turf/open/water/swamp, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -18257,6 +19118,15 @@ /area/rogue/outdoors{ first_time_text = "Stonehedge" }) +"oGb" = ( +/obj/structure/flora/newbranch/connector{ + dir = 2; + icon_state = "branch-end2" + }, +/turf/open/transparent/openspace, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) "oGD" = ( /obj/structure/glowshroom, /turf/open/floor/rogue/grass, @@ -18389,15 +19259,6 @@ /obj/structure/flora/roguegrass/water/reeds, /turf/open/water/swamp/deep, /area/rogue/under/cavewet/bogcaves) -"oKt" = ( -/obj/machinery/light/rogue/torchholder{ - dir = 4 - }, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "oKu" = ( /obj/structure/flora/newtree, /turf/open/water/cleanshallow, @@ -18454,7 +19315,11 @@ /obj/structure/roguewindow/openclose{ dir = 8 }, -/obj/structure/bars/steel, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/cobble/mossy, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -18543,16 +19408,20 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"oSq" = ( +/obj/structure/closet/dirthole/closed/loot, +/obj/structure/gravemarker, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "oSr" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/fluff/statue/knight/interior, /obj/machinery/light/rogue/firebowl/standing/blue, /turf/open/floor/rogue/blocks/green, /area/rogue/indoors/town/bath) -"oSy" = ( -/obj/structure/flora/ausbushes/brflowers, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/outdoors/river) "oSL" = ( /obj/structure/wallladder{ dir = 8 @@ -18587,15 +19456,6 @@ /area/rogue/indoors/town/bath{ first_time_text = "The Dreamers Demesne.." }) -"oTv" = ( -/obj/structure/fluff/walldeco/steward{ - name = "Appraiser Within" - }, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "oTG" = ( /obj/structure/flora/roguegrass/water/reeds, /turf/open/water/cleanshallow, @@ -18623,6 +19483,15 @@ }, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/town) +"oUY" = ( +/obj/structure/flora/wildplant/wild_poppy, +/obj/machinery/light/rogue/lanternpost{ + dir = 1 + }, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "oVa" = ( /obj/item/natural/rock/gold, /turf/open/floor/rogue/grass, @@ -18870,6 +19739,16 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"pfb" = ( +/obj/structure/mineral_door/wood/violet{ + lockid = "church"; + name = "Burial Grounds" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "pfg" = ( /obj/structure/table/wood{ icon_state = "tablewood1" @@ -19009,6 +19888,12 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"piY" = ( +/turf/open/floor/rogue/naturalstone, +/turf/open/floor/rogue/dirt, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) "pjg" = ( /obj/structure/flora/grass/jungle/b, /obj/structure/flora/ausbushes/fullgrass, @@ -19025,6 +19910,12 @@ /obj/structure/fermenting_barrel/random/water, /turf/open/floor/rogue/blocks, /area/rogue/indoors/town/bath) +"pjI" = ( +/obj/item/clothing/cloak/tabard, +/obj/item/clothing/cloak/tabard, +/obj/item/clothing/cloak/tabard, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/warehouse) "pkF" = ( /obj/structure/well, /turf/open/floor/rogue/grass, @@ -19041,6 +19932,13 @@ }, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/town) +"plk" = ( +/obj/structure/closet/crate/chest, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "pll" = ( /obj/structure/flora/roguetree/burnt, /turf/open/water/river{ @@ -19118,6 +20016,8 @@ /area/rogue/outdoors/river) "poq" = ( /obj/machinery/light/rogue/torchholder/l, +/mob/living/simple_animal/hostile/retaliate/rogue/saigabuck/tame, +/obj/structure/bed/rogue/inn/hay, /turf/open/floor/rogue/dirt, /area/rogue/indoors/shelter/bog) "poD" = ( @@ -19127,6 +20027,19 @@ }, /turf/closed/wall/mineral/rogue/wooddark, /area/rogue/indoors/shelter/town) +"poT" = ( +/obj/effect/decal/dirt/grass{ + dir = 4 + }, +/obj/effect/decal/dirt/grass, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) +"ppv" = ( +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/warehouse) "ppJ" = ( /obj/structure/flora/newtree, /obj/structure/flora/newtree, @@ -19200,6 +20113,14 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"puD" = ( +/obj/effect/wisp, +/obj/structure/spacevine/dendor, +/turf/open/water/cleanshallow, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "pvc" = ( /obj/structure/table/wood{ dir = 6; @@ -19364,6 +20285,13 @@ first_time_text = "Shrine of Natures"; name = "Shrine of Natures" }) +"pCx" = ( +/turf/open/floor/rogue/twig{ + dir = 4 + }, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) "pCG" = ( /turf/open/floor/rogue/blocks/stone/stonepattern2, /area/rogue/indoors/town/magician{ @@ -19402,6 +20330,13 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"pEs" = ( +/obj/effect/wisp, +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "pEz" = ( /obj/structure/table/wood{ icon_state = "longtable" @@ -19413,6 +20348,21 @@ }, /turf/open/floor/rogue/tile, /area/rogue/indoors/shelter/town) +"pEJ" = ( +/obj/effect/mob_spawner/wilderness, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) +"pEK" = ( +/obj/structure/safeglowshroom{ + icon_state = "glowshroom2" + }, +/turf/open/water/cleanshallow, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "pEM" = ( /obj/structure/flora/ausbushes/stalkybush, /turf/open/water/river{ @@ -19464,6 +20414,13 @@ }, /turf/open/floor/rogue/hexstone, /area/rogue/outdoors/caves) +"pFz" = ( +/obj/effect/wisp, +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "pFL" = ( /obj/machinery/light/rogue/lanternpost, /turf/open/floor/rogue/dirt, @@ -19518,6 +20475,12 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"pIz" = ( +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "pJt" = ( /obj/structure/flora/grass/jungle/b, /obj/machinery/light/rogue/wallfire/candle/blue/l, @@ -19564,11 +20527,6 @@ /area/rogue/indoors/town/bath{ first_time_text = "The Dreamers Demesne.." }) -"pKP" = ( -/obj/item/roguegem/blue, -/obj/structure/closet/crate/chest/dungeon/treasure, -/turf/open/floor/rogue/naturalstone, -/area/rogue/indoors/town/vault) "pKQ" = ( /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/blocks, @@ -19584,6 +20542,7 @@ }) "pLo" = ( /obj/machinery/light/rogue/lanternpost, +/obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/grass, /area/rogue/outdoors{ first_time_text = "Stonehedge" @@ -19841,7 +20800,8 @@ name = "Shrine of Lune" }) "pTJ" = ( -/obj/structure/chair/stool/rogue, +/mob/living/simple_animal/hostile/retaliate/rogue/saigabuck/tame, +/obj/structure/bed/rogue/inn/hay, /turf/open/floor/rogue/naturalstone, /area/rogue/indoors/shelter/bog) "pTS" = ( @@ -19881,8 +20841,8 @@ }, /area/rogue/outdoors/river) "pVI" = ( -/obj/structure/flora/roguegrass, -/turf/open/floor/rogue/dirt/road, +/obj/structure/flora/grass/jungle, +/turf/open/floor/rogue/cobble, /area/rogue/outdoors/rtfield{ first_time_text = null }) @@ -19893,6 +20853,13 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) +"pWc" = ( +/obj/machinery/light/rogue/wallfire/candle/blue/r, +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "pWd" = ( /obj/structure/fluff/railing/wood{ dir = 1; @@ -19912,7 +20879,7 @@ }) "pWJ" = ( /obj/machinery/light/rogue/torchholder/l, -/turf/open/floor/rogue/twig, +/turf/open/floor/rogue/dirt, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; name = "far stonehedge" @@ -20140,10 +21107,31 @@ /obj/machinery/anvil, /turf/open/floor/rogue/cobble, /area/rogue/indoors/shelter/town) +"qeA" = ( +/obj/structure/table/wood{ + dir = 10; + icon_state = "tablewood2"; + pixel_y = 5 + }, +/obj/item/candle/skull/lit, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "qeN" = ( /obj/structure/flora/ausbushes/ywflowers, /turf/open/water/cleanshallow, /area/rogue/outdoors/caves) +"qeU" = ( +/obj/structure/flora/newbranch/connector{ + dir = 1; + icon_state = "branch-end1" + }, +/turf/open/transparent/openspace, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) "qfa" = ( /obj/structure/flora/roguegrass/thorn_bush, /turf/open/water/swamp, @@ -20160,6 +21148,16 @@ /obj/structure/fermenting_barrel/water, /turf/open/floor/rogue/blocks, /area/rogue/indoors/shelter/bog) +"qfv" = ( +/obj/machinery/light/rogue/torchholder{ + dir = 1; + pixel_y = 26 + }, +/turf/closed/wall/mineral/rogue/stone/moss, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "qfL" = ( /obj/structure/roguemachine/scomm/r, /turf/open/floor/rogue/ruinedwood/spiral, @@ -20180,10 +21178,22 @@ first_time_text = "Shrine of Lune"; name = "Shrine of Lune" }) +"qgp" = ( +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "qgq" = ( /obj/structure/flora/roguegrass/bush/wall, /turf/open/transparent/openspace, /area/rogue) +"qgv" = ( +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "qgM" = ( /obj/structure/roguemachine/scomm/l, /turf/open/floor/rogue/blocks, @@ -20276,6 +21286,13 @@ }, /turf/open/water/cleanshallow, /area/rogue/outdoors/caves) +"qkR" = ( +/obj/structure/spacevine/dendor, +/turf/open/floor/rogue/twig, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "qlk" = ( /obj/structure/bookcase, /obj/item/book/granter/spell/spells5e/eldritchblast5e, @@ -20411,6 +21428,12 @@ }, /turf/open/floor/rogue/greenstone, /area/rogue/indoors/shelter/mountains) +"qpF" = ( +/obj/structure/flora/newbranch/connector, +/turf/open/transparent/openspace, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) "qpQ" = ( /obj/effect/landmark/start/adventurerlate, /turf/open/floor/rogue/ruinedwood/spiral, @@ -20481,6 +21504,13 @@ /area/rogue/outdoors/exposed/tavern{ name = "Tavern Stables" }) +"qrm" = ( +/obj/item/clothing/cloak/stabard/surcoat, +/obj/item/clothing/cloak/stabard/surcoat, +/obj/item/clothing/cloak/stabard/surcoat, +/obj/machinery/gear_painter/dye_bin, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/warehouse) "qro" = ( /obj/structure/spacevine, /obj/structure/spacevine, @@ -20489,6 +21519,12 @@ name = "Seawater" }, /area/rogue/under/cavewet) +"qrG" = ( +/obj/structure/flora/grass/jungle, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "qrP" = ( /obj/structure/flora/rogueshroom/happyrandom, /turf/open/floor/rogue/dirt, @@ -20609,6 +21645,16 @@ }, /turf/closed/wall/mineral/rogue/decowood, /area/rogue/indoors/town) +"qwx" = ( +/obj/machinery/light/rogue/torchholder{ + dir = 4 + }, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/tavern{ + first_time_text = "The Sylver Dragonne.."; + name = "Silver Dragon" + }) "qwU" = ( /mob/living/carbon/human/species/skeleton/npc/dungeon/ambush, /turf/open/floor/rogue/naturalstone, @@ -20617,6 +21663,13 @@ /mob/living/simple_animal/hostile/rogue/ghost/wraith/wraith2, /turf/open/floor/rogue/cobble/mossy, /area/rogue/under/cavewet/bogcaves) +"qxj" = ( +/obj/effect/landmark/events/haunts, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "qxl" = ( /obj/structure/flora/roguetree/happyrandom{ desc = "An old, beloved tree that even elves could love."; @@ -20715,20 +21768,17 @@ /area/rogue/under/cave) "qAU" = ( /obj/effect/landmark/observer_start, +/obj/effect/landmark/events/haunts, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) -"qBH" = ( -/obj/effect/landmark/start/priest, -/turf/open/transparent/openspace, -/area/rogue/outdoors{ - first_time_text = "Stonehedge" - }) "qBY" = ( +/obj/structure/bed/rogue/inn/wool, +/obj/effect/landmark/start/shophand, /turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/warehouse) +/area/rogue/indoors/shelter/town) "qCy" = ( /obj/structure/flora/roguetree/happyrandom{ desc = "An old, beloved tree that even elves could love."; @@ -20775,6 +21825,16 @@ first_time_text = "Ravenloft Academy"; name = "Ravenloft Academy" }) +"qDH" = ( +/obj/structure/flora/roguegrass, +/obj/machinery/light/rogue/lanternpost{ + dir = 1 + }, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "qFr" = ( /obj/structure/bed/rogue, /turf/open/floor/rogue/ruinedwood/spiral, @@ -20956,6 +22016,16 @@ first_time_text = "Ravenloft Academy"; name = "Schoolgrounds" }) +"qKK" = ( +/obj/structure/fluff/statue/gargoyle/moss/candles, +/obj/structure/fluff/psycross{ + name = "Divine Conduit" + }, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "qKQ" = ( /obj/machinery/light/rogue/torchholder{ dir = 8 @@ -21132,11 +22202,6 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) -"qRm" = ( -/obj/structure/closet/crate/chest, -/obj/effect/spawner/lootdrop/roguetown/dungeon/money, -/turf/open/water/cleanshallow, -/area/rogue/outdoors/caves) "qRz" = ( /obj/item/natural/stone, /turf/open/floor/rogue/grass, @@ -21459,6 +22524,16 @@ "rcU" = ( /obj/structure/roguemachine/scomm/r, /obj/effect/decal/stone/blockedge, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/item/scomstone/bad, +/obj/structure/closet/crate/chest, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -21546,6 +22621,13 @@ /obj/structure/spacevine, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors/river) +"rfG" = ( +/obj/structure/spacevine/dendor, +/turf/open/floor/rogue/dirt/road, +/area/rogue/outdoors/exposed/church{ + first_time_text = "Druids Grove"; + name = "Grove" + }) "rgj" = ( /obj/structure/flora/roguegrass/water/reeds, /obj/structure/closet/crate/coffin, @@ -21584,6 +22666,22 @@ "riB" = ( /turf/open/floor/rogue/dirt/ambush, /area/rogue/under/cavewet/bogcaves) +"riH" = ( +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/obj/item/natural/dirtclod, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "riK" = ( /obj/structure/table/wood{ icon_state = "tablewood1" @@ -21617,8 +22715,8 @@ }) "rjd" = ( /obj/structure/rack/rogue/shelf/big, -/obj/item/rope, -/obj/item/rope, +/obj/item/natural/saddle, +/obj/item/natural/saddle, /turf/open/floor/rogue/naturalstone, /area/rogue/indoors/shelter/bog) "rjg" = ( @@ -22075,6 +23173,12 @@ name = "Seawater" }, /area/rogue) +"rBs" = ( +/obj/structure/trap/fire{ + icon_state = "ward-red" + }, +/turf/open/floor/rogue/dirt, +/area/rogue/outdoors/caves) "rCh" = ( /obj/structure/closet/crate/roguecloset/inn/chest, /obj/item/storage/backpack/rogue/backpack/surgery, @@ -22226,12 +23330,21 @@ /obj/structure/table/wood{ icon_state = "tablewood1" }, +/obj/item/paper/scroll, +/obj/item/natural/feather, /turf/open/floor/rogue/blocks/stone/stonepattern2, /area/rogue/indoors/town/library) "rHx" = ( /obj/structure/bookcase, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/library) +"rIw" = ( +/turf/closed, +/turf/closed/wall/mineral/rogue/stone/moss, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "rIX" = ( /obj/structure/fermenting_barrel/beer, /obj/structure/fluff/railing/wood{ @@ -22306,9 +23419,7 @@ /turf/closed/wall/mineral/rogue/stone/moss, /area/rogue/indoors/town/tavern) "rLF" = ( -/obj/machinery/light/rogue/lanternpost{ - dir = 1 - }, +/obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; @@ -22384,6 +23495,18 @@ }, /turf/open/floor/rogue/blocks, /area/rogue/outdoors/caves) +"rND" = ( +/obj/structure/roguewindow/openclose, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, +/turf/open/floor/rogue/cobble/mossy, +/area/rogue/indoors/town/magician{ + first_time_text = "Ravenloft Academy"; + name = "Ravenloft Academy" + }) "rNK" = ( /obj/structure/flora/grass/jungle, /turf/closed/mineral/rogue/bedrock, @@ -22431,11 +23554,10 @@ /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/bath) "rPU" = ( -/obj/structure/stairs/stone, +/obj/structure/spacevine/dendor, /turf/open/floor/rogue/grass, -/area/rogue/outdoors{ - first_time_text = "Stonehedge Borders"; - name = "far stonehedge" +/area/rogue/outdoors/rtfield{ + first_time_text = null }) "rQW" = ( /obj/structure/flora/roguegrass/water, @@ -22551,10 +23673,20 @@ name = "far stonehedge" }) "rUO" = ( +/obj/effect/forcefield{ + icon_state = "purplesparkles"; + name = "Warding Spell"; + desc = "It glimmers with potent magick!" + }, /obj/structure/roguewindow/openclose{ - dir = 1 + dir = 4 }, -/turf/open/floor/rogue/blocks/stone/stonepattern3, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern2, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; name = "Ravenloft Academy" @@ -22738,6 +23870,16 @@ /area/rogue/indoors/town/bath) "sdh" = ( /obj/structure/roguewindow, +/obj/effect/forcefield{ + icon_state = "purplesparkles"; + name = "Warding Spell"; + desc = "It glimmers with potent magick!" + }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -22774,6 +23916,13 @@ /obj/item/reagent_containers/glass/cup/wooden, /turf/open/floor/carpet/royalblack, /area/rogue/indoors/town/bath) +"sej" = ( +/obj/structure/flora/grass/jungle/b, +/turf/closed/wall/mineral/rogue/decostone/mossy/blue, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "sek" = ( /obj/structure/handcart, /obj/item/rogueweapon/stoneaxe/woodcut, @@ -22802,6 +23951,10 @@ icon_state = "rockwd" }, /area/rogue/indoors/shelter/town) +"sfp" = ( +/obj/effect/mob_spawner/minotaur, +/turf/closed/wall/shroud, +/area/rogue/outdoors/caves) "sfu" = ( /obj/structure/spacevine, /turf/closed/wall/mineral/rogue/wooddark/slitted, @@ -22912,7 +24065,11 @@ /obj/structure/roguewindow/openclose{ dir = 8 }, -/obj/structure/bars/steel, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -23135,10 +24292,6 @@ /obj/structure/flora/roguegrass/thorn_bush, /turf/open/water/swamp, /area/rogue/outdoors/caves) -"swb" = ( -/obj/effect/landmark/start/shophand, -/turf/open/floor/rogue/ruinedwood/herringbone, -/area/rogue/indoors/shelter/town) "swA" = ( /obj/structure/bed/rogue/inn/wool, /turf/open/floor/rogue/twig, @@ -23186,6 +24339,17 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"syp" = ( +/obj/structure/fluff/statue/gargoyle/moss/candles, +/obj/structure/flora/grass/jungle/b, +/obj/structure/fluff/psycross{ + name = "Divine Conduit" + }, +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "syE" = ( /obj/effect/decal/cleanable/blood, /turf/open/floor/rogue/herringbone, @@ -23260,7 +24424,7 @@ first_time_text = "The Twilight Woods" }) "sBl" = ( -/obj/structure/closet/crate/chest, +/obj/structure/chair/bench/couchablack/r, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; @@ -23277,6 +24441,15 @@ /obj/structure/flora/roguegrass, /turf/open/floor/rogue/dirt, /area/rogue/under/cave) +"sBS" = ( +/obj/structure/flora/grass/jungle{ + icon_state = "grassa2" + }, +/obj/machinery/light/rogue/lanternpost, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "sCi" = ( /obj/item/book/granter/spell/spells5e/primalsavagery5e, /obj/item/book/granter/spell/spells5e/poisonspray5e, @@ -23297,6 +24470,13 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"sCW" = ( +/obj/structure/flora/grass/jungle/b, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "sDr" = ( /turf/closed/mineral/rogue/bedrock, /area/rogue/outdoors/woods{ @@ -23358,6 +24538,16 @@ }, /turf/open/floor/carpet/purple, /area/rogue/indoors/town/bath) +"sFf" = ( +/obj/effect/wisp, +/obj/structure/flora/grass/jungle{ + icon_state = "grassa1" + }, +/turf/open/transparent/glass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "sFI" = ( /obj/structure/fluff/railing/wood{ dir = 1; @@ -23655,6 +24845,15 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"sPq" = ( +/obj/structure/fluff/railing/border{ + dir = 4 + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "sPz" = ( /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors/woods{ @@ -23851,6 +25050,12 @@ /obj/effect/temp_visual/small_smoke, /turf/open/floor/rogue/naturalstone, /area/rogue/outdoors/caves) +"sZB" = ( +/turf/closed/wall/mineral/rogue/stone/moss, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "tac" = ( /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/dirt/road, @@ -24026,6 +25231,9 @@ first_time_text = "Druids Grove"; name = "Grove" }) +"tfK" = ( +/turf/closed/wall/mineral/rogue/stone/moss, +/area/rogue/under/cavewet) "tfW" = ( /obj/effect/wisp, /obj/structure/flora/ausbushes/lavendergrass, @@ -24067,10 +25275,11 @@ name = "Ravenloft Academy" }) "thD" = ( -/obj/structure/stairs/stone, -/turf/open/floor/rogue/blocks/green, -/area/rogue/outdoors/woods{ - first_time_text = "The Twilight Woods" +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/turf/closed/wall/mineral/rogue/stone/moss, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" }) "thL" = ( /obj/item/clothing/mask/cigarette/pipe/westman, @@ -24136,7 +25345,7 @@ }) "tiz" = ( /obj/structure/table/church{ - dir = 1 + icon_state = "churchtable_end" }, /turf/open/floor/rogue/grass, /area/rogue/outdoors/exposed/church{ @@ -24421,6 +25630,15 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"trL" = ( +/obj/structure/table/church{ + icon_state = "churchtable_mid" + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "trT" = ( /obj/machinery/light/rogue/torchholder/c, /obj/effect/landmark/start/innkeep, @@ -24764,6 +25982,16 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) +"tKG" = ( +/obj/item/burial_shroud, +/obj/structure/rack/rogue, +/obj/machinery/light/rogue/wallfire/candle/blue/r, +/obj/item/rogueweapon/shovel, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "tLa" = ( /obj/machinery/light/rogue/oven{ pixel_y = 32 @@ -24998,15 +26226,8 @@ /turf/closed/wall/mineral/rogue/wooddark/window, /area/rogue/indoors/shelter/town) "tTg" = ( -/obj/structure/rack/rogue/shelf/big, -/obj/item/rogueweapon/mace/woodclub, -/obj/item/rogueweapon/mace/woodclub, -/obj/item/rogueweapon/mace/wsword, -/obj/item/rogueweapon/mace/wsword, -/turf/open/floor/rogue/grass, -/area/rogue/outdoors/rtfield{ - first_time_text = null - }) +/turf/closed/wall/mineral/rogue/stone/window/moss, +/area/rogue/indoors/town/vault) "tTx" = ( /obj/effect/decal/border/ruinedwood/inverted{ dir = 1 @@ -25026,6 +26247,13 @@ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" }) +"tUh" = ( +/obj/structure/flora/grass/jungle, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "tUj" = ( /obj/structure/flora/grass/jungle/b, /turf/open/floor/rogue/blocks/stone/stonepattern3, @@ -25196,6 +26424,15 @@ /area/rogue/indoors/town/bath{ first_time_text = "The Dreamers Demesne.." }) +"ubr" = ( +/obj/structure/flora/newbranch/connector{ + dir = 1; + icon_state = "branch-end2" + }, +/turf/open/transparent/openspace, +/area/rogue/outdoors/woods{ + first_time_text = "The Twilight Woods" + }) "ubt" = ( /turf/closed/mineral/rogue/bedrock, /area/rogue/outdoors/rtfield{ @@ -25259,10 +26496,6 @@ first_time_text = "The Sylver Dragonne.."; name = "Silver Dragon" }) -"ucX" = ( -/mob/living/simple_animal/hostile/retaliate/rogue/saiga/tame/saddled, -/turf/open/water/cleanshallow, -/area/rogue/outdoors/caves) "ucZ" = ( /turf/open/floor/rogue/grass, /area/rogue/outdoors/rtfield{ @@ -25491,10 +26724,13 @@ first_time_text = "The Twilight Woods" }) "umc" = ( -/obj/effect/spawner/lootdrop/roguetown/dungeon/money, -/obj/effect/spawner/lootdrop/roguetown/dungeon/money, -/turf/open/floor/rogue/naturalstone, -/area/rogue/indoors/town/vault) +/obj/structure/ladder, +/obj/machinery/light/rogue/wallfire/candle/blue/l, +/turf/open/floor/rogue/greenstone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "umj" = ( /obj/structure/spider/stickyweb{ dir = 8; @@ -25540,8 +26776,11 @@ name = "far stonehedge" }) "unr" = ( -/obj/structure/flora/grass/jungle/b, -/turf/open/floor/rogue/dirt/road, +/obj/structure/chair/bench{ + dir = 1 + }, +/turf/open/floor/rogue/cobblerock, +/turf/open/floor/rogue/cobble, /area/rogue/outdoors/rtfield{ first_time_text = null }) @@ -25643,6 +26882,12 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) +"usY" = ( +/mob/living/carbon/human/species/human/smartnpc/townguard, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "utn" = ( /obj/structure/rack/rogue, /obj/item/clothing/suit/roguetown/shirt/shortshirt, @@ -25681,12 +26926,6 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) -"uuw" = ( -/obj/structure/flora/grass/jungle, -/obj/effect/mist, -/obj/structure/spawner/invisible/monster/minotaur, -/turf/open/floor/rogue/dirt, -/area/rogue/outdoors/caves) "uuF" = ( /obj/structure/fluff/railing/wood{ dir = 4; @@ -25840,6 +27079,12 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"uyo" = ( +/obj/effect/landmark/townpatrol, +/turf/open/floor/rogue/cobble/mossy, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "uyu" = ( /obj/item/natural/rock/gem, /turf/open/floor/rogue/naturalstone, @@ -26454,9 +27699,15 @@ name = "Silver Dragon" }) "uXz" = ( -/obj/machinery/light/rogue/wallfire/candle/r, -/turf/open/floor/rogue/blocks/stone/stonepattern3, -/area/rogue/indoors/town/warehouse) +/obj/structure/rack/rogue/shelf/big, +/obj/item/rogueweapon/mace/woodclub, +/obj/item/rogueweapon/mace/woodclub, +/obj/item/rogueweapon/mace/wsword, +/obj/item/rogueweapon/mace/wsword, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "uXB" = ( /obj/structure/flora/roguetree/stump/log, /turf/open/water/swamp, @@ -26496,8 +27747,8 @@ /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors/caves) "uYX" = ( -/obj/structure/fluff/statue/tdummy, -/turf/open/floor/rogue/dirt, +/turf/open/floor/rogue/cobblerock, +/turf/open/floor/rogue/cobblerock, /area/rogue/outdoors{ first_time_text = "Stonehedge Borders"; name = "far stonehedge" @@ -26506,6 +27757,16 @@ /obj/structure/flora/newtree, /turf/closed/wall/shroud, /area/rogue) +"uZr" = ( +/obj/structure/glowshroom{ + icon_state = "glowshroom2" + }, +/obj/structure/spacevine/dendor, +/turf/open/floor/rogue/dirt, +/area/rogue/outdoors/exposed/church{ + first_time_text = "Druids Grove"; + name = "Grove" + }) "uZx" = ( /obj/effect/decal/dirt/grass{ dir = 4 @@ -26615,6 +27876,13 @@ /obj/item/clothing/cloak/apron/blacksmith, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/shelter/town) +"vdm" = ( +/mob/living/simple_animal/hostile/rogue/skeleton/guard/xbow/playersentry, +/turf/open/floor/rogue/greenstone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "vdy" = ( /obj/structure/roguemachine/scomm/r, /turf/open/floor/rogue/blocks/stonered/tiny, @@ -26622,6 +27890,25 @@ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" }) +"vdK" = ( +/obj/structure/flora/grass/jungle, +/obj/machinery/light/rogue/lanternpost{ + dir = 1 + }, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) +"vdT" = ( +/obj/structure/flora/grass/jungle{ + icon_state = "grassa1" + }, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "ven" = ( /obj/structure/flora/roguegrass/water/reeds, /turf/open/floor/rogue/grass, @@ -26683,10 +27970,6 @@ /area/rogue/outdoors/exposed/tavern{ name = "Tavern Stables" }) -"vhA" = ( -/obj/item/natural/stone, -/turf/open/floor/rogue/dirt/ambush, -/area/rogue/outdoors/river) "vil" = ( /obj/structure/fluff/railing/border, /turf/open/floor/rogue/cobble/mossy, @@ -26967,6 +28250,14 @@ icon_state = "rockwd" }, /area/rogue/outdoors/river) +"vwj" = ( +/obj/structure/flora/roguegrass, +/mob/living/carbon/human/species/human/smartnpc/townguard/brute, +/turf/open/floor/rogue/dirt/road, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "vwm" = ( /obj/item/natural/stone, /turf/open/floor/rogue/dirt, @@ -27021,7 +28312,7 @@ /obj/item/paper/scroll, /obj/item/paper/scroll, /obj/item/natural/feather, -/turf/open/floor/rogue/ruinedwood/spiral, +/turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/garrison{ first_time_text = "Adventurers Guild"; name = "Adventurers Guild" @@ -27283,6 +28574,13 @@ /obj/item/book/granter/spell/blackstone/invisibility, /turf/open/floor/rogue/grass, /area/rogue/outdoors/caves) +"vKW" = ( +/obj/structure/bars/cemetery, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "vLn" = ( /turf/closed/wall/mineral/rogue/roofwall/outercorner{ dir = 8 @@ -27497,6 +28795,14 @@ /obj/item/restraints/legcuffs/beartrap/armed, /turf/open/transparent/openspace, /area/rogue/outdoors/river) +"vTF" = ( +/obj/structure/chair/bench{ + dir = 4 + }, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors/rtfield{ + first_time_text = null + }) "vTP" = ( /obj/structure/mineral_door/wood/fancywood, /turf/open/floor/rogue/blocks/stone/stonepattern3, @@ -27597,10 +28903,14 @@ name = "Shores of the Emerald Coast" }) "vXN" = ( -/obj/structure/fluff/statue/tdummy, -/turf/open/floor/rogue/dirt, -/area/rogue/outdoors/rtfield{ - first_time_text = null +/obj/structure/fluff/statue/gargoyle/moss, +/obj/structure/fluff/railing/border{ + dir = 4 + }, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" }) "vYA" = ( /obj/machinery/loom, @@ -27625,6 +28935,12 @@ }, /turf/open/floor/rogue/carpet, /area/rogue/indoors/shelter/town) +"vYY" = ( +/obj/effect/landmark/townpatrol, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors{ + first_time_text = "Stonehedge" + }) "vYZ" = ( /obj/structure/flora/roguegrass/water/reeds, /obj/structure/flora/roguegrass/water/reeds, @@ -27930,10 +29246,10 @@ /obj/structure/bed/rogue/inn/hay, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/indoors/shelter/bog) -"wqe" = ( -/mob/living/simple_animal/hostile/retaliate/rogue/saigabuck/tame/saddled, +"wpF" = ( /turf/open/water/cleanshallow, -/area/rogue/outdoors/caves) +/turf/closed/mineral/random/rogue, +/area/rogue/outdoors/river) "wqn" = ( /obj/machinery/light/rogue/torchholder, /turf/closed/wall/mineral/rogue/wooddark, @@ -27955,6 +29271,14 @@ /area/rogue/outdoors/exposed/tavern{ name = "Tavern Stables" }) +"wrw" = ( +/obj/structure/ladder, +/obj/machinery/light/rogue/wallfire/candle/blue, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "wsc" = ( /turf/closed/wall/mineral/rogue/decostone/mossy/blue, /area/rogue/indoors/town/church/chapel{ @@ -28114,6 +29438,10 @@ first_time_text = "Emerald Shores"; name = "Shores of the Emerald Coast" }) +"wxV" = ( +/obj/structure/fermenting_barrel/water, +/turf/open/floor/rogue/blocks, +/area/rogue) "wyc" = ( /turf/closed/wall/mineral/rogue/stone/moss, /area/rogue/outdoors/rtfield{ @@ -28180,6 +29508,21 @@ }, /turf/open/floor/rogue/ruinedwood/spiral, /area/rogue/outdoors/exposed/tavern) +"wAO" = ( +/obj/item/clothing/gloves/roguetown/chain/iron, +/obj/item/clothing/gloves/roguetown/chain/iron, +/obj/item/clothing/gloves/roguetown/chain/iron, +/obj/item/clothing/gloves/roguetown/chain/iron, +/obj/item/clothing/under/roguetown/chainlegs, +/obj/item/clothing/under/roguetown/chainlegs, +/obj/item/clothing/under/roguetown/chainlegs, +/obj/item/clothing/under/roguetown/chainlegs, +/obj/structure/rack/rogue, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "wAP" = ( /obj/structure/flora/roguegrass/maneater/real, /turf/open/floor/rogue/dirt, @@ -28321,6 +29664,13 @@ /obj/structure/fermenting_barrel/beer, /turf/open/floor/rogue/carpet, /area/rogue/indoors/town) +"wHV" = ( +/obj/structure/bed/rogue/bedroll, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "wIc" = ( /obj/structure/flora/newtree, /turf/open/floor/rogue/dirt/road, @@ -28437,7 +29787,16 @@ /obj/structure/roguewindow/openclose{ dir = 8 }, -/obj/structure/bars/steel, +/obj/effect/forcefield{ + icon_state = "purplesparkles"; + name = "Warding Spell"; + desc = "It glimmers with potent magick!" + }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/magician{ first_time_text = "Ravenloft Academy"; @@ -28474,11 +29833,10 @@ /turf/open/floor/rogue/dirt, /area/rogue/outdoors/caves) "wOd" = ( -/obj/structure/fluff/littlebanners/bluewhite, -/turf/open/floor/rogue/cobble, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" +/obj/structure/fluff/statue/tdummy2, +/turf/open/floor/rogue/cobblerock, +/area/rogue/outdoors/rtfield{ + first_time_text = null }) "wOm" = ( /turf/closed/wall/mineral/rogue/decowood{ @@ -28680,6 +30038,13 @@ /obj/effect/wisp, /turf/open/floor/rogue/herringbone, /area/rogue/under/cavewet/bogcaves) +"wZi" = ( +/obj/effect/landmark/start/monk, +/turf/open/floor/rogue/cobble, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "wZF" = ( /obj/structure/flora/roguegrass/maneater/real{ aggroed = 1 @@ -28840,9 +30205,12 @@ first_time_text = "The Twilight Woods" }) "xfT" = ( -/obj/item/reagent_containers/hypospray/medipen/sealbottle/purify, -/turf/closed/wall/mineral/rogue/stone/moss, -/area/rogue/outdoors/river) +/obj/structure/flora/grass/jungle/b, +/turf/open/transparent/glass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "xgm" = ( /obj/machinery/light/rogue/firebowl, /turf/open/floor/rogue/dirt, @@ -28915,6 +30283,11 @@ /obj/structure/roguewindow/stained/silver{ opacity = 0 }, +/obj/structure/projected_forcefield{ + name = "Magick Barrier"; + desc = "It glistens and humswith arcane energy. Powerful Magicks, this."; + icon_state = "purplesparkles" + }, /turf/open/floor/rogue/blocks/stone/stonepattern3, /area/rogue/indoors/town/church/chapel{ first_time_text = "Shrine of Lune"; @@ -28959,19 +30332,16 @@ /obj/structure/flora/newtree, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/town) +"xjT" = ( +/turf/open/floor/grass, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "xkh" = ( /mob/living/simple_animal/hostile/retaliate/rogue/bigrat, /turf/open/floor/rogue/cobble, /area/rogue/under/cavewet/bogcaves) -"xko" = ( -/obj/structure/chair/bench{ - dir = 4 - }, -/obj/effect/landmark/start/gravedigger, -/turf/open/floor/rogue/dirt, -/area/rogue/outdoors{ - first_time_text = "Stonehedge" - }) "xkr" = ( /obj/structure/table/wood{ dir = 1; @@ -29031,6 +30401,14 @@ /obj/item/seeds/berryrogue/poison, /turf/open/floor/rogue/dirt, /area/rogue/outdoors/exposed/bath) +"xlt" = ( +/obj/structure/flora/grass/jungle/b, +/obj/effect/landmark/start/monk, +/turf/open/floor/rogue/blocks/stone/stonepattern3, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "xlC" = ( /obj/structure/chair/bench/church/smallbench, /turf/open/floor/rogue/ruinedwood/herringbone, @@ -29065,13 +30443,10 @@ /area/rogue/outdoors/rtfield{ first_time_text = null }) -"xnW" = ( -/obj/structure/closet/crate/roguecloset, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) +"xor" = ( +/obj/structure/feedinghole, +/turf/open/floor/rogue/herringbone, +/area/rogue/indoors/town/warehouse) "xoL" = ( /obj/structure/fluff/railing/border{ dir = 8 @@ -29100,6 +30475,15 @@ icon_state = "rockwd" }, /area/rogue/outdoors/caves) +"xpu" = ( +/obj/structure/bars/steel, +/turf/open/water/river{ + icon_state = "rockwd" + }, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "xpF" = ( /obj/structure/table/wood, /turf/open/floor/rogue/blocks/stonered, @@ -29252,6 +30636,19 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"xxq" = ( +/obj/structure/fluff/railing/border{ + dir = 4 + }, +/obj/structure/fluff/railing/wood{ + dir = 4 + }, +/obj/structure/spacevine/dendor, +/turf/open/floor/rogue/shroud, +/area/rogue/outdoors{ + first_time_text = "Stonehedge Borders"; + name = "far stonehedge" + }) "xxw" = ( /obj/structure/chair/wood/rogue/chair3{ dir = 8 @@ -29325,9 +30722,12 @@ /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors/caves) "xAd" = ( -/mob/living/simple_animal/hostile/retaliate/rogue/mossback, -/turf/open/floor/rogue/dirt, -/area/rogue/outdoors/river) +/obj/effect/spawner/lootdrop/roguetown/dungeon/money, +/obj/structure/closet/crate/chest/dungeon/treasure, +/obj/item/roguegem/blue, +/obj/machinery/light/rogue/wallfire/candle/blue, +/turf/open/floor/rogue/naturalstone, +/area/rogue/indoors/town/vault) "xAs" = ( /obj/effect/spawner/roguemap/tree, /turf/open/water/cleanshallow, @@ -29532,6 +30932,13 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"xFq" = ( +/obj/structure/bars/cemetery, +/turf/closed/wall/shroud, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "xFY" = ( /obj/structure/flora/newtree, /turf/open/transparent/openspace, @@ -29546,15 +30953,6 @@ /obj/effect/decal/remains/human, /turf/open/floor/rogue/cobblerock, /area/rogue/under/cave) -"xHS" = ( -/obj/structure/chair/bench/church/smallbench{ - dir = 8 - }, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "xHT" = ( /obj/effect/spawner/roguemap/treeorbush, /obj/effect/spawner/roguemap/stump, @@ -29603,6 +31001,7 @@ }) "xKH" = ( /obj/machinery/light/rogue/wallfire/candle/blue, +/mob/living/carbon/human/species/human/smartnpc/townguard/sentry, /turf/open/floor/rogue/dirt, /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" @@ -29773,14 +31172,13 @@ name = "Adventurers Guild" }) "xQn" = ( -/obj/structure/roguewindow/stained/silver{ - opacity = 0 +/obj/structure/table/wood{ + icon_state = "tablewood1" }, -/turf/open/water/cleanshallow, -/area/rogue/indoors/town/church/chapel{ - first_time_text = "Shrine of Lune"; - name = "Shrine of Lune" - }) +/obj/item/natural/feather, +/obj/item/paper/scroll, +/turf/open/floor/rogue/blocks/stone/stonepattern2, +/area/rogue/indoors/town/library) "xQE" = ( /obj/structure/flora/ausbushes/stalkybush, /obj/structure/fluff/statue/femalestatue{ @@ -29872,10 +31270,6 @@ first_time_text = "Ravenloft Academy"; name = "Ravenloft Academy" }) -"xUo" = ( -/obj/effect/wisp, -/turf/open/water/swamp, -/area/rogue/outdoors/caves) "xUU" = ( /obj/structure/table/church/m, /obj/structure/fluff/psycross{ @@ -29935,6 +31329,13 @@ first_time_text = "Shrine of Natures"; name = "Shrine of Natures" }) +"xWw" = ( +/obj/structure/spacevine/dendor, +/turf/open/water/cleanshallow, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "xWI" = ( /obj/structure/fermenting_barrel/water, /turf/open/floor/rogue/cobblerock, @@ -30119,6 +31520,17 @@ /area/rogue/outdoors/woods{ first_time_text = "The Twilight Woods" }) +"yfd" = ( +/obj/structure/closet/crate/roguecloset, +/obj/item/rope, +/obj/item/rope, +/obj/item/rope/chain, +/obj/item/rope/chain, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/town/garrison{ + first_time_text = "Adventurers Guild"; + name = "Adventurers Guild" + }) "yfi" = ( /obj/structure/table/wood{ dir = 8; @@ -30177,6 +31589,14 @@ first_time_text = "Stonehedge Borders"; name = "far stonehedge" }) +"yhJ" = ( +/obj/effect/wisp, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/town/church/chapel{ + first_time_text = "Shrine of Lune"; + name = "Shrine of Lune" + }) "yhR" = ( /obj/structure/glowshroom, /turf/open/water/cleanshallow, @@ -30239,15 +31659,6 @@ /obj/machinery/light/rogue/wallfire/candle/r, /turf/open/floor/rogue/ruinedwood/herringbone, /area/rogue/indoors/town) -"yjm" = ( -/obj/item/reagent_containers/glass/bucket/wooden/spell_water, -/obj/item/natural/worms/leech, -/obj/item/natural/worms/leech/cheele, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/town/garrison{ - first_time_text = "Adventurers Guild"; - name = "Adventurers Guild" - }) "yjw" = ( /obj/structure/flora/roguegrass/water, /obj/structure/flora/roguetree/stump/log, @@ -49365,8 +50776,6 @@ amU amU amU amU -amU -amU bLQ amU amU @@ -49378,7 +50787,9 @@ amU amU amU cAf -amU +bLQ +bLQ +bLQ amU cAf qMz @@ -49563,8 +50974,6 @@ viu ven ven tcx -cDX -cDX cCE rOl ecG @@ -49580,7 +50989,9 @@ amU amU amU amU -amU +bLQ +bLQ +bLQ amU bLQ fDV @@ -49765,8 +51176,6 @@ rOl ven rqC tcx -tcx -cDX cDX cDX cDX @@ -49784,6 +51193,8 @@ amU cAf bLQ bLQ +bLQ +bLQ cAf fDV qMz @@ -49969,8 +51380,6 @@ fyQ wSG amU amU -amU -amU cDX rOl amU @@ -49984,7 +51393,9 @@ bLQ amU bLQ bLQ -cAf +bLQ +bLQ +bLQ cAf bLQ fDV @@ -50171,8 +51582,6 @@ ven wSG amU amU -amU -amU rOl cDX hpp @@ -50186,7 +51595,9 @@ amU bLQ bLQ amU -amU +bLQ +bLQ +bLQ cAf amU gTO @@ -50373,8 +51784,6 @@ viu wSG amU amU -amU -amU iwj cDX viu @@ -50389,6 +51798,8 @@ bLQ bLQ bLQ bLQ +bLQ +bLQ cAf cAf qMz @@ -50576,8 +51987,6 @@ amU amU amU amU -amU -amU rOl tmR viu @@ -50591,6 +52000,8 @@ amU amU amU bLQ +bLQ +bLQ cAf amU qMz @@ -50779,8 +52190,6 @@ amU amU amU amU -amU -amU cDX viu rOl @@ -50794,16 +52203,18 @@ amU amU bLQ bLQ +bLQ +bLQ cAf qMz qMz qMz qMz gTO -qMz -qMz -gTO -qMz +nhM +nhM +nhM +nhM qMz qMz qMz @@ -50978,8 +52389,6 @@ rOl bLQ bLQ bLQ -bLQ -bLQ amU amU amU @@ -50994,21 +52403,23 @@ bLQ bLQ bLQ amU -amU +bLQ +bLQ +bLQ bLQ amU fDV gTO -gTO -gTO -qMz -qMz -fDV -qMz -qMz -qMz -fDV -fDV +nhM +nhM +nhM +nhM +tfK +tfK +nhM +nhM +nhM +nhM gTO gTO fDV @@ -51180,8 +52591,6 @@ rOl bLQ bLQ bLQ -bLQ -bLQ amU amU amU @@ -51196,22 +52605,24 @@ amU amU amU amU -amU +bLQ +bLQ +bLQ amU bLQ fDV gTO -qMz -gTO -gTO -qMz -qMz -fDV -fDV -fDV -fDV -fDV -fDV +nhM +nhM +nhM +tfK +juB +juB +tfK +nhM +nhM +nhM +nhM fDV fDV fDV @@ -51382,8 +52793,6 @@ rOl bLQ bLQ bLQ -bLQ -bLQ amU amU amU @@ -51399,21 +52808,23 @@ amU amU amU amU +bLQ +bLQ amU bLQ qMz gTO -gTO -gTO -gTO -gTO -gTO -fDV -fDV -gTO -fDV -fDV -fDV +nhM +nhM +rTO +rTO +tTg +tTg +rTO +rTO +rTO +nhM +nhM qMz fDV fDV @@ -51586,8 +52997,6 @@ bLQ bLQ bLQ bLQ -bLQ -bLQ amU amU amU @@ -51601,26 +53010,28 @@ cDX amU amU amU +bLQ +bLQ amU bLQ qMz gTO -gTO -gTO -gTO -gTO -gTO -gTO -fDV -fDV -fDV -fDV +nhM +nhM +rTO +xAd +eFh +vFo +bhN +hta +rTO +nhM +nhM +nhM fDV fDV fDV fDV -gTO -qMz fDV fDV fDV @@ -51787,8 +53198,6 @@ bLQ bLQ bLQ bLQ -bLQ -bLQ amU amU bLQ @@ -51803,22 +53212,24 @@ oas hpp amU amU +bLQ +bLQ amU bLQ gTO gTO -gTO -gTO -gTO -gTO -gTO -gTO -fDV -fDV -fDV -fDV -fDV -fDV +nhM +nhM +rTO +vFo +vFo +vFo +vFo +auK +rTO +nhM +nhM +nhM fDV fDV fDV @@ -51988,8 +53399,6 @@ eHu bLQ bLQ bLQ -bLQ -bLQ amU bLQ bLQ @@ -52005,29 +53414,31 @@ viu viu amU amU +bLQ +bLQ cAf amU gTO gTO -gTO -gTO -gTO -gTO -gTO -qMz -gTO -fDV -fDV -fDV +nhM +nhM +rTO +vFo +vFo +vFo +rTO +rTO +rTO +vxU +nhM +nhM fDV fDV -qMz fDV fDV fDV fDV fDV -qMz fDV qMz qMz @@ -52189,8 +53600,6 @@ rOl eHu amU amU -bLQ -bLQ amU bLQ bLQ @@ -52207,26 +53616,28 @@ cDX viu iwj amU +bLQ +bLQ cAf amU gTO gTO -gTO -gTO -gTO -qMz -gTO -qMz -qMz -qMz +nhM +nhM +rTO +jJW +vFo +vFo +dYz +kAr +umc +vxU +nhM +nhM fDV -qMz -qMz fDV -qMz fDV fDV -qMz fDV fDV fDV @@ -52393,8 +53804,6 @@ amU amU bLQ bLQ -bLQ -bLQ amU bLQ bLQ @@ -52409,29 +53818,31 @@ cDX cDX rOl amU +bLQ +bLQ amU amU gTO gTO -gTO -gTO -gTO -gTO +nhM +nhM +rTO +sJF +vFo +vFo +tTg +mgS +vxU +vxU +nhM +nhM fDV fDV -qMz -qMz -qMz fDV -gTO -qMz fDV -qMz fDV fDV fDV -qMz -qMz fDV fDV fDV @@ -52593,8 +54004,6 @@ rOl qvI amU amU -amU -bLQ bLQ bLQ amU @@ -52611,30 +54020,32 @@ cDX rOl tvY amU +bLQ +bLQ amU amU gTO gTO -gTO -qMz -qMz -gTO +nhM +nhM +rTO +diM +vFo +sVs +tTg +vdm +vxU +nhM +nhM +nhM fDV fDV -qMz fDV fDV fDV -qMz -qMz fDV fDV fDV -qMz -fDV -qMz -qMz -fDV fDV fDV fDV @@ -52801,8 +54212,6 @@ amU amU amU amU -amU -amU bLQ amU amU @@ -52813,22 +54222,24 @@ rOl amU amU amU +bLQ +bLQ cAf bLQ fDV gTO -gTO -qMz -qMz -qMz -qMz -qMz -qMz -fDV -fDV -fDV -fDV -fDV +nhM +nhM +rTO +rTO +rTO +rTO +rTO +vxU +vxU +nhM +nhM +nhM fDV fDV fDV @@ -52997,8 +54408,6 @@ riB rOl wSG wSG -pla -wSG amU amU bLQ @@ -53015,20 +54424,22 @@ rOl amU amU amU +bLQ +bLQ cAf bLQ fDV gTO -qMz -qMz -gTO -gTO -fDV -gTO -qMz -qMz -fDV -fDV +nhM +nhM +nhM +nhM +nhM +nhM +nhM +nhM +nhM +nhM fDV qMz fDV @@ -53199,8 +54610,6 @@ pla rOl rOl rOl -rOl -wSG amU amU bLQ @@ -53219,18 +54628,20 @@ amU amU bLQ bLQ +bLQ +bLQ fDV gTO -qMz -gTO -gTO -gTO -gTO -qMz -qMz -qMz -fDV -fDV +nhM +nhM +nhM +nhM +nhM +nhM +nhM +nhM +nhM +nhM qMz qMz fDV @@ -53401,8 +54812,6 @@ wSG wSG wSG pla -rOl -pla amU amU bLQ @@ -53420,6 +54829,8 @@ amU amU amU bLQ +bLQ +bLQ amU fDV gTO @@ -53603,8 +55014,6 @@ amU amU amU wSG -diM -wSG amU amU bLQ @@ -53623,6 +55032,8 @@ amU amU bLQ bLQ +bLQ +bLQ gTO gTO gTO @@ -53805,8 +55216,6 @@ amU amU amU pla -wSG -pla amU amU amU @@ -53825,6 +55234,8 @@ amU amU bLQ bLQ +bLQ +bLQ fDV qMz qMz @@ -54007,8 +55418,6 @@ amU amU amU wSG -wSG -wSG amU amU amU @@ -54026,6 +55435,8 @@ amU amU amU bLQ +bLQ +bLQ cAf qMz gTO @@ -54209,8 +55620,6 @@ wSG amU amU wSG -wSG -wSG amU amU amU @@ -54229,6 +55638,8 @@ amU bLQ bLQ bLQ +bLQ +bLQ qMz qMz gTO @@ -54414,8 +55825,6 @@ amU amU amU amU -amU -amU cDX jCr cDX @@ -54429,6 +55838,8 @@ amU amU amU bLQ +bLQ +bLQ amU amU gTO @@ -54614,8 +56025,6 @@ ecG amU amU amU -amU -amU ecG cDX viu @@ -54630,7 +56039,9 @@ amU amU amU bLQ -amU +bLQ +bLQ +bLQ amU amU fDV @@ -54815,8 +56226,6 @@ viu rOl cCE rOl -rOl -rOl cDX cDX viu @@ -54832,7 +56241,9 @@ amU amU bLQ bLQ -amU +bLQ +bLQ +bLQ amU amU fDV @@ -55017,8 +56428,6 @@ viu oGD jlE jlE -cCE -viu cDX cDX rOl @@ -55032,9 +56441,11 @@ amU amU amU bLQ -amU -amU -amU +bLQ +bLQ +bLQ +bLQ +bLQ amU amU fDV @@ -55219,8 +56630,6 @@ amU amU amU eaj -tmR -viu cDX iwj amU @@ -55233,10 +56642,12 @@ amU bLQ bLQ bLQ +bLQ +bLQ +bLQ amU -amU -amU -amU +bLQ +bLQ bLQ bLQ fDV @@ -55428,14 +56839,14 @@ amU amU amU amU -amU -amU bLQ bLQ bLQ -amU -amU -amU +bLQ +bLQ +bLQ +bLQ +bLQ bLQ bLQ bLQ @@ -55633,14 +57044,14 @@ amU bLQ bLQ bLQ -amU -amU -amU bLQ bLQ bLQ -amU -amU +bLQ +bLQ +bLQ +bLQ +bLQ bLQ bLQ fDV @@ -55833,11 +57244,11 @@ amU amU bLQ bLQ -amU -amU -amU -amU -amU +bLQ +bLQ +bLQ +bLQ +bLQ bLQ amU amU @@ -56035,9 +57446,9 @@ amU bLQ bLQ amU -amU -amU -amU +bLQ +bLQ +bLQ amU bLQ amU @@ -56237,9 +57648,9 @@ amU bLQ amU amU -amU -amU -amU +bLQ +bLQ +bLQ amU bLQ amU @@ -56437,11 +57848,11 @@ bLQ bLQ amU bLQ -amU -amU -amU -amU -amU +bLQ +bLQ +bLQ +bLQ +bLQ bLQ amU amU @@ -56639,9 +58050,9 @@ bLQ amU bLQ bLQ -amU -amU -amU +bLQ +bLQ +bLQ amU bLQ amU @@ -56841,7 +58252,7 @@ bLQ amU bLQ amU -amU +bLQ amU bLQ bLQ @@ -75047,12 +76458,12 @@ rxm rxm cgq foa -jrB +kiG jrB uCB reE reV -jrB +kiG aby cgq lyF @@ -75251,7 +76662,7 @@ cgq jrB uCB uCB -stf +nLN stf jrB jrB @@ -75860,7 +77271,7 @@ tMj pCG xwM hxE -pCG +gHR ptG rxm lyF @@ -76062,7 +77473,7 @@ tMj pCG ptG pCG -pCG +gHR ptG rxm rxm @@ -77261,7 +78672,7 @@ dRe stf stf stf -jrB +kiG uCB vYC ifi @@ -77461,17 +78872,17 @@ stf dRe ifa stf -stf +nLN jrB stf stf -ifi +rBs nVt nVt nVt nVt jrB -jrB +kiG nVt nVt nVt @@ -77867,14 +79278,14 @@ stf jrB stf jrB -ifi +rBs rxm nVt nVt nVt nVt nVt -jrB +kiG jrB nVt nVt @@ -78078,7 +79489,7 @@ nVt nVt rxm jrB -jrB +kiG jrB nVt nVt @@ -78896,7 +80307,7 @@ rxm lyF lyF vVw -vVw +cqD fuN lyF nVt @@ -80309,8 +81720,8 @@ prw xDh xDh rps -rps -ayy +vVw +mtE prw lyF lyF @@ -80511,8 +81922,8 @@ rps rps rps rps -rps -rps +vVw +vVw prw lyF rxm @@ -80711,10 +82122,10 @@ rps ayy rps rps -ayy -rps -rps +atW rps +vVw +vVw prw lyF rxm @@ -80915,8 +82326,8 @@ xDh ayy ayy rps -rps -rps +vVw +vVw prw lyF lyF @@ -81299,7 +82710,7 @@ lyF lyF prw prw -xDh +jYU xDh xDh lzV @@ -81495,11 +82906,11 @@ vVw xDh xDh prw -cgq -cgq -cgq -cgq -lzV +nVt +nVt +nVt +nVt +rPi prw prw awm @@ -81697,12 +83108,12 @@ oSM xDh xDh prw -cgq -cgq +nVt +nVt nVt nVt rPi -lzV +rPi prw prw xDh @@ -81717,10 +83128,10 @@ rxm bFf bFf rPi -tkQ +cDz cDz bFf -xAd +kqH kqH xDh cqD @@ -81900,9 +83311,9 @@ xDh xDh prw lyF -cgq nVt -vYC +nVt +nVt rPi rPi rPi @@ -81919,8 +83330,8 @@ rxm bFf bFf rPi -kAr -tkQ +cDz +cDz tkQ tkQ xiN @@ -82095,19 +83506,19 @@ cgq cgq nVt nVt -lzV +rPi xDh vVw xDh xDh prw lyF -cgq nVt -jrB -vYC -vYC -tmk +nVt +nVt +nVt +nVt +nVt lyF prw xDh @@ -82122,9 +83533,9 @@ bFf bFf bFf rPi -cDz -cDz -cDz +rPi +rPi +rPi cDz cDz xbK @@ -82296,22 +83707,22 @@ cgq cgq cgq nVt -cgq -lzV +nVt +rPi xDh vVw xDh xDh prw -vYC -cgq nVt -jrB -jrB -vYC -tmk -tmk -prw +nVt +nVt +nVt +nVt +nVt +nVt +nVt +rPi prw awm xDh @@ -82321,12 +83732,12 @@ xDh bFf bFf bFf -rxm -rxm -rxm -rxm -nVt -rPi +vxU +vxU +vxU +vxU +vxU +vxU tkQ cDz vVw @@ -82494,9 +83905,9 @@ cgq cgq cgq cgq -cgq -cgq -cgq +lyF +nVt +nVt nVt nVt xDh @@ -82505,16 +83916,16 @@ vVw xDh xDh xDh -vYC -vYC nVt +sZB +iDC +sZB +sZB nVt nVt nVt -tmk -wqe -xDh -xDh +rPi +rPi prw xDh xDh @@ -82523,14 +83934,14 @@ prw prw bFf bFf -rxm -rxm -rxm -rxm -rxm +vxU +orJ +aKv +qeA +eAD +vxU rPi cDz -cDz vVw mtE prw @@ -82695,28 +84106,28 @@ cgq cgq cgq cgq -cgq -cgq -cgq -nVt +lyF nVt -rPi +tmk +tmk +tmk +xDh xDh xDh vVw xDh xDh xDh -tmk -vYC -jrB -eju -cgq nVt -tmk -tmk -xDh -xDh +sZB +mks +bOt +sZB +nVt +nVt +nVt +rPi +rPi prw prw xDh @@ -82725,13 +84136,13 @@ xDh lzV rPi rPi -rxm -rxm -rxm -rxm -rxm -bFf -cDz +vxU +wHV +qgp +qgp +qgp +vxU +rPi tkQ vVw vVw @@ -82897,29 +84308,29 @@ cgq cgq cgq cgq -cgq -cgq -cgq nVt -cgq +tmk +tmk +tmk +tmk xDh xDh xDh vVw xDh xDh -lzV -cgq -vYC -jrB -vYC -cgq +rPi +nVt +sZB +gIK +kan +sZB +nVt +nVt +nVt +nVt +nVt nVt -tmk -tmk -ucX -tmk -vYC lyF prw prw @@ -82927,13 +84338,13 @@ xDh xDh prw rPi -rxm -rxm -rxm -rxm -rxm -bFf -tkQ +vxU +cNu +cNu +cNu +dHL +vxU +rPi tkQ vVw mtE @@ -83099,44 +84510,44 @@ cgq cgq cgq cgq -cgq -cgq -cgq -cgq +nVt +tmk +tmk +nVt nVt xDh xDh cBP -vVw xDh -prw -prw -lyF -lyF -vYC -vYC -jrB +xDh +rPi +sZB +sZB +sZB +cVO +kan +sZB +nVt +nVt +nVt +nVt +nVt +nVt nVt -tmk -tmk -tmk -tmk -vYC -vYC rPi xDh xDh xDh xDh prw -rxm -rxm -rxm -rxm -rxm +vxU +plk +qgp +qgp +qgp +vxU rPi -cDz -cDz +tkQ xbK vVw prw @@ -83301,44 +84712,44 @@ cgq cgq cgq cgq -cgq -cgq -cgq -cgq +nVt +tmk +tmk +tmk nVt oSM xDh -bYy +eAR xDh xDh -prw -prw +rPi +sZB +sZB +bOt +kan +mks +sZB +lyF +lyF lyF -cgq -vYC -vYC -vYC -nVt nVt nVt nVt nVt -vYC -vYC rPi prw prw xDh xDh xDh -prw -rPi -bFf -rxm -rxm +vxU +vxU +uxq +mAH +qgp +vxU rPi -cDz -cDz +tkQ xbK vVw rPi @@ -83503,178 +84914,194 @@ cgq cgq cgq cgq +lyF +nVt +tmk +xDh +rPi +sZB +nmp +hio +hio +nmp +sZB +sZB +sZB +nmp +mba +nmp +sZB +sZB +sZB +sZB +nVt +nVt +nVt +rxm +rPi +rPi +prw +lzV +xDh +xDh +xDh +lzV +vxU +eAD +qgp +vxU +rPi +tkQ +vVw +vVw +rPi +rxm +rxm +lyF +lyF +rxm +rxm +rxm +rxm +nVt +nVt +jlJ +jlJ +rxm +rxm +rxm +rxm +rxm +rxm +nVt +seI +ifi +ifi +nVt +rxm +rxm +lyF +mDX +mDX +wjR +pay +ehz +ehz +pay +pay +lyF +lyF +rxm +rxm +lyF +tiF +hfS +owh +rzL +rzL +hfS +owh +rzL +hfS +bTd +bTd +owh +hfS +gEX +gEX +rzL +gEX +rxm +rxm +rxm +iMU +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +uUp +"} +(92,1,2) = {" +uUp +uUp +uUp +uUp +uUp +uUp +rxm +cgq +xVg +cgq +xVg +xVg +xVg +xVg +cgq +xVg +xVg +cgq +cgq +cgq +cgq +cgq +cgq +xVg +xVg +cgq +cgq +cgq +cgq +cgq +cgq +cgq +cgq +cgq +cgq +cgq +cgq +cgq +cgq +cgq +cgq +cgq +cgq +cgq +cgq +cgq cgq cgq cgq -rPi -rPi -oSM -xDh -vVw -xDh -xDh -lyF -lyF -cgq -vYC -jrB -cgq -vYC -vYC -vYC -nVt -nVt -nVt -cgq -rxm -rPi -rPi -prw -prw -xDh -xDh -xDh -prw -rPi -rxm -rxm -bFf -tkQ -tkQ -vVw -vVw -rPi -rxm -rxm -lyF -lyF -rxm -rxm -rxm -rxm -nVt -nVt -jlJ -jlJ -rxm -rxm -rxm -rxm -rxm -rxm -nVt -seI -ifi -ifi -nVt -rxm -rxm -lyF -mDX -mDX -wjR -pay -ehz -ehz -pay -pay -lyF -lyF -rxm -rxm -lyF -tiF -hfS -owh -rzL -rzL -hfS -owh -rzL -hfS -bTd -bTd -owh -hfS -gEX -gEX -rzL -gEX -rxm -rxm -rxm -iMU -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -uUp -"} -(92,1,2) = {" -uUp -uUp -uUp -uUp -uUp -uUp -rxm -cgq -xVg -cgq -xVg -xVg -xVg -xVg -cgq -xVg -xVg -cgq -cgq -cgq -cgq -cgq -cgq -xVg -xVg -cgq -cgq -cgq -cgq -cgq -cgq -cgq -cgq cgq cgq cgq @@ -83690,44 +85117,28 @@ cgq cgq cgq cgq -cgq -cgq -cgq -cgq -cgq -cgq -cgq -cgq -cgq -cgq -cgq -cgq -cgq -cgq -cgq -cgq -cgq -nVt -rPi -lzV -oSM -xDh -vVw -xDh -buM -lyF -lyF -cgq -cgq -jrB nVt nVt -vYC -vYC -vYC +xDh +rPi +nmp +fWg +gIK +cVO +kan +nmp +sZB +sZB +dzN +kan +fWg +kan +fWY +fWY +sZB +sZB nVt nVt -vYC rxm bFf bFf @@ -83737,11 +85148,11 @@ prw xDh xDh xDh -prw -rxm -rxm -bFf -cDz +rIw +qgp +qgp +vxU +rPi tkQ vVw vVw @@ -83907,27 +85318,27 @@ cgq cgq cgq cgq -cgq -lzV -prw +nVt +rPi prw -oSM -xDh xDh -vVw -xDh -buM -lyF -lyF -lyF -nVt -nVt -nVt -nVt -xUo -jrB -vYC -vYC +oSM +hio +kan +kan +kan +cVO +fWg +nmp +fWg +kan +kan +gHx +kan +kan +kan +wgl +sZB nVt rxm rxm @@ -83936,13 +85347,13 @@ nVt rxm rxm rPi +wpF xDh xDh -xDh -prw -nVt -rxm -bFf +rIw +qgp +qgp +vxU cDz tkQ vVw @@ -84108,28 +85519,28 @@ cgq cgq cgq cgq -cgq -cgq +nVt +nVt oSM xhl xDh xDh -xDh -xDh -vVw -xDh -lzV -cgq -ifi -ifi -cgq -xVg -cgq -nVt -nVt -ifi -ifi -cgq +hio +kan +kan +bFR +nmp +kan +ayP +kan +ktL +kan +gNI +kan +ktL +kan +trL +sZB nVt nVt nVt @@ -84141,12 +85552,12 @@ rPi prw xDh xDh -xDh -nVt -rxm +gkJ +qgp +qgp +vxU bFf cDz -cDz vVw vVw prw @@ -84310,30 +85721,30 @@ cgq cgq cgq cgq -cgq -cgq +nVt +nVt oKL xDh xDh xDh -xDh -rps -xDh -xDh -ifi -ifi -ifi -ifi -ifi -cgq -xVg -xVg -nVt -ifi -ifi -nVt -nVt +hio +dqW +kan +kan +kan +pWc +nmp +kan +kan +kan +aMy +kan +kan +kan +lLf +sZB nVt +lyF nVt nVt rxm @@ -84343,12 +85754,12 @@ bFf prw prw xDh -xDh -xDh -bFf -vhA -tkQ +gkJ +qgp +qgp +qfv tkQ +ayy vVw vVw prw @@ -84512,30 +85923,30 @@ cgq cgq cgq cgq -cgq +nVt nVt xDh xDh xDh -cBP -rps -xDh -xDh -lzV -ifi -cgq -cgq -cgq -ifi -cgq -cgq -xVg -cgq -ifi -ifi -cgq +xcU +nmp +wUB +cVO +gIK +kan +nmp +sZB +sZB +gGI +wUB +kan +kan +tKG +oum +sZB +sZB cgq -nVt +lyF nVt nVt rxm @@ -84545,12 +85956,12 @@ bFf bFf prw prw -xDh -xDh -xDh -xDh -tkQ -cDz +gkJ +qgp +qgp +xpu +ayy +rps cqD vVw prw @@ -84719,23 +86130,23 @@ nVt xhl xDh xDh -cBP -rps -xDh -xDh -lzV -cgq -cgq -ifi -ifi -ifi -ifi -ifi -cgq -ifi -ifi -ifi -nVt +xcU +sZB +nmp +hio +hio +nmp +sZB +sZB +sZB +sZB +nmp +pfb +pfb +nmp +sZB +sZB +sZB nVt nVt nVt @@ -84747,12 +86158,12 @@ bFf bFf bFf prw -xfT -xDh -xDh -xDh -xDh -xDh +vxU +qgp +qgp +xpu +rps +rps xbK vVw prw @@ -84920,24 +86331,24 @@ nVt cgq oSM xDh -cBP -cBP -rps +xcU +xcU xDh xDh -lzV -cgq -ifi -ifi -cgq -xVg -xVg -ifi -ifi -ifi -ifi -cgq -cgq +xDh +xDh +sZB +iDC +iDC +eHD +dmy +qKK +kan +cVO +vKW +otA +xjT +sZB nVt nVt rxm @@ -84949,12 +86360,12 @@ vxU dwT vxU vxU -rPi -xDh -xDh -xDh -xDh -xDh +bTu +qgp +qgp +xpu +rps +rps xbK xbK prw @@ -85122,25 +86533,25 @@ rPi lzV xDh rps -rps -rps -rps xDh xDh -lzV -ifi -ifi -xVg -xVg -xVg -xVg -cgq -ifi -ifi -cgq -nVt +xDh +xDh +xDh +rPi +sZB +iDC +xWw +fFQ +hhP +riH +kan +kan +hhP +otA +hqu +sZB nVt -cgq rxm vxU vxU @@ -85151,12 +86562,12 @@ gfu gaZ riK vxU +iac +qgp +qgp vxU -gkJ -gkJ -vxU -xDh -xDh +rps +rps xbK vVw prw @@ -85326,23 +86737,23 @@ rps rps rps cBP -buM -xDh -xDh -lzV -ifi -cgq -cgq -cgq -nVt -nVt -nVt -cgq -ifi -ifi -cgq -cgq -nVt +kqH +kqH +rPi +rPi +sZB +eHD +pFz +otA +nvL +otA +cVO +cVO +vKW +xjT +hhP +iDC +lyF rxm iCo xQN @@ -85353,12 +86764,12 @@ dYB dYB dYB pRH -oKt -yjm -lmb +qgp +qgp +orJ vxU prw -xDh +rps vVw vVw rPi @@ -85527,24 +86938,24 @@ rps vVw kqH kqH -lzV -lzV -lvd -lzV kqH -ifi -cgq -nVt -nVt -ifi -ifi -cgq -nVt -cgq -cgq -ifi -ifi -nVt +kqH +rPi +rPi +prw +sZB +xWw +bRi +oSq +tUh +hhP +pEs +kan +vKW +vKW +vKW +sZB +lyF rxm uxq qFr @@ -85555,8 +86966,8 @@ qFr dYB dYB pRH -dYB -cZz +qgp +etP vxU vxU prw @@ -85726,26 +87137,26 @@ kqH kqH kqH kqH -lvd -lvd -xVg -cgq -xVg +kqH +kqH xVg -ifi -ifi cgq nVt -cgq -ifi -ifi -ifi -ifi -cgq nVt -xVg -cgq -ifi +nVt +lyF +sZB +iDC +dvC +ajF +nvL +tUh +kan +kan +vKW +otA +xjT +sZB nVt rxm ior @@ -85757,8 +87168,8 @@ afV dYB aIb gfu -dYB -cZz +qgp +qgp sWS vxU rPi @@ -85932,22 +87343,22 @@ cgq cgq xVg xVg -cgq -ifi -ifi -cgq -cgq nVt -cgq -ifi nVt -cgq -ifi -cgq nVt -xVg -cgq -ifi +lyF +sZB +iDC +eHD +xjT +hhP +otA +sfZ +kan +hhP +kno +hqu +sZB nVt rxm uxq @@ -85959,9 +87370,9 @@ qFr dYB dYB pRH -dYB -dYB -dYB +qgp +qgp +qgp vxU rPi rPi @@ -86133,24 +87544,24 @@ ifi ifi ifi ifi -ifi -ifi -ifi -ifi -ifi nVt nVt -ifi -ifi nVt -ifi -ifi -nVt -xVg -xVg -ifi -ifi nVt +lyF +sZB +iDC +jja +xjT +nvL +hhP +sfZ +cVO +vKW +hhP +otA +sZB +rxm rxm tcT hqX @@ -86161,9 +87572,9 @@ dYB dYB dYB pRH -oTv -dYB -xHS +jXl +qgp +ahf vxU bFf rPi @@ -86340,20 +87751,20 @@ nVt nVt nVt nVt -ifi -ifi -ifi -ifi -cgq -nVt -nVt -nVt -cgq -ifi -ifi -cgq +sZB +iDC +ces +otA +otA +otA +kan +cVO +vKW +vKW +vKW +iDC rxm -lyF +vxU vxU vxU vxU @@ -86536,32 +87947,32 @@ ifi cgq nVt nVt -cgq -xVg -xVg -xVg -xVg nVt nVt -ifi -ifi -ifi -ifi -ifi -ifi -ifi -ifi -ifi -cgq -cgq +nVt +lyF +nVt +nVt +sZB +puD +xjT +vdT +cCV +hhP +cVO +kan +vKW +xjT +iDC +iDC rxm -rTO -vFo -vFo -dzN -rTO +gfu bCN -vxU +jwm +wAO +gfu +lPg +dwm wJA vxU vxU @@ -86741,34 +88152,34 @@ xVg xVg xVg cgq -cgq -xVg -xVg +lyF +lyF nVt -ifi -ifi -cgq -cgq -xVg -xVg -cgq -cgq -ifi -ifi -ifi +sZB +eHD +otA +dlk +hhP +hhP +kan +kan +hhP +otA +hqu +sZB rxm -rTO -bhN -vFo -vFo -rTO -mgS vxU -ekG -hCp +xor +ppv +ppv +nGA +qgp +qgp +dwm +vxU +nPq dYB dYB -tno vxU rxm rxm @@ -86943,34 +88354,34 @@ xVg nVt nVt nVt -cgq -cgq -xVg -ifi -ifi -nVt -xVg -xVg -xVg -cgq -nVt -nVt -nVt -nVt -ifi +lyF +lyF +lyF +sZB +kwu +fFQ +otA +nvL +ajF +kan +cVO +xFq +iDC +iDC +sZB rxm -rTO -eFh -umc -bhN -rTO +vxU +avB +ppv +ppv +nGA +qgp +qgp +qgp +gfu ekG -hCp -dYB -may -dYB dYB -sip +tno bTu rxm nVt @@ -87146,33 +88557,33 @@ cgq cgq cgq nVt -cgq -ifi -ifi -cgq -nVt -nVt -nVt -nVt -nVt -nVt -ifi -ifi -nVt -ifi +lyF +lyF +sZB +pEK +eHD +xjT +ajF +otA +sfZ +cVO +vKW +vKW +xFq +sZB rxm -rTO -jJW -vFo -vFo -dYz -dYB -may +vxU +kUu +gQG +ppv +gfu +wrw +qgp +qgp +bYK dYB -hCp dYB -pFl -seH +sip bTu nVt nVt @@ -87349,32 +88760,32 @@ xVg cgq nVt cgq -ifi -ifi -cgq -cgq -xVg -cgq -ifi -cgq -nVt -ifi -nVt -nVt -ifi +lyF +sZB +sZB +eHD +pFz +nvL +hhP +yhJ +kan +vKW +iDC +iDC +sZB rxm -rTO -sJF -vFo -auK -rTO +vxU +qrm +pjI +hAi +mgS +qgp +qgp +qgp +gfu ekG -hCp -dYB -hCp -dYB -dYB -nPq +pFl +seH vxU nVt nVt @@ -87522,7 +88933,7 @@ hoU odP uzp uzp -uWO +lCr evw cgq lzV @@ -87551,28 +88962,28 @@ cgq nVt nVt cgq -ifi -ifi -xVg -xVg -cgq -ifi -ifi -ifi nVt -ifi nVt -ifi -ifi +sZB +xWw +kwu +xjT +otA +kan +cVO +hhP +iDC +fVg +sZB rxm -rTO -pKP -auK -sVs -rTO -mgS -vxU -vxU +gfu +kgd +coD +may +gfu +frN +nmf +lgP vxU kvH kvH @@ -87721,9 +89132,9 @@ gec evw evw kcf -orU +iOZ odP -kMT +ixO eZV evw cgq @@ -87755,27 +89166,27 @@ ifi ifi cgq cgq -ifi -ifi -ifi -ifi -cgq -ifi +sZB +sZB +eHD +bRi +syp +eLM +iDC +vKW +hhP +xjT nVt -ifi -ifi -ifi -ifi rxm -rTO -rTO -rTO -rTO -rTO -fdl vxU -cgq -cgq +vxU +vxU +vxU +mgS +mgS +vxU +vxU +vxU bTu vxU vxU @@ -87958,24 +89369,24 @@ cgq cgq cgq cgq -cgq -cgq -cgq -cgq -cgq -cgq -nVt -cgq -cgq -cgq +sZB +sZB +sZB +sZB +hep +hep +sZB +sZB +sZB nVt rxm rxm rxm rxm -vxU -vxU -vxU +rxm +cgq +cgq +cgq cgq cgq nVt @@ -88163,9 +89574,9 @@ rxm rxm rxm rxm -rxm -rxm -rxm +cVH +tmk +cVH nVt nVt nVt @@ -88365,8 +89776,9 @@ rxm rxm cVH cVH -cVH -cVH +tmk +tmk +tmk cVH rxm rxm @@ -88376,7 +89788,6 @@ rxm rxm rxm rxm -rxm lyF lyF cgq @@ -88550,7 +89961,7 @@ nVt ifi nVt cgq -efC +ifi ifi ifi ifi @@ -88566,15 +89977,15 @@ rxm rxm rxm cVH -qRm +gYE tmk +aFt tmk wdl rxm rxm rxm rxm -rxm cgq cgq cgq @@ -88752,7 +90163,7 @@ cgq ifi nVt cgq -ebw +ifi ifi ifi ifi @@ -89575,7 +90986,7 @@ rxm wdl tmk tmk -nqF +tmk tmk tmk cVH @@ -89774,7 +91185,7 @@ rxm rxm rxm rxm -tmk +cXr tmk tmk tmk @@ -90382,7 +91793,7 @@ rxm rxm rxm vYZ -tmk +aFz tmk tmk qWQ @@ -91192,7 +92603,7 @@ tmk tmk cVH tmk -nqF +tmk tmk tmk ifi @@ -91661,7 +93072,7 @@ vrx vrx vrx vrx -vrx +jmV nVt vrx nVt @@ -91861,7 +93272,7 @@ vrx vbT vrx nVt -jmV +vrx vrx jhB nVt @@ -91989,7 +93400,7 @@ nVt btg diU tmk -nqF +tmk tmk tmk tmk @@ -92256,7 +93667,7 @@ rxm rxm qXK uPU -hyR +vrx hfS hfS qXK @@ -92664,12 +94075,12 @@ hfS hfS qXK nVt -nVt +sfp vrx vrx rer vbT -uuw +oEi vbT vrx nVt @@ -93262,7 +94673,7 @@ nVt nVt vrx vrx -hyR +vrx vbT vrx hfS @@ -93473,7 +94884,7 @@ qXK qXK qXK vrx -hyR +vrx nVt vrx jhB @@ -93805,7 +95216,7 @@ xVg nVt btg tmk -nqF +tmk wdl tmk qIX @@ -97237,7 +98648,7 @@ bkK jlY bkK sVM -kHI +tym fVN bwF bwF @@ -104542,7 +105953,7 @@ miB miB oZS mVp -mVp +pEJ aYm aYm mVp @@ -104867,7 +106278,7 @@ tNE gIm pfu kHM -rSD +euV boH jEU jEU @@ -105069,8 +106480,8 @@ eHG tyj tyj kCg -nsy -rSD +bUT +euV eMs kUS uKj @@ -105888,11 +107299,11 @@ oIl rSD rSD euV -ccM -iYe -mmt +iJR +euV +uZr mmt -rSD +euV rSD rxu xbZ @@ -106089,12 +107500,12 @@ qQt mRd rSD iJR -iJR -iJR ccM +ccM +iJR rSD -rSD -rSD +euV +euV rSD rSD rxu @@ -106291,11 +107702,11 @@ qed tiz rSD iJR -tqS +apN tqS ccM ccM -iJR +ccM iJR rSD rSD @@ -107702,8 +109113,8 @@ gvT wIc aFY aFY -ujl -ilr +rfG +jnA kCg pfu mrF @@ -107905,7 +109316,7 @@ gvT gvT pfu kCg -jCm +jFL bUL pfu pfu @@ -108108,7 +109519,7 @@ mrF mrF pfu kCg -jCm +jFL ilr eeB eHG @@ -108565,7 +109976,7 @@ oZS mVp bbB miB -mVp +cpy ilr eHG ilr @@ -109981,7 +111392,7 @@ qJZ qJZ haD ycO -ycO +kfa ycO haD mYC @@ -109991,11 +111402,11 @@ vLX vLX vLX vLX +jtN lVD +jtN lVD -lVD -lVD -lVD +rUO rvO vLX vLX @@ -115038,14 +116449,14 @@ mYC aUw hSA npG -npG aUw npG npG +aUw fXQ fXQ fXQ -npG +aUw npG npG ddS @@ -115637,6 +117048,7 @@ qJZ tLk ucF beK +fDe beK beK beK @@ -115645,8 +117057,7 @@ beK beK beK beK -beK -beK +fDe beK beK beK @@ -116655,7 +118066,7 @@ gTl vmN lIe jdO -beK +rLF beK beK mJe @@ -116857,8 +118268,8 @@ tSN tHV tLk qMs -beK -beK +rLF +rLF beK mJe ucZ @@ -117506,7 +118917,7 @@ miB eUJ kHM xyW -mVp +pEJ eUJ mVp miB @@ -118251,7 +119662,7 @@ gdU kan kan kan -sfZ +sej oTG eHD wsc @@ -118272,7 +119683,7 @@ qJZ qMs tLk vIa -beK +rLF beK mMK kXp @@ -118474,8 +119885,8 @@ vmN ueO qJZ beK -beK -beK +rLF +rLF mMK kXp kXp @@ -118650,7 +120061,7 @@ xDh xDh pgm dNW -jLy +bmK sfZ kan kan @@ -118663,21 +120074,21 @@ tax sfZ kan icP -xQn +xis icP -xQn +xis tax wsc jLy -emy -sfZ -ycO +cVO +hVW +nFS qJZ vmN qJZ beK beK -beK +rLF mJe gZE kXp @@ -118853,30 +120264,30 @@ xDh xDh ePi kan -wgl kan kan +wgl xis nWJ mpx mpx xAN xis -kan -kan -kan +sPq +sPq +vcN kan pJt kan cal kan -kan +cVO wsc kvz -tac -tac -ycO -ycO +xfx +xfx +nFS +nFS beK beK vIa @@ -119055,17 +120466,17 @@ xDh xDh ePi kan -xUU kan kan +xUU xis eHD eWu kvk mpx xis -hlx -kan +mfc +bFR kan kan kan @@ -119075,11 +120486,11 @@ kan sfZ guW wsc -voH -tac -ycO -ycO +eJl +nYE nFS +beK +beK qAU beK mJe @@ -119257,33 +120668,33 @@ xDh uNM ePi kan -ksK kan kan +ksK xis xAN eHD mpx eHD xis -sfZ -kan -kan +nGq +nfv +lXw kan eLJ kan tax -kan +cVO kan wsc kvz -ycO -ycO -ycO -ycO +nFS +nFS +nFS nFS beK beK +beK mJe uCN ucZ @@ -119458,7 +120869,7 @@ xDh xDh pgm obn -jLy +bmK kan kan kan @@ -119471,15 +120882,15 @@ cal kan sfZ icP -xQn +xis icP -xQn +xis cal icP jLy -hVW -kan -ycO +sfZ +emy +nFS qJZ qJZ qJZ @@ -119867,7 +121278,7 @@ alQ kan kan kan -kan +wsc oTG eOW wsc @@ -120089,18 +121500,18 @@ tHV tHV qMs qJZ -beK +rLF beK beK haD uCN hiA -sBl +tno dYB qKQ dYB dYB -tno +dYB hiA hHR jdj @@ -120282,7 +121693,7 @@ xDh xcU xcU kqH -knX +kqH tNb sIo qMs @@ -120291,13 +121702,13 @@ qJZ tHV tHV qJZ -beK -beK +rLF +rLF beK mJe uCN nWu -qFr +geQ dYB hiA hiA @@ -120701,7 +122112,7 @@ nFS mJe ucZ hiA -qFr +dfJ dYB hiA tiA @@ -121086,7 +122497,7 @@ oKu oKu xDh xDh -knX +kqH tNb tNb lwK @@ -121106,7 +122517,7 @@ mJe eND bTI bTI -jql +avu uCN eND eND @@ -121304,14 +122715,14 @@ qJZ nFS beK beK -qJZ -ucZ -nfU -tNZ -jql -uCN -ucZ -nfU +vdK +aoF +uXz +dkn +elJ +pMv +vTF +okm ucZ wSv sPl @@ -121491,7 +122902,7 @@ xDh xDh xDh tNb -tNb +lwK lwK lwK sPi @@ -121504,16 +122915,16 @@ qJZ qJZ qJZ beK +fDe beK -beK -weq -ucZ -uCN -xKV -jql -tNZ -xKV -ucZ +dpz +eTV +avu +pMv +pMv +elJ +qgv +pVI vQz nfU wSv @@ -121708,15 +123119,15 @@ qJZ beK beK beK -qMs -okm -tNZ -xKV -jql -uCN -myd -myd -ucZ +uYX +elJ +gZN +pMv +qrG +pYW +pMv +kEw +tHt gsy uCN fbr @@ -121910,15 +123321,15 @@ vmN beK beK vIa -qJZ -uCN -ucZ -nfU -unr -uCN -ucZ -uCN -idV +beK +avu +pMv +pMv +cGr +elJ +pMv +pMv +oUY ucZ ucZ fbr @@ -122112,16 +123523,16 @@ qJZ beK beK beK -gGI -uCN -tTg -npg -jql -unr -eTV -tHt -okm +beK +elJ +elJ +dGW +elJ +pMv +elJ +avu ucZ +nfU uCN prw fbr @@ -122314,16 +123725,16 @@ qJZ nFS beK beK -tEM -dok -jql -jql -coD -jql -jql -eJl -dok -wSv +vIa +pMv +pYW +pMv +qxj +aeO +pMv +kXp +sBS +vQz wSv prw fbr @@ -122502,7 +123913,7 @@ xDh oKu kqH tNb -oSy +nWs qJZ pTW qJZ @@ -122516,17 +123927,17 @@ qJZ vIa beK beK -dpz -jql +beK +elJ avu -jql -jql -jql +pMv +elJ +elJ +elJ unr -npg xKV -tNZ -vQz +wSv +ucZ prw fbr fbr @@ -122718,14 +124129,14 @@ qMs beK beK beK -ijB -jql -jql -jql -jql -jql -unr -laG +xDM +dok +elJ +elJ +pMv +pMv +avu +ucZ dok uCN ucZ @@ -122920,15 +124331,15 @@ qJZ beK beK nFS -ijB -jql -jql -jql -jql -jql -coD -jql -ucZ +xhh +xKV +laG +kXp +kXp +wOd +xKV +xKV +nfU myd idV prw @@ -123122,14 +124533,14 @@ qJZ beK beK nFS -ijB -jql -unr -unr -jql -jql -jql -bYK +tLk +ucZ +wSv +gBA +ucZ +ucZ +tNZ +ucZ ucZ wSv uCN @@ -123316,23 +124727,23 @@ vmN vmN vmN qMs -qJZ +tHV vmN lIe qJZ tLk beK -beK +rLF vIa -xDM -jql -jql -unr -jql -jql -pVI -tNZ +tLk +ucZ +ucZ +ucZ +wSv +ucZ gBA +uCN +ucZ wSv wSv fbr @@ -123524,17 +124935,17 @@ qJZ qJZ qJZ beK -beK -beK -xhh -npg -jql -jql -unr -unr -npg +rLF +rLF +qJZ +uCN +uCN ucZ ucZ +xKV +xKV +uCN +ucZ uCN wSv fbr @@ -123722,20 +125133,20 @@ qJZ qJZ qJZ vmN -qJZ +tHV qJZ qJZ vIa beK beK -gGI -xKV -coD +ijB npg -vXN -jql +uCN +wSv +uCN +wSv xKV -jFL +ucZ uCN ghL ucZ @@ -123936,7 +125347,7 @@ tNZ myd ucZ okm -ucZ +nfU xKV ucZ ucZ @@ -124139,7 +125550,7 @@ nfU wSv ucZ ucZ -dfJ +ucZ uCN wSv uCN @@ -124284,7 +125695,7 @@ nXV lss nXV jsd -nXV +jsd jsd nXV jsd @@ -124791,7 +126202,7 @@ eyG dpg rMN tyj -sDr +tyj oCe oCe oCe @@ -124992,8 +126403,8 @@ xbF ksN ilr xkJ +jJS tyj -sDr oCe oCe oCe @@ -125139,7 +126550,7 @@ tHV tHV vmN qJZ -nFS +xfx beK beK tLk @@ -125175,7 +126586,7 @@ ilr mVp ilr eHG -fEi +ilr nEo miB eyG @@ -125194,9 +126605,9 @@ xhU xhU ilr dBp +xhU tyj -tyj -oCe +fxW oCe oCe wjU @@ -125341,7 +126752,7 @@ vmN ruP qJZ qMs -beK +rLF beK beK ijB @@ -125396,9 +126807,9 @@ jJS jJS jJS xhU -tyj -ilr -oCe +xhU +xEY +fxW oCe oCe wjU @@ -125504,7 +126915,7 @@ fqz kJr fqz fqz -fqz +uyo fqz fqz mfo @@ -125544,7 +126955,7 @@ qJZ qJZ tLk beK -beK +rLF beK tEM pwz @@ -125579,7 +126990,7 @@ xhU jJS eHG ilr -jcj +pBr eHG xhU xhU @@ -125589,7 +127000,7 @@ xhU xbF xhU eKC -xAs +pBr kFO xbF eMO @@ -125599,7 +127010,7 @@ jJS irm xhU jJS -xEY +pBr fxW oCe oCe @@ -125708,7 +127119,7 @@ fqz fqz fqz fqz -fqz +nBi vil foY vVw @@ -125953,7 +127364,7 @@ nFS qMs ghL npg -dfJ +ucZ wSv ghL tNZ @@ -126185,7 +127596,7 @@ xbF jJS eHG eHG -jcj +pBr eHG xhU hzP @@ -126195,7 +127606,7 @@ xAs xhU oIk xbF -xbF +pBr xbF kFO qUZ @@ -126205,7 +127616,7 @@ vAI xhU jJS gXN -tyj +pBr oCe hcX xWI @@ -126411,7 +127822,7 @@ tyj oCe hcX kuV -iRs +hOu iRs iRs iRs @@ -126549,7 +127960,7 @@ tac nFT lvM ycO -ijB +kOv pTW qJZ qJZ @@ -126950,7 +128361,7 @@ nze ufX voH ijB -slN +vwj ycO nWn qMs @@ -127161,7 +128572,7 @@ vIa beK beK beK -beK +rLF qJZ uCN uCN @@ -127339,14 +128750,14 @@ sPO yls sPO qnW -sPO +wLq sLh oea oea gTl qJZ jdO -qJZ +tNG qMs nFS beK @@ -127355,15 +128766,15 @@ vIa beK beK nFS -vIa +jwv vIa beK beK beK beK beK -beK -nFS +fDe +xfx qJZ ucZ wSv @@ -127498,8 +128909,8 @@ sWi tNb leL qBY -eAg -qBY +wGe +jxO xOB qCD mtr @@ -127522,7 +128933,7 @@ tNb bjQ bjQ wLq -sPO +qnW hGY xBY dTA @@ -127546,9 +128957,8 @@ oea oea oea nFS -beK -nFS -beK +rLF +xfx beK beK beK @@ -127557,8 +128967,9 @@ beK beK beK beK -nFS beK +xfx +rLF beK ahG beK @@ -127699,8 +129110,8 @@ tNb qQe tNb xOB -qBY -qBY +cVC +jxO gar lbH jxO @@ -127725,7 +129136,7 @@ tNb sPO sPO sPO -xBY +rZO xBY xBY sPO @@ -127739,7 +129150,7 @@ wDQ gix iGj sPO -qnW +kLn yls edm sPO @@ -127749,7 +129160,7 @@ oea oea dff beK -ahG +kMT beK beK beK @@ -127901,8 +129312,8 @@ tNb sWi tNb xOB -gar -qBY +jrT +jxO gar aNY mtr @@ -127943,20 +129354,20 @@ utx syG sPO nPY -yls +edm uxu ccn oea oea -dxy +thD beK nFS beK beK vIa beK -nFS -vIa +xfx +jwv qJZ qJZ qJZ @@ -128103,8 +129514,8 @@ tNb sWi tNb xOB -gar -uXz +ktO +tOT leL leL wkE @@ -128134,7 +129545,7 @@ xBY dTA sPO pLo -sPO +qnW wLq sPO rvE @@ -128145,9 +129556,9 @@ sPO sPO pFL uxu -uxu -uxu -hGY +nPY +nPY +pIz pwR oea pwR @@ -128158,7 +129569,7 @@ beK tEM qJZ qJZ -qJZ +tHV qMs wmH nSI @@ -128328,7 +129739,7 @@ sWi wPv tNb sPO -sPO +wLq sPO qnW xBY @@ -128336,7 +129747,7 @@ xBY hGY dTA xBY -xBY +rZO xBY xBY hGY @@ -128348,7 +129759,7 @@ dTA hGY xBY xBY -xBY +rZO xBY cER xBY @@ -128357,11 +129768,11 @@ beK beK beK beK -qJZ +jdO qJZ pkF qJZ -vmN +cUn uAy tNG qJZ @@ -128497,7 +129908,7 @@ oCe sPO sPO sPO -sPO +wLq sPO sPO aSX @@ -128535,7 +129946,7 @@ nnZ qCV fhZ xBY -xBY +usY xBY xBY drI @@ -128554,7 +129965,7 @@ xBY xBY xBY xBY -xBY +vYY agO beK beK @@ -128734,9 +130145,9 @@ aBk bjQ sPO cMN -fqz +dKA ixt -xBY +vYY xBY xBY xBY @@ -128937,7 +130348,7 @@ bjQ hif fqz aJC -yls +edm qoW jCl xBY @@ -128946,9 +130357,9 @@ xBY eYD jCl mvU -xBY -xpk -sPO +rZO +poT +wLq sPO sPO uxu @@ -128961,7 +130372,7 @@ oea pwR nFS rLF -nFS +xfx beK nFS ycO @@ -129127,7 +130538,7 @@ tNb kqH sWi tNb -tNb +lwK tNb tNb gdc @@ -129149,7 +130560,7 @@ xuW mNc khc xpk -sPO +qnW sPO fQv sPO @@ -129163,7 +130574,7 @@ oea oea cns nFS -nFS +xfx nFS ycO ycO @@ -129364,7 +130775,7 @@ oea oea oea umo -vmN +qDH cns pTW nFS @@ -129383,7 +130794,7 @@ qJZ qMs qMs uCN -ucZ +rPU xVJ xVJ dqQ @@ -129586,7 +130997,7 @@ qMs gTl ucZ xKV -ucZ +rPU wyc wyc xVJ @@ -130337,7 +131748,7 @@ sWi sWi bjQ sWi -tNb +lwK sWi oRP tNb @@ -130384,8 +131795,8 @@ gfM gfM tHV qMs -qJZ -qJZ +tNG +tNG tHV tEM qJZ @@ -130584,7 +131995,7 @@ daX daX daX daX -qJZ +tNG tHV qJZ gTl @@ -130794,11 +132205,11 @@ qMs qJZ qMs qMs +tNG qJZ -qJZ -ucZ -ucZ ucZ +rPU +rPU wyc wyc ubt @@ -130853,7 +132264,7 @@ eyG fMm fMm hcX -iRs +xWI iRs iRs iRs @@ -130997,7 +132408,7 @@ ubt ubt ubt ubt -ucZ +rPU ucZ wyc wyc @@ -131056,7 +132467,7 @@ tyj tyj hcX dVE -bRj +brD iRs bRj hcX @@ -145943,7 +147354,7 @@ aZy aZy mYC egl -nLN +cTS rHo iqN eFM @@ -145956,8 +147367,8 @@ eFM eFM eFM iqN -rHo -rUO +xQn +hjD egl egl mYC @@ -146157,7 +147568,7 @@ sOt rlO eFQ uHl -iqN +eFQ tIR vLX egl @@ -146347,7 +147758,7 @@ aZy aZy mYC egl -nLN +cTS rHo wQO eFQ @@ -146360,8 +147771,8 @@ oXq eFQ eFQ iqN -rHo -rUO +xQn +hjD egl egl mYC @@ -147357,21 +148768,21 @@ aZy aZy mYC egl -nLN +cTS lwf lwi lwf -rUO +hjD egl egl egl egl egl -nLN +cTS lwf lwi lwf -rUO +hjD egl egl mYC @@ -147963,21 +149374,21 @@ aZy aZy mYC egl -nLN +cTS lwf lwi lwf -rUO +hjD egl egl egl egl egl -nLN +cTS lwf lwi lwf -rUO +hjD egl egl mYC @@ -151580,7 +152991,7 @@ bcc bcc bcc bcc -qBH +bcc bcc dxy hGY @@ -151613,7 +153024,7 @@ uhm uhm pFc efY -xnW +yfd hiA aZy sib @@ -152997,9 +154408,9 @@ kan kan sfZ rsg -rsg -sfZ -sfZ +gIe +kan +kan kan urx icP @@ -153198,11 +154609,11 @@ fTn kan kan sfZ -geQ -ovd -ovd +wsc ovd -sfZ +xfT +xfT +kan sfZ kan mha @@ -153401,7 +154812,7 @@ kan kan iYC ovd -eNl +sFf cys iYC iCK @@ -153610,9 +155021,9 @@ mPW kan wFA icP -mfc +dgn icP -mfc +dgn iYC icP rsg @@ -153810,13 +155221,13 @@ kan iYC kan dAL -rsg -rsg +wZi +wZi sfZ -emy -qgd kan +qgd kan +emy kan kvz mfc @@ -154006,7 +155417,7 @@ nPy uCw pTD kan -sfZ +kan kan kan adc @@ -154015,10 +155426,10 @@ kan kan kan kan -brD -kan dAL kan +dAL +emy kan tVj kHg @@ -154209,18 +155620,18 @@ dbt lXw kan kan -sfZ -nfv +kan +kan ghn kan dAL -sfZ -sfZ +xlt +xlt kan -wOd +rsg dAL rsg -sfZ +hVW rsg kvz mfc @@ -154409,7 +155820,7 @@ ghn nTI wKz mLt -apN +pOo lxn ovd eNl @@ -154418,9 +155829,9 @@ mPW rsg wFA icP -mfc +vXN icP -mfc +vXN ghn wsc sfZ @@ -154612,9 +156023,9 @@ kan kan kan ghn -ovd +xfT cys -ovd +xfT ghn iCK adc @@ -154814,10 +156225,10 @@ fTn kan kan kan -sfZ -ovd -ovd +wsc +xfT ovd +xfT sfZ kan kan @@ -155780,7 +157191,7 @@ nPY sPO nPY fqz -fqz +uyo fqz wLq sPO @@ -155980,7 +157391,7 @@ rfD edm uxu uxu -nPY +mOd dKA fqz fqz @@ -156188,7 +157599,7 @@ fqz fqz fyB wLq -xko +aEX wLq fSQ fYf @@ -157198,7 +158609,7 @@ fqz fqz nPY kLn -gbX +iVn wLq fSQ oHi @@ -158824,7 +160235,7 @@ enU tJb tJb tJb -dmS +qwx tJb tJb tJb @@ -160429,7 +161840,7 @@ fqz fqz fqz fqz -fqz +uyo fqz fqz fqz @@ -160751,13 +162162,13 @@ sib sib uYJ onM -lIq +fMr xnj fMr fMr fMr -cTY fMr +cTY hKD rxm rxm @@ -161037,7 +162448,7 @@ fqz fqz fqz fqz -qnW +sCW nnZ xBY sPO @@ -161155,7 +162566,7 @@ sib sib hKD eQy -qmG +eCw qmG vEo wSW @@ -161962,9 +163373,9 @@ sib sib sib xkX -lWm -buH -hZj +wSW +eOe +gXv qcD rYi wSW @@ -162170,8 +163581,8 @@ gvl qcD rYi wSW -gKA wSW +gKA hcX rxm rxm @@ -162372,8 +163783,8 @@ wSW hZj qcD rYi -jCj gKA +jCj hcX rxm rxm @@ -162574,8 +163985,8 @@ wSW gvl kax rYi -jCj gKA +jCj hcX rxm rxm @@ -162647,7 +164058,7 @@ sPk sPk xOB bnB -swb +bnB bnB xOB kcG @@ -162762,7 +164173,7 @@ sib frc frc dXq -dXq +iiF sib fxW fxW @@ -162776,8 +164187,8 @@ hZj qcD rYi wSW -gKA wSW +eRD hcX rxm rxm @@ -162849,7 +164260,7 @@ vMS vMS dNq bnB -swb +bnB bnB xOB pbh @@ -162964,8 +164375,8 @@ frc iiF iiF sib -dXq -dXq +iiF +iiF fxW fxW fxW @@ -162973,8 +164384,8 @@ fxW fxW xkX flh -juB -gvl +wSW +iQi qcD rYi wSW @@ -163166,9 +164577,9 @@ iiF sib sib sib -dXq -dXq -fxW +iiF +iiF +iiF fxW fxW hcX @@ -163368,8 +164779,8 @@ iiF iiF dXq dXq -dXq -fxW +iiF +iiF uZq fxW hcX @@ -163571,7 +164982,7 @@ hcX hcX hcX hcX -hcX +xkX hcX hcX hcX @@ -163766,7 +165177,7 @@ trE dnh vAz vAz -vAz +xxq dqe hcX hcX @@ -164167,7 +165578,7 @@ cPm eKV toK gEU -wSd +qkR wSd wSd wSd @@ -164373,7 +165784,7 @@ wSd wSd ijB haJ -hcX +hKD jZg poq hcX @@ -164572,10 +165983,10 @@ cPm gEU uCO wSd -ijB +rzN pAs ijB -hcX +xkX rjd ljH hcX @@ -164760,24 +166171,24 @@ qYZ toK toK toK -toK +dfT lMW aZy lMW lMW aZy toK -toK +dfT toK toK toK gEU snY cSc +qJZ ijB -rzN beK -hcX +hKD rjd oPy oPy @@ -164972,13 +166383,13 @@ eKV toK toK toK -toK +dfT gEU kPv kPv -beK ijB beK +beK oCM oPy oPy @@ -165161,7 +166572,7 @@ sHv sHv kEU toK -toK +dfT toK eKV eKV @@ -165369,21 +166780,21 @@ toK toK toK toK +dfT toK toK -toK -toK +dfT toK toK dnh lxG uCO -wSd ijB -qJZ beK -rPU -hcX +beK +beK +qJZ +hKD gja oPy oPy @@ -165568,7 +166979,7 @@ jKa dxr toK toK -toK +dfT toK toK qYZ @@ -165579,12 +166990,12 @@ vAz vAz lxG wSd -wSd ijB beK -ijB beK -jwv +beK +qJZ +ijB hcX mBE pTJ @@ -165778,16 +167189,16 @@ vAz lxG uCO wSd +ijB wSd -wSd -wSd -wSd +ijB +beK +beK beK -qJZ ijB umo qMs -hcX +hKD hcX hcX hcX @@ -165969,23 +167380,23 @@ qYZ qYZ cSc wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd +beK +beK +beK +ijB +beK +ijB +beK +kHI +nSI +kHI ijB +beK +beK +beK +beK uYX -qJZ +qMs dOZ qMs bJv @@ -166002,7 +167413,7 @@ oCe oCe oCe bmw -cEY +wxV tyU tyU cEY @@ -166171,19 +167582,19 @@ qYZ qYZ qYZ qYZ -wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd -wSd -hBs -qMs +tNG +ijB +beK +ijB +ijB +beK +beK +beK +beK +beK +beK +ijB +qJZ ity hBs qMs @@ -166375,17 +167786,17 @@ qYZ qYZ umo ity -qJZ -qJZ -qJZ -qJZ +ijB +beK +ijB +ijB eVj nSI -qJZ +tNG lZh qJZ qJZ -qJZ +qMs umo qYZ qYZ @@ -166578,14 +167989,14 @@ qYZ qMs umo nSI -qJZ +tNG umo qYZ lhD lhD qMs -qJZ -ifo +tNG +jJw pAs umo qYZ @@ -180291,7 +181702,7 @@ taL lbr vLX vLX -vLX +lZI vLX vLX taL @@ -181093,7 +182504,7 @@ aZy sib egl lbr -vLX +rND uij vBX vBX @@ -181105,7 +182516,7 @@ aXd vBX vBX ePk -vLX +aEn lbr egl egl @@ -182770,8 +184181,8 @@ oVq oVq oVq oVq -sDr -sDr +tyj +tyj sDr sDr sDr @@ -182973,7 +184384,7 @@ oVq oVq oVq oVq -sDr +tyj sDr sDr sDr @@ -183175,7 +184586,7 @@ oVq oVq oVq oVq -sDr +tyj sDr sDr sDr @@ -183782,6 +185193,7 @@ oVq oVq oVq oVq +tyj sDr sDr sDr @@ -183794,8 +185206,7 @@ sDr sDr sDr sDr -sDr -sDr +tyj oVq oVq sib @@ -183984,6 +185395,7 @@ oVq oVq oVq oVq +tyj sDr sDr sDr @@ -183995,9 +185407,8 @@ sDr sDr sDr sDr -sDr -sDr -sDr +tyj +tyj oVq oVq sib @@ -184593,8 +186004,8 @@ oVq oVq oVq oVq -sDr -sDr +tyj +tyj sDr sDr sDr @@ -184796,9 +186207,9 @@ oVq oVq oVq oVq -sDr -sDr -sDr +tyj +tyj +tyj sDr oVq oVq @@ -184999,9 +186410,9 @@ oVq oVq oVq oVq -oVq -oVq -oVq +lWm +orU +lIq oVq oVq oVq @@ -185200,10 +186611,10 @@ oVq oVq oVq oVq -oVq -oVq -oVq -oVq +ubr +lWm +orU +lIq oVq oVq oVq @@ -185403,11 +186814,11 @@ oVq oVq oVq oVq -oVq -oVq -oVq -oVq -oVq +lWm +orU +lIq +qpF +oGb oVq oVq oVq @@ -185605,9 +187016,9 @@ oVq oVq oVq oVq -oVq -oVq -oVq +lWm +orU +lIq oVq oVq oVq @@ -185807,9 +187218,9 @@ oVq oVq oVq oVq -oVq -oVq -oVq +lWm +orU +lIq oVq oVq oVq @@ -186007,11 +187418,11 @@ oVq oVq oVq oVq -oVq -oVq -oVq -oVq -oVq +qeU +gKW +lWm +orU +lIq oVq oVq oVq @@ -186211,9 +187622,9 @@ oVq oVq oVq oVq -oVq -oVq -oVq +lWm +orU +lIq eHG oVq oVq @@ -186221,10 +187632,10 @@ oVq oVq oVq oVq -sDr -oCe -oCe -oCe +tyj +fxW +fxW +fxW oCe oCe oCe @@ -186413,17 +187824,17 @@ oVq oVq oVq oVq -oVq +lWm +pCx +huN lKC eHG lKC +lKC tyj sDr -sDr -sDr -sDr oVq -sDr +tyj oCe oCe oCe @@ -186618,13 +188029,13 @@ lKC lKC eHG eHG -bxE +lKC +eHG +lKC tyj sDr -sDr -sDr -sDr -sDr +tyj +tyj sDr oCe oCe @@ -186817,13 +188228,13 @@ eHG eHG lKC lKC +piY +lKC +eHG lKC lKC tyj -bxE -sDr -sDr -sDr +tyj sDr sDr sDr @@ -187018,12 +188429,12 @@ lKC eHG lKC lKC +eHG +lKC lKC lKC lKC tyj -bxE -sDr sDr sDr sDr @@ -187419,8 +188830,8 @@ oVq lKC lKC lKC -lKC -lKC +eHG +eHG bxE bxE bxE @@ -188225,7 +189636,7 @@ oVq oVq lKC lKC -lKC +eHG bxE bxE sDr @@ -188426,8 +189837,8 @@ oVq oVq oVq lKC -bxE -bxE +lKC +lKC bxE bxE sDr @@ -188628,7 +190039,7 @@ oVq oVq oVq lKC -bxE +eHG bxE sDr sDr @@ -188830,7 +190241,7 @@ oVq oVq oVq oVq -bxE +lKC bxE sDr sDr @@ -189032,7 +190443,7 @@ oVq oVq oVq lKC -tyj +lKC bxE sDr sDr @@ -189234,7 +190645,7 @@ oVq oVq oVq lKC -tyj +eHG bxE sDr sDr @@ -189436,8 +190847,8 @@ oVq oVq oVq oVq -tyj -bxE +lKC +eHG sDr sDr sDr @@ -189638,8 +191049,8 @@ oVq oVq oVq oVq -bxE -bxE +lKC +lKC sDr sDr sDr @@ -190243,7 +191654,7 @@ oVq oVq oVq lKC -lKC +eHG qUP tyj bxE @@ -190648,7 +192059,7 @@ oVq oVq lKC lKC -lKC +eHG lKC bxE sDr @@ -190850,7 +192261,7 @@ oVq oVq lKC lKC -lKC +eHG bxE bxE sDr @@ -191051,7 +192462,7 @@ oVq oVq oVq oVq -qUP +eHG lKC bxE bxE @@ -191253,7 +192664,7 @@ oVq oVq oVq oVq -qUP +eHG lKC bxE bxE @@ -191858,9 +193269,9 @@ oVq oVq oVq oVq +eHG lKC -lKC -lKC +eHG bxE bxE sDr @@ -192263,7 +193674,7 @@ oVq oVq oVq lKC -lKC +eHG bxE bxE bxE @@ -192464,7 +193875,7 @@ oVq oVq oVq oVq -lKC +eHG lKC bxE tyj @@ -192869,7 +194280,7 @@ oVq oVq oVq lKC -lKC +eHG lKC qUP sDr @@ -200330,7 +201741,7 @@ oVq oVq oVq oVq -thD +eVp mVp eHG uwo @@ -200532,7 +201943,7 @@ oVq oVq oVq oVq -thD +eVp eHG tyj eHG diff --git a/_maps/map_files/otherz/ashlands.dmm b/_maps/map_files/otherz/ashlands.dmm index e9826236e5d..7754e1539fe 100644 --- a/_maps/map_files/otherz/ashlands.dmm +++ b/_maps/map_files/otherz/ashlands.dmm @@ -11367,7 +11367,7 @@ fx Ag pC wj -VL +wj wj Yg Lc diff --git a/_maps/map_files/otherz/ashlands.json b/_maps/map_files/otherz/ashlands.json index 99d7a348e58..d6d25a1451f 100644 --- a/_maps/map_files/otherz/ashlands.json +++ b/_maps/map_files/otherz/ashlands.json @@ -2,5 +2,5 @@ "map_name": "ashlands", "map_path": "map_files/otherz", "map_file": "ashlands.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Down": -1}] + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Down": true}] } diff --git a/_maps/map_files/otherz/bog.json b/_maps/map_files/otherz/bog.json index c14e3488212..ea3f633eec4 100644 --- a/_maps/map_files/otherz/bog.json +++ b/_maps/map_files/otherz/bog.json @@ -2,5 +2,5 @@ "map_name": "bog", "map_path": "map_files/otherz", "map_file": "bog.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Down": -1}] + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Down": true}] } diff --git a/_maps/map_files/otherz/forest.dmm b/_maps/map_files/otherz/forest.dmm index f9627ad1ff1..40339575409 100644 --- a/_maps/map_files/otherz/forest.dmm +++ b/_maps/map_files/otherz/forest.dmm @@ -795,12 +795,6 @@ /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) -"eE" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom3" - }, -/turf/open/water/swamp, -/area/rogue/indoors/shelter/woods/overgrownfort) "eF" = ( /turf/closed/wall/shroud{ opacity = 0 @@ -1073,10 +1067,6 @@ /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) -"gv" = ( -/obj/structure/spawner/invisible/monster/minotaur, -/turf/open/floor/rogue/naturalstone, -/area/rogue/indoors/cave/minotaurcave) "gy" = ( /obj/structure/spider/stickyweb{ icon_state = "stickyweb2" @@ -1127,10 +1117,6 @@ /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) -"gH" = ( -/obj/structure/spawner/invisible/monster/minotaur, -/turf/open/floor/grass, -/area/rogue/indoors/cave/minotaurcave) "gN" = ( /obj/structure/flora/grass/jungle, /turf/open/floor/rogue/blocks, @@ -1681,7 +1667,6 @@ "jO" = ( /obj/structure/bed/rogue/inn/hay, /obj/item/bedsheet/rogue/cloth, -/obj/structure/spawner/invisible/skeleton, /turf/open/floor/rogue/blocks, /area/rogue/indoors/shelter/woods/overgrownfort) "jP" = ( @@ -1738,10 +1723,6 @@ /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) -"kc" = ( -/obj/effect/mob_spawner/goblin, -/turf/open/floor/rogue/cobblerock, -/area/rogue/indoors/shelter/woods/overgrownfort) "ke" = ( /obj/structure/flora/ausbushes/sparsegrass, /turf/open/floor/rogue/grass, @@ -2835,12 +2816,12 @@ /obj/structure/spacevine, /turf/open/water/river, /area/rogue/outdoors/river) -"qI" = ( -/obj/machinery/light/rogue/torchholder{ - pixel_y = 26 - }, -/turf/open/floor/rogue/cobblerock, -/area/rogue/indoors/shelter/woods/overgrownfort) +"qL" = ( +/obj/effect/mob_spawner/wilderness/hostile, +/turf/open/floor/rogue/dirt, +/area/rogue/outdoors/woods{ + first_time_text = "The Deepwoods" + }) "qM" = ( /turf/open/floor/rogue/rooftop, /area/rogue/outdoors/woods{ @@ -3369,10 +3350,6 @@ /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) -"tZ" = ( -/obj/structure/glowshroom, -/turf/open/water/swamp, -/area/rogue/indoors/shelter/woods/overgrownfort) "ua" = ( /obj/structure/stairs{ dir = 4 @@ -3491,10 +3468,6 @@ "uH" = ( /turf/closed/wall/mineral/rogue/wooddark/vertical, /area/rogue/outdoors/woods/wraithhouse) -"uK" = ( -/obj/effect/mob_spawner/goblin, -/turf/closed/wall/mineral/rogue/stone/moss, -/area/rogue/indoors/shelter/woods/overgrownfort) "uL" = ( /obj/machinery/light/rogue/smelter/great, /turf/open/floor/rogue/metal, @@ -4003,11 +3976,6 @@ }, /turf/open/floor/bronze, /area/rogue/indoors/shelter/town/dwarf) -"xz" = ( -/obj/structure/chair/stool/rogue, -/obj/effect/mob_spawner/goblin, -/turf/open/floor/rogue/ruinedwood/spiral, -/area/rogue/indoors/shelter/woods/overgrownfort) "xF" = ( /obj/structure/flora/roguegrass/water, /turf/open/water/river{ @@ -5973,6 +5941,13 @@ first_time_text = "The Woodland Tribe"; name = "Wood elf Tribes" }) +"Jf" = ( +/obj/effect/wisp, +/obj/effect/mob_spawner/wilderness/hostile, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors/woods{ + first_time_text = "The Deepwoods" + }) "Ji" = ( /obj/structure/flora/newtree, /obj/structure/flora/grass/jungle/b{ @@ -7208,10 +7183,6 @@ /obj/machinery/light/rogue/firebowl, /turf/open/floor/rogue/blocks, /area/rogue/indoors/shelter/woods/overgrownfort) -"Qf" = ( -/obj/effect/mob_spawner/goblin, -/turf/open/floor/rogue/dirt/road, -/area/rogue/indoors/shelter/woods/overgrownfort) "Qh" = ( /obj/structure/fluff/railing/wood{ dir = 1; @@ -7465,6 +7436,10 @@ /mob/living/carbon/human/species/goblin/npc/hell, /turf/open/floor/rogue/blocks, /area/rogue/indoors/shelter/woods/overgrownfort) +"RM" = ( +/obj/structure/spawner/invisible/goblin, +/turf/open/floor/rogue/ruinedwood/spiral, +/area/rogue/indoors/shelter/woods/overgrownfort) "RN" = ( /obj/structure/fluff/railing/border, /obj/structure/table/wood{ @@ -7844,6 +7819,7 @@ /obj/structure/rack/rogue, /obj/item/flashlight/flare/torch/lantern, /obj/item/flashlight/flare/torch/lantern, +/obj/effect/mob_spawner/goblin, /turf/open/floor/rogue/blocks, /area/rogue/indoors/shelter/woods/overgrownfort) "Us" = ( @@ -8192,10 +8168,6 @@ first_time_text = "The Woodland Tribe"; name = "Wood elf Tribes" }) -"Wx" = ( -/mob/living/carbon/human/species/skeleton/npc/dungeon/boss, -/turf/open/floor/rogue/cobblerock, -/area/rogue/indoors/shelter/woods/overgrownfort) "WA" = ( /obj/structure/flora/roguegrass/water/reeds, /turf/open/water/swamp/deep, @@ -8290,6 +8262,10 @@ }, /turf/open/floor/rogue/naturalstone, /area/rogue/indoors/cave/underdark) +"Xf" = ( +/obj/effect/mob_spawner/skeleton, +/turf/open/floor/rogue/dirt/road, +/area/rogue/indoors/shelter/woods/overgrownfort) "Xg" = ( /turf/open/floor/rogue/cobblerock, /area/rogue/outdoors/woods{ @@ -8730,12 +8706,6 @@ /area/rogue/outdoors/woods{ first_time_text = "The Deepwoods" }) -"ZX" = ( -/obj/structure/glowshroom{ - icon_state = "glowshroom2" - }, -/turf/open/water/swamp, -/area/rogue/indoors/shelter/woods/overgrownfort) "ZY" = ( /obj/machinery/light/rogue/torchholder{ dir = 8 @@ -21876,7 +21846,7 @@ Ly hQ hQ aZ -hI +BJ BJ aZ aZ @@ -22543,7 +22513,7 @@ Ly aZ hT wT -Wx +BJ BJ BJ iB @@ -22675,7 +22645,7 @@ Ly Ly aZ RR -ZX +iB iB iB iB @@ -22814,7 +22784,7 @@ wT iB bK iB -hI +BJ BJ aZ wT @@ -23078,8 +23048,8 @@ BJ BJ iB iB -eE -bK +iB +Xf BJ iB wT @@ -23344,7 +23314,7 @@ wT IV iB iB -mD +BJ aZ BJ BJ @@ -24138,7 +24108,7 @@ Ly Ly aZ iB -tZ +iB iB iB iB @@ -24272,7 +24242,7 @@ Ly aZ wT iB -ZX +iB iB iB iB @@ -24406,7 +24376,7 @@ aZ wT mk xx -eE +iB IV hd wT @@ -40918,7 +40888,7 @@ wO wO wO PJ -gv +pn pn jJ ut @@ -41324,7 +41294,7 @@ zU fZ fZ fZ -gv +pn IR wO wO @@ -42119,7 +42089,7 @@ fZ fZ fZ GU -gH +Dv bq Dv pn @@ -42515,7 +42485,7 @@ SS at pn pn -gv +pn pn zU fZ @@ -42795,7 +42765,7 @@ wO wO oA Dv -gH +Dv Dv oA DO @@ -54200,7 +54170,7 @@ Ja Ja Ja uB -uB +qL NI NI dp @@ -55755,7 +55725,7 @@ JP iu Ng Ng -Ng +uB Ja Ja Ja @@ -55869,7 +55839,7 @@ Ja Ja Ja Ja -Ja +uB mb mb EV @@ -56004,7 +55974,7 @@ Ja Ja Ja Ja -Ja +uB Mx Ng dF @@ -56020,7 +55990,7 @@ NI NI NI NI -Ng +uB Ja Ja Ja @@ -56402,7 +56372,7 @@ NI Ng NI dF -Ja +uB Ja Ja Ja @@ -56536,7 +56506,7 @@ NI NI dF dF -Ja +uB Ja Ja Ja @@ -56669,10 +56639,10 @@ NI NI NI NI -Ng -Ng -Ng -Ng +uB +uB +uB +uB NI IH Ng @@ -56817,7 +56787,7 @@ NI NI NI dF -mw +Jf Ng Ng NI @@ -58425,8 +58395,8 @@ Ng Ng Ng Ng -uB -uB +Ng +Ng Ng Ng dF @@ -58468,8 +58438,8 @@ Lk Vd zv bK -BJ -BJ +RX +RX BP db db @@ -58559,7 +58529,7 @@ Ng Ng NI NI -uB +Ng Ng Ng dF @@ -58600,9 +58570,9 @@ Cu AP AL bK -BJ -BJ -BJ +RX +RX +RX Vo RX aN @@ -58720,7 +58690,7 @@ tS BP BP Bi -ew +RM ew ew ew @@ -58733,8 +58703,8 @@ pI BP AL bK -BJ -BJ +RX +RX bK Wr Lm @@ -58866,8 +58836,8 @@ Cu AP AL El -BJ -BJ +RX +RX Gn BP BP @@ -58998,9 +58968,9 @@ RX pI bl gS -Qf -BJ -BJ +bK +RX +RX Gn Ug rq @@ -59132,9 +59102,9 @@ Cu AP af Gn -BJ -WQ -BJ +RX +gW +RX WN FU sG @@ -59253,7 +59223,7 @@ BP BP lF Cg -xz +Cg ew Or iF @@ -59265,9 +59235,9 @@ xp BP oH Gn -BJ -BJ -WQ +RX +RX +gW WQ WX Bw @@ -59398,9 +59368,9 @@ sQ AP Wf bK -BJ -WQ -WQ +RX +gW +gW BJ fB ra @@ -59526,13 +59496,13 @@ PL BP BP Vo -uK +BP BP Lk gS bK -BJ -WQ +RX +gW Gn Ug iI @@ -59664,8 +59634,8 @@ Kp BP AL El -BJ -BJ +RX +RX bK BP BP @@ -59797,8 +59767,8 @@ Kp OJ AL bK -BJ -BJ +RX +RX bK SF uB @@ -59930,8 +59900,8 @@ Ou BP bK bK -BJ -BJ +RX +RX Gn hi uB @@ -60062,9 +60032,9 @@ RX RX BP Vt -BJ -BJ -BJ +RX +RX +RX Gn hi uB @@ -60194,10 +60164,10 @@ RX RX RX BP -qI -kc -BJ -BJ +oR +RX +RX +RX bK hi uB @@ -60327,10 +60297,10 @@ RX RX RX LN -BJ -BJ -BJ -BJ +RX +RX +RX +RX bK hi uB @@ -60460,10 +60430,10 @@ RX RX RX BP -qI -BJ -BJ -BJ +oR +RX +RX +RX bK hi uB @@ -60594,9 +60564,9 @@ NT BP BP jY -BJ -BJ -BJ +RX +RX +RX bK hi uB diff --git a/_maps/map_files/otherz/forest.json b/_maps/map_files/otherz/forest.json index d776ca05993..b1097f7823f 100644 --- a/_maps/map_files/otherz/forest.json +++ b/_maps/map_files/otherz/forest.json @@ -2,5 +2,5 @@ "map_name": "forest", "map_path": "map_files/otherz", "map_file": "forest.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Down": -1}] + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Down": true}] } diff --git a/_maps/map_files/otherz/old/otherz.json b/_maps/map_files/otherz/old/otherz.json index 04241a53840..194efcae90b 100644 --- a/_maps/map_files/otherz/old/otherz.json +++ b/_maps/map_files/otherz/old/otherz.json @@ -2,5 +2,5 @@ "map_name": "Otherz", "map_path": "map_files/roguetown/otherz", "map_file": "otherz.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Down": -1}] + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Down": true}] } diff --git a/_maps/map_files/otherz/rogueworld.json b/_maps/map_files/otherz/rogueworld.json index 9dfa4bfae1a..f1f75c0994e 100644 --- a/_maps/map_files/otherz/rogueworld.json +++ b/_maps/map_files/otherz/rogueworld.json @@ -2,5 +2,5 @@ "map_name": "rogueworld", "map_path": "map_files/otherz", "map_file": "rogueworld.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Down": -1}] + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Down": true}] } diff --git a/_maps/map_files/otherz/smallforest.json b/_maps/map_files/otherz/smallforest.json index 6ca6150c9fe..1dc7b929601 100644 --- a/_maps/map_files/otherz/smallforest.json +++ b/_maps/map_files/otherz/smallforest.json @@ -2,5 +2,5 @@ "map_name": "smallforest", "map_path": "map_files/otherz", "map_file": "smallforest.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Down": -1}] + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Down": true}] } diff --git a/_maps/map_files/rockhill/rockhill.dmm b/_maps/map_files/rockhill/rockhill.dmm index 7b727d7151a..d203f0cd3b3 100644 --- a/_maps/map_files/rockhill/rockhill.dmm +++ b/_maps/map_files/rockhill/rockhill.dmm @@ -20921,7 +20921,7 @@ /obj/structure/table/wood{ icon_state = "tablewood1" }, -/obj/item/clothing/ringP, +/obj/item/clothing/neck/roguetown/psicross/ringP, /turf/open/floor/rogue/wood, /area/rogue/indoors/town/shop) "mzk" = ( @@ -20939,8 +20939,8 @@ /area/rogue/outdoors/bog) "mzx" = ( /obj/structure/rack/rogue, -/obj/item/clothing/ring/lantern, -/obj/item/clothing/ring/lantern, +/obj/item/flashlight/flare/torch/lantern/ring, +/obj/item/flashlight/flare/torch/lantern/ring, /turf/open/floor/carpet/royalblack, /area/rogue/indoors/town/shop) "mzE" = ( diff --git a/_maps/map_files/roguetest/roguetest.dmm b/_maps/map_files/roguetest/roguetest.dmm index 7045ac5df39..20c5f8c63df 100644 --- a/_maps/map_files/roguetest/roguetest.dmm +++ b/_maps/map_files/roguetest/roguetest.dmm @@ -1,13 +1,10 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aa" = ( -/turf, -/area) +/turf/open/space/basic, +/area/space) "ab" = ( /turf/closed/mineral/rogue/bedrock, /area/rogue/indoors) -"ac" = ( -/turf/closed, -/area) "ad" = ( /obj/structure/closet/crate/chest, /obj/item/rogueweapon/tongs, @@ -243,6 +240,7 @@ /turf/open/floor/rogue/dirt/road, /area/rogue/outdoors) "aM" = ( +/turf/open/space/basic, /area/rogue/outdoors) "aN" = ( /obj/structure/table/wood{ @@ -788,9 +786,6 @@ /obj/item/roguekey/lord, /turf/open/floor/rogue/cobble, /area/rogue/indoors) -"bY" = ( -/turf/closed/mineral/rogue/bedrock, -/area) "bZ" = ( /obj/structure/table/wood{ icon_state = "tablewood2"; @@ -937,6 +932,7 @@ name = "BoxStation emergency evac bay"; width = 15 }, +/turf/open/space/basic, /area/rogue/outdoors) "cq" = ( /turf/closed/mineral/rogue/bedrock, @@ -1066,7 +1062,7 @@ /area/rogue/outdoors) "cN" = ( /turf/open/floor/rogue/dirt/road, -/area) +/area/space) "cO" = ( /obj/structure/roguethrone, /obj/structure/roguemachine/titan, @@ -4657,20 +4653,20 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ab ab ag @@ -4914,20 +4910,20 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ab ab ag @@ -5171,20 +5167,20 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ab ab af @@ -5428,20 +5424,20 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ab ab ag @@ -5685,20 +5681,20 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ab ab ag @@ -5942,20 +5938,20 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ab ab ah @@ -6199,20 +6195,20 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ab ab cQ @@ -6456,20 +6452,20 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ab ab aJ @@ -6713,16 +6709,16 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa cN ab ab @@ -6970,16 +6966,16 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa cN ab aj @@ -7227,16 +7223,16 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa cN ab cO @@ -7484,16 +7480,16 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa cN ab aj @@ -7741,16 +7737,16 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ab ab ab @@ -7998,16 +7994,16 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ab cF cF @@ -8255,16 +8251,16 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ab cF am @@ -8512,16 +8508,16 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ab cF am @@ -8769,16 +8765,16 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ab bP am @@ -9026,16 +9022,16 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ab ab am @@ -9283,16 +9279,16 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ab bP am @@ -9540,16 +9536,16 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ab vW am @@ -9797,16 +9793,16 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ab vW vW @@ -10054,16 +10050,16 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ab ab ab @@ -10311,20 +10307,20 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa ab ab ab @@ -10568,24 +10564,24 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa cq aM aM @@ -10604,13 +10600,13 @@ aM aM aM cq -ac -ac -ac -ac -ac -ac -bY +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -10825,20 +10821,20 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -11082,20 +11078,20 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -11339,20 +11335,20 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -11596,20 +11592,20 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -11853,20 +11849,20 @@ aa aa aa aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa diff --git a/_maps/oldtown.json b/_maps/oldtown.json index 35d926740dd..895f95690d4 100644 --- a/_maps/oldtown.json +++ b/_maps/oldtown.json @@ -2,7 +2,7 @@ "map_name": "Old Blackstone", "map_path": "map_files/oldtown", "map_file": "oldtown.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Down": -1}], + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Down": true}], "minetype": null, "space_empty_levels": 0, "space_ruin_levels": 0, diff --git a/_maps/rockhill.json b/_maps/rockhill.json index e68e01ed59c..1a0df035004 100644 --- a/_maps/rockhill.json +++ b/_maps/rockhill.json @@ -2,7 +2,7 @@ "map_name": "Rockhill", "map_path": "map_files/rockhill", "map_file": "rockhill.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Down": -1}], + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Down": true}], "minetype": null, "space_empty_levels": 0, "space_ruin_levels": 0, diff --git a/_maps/roguetest.json b/_maps/roguetest.json index 6349acea045..c36b0b27046 100644 --- a/_maps/roguetest.json +++ b/_maps/roguetest.json @@ -1,7 +1,7 @@ { "map_name": "Roguetest", - "map_path": "map_files/Roguetest", - "map_file": "Roguetest.dmm", + "map_path": "map_files/roguetest", + "map_file": "roguetest.dmm", "minetype": null, "space_empty_levels": 0, "space_ruin_levels": 0, diff --git a/_maps/roguetown.json b/_maps/roguetown.json index 629f4304ba4..e115b7fed52 100644 --- a/_maps/roguetown.json +++ b/_maps/roguetown.json @@ -2,7 +2,7 @@ "map_name": "Roguetown", "map_path": "map_files/roguetown", "map_file": "roguetown.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Down": -1}], + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Down": true}], "minetype": null, "space_empty_levels": 0, "space_ruin_levels": 0, diff --git a/_maps/roguetown2.json b/_maps/roguetown2.json index 9d1c15e302d..0be4451ebbb 100644 --- a/_maps/roguetown2.json +++ b/_maps/roguetown2.json @@ -2,7 +2,7 @@ "map_name": "Roguetown 2", "map_path": "map_files/roguetown2", "map_file": "roguetown2.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Down": -1}], + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Down": true}], "minetype": null, "space_empty_levels": 0, "space_ruin_levels": 0, diff --git a/_maps/roguewar.json b/_maps/roguewar.json index 3a829e336b7..53ed11e0184 100644 --- a/_maps/roguewar.json +++ b/_maps/roguewar.json @@ -2,7 +2,7 @@ "map_name": "roguewar", "map_path": "map_files/roguewar", "map_file": "roguewar.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Down": -1}], + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Down": true}], "minetype": null, "space_empty_levels": 0, "space_ruin_levels": 0, diff --git a/_maps/rogueworld.json b/_maps/rogueworld.json index 11f857e15b8..157a0c568f6 100644 --- a/_maps/rogueworld.json +++ b/_maps/rogueworld.json @@ -1,8 +1,8 @@ { "map_name": "Rogueworld", - "map_path": "map_files/Rogueworld", - "map_file": "Rogueworld.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Up": 1, "Down": -1}, {"Down": -1}], + "map_path": "map_files/rogueworld", + "map_file": "rogueworld.dmm", + "traits": [{"Up": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Up": true, "Down": true}, {"Down": true}], "minetype": null, "space_empty_levels": 0, "space_ruin_levels": 0, diff --git a/_maps/templates/shelter_2.dmm b/_maps/templates/shelter_2.dmm index b8d034cfc04..233ba1ec74a 100644 --- a/_maps/templates/shelter_2.dmm +++ b/_maps/templates/shelter_2.dmm @@ -19,25 +19,22 @@ /turf/open/floor/rogue/hexstone, /area/rogue/indoors) "d" = ( -/turf/closed/wall/mineral/rogue/decowood, +/turf/closed/wall/mineral/rogue/pipe, /area/rogue/indoors) "e" = ( /obj/item/roguebin/water, /obj/machinery/light/rogue/wallfire/candle/l, -/turf/open/floor/rogue/hexstone, -/turf/open/floor/rogue/hexstone, -/turf/open/floor/rogue/hexstone, +/turf/open/floor/rogue/metal, /area/rogue/indoors) "f" = ( /obj/machinery/anvil/crafted, /obj/item/rogueweapon/tongs, /obj/item/rogueweapon/hammer/claw, -/turf/open/floor/rogue/hexstone, +/turf/open/floor/rogue/metal, /area/rogue/indoors) "g" = ( /obj/machinery/light/rogue/forge, -/turf/open/floor/rogue/hexstone, -/turf/open/floor/rogue/hexstone, +/turf/open/floor/rogue/metal, /area/rogue/indoors) "i" = ( /obj/structure/fluff/grindwheel, @@ -45,13 +42,11 @@ /turf/open/floor/rogue/hexstone, /area/rogue/indoors) "l" = ( -/obj/machinery/light/rogue/smelter/improved, -/turf/open/floor/rogue/hexstone, +/obj/machinery/light/rogue/smelter/great, +/turf/open/floor/rogue/metal, /area/rogue/indoors) "m" = ( -/turf/open/floor/rogue/hexstone, -/turf/open/floor/rogue/hexstone, -/turf/open/floor/rogue/hexstone, +/turf/open/floor/rogue/metal, /area/rogue/indoors) "o" = ( /obj/structure/lever/wall{ @@ -66,11 +61,6 @@ "p" = ( /turf/closed/wall/mineral/rogue/wooddark, /area/rogue/indoors) -"q" = ( -/turf/closed/wall/mineral/rogue/wooddark{ - icon_state = "wooddark-k" - }, -/area/rogue/indoors) "r" = ( /turf/open/floor/rogue/hexstone, /area/rogue/indoors) @@ -82,12 +72,14 @@ "t" = ( /obj/structure/chair/stool/rogue, /obj/structure/roguemachine/atm, +/obj/structure/roguemachine/drugmachine{ + pixel_x = -32 + }, /turf/open/floor/rogue/hexstone, /area/rogue/indoors) "u" = ( /obj/structure/chair/stool/rogue, /turf/open/floor/rogue/hexstone, -/turf/open/floor/rogue/hexstone, /area/rogue/indoors) "v" = ( /obj/structure/roguemachine/stockpile, @@ -154,7 +146,7 @@ d (2,1,1) = {" d e -w +m p t y @@ -163,11 +155,11 @@ d (3,1,1) = {" d f -r +m l u z -q +d "} (4,1,1) = {" d diff --git a/_maps/templates/shelter_3.dmm b/_maps/templates/shelter_3.dmm index e607deb791b..91da8e5406f 100644 --- a/_maps/templates/shelter_3.dmm +++ b/_maps/templates/shelter_3.dmm @@ -62,6 +62,13 @@ }, /turf/open/floor/rogue/greenstone, /area/rogue/indoors) +"fY" = ( +/obj/structure/chair/wood/rogue/fancy{ + dir = 8 + }, +/obj/structure/roguemachine/scomm, +/turf/open/floor/rogue/greenstone, +/area/rogue/indoors) "gi" = ( /obj/structure/table/vtable/v2, /obj/structure/lever/wall{ @@ -349,9 +356,8 @@ /turf/open/floor/rogue/greenstone, /area/rogue/indoors) "UK" = ( -/obj/structure/roguemachine/merchantvend{ - icon_state = "goldvendor"; - locked = 0 +/obj/structure/roguemachine/merchantvend/public{ + icon_state = "goldvendor" }, /turf/closed/wall/mineral/rogue/craftstone, /area/rogue/indoors) @@ -452,7 +458,7 @@ oF fW rV FX -Kf +fY Kf ld ld diff --git a/_maps/templates/unit_tests.dmm b/_maps/templates/unit_tests.dmm new file mode 100644 index 00000000000..a03d0783bad --- /dev/null +++ b/_maps/templates/unit_tests.dmm @@ -0,0 +1,79 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/rock, +/area/misc/testroom) +"m" = ( +/turf/open/floor/grass, +/area/misc/testroom) +"r" = ( +/obj/effect/landmark/unit_test_top_right, +/turf/open/floor/grass, +/area/misc/testroom) +"L" = ( +/obj/effect/landmark/unit_test_bottom_left, +/turf/open/floor/grass, +/area/misc/testroom) + +(1,1,1) = {" +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +m +m +m +m +L +a +"} +(3,1,1) = {" +a +m +m +m +m +m +a +"} +(4,1,1) = {" +a +m +m +m +m +m +a +"} +(5,1,1) = {" +a +m +m +m +m +m +a +"} +(6,1,1) = {" +a +r +m +m +m +m +a +"} +(7,1,1) = {" +a +a +a +a +a +a +a +"} diff --git a/code/__DEFINES/_tick.dm b/code/__DEFINES/_tick.dm index 895b38b2eef..0419468a0e2 100644 --- a/code/__DEFINES/_tick.dm +++ b/code/__DEFINES/_tick.dm @@ -25,4 +25,4 @@ /// Checks if a sleeping proc is running before or after the master controller #define RUNNING_BEFORE_MASTER ( Master.last_run != null && Master.last_run != world.time ) /// Returns true if a verb ought to yield to the MC (IE: queue up to be processed by a subsystem) -#define VERB_SHOULD_YIELD ( TICK_CHECK || RUNNING_BEFORE_MASTER ) \ No newline at end of file +#define VERB_SHOULD_YIELD ( TICK_CHECK || RUNNING_BEFORE_MASTER ) diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index d01d55d0143..e133915c7c6 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -416,3 +416,7 @@ #define COMSIG_XENO_TURF_CLICK_SHIFT "xeno_turf_click_shift" //from turf ShiftClickOn(): (/mob) #define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt" //from turf AltClickOn(): (/mob) #define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl" //from monkey CtrlClickOn(): (/mob) + +//stonehedge slop +#define COMSIG_APPLY_REAGENTS "item_apply_reagents" //used for weapon coating +#define COMSIG_FEINT_REACT "mob_feint_react" //used for reagent_coating component diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm index 63b6443ee65..60f99c4c750 100644 --- a/code/__DEFINES/food.dm +++ b/code/__DEFINES/food.dm @@ -18,4 +18,4 @@ #define DRINK_GOOD 2 #define DRINK_VERYGOOD 3 #define DRINK_FANTASTIC 4 -#define FOOD_AMAZING 5 \ No newline at end of file +#define FOOD_AMAZING 5 diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 33516d87c6c..c254269d124 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -107,20 +107,6 @@ GLOBAL_LIST_INIT(our_forest_sex, typecacheof(list( #define ismonkey(A) (istype(A, /mob/living/carbon/monkey)) -#define isalien(A) (istype(A, /mob/living/carbon/alien)) - -#define islarva(A) (istype(A, /mob/living/carbon/alien/larva)) - -#define isalienadult(A) (istype(A, /mob/living/carbon/alien/humanoid) || istype(A, /mob/living/simple_animal/hostile/alien)) - -#define isalienhunter(A) (istype(A, /mob/living/carbon/alien/humanoid/hunter)) - -#define isaliensentinel(A) (istype(A, /mob/living/carbon/alien/humanoid/sentinel)) - -#define isalienroyal(A) (istype(A, /mob/living/carbon/alien/humanoid/royal)) - -#define isalienqueen(A) (istype(A, /mob/living/carbon/alien/humanoid/royal/queen)) - #define istruedevil(A) (istype(A, /mob/living/carbon/true_devil)) //Silicon mobs diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm index 79f9192f926..a083f68538e 100644 --- a/code/__DEFINES/language.dm +++ b/code/__DEFINES/language.dm @@ -3,5 +3,6 @@ #define LANGUAGE_HIDE_ICON_IF_UNDERSTOOD 4 #define LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD 8 #define SIGNLANG 16 +#define LANGUAGE_HIDE_NOT_UNDERSTOOD 32 #define LANGUAGE_KNOWN "language_known" #define LANGUAGE_SHADOWED "language_shadowed" diff --git a/code/__DEFINES/mapping.dm b/code/__DEFINES/mapping.dm new file mode 100644 index 00000000000..3c08679e2a4 --- /dev/null +++ b/code/__DEFINES/mapping.dm @@ -0,0 +1,6 @@ +// Defines for SSmapping's multiz_levels +/// TRUE if we're ok with going up +#define Z_LEVEL_UP 1 +/// TRUE if we're ok with going down +#define Z_LEVEL_DOWN 2 +#define LARGEST_Z_LEVEL_INDEX Z_LEVEL_DOWN diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index 9e446fbd48a..c33cb014973 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -44,7 +44,7 @@ require only minor tweaks. // number - default gravity if there's no gravity generators or area overrides present #define ZTRAIT_GRAVITY "Gravity" -// numeric offsets - e.g. {"Down": -1} means that chasms will fall to z - 1 rather than oblivion +// Whether this z level is linked up/down. Bool. #define ZTRAIT_UP "Up" #define ZTRAIT_DOWN "Down" diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 02e25a4448f..839dd3a17c2 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -438,11 +438,9 @@ GLOBAL_LIST_INIT(pda_styles, sortList(list(MONO, VT, ORBITRON, SHARE))) #define TELEPORT_CHANNEL_CULT "cult" //Cult teleportation, does whatever it wants (unless there's holiness) #define TELEPORT_CHANNEL_FREE "free" //Anything else -//Run the world with this parameter to enable a single run though of the game setup and tear down process with unit tests in between -#define TEST_RUN_PARAMETER "test-run" //Force the log directory to be something specific in the data/logs folder #define OVERRIDE_LOG_DIRECTORY_PARAMETER "log-directory" -//Prevent the master controller from starting automatically, overrides TEST_RUN_PARAMETER +//Prevent the master controller from starting automatically #define NO_INIT_PARAMETER "no-init" //Force the config directory to be something other than "config" #define OVERRIDE_CONFIG_DIRECTORY_PARAMETER "config-directory" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 698988095c1..e0adc9c8e99 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -79,8 +79,6 @@ #define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augmentation/augments.dmi' #define MONKEY_BODYPART "monkey" -#define ALIEN_BODYPART "alien" -#define LARVA_BODYPART "larva" #define DEVIL_BODYPART "devil" /*see __DEFINES/inventory.dm for bodypart bitflag defines*/ diff --git a/code/__DEFINES/movement.dm b/code/__DEFINES/movement.dm index 0a9c48b37ea..a62af980faa 100644 --- a/code/__DEFINES/movement.dm +++ b/code/__DEFINES/movement.dm @@ -17,4 +17,4 @@ GLOBAL_VAR_INIT(glide_size_multiplier, 1.0) /// Then that's multiplied by the global glide size multiplier. 1.25 by default feels pretty close to spot on. This is just to try to get byond to behave. /// The whole result is then clamped to within the range above. /// Not very readable but it works -#define DELAY_TO_GLIDE_SIZE(delay) (clamp(((world.icon_size / max((delay) / world.tick_lag, 1)) * GLOB.glide_size_multiplier), MIN_GLIDE_SIZE, MAX_GLIDE_SIZE)) \ No newline at end of file +#define DELAY_TO_GLIDE_SIZE(delay) (clamp(((world.icon_size / max((delay) / world.tick_lag, 1)) * GLOB.glide_size_multiplier), MIN_GLIDE_SIZE, MAX_GLIDE_SIZE)) diff --git a/code/__DEFINES/multiz.dm b/code/__DEFINES/multiz.dm new file mode 100644 index 00000000000..41451861564 --- /dev/null +++ b/code/__DEFINES/multiz.dm @@ -0,0 +1,4 @@ +/// Attempt to get the turf below the provided one according to Z traits +#define GET_TURF_BELOW(turf) ((!(turf) || length(SSmapping.multiz_levels) < (turf).z || !SSmapping.multiz_levels[(turf).z][Z_LEVEL_DOWN]) ? null : get_step((turf), DOWN)) +/// Attempt to get the turf above the provided one according to Z traits +#define GET_TURF_ABOVE(turf) ((!(turf) || length(SSmapping.multiz_levels) < (turf).z || !SSmapping.multiz_levels[(turf).z][Z_LEVEL_UP]) ? null : get_step((turf), UP)) diff --git a/code/__DEFINES/musicsystem.dm b/code/__DEFINES/musicsystem.dm index 4f51cd22743..2caae6f503d 100644 --- a/code/__DEFINES/musicsystem.dm +++ b/code/__DEFINES/musicsystem.dm @@ -3,4 +3,4 @@ #define MUSIC_PRIO_CMUSIC 2 #define MUSIC_PRIO_SPAWNMUSIC 3 #define MUSIC_PRIO_HORROR 4 -#define MUSIC_PRIO_SLEEPING 5 \ No newline at end of file +#define MUSIC_PRIO_SLEEPING 5 diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index e6455c6737e..4eb61e5dbf9 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -25,7 +25,7 @@ #define ROLE_MALF "Malf AI" #define ROLE_REV "Revolutionary" #define ROLE_REV_HEAD "Head Revolutionary" -#define ROLE_ALIEN "Xenomorph" + #define ROLE_PAI "pAI" #define ROLE_CULTIST "Cultist" #define ROLE_BLOB "Blob" @@ -58,7 +58,6 @@ GLOBAL_LIST_INIT(special_roles, list( ROLE_WIZARD = /datum/game_mode/wizard, ROLE_MALF, ROLE_REV = /datum/game_mode/revolution, - ROLE_ALIEN, ROLE_PAI, ROLE_BLOB, ROLE_NINJA, @@ -72,12 +71,12 @@ GLOBAL_LIST_INIT(special_roles, list( )) GLOBAL_LIST_INIT(special_roles_rogue, list( - ROLE_MANIAC = /datum/antagonist/maniac, - ROLE_PREBEL = /datum/antagonist/prebel, +// ROLE_MANIAC = /datum/antagonist/maniac, +// ROLE_PREBEL = /datum/antagonist/prebel, ROLE_BANDIT = /datum/antagonist/bandit, - ROLE_ASPIRANT = /datum/antagonist/aspirant, +// ROLE_ASPIRANT = /datum/antagonist/aspirant, ROLE_WEREWOLF = /datum/antagonist/werewolf, - ROLE_ZIZOIDCULTIST = /datum/antagonist/zizocultist, +// ROLE_ZIZOIDCULTIST = /datum/antagonist/zizocultist, ROLE_NBEAST = /datum/antagonist/vampirelord, ROLE_LICH = /datum/antagonist/lich )) diff --git a/code/__DEFINES/rust_g.dm b/code/__DEFINES/rust_g.dm index f63cf10da41..0e9c2322d07 100644 --- a/code/__DEFINES/rust_g.dm +++ b/code/__DEFINES/rust_g.dm @@ -38,20 +38,131 @@ #define RUST_G (__rust_g || __detect_rust_g()) #endif -#define RUSTG_JOB_NO_RESULTS_YET "NO RESULTS YET" -#define RUSTG_JOB_NO_SUCH_JOB "NO SUCH JOB" -#define RUSTG_JOB_ERROR "JOB PANICKED" +// Handle 515 call() -> call_ext() changes +#if DM_VERSION >= 515 +#define RUSTG_CALL call_ext +#else +#define RUSTG_CALL call +#endif + +/// Gets the version of rust_g +/proc/rustg_get_version() return RUSTG_CALL(RUST_G, "get_version")() + + +/** + * Sets up the Aho-Corasick automaton with its default options. + * + * The search patterns list and the replacements must be of the same length when replace is run, but an empty replacements list is allowed if replacements are supplied with the replace call + * Arguments: + * * key - The key for the automaton, to be used with subsequent rustg_acreplace/rustg_acreplace_with_replacements calls + * * patterns - A non-associative list of strings to search for + * * replacements - Default replacements for this automaton, used with rustg_acreplace + */ +#define rustg_setup_acreplace(key, patterns, replacements) RUSTG_CALL(RUST_G, "setup_acreplace")(key, json_encode(patterns), json_encode(replacements)) + +/** + * Sets up the Aho-Corasick automaton using supplied options. + * + * The search patterns list and the replacements must be of the same length when replace is run, but an empty replacements list is allowed if replacements are supplied with the replace call + * Arguments: + * * key - The key for the automaton, to be used with subsequent rustg_acreplace/rustg_acreplace_with_replacements calls + * * options - An associative list like list("anchored" = 0, "ascii_case_insensitive" = 0, "match_kind" = "Standard"). The values shown on the example are the defaults, and default values may be omitted. See the identically named methods at https://docs.rs/aho-corasick/latest/aho_corasick/struct.AhoCorasickBuilder.html to see what the options do. + * * patterns - A non-associative list of strings to search for + * * replacements - Default replacements for this automaton, used with rustg_acreplace + */ +#define rustg_setup_acreplace_with_options(key, options, patterns, replacements) RUSTG_CALL(RUST_G, "setup_acreplace")(key, json_encode(options), json_encode(patterns), json_encode(replacements)) + +/** + * Run the specified replacement engine with the provided haystack text to replace, returning replaced text. + * + * Arguments: + * * key - The key for the automaton + * * text - Text to run replacements on + */ +#define rustg_acreplace(key, text) RUSTG_CALL(RUST_G, "acreplace")(key, text) + +/** + * Run the specified replacement engine with the provided haystack text to replace, returning replaced text. + * + * Arguments: + * * key - The key for the automaton + * * text - Text to run replacements on + * * replacements - Replacements for this call. Must be the same length as the set-up patterns + */ +#define rustg_acreplace_with_replacements(key, text, replacements) RUSTG_CALL(RUST_G, "acreplace_with_replacements")(key, text, json_encode(replacements)) -#define rustg_dmi_strip_metadata(fname) call_ext(RUST_G, "dmi_strip_metadata")(fname) -#define rustg_dmi_create_png(path, width, height, data) call_ext(RUST_G, "dmi_create_png")(path, width, height, data) +/** + * This proc generates a cellular automata noise grid which can be used in procedural generation methods. + * + * Returns a single string that goes row by row, with values of 1 representing an alive cell, and a value of 0 representing a dead cell. + * + * Arguments: + * * percentage: The chance of a turf starting closed + * * smoothing_iterations: The amount of iterations the cellular automata simulates before returning the results + * * birth_limit: If the number of neighboring cells is higher than this amount, a cell is born + * * death_limit: If the number of neighboring cells is lower than this amount, a cell dies + * * width: The width of the grid. + * * height: The height of the grid. + */ +#define rustg_cnoise_generate(percentage, smoothing_iterations, birth_limit, death_limit, width, height) \ + RUSTG_CALL(RUST_G, "cnoise_generate")(percentage, smoothing_iterations, birth_limit, death_limit, width, height) -#define rustg_noise_get_at_coordinates(seed, x, y) call_ext(RUST_G, "noise_get_at_coordinates")(seed, x, y) +/** + * This proc generates a grid of perlin-like noise + * + * Returns a single string that goes row by row, with values of 1 representing an turned on cell, and a value of 0 representing a turned off cell. + * + * Arguments: + * * seed: seed for the function + * * accuracy: how close this is to the original perlin noise, as accuracy approaches infinity, the noise becomes more and more perlin-like + * * stamp_size: Size of a singular stamp used by the algorithm, think of this as the same stuff as frequency in perlin noise + * * world_size: size of the returned grid. + * * lower_range: lower bound of values selected for. (inclusive) + * * upper_range: upper bound of values selected for. (exclusive) + */ +#define rustg_dbp_generate(seed, accuracy, stamp_size, world_size, lower_range, upper_range) \ + RUSTG_CALL(RUST_G, "dbp_generate")(seed, accuracy, stamp_size, world_size, lower_range, upper_range) -#define rustg_git_revparse(rev) call_ext(RUST_G, "rg_git_revparse")(rev) -#define rustg_git_commit_date(rev) call_ext(RUST_G, "rg_git_commit_date")(rev) -#define rustg_log_write(fname, text, format) call_ext(RUST_G, "log_write")(fname, text, format) -/proc/rustg_log_close_all() return call_ext(RUST_G, "log_close_all")() +#define rustg_dmi_strip_metadata(fname) RUSTG_CALL(RUST_G, "dmi_strip_metadata")(fname) +#define rustg_dmi_create_png(path, width, height, data) RUSTG_CALL(RUST_G, "dmi_create_png")(path, width, height, data) +#define rustg_dmi_resize_png(path, width, height, resizetype) RUSTG_CALL(RUST_G, "dmi_resize_png")(path, width, height, resizetype) +/** + * input: must be a path, not an /icon; you have to do your own handling if it is one, as icon objects can't be directly passed to rustg. + * + * output: json_encode'd list. json_decode to get a flat list with icon states in the order they're in inside the .dmi + */ +#define rustg_dmi_icon_states(fname) RUSTG_CALL(RUST_G, "dmi_icon_states")(fname) + +#define rustg_file_read(fname) RUSTG_CALL(RUST_G, "file_read")(fname) +#define rustg_file_exists(fname) (RUSTG_CALL(RUST_G, "file_exists")(fname) == "true") +#define rustg_file_write(text, fname) RUSTG_CALL(RUST_G, "file_write")(text, fname) +#define rustg_file_append(text, fname) RUSTG_CALL(RUST_G, "file_append")(text, fname) +#define rustg_file_get_line_count(fname) text2num(RUSTG_CALL(RUST_G, "file_get_line_count")(fname)) +#define rustg_file_seek_line(fname, line) RUSTG_CALL(RUST_G, "file_seek_line")(fname, "[line]") + +#ifdef RUSTG_OVERRIDE_BUILTINS + #define file2text(fname) rustg_file_read("[fname]") + #define text2file(text, fname) rustg_file_append(text, "[fname]") +#endif + +/// Returns the git hash of the given revision, ex. "HEAD". +#define rustg_git_revparse(rev) RUSTG_CALL(RUST_G, "rg_git_revparse")(rev) + +/** + * Returns the date of the given revision using the provided format. + * Defaults to returning %F which is YYYY-MM-DD. + */ +/proc/rustg_git_commit_date(rev, format = "%F") + return RUSTG_CALL(RUST_G, "rg_git_commit_date")(rev, format) + +/** + * Returns the formatted datetime string of HEAD using the provided format. + * Defaults to returning %F which is YYYY-MM-DD. + * This is different to rustg_git_commit_date because it only needs the logs directory. + */ +/proc/rustg_git_commit_date_head(format = "%F") + return RUSTG_CALL(RUST_G, "rg_git_commit_date_head")(format) #define RUSTG_HTTP_METHOD_GET "get" #define RUSTG_HTTP_METHOD_PUT "put" @@ -59,13 +170,83 @@ #define RUSTG_HTTP_METHOD_PATCH "patch" #define RUSTG_HTTP_METHOD_HEAD "head" #define RUSTG_HTTP_METHOD_POST "post" -#define rustg_http_request_blocking(method, url, body, headers) call_ext(RUST_G, "http_request_blocking")(method, url, body, headers) -#define rustg_http_request_async(method, url, body, headers) call_ext(RUST_G, "http_request_async")(method, url, body, headers) -#define rustg_http_check_request(req_id) call_ext(RUST_G, "http_check_request")(req_id) - -#define rustg_sql_connect_pool(options) call_ext(RUST_G, "sql_connect_pool")(options) -#define rustg_sql_query_async(handle, query, params) call_ext(RUST_G, "sql_query_async")(handle, query, params) -#define rustg_sql_query_blocking(handle, query, params) call_ext(RUST_G, "sql_query_blocking")(handle, query, params) -#define rustg_sql_connected(handle) call_ext(RUST_G, "sql_connected")(handle) -#define rustg_sql_disconnect_pool(handle) call_ext(RUST_G, "sql_disconnect_pool")(handle) -#define rustg_sql_check_query(job_id) call_ext(RUST_G, "sql_check_query")("[job_id]") +#define rustg_http_request_blocking(method, url, body, headers, options) RUSTG_CALL(RUST_G, "http_request_blocking")(method, url, body, headers, options) +#define rustg_http_request_async(method, url, body, headers, options) RUSTG_CALL(RUST_G, "http_request_async")(method, url, body, headers, options) +#define rustg_http_check_request(req_id) RUSTG_CALL(RUST_G, "http_check_request")(req_id) + +#define RUSTG_JOB_NO_RESULTS_YET "NO RESULTS YET" +#define RUSTG_JOB_NO_SUCH_JOB "NO SUCH JOB" +#define RUSTG_JOB_ERROR "JOB PANICKED" + +#define rustg_json_is_valid(text) (RUSTG_CALL(RUST_G, "json_is_valid")(text) == "true") + +#define rustg_log_write(fname, text, format) RUSTG_CALL(RUST_G, "log_write")(fname, text, format) +/proc/rustg_log_close_all() return RUSTG_CALL(RUST_G, "log_close_all")() + +#define rustg_noise_get_at_coordinates(seed, x, y) RUSTG_CALL(RUST_G, "noise_get_at_coordinates")(seed, x, y) + +/** + * Generates a 2D poisson disk distribution ('blue noise'), which is relatively uniform. + * + * params: + * `seed`: str + * `width`: int, width of the noisemap (see world.maxx) + * `length`: int, height of the noisemap (see world.maxy) + * `radius`: int, distance between points on the noisemap + * + * returns: + * a width*length length string of 1s and 0s representing a 2D poisson sample collapsed into a 1D string + */ +#define rustg_noise_poisson_map(seed, width, length, radius) RUSTG_CALL(RUST_G, "noise_poisson_map")(seed, width, length, radius) + +/* + * Takes in a string and json_encode()"d lists to produce a sanitized string. + * This function operates on whitelists, there is currently no way to blacklist. + * Args: + * * text: the string to sanitize. + * * attribute_whitelist_json: a json_encode()'d list of HTML attributes to allow in the final string. + * * tag_whitelist_json: a json_encode()'d list of HTML tags to allow in the final string. + */ +#define rustg_sanitize_html(text, attribute_whitelist_json, tag_whitelist_json) RUSTG_CALL(RUST_G, "sanitize_html")(text, attribute_whitelist_json, tag_whitelist_json) + +#define rustg_sql_connect_pool(options) RUSTG_CALL(RUST_G, "sql_connect_pool")(options) +#define rustg_sql_query_async(handle, query, params) RUSTG_CALL(RUST_G, "sql_query_async")(handle, query, params) +#define rustg_sql_query_blocking(handle, query, params) RUSTG_CALL(RUST_G, "sql_query_blocking")(handle, query, params) +#define rustg_sql_connected(handle) RUSTG_CALL(RUST_G, "sql_connected")(handle) +#define rustg_sql_disconnect_pool(handle) RUSTG_CALL(RUST_G, "sql_disconnect_pool")(handle) +#define rustg_sql_check_query(job_id) RUSTG_CALL(RUST_G, "sql_check_query")("[job_id]") + +#define rustg_time_microseconds(id) text2num(RUSTG_CALL(RUST_G, "time_microseconds")(id)) +#define rustg_time_milliseconds(id) text2num(RUSTG_CALL(RUST_G, "time_milliseconds")(id)) +#define rustg_time_reset(id) RUSTG_CALL(RUST_G, "time_reset")(id) + +/// Returns the timestamp as a string +/proc/rustg_unix_timestamp() + return RUSTG_CALL(RUST_G, "unix_timestamp")() + +#define rustg_raw_read_toml_file(path) json_decode(RUSTG_CALL(RUST_G, "toml_file_to_json")(path) || "null") + +/proc/rustg_read_toml_file(path) + var/list/output = rustg_raw_read_toml_file(path) + if (output["success"]) + return json_decode(output["content"]) + else + CRASH(output["content"]) + +#define rustg_raw_toml_encode(value) json_decode(RUSTG_CALL(RUST_G, "toml_encode")(json_encode(value))) + +/proc/rustg_toml_encode(value) + var/list/output = rustg_raw_toml_encode(value) + if (output["success"]) + return output["content"] + else + CRASH(output["content"]) + +#define rustg_url_encode(text) RUSTG_CALL(RUST_G, "url_encode")("[text]") +#define rustg_url_decode(text) RUSTG_CALL(RUST_G, "url_decode")(text) + +#ifdef RUSTG_OVERRIDE_BUILTINS + #define url_encode(text) rustg_url_encode(text) + #define url_decode(text) rustg_url_decode(text) +#endif + diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index 9983aec6ea3..75d1658eb13 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -33,7 +33,6 @@ #define MODE_DEADMIN "deadmin" #define MODE_KEY_DEADMIN "d" -#define MODE_ALIEN "alientalk" #define MODE_HOLOPAD "holopad" #define MODE_CHANGELING "changeling" diff --git a/code/__DEFINES/sexcon_defines.dm b/code/__DEFINES/sexcon_defines.dm index b63b78e6f3e..8fd6a90c0c0 100644 --- a/code/__DEFINES/sexcon_defines.dm +++ b/code/__DEFINES/sexcon_defines.dm @@ -3,7 +3,7 @@ GLOBAL_LIST_INIT(sex_actions, build_sex_actions()) #define SEX_ACTION(sex_action_type) GLOB.sex_actions[sex_action_type] #define MAX_AROUSAL 225 -#define PASSIVE_EJAC_THRESHOLD 208 +#define PASSIVE_EJAC_THRESHOLD 200 #define ACTIVE_EJAC_THRESHOLD 200 #define AROUSAL_HARD_ON_THRESHOLD 20 #define CHARGE_RECHARGE_RATE (CHARGE_FOR_CLIMAX / (5 MINUTES)) diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index 1e9b14c108d..2cc5484e462 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -188,4 +188,4 @@ #define PICKUP_SOUND_VOLUME 100 #define DROP_SOUND_VOLUME 100 #define YEET_SOUND_VOLUME 100 -#define SHEATHE_SOUND_VOLUME 15 \ No newline at end of file +#define SHEATHE_SOUND_VOLUME 15 diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 2303dd47f12..f1a7fe9a378 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -161,12 +161,12 @@ #define FIRE_PRIORITY_THROWING 25 #define FIRE_PRIORITY_SPACEDRIFT 30 #define FIRE_PRIORITY_FIELDS 30 -#define FIRE_PRIOTITY_SMOOTHING 35 +#define FIRE_PRIORITY_SMOOTHING 35 #define FIRE_PRIORITY_HUDS 40 #define FIRE_PRIORITY_NETWORKS 40 #define FIRE_PRIORITY_OBJ 40 #define FIRE_PRIORITY_ACID 40 -#define FIRE_PRIOTITY_BURNING 40 +#define FIRE_PRIORITY_BURNING 40 #define FIRE_PRIORITY_DEFAULT 50 #define FIRE_PRIORITY_PARALLAX 65 #define FIRE_PRIORITY_MOBS 100 @@ -194,7 +194,7 @@ ///Compile all the overlays for an atom from the cache lists #define COMPILE_OVERLAYS(A)\ - if (TRUE) {\ + do {\ var/list/ad = A.add_overlays;\ var/list/rm = A.remove_overlays;\ var/list/po = A.priority_overlays;\ @@ -216,4 +216,4 @@ }\ }\ A.flags_1 &= ~OVERLAY_QUEUED_1;\ - } + } while (FALSE) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index b8505b67dc3..b9d7667e187 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -27,7 +27,7 @@ #define TRAIT_CYCLOPS_RIGHT "Cyclops (Right)" //poked right eye #define TRAIT_RETARD_ANATOMY "Inhumen Anatomy" //can't wear hats and shoes #define TRAIT_NASTY_EATER "Inhumen Digestion" //can eat rotten food, organs, poison berries, and drink murky water -#define TRAIT_WILD_EATER "Beastly Digestion" //can eat raw and rotten food and drink murky water +HS EDIT:Poison berries too +#define TRAIT_WILD_EATER "Beastly Digestion" //can eat raw and rotten food and drink murky water +DK EDIT:organs too, no longer protects from berry poison #define TRAIT_NOFALLDAMAGE1 "Minor fall damage immunity" #define TRAIT_MISSING_NOSE "Missing Nose" //halved stamina regeneration #define TRAIT_DISFIGURED "Disfigured" @@ -41,6 +41,7 @@ #define TRAIT_SEEDKNOW "Seed Knower" #define TRAIT_GOODRUNNER "Good Runner" #define TRAIT_TINY "Tiny" +#define TRAIT_SEESPIRITS "Spectral Sight" // ROGUEspecialTRAITS (description when rmb skills button) #define TRAIT_CIVILIZEDBARBARIAN "Tavern Brawler" #define TRAIT_COMICSANS "Annoying Face" @@ -101,6 +102,7 @@ #define TRAIT_LEPROSY "Leprosy" #define TRAIT_NUDE_SLEEPER "Picky Sleeper" #define TRAIT_ENDOWMENT "Enchanted Endowment" // should apply +3 CON -2 END -1 SPD, restricts most armor and using bows/crossbows, slows getting up. +#define TRAIT_ENDOWMENTLITE "Natural Endowment" // no drawback version. // PATRON CURSE TRAITS #define TRAIT_CURSE "Curse" //source @@ -119,6 +121,10 @@ #define TRAIT_BAOTHA_CURSE "Baotha's Curse" #define TRAIT_NYMPHO_CURSE "Nympho Curse" +//STONEHEDGE TRAITS +#define TRAIT_USEMAGICITEM "Use Magic Item" +#define TRAIT_FEINT_IMMUNITY "Unfeintable" + GLOBAL_LIST_INIT(roguetraits, list( TRAIT_LEPROSY = span_necrosis("I'm a disgusting leper..."), TRAIT_CHOSEN = "Elysius choose you to represent his glory.", @@ -195,7 +201,6 @@ GLOBAL_LIST_INIT(roguetraits, list( TRAIT_FIENDKISS = "When I cast projectile magic, the fiend also hurls a fire bolt at the same location.", // Hearthstone change TRAIT_CHARGER = "I can charge into people like a ram.", // Hearthstone change TRAIT_ARTIFICER = "I can use gems to improve items.", // Hearthstone change - TRAIT_BOG_TREKKING = "Expert in navigating these lands.", // Hearthstone change TRAIT_GOODRUNNER = span_info("I can run without breaking a sweat!"), TRAIT_NUDE_SLEEPER = span_warning("I can't fall asleep unless I'm nude and in bed."), @@ -204,6 +209,9 @@ GLOBAL_LIST_INIT(roguetraits, list( TRAIT_NIGHT_VISION = span_info("Whether because of my species, my career choice, or by some boon of my patron, my eyes have adapted to see well in the dark."), TRAIT_SUPER_NV = span_info("My ability to see in the dark extends further than that of most others, and I can consciously control how bright my surroundings appear to me."), TRAIT_BLINDFIGHTING = span_info("I have an incredible sense of awareness, allowing me to dodge and parry attacks even when I can't see them coming, If i am in high awareness, I can even prevent sneak attacks."), + TRAIT_SEESPIRITS = span_necrosis("My eyes peer beyond the veil of life and death, allowing me to perceive spirits."), + TRAIT_USEMAGICITEM = span_info("I know my way around magic items by legit means or trickery."), + TRAIT_FEINT_IMMUNITY = span_info("Those fools can not feint me."), )) // trait accessor defines @@ -288,7 +296,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_IGNOREDAMAGESLOWDOWN "ignoredamageslowdown" #define TRAIT_DEATHCOMA "deathcoma" //Causes death-like unconsciousness #define TRAIT_FAKEDEATH "fakedeath" //Makes the owner appear as dead to most forms of medical examination -#define TRAIT_XENO_HOST "xeno_host" //Tracks whether we're gonna be a baby alien's mummy. #define TRAIT_STUNIMMUNE "stun_immunity" #define TRAIT_STUNRESISTANCE "stun_resistance" #define TRAIT_SLEEPIMMUNE "sleep_immunity" diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index 91f8280c3ce..330e1421c01 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -119,7 +119,6 @@ #define VV_HK_MAKE_MONKEY "human_monkify" #define VV_HK_MAKE_CYBORG "human_cyborgify" #define VV_HK_MAKE_SLIME "human_slimeify" -#define VV_HK_MAKE_ALIEN "human_alienify" #define VV_HK_SET_SPECIES "setspecies" #define VV_HK_PURRBATION "purrbation" diff --git a/code/__DEFINES/weather.dm b/code/__DEFINES/weather.dm index 1abe8484338..b573db1c690 100644 --- a/code/__DEFINES/weather.dm +++ b/code/__DEFINES/weather.dm @@ -1 +1 @@ -GLOBAL_LIST_EMPTY(sky_z) \ No newline at end of file +GLOBAL_LIST_EMPTY(sky_z) diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index ee925f97221..a66abf13c39 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -26,8 +26,8 @@ #define testing(msg) #endif -#ifdef UNIT_TESTS /proc/log_test(text) +#ifdef UNIT_TESTS WRITE_LOG(GLOB.test_log, text) SEND_TEXT(world.log, text) #endif diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 26308609463..29d6731b199 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -470,7 +470,7 @@ var/list/result = list() for(var/m in group) var/mob/M = m - if(!M.key || !M.client || (ignore_category && GLOB.poll_ignore[ignore_category] && M.ckey in GLOB.poll_ignore[ignore_category])) + if(!M.key || !M.client || (ignore_category && GLOB.poll_ignore[ignore_category] && (M.ckey in GLOB.poll_ignore[ignore_category]))) continue if(be_special_flag) if(!(M.client.prefs) || !(be_special_flag in M.client.prefs.be_special)) diff --git a/code/__HELPERS/hearthstone.dm b/code/__HELPERS/hearthstone.dm index 308902125cc..2f2d09c2c9d 100644 --- a/code/__HELPERS/hearthstone.dm +++ b/code/__HELPERS/hearthstone.dm @@ -65,7 +65,7 @@ for(var/color in color_list) . += color -/proc/find_key_by_value(var/list/list, value) +/proc/find_key_by_value(list/list, value) for(var/key in list) var/found_value = list[key] if(found_value == value) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index d93ad0a611f..00d4c3ea15f 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -1107,7 +1107,7 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0 var/name = sanitize_filename("[generate_asset_name(thing)].png") register_asset(name, thing) for (var/thing2 in targets) - send_asset(thing2, key, FALSE) + send_asset_async(thing2, key) return "" var/atom/A = thing if (isnull(dir)) @@ -1131,7 +1131,7 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0 key = "[generate_asset_name(I)].png" register_asset(key, I) for (var/thing2 in targets) - send_asset(thing2, key, FALSE) + send_asset_async(thing2, key) return "" diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index e673596d56f..38f86578619 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -521,7 +521,7 @@ GLOBAL_LIST_EMPTY(species_list) continue if(M.stat != DEAD && !override) continue - if(speaker_key && speaker_key in prefs.ignoring) + if(speaker_key && (speaker_key in prefs.ignoring)) continue switch(message_type) diff --git a/code/__HELPERS/pronouns.dm b/code/__HELPERS/pronouns.dm index 5aff4eb0014..3479d95423a 100644 --- a/code/__HELPERS/pronouns.dm +++ b/code/__HELPERS/pronouns.dm @@ -39,6 +39,12 @@ /datum/proc/p_es(temp_gender) . = "es" +/datum/proc/p_themselves(capitalized, temp_gender) + . = p_them(capitalized, temp_gender) + if(lowertext(.) == "them") + return "[.]selves" + return "[.]self" + //like clients, which do have gender. /client/p_they(capitalized, temp_gender) if(!temp_gender) @@ -116,6 +122,11 @@ if(temp_gender != PLURAL && temp_gender != NEUTER) . = "es" +/client/p_themselves(capitalized, temp_gender) + if(!temp_gender) + temp_gender = gender + return ..(capitalized, temp_gender) + // LETHALSTONE NOTE: hello! we always return early on PLURAL check here because it's always correct (human mob overrides set it for disguises) and respects disguises. causes some code duplication though //mobs(and atoms but atoms don't really matter write your own proc overrides) also have gender! @@ -345,3 +356,10 @@ if((SLOT_PANTS in obscured) && skipface) temp_gender = PLURAL return ..() + +/mob/living/carbon/human/p_themselves(capitalized, temp_gender) + var/list/obscured = check_obscured_slots() + var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) + if((SLOT_PANTS in obscured) && skipface) + temp_gender = PLURAL + return ..(capitalized, temp_gender) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 5e2d7964056..19ce9db1b15 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -324,7 +324,7 @@ end_reason = "The Werevolves formed an unholy clan, marauding StoneHedge until the end of its daes." if(C.cultascended) - end_reason = "ZIZOZIZOZIZOZIZO" + end_reason = "Levishth!" if(C.headrebdecree) end_reason = "The peasant rebels took control of the throne, hail the new community!" diff --git a/code/__HELPERS/sorts/__main.dm b/code/__HELPERS/sorts/__main.dm index 768622818ff..cc394a0649a 100644 --- a/code/__HELPERS/sorts/__main.dm +++ b/code/__HELPERS/sorts/__main.dm @@ -31,615 +31,615 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sortInstance, new()) var/list/runLens = list() - proc/timSort(start, end) - runBases.Cut() - runLens.Cut() +/datum/sortInstance/proc/timSort(start, end) + runBases.Cut() + runLens.Cut() - var/remaining = end - start + var/remaining = end - start - //If array is small, do a 'mini-TimSort' with no merges - if(remaining < MIN_MERGE) - var/initRunLen = countRunAndMakeAscending(start, end) - binarySort(start, end, start+initRunLen) - return + //If array is small, do a 'mini-TimSort' with no merges + if(remaining < MIN_MERGE) + var/initRunLen = countRunAndMakeAscending(start, end) + binarySort(start, end, start+initRunLen) + return - //March over the array finding natural runs - //Extend any short natural runs to runs of length minRun - var/minRun = minRunLength(remaining) + //March over the array finding natural runs + //Extend any short natural runs to runs of length minRun + var/minRun = minRunLength(remaining) - do - //identify next run - var/runLen = countRunAndMakeAscending(start, end) + do + //identify next run + var/runLen = countRunAndMakeAscending(start, end) - //if run is short, extend to min(minRun, remaining) - if(runLen < minRun) - var/force = (remaining <= minRun) ? remaining : minRun + //if run is short, extend to min(minRun, remaining) + if(runLen < minRun) + var/force = (remaining <= minRun) ? remaining : minRun - binarySort(start, start+force, start+runLen) - runLen = force + binarySort(start, start+force, start+runLen) + runLen = force - //add data about run to queue - runBases.Add(start) - runLens.Add(runLen) - - //maybe merge - mergeCollapse() - - //Advance to find next run - start += runLen - remaining -= runLen - - while(remaining > 0) - - - //Merge all remaining runs to complete sort - //ASSERT(start == end) - mergeForceCollapse(); - //ASSERT(runBases.len == 1) - - //reset minGallop, for successive calls - minGallop = MIN_GALLOP - - return L - - /* - Sorts the specified portion of the specified array using a binary - insertion sort. This is the best method for sorting small numbers - of elements. It requires O(n log n) compares, but O(n^2) data - movement (worst case). - - If the initial part of the specified range is already sorted, - this method can take advantage of it: the method assumes that the - elements in range [lo,start) are already sorted - - lo the index of the first element in the range to be sorted - hi the index after the last element in the range to be sorted - start the index of the first element in the range that is not already known to be sorted - */ - proc/binarySort(lo, hi, start) - //ASSERT(lo <= start && start <= hi) - if(start <= lo) - start = lo + 1 - - for(,start < hi, ++start) - var/pivot = fetchElement(L,start) - - //set left and right to the index where pivot belongs - var/left = lo - var/right = start - //ASSERT(left <= right) - - //[lo, left) elements <= pivot < [right, start) elements - //in other words, find where the pivot element should go using bisection search - while(left < right) - var/mid = (left + right) >> 1 //round((left+right)/2) - if(call(cmp)(fetchElement(L,mid), pivot) > 0) - right = mid - else - left = mid+1 - - //ASSERT(left == right) - moveElement(L, start, left) //move pivot element to correct location in the sorted range - - /* - Returns the length of the run beginning at the specified position and reverses the run if it is back-to-front + //add data about run to queue + runBases.Add(start) + runLens.Add(runLen) - A run is the longest ascending sequence with: - a[lo] <= a[lo + 1] <= a[lo + 2] <= ... - or the longest descending sequence with: - a[lo] > a[lo + 1] > a[lo + 2] > ... + //maybe merge + mergeCollapse() - For its intended use in a stable mergesort, the strictness of the - definition of "descending" is needed so that the call can safely - reverse a descending sequence without violating stability. - */ - proc/countRunAndMakeAscending(lo, hi) - //ASSERT(lo < hi) - - var/runHi = lo + 1 - if(runHi >= hi) - return 1 - - var/last = fetchElement(L,lo) - var/current = fetchElement(L,runHi++) - - if(call(cmp)(current, last) < 0) - while(runHi < hi) - last = current - current = fetchElement(L,runHi) - if(call(cmp)(current, last) >= 0) - break - ++runHi - reverseRange(L, lo, runHi) - else - while(runHi < hi) - last = current - current = fetchElement(L,runHi) - if(call(cmp)(current, last) < 0) - break - ++runHi - - return runHi - lo - - //Returns the minimum acceptable run length for an array of the specified length. - //Natural runs shorter than this will be extended with binarySort - proc/minRunLength(n) - //ASSERT(n >= 0) - var/r = 0 //becomes 1 if any bits are shifted off - while(n >= MIN_MERGE) - r |= (n & 1) - n >>= 1 - return n + r - - //Examines the stack of runs waiting to be merged and merges adjacent runs until the stack invariants are reestablished: - // runLen[i-3] > runLen[i-2] + runLen[i-1] - // runLen[i-2] > runLen[i-1] - //This method is called each time a new run is pushed onto the stack. - //So the invariants are guaranteed to hold for i= 2) - var/n = runBases.len - 1 - if(n > 1 && runLens[n-1] <= runLens[n] + runLens[n+1]) - if(runLens[n-1] < runLens[n+1]) - --n - mergeAt(n) - else if(runLens[n] <= runLens[n+1]) - mergeAt(n) + //Advance to find next run + start += runLen + remaining -= runLen + + while(remaining > 0) + + + //Merge all remaining runs to complete sort + //ASSERT(start == end) + mergeForceCollapse(); + //ASSERT(runBases.len == 1) + + //reset minGallop, for successive calls + minGallop = MIN_GALLOP + + return L + +/* +Sorts the specified portion of the specified array using a binary +insertion sort. This is the best method for sorting small numbers +of elements. It requires O(n log n) compares, but O(n^2) data +movement (worst case). + +If the initial part of the specified range is already sorted, +this method can take advantage of it: the method assumes that the +elements in range [lo,start) are already sorted + +lo the index of the first element in the range to be sorted +hi the index after the last element in the range to be sorted +start the index of the first element in the range that is not already known to be sorted +*/ +/datum/sortInstance/proc/binarySort(lo, hi, start) + //ASSERT(lo <= start && start <= hi) + if(start <= lo) + start = lo + 1 + + for(,start < hi, ++start) + var/pivot = fetchElement(L,start) + + //set left and right to the index where pivot belongs + var/left = lo + var/right = start + //ASSERT(left <= right) + + //[lo, left) elements <= pivot < [right, start) elements + //in other words, find where the pivot element should go using bisection search + while(left < right) + var/mid = (left + right) >> 1 //round((left+right)/2) + if(call(cmp)(fetchElement(L,mid), pivot) > 0) + right = mid else - break //Invariant is established - - - //Merges all runs on the stack until only one remains. - //Called only once, to finalise the sort - proc/mergeForceCollapse() - while(runBases.len >= 2) - var/n = runBases.len - 1 - if(n > 1 && runLens[n-1] < runLens[n+1]) + left = mid+1 + + //ASSERT(left == right) + moveElement(L, start, left) //move pivot element to correct location in the sorted range + +/* +Returns the length of the run beginning at the specified position and reverses the run if it is back-to-front + +A run is the longest ascending sequence with: + a[lo] <= a[lo + 1] <= a[lo + 2] <= ... +or the longest descending sequence with: + a[lo] > a[lo + 1] > a[lo + 2] > ... + +For its intended use in a stable mergesort, the strictness of the +definition of "descending" is needed so that the call can safely +reverse a descending sequence without violating stability. +*/ +/datum/sortInstance/proc/countRunAndMakeAscending(lo, hi) + //ASSERT(lo < hi) + + var/runHi = lo + 1 + if(runHi >= hi) + return 1 + + var/last = fetchElement(L,lo) + var/current = fetchElement(L,runHi++) + + if(call(cmp)(current, last) < 0) + while(runHi < hi) + last = current + current = fetchElement(L,runHi) + if(call(cmp)(current, last) >= 0) + break + ++runHi + reverseRange(L, lo, runHi) + else + while(runHi < hi) + last = current + current = fetchElement(L,runHi) + if(call(cmp)(current, last) < 0) + break + ++runHi + + return runHi - lo + +//Returns the minimum acceptable run length for an array of the specified length. +//Natural runs shorter than this will be extended with binarySort +/datum/sortInstance/proc/minRunLength(n) + //ASSERT(n >= 0) + var/r = 0 //becomes 1 if any bits are shifted off + while(n >= MIN_MERGE) + r |= (n & 1) + n >>= 1 + return n + r + +//Examines the stack of runs waiting to be merged and merges adjacent runs until the stack invariants are reestablished: +// runLen[i-3] > runLen[i-2] + runLen[i-1] +// runLen[i-2] > runLen[i-1] +//This method is called each time a new run is pushed onto the stack. +//So the invariants are guaranteed to hold for i= 2) + var/n = runBases.len - 1 + if(n > 1 && runLens[n-1] <= runLens[n] + runLens[n+1]) + if(runLens[n-1] < runLens[n+1]) --n mergeAt(n) - - - //Merges the two consecutive runs at stack indices i and i+1 - //Run i must be the penultimate or antepenultimate run on the stack - //In other words, i must be equal to stackSize-2 or stackSize-3 - proc/mergeAt(i) - //ASSERT(runBases.len >= 2) - //ASSERT(i >= 1) - //ASSERT(i == runBases.len - 1 || i == runBases.len - 2) - - var/base1 = runBases[i] - var/base2 = runBases[i+1] - var/len1 = runLens[i] - var/len2 = runLens[i+1] - - //ASSERT(len1 > 0 && len2 > 0) - //ASSERT(base1 + len1 == base2) - - //Record the legth of the combined runs. If i is the 3rd last run now, also slide over the last run - //(which isn't involved in this merge). The current run (i+1) goes away in any case. - runLens[i] += runLens[i+1] - runLens.Cut(i+1, i+2) - runBases.Cut(i+1, i+2) - - - //Find where the first element of run2 goes in run1. - //Prior elements in run1 can be ignored (because they're already in place) - var/k = gallopRight(fetchElement(L,base2), base1, len1, 0) - //ASSERT(k >= 0) - base1 += k - len1 -= k - if(len1 == 0) - return - - //Find where the last element of run1 goes in run2. - //Subsequent elements in run2 can be ignored (because they're already in place) - len2 = gallopLeft(fetchElement(L,base1 + len1 - 1), base2, len2, len2-1) - //ASSERT(len2 >= 0) - if(len2 == 0) - return - - //Merge remaining runs, using tmp array with min(len1, len2) elements - if(len1 <= len2) - mergeLo(base1, len1, base2, len2) + else if(runLens[n] <= runLens[n+1]) + mergeAt(n) else - mergeHi(base1, len1, base2, len2) + break //Invariant is established + + +//Merges all runs on the stack until only one remains. +//Called only once, to finalise the sort +/datum/sortInstance/proc/mergeForceCollapse() + while(runBases.len >= 2) + var/n = runBases.len - 1 + if(n > 1 && runLens[n-1] < runLens[n+1]) + --n + mergeAt(n) + + +//Merges the two consecutive runs at stack indices i and i+1 +//Run i must be the penultimate or antepenultimate run on the stack +//In other words, i must be equal to stackSize-2 or stackSize-3 +/datum/sortInstance/proc/mergeAt(i) + //ASSERT(runBases.len >= 2) + //ASSERT(i >= 1) + //ASSERT(i == runBases.len - 1 || i == runBases.len - 2) + + var/base1 = runBases[i] + var/base2 = runBases[i+1] + var/len1 = runLens[i] + var/len2 = runLens[i+1] + + //ASSERT(len1 > 0 && len2 > 0) + //ASSERT(base1 + len1 == base2) + + //Record the legth of the combined runs. If i is the 3rd last run now, also slide over the last run + //(which isn't involved in this merge). The current run (i+1) goes away in any case. + runLens[i] += runLens[i+1] + runLens.Cut(i+1, i+2) + runBases.Cut(i+1, i+2) + + + //Find where the first element of run2 goes in run1. + //Prior elements in run1 can be ignored (because they're already in place) + var/k = gallopRight(fetchElement(L,base2), base1, len1, 0) + //ASSERT(k >= 0) + base1 += k + len1 -= k + if(len1 == 0) + return + + //Find where the last element of run1 goes in run2. + //Subsequent elements in run2 can be ignored (because they're already in place) + len2 = gallopLeft(fetchElement(L,base1 + len1 - 1), base2, len2, len2-1) + //ASSERT(len2 >= 0) + if(len2 == 0) + return + + //Merge remaining runs, using tmp array with min(len1, len2) elements + if(len1 <= len2) + mergeLo(base1, len1, base2, len2) + else + mergeHi(base1, len1, base2, len2) + + +/* + Locates the position to insert key within the specified sorted range + If the range contains elements equal to key, this will return the index of the LEFTMOST of those elements + + key the element to be inserted into the sorted range + base the index of the first element of the sorted range + len the length of the sorted range, must be greater than 0 + hint the offset from base at which to begin the search, such that 0 <= hint < len; i.e. base <= hint < base+hint + + Returns the index at which to insert element 'key' +*/ +/datum/sortInstance/proc/gallopLeft(key, base, len, hint) + //ASSERT(len > 0 && hint >= 0 && hint < len) + + var/lastOffset = 0 + var/offset = 1 + if(call(cmp)(key, fetchElement(L,base+hint)) > 0) + var/maxOffset = len - hint + while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint+offset)) > 0) + lastOffset = offset + offset = (offset << 1) + 1 + + if(offset > maxOffset) + offset = maxOffset + + lastOffset += hint + offset += hint + + else + var/maxOffset = hint + 1 + while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint-offset)) <= 0) + lastOffset = offset + offset = (offset << 1) + 1 + + if(offset > maxOffset) + offset = maxOffset + + var/temp = lastOffset + lastOffset = hint - offset + offset = hint - temp + //ASSERT(-1 <= lastOffset && lastOffset < offset && offset <= len) - /* - Locates the position to insert key within the specified sorted range - If the range contains elements equal to key, this will return the index of the LEFTMOST of those elements - - key the element to be inserted into the sorted range - base the index of the first element of the sorted range - len the length of the sorted range, must be greater than 0 - hint the offset from base at which to begin the search, such that 0 <= hint < len; i.e. base <= hint < base+hint + //Now L[base+lastOffset] < key <= L[base+offset], so key belongs somewhere to the right of lastOffset but no farther than + //offset. Do a binary search with invariant L[base+lastOffset-1] < key <= L[base+offset] + ++lastOffset + while(lastOffset < offset) + var/m = lastOffset + ((offset - lastOffset) >> 1) - Returns the index at which to insert element 'key' + if(call(cmp)(key, fetchElement(L,base+m)) > 0) + lastOffset = m + 1 + else + offset = m + + //ASSERT(lastOffset == offset) + return offset + +/** + * Like gallopLeft, except that if the range contains an element equal to + * key, gallopRight returns the index after the rightmost equal element. + * + * @param key the key whose insertion point to search for + * @param a the array in which to search + * @param base the index of the first element in the range + * @param len the length of the range; must be > 0 + * @param hint the index at which to begin the search, 0 <= hint < n. + * The closer hint is to the result, the faster this method will run. + * @param c the comparator used to order the range, and to search + * @return the int k, 0 <= k <= n such that a[b + k - 1] <= key < a[b + k] */ - proc/gallopLeft(key, base, len, hint) - //ASSERT(len > 0 && hint >= 0 && hint < len) +/datum/sortInstance/proc/gallopRight(key, base, len, hint) + //ASSERT(len > 0 && hint >= 0 && hint < len) - var/lastOffset = 0 - var/offset = 1 - if(call(cmp)(key, fetchElement(L,base+hint)) > 0) - var/maxOffset = len - hint - while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint+offset)) > 0) - lastOffset = offset - offset = (offset << 1) + 1 + var/offset = 1 + var/lastOffset = 0 + if(call(cmp)(key, fetchElement(L,base+hint)) < 0) //key <= L[base+hint] + var/maxOffset = hint + 1 //therefore we want to insert somewhere in the range [base,base+hint] = [base+,base+(hint+1)) + while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint-offset)) < 0) //we are iterating backwards + lastOffset = offset + offset = (offset << 1) + 1 //1 3 7 15 - if(offset > maxOffset) - offset = maxOffset + if(offset > maxOffset) + offset = maxOffset - lastOffset += hint - offset += hint + var/temp = lastOffset + lastOffset = hint - offset + offset = hint - temp - else - var/maxOffset = hint + 1 - while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint-offset)) <= 0) - lastOffset = offset - offset = (offset << 1) + 1 + else //key > L[base+hint] + var/maxOffset = len - hint //therefore we want to insert somewhere in the range (base+hint,base+len) = [base+hint+1, base+hint+(len-hint)) + while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint+offset)) >= 0) + lastOffset = offset + offset = (offset << 1) + 1 - if(offset > maxOffset) - offset = maxOffset + if(offset > maxOffset) + offset = maxOffset - var/temp = lastOffset - lastOffset = hint - offset - offset = hint - temp + lastOffset += hint + offset += hint - //ASSERT(-1 <= lastOffset && lastOffset < offset && offset <= len) + //ASSERT(-1 <= lastOffset && lastOffset < offset && offset <= len) - //Now L[base+lastOffset] < key <= L[base+offset], so key belongs somewhere to the right of lastOffset but no farther than - //offset. Do a binary search with invariant L[base+lastOffset-1] < key <= L[base+offset] - ++lastOffset - while(lastOffset < offset) - var/m = lastOffset + ((offset - lastOffset) >> 1) + ++lastOffset + while(lastOffset < offset) + var/m = lastOffset + ((offset - lastOffset) >> 1) - if(call(cmp)(key, fetchElement(L,base+m)) > 0) - lastOffset = m + 1 - else - offset = m - - //ASSERT(lastOffset == offset) - return offset - - /** - * Like gallopLeft, except that if the range contains an element equal to - * key, gallopRight returns the index after the rightmost equal element. - * - * @param key the key whose insertion point to search for - * @param a the array in which to search - * @param base the index of the first element in the range - * @param len the length of the range; must be > 0 - * @param hint the index at which to begin the search, 0 <= hint < n. - * The closer hint is to the result, the faster this method will run. - * @param c the comparator used to order the range, and to search - * @return the int k, 0 <= k <= n such that a[b + k - 1] <= key < a[b + k] - */ - proc/gallopRight(key, base, len, hint) - //ASSERT(len > 0 && hint >= 0 && hint < len) - - var/offset = 1 - var/lastOffset = 0 - if(call(cmp)(key, fetchElement(L,base+hint)) < 0) //key <= L[base+hint] - var/maxOffset = hint + 1 //therefore we want to insert somewhere in the range [base,base+hint] = [base+,base+(hint+1)) - while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint-offset)) < 0) //we are iterating backwards - lastOffset = offset - offset = (offset << 1) + 1 //1 3 7 15 - - if(offset > maxOffset) - offset = maxOffset - - var/temp = lastOffset - lastOffset = hint - offset - offset = hint - temp - - else //key > L[base+hint] - var/maxOffset = len - hint //therefore we want to insert somewhere in the range (base+hint,base+len) = [base+hint+1, base+hint+(len-hint)) - while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint+offset)) >= 0) - lastOffset = offset - offset = (offset << 1) + 1 - - if(offset > maxOffset) - offset = maxOffset - - lastOffset += hint - offset += hint + if(call(cmp)(key, fetchElement(L,base+m)) < 0) //key <= L[base+m] + offset = m + else //key > L[base+m] + lastOffset = m + 1 - //ASSERT(-1 <= lastOffset && lastOffset < offset && offset <= len) + //ASSERT(lastOffset == offset) - ++lastOffset - while(lastOffset < offset) - var/m = lastOffset + ((offset - lastOffset) >> 1) + return offset - if(call(cmp)(key, fetchElement(L,base+m)) < 0) //key <= L[base+m] - offset = m - else //key > L[base+m] - lastOffset = m + 1 - //ASSERT(lastOffset == offset) +//Merges two adjacent runs in-place in a stable fashion. +//For performance this method should only be called when len1 <= len2! +/datum/sortInstance/proc/mergeLo(base1, len1, base2, len2) + //ASSERT(len1 > 0 && len2 > 0 && base1 + len1 == base2) - return offset + var/cursor1 = base1 + var/cursor2 = base2 + //degenerate cases + if(len2 == 1) + moveElement(L, cursor2, cursor1) + return - //Merges two adjacent runs in-place in a stable fashion. - //For performance this method should only be called when len1 <= len2! - proc/mergeLo(base1, len1, base2, len2) - //ASSERT(len1 > 0 && len2 > 0 && base1 + len1 == base2) + if(len1 == 1) + moveElement(L, cursor1, cursor2+len2) + return - var/cursor1 = base1 - var/cursor2 = base2 - //degenerate cases - if(len2 == 1) - moveElement(L, cursor2, cursor1) - return + //Move first element of second run + moveElement(L, cursor2++, cursor1++) + --len2 - if(len1 == 1) - moveElement(L, cursor1, cursor2+len2) - return + outer: + while(1) + var/count1 = 0 //# of times in a row that first run won + var/count2 = 0 // " " " " " " second run won + //do the straightfoward thin until one run starts winning consistently - //Move first element of second run - moveElement(L, cursor2++, cursor1++) - --len2 + do + //ASSERT(len1 > 1 && len2 > 0) + if(call(cmp)(fetchElement(L,cursor2), fetchElement(L,cursor1)) < 0) + moveElement(L, cursor2++, cursor1++) + --len2 - outer: - while(1) - var/count1 = 0 //# of times in a row that first run won - var/count2 = 0 // " " " " " " second run won + ++count2 + count1 = 0 - //do the straightfoward thin until one run starts winning consistently + if(len2 == 0) + break outer + else + ++cursor1 - do - //ASSERT(len1 > 1 && len2 > 0) - if(call(cmp)(fetchElement(L,cursor2), fetchElement(L,cursor1)) < 0) - moveElement(L, cursor2++, cursor1++) - --len2 + ++count1 + count2 = 0 - ++count2 - count1 = 0 + if(--len1 == 1) + break outer - if(len2 == 0) - break outer - else - ++cursor1 + while((count1 | count2) < minGallop) - ++count1 - count2 = 0 - if(--len1 == 1) - break outer + //one run is winning consistently so galloping may provide huge benifits + //so try galloping, until such time as the run is no longer consistently winning + do + //ASSERT(len1 > 1 && len2 > 0) - while((count1 | count2) < minGallop) + count1 = gallopRight(fetchElement(L,cursor2), cursor1, len1, 0) + if(count1) + cursor1 += count1 + len1 -= count1 + if(len1 <= 1) + break outer - //one run is winning consistently so galloping may provide huge benifits - //so try galloping, until such time as the run is no longer consistently winning - do - //ASSERT(len1 > 1 && len2 > 0) + moveElement(L, cursor2, cursor1) + ++cursor2 + ++cursor1 + if(--len2 == 0) + break outer - count1 = gallopRight(fetchElement(L,cursor2), cursor1, len1, 0) - if(count1) - cursor1 += count1 - len1 -= count1 + count2 = gallopLeft(fetchElement(L,cursor1), cursor2, len2, 0) + if(count2) + moveRange(L, cursor2, cursor1, count2) - if(len1 <= 1) - break outer + cursor2 += count2 + cursor1 += count2 + len2 -= count2 - moveElement(L, cursor2, cursor1) - ++cursor2 - ++cursor1 - if(--len2 == 0) + if(len2 == 0) break outer - count2 = gallopLeft(fetchElement(L,cursor1), cursor2, len2, 0) - if(count2) - moveRange(L, cursor2, cursor1, count2) + ++cursor1 + if(--len1 == 1) + break outer - cursor2 += count2 - cursor1 += count2 - len2 -= count2 + --minGallop - if(len2 == 0) - break outer + while((count1|count2) > MIN_GALLOP) - ++cursor1 - if(--len1 == 1) - break outer + if(minGallop < 0) + minGallop = 0 + minGallop += 2; // Penalize for leaving gallop mode - --minGallop - while((count1|count2) > MIN_GALLOP) + if(len1 == 1) + //ASSERT(len2 > 0) + moveElement(L, cursor1, cursor2+len2) - if(minGallop < 0) - minGallop = 0 - minGallop += 2; // Penalize for leaving gallop mode + //else + //ASSERT(len2 == 0) + //ASSERT(len1 > 1) - if(len1 == 1) - //ASSERT(len2 > 0) - moveElement(L, cursor1, cursor2+len2) +/datum/sortInstance/proc/mergeHi(base1, len1, base2, len2) + //ASSERT(len1 > 0 && len2 > 0 && base1 + len1 == base2) - //else - //ASSERT(len2 == 0) - //ASSERT(len1 > 1) + var/cursor1 = base1 + len1 - 1 //start at end of sublists + var/cursor2 = base2 + len2 - 1 + //degenerate cases + if(len2 == 1) + moveElement(L, base2, base1) + return - proc/mergeHi(base1, len1, base2, len2) - //ASSERT(len1 > 0 && len2 > 0 && base1 + len1 == base2) + if(len1 == 1) + moveElement(L, base1, cursor2+1) + return - var/cursor1 = base1 + len1 - 1 //start at end of sublists - var/cursor2 = base2 + len2 - 1 + moveElement(L, cursor1--, cursor2-- + 1) + --len1 - //degenerate cases - if(len2 == 1) - moveElement(L, base2, base1) - return - - if(len1 == 1) - moveElement(L, base1, cursor2+1) - return + outer: + while(1) + var/count1 = 0 //# of times in a row that first run won + var/count2 = 0 // " " " " " " second run won - moveElement(L, cursor1--, cursor2-- + 1) - --len1 + //do the straightfoward thing until one run starts winning consistently + do + //ASSERT(len1 > 0 && len2 > 1) + if(call(cmp)(fetchElement(L,cursor2), fetchElement(L,cursor1)) < 0) + moveElement(L, cursor1--, cursor2-- + 1) + --len1 - outer: - while(1) - var/count1 = 0 //# of times in a row that first run won - var/count2 = 0 // " " " " " " second run won + ++count1 + count2 = 0 - //do the straightfoward thing until one run starts winning consistently - do - //ASSERT(len1 > 0 && len2 > 1) - if(call(cmp)(fetchElement(L,cursor2), fetchElement(L,cursor1)) < 0) - moveElement(L, cursor1--, cursor2-- + 1) - --len1 + if(len1 == 0) + break outer + else + --cursor2 + --len2 - ++count1 - count2 = 0 + ++count2 + count1 = 0 - if(len1 == 0) - break outer - else - --cursor2 - --len2 + if(len2 == 1) + break outer + while((count1 | count2) < minGallop) - ++count2 - count1 = 0 + //one run is winning consistently so galloping may provide huge benifits + //so try galloping, until such time as the run is no longer consistently winning + do + //ASSERT(len1 > 0 && len2 > 1) - if(len2 == 1) - break outer - while((count1 | count2) < minGallop) + count1 = len1 - gallopRight(fetchElement(L,cursor2), base1, len1, len1-1) //should cursor1 be base1? + if(count1) + cursor1 -= count1 - //one run is winning consistently so galloping may provide huge benifits - //so try galloping, until such time as the run is no longer consistently winning - do - //ASSERT(len1 > 0 && len2 > 1) + moveRange(L, cursor1+1, cursor2+1, count1) //cursor1+1 == cursor2 by definition - count1 = len1 - gallopRight(fetchElement(L,cursor2), base1, len1, len1-1) //should cursor1 be base1? - if(count1) - cursor1 -= count1 + cursor2 -= count1 + len1 -= count1 - moveRange(L, cursor1+1, cursor2+1, count1) //cursor1+1 == cursor2 by definition + if(len1 == 0) + break outer - cursor2 -= count1 - len1 -= count1 + --cursor2 - if(len1 == 0) - break outer + if(--len2 == 1) + break outer - --cursor2 + count2 = len2 - gallopLeft(fetchElement(L,cursor1), cursor1+1, len2, len2-1) + if(count2) + cursor2 -= count2 + len2 -= count2 - if(--len2 == 1) + if(len2 <= 1) break outer - count2 = len2 - gallopLeft(fetchElement(L,cursor1), cursor1+1, len2, len2-1) - if(count2) - cursor2 -= count2 - len2 -= count2 + moveElement(L, cursor1--, cursor2-- + 1) + --len1 - if(len2 <= 1) - break outer + if(len1 == 0) + break outer - moveElement(L, cursor1--, cursor2-- + 1) - --len1 + --minGallop + while((count1|count2) > MIN_GALLOP) - if(len1 == 0) - break outer + if(minGallop < 0) + minGallop = 0 + minGallop += 2 // Penalize for leaving gallop mode - --minGallop - while((count1|count2) > MIN_GALLOP) + if(len2 == 1) + //ASSERT(len1 > 0) - if(minGallop < 0) - minGallop = 0 - minGallop += 2 // Penalize for leaving gallop mode + cursor1 -= len1 + moveRange(L, cursor1+1, cursor2+1, len1) - if(len2 == 1) - //ASSERT(len1 > 0) + //else + //ASSERT(len1 == 0) + //ASSERT(len2 > 0) - cursor1 -= len1 - moveRange(L, cursor1+1, cursor2+1, len1) - //else - //ASSERT(len1 == 0) - //ASSERT(len2 > 0) +/datum/sortInstance/proc/mergeSort(start, end) + var/remaining = end - start + //If array is small, do an insertion sort + if(remaining < MIN_MERGE) + binarySort(start, end, start/*+initRunLen*/) + return - proc/mergeSort(start, end) - var/remaining = end - start + var/minRun = minRunLength(remaining) - //If array is small, do an insertion sort - if(remaining < MIN_MERGE) - binarySort(start, end, start/*+initRunLen*/) - return + do + var/runLen = (remaining <= minRun) ? remaining : minRun - var/minRun = minRunLength(remaining) + binarySort(start, start+runLen, start) - do - var/runLen = (remaining <= minRun) ? remaining : minRun + //add data about run to queue + runBases.Add(start) + runLens.Add(runLen) - binarySort(start, start+runLen, start) + //Advance to find next run + start += runLen + remaining -= runLen - //add data about run to queue - runBases.Add(start) - runLens.Add(runLen) + while(remaining > 0) - //Advance to find next run - start += runLen - remaining -= runLen - - while(remaining > 0) - - while(runBases.len >= 2) - var/n = runBases.len - 1 - if(n > 1 && runLens[n-1] <= runLens[n] + runLens[n+1]) - if(runLens[n-1] < runLens[n+1]) - --n - mergeAt2(n) - else if(runLens[n] <= runLens[n+1]) - mergeAt2(n) - else - break //Invariant is established - - while(runBases.len >= 2) - var/n = runBases.len - 1 - if(n > 1 && runLens[n-1] < runLens[n+1]) + while(runBases.len >= 2) + var/n = runBases.len - 1 + if(n > 1 && runLens[n-1] <= runLens[n] + runLens[n+1]) + if(runLens[n-1] < runLens[n+1]) --n mergeAt2(n) + else if(runLens[n] <= runLens[n+1]) + mergeAt2(n) + else + break //Invariant is established - return L + while(runBases.len >= 2) + var/n = runBases.len - 1 + if(n > 1 && runLens[n-1] < runLens[n+1]) + --n + mergeAt2(n) - proc/mergeAt2(i) - var/cursor1 = runBases[i] - var/cursor2 = runBases[i+1] + return L - var/end1 = cursor1+runLens[i] - var/end2 = cursor2+runLens[i+1] +/datum/sortInstance/proc/mergeAt2(i) + var/cursor1 = runBases[i] + var/cursor2 = runBases[i+1] - var/val1 = fetchElement(L,cursor1) - var/val2 = fetchElement(L,cursor2) + var/end1 = cursor1+runLens[i] + var/end2 = cursor2+runLens[i+1] - while(1) - if(call(cmp)(val1,val2) <= 0) - if(++cursor1 >= end1) - break - val1 = fetchElement(L,cursor1) - else - moveElement(L,cursor2,cursor1) + var/val1 = fetchElement(L,cursor1) + var/val2 = fetchElement(L,cursor2) - if(++cursor2 >= end2) - break - ++end1 - ++cursor1 + while(1) + if(call(cmp)(val1,val2) <= 0) + if(++cursor1 >= end1) + break + val1 = fetchElement(L,cursor1) + else + moveElement(L,cursor2,cursor1) + + if(++cursor2 >= end2) + break + ++end1 + ++cursor1 - val2 = fetchElement(L,cursor2) + val2 = fetchElement(L,cursor2) - //Record the legth of the combined runs. If i is the 3rd last run now, also slide over the last run - //(which isn't involved in this merge). The current run (i+1) goes away in any case. - runLens[i] += runLens[i+1] - runLens.Cut(i+1, i+2) - runBases.Cut(i+1, i+2) + //Record the legth of the combined runs. If i is the 3rd last run now, also slide over the last run + //(which isn't involved in this merge). The current run (i+1) goes away in any case. + runLens[i] += runLens[i+1] + runLens.Cut(i+1, i+2) + runBases.Cut(i+1, i+2) #undef MIN_GALLOP #undef MIN_MERGE diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 26d3320c425..fea31dbaeea 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -668,7 +668,7 @@ GLOBAL_LIST_INIT(binary, list("0","1")) buffer = copytext_char(buffer, 1, cutoff) + punctbuffer if(!findtext(buffer,GLOB.is_alphanumeric)) continue - if(!buffer || length(buffer) > 280 || length(buffer) <= cullshort || buffer in accepted) + if(!buffer || length(buffer) > 280 || length(buffer) <= cullshort || (buffer in accepted)) continue accepted += buffer @@ -805,7 +805,7 @@ GLOBAL_LIST_INIT(binary, list("0","1")) var/cword = pick(words) words.Remove(cword) var/suffix = copytext_char(cword,length(cword)-1,length(cword)) - while(length(cword)>0 && suffix in list(".",",",";","!",":","?")) + while(length(cword)>0 && (suffix in list(".",",",";","!",":","?"))) cword = copytext_char(cword,1 ,length(cword)-1) suffix = copytext_char(cword,length(cword)-1,length(cword) ) if(length(cword)) diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index a3bb9314df1..f4244d88ac9 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -522,9 +522,9 @@ switch(child) if(/datum) return null - if(/obj || /mob) + if(/obj, /mob) return /atom/movable - if(/area || /turf) + if(/area, /turf) return /atom else return /datum diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 45673eff086..5b78d399f99 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1,6 +1,3 @@ -var/list/cardinal = list( NORTH, SOUTH, EAST, WEST ) -var/list/alldirs = list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST) - /* * A large number of misc global procs. */ @@ -10,11 +7,9 @@ var/list/alldirs = list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAS if (!( istext(HTMLstring) )) CRASH("Given non-text argument!") - return else if (length(HTMLstring) != 7) CRASH("Given non-HTML argument!") - return var/textr = copytext(HTMLstring, 2, 4) var/textg = copytext(HTMLstring, 4, 6) var/textb = copytext(HTMLstring, 6, 8) @@ -25,7 +20,6 @@ var/list/alldirs = list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAS textg = num2hex(255 - g, 2) textb = num2hex(255 - b, 2) return text("#[][][]", textr, textg, textb) - return /proc/Get_Angle(atom/movable/start,atom/movable/end)//For beams. if(!start || !end) @@ -328,12 +322,9 @@ Turf and target are separate in case you want to teleport some distance from a t /proc/sortmobs() var/list/moblist = list() var/list/sortmob = sortNames(GLOB.mob_list) - var/list/types = list() + var/list/list/mob/types = list() for(var/mob/M in sortmob) - if(M.type in types) - types[M.type].Add(M) - else - types[M.type] = list(M) + LAZYADD(types[M.type], M) var/types_sort = sortNames(types) for(var/T in types_sort) moblist.Add(types_sort[T]) @@ -415,6 +406,7 @@ Turf and target are separate in case you want to teleport some distance from a t // note range is non-pythagorean // used for disposal system /proc/get_ranged_target_turf(atom/A, direction, range) + RETURN_TYPE(/turf) var/x = A.x var/y = A.y @@ -1105,7 +1097,7 @@ B --><-- A return closest_atom -proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types()) +/proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types()) if (value == FALSE) //nothing should be calling us with a number, so this is safe value = input("Enter type to find (blank for all, cancel to cancel)", "Search for type") as null|text if (isnull(value)) @@ -1241,6 +1233,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) var/ready_to_die = FALSE /mob/dview/Initialize() //Properly prevents this mob from gaining huds or joining any global lists + SHOULD_CALL_PARENT(FALSE) return INITIALIZE_HINT_NORMAL /mob/dview/Destroy(force = FALSE) diff --git a/code/__HELPERS/unused.dm b/code/__HELPERS/unused.dm deleted file mode 100644 index a94747db3c9..00000000000 --- a/code/__HELPERS/unused.dm +++ /dev/null @@ -1,39 +0,0 @@ - - -/datum/projectile_data - var/src_x - var/src_y - var/time - var/distance - var/power_x - var/power_y - var/dest_x - var/dest_y - -/datum/projectile_data/New(src_x, src_y, time, distance, \ - power_x, power_y, dest_x, dest_y) - src.src_x = src_x - src.src_y = src_y - src.time = time - src.distance = distance - src.power_x = power_x - src.power_y = power_y - src.dest_x = dest_x - src.dest_y = dest_y - -/proc/projectile_trajectory(src_x, src_y, rotation, angle, power) - - // returns the destination (Vx,y) that a projectile shot at [src_x], [src_y], with an angle of [angle], - // rotated at [rotation] and with the power of [power] - // Thanks to VistaPOWA for this function - - var/power_x = power * cos(angle) - var/power_y = power * sin(angle) - var/time = 2* power_y / 10 //10 = g - - var/distance = time * power_x - - var/dest_x = src_x + distance*sin(rotation); - var/dest_y = src_y + distance*cos(rotation); - - return new /datum/projectile_data(src_x, src_y, time, distance, power_x, power_y, dest_x, dest_y) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index cba7700b1fb..e143eb0801b 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -35,7 +35,7 @@ //#define VISUALIZE_ACTIVE_TURFS //Highlights atmos active turfs in green #endif -//#define UNIT_TESTS //Enables unit tests via TEST_RUN_PARAMETERF +//#define UNIT_TESTS //Enables unit tests #ifndef PRELOAD_RSC //set to: #define PRELOAD_RSC 2 // 0 to allow using external resources or on-demand behaviour; @@ -63,11 +63,11 @@ #define FIND_REF_NO_CHECK_TICK #endif -#ifdef TRAVISBUILDING +#ifdef CIBUILDING #define UNIT_TESTS #endif -#ifdef TRAVISTESTING +#ifdef CITESTING #define TESTING #endif diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index ad49a192034..f2958c11206 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -30,7 +30,6 @@ GLOBAL_LIST_EMPTY(nukeop_leader_start) GLOBAL_LIST_EMPTY(newplayer_start) GLOBAL_LIST_EMPTY(prisonwarp) //admin prisoners go to these GLOBAL_LIST_EMPTY(holdingfacility) //captured people go here (ninja energy net) -GLOBAL_LIST_EMPTY(xeno_spawn)//aliens, morphs and nightmares spawn at these GLOBAL_LIST_EMPTY(tdome1) GLOBAL_LIST_EMPTY(tdome2) GLOBAL_LIST_EMPTY(tdomeobserve) diff --git a/code/_globalvars/lists/poll_ignore.dm b/code/_globalvars/lists/poll_ignore.dm index 754c220f9d8..8e458a43ec2 100644 --- a/code/_globalvars/lists/poll_ignore.dm +++ b/code/_globalvars/lists/poll_ignore.dm @@ -2,7 +2,6 @@ #define POLL_IGNORE_SENTIENCE_POTION "sentience_potion" #define POLL_IGNORE_POSSESSED_BLADE "possessed_blade" -#define POLL_IGNORE_ALIEN_LARVA "alien_larva" #define POLL_IGNORE_SYNDICATE "syndicate" #define POLL_IGNORE_HOLOPARASITE "holoparasite" #define POLL_IGNORE_POSIBRAIN "posibrain" @@ -26,7 +25,6 @@ GLOBAL_LIST_INIT(poll_ignore_desc, list( POLL_IGNORE_SENTIENCE_POTION = "Sentience potion", POLL_IGNORE_POSSESSED_BLADE = "Possessed blade", - POLL_IGNORE_ALIEN_LARVA = "Xenomorph larva", POLL_IGNORE_SYNDICATE = "Syndicate", POLL_IGNORE_HOLOPARASITE = "Holoparasite", POLL_IGNORE_POSIBRAIN = "Positronic brain", diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index 832a9cb9d10..74841770847 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -22,7 +22,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_DEATHCOMA" = TRAIT_DEATHCOMA, "TRAIT_FAKEDEATH" = TRAIT_FAKEDEATH, "TRAIT_DISFIGURED" = TRAIT_DISFIGURED, - "TRAIT_XENO_HOST" = TRAIT_XENO_HOST, "TRAIT_STUNIMMUNE" = TRAIT_STUNIMMUNE, "TRAIT_SLEEPIMMUNE" = TRAIT_SLEEPIMMUNE, "TRAIT_PUSHIMMUNE" = TRAIT_PUSHIMMUNE, diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 0ad80f16170..a08d66200ff 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -508,7 +508,7 @@ return if(user.get_active_held_item()) return - var/list/atomy = list() + var/list/atom/atomy = list() var/list/atomcounts = list() var/list/atomrefs = list() var/list/overrides = list() diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 054938464ec..909a31f786a 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -69,10 +69,6 @@ #define ui_monkey_neck "CENTER-3:15,SOUTH:5" //monkey #define ui_monkey_back "CENTER-2:16,SOUTH:5" //monkey -//#define ui_alien_storage_l "CENTER-2:14,SOUTH:5"//alien -#define ui_alien_storage_r "CENTER+1:18,SOUTH:5"//alien -#define ui_alien_language_menu "EAST-3:26,SOUTH:5" //alien - #define ui_drone_drop "CENTER+1:18,SOUTH:5" //maintenance drones #define ui_drone_pull "CENTER+2:2,SOUTH:5" //maintenance drones #define ui_drone_storage "CENTER-2:14,SOUTH:5" //maintenance drones @@ -197,12 +193,6 @@ //borgs #define ui_borg_health "EAST-1:28,CENTER-1:15" //borgs have the health display where humans have the pressure damage indicator. -//aliens -#define ui_alien_health "EAST,CENTER-1:15" //aliens have the health display where humans have the pressure damage indicator. -#define ui_alienplasmadisplay "EAST,CENTER-2:15" -#define ui_alien_queen_finder "EAST,CENTER-3:15" - -//constructs #define ui_construct_pull "EAST,CENTER-2:15" #define ui_construct_health "EAST,CENTER:15" //same as borgs and humans diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 9b833189ac9..b8e64bef0cb 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -286,28 +286,6 @@ if(L.mobility_flags & MOBILITY_MOVE) return L.resist_fire() //I just want to start a flame in your hearrrrrrtttttt. - -//ALIENS - -/atom/movable/screen/alert/alien_tox - name = "Plasma" - desc = "" - icon_state = "alien_tox" - alerttooltipstyle = "alien" - -/atom/movable/screen/alert/alien_fire -// This alert is temporarily gonna be thrown for all hot air but one day it will be used for literally being on fire - name = "Too Hot" - desc = "" - icon_state = "alien_fire" - alerttooltipstyle = "alien" - -/atom/movable/screen/alert/alien_vulnerable - name = "Severed Matriarchy" - desc = "" - icon_state = "alien_noqueen" - alerttooltipstyle = "alien" - //BLOBS /atom/movable/screen/alert/nofactory @@ -689,8 +667,8 @@ so as to remain in compliance with the most up-to-date laws." return 1 /atom/movable/screen/alert/Destroy() - . = ..() severity = 0 master = null mob_viewer = null screen_loc = "" + return ..() diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm deleted file mode 100644 index a7cd99620fb..00000000000 --- a/code/_onclick/hud/alien.dm +++ /dev/null @@ -1,135 +0,0 @@ -/atom/movable/screen/alien - icon = 'icons/mob/screen_alien.dmi' - -/atom/movable/screen/alien/leap - name = "toggle leap" - icon_state = "leap_off" - -/atom/movable/screen/alien/leap/Click() - if(isalienhunter(usr)) - var/mob/living/carbon/alien/humanoid/hunter/AH = usr - AH.toggle_leap() - -/atom/movable/screen/alien/plasma_display - icon = 'icons/mob/screen_gen.dmi' - icon_state = "power_display2" - name = "plasma stored" - screen_loc = ui_alienplasmadisplay - - -/atom/movable/screen/alien/alien_queen_finder - icon = 'icons/mob/screen_alien.dmi' - icon_state = "queen_finder" - name = "queen sense" - desc = "" - screen_loc = ui_alien_queen_finder - -/datum/hud/alien - ui_style = 'icons/mob/screen_alien.dmi' - -/datum/hud/alien/New(mob/living/carbon/alien/humanoid/owner) - ..() - - var/atom/movable/screen/using - -//equippable shit - -//hands - build_hand_slots() - -//begin buttons - - using = new /atom/movable/screen/swap_hand() - using.icon = ui_style - using.icon_state = "swap_1" - using.screen_loc = ui_swaphand_position(owner,1) - using.hud = src - static_inventory += using - - using = new /atom/movable/screen/swap_hand() - using.icon = ui_style - using.icon_state = "swap_2" - using.screen_loc = ui_swaphand_position(owner,2) - using.hud = src - static_inventory += using - - using = new /atom/movable/screen/act_intent/alien() - using.icon_state = mymob.used_intent.name - using.hud = src - static_inventory += using - action_intent = using - - if(isalienhunter(mymob)) - var/mob/living/carbon/alien/humanoid/hunter/H = mymob - H.leap_icon = new /atom/movable/screen/alien/leap() - H.leap_icon.screen_loc = ui_alien_storage_r - static_inventory += H.leap_icon - - using = new/atom/movable/screen/language_menu - using.screen_loc = ui_alien_language_menu - using.hud = src - static_inventory += using - - using = new /atom/movable/screen/drop() - using.icon = ui_style - using.screen_loc = ui_drop_throw - using.hud = src - static_inventory += using - -// using = new /atom/movable/screen/resist() -// using.icon = ui_style -// using.screen_loc = ui_above_movement -// using.hud = src -// hotkeybuttons += using - - throw_icon = new /atom/movable/screen/throw_catch() - throw_icon.icon = ui_style - throw_icon.screen_loc = ui_drop_throw - throw_icon.hud = src - hotkeybuttons += throw_icon - - pull_icon = new /atom/movable/screen/pull() - pull_icon.icon = ui_style - pull_icon.update_icon() - pull_icon.screen_loc = ui_above_movement - pull_icon.hud = src - static_inventory += pull_icon - -//begin indicators - - healths = new /atom/movable/screen/healths/alien() - healths.hud = src - infodisplay += healths - - alien_plasma_display = new /atom/movable/screen/alien/plasma_display() - alien_plasma_display.hud = src - infodisplay += alien_plasma_display - - if(!isalienqueen(mymob)) - alien_queen_finder = new /atom/movable/screen/alien/alien_queen_finder - alien_queen_finder.hud = src - infodisplay += alien_queen_finder - - zone_select = new /atom/movable/screen/zone_sel/alien() - zone_select.hud = src - zone_select.update_icon() - static_inventory += zone_select - - for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) - if(inv.slot_id) - inv.hud = src - inv_slots[inv.slot_id] = inv - inv.update_icon() - -/datum/hud/alien/persistent_inventory_update() - if(!mymob) - return - var/mob/living/carbon/alien/humanoid/H = mymob - if(hud_version != HUD_STYLE_NOHUD) - for(var/obj/item/I in H.held_items) - I.screen_loc = ui_hand_position(H.get_held_index_of_item(I)) - H.client.screen += I - else - for(var/obj/item/I in H.held_items) - I.screen_loc = null - H.client.screen -= I diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm deleted file mode 100644 index a17e9cca082..00000000000 --- a/code/_onclick/hud/alien_larva.dm +++ /dev/null @@ -1,37 +0,0 @@ -/datum/hud/larva - ui_style = 'icons/mob/screen_alien.dmi' - -/datum/hud/larva/New(mob/owner) - ..() - var/atom/movable/screen/using - - using = new /atom/movable/screen/act_intent/alien() - using.icon_state = mymob.used_intent.name - using.hud = src - static_inventory += using - action_intent = using - - healths = new /atom/movable/screen/healths/alien() - healths.hud = src - infodisplay += healths - - alien_queen_finder = new /atom/movable/screen/alien/alien_queen_finder() - alien_queen_finder.hud = src - infodisplay += alien_queen_finder - - pull_icon = new /atom/movable/screen/pull() - pull_icon.icon = 'icons/mob/screen_alien.dmi' - pull_icon.update_icon() - pull_icon.screen_loc = ui_above_movement - pull_icon.hud = src - hotkeybuttons += pull_icon - - using = new/atom/movable/screen/language_menu - using.screen_loc = ui_alien_language_menu - using.hud = src - static_inventory += using - - zone_select = new /atom/movable/screen/zone_sel/alien() - zone_select.hud = src - zone_select.update_icon() - static_inventory += zone_select diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 2d7e29d56a9..1444fc3f4fa 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -24,9 +24,6 @@ GLOBAL_LIST_INIT(available_ui_styles, sortList(list( var/atom/movable/screen/blobpwrdisplay - var/atom/movable/screen/alien_plasma_display - var/atom/movable/screen/alien_queen_finder - var/atom/movable/screen/devil/soul_counter/devilsouldisplay var/atom/movable/screen/act_intent/action_intent @@ -139,8 +136,6 @@ GLOBAL_LIST_INIT(available_ui_styles, sortList(list( devilsouldisplay = null lingstingdisplay = null blobpwrdisplay = null - alien_plasma_display = null - alien_queen_finder = null QDEL_LIST_ASSOC_VAL(plane_masters) QDEL_LIST(screenoverlays) diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index b63e17920e2..a9e6efcf680 100644 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -316,6 +316,7 @@ icon_state = "space gas" /atom/movable/screen/parallax_layer/random/space_gas/Initialize(mapload, view) + . = ..() src.add_atom_colour(SSparallax.random_parallax_color, ADMIN_COLOUR_PRIORITY) /atom/movable/screen/parallax_layer/random/asteroids diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index f856ffe5a54..24b441e2683 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -633,10 +633,6 @@ L.toggle_cmode() update_icon() -/atom/movable/screen/act_intent/alien - icon = 'icons/mob/screen_alien.dmi' - screen_loc = ui_movi - /atom/movable/screen/act_intent/robot icon = 'icons/mob/screen_cyborg.dmi' screen_loc = ui_borg_intents @@ -1371,10 +1367,6 @@ . += mutable_appearance(overlay_icon, "[hud.mymob.gender == "male" ? "m" : "f"]_[hud.mymob.zone_selected]") // . += mutable_appearance(overlay_icon, "height_arrow[hud.mymob.aimheight]") -/atom/movable/screen/zone_sel/alien - icon = 'icons/mob/screen_alien.dmi' - overlay_icon = 'icons/mob/screen_alien.dmi' - /atom/movable/screen/zone_sel/robot icon = 'icons/mob/screen_cyborg.dmi' @@ -1401,10 +1393,6 @@ icon_state = "health0" screen_loc = ui_health -/atom/movable/screen/healths/alien - icon = 'icons/mob/screen_alien.dmi' - screen_loc = ui_alien_health - /atom/movable/screen/healths/robot icon = 'icons/mob/screen_cyborg.dmi' screen_loc = ui_borg_health diff --git a/code/_onclick/hud/swarmer.dm b/code/_onclick/hud/swarmer.dm deleted file mode 100644 index 0ce47ca7aff..00000000000 --- a/code/_onclick/hud/swarmer.dm +++ /dev/null @@ -1,98 +0,0 @@ - - -/atom/movable/screen/swarmer - icon = 'icons/mob/swarmer.dmi' - -/atom/movable/screen/swarmer/FabricateTrap - icon_state = "ui_trap" - name = "Create trap (Costs 5 Resources)" - desc = "" - -/atom/movable/screen/swarmer/FabricateTrap/Click() - if(isswarmer(usr)) - var/mob/living/simple_animal/hostile/swarmer/S = usr - S.CreateTrap() - -/atom/movable/screen/swarmer/Barricade - icon_state = "ui_barricade" - name = "Create barricade (Costs 5 Resources)" - desc = "" - -/atom/movable/screen/swarmer/Barricade/Click() - if(isswarmer(usr)) - var/mob/living/simple_animal/hostile/swarmer/S = usr - S.CreateBarricade() - -/atom/movable/screen/swarmer/Replicate - icon_state = "ui_replicate" - name = "Replicate (Costs 50 Resources)" - desc = "" - -/atom/movable/screen/swarmer/Replicate/Click() - if(isswarmer(usr)) - var/mob/living/simple_animal/hostile/swarmer/S = usr - S.CreateSwarmer() - -/atom/movable/screen/swarmer/RepairSelf - icon_state = "ui_self_repair" - name = "Repair self" - desc = "" - -/atom/movable/screen/swarmer/RepairSelf/Click() - if(isswarmer(usr)) - var/mob/living/simple_animal/hostile/swarmer/S = usr - S.RepairSelf() - -/atom/movable/screen/swarmer/ToggleLight - icon_state = "ui_light" - name = "Toggle light" - desc = "" - -/atom/movable/screen/swarmer/ToggleLight/Click() - if(isswarmer(usr)) - var/mob/living/simple_animal/hostile/swarmer/S = usr - S.ToggleLight() - -/atom/movable/screen/swarmer/ContactSwarmers - icon_state = "ui_contact_swarmers" - name = "Contact swarmers" - desc = "" - -/atom/movable/screen/swarmer/ContactSwarmers/Click() - if(isswarmer(usr)) - var/mob/living/simple_animal/hostile/swarmer/S = usr - S.ContactSwarmers() - -/datum/hud/swarmer/New(mob/owner) - ..() - var/atom/movable/screen/using - - using = new /atom/movable/screen/swarmer/FabricateTrap() - using.screen_loc = ui_hand_position(2) - using.hud = src - static_inventory += using - - using = new /atom/movable/screen/swarmer/Barricade() - using.screen_loc = ui_hand_position(1) - using.hud = src - static_inventory += using - - using = new /atom/movable/screen/swarmer/Replicate() - using.screen_loc = ui_zonesel - using.hud = src - static_inventory += using - - using = new /atom/movable/screen/swarmer/RepairSelf() - using.screen_loc = ui_storage1 - using.hud = src - static_inventory += using - - using = new /atom/movable/screen/swarmer/ToggleLight() - using.screen_loc = ui_back - using.hud = src - static_inventory += using - - using = new /atom/movable/screen/swarmer/ContactSwarmers() - using.screen_loc = ui_inventory - using.hud = src - static_inventory += using diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 67bb6ba3f08..66946db41a4 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -430,6 +430,7 @@ to_chat(user, span_userdanger("BACKSTAB!!! MY ATTACK DOES GREATER DAMAGE!")) user.mind?.adjust_experience(/datum/skill/misc/sneaking, user.STAINT * 5, TRUE) apply_damage(newforce, I.damtype, def_zone = hitlim) + SEND_SIGNAL(I, COMSIG_APPLY_REAGENTS, user, src) if(I.damtype == BRUTE) next_attack_msg.Cut() if(HAS_TRAIT(src, TRAIT_SIMPLE_WOUNDS)) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 1ab39d611f5..a98ea679046 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -164,7 +164,7 @@ if(user.sexcon && user.sexcon.target == src && !isnull(user.sexcon.current_action)) switch(user.sexcon.current_action) - if(/datum/sex_action/blowjob || /datum/sex_action/crotch_nuzzle || /datum/sex_action/cunnilingus || /datum/sex_action/rimming || /datum/sex_action/suck_balls) + if(/datum/sex_action/blowjob, /datum/sex_action/crotch_nuzzle, /datum/sex_action/cunnilingus, /datum/sex_action/rimming, /datum/sex_action/suck_balls) dam2do *= 2 //Vrell - biting their junk hurts more def_zone = BODY_ZONE_PRECISE_GROIN do_bound_check = FALSE @@ -174,7 +174,7 @@ do_bound_check = FALSE if(sexcon && sexcon.target == user && !isnull(sexcon.current_action)) switch(sexcon.current_action) - if(/datum/sex_action/throat_sex || /datum/sex_action/force_blowjob || /datum/sex_action/force_crotch_nuzzle || /datum/sex_action/force_cunnilingus || /datum/sex_action/facesitting || /datum/sex_action/force_rimming) + if(/datum/sex_action/throat_sex, /datum/sex_action/force_blowjob, /datum/sex_action/force_crotch_nuzzle, /datum/sex_action/force_cunnilingus, /datum/sex_action/facesitting, /datum/sex_action/force_rimming) dam2do *= 2 //Vrell - biting their junk hurts more def_zone = BODY_ZONE_PRECISE_GROIN do_bound_check = FALSE @@ -473,7 +473,7 @@ stealpos.Add(V.get_item_by_slot(SLOT_BELT_R)) if (V.get_item_by_slot(SLOT_BELT_L)) stealpos.Add(V.get_item_by_slot(SLOT_BELT_L)) - if("r_hand" || "l_hand") + if("r_hand", "l_hand") if (V.get_item_by_slot(SLOT_RING)) stealpos.Add(V.get_item_by_slot(SLOT_RING)) if (length(stealpos) > 0) @@ -675,26 +675,6 @@ span_danger("I avoid [src]'s bite!"), span_hear("I hear jaws snapping shut!"), COMBAT_MESSAGE_RANGE, src) to_chat(src, span_danger("My bite misses [ML]!")) -/* - Aliens - Defaults to same as monkey in most places -*/ -/mob/living/carbon/alien/UnarmedAttack(atom/A) - A.attack_alien(src) - -/atom/proc/attack_alien(mob/living/carbon/alien/user) - attack_paw(user) - return - -/mob/living/carbon/alien/RestrainedClickOn(atom/A) - return - -// Babby aliens -/mob/living/carbon/alien/larva/UnarmedAttack(atom/A) - A.attack_larva(src) -/atom/proc/attack_larva(mob/user) - return - /* Slimes diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 7f69512cdd3..090ad552490 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -210,9 +210,6 @@ config_entry_value = list( //DEFAULTS /mob/living/simple_animal = 1, /mob/living/silicon/pai = 1, - /mob/living/carbon/alien/humanoid/hunter = -1, - /mob/living/carbon/alien/humanoid/royal/praetorian = 1, - /mob/living/carbon/alien/humanoid/royal/queen = 3 ) /datum/config_entry/keyed_list/multiplicative_movespeed/ValidateAndSet() @@ -260,8 +257,6 @@ movedelay_type = /mob/living/silicon/robot /datum/config_entry/number/outdated_movedelay/monkey_delay movedelay_type = /mob/living/carbon/monkey -/datum/config_entry/number/outdated_movedelay/alien_delay - movedelay_type = /mob/living/carbon/alien /datum/config_entry/number/outdated_movedelay/slime_delay movedelay_type = /mob/living/simple_animal/slime /datum/config_entry/number/outdated_movedelay/animal_delay diff --git a/code/controllers/globals.dm b/code/controllers/globals.dm index e39e5f210ff..24bdd186542 100644 --- a/code/controllers/globals.dm +++ b/code/controllers/globals.dm @@ -13,7 +13,11 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) GLOB = src var/datum/controller/exclude_these = new - gvars_datum_in_built_vars = exclude_these.vars + list(NAMEOF(src, gvars_datum_protected_varlist), NAMEOF(src, gvars_datum_in_built_vars), NAMEOF(src, gvars_datum_init_order)) + // I know this is dumb but the nested vars list hangs a ref to the datum. This fixes that + // I have an issue report open, lummox has not responded. It might be a FeaTuRE + // Sooo we gotta be dumb + var/list/controller_vars = exclude_these.vars.Copy() + gvars_datum_in_built_vars = controller_vars + list(NAMEOF(src, gvars_datum_protected_varlist), NAMEOF(src, gvars_datum_in_built_vars), NAMEOF(src, gvars_datum_init_order)) QDEL_IN(exclude_these, 0) //signal logging isn't ready log_world("[vars.len - gvars_datum_in_built_vars.len] global variables") diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 4dd81d04fca..088d38196c9 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -68,7 +68,11 @@ GLOBAL_REAL(Master, /datum/controller/master) = new // Highlander-style: there can only be one! Kill off the old and replace it with the new. if(!random_seed) - random_seed = (TEST_RUN_PARAMETER in world.params) ? 29051994 : rand(1, 1e9) +#ifdef UNIT_TESTS + random_seed = 29051994 +#else + random_seed = rand(1, 1e9) +#endif rand_seed(random_seed) var/list/_subsystems = list() diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm index 225aa533036..d167822186e 100644 --- a/code/controllers/subsystem/economy.dm +++ b/code/controllers/subsystem/economy.dm @@ -56,85 +56,8 @@ SUBSYSTEM_DEF(economy) /datum/controller/subsystem/economy/fire(resumed = 0) return - eng_payout() // Payout based on nothing. What will replace it? Surplus power, powered APC's, air alarms? Who knows. - sci_payout() // Payout based on slimes. - secmedsrv_payout() // Payout based on crew safety, health, and mood. - civ_payout() // Payout based on ??? Profit - car_payout() // Cargo's natural gain in the cash moneys. - for(var/A in bank_accounts) - var/datum/bank_account/B = A - B.payday(1) - /datum/controller/subsystem/economy/proc/get_dep_account(dep_id) for(var/datum/bank_account/department/D in generated_accounts) if(D.department_id == dep_id) return D - -/datum/controller/subsystem/economy/proc/eng_payout() - var/engineering_cash = 3000 - var/datum/bank_account/D = get_dep_account(ACCOUNT_ENG) - if(D) - D.adjust_money(engineering_cash) - - -/datum/controller/subsystem/economy/proc/car_payout() - var/cargo_cash = 500 - var/datum/bank_account/D = get_dep_account(ACCOUNT_CAR) - if(D) - D.adjust_money(cargo_cash) - -/datum/controller/subsystem/economy/proc/secmedsrv_payout() - var/crew - var/alive_crew - var/dead_monsters - var/cash_to_grant - for(var/mob/m in GLOB.mob_list) - if(isnewplayer(m)) - continue - if(m.mind) - if(isbrain(m) || iscameramob(m)) - continue - if(ishuman(m)) - var/mob/living/carbon/human/H = m - crew++ - if(H.stat != DEAD) - alive_crew++ - var/datum/component/mood/mood = H.GetComponent(/datum/component/mood) - var/medical_cash = (H.health / H.maxHealth) * alive_humans_bounty - if(mood) - var/datum/bank_account/D = get_dep_account(ACCOUNT_SRV) - if(D) - var/mood_dosh = (mood.mood_level / 9) * mood_bounty - D.adjust_money(mood_dosh) - medical_cash *= (mood.sanity / 100) - - var/datum/bank_account/D = get_dep_account(ACCOUNT_MED) - if(D) - D.adjust_money(medical_cash) - if(ishostile(m)) - var/mob/living/simple_animal/hostile/H = m - if(H.stat == DEAD && H.z in SSmapping.levels_by_trait(ZTRAIT_STATION)) - dead_monsters++ - CHECK_TICK - var/living_ratio = alive_crew / crew - cash_to_grant = (crew_safety_bounty * living_ratio) + (monster_bounty * dead_monsters) - var/datum/bank_account/D = get_dep_account(ACCOUNT_SEC) - if(D) - D.adjust_money(min(cash_to_grant, MAX_GRANT_SECMEDSRV)) - -/datum/controller/subsystem/economy/proc/sci_payout() - var/science_bounty = 0 - for(var/mob/living/simple_animal/slime/S in GLOB.mob_list) - if(S.stat == DEAD) - continue - science_bounty += slime_bounty[S.colour] - var/datum/bank_account/D = get_dep_account(ACCOUNT_SCI) - if(D) - D.adjust_money(min(science_bounty, MAX_GRANT_SCI)) - -/datum/controller/subsystem/economy/proc/civ_payout() - var/civ_cash = (rand(1,5) * 500) - var/datum/bank_account/D = get_dep_account(ACCOUNT_CIV) - if(D) - D.adjust_money(min(civ_cash, MAX_GRANT_CIV)) diff --git a/code/controllers/subsystem/fire_burning.dm b/code/controllers/subsystem/fire_burning.dm index bef9a767ef9..e71b4956d1c 100644 --- a/code/controllers/subsystem/fire_burning.dm +++ b/code/controllers/subsystem/fire_burning.dm @@ -1,6 +1,6 @@ SUBSYSTEM_DEF(fire_burning) name = "Fire Burning" - priority = FIRE_PRIOTITY_BURNING + priority = FIRE_PRIORITY_BURNING flags = SS_NO_INIT|SS_BACKGROUND runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 7a2d0d79fde..455302d78f2 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -146,7 +146,7 @@ SUBSYSTEM_DEF(garbage) if (length(L) < 2) count++ if (MC_TICK_CHECK) - return + break continue var/GCd_at_time = L[1] @@ -165,7 +165,7 @@ SUBSYSTEM_DEF(garbage) reference_find_on_fail -= refID //It's deleted we don't care anymore. #endif if (MC_TICK_CHECK) - return + break continue // Something's still referring to the qdel'd object. @@ -202,13 +202,13 @@ SUBSYSTEM_DEF(garbage) if (GC_QUEUE_HARDDELETE) HardDelete(D) if (MC_TICK_CHECK) - return + break continue Queue(D, level+1) if (MC_TICK_CHECK) - return + break if (count) queue.Cut(1,count+1) count = 0 diff --git a/code/controllers/subsystem/icon_smooth.dm b/code/controllers/subsystem/icon_smooth.dm index c25fb5b44f7..f22ed770c18 100644 --- a/code/controllers/subsystem/icon_smooth.dm +++ b/code/controllers/subsystem/icon_smooth.dm @@ -2,9 +2,8 @@ SUBSYSTEM_DEF(icon_smooth) name = "Icon Smoothing" init_order = INIT_ORDER_ICON_SMOOTHING wait = 1 - priority = FIRE_PRIOTITY_SMOOTHING + priority = FIRE_PRIORITY_SMOOTHING flags = SS_TICKER -// flags = SS_NO_FIRE ///Blueprints assemble an image of what pipes/manifolds/wires look like on initialization, and thus should be taken after everything's been smoothed var/list/blueprint_queue = list() var/list/smooth_queue = list() @@ -30,15 +29,14 @@ SUBSYSTEM_DEF(icon_smooth) can_fire = 0 /datum/controller/subsystem/icon_smooth/Initialize() - smooth_zlevel(1,TRUE) - smooth_zlevel(2,TRUE) - var/queue = smooth_queue + var/list/queue = smooth_queue smooth_queue = list() for(var/V in queue) - var/atom/A = V - if(!A || A.z <= 2) + var/atom/smoothing_atom = queue[length(queue)] + queue.len-- + if(QDELETED(smoothing_atom) || !(smoothing_atom.smooth & SMOOTH_QUEUED) || !smoothing_atom.z) continue - smooth_icon(A) + smooth_icon(smoothing_atom) CHECK_TICK queue = blueprint_queue blueprint_queue = list() diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 143fed55124..7270b28a513 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -5,7 +5,7 @@ SUBSYSTEM_DEF(job) var/list/occupations = list() //List of all jobs var/list/datum/job/name_occupations = list() //Dict of all jobs, keys are titles - var/list/type_occupations = list() //Dict of all jobs, keys are types + var/list/datum/job/type_occupations = list() //Dict of all jobs, keys are types var/list/unassigned = list() //Players who need jobs var/initial_players_to_assign = 0 //used for checking against population caps @@ -207,7 +207,7 @@ SUBSYSTEM_DEF(job) JobDebug("GRJ player not enough xp, Player: [player]") continue - if(player.mind && job.title in player.mind.restricted_roles) + if(player.mind && (job.title in player.mind.restricted_roles)) JobDebug("GRJ incompatible with antagonist role, Player: [player], Job: [job.title]") continue @@ -451,7 +451,7 @@ SUBSYSTEM_DEF(job) JobDebug("DO player not enough xp, Player: [player], Job:[job.title]") continue - if(player.mind && job.title in player.mind.restricted_roles) + if(player.mind && (job.title in player.mind.restricted_roles)) JobDebug("DO incompatible with antagonist role, Player: [player], Job:[job.title]") continue @@ -551,7 +551,7 @@ SUBSYSTEM_DEF(job) if(job.required_playtime_remaining(player.client)) continue - if(player.mind && job.title in player.mind.restricted_roles) + if(player.mind && (job.title in player.mind.restricted_roles)) continue if(length(job.allowed_races) && !(player.client.prefs.pref_species.type in job.allowed_races)) diff --git a/code/controllers/subsystem/librarian.dm b/code/controllers/subsystem/librarian.dm index 942b5b6b361..7b57e38ab3e 100644 --- a/code/controllers/subsystem/librarian.dm +++ b/code/controllers/subsystem/librarian.dm @@ -9,7 +9,7 @@ SUBSYSTEM_DEF(librarian) return list() if(books.Find(input)) return books[input] - else + else if(fexists("strings/books/[input]")) books[input] = file2book(input) return books[input] return list() diff --git a/code/controllers/subsystem/lobby.dm b/code/controllers/subsystem/lobby.dm index 3e62d9cd22d..92a19f7915b 100644 --- a/code/controllers/subsystem/lobby.dm +++ b/code/controllers/subsystem/lobby.dm @@ -17,4 +17,4 @@ SUBSYSTEM_DEF(lobbymenu) if(player.client) player.lobby_refresh() if (MC_TICK_CHECK) - return \ No newline at end of file + return diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 4f26ad62a22..bed60628e61 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -35,7 +35,14 @@ SUBSYSTEM_DEF(mapping) // Z-manager stuff var/station_start // should only be used for maploading-related tasks var/space_levels_so_far = 0 - var/list/z_list + ///list of all z level datums in the order of their z (z level 1 is at index 1, etc.) + var/list/datum/space_level/z_list + ///list of all z level indices that form multiz connections and whether theyre linked up or down + ///list of lists, inner lists are of the form: list("up or down link direction" = TRUE) + var/list/multiz_levels = list() + ///shows the default gravity value for each z level. recalculated when gravity generators change. + ///associative list of the form: list("[z level num]" = max generator gravity in that z level OR the gravity level trait) + var/list/gravity_by_z_level = list() var/datum/space_level/transit var/datum/space_level/empty_space var/num_of_res_levels = 1 @@ -115,9 +122,47 @@ SUBSYSTEM_DEF(mapping) setup_map_transitions() generate_station_area_list() initialize_reserved_level(transit.z_value) + generate_z_level_linkages() + calculate_default_z_level_gravities() spawn_random_travel_tiles() return ..() +/datum/controller/subsystem/mapping/proc/calculate_default_z_level_gravities() + for(var/z_level in 1 to length(z_list)) + calculate_z_level_gravity(z_level) + +/datum/controller/subsystem/mapping/proc/generate_z_level_linkages() + for(var/z_level in 1 to length(z_list)) + generate_linkages_for_z_level(z_level) + +/datum/controller/subsystem/mapping/proc/generate_linkages_for_z_level(z_level) + if(!isnum(z_level) || z_level <= 0) + return FALSE + + if(multiz_levels.len < z_level) + multiz_levels.len = z_level + + var/z_above = level_trait(z_level, ZTRAIT_UP) + var/z_below = level_trait(z_level, ZTRAIT_DOWN) + if(!(z_above == TRUE || z_above == FALSE || z_above == null) || !(z_below == TRUE || z_below == FALSE || z_below == null)) + stack_trace("Warning, numeric mapping offsets are deprecated. Instead, mark z level connections by setting UP/DOWN to true if the connection is allowed") + multiz_levels[z_level] = new /list(LARGEST_Z_LEVEL_INDEX) + multiz_levels[z_level][Z_LEVEL_UP] = !!z_above + multiz_levels[z_level][Z_LEVEL_DOWN] = !!z_below + +/datum/controller/subsystem/mapping/proc/calculate_z_level_gravity(z_level_number) + if(!isnum(z_level_number) || z_level_number < 1) + return FALSE + + var/max_gravity = 0 + + for(var/obj/machinery/gravity_generator/main/grav_gen as anything in GLOB.gravity_generators["[z_level_number]"]) + max_gravity = max(grav_gen.setting, max_gravity) + + max_gravity = max_gravity || level_trait(z_level_number, ZTRAIT_GRAVITY) || 0//just to make sure no nulls + gravity_by_z_level["[z_level_number]"] = max_gravity + return max_gravity + /datum/controller/subsystem/mapping/proc/wipe_reservations(wipe_safety_delay = 100) if(clearing_reserved_turfs || !initialized) //in either case this is just not needed. return @@ -187,6 +232,7 @@ SUBSYSTEM_DEF(mapping) clearing_reserved_turfs = SSmapping.clearing_reserved_turfs z_list = SSmapping.z_list + multiz_levels = SSmapping.multiz_levels #define INIT_ANNOUNCE(X) to_chat(world, span_boldannounce("[X]")); log_world(X) /datum/controller/subsystem/mapping/proc/LoadGroup(list/errorList, name, path, files, list/traits, list/default_traits, silent = FALSE) diff --git a/code/controllers/subsystem/migrants.dm b/code/controllers/subsystem/migrants.dm index c3b88d1988f..7c79d7b8b28 100644 --- a/code/controllers/subsystem/migrants.dm +++ b/code/controllers/subsystem/migrants.dm @@ -193,7 +193,6 @@ SUBSYSTEM_DEF(migrants) /datum/controller/subsystem/migrants/proc/spawn_migrant(datum/migrant_wave/wave, datum/migrant_assignment/assignment, spawn_on_location, migrant_wave_id) var/rank = "Migrant" var/mob/dead/new_player/newplayer = assignment.client.mob - var/ckey = assignment.client.ckey SSjob.AssignRole(newplayer, rank, TRUE) @@ -222,7 +221,7 @@ SUBSYSTEM_DEF(migrants) if(humanc) var/fakekey = character.ckey - if(ckey in GLOB.anonymize) + if(character.ckey in GLOB.anonymize) fakekey = get_fake_key(character.ckey) GLOB.character_list[character.mobid] = "[fakekey] was [character.real_name] ([rank])
" GLOB.character_ckey_list[character.real_name] = character.ckey diff --git a/code/controllers/subsystem/minor_mapping.dm b/code/controllers/subsystem/minor_mapping.dm index 2209c06f5de..371e3bd132a 100644 --- a/code/controllers/subsystem/minor_mapping.dm +++ b/code/controllers/subsystem/minor_mapping.dm @@ -86,4 +86,4 @@ SUBSYSTEM_DEF(minor_mapping) if(istype(A, /area/rogue/outdoors)) suitable += t - return shuffle(suitable) \ No newline at end of file + return shuffle(suitable) diff --git a/code/controllers/subsystem/mobs.dm b/code/controllers/subsystem/mobs.dm index df357516568..2be871fd04d 100644 --- a/code/controllers/subsystem/mobs.dm +++ b/code/controllers/subsystem/mobs.dm @@ -9,8 +9,6 @@ SUBSYSTEM_DEF(mobs) var/static/list/clients_by_zlevel[][] var/static/list/dead_players_by_zlevel[][] = list(list()) // Needs to support zlevel 1 here, MaxZChanged only happens when z2 is created and new_players can login before that. var/static/list/cubemonkeys = list() - var/list/dead_mobs = list() - var/amt2process = 5 /datum/controller/subsystem/mobs/stat_entry() @@ -42,10 +40,6 @@ SUBSYSTEM_DEF(mobs) if (!resumed) src.currentrun = GLOB.mob_living_list.Copy() - var/createnewdm = FALSE - if(!dead_mobs.len) - createnewdm = TRUE - //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun var/times_fired = src.times_fired @@ -56,22 +50,8 @@ SUBSYSTEM_DEF(mobs) GLOB.mob_living_list.Remove(L) continue if(L.stat == DEAD) - if(createnewdm) - dead_mobs |= L + L.DeadLife() else L.Life(seconds, times_fired) if (MC_TICK_CHECK) return - - var/ye = 0 - while(dead_mobs.len) - if(ye > amt2process) - return - ye++ - var/mob/living/L = dead_mobs[dead_mobs.len] - dead_mobs.len-- - if(!L || QDELETED(L)) - continue - L.DeadLife() - if (MC_TICK_CHECK) - return diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm index 8b645d5279a..3dfcc4bfdb6 100644 --- a/code/controllers/subsystem/npcpool.dm +++ b/code/controllers/subsystem/npcpool.dm @@ -3,7 +3,6 @@ SUBSYSTEM_DEF(npcpool) flags = SS_POST_FIRE_TIMING|SS_NO_INIT|SS_BACKGROUND priority = FIRE_PRIORITY_NPC runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - var/amt2update = 10 var/list/currentrun = list() /datum/controller/subsystem/npcpool/stat_entry() @@ -12,28 +11,25 @@ SUBSYSTEM_DEF(npcpool) /datum/controller/subsystem/npcpool/fire(resumed = FALSE) - if (!resumed || !currentrun.len) + if (!resumed || !src.currentrun.len) var/list/activelist = GLOB.simple_animals[AI_ON] src.currentrun = activelist.Copy() -// //cache for sanic speed (lists are references anyways) -// var/list/currentrun = src.currentrun + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun - var/ye = 0 while(currentrun.len) - if(ye > amt2update) - return - ye++ var/mob/living/simple_animal/SA = currentrun[currentrun.len] --currentrun.len - if(!SA.ckey && !SA.notransform) - if(SA.stat != DEAD) - SA.handle_automated_action() - if(SA.stat != DEAD) - SA.handle_automated_movement() - if(SA.stat != DEAD) - SA.handle_automated_speech() + if(SA) + if(!SA.ckey && !SA.notransform) + if(SA.stat != DEAD) + SA.handle_automated_action() + if(SA.stat != DEAD) + SA.handle_automated_movement() + if(SA.stat != DEAD) + SA.handle_automated_speech() if (MC_TICK_CHECK) return @@ -51,4 +47,4 @@ SUBSYSTEM_DEF(npcpool) if(QDELETED(mobinput)) return mobinput.handle_automated_movement() - mobinput.move_skip = FALSE \ No newline at end of file + mobinput.move_skip = FALSE diff --git a/code/controllers/subsystem/processing/fastprocess.dm b/code/controllers/subsystem/processing/fastprocess.dm index 1046c53fef6..c5cf7b74375 100644 --- a/code/controllers/subsystem/processing/fastprocess.dm +++ b/code/controllers/subsystem/processing/fastprocess.dm @@ -4,4 +4,4 @@ PROCESSING_SUBSYSTEM_DEF(fastprocess) name = "Fast Processing" wait = 2 stat_tag = "FP" - processing_flag = PROCESSING_FAST \ No newline at end of file + processing_flag = PROCESSING_FAST diff --git a/code/controllers/subsystem/processing/haunting.dm b/code/controllers/subsystem/processing/haunting.dm index 8c0e86c3c52..8ea210bfd1a 100644 --- a/code/controllers/subsystem/processing/haunting.dm +++ b/code/controllers/subsystem/processing/haunting.dm @@ -2,4 +2,4 @@ PROCESSING_SUBSYSTEM_DEF(haunting) name = "haunting" wait = 50 priority = FIRE_PRIORITY_PING - stat_tag = "HAUNT" \ No newline at end of file + stat_tag = "HAUNT" diff --git a/code/controllers/subsystem/processing/huds.dm b/code/controllers/subsystem/processing/huds.dm index 234b426625b..afd0c985eb3 100644 --- a/code/controllers/subsystem/processing/huds.dm +++ b/code/controllers/subsystem/processing/huds.dm @@ -3,4 +3,4 @@ PROCESSING_SUBSYSTEM_DEF(huds) name = "HUD updates" wait = 1 priority = FIRE_PRIORITY_HUDS - stat_tag = "HUDS" \ No newline at end of file + stat_tag = "HUDS" diff --git a/code/controllers/subsystem/processing/mapgen.dm b/code/controllers/subsystem/processing/mapgen.dm deleted file mode 100644 index 2ae1d2c17ab..00000000000 --- a/code/controllers/subsystem/processing/mapgen.dm +++ /dev/null @@ -1,5 +0,0 @@ -PROCESSING_SUBSYSTEM_DEF(mapgen) - name = "mapgen" - wait = 1 - priority = FIRE_PRIORITY_SERVER_MAINT - stat_tag = "MAPGEN" \ No newline at end of file diff --git a/code/controllers/subsystem/processing/mousecharge.dm b/code/controllers/subsystem/processing/mousecharge.dm index 1daade3c78b..574d0bcf104 100644 --- a/code/controllers/subsystem/processing/mousecharge.dm +++ b/code/controllers/subsystem/processing/mousecharge.dm @@ -20,4 +20,4 @@ PROCESSING_SUBSYSTEM_DEF(mousecharge) // fully stop so that a future START_PROCESSING will work STOP_PROCESSING(src, thing) if (MC_TICK_CHECK) - return \ No newline at end of file + return diff --git a/code/controllers/subsystem/rogue/crediticons.dm b/code/controllers/subsystem/rogue/crediticons.dm index af7a8c465dd..a918143e497 100644 --- a/code/controllers/subsystem/rogue/crediticons.dm +++ b/code/controllers/subsystem/rogue/crediticons.dm @@ -25,4 +25,4 @@ SUBSYSTEM_DEF(crediticons) thing.add_credit() STOP_PROCESSING(SScrediticons, thing) if (MC_TICK_CHECK) - return \ No newline at end of file + return diff --git a/code/controllers/subsystem/rogue/damoverlays.dm b/code/controllers/subsystem/rogue/damoverlays.dm index 8e0401d1528..459b5dec862 100644 --- a/code/controllers/subsystem/rogue/damoverlays.dm +++ b/code/controllers/subsystem/rogue/damoverlays.dm @@ -6,20 +6,15 @@ SUBSYSTEM_DEF(damoverlays) var/list/currentrun = list() var/list/processing = list() processing_flag = PROCESSING_DAMOVERLAYS - var/amt2update = 5 /datum/controller/subsystem/damoverlays/fire(resumed = 0) - if (!resumed || !currentrun.len) - currentrun = processing.Copy() + if (!resumed || !src.currentrun.len) + src.currentrun = processing.Copy() -// //cache for sanic speed (lists are references anyways) -// var/list/currentrun = src.currentrun + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun - var/ye = 0 while(currentrun.len) - if(ye > amt2update) - return - ye++ var/mob/living/carbon/human/thing = currentrun[currentrun.len] currentrun.len-- if (!thing || QDELETED(thing)) diff --git a/code/controllers/subsystem/rogue/devotion.dm b/code/controllers/subsystem/rogue/devotion.dm index 39da862d71c..0107f8a9e29 100644 --- a/code/controllers/subsystem/rogue/devotion.dm +++ b/code/controllers/subsystem/rogue/devotion.dm @@ -132,7 +132,7 @@ if(!H || !H.mind || !patron) return - var/list/spelllist = list(/obj/effect/proc_holder/spell/targeted/churn, patron.t0) + var/list/spelllist = list(/obj/effect/proc_holder/spell/targeted/churn, patron.t0, patron.t1) for(var/spell_type in spelllist) if(!spell_type || H.mind.has_spell(spell_type)) continue @@ -180,7 +180,7 @@ return granted_spells = list() - var/list/spelllist = list(patron.t0, patron.t1) + var/list/spelllist = list(patron.t0, patron.t1, patron.t2, patron.t3, patron.t4) for(var/spell_type in spelllist) if(!spell_type || H.mind.has_spell(spell_type)) continue @@ -189,6 +189,7 @@ LAZYADD(granted_spells, newspell) level = CLERIC_T1 max_progression = CLERIC_REQ_4 + max_devotion = CLERIC_REQ_4 passive_devotion_gain = 1 passive_progression_gain = 1 update_devotion(100, CLERIC_REQ_4, silent = TRUE) @@ -207,25 +208,6 @@ prayer_effectiveness = 2 to_chat(holder, span_boldnotice("I have been welcomed back to the Church. I am now able to gain devotion again.")) -/datum/devotion/proc/grant_spells_devout_noc(mob/living/carbon/human/H) - if(!H || !H.mind || !patron) - return - - granted_spells = list() - var/list/spelllist = list(patron.t0) - for(var/spell_type in spelllist) - if(!spell_type || H.mind.has_spell(spell_type)) - continue - var/newspell = new spell_type - H.mind.AddSpell(newspell) - LAZYADD(granted_spells, newspell) - level = CLERIC_T0 - max_progression = CLERIC_REQ_2 - passive_devotion_gain = 1 - passive_progression_gain = 1 - update_devotion(100, CLERIC_REQ_4, silent = TRUE) - START_PROCESSING(SSobj, src) - // Debug verb /mob/living/carbon/human/proc/devotionchange() set name = "(DEBUG)Change Devotion" diff --git a/code/controllers/subsystem/rogue/magic_tab.dm b/code/controllers/subsystem/rogue/magic_tab.dm index a1ac6c0af0d..cc3559e109c 100644 --- a/code/controllers/subsystem/rogue/magic_tab.dm +++ b/code/controllers/subsystem/rogue/magic_tab.dm @@ -20,7 +20,7 @@ // TODO: GLOBAL LISTS OF SPELLS, THIS IS PAINFUL var/list/combat_spells = list(/obj/effect/proc_holder/spell/invoked/projectile/fireball,/obj/effect/proc_holder/spell/invoked/projectile/lightningbolt,/obj/effect/proc_holder/spell/invoked/projectile/eldritchblast5e,/obj/effect/proc_holder/spell/invoked/projectile/fetch,/obj/effect/proc_holder/spell/invoked/projectile/spitfire,/obj/effect/proc_holder/spell/invoked/projectile/firebolt5e,/obj/effect/proc_holder/spell/invoked/projectile/rayoffrost5e,/obj/effect/proc_holder/spell/invoked/projectile/acidsplash5e,/obj/effect/proc_holder/spell/invoked/blade_burst,/obj/effect/proc_holder/spell/invoked/frostbite5e,/obj/effect/proc_holder/spell/invoked/poisonspray5e,/obj/effect/proc_holder/spell/invoked/arcyne_storm,/obj/effect/proc_holder/spell/invoked/chilltouch5e,/obj/effect/proc_holder/spell/invoked/infestation5e,/obj/effect/proc_holder/spell/invoked/mindsliver5e,/obj/effect/proc_holder/spell/targeted/lightninglure5e,/obj/effect/proc_holder/spell/invoked/greenflameblade5e,) var/list/defense_spells = list(/obj/effect/proc_holder/spell/invoked/forcewall_weak,/obj/effect/proc_holder/spell/self/bladeward5e,) - var/list/utility_spells = list(/obj/effect/proc_holder/spell/invoked/slowdown_spell_aoe,/obj/effect/proc_holder/spell/invoked/message,/obj/effect/proc_holder/spell/invoked/push_spell,/obj/effect/proc_holder/spell/invoked/longjump,/obj/effect/proc_holder/spell/aoe_turf/conjure/Wolf,/obj/effect/proc_holder/spell/targeted/guidance5e,/obj/effect/proc_holder/spell/targeted/encodethoughts5e,/obj/effect/proc_holder/spell/invoked/magicstone5e,/obj/effect/proc_holder/spell/invoked/mending5e,/obj/effect/proc_holder/spell/self/light5e,/obj/effect/proc_holder/spell/aoe_turf/conjure/createbonfire5e,) + var/list/utility_spells = list(/obj/effect/proc_holder/spell/invoked/slowdown_spell_aoe,/obj/effect/proc_holder/spell/invoked/message,/obj/effect/proc_holder/spell/invoked/push_spell,/obj/effect/proc_holder/spell/invoked/longjump,/obj/effect/proc_holder/spell/aoe_turf/conjure/Wolf,/obj/effect/proc_holder/spell/targeted/guidance5e,/obj/effect/proc_holder/spell/targeted/encodethoughts5e,/obj/effect/proc_holder/spell/invoked/magicstone5e,/obj/effect/proc_holder/spell/invoked/mending5e,/obj/effect/proc_holder/spell/self/light5e,/obj/effect/proc_holder/spell/aoe_turf/conjure/createbonfire5e,/obj/effect/proc_holder/spell/targeted/touch/prestidigitation,) var/categories = list("Combat", "Defense", "Utility", "Exit Spell Selection") @@ -39,7 +39,7 @@ if("Exit Spell Selection") // In case someone doesn't want to spend every point they have, for whatever reason break // Unelegant, but I can't find a better way to stop this loop without losing spell points -/mob/living/carbon/human/proc/choose_magic(list/category, mob/living/carbon/human/H) +/mob/living/carbon/human/proc/choose_magic(list/obj/effect/proc_holder/spell/category, mob/living/carbon/human/H) var/list/choices = list() for(var/i = 1, i <= category.len, i++) choices["[category[i].name]: [category[i].cost]"] = category[i] diff --git a/code/controllers/subsystem/rogue/role_class_handler/class_select_handler/class_select_handler.dm b/code/controllers/subsystem/rogue/role_class_handler/class_select_handler/class_select_handler.dm index 3af7776a33e..8bb151973c1 100644 --- a/code/controllers/subsystem/rogue/role_class_handler/class_select_handler/class_select_handler.dm +++ b/code/controllers/subsystem/rogue/role_class_handler/class_select_handler/class_select_handler.dm @@ -209,7 +209,7 @@ rolled_classes[pick(possible_list)] = 0 if(cur_picked_class == filled_class) - if(special_session_queue && cur_picked_class in special_session_queue) + if(special_session_queue && (cur_picked_class in special_session_queue)) special_selected = FALSE cur_picked_class = null diff --git a/code/controllers/subsystem/rogue/role_class_handler/role_class_handler.dm b/code/controllers/subsystem/rogue/role_class_handler/role_class_handler.dm index 963dc82523d..c2b49b3f21f 100644 --- a/code/controllers/subsystem/rogue/role_class_handler/role_class_handler.dm +++ b/code/controllers/subsystem/rogue/role_class_handler/role_class_handler.dm @@ -25,7 +25,7 @@ SUBSYSTEM_DEF(role_class_handler) ex: special_session_queue[ckey] += /datum/advclass/BIGMAN contents: special_session_queue = list("ckey" = list("funID" = /datum/advclass/class), "ckey2" = list("funID" = /datum/advclass/class)... etc) */ - var/list/special_session_queue = list() + var/list/list/special_session_queue = list() /* diff --git a/code/controllers/subsystem/rogue/seelie_tab.dm b/code/controllers/subsystem/rogue/seelie_tab.dm index 7dc5db73d9e..840fb3bba78 100644 --- a/code/controllers/subsystem/rogue/seelie_tab.dm +++ b/code/controllers/subsystem/rogue/seelie_tab.dm @@ -23,8 +23,6 @@ if(TRUE) to_chat(src, span_warning("My aura is now one of misery")) User.aura = FALSE - src.log_message("[key_name(src)] has switched their aura to apply bad luck") if(FALSE) to_chat(src, span_warning("My aura is now one of blessing")) User.aura = TRUE - src.log_message("[key_name(src)] has switched their aura to apply good luck") diff --git a/code/controllers/subsystem/rogue/soundloopers.dm b/code/controllers/subsystem/rogue/soundloopers.dm index 16cd1e6ec1b..bb9f7573dd1 100644 --- a/code/controllers/subsystem/rogue/soundloopers.dm +++ b/code/controllers/subsystem/rogue/soundloopers.dm @@ -6,28 +6,30 @@ SUBSYSTEM_DEF(soundloopers) priority = FIRE_PRIORITY_DEFAULT var/list/processing = list() var/list/currentrun = list() - var/amt2update = 20 /datum/controller/subsystem/soundloopers/fire(resumed = 0) if (!resumed || !currentrun.len) - src.currentrun = shuffle(processing.Copy()) + src.currentrun = processing.Copy() -// //cache for sanic speed (lists are references anyways) -// var/list/currentrun = src.currentrun + //cache for sanic speed (lists are references anyways) + var/list/current = src.currentrun + var/static/count = 0 + if (count) //runtime last run before we could do this. + var/c = count + count = 0 //so if we runtime on the Cut, we don't try again. + current.Cut(1,c+1) - var/ye = 0 - while (currentrun.len) - if(ye > amt2update) - return - ye++ - var/datum/looping_sound/thing = currentrun[currentrun.len] - currentrun.len-- - if (!thing || QDELETED(thing)) + for(var/i in 1 to length(current)) + var/datum/looping_sound/thing = current[i] + count++ + if (QDELETED(thing)) // !thing is redundant as QDELETED includes an isnull check processing -= thing if (MC_TICK_CHECK) - return + break continue - if(thing.sound_loop()) - STOP_PROCESSING(SSsoundloopers, thing) + thing.sound_loop() if (MC_TICK_CHECK) - return \ No newline at end of file + break + if (count) + current.Cut(1,count+1) + count = 0 diff --git a/code/controllers/subsystem/rogue/todchange.dm b/code/controllers/subsystem/rogue/todchange.dm index 3a7ad2c28a6..96c6451593e 100644 --- a/code/controllers/subsystem/rogue/todchange.dm +++ b/code/controllers/subsystem/rogue/todchange.dm @@ -6,25 +6,20 @@ SUBSYSTEM_DEF(todchange) var/list/processing = list() var/list/currentrun = list() processing_flag = PROCESSING_TODCHANGE - var/amt2update = 100 /datum/controller/subsystem/todchange/fire(resumed = 0) if (!resumed || !currentrun.len) - src.currentrun = shuffle(processing.Copy()) + src.currentrun = processing.Copy() -// //cache for sanic speed (lists are references anyways) -// var/list/currentrun = src.currentrun + //cache for sanic speed (lists are references anyways) + var/list/current = src.currentrun -// if(!currentrun.len) +// if(!current.len) // testing("nothing to update [rand(1,9)]") - var/ye = 0 - while(currentrun.len) - if(ye > amt2update) - return - ye++ - var/obj/effect/sunlight/L = currentrun[currentrun.len] - currentrun.len-- + while(current.len) + var/obj/effect/sunlight/L = current[current.len] + current.len-- if (!L || QDELETED(L)) processing -= L if (MC_TICK_CHECK) diff --git a/code/controllers/subsystem/rogue/treasury.dm b/code/controllers/subsystem/rogue/treasury.dm index 19251c97272..8472201ba10 100644 --- a/code/controllers/subsystem/rogue/treasury.dm +++ b/code/controllers/subsystem/rogue/treasury.dm @@ -24,7 +24,7 @@ SUBSYSTEM_DEF(treasury) wait = 1 priority = FIRE_PRIORITY_WATER_LEVEL var/tax_value = 0.11 - var/queens_tax = 0.15 + var/queens_tax = 0.2 var/treasury_value = 0 var/list/bank_accounts = list() var/list/stockpile_datums = list() @@ -77,7 +77,7 @@ SUBSYSTEM_DEF(treasury) give_money_treasury(amt_to_generate, "wealth hoard") send_ooc_note("Income from wealth hoard: +[amt_to_generate]", job = list("Monarch", "Steward", "Clerk")) -/datum/controller/subsystem/treasury/proc/add_to_vault(var/obj/item/I) +/datum/controller/subsystem/treasury/proc/add_to_vault(obj/item/I) if(I.get_real_price() <= 0 || istype(I, /obj/item/roguecoin)) return if(!I.submitted_to_stockpile) diff --git a/code/controllers/subsystem/rogue/triumphs/triumph_buy_menu.dm b/code/controllers/subsystem/rogue/triumphs/triumph_buy_menu.dm index 89b51a387f9..ed05a3e5a67 100644 --- a/code/controllers/subsystem/rogue/triumphs/triumph_buy_menu.dm +++ b/code/controllers/subsystem/rogue/triumphs/triumph_buy_menu.dm @@ -204,4 +204,4 @@ if(href_list["close"]) SStriumphs.remove_triumph_buy_menu(linked_client) - \ No newline at end of file + diff --git a/code/controllers/subsystem/rogue/triumphs/triumphs.dm b/code/controllers/subsystem/rogue/triumphs/triumphs.dm index 21a0c02c3b7..28ac56db94d 100644 --- a/code/controllers/subsystem/rogue/triumphs/triumphs.dm +++ b/code/controllers/subsystem/rogue/triumphs/triumphs.dm @@ -63,7 +63,7 @@ SUBSYSTEM_DEF(triumphs) // This represents the triumph buy organization on the main SS for triumphs // Each key is a category name // And then the list will have a number in a string that leads to a list of datums - var/list/central_state_data = list( + var/list/list/list/central_state_data = list( TRIUMPH_CAT_ROUND_EFX = 0, TRIUMPH_CAT_CHARACTER = 0, TRIUMPH_CAT_MISC = 0, diff --git a/code/controllers/subsystem/rogueroundsplayed.dm b/code/controllers/subsystem/rogueroundsplayed.dm index f7a1f71d3e2..76c4be06a56 100644 --- a/code/controllers/subsystem/rogueroundsplayed.dm +++ b/code/controllers/subsystem/rogueroundsplayed.dm @@ -65,4 +65,4 @@ if(json[key]) return json[key] - return 0 \ No newline at end of file + return 0 diff --git a/code/controllers/subsystem/runechat.dm b/code/controllers/subsystem/runechat.dm index 931728b6423..8bfd0c39e0b 100644 --- a/code/controllers/subsystem/runechat.dm +++ b/code/controllers/subsystem/runechat.dm @@ -10,4 +10,4 @@ SUBSYSTEM_DEF(runechat) queued_message.Invoke() message_queue.len-- if(MC_TICK_CHECK) - return \ No newline at end of file + return diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index 37ec8f2bce4..cf32f656e4c 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -188,7 +188,6 @@ SUBSYSTEM_DEF(shuttle) resolve this problem by loading an emergency shuttle template \ manually, and then calling register() on the mobile docking port. \ Good luck.") - return emergency = backup_shuttle var/srd = CONFIG_GET(number/shuttle_refuel_delay) if(world.time - SSticker.round_start_time < srd) @@ -365,6 +364,8 @@ SUBSYSTEM_DEF(shuttle) if(!istype(d) || QDELETED(d)) hostileEnvironments -= d emergencyNoEscape = hostileEnvironments.len + if(!emergency) + return if(emergencyNoEscape && (emergency.mode == SHUTTLE_IGNITING)) emergency.mode = SHUTTLE_STRANDED @@ -912,7 +913,7 @@ SUBSYSTEM_DEF(shuttle) /datum/controller/subsystem/shuttle/proc/autoEnd() //CIT CHANGE - allows shift to end without being a proper shuttle call? if(EMERGENCY_IDLE_OR_RECALLED) - SSshuttle.emergency.request(silent = TRUE) + SSshuttle.emergency.request() priority_announce("The last boat is leaving.", null, 'sound/misc/notice.ogg') // log_game("Round end vote passed. Shuttle has been auto-called.") // message_admins("Round end vote passed. Shuttle has been auto-called.") diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 0dbb2e5d981..83e1036f4ee 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -139,7 +139,7 @@ SUBSYSTEM_DEF(ticker) if(isemptylist(music)) music = world.file2list(ROUND_START_MUSIC_LIST, "\n") - login_music = pick(music) + login_music = safepick(music) else login_music = "[global.config.directory]/title_music/sounds/[pick(music)]" diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 5d1d3b52041..1f4e13e9b27 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -159,7 +159,7 @@ SUBSYSTEM_DEF(timer) if (timer.timeToRun < head_offset) bucket_resolution = null //force bucket recreation - CRASH("[i] Invalid timer state: Timer in long run queue with a time to run less then head_offset. [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]") + stack_trace("[i] Invalid timer state: Timer in long run queue with a time to run less then head_offset. [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]") if (timer.callBack && !timer.spent) timer.callBack.InvokeAsync() @@ -171,7 +171,7 @@ SUBSYSTEM_DEF(timer) if (timer.timeToRun < head_offset + TICKS2DS(practical_offset-1)) bucket_resolution = null //force bucket recreation - CRASH("[i] Invalid timer state: Timer in long run queue that would require a backtrack to transfer to short run queue. [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]") + stack_trace("[i] Invalid timer state: Timer in long run queue that would require a backtrack to transfer to short run queue. [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]") if (timer.callBack && !timer.spent) timer.callBack.InvokeAsync() spent += timer diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm index 1be52163537..372177774df 100644 --- a/code/controllers/subsystem/traumas.dm +++ b/code/controllers/subsystem/traumas.dm @@ -13,8 +13,8 @@ SUBSYSTEM_DEF(traumas) /datum/controller/subsystem/traumas/Initialize() //phobia types is to pull from randomly for brain traumas, e.g. conspiracies is for special assignment only phobia_types = sortList(list("spiders", "space", "security", "clowns", "greytide", "lizards", - "skeletons", "snakes", "robots", "doctors", "authority", "the supernatural", - "aliens", "strangers", "birds", "falling", "anime")) + "skeletons", "snakes", "doctors", "authority", "the supernatural", + "strangers", "birds", "falling", "anime")) phobia_words = list("spiders" = strings(PHOBIA_FILE, "spiders"), "space" = strings(PHOBIA_FILE, "space"), @@ -24,11 +24,9 @@ SUBSYSTEM_DEF(traumas) "lizards" = strings(PHOBIA_FILE, "lizards"), "skeletons" = strings(PHOBIA_FILE, "skeletons"), "snakes" = strings(PHOBIA_FILE, "snakes"), - "robots" = strings(PHOBIA_FILE, "robots"), "doctors" = strings(PHOBIA_FILE, "doctors"), "authority" = strings(PHOBIA_FILE, "authority"), "the supernatural" = strings(PHOBIA_FILE, "the supernatural"), - "aliens" = strings(PHOBIA_FILE, "aliens"), "strangers" = strings(PHOBIA_FILE, "strangers"), "conspiracies" = strings(PHOBIA_FILE, "conspiracies"), "birds" = strings(PHOBIA_FILE, "birds"), @@ -42,14 +40,9 @@ SUBSYSTEM_DEF(traumas) "lizards" = typecacheof(list(/mob/living/simple_animal/hostile/lizard)), "skeletons" = typecacheof(list(/mob/living/simple_animal/hostile/skeleton)), "snakes" = typecacheof(list(/mob/living/simple_animal/hostile/retaliate/poison/snake)), - "robots" = typecacheof(list(/mob/living/silicon/robot, /mob/living/silicon/ai, - /mob/living/simple_animal/drone, /mob/living/simple_animal/bot, /mob/living/simple_animal/hostile/swarmer)), "doctors" = typecacheof(list(/mob/living/simple_animal/bot/medbot)), "the supernatural" = typecacheof(list(/mob/living/simple_animal/hostile/construct, /mob/living/simple_animal/revenant, /mob/living/simple_animal/shade)), - "aliens" = typecacheof(list(/mob/living/carbon/alien, /mob/living/simple_animal/slime)), - "conspiracies" = typecacheof(list(/mob/living/simple_animal/bot/secbot, /mob/living/simple_animal/drone, - /mob/living/simple_animal/pet/penguin)), "birds" = typecacheof(list(/mob/living/simple_animal/parrot, /mob/living/simple_animal/chick, /mob/living/simple_animal/chicken, /mob/living/simple_animal/pet/penguin)), "anime" = typecacheof(list(/mob/living/simple_animal/hostile/guardian)) @@ -78,21 +71,6 @@ SUBSYSTEM_DEF(traumas) "skeletons" = typecacheof(list(/obj/item/organ/tongue/bone, /obj/item/clothing/suit/armor/bone, /obj/item/stack/sheet/bone, /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton, /obj/effect/decal/remains/human)), - "conspiracies" = typecacheof(list(/obj/item/clothing/under/rank/captain, /obj/item/clothing/under/rank/security/head_of_security, - /obj/item/clothing/under/rank/engineering/chief_engineer, /obj/item/clothing/under/rank/medical/chief_medical_officer, - /obj/item/clothing/under/rank/civilian/head_of_personnel, /obj/item/clothing/under/rank/rnd/research_director, - /obj/item/clothing/under/rank/security/head_of_security/grey, /obj/item/clothing/under/rank/security/head_of_security/alt, - /obj/item/clothing/under/rank/rnd/research_director/alt, /obj/item/clothing/under/rank/rnd/research_director/turtleneck, - /obj/item/clothing/under/rank/captain/parade, /obj/item/clothing/under/rank/security/head_of_security/parade, /obj/item/clothing/under/rank/security/head_of_security/parade/female, - /obj/item/clothing/head/helmet/abductor, /obj/item/clothing/suit/armor/abductor/vest, /obj/item/abductor/baton, - /obj/item/storage/belt/military/abductor, /obj/item/gun/energy/alien, /obj/item/abductor/silencer, - /obj/item/abductor/gizmo, /obj/item/clothing/under/rank/centcom/officer, - /obj/item/clothing/suit/space/hardsuit/ert, /obj/item/clothing/suit/space/hardsuit/ert/sec, - /obj/item/clothing/suit/space/hardsuit/ert/engi, /obj/item/clothing/suit/space/hardsuit/ert/med, - /obj/item/clothing/suit/space/hardsuit/deathsquad, /obj/item/clothing/head/helmet/space/hardsuit/deathsquad, - /obj/machinery/door/airlock/centcom)), - "robots" = typecacheof(list(/obj/machinery/computer/upload, /obj/item/aiModule/, /obj/machinery/recharge_station, - /obj/item/aicard, /obj/item/deactivated_swarmer, /obj/effect/mob_spawn/swarmer)), "doctors" = typecacheof(list(/obj/item/clothing/under/rank/medical, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/pill/, /obj/item/reagent_containers/hypospray, @@ -120,16 +98,6 @@ SUBSYSTEM_DEF(traumas) /obj/item/gun/magic/staff, /obj/item/gun/magic/wand, /obj/item/nullrod, /obj/item/clothing/under/rank/civilian/chaplain)), - "aliens" = typecacheof(list(/obj/item/clothing/mask/facehugger, /obj/item/organ/body_egg/alien_embryo, - /obj/structure/alien, /obj/item/toy/toy_xeno, - /obj/item/clothing/suit/armor/abductor, /obj/item/abductor, /obj/item/gun/energy/alien, - /obj/item/abductor/baton, /obj/item/radio/headset/abductor, /obj/item/scalpel/alien, /obj/item/hemostat/alien, - /obj/item/retractor/alien, /obj/item/circular_saw/alien, /obj/item/surgicaldrill/alien, /obj/item/cautery/alien, - /obj/item/clothing/head/helmet/abductor, /obj/structure/bed/abductor, /obj/structure/table_frame/abductor, - /obj/structure/table/abductor, /obj/structure/table/optable/abductor, /obj/structure/closet/abductor, /obj/item/organ/heart/gland, - /obj/machinery/abductor, /obj/item/crowbar/abductor, /obj/item/screwdriver/abductor, /obj/item/weldingtool/abductor, - /obj/item/wirecutters/abductor, /obj/item/wrench/abductor, /obj/item/stack/sheet/mineral/abductor)), - "birds" = typecacheof(list(/obj/item/clothing/mask/gas/plaguedoctor, /obj/item/reagent_containers/food/snacks/cracker, /obj/item/clothing/suit/chickensuit, /obj/item/clothing/head/chicken, /obj/item/clothing/suit/toggle/owlwings, /obj/item/clothing/under/costume/owl, /obj/item/clothing/mask/gas/owl_mask, @@ -144,18 +112,12 @@ SUBSYSTEM_DEF(traumas) phobia_turfs = list("space" = typecacheof(list(/turf/open/space, /turf/open/floor/holofloor/space, /turf/open/floor/fakespace)), "the supernatural" = typecacheof(list(/turf/open/floor/plasteel/cult, /turf/closed/wall/mineral/cult)), - "aliens" = typecacheof(list(/turf/open/floor/plating/abductor, /turf/open/floor/plating/abductor2, - /turf/open/floor/mineral/abductor, /turf/closed/wall/mineral/abductor)), "falling" = typecacheof(list(/turf/open/chasm, /turf/open/floor/fakepit)) ) phobia_species = list("lizards" = typecacheof(list(/datum/species/lizard)), "skeletons" = typecacheof(list(/datum/species/skeleton, /datum/species/plasmaman)), - "conspiracies" = typecacheof(list(/datum/species/abductor, /datum/species/lizard, /datum/species/synth)), - "robots" = typecacheof(list(/datum/species/android)), "the supernatural" = typecacheof(list(/datum/species/golem/runic)), - "aliens" = typecacheof(list(/datum/species/abductor, /datum/species/jelly, /datum/species/pod, - /datum/species/shadow)), "anime" = typecacheof(list(/datum/species/human/felinid)) ) diff --git a/code/controllers/subsystem/treestuff.dm b/code/controllers/subsystem/treestuff.dm index 200cbbe376d..33c52bd7b62 100644 --- a/code/controllers/subsystem/treestuff.dm +++ b/code/controllers/subsystem/treestuff.dm @@ -18,4 +18,4 @@ SUBSYSTEM_DEF(treesetup) var/obj/structure/flora/newtree/T = A T.build_leafs() - initialize_me = list() \ No newline at end of file + initialize_me = list() diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 92e78c4e653..fe8e7f9d81d 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -184,7 +184,7 @@ SUBSYSTEM_DEF(vote) if(H.stat != DEAD) vote_power += 3 if(H.job) - var/list/list_of_powerful = list("Monarch", "Consort", "Prophet", "Steward", "Hand") + var/list/list_of_powerful = list("Monarch", "Consort", "Archpriest", "Guildmaster", "Guild Appraiser", "Hand") if(H.job in list_of_powerful) vote_power += 5 else diff --git a/code/controllers/subsystem/weather.dm b/code/controllers/subsystem/weather.dm index 994368f6f17..f3f957fb805 100644 --- a/code/controllers/subsystem/weather.dm +++ b/code/controllers/subsystem/weather.dm @@ -81,7 +81,6 @@ SUBSYSTEM_DEF(weather) break if (!ispath(weather_datum_type, /datum/weather)) CRASH("run_weather called with invalid weather_datum_type: [weather_datum_type || "null"]") - return if (isnull(z_levels)) z_levels = SSmapping.levels_by_trait(initial(weather_datum_type.target_trait)) @@ -89,7 +88,6 @@ SUBSYSTEM_DEF(weather) z_levels = list(z_levels) else if (!islist(z_levels)) CRASH("run_weather called with invalid z_levels: [z_levels || "null"]") - return var/datum/weather/W = new weather_datum_type(z_levels) W.telegraph() diff --git a/code/datums/action.dm b/code/datums/action.dm index 23f854a8e76..b054ad16fd4 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -566,16 +566,6 @@ return S.can_cast(owner) return FALSE -/datum/action/spell_action/alien - -/datum/action/spell_action/alien/IsAvailable() - if(!target) - return FALSE - var/obj/effect/proc_holder/alien/ab = target - if(owner) - return ab.cost_check(ab.check_turf,owner,1) - return FALSE - //Preset for general and toggled actions diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm index ded162245a4..30bb7b0ec25 100644 --- a/code/datums/brain_damage/phobia.dm +++ b/code/datums/brain_damage/phobia.dm @@ -184,10 +184,6 @@ phobia_type = "the supernatural" random_gain = FALSE -/datum/brain_trauma/mild/phobia/aliens - phobia_type = "aliens" - random_gain = FALSE - /datum/brain_trauma/mild/phobia/strangers phobia_type = "strangers" random_gain = FALSE diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index 2101b4c3196..84c832f92a6 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -224,6 +224,8 @@ else to_chat(owner, span_danger("I feel my heart lurching in my chest...")) owner.adjustOxyLoss(8) + else + return /datum/brain_trauma/severe/discoordination name = "Discoordination" diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm index 2f8dda09517..f2f7abb9f9b 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -152,7 +152,7 @@ to_chat(src, span_warning("I cannot speak, my other self is controlling my body!")) return FALSE -/mob/living/split_personality/emote(act, m_type = null, message = null, intentional = FALSE) +/mob/living/split_personality/emote(act, m_type = null, message = null, intentional = FALSE, forced = FALSE, targetted = FALSE, custom_me = FALSE) return ///////////////BRAINWASHING//////////////////// diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 11807131a2a..8183d567d09 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -53,13 +53,13 @@ /** * Properly removes the component from `parent` and cleans up references * Setting `force` makes it not check for and remove the component from the parent - * Setting `silent` deletes the component without sending a `COMSIG_COMPONENT_REMOVING` signal */ -/datum/component/Destroy(force=FALSE, silent=FALSE) - if(!force && parent) +/datum/component/Destroy(force = FALSE) + if(!parent) + return ..() + if(!force) _RemoveFromParent() - if(!silent) - SEND_SIGNAL(parent, COMSIG_COMPONENT_REMOVING, src) + SEND_SIGNAL(parent, COMSIG_COMPONENT_REMOVING, src) parent = null return ..() @@ -68,6 +68,8 @@ */ /datum/component/proc/_JoinParent() var/datum/P = parent + if(!P) + return //lazy init the parent's dc list var/list/dc = P.datum_components if(!dc) @@ -318,16 +320,14 @@ RETURN_TYPE(c_type) if(initial(c_type.dupe_mode) == COMPONENT_DUPE_ALLOWED) stack_trace("GetComponent was called to get a component of which multiple copies could be on an object. This can easily break and should be changed. Type: \[[c_type]\]") - var/list/dc = datum_components - if(!dc) + var/list/all_components = datum_components + if(!all_components) return null - var/datum/component/C = dc[c_type] - if(C) - if(length(C)) - C = C[1] - if(C.type == c_type) - return C - return null + var/datum/component/potential_component + if(length(all_components)) + potential_component = all_components[c_type] + if(potential_component?.type == c_type) + return potential_component /** * Get all components of a given type that are attached to this datum diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm index 9c71aa8438e..425e57fd8cb 100644 --- a/code/datums/components/butchering.dm +++ b/code/datums/components/butchering.dm @@ -19,27 +19,6 @@ butchering_enabled = FALSE if(_can_be_blunt) can_be_blunt = _can_be_blunt - if(isitem(parent)) - RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(onItemAttack)) - -/datum/component/butchering/proc/onItemAttack(obj/item/source, mob/living/M, mob/living/user) - return - if(user.used_intent.type != INTENT_HARM) - return - if(M.stat == DEAD && (M.butcher_results || M.guaranteed_butcher_results)) //can we butcher it? - if(butchering_enabled && (can_be_blunt || source.get_sharpness())) - INVOKE_ASYNC(src, PROC_REF(startButcher), source, M, user) - return COMPONENT_ITEM_NO_ATTACK - - if(ishuman(M) && source.force && source.get_sharpness()) - var/mob/living/carbon/human/H = M - if((H.health <= H.crit_threshold || (user.pulling == H && user.grab_state >= GRAB_NECK) || H.IsSleeping()) && user.zone_selected == BODY_ZONE_HEAD) // Only sleeping, neck grabbed, or crit, can be sliced. - if(H.has_status_effect(/datum/status_effect/neck_slice)) - user.show_message(span_warning("[H]'s neck has already been already cut, you can't make the bleeding any worse!"), MSG_VISUAL, \ - span_warning("Their neck has already been already cut, you can't make the bleeding any worse!")) - return COMPONENT_ITEM_NO_ATTACK - INVOKE_ASYNC(src, PROC_REF(startNeckSlice), source, H, user) - return COMPONENT_ITEM_NO_ATTACK /datum/component/butchering/proc/startButcher(obj/item/source, mob/living/M, mob/living/user) to_chat(user, span_notice("I begin to butcher [M]...")) diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index e890f763c36..90fcb388bea 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -44,25 +44,23 @@ /datum/component/personal_crafting/proc/check_contents(datum/crafting_recipe/R, list/contents) contents = contents["other"] - main_loop: - for(var/A in R.reqs) - var/needed_amount = R.reqs[A] - for(var/B in contents) - if(ispath(B, A)) - if(!R.subtype_reqs && B in subtypesof(A)) - continue - if (R.blacklist.Find(B)) - testing("foundinblacklist") - continue - if(contents[B] >= R.reqs[A]) - continue main_loop - else - testing("removecontent") - needed_amount -= contents[B] - if(needed_amount <= 0) - continue main_loop - else - continue + for(var/A in R.reqs) + var/needed_amount = R.reqs[A] + for(var/B in contents) + if(!ispath(B, A)) + continue + if(!R.subtype_reqs && B != A) + continue + if (R.blacklist.Find(B)) + testing("foundinblacklist") + continue + if(contents[B] >= R.reqs[A]) + break + testing("removecontent") + needed_amount -= contents[B] + if(needed_amount <= 0) + break + if(needed_amount > 0) return FALSE for(var/A in R.chem_catalysts) if(contents[A] < R.chem_catalysts[A]) diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm index 9a0b61b6ee0..d5c8be310d6 100644 --- a/code/datums/components/crafting/recipes.dm +++ b/code/datums/components/crafting/recipes.dm @@ -17,6 +17,7 @@ var/verbage_simple = "craft" var/verbage = "crafts" var/craftsound = 'sound/foley/bandage.ogg' + /// Whether or not subtypes of paths in reqs are acceptable. var/subtype_reqs = FALSE var/structurecraft = null var/buildsame = FALSE //allows palisades to be built on top of each other just not the same dir diff --git a/code/datums/components/infusions.dm b/code/datums/components/infusions.dm index ed6c8f7df73..f6a235a7ef2 100644 --- a/code/datums/components/infusions.dm +++ b/code/datums/components/infusions.dm @@ -624,7 +624,7 @@ /datum/reagent/consumable/lemonade, //lemonade: /datum/reagent/consumable/mayonnaise, // mayonaise (maybe change to just egg yolk) /datum/reagent/fuel/oil, //oil - /datum/reagent/berrypoison, //basic poison + /datum/reagent/toxin/berrypoison, //basic poison /datum/reagent/toxin/acid/fluacid //acid ) var/reagent_change = input("Choose Contents", "Available Liquids") as anything in options @@ -650,7 +650,7 @@ fill_per_minute = 7.5 if(/datum/reagent/fuel/oil) fill_per_minute = 3.25 - if(/datum/reagent/berrypoison) + if(/datum/reagent/toxin/berrypoison) fill_per_minute = 3.25 if(/datum/reagent/toxin/acid/fluacid) fill_per_minute = 1 diff --git a/code/datums/components/leaning.dm b/code/datums/components/leaning.dm index 58b1bf65f77..37c79aedae4 100644 --- a/code/datums/components/leaning.dm +++ b/code/datums/components/leaning.dm @@ -3,7 +3,7 @@ var/atom/leaning_on var/dir2wall -/datum/component/leaning/Initialize(var/atom/atom_to_lean_on) +/datum/component/leaning/Initialize(atom/atom_to_lean_on) if(!istype(parent, /mob/living)) return COMPONENT_INCOMPATIBLE leaning_on = atom_to_lean_on @@ -31,7 +31,7 @@ RegisterSignal(leaning_on, COMSIG_DOOR_OPEN, PROC_REF(collapse)) RegisterSignal(leaning_on, COMSIG_PARENT_QDELETING, PROC_REF(collapse)) - + . = ..() /datum/component/leaning/RemoveComponent() @@ -46,14 +46,14 @@ UnregisterSignal(parent, COMSIG_MOB_CMODE_ENABLED, PROC_REF(RemoveComponent)) UnregisterSignal(parent, COMSIG_LIVING_MOBILITY_UPDATED, PROC_REF(mobility_check)) . = ..() - + /datum/component/leaning/proc/wallhug_check(turf/T, atom/newloc, direct) var/atom/new_leaning_on = get_leanable(get_turf(newloc)) if(!MLparent.fixedeye) RemoveComponent() return - if(!new_leaning_on?.density) + if(!new_leaning_on?.density) RemoveComponent() return if(!leaning_on.Adjacent(new_leaning_on)) diff --git a/code/datums/components/pact_weapon.dm b/code/datums/components/pact_weapon.dm index 46cdf6d0ef0..04c81842b1b 100644 --- a/code/datums/components/pact_weapon.dm +++ b/code/datums/components/pact_weapon.dm @@ -27,7 +27,7 @@ weapon.wdefense *= 1.2 weapon.max_blade_int *= 1.2 weapon.blade_int = weapon.max_blade_int - weapon.max_integrity *= 1.2 + weapon.max_integrity *= 2 weapon.obj_integrity = weapon.max_integrity weapon.minstr = 1 ADD_TRAIT(weapon, TRAIT_NOEMBED, TRAIT_GENERIC) @@ -39,7 +39,7 @@ if(istype(parent, /obj/item/rogueweapon)) RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND_RIGHT, PROC_REF(attack_right)) RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(equipped)) - RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(dropped)) + // RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(dropped)) /datum/component/pact_weapon/proc/attack_right(obj/item/source, mob/user) var/mob/living/target = user @@ -62,10 +62,10 @@ /datum/component/pact_weapon/proc/equipped(obj/item/source, mob/user, slot) var/mob/living/target = user if(target != weapon_owner) //you dont own the weapon - to_chat(weapon_owner, span_warning("[target] has equipped [weapon]!")) //message the rightful owner - to_chat(target, span_warning("[weapon] burns you as you equip it!")) //message the wielder - target.apply_status_effect(/datum/status_effect/buff/pact_weapon_debuff) //apply debuff to wielder - + to_chat(weapon_owner, span_warning("[target] tried to equip [weapon]!")) //message the rightful owner + to_chat(target, span_danger("[weapon] slips from your grasp!")) //message the wielder + target.dropItemToGround(source) //this is not yours, drop it +/* /datum/component/pact_weapon/proc/dropped(obj/item/source, mob/user) var/mob/living/target = user if(target != weapon_owner) //you dont own the weapon @@ -88,3 +88,4 @@ name = "Cursed Item" desc = "An item I have equipped burns me periodically." icon_state = "debuff" +*/ diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm index 1680f7f1fe3..ba223e26c8a 100644 --- a/code/datums/components/riding.dm +++ b/code/datums/components/riding.dm @@ -353,7 +353,6 @@ for(var/obj/item/riding_offhand/O in user.contents) if(O.parent != AM) CRASH("RIDING OFFHAND ON WRONG MOB") - continue if(O.selfdeleting) continue else diff --git a/code/datums/components/rotting.dm b/code/datums/components/rotting.dm index 176656d8d5e..989da3ecc40 100644 --- a/code/datums/components/rotting.dm +++ b/code/datums/components/rotting.dm @@ -16,6 +16,7 @@ START_PROCESSING(SSroguerot, src) /datum/component/rot/Destroy() + STOP_PROCESSING(SSroguerot, src) if(soundloop) soundloop.stop() . = ..() @@ -84,9 +85,8 @@ if(dustme) //stonehedge mob decomposition C.visible_message(span_smallgreen("[C] decomposes...")) - var/datum/reagents/R = new/datum/reagents(20) - R.my_atom = src - R.add_reagent(/datum/pollutant/rot, 20) + var/datum/reagents/R = new/datum/reagents(5) + R.add_reagent(/datum/reagent/toxin/organpoison, 5) var/datum/effect_system/smoke_spread/chem/smoke = new smoke.set_up(R, 2, get_turf(C), FALSE) smoke.start() @@ -129,10 +129,12 @@ T.add_pollutants(/datum/pollutant/rot, 5) if(amount > 20 MINUTES) //stonehedge simple mob decomposition - L.visible_message(span_smallgreen("[L] decomposes..!")) - var/datum/reagents/R = new/datum/reagents(20) - R.my_atom = src - R.add_reagent(/datum/pollutant/rot, 20) + L.visible_message(span_smallgreen("[L] decomposes...")) + var/datum/reagents/R = new/datum/reagents(5) + R.add_reagent(/datum/reagent/toxin/organpoison, 5) + var/datum/effect_system/smoke_spread/chem/smoke = new + smoke.set_up(R, 2, get_turf(L), FALSE) + smoke.start() //stonehedge simple mob decomposition end qdel(src) return L.dust(drop_items=TRUE) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index a534891cd28..c6086e4ab89 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -153,17 +153,6 @@ /datum/component/storage/proc/update_actions() QDEL_NULL(modeswitch_action) - return - if(!isitem(parent) || !allow_quick_gather) - return - var/obj/item/I = parent - modeswitch_action = new(I) - RegisterSignal(modeswitch_action, COMSIG_ACTION_TRIGGER, PROC_REF(action_trigger)) - if(I.obj_flags & IN_INVENTORY) - var/mob/M = I.loc - if(!istype(M)) - return - modeswitch_action.Grant(M) /datum/component/storage/proc/change_master(datum/component/storage/concrete/new_master) if(new_master == src || (!isnull(new_master) && !istype(new_master))) @@ -319,8 +308,8 @@ // if(I.loc != real_location) // continue remove_from_storage(I, target) - I.pixel_x = initial(I.pixel_x) += rand(-10,10) - I.pixel_y = initial(I.pixel_y) += rand(-10,10) + I.pixel_x = initial(I.pixel_x) + rand(-10,10) + I.pixel_y = initial(I.pixel_y) + rand(-10,10) // if(trigger_on_found && I.on_found()) // return FALSE @@ -332,8 +321,8 @@ testing("debugbag5 [I]") continue remove_from_storage(I, target) - I.pixel_x = initial(I.pixel_x) += rand(-10,10) - I.pixel_y = initial(I.pixel_y) += rand(-10,10) + I.pixel_x = initial(I.pixel_x) + rand(-10,10) + I.pixel_y = initial(I.pixel_y) + rand(-10,10) if(trigger_on_found && I.on_found()) testing("debugbag6 [I]") return FALSE diff --git a/code/datums/components/wet_floor.dm b/code/datums/components/wet_floor.dm index 857b3d17aee..48834822530 100644 --- a/code/datums/components/wet_floor.dm +++ b/code/datums/components/wet_floor.dm @@ -19,7 +19,6 @@ var/datum/component/wet_floor/WF = newcomp //Lets make an assumption if(WF.gc()) //See if it's even valid, still. Also does LAZYLEN and stuff for us. CRASH("Wet floor component tried to inherit another, but the other was able to garbage collect while being inherited! What a waste of time!") - return for(var/i in WF.time_left_list) add_wet(text2num(i), WF.time_left_list[i]) diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 833b4c2ba15..768beec4be6 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -106,10 +106,10 @@ if(length(all_components)) for(var/I in all_components) var/datum/component/C = I - qdel(C, FALSE, TRUE) + qdel(C, FALSE) else var/datum/component/C = all_components - qdel(C, FALSE, TRUE) + qdel(C, FALSE) dc.Cut() var/list/lookup = comp_lookup @@ -195,11 +195,9 @@ if(!islist(jsonlist)) if(!istext(jsonlist)) CRASH("Invalid JSON") - return jsonlist = json_decode(jsonlist) if(!islist(jsonlist)) CRASH("Invalid JSON") - return if(!jsonlist["DATUM_TYPE"]) return if(!ispath(jsonlist["DATUM_TYPE"])) diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index d5434701e46..5c15c6e1393 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -30,7 +30,7 @@ return switch(stage) - if(2 || 3) //Pretend to be a cold and give time to spread. + if(2, 3) //Pretend to be a cold and give time to spread. if(prob(8)) affected_mob.emote("sneeze") if(prob(8)) diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 65ef9e25334..4ba3efbb86d 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -5,7 +5,7 @@ spread_flags = DISEASE_SPREAD_SPECIAL cure_text = "A coder's love (theoretical)." agent = "Shenanigans" - viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey, /mob/living/carbon/alien) + viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) severity = DISEASE_SEVERITY_BIOHAZARD stage_prob = 10 visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC @@ -184,37 +184,6 @@ if (prob(20)) affected_mob.say(pick("beep, beep!", "Boop bop boop beep.", "kkkiiiill mmme", "I wwwaaannntt tttoo dddiiieeee..."), forced = "robotic transformation") - -/datum/disease/transformation/xeno - - name = "Xenomorph Transformation" - cure_text = "Spaceacillin & Glycerol" - cures = list(/datum/reagent/medicine/spaceacillin, /datum/reagent/glycerol) - cure_chance = 5 - agent = "Rip-LEY Alien Microbes" - desc = "" - severity = DISEASE_SEVERITY_BIOHAZARD - visibility_flags = 0 - stage1 = list() - stage2 = list("Your throat feels scratchy.", span_danger("Kill...")) - stage3 = list(span_danger("My throat feels very scratchy."), "Your skin feels tight.", span_danger("I can feel something move...inside.")) - stage4 = list(span_danger("My skin feels very tight."), span_danger("My blood boils!"), span_danger("I can feel... something...inside you.")) - stage5 = list(span_danger("My skin feels as if it's about to burst off!")) - new_form = /mob/living/carbon/alien/humanoid/hunter - bantype = ROLE_ALIEN - -/datum/disease/transformation/xeno/stage_act() - ..() - switch(stage) - if(3) - if (prob(4)) - to_chat(affected_mob, span_danger("I feel a stabbing pain in my head.")) - affected_mob.Unconscious(40) - if(4) - if (prob(20)) - affected_mob.say(pick("You look delicious.", "Going to... devour you...", "Hsssshhhhh!"), forced = "xenomorph transformation") - - /datum/disease/transformation/slime name = "Advanced Mutation Transformation" cure_text = "frost oil" @@ -268,25 +237,6 @@ if(4) if (prob(20)) affected_mob.say(pick("Bark!", "AUUUUUU"), forced = "corgi transformation") - -/datum/disease/transformation/morph - name = "Gluttony's Blessing" - cure_text = /datum/reagent/consumable/nothing - cures = list(/datum/reagent/medicine/adminordrazine) - agent = "Gluttony's Blessing" - desc = "" - stage_prob = 20 - severity = DISEASE_SEVERITY_BIOHAZARD - visibility_flags = 0 - stage1 = list("Your stomach rumbles.") - stage2 = list("Your skin feels saggy.") - stage3 = list(span_danger("My appendages are melting away."), span_danger("My limbs begin to lose their shape.")) - stage4 = list(span_danger("You're ravenous.")) - stage5 = list(span_danger("I have become a morph.")) - new_form = /mob/living/simple_animal/hostile/morph - infectable_biotypes = MOB_ORGANIC|MOB_MINERAL|MOB_UNDEAD //magic! - transformed_antag_datum = /datum/antagonist/morph - /datum/disease/transformation/gondola name = "Gondola Transformation" cure_text = "Condensed Capsaicin, ingested or injected." //getting pepper sprayed doesn't help diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 30bc0b474b5..d8ab6a4e25b 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -310,7 +310,6 @@ update_body_parts(TRUE) update_mutations_overlay()// no lizard with human hulk overlay please. - /mob/proc/has_dna() return diff --git a/code/datums/ductnet.dm b/code/datums/ductnet.dm index cb5a833add6..252db420786 100644 --- a/code/datums/ductnet.dm +++ b/code/datums/ductnet.dm @@ -7,7 +7,7 @@ var/capacity ///Add a duct to our network /datum/ductnet/proc/add_duct(obj/machinery/duct/D) - if(!D || D in ducts) + if(!D || (D in ducts)) return ducts += D D.duct = src diff --git a/code/datums/elements/digitalcamo.dm b/code/datums/elements/digitalcamo.dm index 198e523de3c..504a0342f87 100644 --- a/code/datums/elements/digitalcamo.dm +++ b/code/datums/elements/digitalcamo.dm @@ -8,7 +8,7 @@ /datum/element/digitalcamo/Attach(datum/target) . = ..() - if(!isliving(target) || target in attached_mobs) + if(!isliving(target) || (target in attached_mobs)) return ELEMENT_INCOMPATIBLE RegisterSignal(target, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine)) RegisterSignal(target, COMSIG_LIVING_CAN_TRACK, PROC_REF(can_track)) diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index 2a3dc658e4e..6d77c20cfc5 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -6,8 +6,6 @@ var/key_third_person = "" //This will also call the emote var/message = "" //Message displayed when emote is used var/message_mime = "" //Message displayed if the user is a mime - var/message_alien = "" //Message displayed if the user is a grown alien - var/message_larva = "" //Message displayed if the user is an alien larva var/message_robot = "" //Message displayed if the user is a robot var/message_AI = "" //Message displayed if the user is an AI var/message_monkey = "" //Message displayed if the user is a monkey @@ -196,10 +194,6 @@ return "makes a [pick("strong ", "weak ", "")]noise." if(user.mind && user.mind.miming && message_mime) . = message_mime - if(isalienadult(user) && message_alien) - . = message_alien - else if(islarva(user) && message_larva) - . = message_larva else if(iscyborg(user) && message_robot) . = message_robot else if(isAI(user) && message_AI) diff --git a/code/datums/gods/_patron.dm b/code/datums/gods/_patron.dm index f73b9b39d35..da070e5c703 100644 --- a/code/datums/gods/_patron.dm +++ b/code/datums/gods/_patron.dm @@ -1,5 +1,5 @@ #define CLERIC_SPELLS "Priest" -#define PRIEST_SPELLS "Prophet" +#define PRIEST_SPELLS "Archpriest" GLOBAL_LIST_EMPTY(patronlist) GLOBAL_LIST_EMPTY(patrons_by_faith) diff --git a/code/datums/gods/patrons/curses.dm b/code/datums/gods/patrons/curses.dm index f846056be93..625c1eae001 100644 --- a/code/datums/gods/patrons/curses.dm +++ b/code/datums/gods/patrons/curses.dm @@ -56,13 +56,9 @@ for(var/datum/curse/curse in curses) if(curse.name == C.name) - if(!silent) - curse.on_loss(src) - else - curse.on_loss(src, TRUE) + curse.on_loss(src, silent) curses -= curse return TRUE - break return FALSE diff --git a/code/datums/gods/patrons/divine_pantheon.dm b/code/datums/gods/patrons/divine_pantheon.dm index 4b4434f6f4a..8533a642cde 100644 --- a/code/datums/gods/patrons/divine_pantheon.dm +++ b/code/datums/gods/patrons/divine_pantheon.dm @@ -151,6 +151,7 @@ t1 = /obj/effect/proc_holder/spell/invoked/bud t2 = /obj/effect/proc_holder/spell/invoked/eoracurse t3 = /obj/effect/proc_holder/spell/invoked/enrapture + t4 = /obj/effect/proc_holder/spell/invoked/torsion confess_lines = list( "VIIRITRI BRINGS US TOGETHER!", "HER BEAUTY IS EVEN IN THIS TORMENT!", diff --git a/code/datums/gods/patrons/inhumen_pantheon.dm b/code/datums/gods/patrons/inhumen_pantheon.dm index 4a9f9305add..d74410701db 100644 --- a/code/datums/gods/patrons/inhumen_pantheon.dm +++ b/code/datums/gods/patrons/inhumen_pantheon.dm @@ -15,9 +15,9 @@ worshippers = "Power-Hungry, Powerful, Charismatic, Liers." mob_traits = list(TRAIT_NASTY_EATER, TRAIT_SNEK, TRAIT_ZOMBIE_IMMUNE) //had to add zombie immune so as not to double dip when making the infection immune t0 = /obj/effect/proc_holder/spell/invoked/lesser_heal_inhumen - t1 = /obj/effect/proc_holder/spell/invoked/invisibility - t2 = /obj/effect/proc_holder/spell/targeted/soulspeak - t3 = /obj/effect/proc_holder/spell/invoked/projectile/sickness + t1 = /obj/effect/proc_holder/spell/invoked/eldritchhealing/any + t2 = /obj/effect/proc_holder/spell/invoked/raise_undead + t3 = /obj/effect/proc_holder/spell/invoked/strengthen_undead //wrong spell t4 = /obj/effect/proc_holder/spell/invoked/revive_inhumen confess_lines = list( "Praisssse the Greatssssnake!!", @@ -30,7 +30,7 @@ domain = "God of Twilight and Change. Magic. Transformation. Dusk/Dawn. Crisis/Resolution." desc = "Jayx is known as the Herald of change, often depicted as a two-tailed comet or Phoenix. The Divine Phoenix represents the immortal cycle of growth and advancement, often a god of both magic and art; they are known more than anything as the passage of time itself and bright blue magical fire. (Mana)" worshippers = "Mages, Alchemists, Soul-Searchers, Fateweavers, Supernatural Creatures, Soothsayers." - mob_traits = list(TRAIT_ANTISCRYING) + mob_traits = list(TRAIT_ANTISCRYING, TRAIT_USEMAGICITEM) t0 = /obj/effect/proc_holder/spell/invoked/lesser_heal_inhumen confess_lines = list( "THE PHOENIX BURNS BRIGHT AND PURE!", @@ -48,6 +48,7 @@ t1 = /obj/effect/proc_holder/spell/invoked/Joy_takes_flight t2 = /obj/effect/proc_holder/spell/invoked/Laughing_god t3 = /obj/effect/proc_holder/spell/invoked/Smokebomb + t4 = /obj/effect/proc_holder/spell/invoked/revive_inhumen/thief confess_lines = list( "I TAKE WITH SKILLED AND NIMBLE HANDS!", "THIEFLORD'S GIFT CONSUME YOU!", @@ -55,17 +56,17 @@ ) /datum/patron/inhumen/baotha - name = "The Sacrifice" - domain = "Void, Loss, Absence, Nihility." - desc = "The Sacrifice wishes to take from you, and for you to give it willingly. You will never get it back if you go too far. But you will always have the sacrifice." - worshippers = "Nihilists, Gamblers, Warlocks, and Villains." - mob_traits = list(TRAIT_CRACKHEAD) - t0 = /obj/effect/proc_holder/spell/invoked/lesser_heal_inhumen - confess_lines = list( - "I do not yearn for anything!!", - "I CANNOT LOSE WHAT I COULD NEVER HOPE TO HOLD!", - "THERE IS NO LOSS, THERE IS NO LIE! THERE IS ONLY SACRIFICE!", - "IT'S ALL OBLIVION IN THE END FOR ME!", + name = "The Sacrifice" + domain = "Void, Loss, Absence, Nihility." + desc = "The Sacrifice wishes to take from you, and for you to give it willingly. You will never get it back if you go too far. But you will always have the sacrifice." + worshippers = "Nihilists, Gamblers, Warlocks, and Villains." + mob_traits = list(TRAIT_CRACKHEAD) + t0 = /obj/effect/proc_holder/spell/invoked/lesser_heal_inhumen + confess_lines = list( + "I do not yearn for anything!!", + "I CANNOT LOSE WHAT I COULD NEVER HOPE TO HOLD!", + "THERE IS NO LOSS, THERE IS NO LIE! THERE IS ONLY SACRIFICE!", + "IT'S ALL OBLIVION IN THE END FOR ME!", ) diff --git a/code/datums/hud.dm b/code/datums/hud.dm index a494360b726..38a02f9ad08 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -36,7 +36,7 @@ GLOBAL_LIST_INIT(huds, list( /datum/atom_hud var/list/atom/hudatoms = list() //list of all atoms which display this hud - var/list/mob/hudusers = list() //list with all mobs who can see the hud + var/list/hudusers = list() //list with all mobs who can see the hud var/list/hud_icons = list() //these will be the indexes for the atom's hud_list var/list/next_time_allowed = list() //mobs associated with the next time this hud can be added to them diff --git a/code/datums/keybinding/robot.dm b/code/datums/keybinding/robot.dm index 52784ed07d1..c5151417c3a 100644 --- a/code/datums/keybinding/robot.dm +++ b/code/datums/keybinding/robot.dm @@ -66,4 +66,4 @@ var/mob/living/silicon/robot/R = user.mob R.uneq_active() return TRUE -*/ \ No newline at end of file +*/ diff --git a/code/datums/looping_sounds/_looping_sound.dm b/code/datums/looping_sounds/_looping_sound.dm index 4b6e85e4cd1..036189bd4dd 100644 --- a/code/datums/looping_sounds/_looping_sound.dm +++ b/code/datums/looping_sounds/_looping_sound.dm @@ -166,4 +166,4 @@ stop_sound_channel(SD.channel) client.played_loops -= X X.thingshearing -= src -*/ \ No newline at end of file +*/ diff --git a/code/datums/migrants/migrant_waves/fablefield roles.dm b/code/datums/migrants/migrant_waves/fablefield roles.dm deleted file mode 100644 index 008a8ad0f3e..00000000000 --- a/code/datums/migrants/migrant_waves/fablefield roles.dm +++ /dev/null @@ -1,118 +0,0 @@ -/datum/migrant_role/fablefield/goliard - name = "Fablefield Goliard" - greet_text = "For years you've travelled to Fablefield, honing your craft at the annual grand festival of tales. You are a respected weaver of glorious and valorous stories, with a tongue and wit as sharp as your blade. Of late, you've been obsessed with the isle of Enigma... What fantastical adventures could you embark on here, with your proteges?" - outfit = /datum/outfit/job/roguetown/fablefield/goliard - allowed_sexes = list(MALE, FEMALE) - allowed_races = RACES_ALL_KINDSPLUS - -/datum/outfit/job/roguetown/fablefield/goliard - allowed_patrons = list(/datum/patron/divine/xylix) - -/datum/outfit/job/roguetown/fablefield/goliard/pre_equip(mob/living/carbon/human/H) - ..() - head = /obj/item/clothing/head/roguetown/bardhat - neck = /obj/item/storage/belt/rogue/pouch/coins/mid - shoes = /obj/item/clothing/shoes/roguetown/boots - pants = /obj/item/clothing/under/roguetown/tights/random - shirt = /obj/item/clothing/suit/roguetown/shirt/shortshirt - gloves = /obj/item/clothing/gloves/roguetown/fingerless - belt = /obj/item/storage/belt/rogue/leather - armor = /obj/item/clothing/suit/roguetown/armor/leather/vest - cloak = /obj/item/clothing/cloak/half/red - backl = /obj/item/storage/backpack/rogue/satchel - backr = /obj/item/rogue/instrument/guitar - beltl = /obj/item/rogueweapon/sword/rapier/dec - beltr = /obj/item/rogueweapon/huntingknife/idagger/silver/elvish - backpack_contents = list(/obj/item/book/rogue/tales1, /obj/item/book/rogue/blackmountain, /obj/item/book/rogue/tales3) - if(H.mind) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/music, 6, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 5, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/swimming, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/magic/holy, 2, TRUE) //Futureproofing, does nothing for now. - H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/crafting, 3 , TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/masonry, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/carpentry, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/cooking, 1, TRUE) - H.change_stat("speed", 2) - H.change_stat("perception", 2) - H.change_stat("intelligence", 1) - H.change_stat("endurance", 1) - H.verbs |= /mob/living/carbon/human/proc/ventriloquate - - ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_EMPATH, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_GOODLOVER, TRAIT_GENERIC) - if(isseelie(H)) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/seelie_dust) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/summon_rat) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/strip) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/seelie_kiss) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/projectile/splash) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/roustame) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/projectile/animate_object) - -/datum/migrant_role/fablefield/troubadour - name = "Fablefield Troubadour" - greet_text = "At the last grand festival of tales in Fablefield, you were inspired by a figure who sung of dragons, faeries, gods and heroes. This year, you plan to be the hero of your own story. A talented bard, and good with a blade, you follow your muse with nothing but the highest hopes, although so far Enigma isn't quite what you expected..." - outfit = /datum/outfit/job/roguetown/fablefield/troubadour - allowed_sexes = list(MALE, FEMALE) - allowed_races = RACES_ALL_KINDSPLUS - -/datum/outfit/job/roguetown/fablefield/troubadour - allowed_patrons = list(/datum/patron/divine/xylix) - -/datum/outfit/job/roguetown/fablefield/troubadour/pre_equip(mob/living/carbon/human/H) - ..() - head = /obj/item/clothing/head/roguetown/bardhat - neck = /obj/item/storage/belt/rogue/pouch/coins/poor - shoes = /obj/item/clothing/shoes/roguetown/boots - pants = /obj/item/clothing/under/roguetown/tights/random - shirt = /obj/item/clothing/suit/roguetown/shirt/shortshirt - gloves = /obj/item/clothing/gloves/roguetown/fingerless - belt = /obj/item/storage/belt/rogue/leather - armor = /obj/item/clothing/suit/roguetown/armor/leather/vest - cloak = /obj/item/clothing/cloak/half/orange - backl = /obj/item/storage/backpack/rogue/satchel - backr = /obj/item/rogue/instrument/lute - beltl = /obj/item/rogueweapon/sword/rapier - beltr = /obj/item/rogueweapon/huntingknife/idagger/steel - backpack_contents = list(/obj/item/book/rogue/nitebeast, /obj/item/flashlight/flare/torch/lantern, /obj/item/flint) - if(H.mind) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/music, 5, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/swimming, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/magic/holy, 1, TRUE) //Futureproofing, does nothing for now. - H.mind.adjust_skillrank_up_to(/datum/skill/craft/crafting, 3 , TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/masonry, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/carpentry, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/cooking, 1, TRUE) - H.change_stat("perception", 2) - H.change_stat("speed", 1) - H.change_stat("intelligence", 1) - H.change_stat("endurance", 1) - - ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_EMPATH, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_GOODLOVER, TRAIT_GENERIC) - if(isseelie(H)) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/seelie_dust) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/summon_rat) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/strip) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/seelie_kiss) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/projectile/splash) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/roustame) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/projectile/animate_object) diff --git a/code/datums/migrants/migrant_waves/fablefield wave.dm b/code/datums/migrants/migrant_waves/fablefield wave.dm deleted file mode 100644 index 8e00d0a7381..00000000000 --- a/code/datums/migrants/migrant_waves/fablefield wave.dm +++ /dev/null @@ -1,41 +0,0 @@ -/datum/migrant_wave/fablefield - name = "The Fablefield Troupe" - max_spawns = 1 - weight = 30 - downgrade_wave = /datum/migrant_wave/fablefield_down_one - roles = list( - /datum/migrant_role/fablefield/goliard = 1, - /datum/migrant_role/fablefield/troubadour = 3, - ) - greet_text = "A troupe of troubadours from fair Fablefield, you travel to Rockhill seeking inspiration, drawn at every step seemingly by the whims of Xylix. The people here look like they could do with a good show, give them one they'll remember!" - -/datum/migrant_wave/fablefield_down_one - name = "The Fablefield Troupe" - shared_wave_type = /datum/migrant_wave/fablefield - downgrade_wave = /datum/migrant_wave/fablefield_down_two - can_roll = FALSE - roles = list( - /datum/migrant_role/fablefield/goliard = 1, - /datum/migrant_role/fablefield/troubadour = 2, - ) - greet_text = "A troupe of troubadours from fair Fablefield, you travel to Rockhill seeking inspiration, drawn at every step seemingly by the whims of Xylix. The people here look like they could do with a good show, give them one they'll remember!" - -/datum/migrant_wave/fablefield_down_two - name = "The Fablefield Troupe" - shared_wave_type = /datum/migrant_wave/fablefield - can_roll = FALSE - downgrade_wave = /datum/migrant_wave/fablefield_down_three - roles = list( - /datum/migrant_role/fablefield/goliard = 1, - /datum/migrant_role/fablefield/troubadour = 1, - ) - greet_text = "A troupe of troubadours from fair Fablefield, you travel to Rockhill seeking inspiration, drawn at every step seemingly by the whims of Xylix. The people here look like they could do with a good show, give them one they'll remember!" - -/datum/migrant_wave/fablefield_down_three - name = "The Fablefield Troupe" - shared_wave_type = /datum/migrant_wave/fablefield - can_roll = FALSE - roles = list( - /datum/migrant_role/fablefield/goliard = 1, - ) - greet_text = "A troupe of troubadours from fair Fablefield, you travel to Rockhill seeking inspiration, drawn at every step seemingly by the whims of Xylix. The people here look like they could do with a good show, give them one they'll remember!" diff --git a/code/datums/migrants/migrant_waves/heartfelt roles.dm b/code/datums/migrants/migrant_waves/heartfelt roles.dm deleted file mode 100644 index 0b473b48ff4..00000000000 --- a/code/datums/migrants/migrant_waves/heartfelt roles.dm +++ /dev/null @@ -1,329 +0,0 @@ -/datum/migrant_role/heartfelt/lord - name = "Lord of Heartfelt" - greet_text = "You are the Lord of Heartfelt, ruler of a once-prosperous barony now in ruin. Guided by your Magos, you journey to StoneHedge, seeking aid to restore your domain to its former glory, or perhaps claim a new throne." - outfit = /datum/outfit/job/roguetown/heartfelt/lord - allowed_sexes = list(MALE) - allowed_races = RACES_ALL_KINDSPLUS - grant_lit_torch = TRUE - -/datum/outfit/job/roguetown/heartfelt/lord/pre_equip(mob/living/carbon/human/H) - ..() - shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt - belt = /obj/item/storage/belt/rogue/leather/black - shoes = /obj/item/clothing/shoes/roguetown/nobleboot - pants = /obj/item/clothing/under/roguetown/tights/black - cloak = /obj/item/clothing/cloak/heartfelt - armor = /obj/item/clothing/suit/roguetown/armor/heartfelt/lord - neck = /obj/item/storage/belt/rogue/pouch/coins/rich - beltl = /obj/item/rogueweapon/sword/long/marlin - beltr = /obj/item/rogueweapon/huntingknife - gloves = /obj/item/clothing/gloves/roguetown/leather/black - backl = /obj/item/storage/backpack/rogue/satchel - id = /obj/item/scomstone - if(H.mind) - H.virginity = TRUE - H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/swimming, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/sneaking, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/riding, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/crafting, 3 , TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/masonry, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/carpentry, 3, TRUE) - H.change_stat("strength", 2) - H.change_stat("intelligence", 2) - H.change_stat("endurance", 2) - H.change_stat("speed", 1) - H.change_stat("perception", 2) - H.change_stat("fortune", 5) - - ADD_TRAIT(H, TRAIT_NOBLE, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_NOSEGRAB, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) - -/datum/migrant_role/heartfelt/lady - name = "Lady of Heartfelt" - greet_text = "You are the Lady of Heartfelt, once a respected noblewoman now struggling to survive in a desolate landscape. With your home in ruins, you look to StoneHedge, hoping to find new purpose or refuge amidst the chaos." - outfit = /datum/outfit/job/roguetown/heartfelt/lady - allowed_sexes = list(FEMALE) - allowed_races = RACES_ALL_KINDSPLUS - grant_lit_torch = TRUE - -/datum/outfit/job/roguetown/heartfelt/lady/pre_equip(mob/living/carbon/human/H) - ..() - head = /obj/item/clothing/head/roguetown/hennin - neck = /obj/item/storage/belt/rogue/pouch/coins/rich - cloak = /obj/item/clothing/cloak/heartfelt - if(isdwarf(H)) - armor = /obj/item/clothing/suit/roguetown/shirt/dress - else - if(prob(66)) - armor = /obj/item/clothing/suit/roguetown/armor/armordress/alt - else - armor = /obj/item/clothing/suit/roguetown/armor/armordress - belt = /obj/item/storage/belt/rogue/leather/cloth/lady - beltl = /obj/item/flashlight/flare/torch/lantern - beltr = /obj/item/rogueweapon/huntingknife/idagger/silver/elvish - id = /obj/item/clothing/ring/silver - shoes = /obj/item/clothing/shoes/roguetown/shortboots - if(H.mind) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/stealing, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/sneaking, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/swimming, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/crafting, 3 , TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/masonry, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/carpentry, 3, TRUE) - H.change_stat("intelligence", 3) - H.change_stat("endurance", 3) - H.change_stat("speed", 2) - H.change_stat("perception", 2) - H.change_stat("fortune", 5) - ADD_TRAIT(H, TRAIT_SEEPRICES, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_NOBLE, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_NUTCRACKER, TRAIT_GENERIC) - -/datum/migrant_role/heartfelt/hand - name = "Hand of Heartfelt" - greet_text = "You are the Hand of Heartfelt, burdened by the perception of failure in protecting your Lord's domain. Despite doubts from others, your loyalty remains steadfast as you journey to StoneHedge, determined to fulfill your duties." - outfit = /datum/outfit/job/roguetown/heartfelt/hand - allowed_races = RACES_ALL_KINDSPLUS - grant_lit_torch = TRUE - -/datum/outfit/job/roguetown/heartfelt/hand/pre_equip(mob/living/carbon/human/H) - ..() - shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt - belt = /obj/item/storage/belt/rogue/leather/black - shoes = /obj/item/clothing/shoes/roguetown/nobleboot - pants = /obj/item/clothing/under/roguetown/tights/black - armor = /obj/item/clothing/suit/roguetown/armor/heartfelt/hand - neck = /obj/item/storage/belt/rogue/pouch/coins/rich - gloves =/obj/item/clothing/gloves/roguetown/angle - beltl = /obj/item/rogueweapon/sword/sabre/dec - beltr = /obj/item/rogueweapon/huntingknife - backr = /obj/item/storage/backpack/rogue/satchel/heartfelt - mask = /obj/item/clothing/mask/rogue/spectacles/golden - id = /obj/item/scomstone - if(H.mind) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/cooking, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/swimming, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/riding, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/crafting, 3 , TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/masonry, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/carpentry, 3, TRUE) - H.change_stat("strength", 2) - H.change_stat("perception", 3) - H.change_stat("intelligence", 3) - - ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_SEEPRICES, TRAIT_GENERIC) - -/datum/migrant_role/heartfelt/knight - name = "Knight of Heartfelt" - greet_text = "You are a Knight of Heartfelt, once part of a brotherhood in service to your Lord. Now, alone and committed to safeguarding what remains of your court, you ride to StoneHedge, resolved to ensure their safe arrival." - outfit = /datum/outfit/job/roguetown/heartfelt/knight - allowed_races = RACES_ALL_KINDSPLUS - grant_lit_torch = TRUE - -/datum/outfit/job/roguetown/heartfelt/knight/pre_equip(mob/living/carbon/human/H) - ..() - head = /obj/item/clothing/head/roguetown/helmet/heavy/knight - gloves = /obj/item/clothing/gloves/roguetown/plate - pants = /obj/item/clothing/under/roguetown/platelegs - cloak = /obj/item/clothing/cloak/tabard/knight/guard - neck = /obj/item/clothing/neck/roguetown/bervor - shirt = /obj/item/clothing/suit/roguetown/armor/chainmail - armor = /obj/item/clothing/suit/roguetown/armor/plate/full - shoes = /obj/item/clothing/shoes/roguetown/boots/armor - beltr = /obj/item/rogueweapon/sword/long - beltl = /obj/item/flashlight/flare/torch/lantern - belt = /obj/item/storage/belt/rogue/leather/hand - backr = /obj/item/storage/backpack/rogue/satchel/black - if(prob(50)) - r_hand = /obj/item/rogueweapon/eaglebeak/lucerne - else - r_hand = /obj/item/rogueweapon/mace/goden/steel - if(H.mind) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/whipsflails, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/riding, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/crafting, 3 , TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/masonry, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/carpentry, 3, TRUE) - H.change_stat("strength", 3) - H.change_stat("perception", 1) - H.change_stat("intelligence", 2) - H.change_stat("constitution", 2) - H.change_stat("endurance", 2) - H.change_stat("speed", -1) - H.dna.species.soundpack_m = new /datum/voicepack/male/knight() - - ADD_TRAIT(H, TRAIT_NOBLE, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_NOSEGRAB, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) - -/datum/migrant_role/heartfelt/knight/after_spawn(mob/living/L, mob/M, latejoin = TRUE) - ..() - if(ishuman(L)) - var/mob/living/carbon/human/H = L - if(istype(H.cloak, /obj/item/clothing/cloak/tabard/knight/guard)) - var/obj/item/clothing/S = H.cloak - var/index = findtext(H.real_name, " ") - if(index) - index = copytext(H.real_name, 1,index) - if(!index) - index = H.real_name - S.name = "knight tabard ([index])" - var/prev_real_name = H.real_name - var/prev_name = H.name - var/honorary = "Sir" - if(H.gender == FEMALE) - honorary = "Dame" - H.real_name = "[honorary] [prev_real_name]" - H.name = "[honorary] [prev_name]" - -/datum/migrant_role/heartfelt/magos - name = "Magos of Heartfelt" - greet_text = "You are the Magos of Heartfelt, renowned for your arcane knowledge yet unable to foresee the tragedy that befell your home. Drawn by a guiding star to StoneHedge, you seek answers and perhaps a new purpose in the wake of destruction." - outfit = /datum/outfit/job/roguetown/heartfelt/magos - allowed_races = RACES_ALL_KINDSPLUS - grant_lit_torch = TRUE - -/datum/outfit/job/roguetown/heartfelt/magos - allowed_patrons = list(/datum/patron/divine/noc) - -/datum/outfit/job/roguetown/heartfelt/magos/pre_equip(mob/living/carbon/human/H) - ..() - neck = /obj/item/clothing/neck/roguetown/talkstone - cloak = /obj/item/clothing/cloak/black_cloak - armor = /obj/item/clothing/suit/roguetown/shirt/robe/black - pants = /obj/item/clothing/under/roguetown/tights/random - shoes = /obj/item/clothing/shoes/roguetown/shortboots - belt = /obj/item/storage/belt/rogue/leather/plaquesilver - beltl = /obj/item/flashlight/flare/torch/lantern - id = /obj/item/clothing/ring/gold - r_hand = /obj/item/rogueweapon/woodstaff - backl = /obj/item/storage/backpack/rogue/satchel - backpack_contents = list(/obj/item/slimepotion/lovepotion,/obj/item/reagent_containers/glass/bottle/rogue/poison,/obj/item/reagent_containers/glass/bottle/rogue/healthpot) - ADD_TRAIT(H, TRAIT_SEEPRICES, "[type]") - if(H.mind) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 6, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 6, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 5, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/riding, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/swimming, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/crafting, 3 , TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/masonry, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/carpentry, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/riding, 1, TRUE) - H.change_stat("strength", -1) - H.change_stat("constitution", -1) - H.change_stat("intelligence", 4) - H.mind.adjust_spellpoints(2) - if(H.age == AGE_OLD) - H.change_stat("speed", -1) - H.change_stat("intelligence", 1) - H.change_stat("perception", 1) - H.mind.adjust_spellpoints(1) - if(ishumannorthern(H)) - belt = /obj/item/storage/belt/rogue/leather/plaquegold - cloak = null - head = /obj/item/clothing/head/roguetown/wizhat - armor = /obj/item/clothing/suit/roguetown/shirt/robe/wizard - H.dna.species.soundpack_m = new /datum/voicepack/male/wizard() - var/list/spells = list(/obj/effect/proc_holder/spell/targeted/touch/prestidigitation, /obj/effect/proc_holder/spell/invoked/projectile/fetch, /obj/effect/proc_holder/spell/invoked/projectile/lightningbolt, /obj/effect/proc_holder/spell/invoked/projectile/fireball) - for(var/S in spells) - H.mind.AddSpell(new S) - -/datum/migrant_role/heartfelt/prior - name = "Prior of Heartfelt" - greet_text = "The Prior of Heartfelt, you were destined for ascension within the Church, but fate intervened with the barony's downfall, delaying it indefinitely. Still guided by the blessings of Astrata, you journey to StoneHedge, determined to offer what aid and solace you can." - outfit = /datum/outfit/job/roguetown/heartfelt/prior - allowed_races = RACES_ALL_KINDSPLUS - grant_lit_torch = TRUE - - -/datum/outfit/job/roguetown/heartfelt/prior - allowed_patrons = list(/datum/patron/divine/astrata) - -/datum/outfit/job/roguetown/heartfelt/prior/pre_equip(mob/living/carbon/human/H) - ..() - H.virginity = TRUE - neck = /obj/item/clothing/neck/roguetown/psicross/astrata - shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/priest - pants = /obj/item/clothing/under/roguetown/tights/black - shoes = /obj/item/clothing/shoes/roguetown/shortboots - belt = /obj/item/storage/belt/rogue/leather/rope - beltl = /obj/item/flashlight/flare/torch/lantern - beltr = /obj/item/storage/belt/rogue/pouch/coins/rich - armor = /obj/item/clothing/suit/roguetown/shirt/robe/priest - cloak = /obj/item/clothing/cloak/chasuble - backl = /obj/item/storage/backpack/rogue/satchel - backpack_contents = list( - /obj/item/needle/pestra = 1, - ) - ADD_TRAIT(H, TRAIT_CHOSEN, TRAIT_GENERIC) - if(H.mind) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 6, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/magic/holy, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/crafting, 3 , TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/masonry, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/carpentry, 3, TRUE) - if(H.age == AGE_OLD) - H.mind.adjust_skillrank_up_to(/datum/skill/magic/holy, 1, TRUE) - H.change_stat("strength", -1) - H.change_stat("intelligence", 3) - H.change_stat("constitution", -1) - H.change_stat("endurance", 1) - H.change_stat("speed", -1) - var/datum/devotion/C = new /datum/devotion(H, H.patron) - C.grant_spells_priest(H) - H.verbs += list(/mob/living/carbon/human/proc/devotionreport, /mob/living/carbon/human/proc/clericpray) - - H.verbs += list(/mob/living/carbon/human/proc/magicreport, /mob/living/carbon/human/proc/magiclearn) diff --git a/code/datums/migrants/migrant_waves/heartfelt wave.dm b/code/datums/migrants/migrant_waves/heartfelt wave.dm deleted file mode 100644 index c5e4c0bcd97..00000000000 --- a/code/datums/migrants/migrant_waves/heartfelt wave.dm +++ /dev/null @@ -1,96 +0,0 @@ -/datum/migrant_wave/heartfelt - name = "The Court of Heartfelt" - max_spawns = 1 - shared_wave_type = /datum/migrant_wave/heartfelt - weight = 50 - downgrade_wave = /datum/migrant_wave/heartfelt_down_one - roles = list( - /datum/migrant_role/heartfelt/lord = 1, - /datum/migrant_role/heartfelt/lady = 1, - /datum/migrant_role/heartfelt/hand = 1, - /datum/migrant_role/heartfelt/knight = 1, - /datum/migrant_role/heartfelt/magos = 1, - /datum/migrant_role/heartfelt/prior = 1, - ) - greet_text = "Fleeing disaster, you have come together as a court, united in a final effort to restore the former glory and promise of Heartfelt. Stay close and watch out for each other, for all of your sakes!" - -/datum/migrant_wave/heartfelt_down_one - name = "The Court of Heartfelt" - shared_wave_type = /datum/migrant_wave/heartfelt - can_roll = FALSE - downgrade_wave = /datum/migrant_wave/heartfelt_down_two - roles = list( - /datum/migrant_role/heartfelt/lord = 1, - /datum/migrant_role/heartfelt/lady = 1, - /datum/migrant_role/heartfelt/hand = 1, - /datum/migrant_role/heartfelt/knight = 1, - /datum/migrant_role/heartfelt/prior = 1, - ) - greet_text = "Fleeing disaster, you have come together as a court, united in a final effort to restore the former glory and promise of Heartfelt. Stay close and watch out for each other, for all of your sakes! Some of you already did not make it on the way here..." - -/datum/migrant_wave/heartfelt_down_two - name = "The Court of Heartfelt" - shared_wave_type = /datum/migrant_wave/heartfelt - can_roll = FALSE - downgrade_wave = /datum/migrant_wave/heartfelt_down_three - roles = list( - /datum/migrant_role/heartfelt/lord = 1, - /datum/migrant_role/heartfelt/lady = 1, - /datum/migrant_role/heartfelt/hand = 1, - /datum/migrant_role/heartfelt/prior = 1, - ) - greet_text = "Fleeing disaster, you have come together as a court, united in a final effort to restore the former glory and promise of Heartfelt. Stay close and watch out for each other, for all of your sakes! Some of you already did not make it on the way here..." - - -/datum/migrant_wave/heartfelt_down_three - name = "The Court of Heartfelt" - shared_wave_type = /datum/migrant_wave/heartfelt - can_roll = FALSE - downgrade_wave = /datum/migrant_wave/heartfelt_down_four - roles = list( - /datum/migrant_role/heartfelt/lord = 1, - /datum/migrant_role/heartfelt/lady = 1, - /datum/migrant_role/heartfelt/hand = 1, - ) - greet_text = "Fleeing disaster, you have come together as a court, united in a final effort to restore the former glory and promise of Heartfelt. Stay close and watch out for each other, for all of your sakes! Some of you already did not make it on the way here..." - -/datum/migrant_wave/heartfelt_down_four - name = "The Court of Heartfelt" - shared_wave_type = /datum/migrant_wave/heartfelt - can_roll = FALSE - downgrade_wave = /datum/migrant_wave/heartfelt_down_five - roles = list( - /datum/migrant_role/heartfelt/lord = 1, - /datum/migrant_role/heartfelt/lady = 1, - ) - greet_text = "Fleeing disaster, you have come together as a court, united in a final effort to restore the former glory and promise of Heartfelt. Stay close and watch out for each other, for all of your sakes! Some of you already did not make it on the way here..." - -/datum/migrant_wave/heartfelt_down_five - name = "The Court of Heartfelt" - shared_wave_type = /datum/migrant_wave/heartfelt - can_roll = FALSE - downgrade_wave = /datum/migrant_wave/heartfelt_down_six - roles = list( - /datum/migrant_role/heartfelt/lord = 1, - ) - greet_text = "Fleeing disaster, you have come together as a court, united in a final effort to restore the former glory and promise of Heartfelt. Stay close and watch out for each other, for all of your sakes! Some of you already did not make it on the way here..." - -/datum/migrant_wave/heartfelt_down_six - name = "The Court of Heartfelt" - shared_wave_type = /datum/migrant_wave/heartfelt - can_roll = FALSE - downgrade_wave = /datum/migrant_wave/heartfelt_down_seven - roles = list( - /datum/migrant_role/heartfelt/lady = 1, - ) - greet_text = "Fleeing disaster, you have come together as a court, united in a final effort to restore the former glory and promise of Heartfelt. Stay close and watch out for each other, for all of your sakes! Some of you already did not make it on the way here..." - -/datum/migrant_wave/heartfelt_down_seven - name = "The Court of Heartfelt" - shared_wave_type = /datum/migrant_wave/heartfelt - can_roll = FALSE - roles = list( - /datum/migrant_role/heartfelt/knight = 1, - /datum/migrant_role/heartfelt/magos = 1, - ) - greet_text = "Fleeing disaster, you have come together as a court, united in a final effort to restore the former glory and promise of Heartfelt. Stay close and watch out for each other, for all of your sakes! Some of you already did not make it on the way here..." diff --git a/code/datums/mind.dm b/code/datums/mind.dm index a2780efbe71..ae31186a688 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -222,6 +222,7 @@ popup.open() /datum/mind/proc/get_language_holder() + RETURN_TYPE(/datum/language_holder) if(!language_holder) var/datum/language_holder/L = current.get_language_holder(shadow=FALSE) language_holder = L.copy(src) @@ -484,6 +485,7 @@ A.on_removal() /datum/mind/proc/has_antag_datum(datum_type, check_subtypes = TRUE) + RETURN_TYPE(datum_type) if(!datum_type) return . = FALSE diff --git a/code/datums/mutations/_mutations.dm b/code/datums/mutations/_mutations.dm index 787841cb89b..f906815a93f 100644 --- a/code/datums/mutations/_mutations.dm +++ b/code/datums/mutations/_mutations.dm @@ -11,7 +11,7 @@ var/lowest_value = 256 * 8 var/text_gain_indication = "" var/text_lose_indication = "" - var/static/list/mutable_appearance/visual_indicators = list() + var/static/list/list/mutable_appearance/visual_indicators = list() var/obj/effect/proc_holder/spell/power var/layer_used = MUTATIONS_LAYER //which mutation layer to use var/list/species_allowed //to restrict mutation to only certain species diff --git a/code/datums/mutations/actions.dm b/code/datums/mutations/actions.dm index 68c2651b9ec..1887a52d63d 100644 --- a/code/datums/mutations/actions.dm +++ b/code/datums/mutations/actions.dm @@ -128,7 +128,7 @@ deactive_msg = "You swallow the flame." var/strength = 1 -/obj/effect/proc_holder/spell/aimed/firebreath/before_cast(list/targets) +/obj/effect/proc_holder/spell/aimed/firebreath/before_cast(list/targets, recharge = TRUE, mob/user = usr) //if recharge is started is important for the trigger spells . = ..() if(iscarbon(usr)) var/mob/living/carbon/C = usr diff --git a/code/datums/mutations/antenna.dm b/code/datums/mutations/antenna.dm index 0b6d9365871..c6d815d83a3 100644 --- a/code/datums/mutations/antenna.dm +++ b/code/datums/mutations/antenna.dm @@ -15,7 +15,7 @@ icon_state = "walkietalkie" /obj/item/implant/radio/antenna/Initialize(mapload) - ..() + . = ..() radio.name = "internal antenna" /datum/mutation/human/antenna/on_acquiring(mob/living/carbon/human/owner) @@ -28,7 +28,7 @@ if(..()) return if(linked_radio) - linked_radio.Destroy() + QDEL_NULL(linked_radio) /datum/mutation/human/antenna/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) ..() diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index c7dee722eb8..1b128d85fd7 100644 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -177,8 +177,8 @@ pre_equip(H, visualsOnly) //Start with uniform,suit,backpack for additional slots - if(uniform) - H.equip_to_slot_or_del(new pants(H),SLOT_PANTS, TRUE) + if(uniform) // this is for legacy/base SS13 outfits, pants are spawned later + H.equip_to_slot_or_del(new uniform(H),SLOT_PANTS, TRUE) if(suit) H.equip_to_slot_or_del(new suit(H),SLOT_ARMOR, TRUE) if(back) diff --git a/code/datums/saymode.dm b/code/datums/saymode.dm index acd198523f3..e3fc0eaf155 100644 --- a/code/datums/saymode.dm +++ b/code/datums/saymode.dm @@ -61,17 +61,6 @@ to_chat(user, span_changeling("Our senses have not evolved enough to be able to communicate this way...")) return FALSE - -/datum/saymode/xeno - key = "a" - mode = MODE_ALIEN - -/datum/saymode/xeno/handle_message(mob/living/user, message, datum/language/language) - if(user.hivecheck()) - user.alien_talk(message) - return FALSE - - /datum/saymode/vocalcords key = MODE_KEY_VOCALCORDS mode = MODE_VOCALCORDS @@ -91,10 +80,6 @@ mode = MODE_BINARY /datum/saymode/binary/handle_message(mob/living/user, message, datum/language/language) - if(isswarmer(user)) - var/mob/living/simple_animal/hostile/swarmer/S = user - S.swarmer_chat(message) - return FALSE if(isblobmonster(user)) var/mob/living/simple_animal/hostile/blob/B = user B.blob_chat(message) diff --git a/code/datums/sexcon/sex_actions/deviant/ear_sex.dm b/code/datums/sexcon/sex_actions/deviant/ear_sex.dm index f3f6b24bf6a..349526d9ae5 100644 --- a/code/datums/sexcon/sex_actions/deviant/ear_sex.dm +++ b/code/datums/sexcon/sex_actions/deviant/ear_sex.dm @@ -50,7 +50,7 @@ user.sexcon.perform_sex_action(user, 2, 0, TRUE) if(user.sexcon.check_active_ejaculation()) user.visible_message(span_love("[user] cums into [target]'s ear!")) - user.sexcon.cum_into(oral = TRUE) //so they just get ingested direct + user.sexcon.cum_into() var/datum/sex_controller/sc = user.sexcon diff --git a/code/datums/sexcon/sex_actions/deviant/tailpegging_anal.dm b/code/datums/sexcon/sex_actions/deviant/tailpegging_anal.dm index 5f1dd3a177e..c141f970dc5 100644 --- a/code/datums/sexcon/sex_actions/deviant/tailpegging_anal.dm +++ b/code/datums/sexcon/sex_actions/deviant/tailpegging_anal.dm @@ -9,9 +9,8 @@ return FALSE if(user == target) return FALSE - if(!user.getorganslot(ORGAN_SLOT_TAIL)) - return FALSE - if(!user.getorganslot(ORGAN_SLOT_TAIL).can_penetrate) + var/obj/item/organ/tail/tail = user.getorganslot(ORGAN_SLOT_TAIL) + if(!tail?.can_penetrate) return FALSE return TRUE @@ -25,9 +24,8 @@ if(pantsies.flags_inv & HIDECROTCH) if(!pantsies.genitalaccess) return FALSE - if(!user.getorganslot(ORGAN_SLOT_TAIL)) - return FALSE - if(!user.getorganslot(ORGAN_SLOT_TAIL).can_penetrate) + var/obj/item/organ/tail/tail = user.getorganslot(ORGAN_SLOT_TAIL) + if(!tail?.can_penetrate) return FALSE return TRUE @@ -39,33 +37,29 @@ var/obj/item/bodypart/BPG = target.get_bodypart(BODY_ZONE_PRECISE_GROIN) var/obj/item/bodypart/BPC = target.get_bodypart(BODY_ZONE_CHEST) if(user.sexcon.force > SEX_FORCE_LOW) - BPC.add_wound(/datum/wound/fracture/chest) - BPG.add_wound(/datum/wound/fracture/groin) - target.apply_damage(15, BRUTE, BPC) - target.apply_damage(15, BRUTE, BPG) + if(prob(20)) + BPC.add_wound(/datum/wound/fracture/chest) + BPG.add_wound(/datum/wound/fracture/groin) + target.apply_damage(5, BRUTE, BPC) + target.apply_damage(5, BRUTE, BPG) else if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Seelie on Humen - user.visible_message(span_warning("[user] tries and fails to insert their tiny tail into [target]'s butt!")) + user.visible_message(span_warning("[user] inserts their tiny tail into [target]'s butt!")) else user.visible_message(span_warning("[user] slides their tail into [target]'s butt!")) playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) /datum/sex_action/tailpegging_anal/on_perform(mob/living/user, mob/living/target) - if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Male seelie trying to fuck normal size humen - user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] tries to fuck [target]'s butt with their tail, unsuccessfully.")) - do_thrust_animate(user, target) - playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) - return FALSE //Return because male seelie cannot succesfully penetrate a large humen target if(user.sexcon.do_message_signature("[type]")) user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] fucks [target]'s butt with their tail.")) - if((HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) - return FALSE + playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) do_thrust_animate(user, target) if(HAS_TRAIT(target, TRAIT_TINY) && !(HAS_TRAIT(user, TRAIT_TINY))) //Scream and body damage - target.apply_damage(10, BRUTE, target.get_bodypart(BODY_ZONE_CHEST)) - target.apply_damage(3, BRUTE, target.get_bodypart(BODY_ZONE_PRECISE_GROIN)) + if(user.sexcon.force > SEX_FORCE_LOW) + target.apply_damage(3, BRUTE, target.get_bodypart(BODY_ZONE_CHEST)) + target.apply_damage(3, BRUTE, target.get_bodypart(BODY_ZONE_PRECISE_GROIN)) if(user.sexcon.considered_limp()) user.sexcon.perform_sex_action(target, 1.2, 4, FALSE) diff --git a/code/datums/sexcon/sex_actions/deviant/tailpegging_vaginal.dm b/code/datums/sexcon/sex_actions/deviant/tailpegging_vaginal.dm index 6d7cb11910a..56aac290aef 100644 --- a/code/datums/sexcon/sex_actions/deviant/tailpegging_vaginal.dm +++ b/code/datums/sexcon/sex_actions/deviant/tailpegging_vaginal.dm @@ -11,9 +11,8 @@ return FALSE if(!target.getorganslot(ORGAN_SLOT_VAGINA)) return FALSE - if(!user.getorganslot(ORGAN_SLOT_TAIL)) - return FALSE - if(!user.getorganslot(ORGAN_SLOT_TAIL).can_penetrate) + var/obj/item/organ/tail/tail = user.getorganslot(ORGAN_SLOT_TAIL) + if(!tail?.can_penetrate) return FALSE return TRUE @@ -25,9 +24,8 @@ if(pantsies.flags_inv & HIDECROTCH) if(!pantsies.genitalaccess) return FALSE - if(!user.getorganslot(ORGAN_SLOT_TAIL)) - return FALSE - if(!user.getorganslot(ORGAN_SLOT_TAIL).can_penetrate) + var/obj/item/organ/tail/tail = user.getorganslot(ORGAN_SLOT_TAIL) + if(!tail?.can_penetrate) return FALSE return TRUE @@ -39,33 +37,29 @@ var/obj/item/bodypart/BPG = target.get_bodypart(BODY_ZONE_PRECISE_GROIN) var/obj/item/bodypart/BPC = target.get_bodypart(BODY_ZONE_CHEST) if(user.sexcon.force > SEX_FORCE_LOW) - BPC.add_wound(/datum/wound/fracture/chest) - BPG.add_wound(/datum/wound/fracture/groin) - target.apply_damage(15, BRUTE, BPC) - target.apply_damage(15, BRUTE, BPG) + if(prob(20)) + BPC.add_wound(/datum/wound/fracture/chest) + BPG.add_wound(/datum/wound/fracture/groin) + target.apply_damage(5, BRUTE, BPC) + target.apply_damage(5, BRUTE, BPG) else if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Seelie on Humen - user.visible_message(span_warning("[user] tries and fails to insert their tiny tail into [target]'s cunt!")) + user.visible_message(span_warning("[user] inserts their tiny tail into [target]'s cunt!")) else user.visible_message(span_warning("[user] slides their tail into [target]'s cunt!")) playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) /datum/sex_action/tailpegging_vaginal/on_perform(mob/living/user, mob/living/target) - if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Male seelie trying to fuck normal size humen - user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] tries to fuck [target]'s cunt with their tail, unsuccessfully.")) - do_thrust_animate(user, target) - playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) - return FALSE //Return because male seelie cannot succesfully penetrate a large humen target if(user.sexcon.do_message_signature("[type]")) user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] fucks [target]'s cunt with their tail.")) - if((HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) - return FALSE + playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) do_thrust_animate(user, target) if(HAS_TRAIT(target, TRAIT_TINY) && !(HAS_TRAIT(user, TRAIT_TINY))) //Scream and body damage - target.apply_damage(10, BRUTE, target.get_bodypart(BODY_ZONE_CHEST)) - target.apply_damage(3, BRUTE, target.get_bodypart(BODY_ZONE_PRECISE_GROIN)) + if(user.sexcon.force > SEX_FORCE_LOW) + target.apply_damage(3, BRUTE, target.get_bodypart(BODY_ZONE_CHEST)) + target.apply_damage(3, BRUTE, target.get_bodypart(BODY_ZONE_PRECISE_GROIN)) if(user.sexcon.considered_limp()) user.sexcon.perform_sex_action(target, 1.2, 4, FALSE) diff --git a/code/datums/sexcon/sex_actions/force/force_cunnilingus.dm b/code/datums/sexcon/sex_actions/force/force_cunnilingus.dm index d30c64f89ba..f3143e0f254 100644 --- a/code/datums/sexcon/sex_actions/force/force_cunnilingus.dm +++ b/code/datums/sexcon/sex_actions/force/force_cunnilingus.dm @@ -44,7 +44,9 @@ do_thrust_animate(target, user) user.sexcon.perform_sex_action(user, 2, 4, TRUE) - user.sexcon.handle_passive_ejaculation() + if(user.sexcon.check_active_ejaculation()) + user.visible_message(span_lovebold("[user] ejaculates into [target]'s mouth!")) + user.sexcon.cum_into(girljuice = TRUE) user.sexcon.perform_sex_action(target, 0, 2, FALSE) target.sexcon.handle_passive_ejaculation() diff --git a/code/datums/sexcon/sex_actions/npc/npc_anal_ride_sex.dm b/code/datums/sexcon/sex_actions/npc/npc_anal_ride_sex.dm index 8b52926de1f..15258737321 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_anal_ride_sex.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_anal_ride_sex.dm @@ -41,8 +41,12 @@ /datum/sex_action/npc_anal_ride_sex/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] gets off [target].")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_anal_ride_sex/is_finished(mob/living/user, mob/living/target) if(user.sexcon.finished_check()) diff --git a/code/datums/sexcon/sex_actions/npc/npc_anal_sex.dm b/code/datums/sexcon/sex_actions/npc/npc_anal_sex.dm index 595b5269610..00d266bba04 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_anal_sex.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_anal_sex.dm @@ -2,6 +2,7 @@ name = "NPC Sodomize them" stamina_cost = 0 check_same_tile = FALSE + require_grab = FALSE /datum/sex_action/npc_anal_sex/shows_on_menu(mob/living/user, mob/living/target) return FALSE @@ -37,8 +38,12 @@ /datum/sex_action/npc_anal_sex/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] gets off [target].")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_anal_sex/is_finished(mob/living/user, mob/living/target) if(user.sexcon.finished_check()) diff --git a/code/datums/sexcon/sex_actions/npc/npc_cunnilingus.dm b/code/datums/sexcon/sex_actions/npc/npc_cunnilingus.dm index e8feda385e2..d1c26217587 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_cunnilingus.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_cunnilingus.dm @@ -23,12 +23,16 @@ user.sexcon.perform_sex_action(target, 4, 3, TRUE) if(target.sexcon.check_active_ejaculation()) target.visible_message(span_love("[target] ejaculates into [user]'s mouth!")) - target.sexcon.cum_into(oral = TRUE) + target.sexcon.cum_into(girljuice = TRUE) /datum/sex_action/npc_cunnilingus/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] stops licking [target]'s cunt ...")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_cunnilingus/is_finished(mob/living/user, mob/living/target) diff --git a/code/datums/sexcon/sex_actions/npc/npc_facesitting.dm b/code/datums/sexcon/sex_actions/npc/npc_facesitting.dm index 447fb3b51d6..983772b4827 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_facesitting.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_facesitting.dm @@ -31,8 +31,12 @@ /datum/sex_action/npc_facesitting/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] gets off [target]'s face.")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_facesitting/is_finished(mob/living/user, mob/living/target) if(user.sexcon.finished_check()) diff --git a/code/datums/sexcon/sex_actions/npc/npc_rimming.dm b/code/datums/sexcon/sex_actions/npc/npc_rimming.dm index c1c9371432b..91f7bd2bff0 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_rimming.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_rimming.dm @@ -25,8 +25,12 @@ /datum/sex_action/npc_rimming/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] stops rimming [target]'s butt ...")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_rimming/is_finished(mob/living/user, mob/living/target) diff --git a/code/datums/sexcon/sex_actions/npc/npc_throat_sex.dm b/code/datums/sexcon/sex_actions/npc/npc_throat_sex.dm index 9a51fd862ac..4e18972bd29 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_throat_sex.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_throat_sex.dm @@ -35,8 +35,12 @@ /datum/sex_action/npc_throat_sex/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] pulls their cock out of [target]'s throat.")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_throat_sex/is_finished(mob/living/user, mob/living/target) if(user.sexcon.finished_check()) diff --git a/code/datums/sexcon/sex_actions/npc/npc_vaginal_ride_sex.dm b/code/datums/sexcon/sex_actions/npc/npc_vaginal_ride_sex.dm index 438e2a73b19..b0871c07c71 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_vaginal_ride_sex.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_vaginal_ride_sex.dm @@ -41,8 +41,12 @@ /datum/sex_action/npc_vaginal_ride_sex/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] gets off [target].")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_vaginal_ride_sex/is_finished(mob/living/user, mob/living/target) diff --git a/code/datums/sexcon/sex_actions/npc/npc_vaginal_sex.dm b/code/datums/sexcon/sex_actions/npc/npc_vaginal_sex.dm index 45b266e1940..59350671c0c 100644 --- a/code/datums/sexcon/sex_actions/npc/npc_vaginal_sex.dm +++ b/code/datums/sexcon/sex_actions/npc/npc_vaginal_sex.dm @@ -18,6 +18,8 @@ /datum/sex_action/npc_vaginal_sex/on_perform(mob/living/user, mob/living/target) user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] fucks [target]'s cunt.")) + + playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) do_thrust_animate(user, target) if(user.sexcon.check_active_ejaculation()) @@ -36,8 +38,12 @@ /datum/sex_action/npc_vaginal_sex/on_finish(mob/living/user, mob/living/target) user.visible_message(span_warning("[user] pulls his cock out of [target]'s cunt.")) - var/mob/living/simple_animal/hostile/retaliate/rogue/usermob = user - usermob.stoppedfucking(target) + if(issimple(user)) + var/mob/living/simple_animal/hostile/retaliate/rogue/simpleuser = user + simpleuser.stoppedfucking(target) + else + var/mob/living/carbon/human/humanuser = user + humanuser.stoppedfucking(target) /datum/sex_action/npc_vaginal_sex/is_finished(mob/living/user, mob/living/target) if(user.sexcon.finished_check()) diff --git a/code/datums/sexcon/sex_actions/oral/blowjob.dm b/code/datums/sexcon/sex_actions/oral/blowjob.dm index ccb38727e90..dd0ba16d427 100644 --- a/code/datums/sexcon/sex_actions/oral/blowjob.dm +++ b/code/datums/sexcon/sex_actions/oral/blowjob.dm @@ -60,7 +60,7 @@ target.sexcon.cum_onto() else target.visible_message(span_lovebold("[target] cums into [user]'s mouth!")) - target.sexcon.cum_into() + target.sexcon.cum_into(oral = TRUE) /datum/sex_action/blowjob/on_finish(mob/living/user, mob/living/target) ..() diff --git a/code/datums/sexcon/sex_actions/oral/cunnilingus.dm b/code/datums/sexcon/sex_actions/oral/cunnilingus.dm index 569d33d223a..73292acc3d8 100644 --- a/code/datums/sexcon/sex_actions/oral/cunnilingus.dm +++ b/code/datums/sexcon/sex_actions/oral/cunnilingus.dm @@ -51,7 +51,7 @@ user.sexcon.perform_sex_action(target, 2, 3, TRUE) if(target.sexcon.check_active_ejaculation()) target.visible_message(span_lovebold("[target] ejaculates into [user]'s mouth!")) - target.sexcon.cum_into() + target.sexcon.cum_into(girljuice = TRUE) /datum/sex_action/cunnilingus/on_finish(mob/living/user, mob/living/target) ..() diff --git a/code/datums/sexcon/sex_actions/sex/anal_ride_sex.dm b/code/datums/sexcon/sex_actions/sex/anal_ride_sex.dm index 5500d7d90fb..e3067155c50 100644 --- a/code/datums/sexcon/sex_actions/sex/anal_ride_sex.dm +++ b/code/datums/sexcon/sex_actions/sex/anal_ride_sex.dm @@ -17,8 +17,6 @@ if(issimple(target) && target.gender == MALE && target.sexcon) else return FALSE - if(HAS_TRAIT(user, TRAIT_TINY) && !(HAS_TRAIT(target, TRAIT_TINY))) //Dissabled for Seelie riding non-Seelie - return FALSE return TRUE /datum/sex_action/anal_ride_sex/can_perform(mob/living/user, mob/living/target) @@ -49,22 +47,16 @@ /datum/sex_action/anal_ride_sex/on_start(mob/living/user, mob/living/target) ..() if(HAS_TRAIT(target, TRAIT_TINY) && !(HAS_TRAIT(user, TRAIT_TINY))) - user.visible_message(span_warning("[user] gets on top of [target] trying and failing to ride the tiny cock with their butt!")) + user.visible_message(span_warning("[user] gets on top of [target] and begins riding the tiny cock with their butt!")) else user.visible_message(span_warning("[user] gets on top of [target] and begins riding them with their butt!")) playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) /datum/sex_action/anal_ride_sex/on_perform(mob/living/user, mob/living/target) - if(user.sexcon.do_message_signature("[type]")) - if(HAS_TRAIT(target, TRAIT_TINY) && !(HAS_TRAIT(user, TRAIT_TINY))) - user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] tries to anally ride [target], unsuccessfully.")) - do_thrust_animate(user, target) - return //Return because male seelie cannot succesfully penetrate a large humen target - - if(HAS_TRAIT(user, TRAIT_DEATHBYSNOOSNOO)) - user.sexcon.try_pelvis_crush(target) + if(HAS_TRAIT(user, TRAIT_DEATHBYSNOOSNOO)) + user.sexcon.try_pelvis_crush(target) - user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] anally rides [target].")) + user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] anally rides [target].")) playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) do_thrust_animate(user, target) diff --git a/code/datums/sexcon/sex_actions/sex/anal_sex.dm b/code/datums/sexcon/sex_actions/sex/anal_sex.dm index 5117cb45672..9c525a92699 100644 --- a/code/datums/sexcon/sex_actions/sex/anal_sex.dm +++ b/code/datums/sexcon/sex_actions/sex/anal_sex.dm @@ -53,26 +53,20 @@ var/obj/item/bodypart/BPG = target.get_bodypart(BODY_ZONE_PRECISE_GROIN) var/obj/item/bodypart/BPC = target.get_bodypart(BODY_ZONE_CHEST) if(user.sexcon.force > SEX_FORCE_LOW) - BPC.add_wound(/datum/wound/fracture/chest) - BPG.add_wound(/datum/wound/fracture/groin) - target.apply_damage(15, BRUTE, BPC) - target.apply_damage(15, BRUTE, BPG) + if(prob(20)) + BPC.add_wound(/datum/wound/fracture/chest) + BPG.add_wound(/datum/wound/fracture/groin) + target.apply_damage(5, BRUTE, BPC) + target.apply_damage(5, BRUTE, BPG) else if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Seelie on Humen - user.visible_message(span_warning("[user] tries and fails to insert their tiny cock into [target]'s butt!")) + user.visible_message(span_warning("[user] inserts their tiny cock into [target]'s butt!")) else user.visible_message(span_warning("[user] slides his cock into [target]'s butt!")) playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) /datum/sex_action/anal_sex/on_perform(mob/living/user, mob/living/target) - if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Male seelie trying to fuck normal size humen - user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] tries to fuck [target]'s ass, unsuccessfully.")) - do_thrust_animate(user, target) - playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) - return FALSE //Return because male seelie cannot succesfully penetrate a large humen target if(user.sexcon.do_message_signature("[type]")) user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] fucks [target]'s ass.")) - if((HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) - return FALSE if(HAS_TRAIT(user, TRAIT_DEATHBYSNOOSNOO)) user.sexcon.try_pelvis_crush(target) diff --git a/code/datums/sexcon/sex_actions/sex/throat_sex.dm b/code/datums/sexcon/sex_actions/sex/throat_sex.dm index 1fa3210e7fc..53ca2de9a19 100644 --- a/code/datums/sexcon/sex_actions/sex/throat_sex.dm +++ b/code/datums/sexcon/sex_actions/sex/throat_sex.dm @@ -55,7 +55,8 @@ var/oxyloss = 1.3 if(HAS_TRAIT(user, TRAIT_DEATHBYSNOOSNOO)) oxyloss*=2 - user.sexcon.perform_sex_action(target, 0, 7, FALSE) + if(!isseelie(user)) //cock too small + user.sexcon.perform_sex_action(target, 0, 7, FALSE) user.sexcon.perform_deepthroat_oxyloss(target, oxyloss) target.sexcon.handle_passive_ejaculation() diff --git a/code/datums/sexcon/sex_actions/sex/vaginal_ride_sex.dm b/code/datums/sexcon/sex_actions/sex/vaginal_ride_sex.dm index 5c2d9325e31..65239ccf0b9 100644 --- a/code/datums/sexcon/sex_actions/sex/vaginal_ride_sex.dm +++ b/code/datums/sexcon/sex_actions/sex/vaginal_ride_sex.dm @@ -17,8 +17,6 @@ if(issimple(target) && target.gender == MALE && target.sexcon) else return FALSE - if(HAS_TRAIT(user, TRAIT_TINY) && !(HAS_TRAIT(target, TRAIT_TINY))) //Dissabled for Seelie riding non-Seelie - return FALSE return TRUE /datum/sex_action/vaginal_ride_sex/can_perform(mob/living/user, mob/living/target) @@ -49,22 +47,16 @@ /datum/sex_action/vaginal_ride_sex/on_start(mob/living/user, mob/living/target) ..() if(HAS_TRAIT(target, TRAIT_TINY) && !(HAS_TRAIT(user, TRAIT_TINY))) - user.visible_message(span_warning("[user] gets on top of [target], trying and failing to ride the tiny cock with their cunt!")) + user.visible_message(span_warning("[user] gets on top of [target] and begins riding the tiny cock with their cunt!")) else user.visible_message(span_warning("[user] gets on top of [target] and begins riding them with their cunt!")) playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) /datum/sex_action/vaginal_ride_sex/on_perform(mob/living/user, mob/living/target) - if(user.sexcon.do_message_signature("[type]")) - if(HAS_TRAIT(target, TRAIT_TINY) && !(HAS_TRAIT(user, TRAIT_TINY))) - user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] tries to ride [target], unsuccessfully.")) - do_thrust_animate(user, target) - return //Return because male seelie cannot succesfully penetrate a large humen target - - if(HAS_TRAIT(user, TRAIT_DEATHBYSNOOSNOO)) - user.sexcon.try_pelvis_crush(target) + if(HAS_TRAIT(user, TRAIT_DEATHBYSNOOSNOO)) + user.sexcon.try_pelvis_crush(target) - user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] rides [target].")) + user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] rides [target].")) playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) do_thrust_animate(user, target) diff --git a/code/datums/sexcon/sex_actions/sex/vaginal_sex.dm b/code/datums/sexcon/sex_actions/sex/vaginal_sex.dm index 36f613507aa..aa86a5165a2 100644 --- a/code/datums/sexcon/sex_actions/sex/vaginal_sex.dm +++ b/code/datums/sexcon/sex_actions/sex/vaginal_sex.dm @@ -53,27 +53,21 @@ var/obj/item/bodypart/BPG = target.get_bodypart(BODY_ZONE_PRECISE_GROIN) var/obj/item/bodypart/BPC = target.get_bodypart(BODY_ZONE_CHEST) if(user.sexcon.force > SEX_FORCE_LOW) - BPC.add_wound(/datum/wound/fracture/chest) - BPG.add_wound(/datum/wound/fracture/groin) - target.apply_damage(15, BRUTE, BPC) - target.apply_damage(15, BRUTE, BPG) - playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) + if(prob(20)) + BPC.add_wound(/datum/wound/fracture/chest) + BPG.add_wound(/datum/wound/fracture/groin) + target.apply_damage(5, BRUTE, BPC) + target.apply_damage(5, BRUTE, BPG) else if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Seelie on Non-Seelie action - user.visible_message(span_warning("[user] tries and fails to insert their tiny cock into [target]'s cunt.")) + user.visible_message(span_warning("[user] inserts their tiny cock into [target]'s cunt.")) else //Normal humen sized creatures or Seelie on Seelie (which would be normal) user.visible_message(span_warning("[user] slides their cock into [target]'s cunt!")) - playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) + playsound(target, list('sound/misc/mat/insert (1).ogg','sound/misc/mat/insert (2).ogg'), 20, TRUE, ignore_walls = FALSE) /datum/sex_action/vaginal_sex/on_perform(mob/living/user, mob/living/target) - if(!(HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) //Male seelie trying to fuck normal size humen - user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] tries to fuck [target]'s cunt, unsuccessfully.")) - do_thrust_animate(user, target) - playsound(target, 'sound/misc/mat/segso.ogg', 50, TRUE, -2, ignore_walls = FALSE) - return FALSE //Return because male seelie cannot succesfully penetrate a large humen target if(user.sexcon.do_message_signature("[type]")) user.visible_message(user.sexcon.spanify_force("[user] [user.sexcon.get_generic_force_adjective()] fucks [target]'s cunt.")) - if((HAS_TRAIT(target, TRAIT_TINY)) && HAS_TRAIT(user, TRAIT_TINY)) - return FALSE + if(HAS_TRAIT(user, TRAIT_DEATHBYSNOOSNOO)) user.sexcon.try_pelvis_crush(target) diff --git a/code/datums/sexcon/sex_actions/utility/store_nipple.dm b/code/datums/sexcon/sex_actions/utility/store_nipple.dm index d7d1112d490..22740114df5 100644 --- a/code/datums/sexcon/sex_actions/utility/store_nipple.dm +++ b/code/datums/sexcon/sex_actions/utility/store_nipple.dm @@ -52,25 +52,26 @@ /datum/sex_action/store_nipple/on_start(mob/living/user, mob/living/target) var/obj/item/organ/filling_organ/breasts/userbreasts = user.getorgan(/obj/item/organ/filling_organ/breasts) var/obj/item/heldstuff = user.get_active_held_item() - if(userbreasts.organ_size < 4) - to_chat(user, span_info("Unfortunately, my breasts are not big enough to fit anything in them.")) - user.dropItemToGround(heldstuff) - return - else - if(userbreasts.organ_size < 6 && heldstuff.w_class > WEIGHT_CLASS_TINY) - to_chat(user, span_info("Unfortunately, my breasts are only big enough to fit tiny things.")) + if(heldstuff) + if(userbreasts.organ_size < 4) + to_chat(user, span_info("Unfortunately, my breasts are not big enough to fit anything in them.")) user.dropItemToGround(heldstuff) return else - if(userbreasts.organ_size < 8 && heldstuff.w_class > WEIGHT_CLASS_SMALL) - to_chat(user, span_info("Unfortunately, my breasts are only big enough to fit small things.")) + if(userbreasts.organ_size < 6 && heldstuff.w_class > WEIGHT_CLASS_TINY) + to_chat(user, span_info("Unfortunately, my breasts are only big enough to fit tiny things.")) user.dropItemToGround(heldstuff) return else - if(userbreasts.organ_size < 10 && heldstuff.w_class > WEIGHT_CLASS_NORMAL) - to_chat(user, span_info("Unfortunately, my breasts are only big enough to fit medium sized things.")) + if(userbreasts.organ_size < 8 && heldstuff.w_class > WEIGHT_CLASS_SMALL) + to_chat(user, span_info("Unfortunately, my breasts are only big enough to fit small things.")) user.dropItemToGround(heldstuff) return + else + if(userbreasts.organ_size < 10 && heldstuff.w_class > WEIGHT_CLASS_NORMAL) + to_chat(user, span_info("Unfortunately, my breasts are only big enough to fit medium sized things.")) + user.dropItemToGround(heldstuff) + return if(istype(heldstuff, /obj/item/rogueweapon)) to_chat(user, span_userdanger("[heldstuff] may cut me while i put it in, depending on my precision of hand.")) diff --git a/code/datums/sexcon/sex_actions/utility/store_nipple_other.dm b/code/datums/sexcon/sex_actions/utility/store_nipple_other.dm index 16080394b86..e6ed233a71b 100644 --- a/code/datums/sexcon/sex_actions/utility/store_nipple_other.dm +++ b/code/datums/sexcon/sex_actions/utility/store_nipple_other.dm @@ -56,25 +56,26 @@ /datum/sex_action/store_nipple_other/on_start(mob/living/user, mob/living/target) var/obj/item/organ/filling_organ/breasts/targetbreasts = target.getorgan(/obj/item/organ/filling_organ/breasts) var/obj/item/heldstuff = user.get_active_held_item() - if(targetbreasts.organ_size < 4) - to_chat(user, span_info("Unfortunately, [target]'s breasts are not big enough to fit anything in them.")) - user.dropItemToGround(heldstuff) - return - else - if(targetbreasts.organ_size < 6 && heldstuff.w_class > WEIGHT_CLASS_TINY) - to_chat(user, span_info("Unfortunately, [target]'s breasts are only big enough to fit tiny things.")) + if(heldstuff) + if(targetbreasts.organ_size < 4) + to_chat(user, span_info("Unfortunately, [target]'s breasts are not big enough to fit anything in them.")) user.dropItemToGround(heldstuff) return else - if(targetbreasts.organ_size < 8 && heldstuff.w_class > WEIGHT_CLASS_SMALL) - to_chat(user, span_info("Unfortunately, [target]'s breasts are only big enough to fit small things.")) + if(targetbreasts.organ_size < 6 && heldstuff.w_class > WEIGHT_CLASS_TINY) + to_chat(user, span_info("Unfortunately, [target]'s breasts are only big enough to fit tiny things.")) user.dropItemToGround(heldstuff) return else - if(targetbreasts.organ_size < 10 && heldstuff.w_class > WEIGHT_CLASS_NORMAL) - to_chat(user, span_info("Unfortunately, [target]'s breasts are only big enough to fit medium sized things.")) + if(targetbreasts.organ_size < 8 && heldstuff.w_class > WEIGHT_CLASS_SMALL) + to_chat(user, span_info("Unfortunately, [target]'s breasts are only big enough to fit small things.")) user.dropItemToGround(heldstuff) return + else + if(targetbreasts.organ_size < 10 && heldstuff.w_class > WEIGHT_CLASS_NORMAL) + to_chat(user, span_info("Unfortunately, [target]'s breasts are only big enough to fit medium sized things.")) + user.dropItemToGround(heldstuff) + return if(istype(heldstuff, /obj/item/rogueweapon)) to_chat(user, span_userdanger("[heldstuff] may cut me while i put it in, depending on my precision of hand.")) diff --git a/code/datums/sexcon/sexcon.dm b/code/datums/sexcon/sexcon.dm index 9331f3cf3b6..3a50c0841da 100644 --- a/code/datums/sexcon/sexcon.dm +++ b/code/datums/sexcon/sexcon.dm @@ -204,33 +204,43 @@ add_cum_floor(get_turf(target)) after_ejaculation() -/datum/sex_controller/proc/cum_into(oral = FALSE, vaginal = FALSE, anal = FALSE, nipple = FALSE) +/datum/sex_controller/proc/cum_into(oral = FALSE, vaginal = FALSE, anal = FALSE, nipple = FALSE, girljuice = FALSE) var/obj/item/organ/filling_organ/testicles/testes = user.getorganslot(ORGAN_SLOT_TESTICLES) - if(!issimple(target) && target.mind) - log_combat(user, target, "Came inside [target]") - if(HAS_TRAIT(target, TRAIT_GOODLOVER)) - if(!user.mob_timers["cumtri"]) - user.mob_timers["cumtri"] = world.time - user.adjust_triumphs(1) - user.add_stress(/datum/stressevent/cummax) - to_chat(user, span_love("Our sex was a true TRIUMPH!")) - else - user.add_stress(/datum/stressevent/cumok) - if(!issimple(user) && user.mind) - log_combat(target, user, "Came inside [user]") - if(HAS_TRAIT(user, TRAIT_GOODLOVER)) - if(!target.mob_timers["cumtri"]) - target.mob_timers["cumtri"] = world.time - target.adjust_triumphs(1) - target.add_stress(/datum/stressevent/cummax) - to_chat(target, span_love("Our sex was a true TRIUMPH!")) - else - target.add_stress(/datum/stressevent/cumok) + if(target.mind) + if(!issimple(target)) + log_combat(user, target, "Came inside [target]") + if(HAS_TRAIT(target, TRAIT_GOODLOVER)) + if(!user.mob_timers["cumtri"]) + user.mob_timers["cumtri"] = world.time + user.adjust_triumphs(1) + user.add_stress(/datum/stressevent/cummax) + to_chat(user, span_love("Our sex was a true TRIUMPH!")) + else + user.add_stress(/datum/stressevent/cumok) + if(user.mind) + if(!issimple(user)) + log_combat(target, user, "Came inside [user]") + if(HAS_TRAIT(user, TRAIT_GOODLOVER)) + if(!target.mob_timers["cumtri"]) + target.mob_timers["cumtri"] = world.time + target.adjust_triumphs(1) + target.add_stress(/datum/stressevent/cummax) + to_chat(target, span_love("Our sex was a true TRIUMPH!")) + else + target.add_stress(/datum/stressevent/cumok) + if(girljuice) + if(!issimple(target)) + target.reagents.add_reagent(/datum/reagent/water/pussjuice, 10) + after_ejaculation() + else + after_ejaculation() + return if(issimple(target)) if(testes) //simple target just remove the coom. var/cum_to_take = CLAMP((testes.reagents.maximum_volume/2), 1, testes.reagents.total_volume) testes.reagents.remove_reagent(testes.reagent_to_make, cum_to_take) user.add_stress(/datum/stressevent/cumok) + after_ejaculation() return if(!issimple(target) && testes) if(oral) @@ -238,7 +248,7 @@ var/cum_to_take = CLAMP((testes.reagents.maximum_volume/2), 1, testes.reagents.total_volume) testes.reagents.trans_to(target, cum_to_take, transfered_by = user) else - var/cameloc + var/obj/item/organ/filling_organ/cameloc if(vaginal) cameloc = target.getorganslot(ORGAN_SLOT_VAGINA) if(anal) @@ -246,9 +256,8 @@ if(nipple) cameloc = target.getorganslot(ORGAN_SLOT_BREASTS) if(vaginal || anal || nipple) - var/obj/item/organ/cameorgan = cameloc - var/cum_to_take = CLAMP((testes.reagents.maximum_volume/4), 1, min(testes.reagents.total_volume, cameorgan.reagents.maximum_volume - cameorgan.reagents.total_volume)) - testes.reagents.trans_to(cameorgan, cum_to_take, transfered_by = user) + var/cum_to_take = CLAMP((testes.reagents.maximum_volume/4), 1, min(testes.reagents.total_volume, cameloc.reagents.maximum_volume - cameloc.reagents.total_volume)) + testes.reagents.trans_to(cameloc, cum_to_take, transfered_by = user) else var/cum_to_take = CLAMP((testes.reagents.maximum_volume/4), 1, testes.reagents.total_volume) testes.reagents.trans_to(target, cum_to_take, transfered_by = user) //digest anyway if none of those. @@ -376,7 +385,7 @@ if(user.stat == DEAD) if(prob(2)) //since there is no proper diseases.... - target.reagents.add_reagent(/datum/reagent/organpoison, 1) + target.reagents.add_reagent(/datum/reagent/toxin/organpoison, 1) var/sexhealrand = rand(0.2, 0.4) //go go gadget sex healing.. magic? @@ -902,7 +911,7 @@ /datum/sex_controller/proc/try_pelvis_crush(mob/living/carbon/human/target) if(istype(user.rmb_intent, /datum/rmb_intent/strong)) if(!target.has_wound(/datum/wound/fracture/groin)) - if(prob(10)){ + if(prob(5)){ var/obj/item/bodypart/groin = target.get_bodypart(check_zone(BODY_ZONE_PRECISE_GROIN)) groin.add_wound(/datum/wound/fracture) } diff --git a/code/datums/sexcon/sexcon_helpers.dm b/code/datums/sexcon/sexcon_helpers.dm index 86a8449eb74..32390c99604 100644 --- a/code/datums/sexcon/sexcon_helpers.dm +++ b/code/datums/sexcon/sexcon_helpers.dm @@ -59,33 +59,6 @@ else playsound(src, pick('sound/misc/mat/guymouth (1).ogg','sound/misc/mat/guymouth (2).ogg','sound/misc/mat/guymouth (3).ogg','sound/misc/mat/guymouth (4).ogg','sound/misc/mat/guymouth (5).ogg'), 35, TRUE, ignore_walls = FALSE) -/* Obsolete now, cum reagent handles pregnancy mostly. -/mob/living/proc/try_impregnate(mob/living/wife) - var/wiferoll = rand(20)+wife.STACON - var/husbroll = rand(20)+STACON - if(wiferoll < husbroll) //shitty d20 roll with +1 point per const, wife tries to roll more to not get pregnant. -/mob/living/carbon/human/proc/try_impregnate(mob/living/carbon/human/wife) - var/obj/item/organ/testicles/testes = getorganslot(ORGAN_SLOT_TESTICLES) - if(!testes) - return - var/obj/item/organ/vagina/vag = wife.getorganslot(ORGAN_SLOT_VAGINA) - if(!vag) - return - if(prob(25) && wife.is_fertile() && is_virile()) - //even more obsolete - //This is the correct one used by the game. There's another sexcon that's not included in the DME. I'm stupid. - Kyo - vag.be_impregnated(src) - if(client?.prefs.showrolls) - to_chat(src, span_info("My odds to impregnate... [husbroll] vs [wife]'s [wiferoll].")) - if(wife.client?.prefs.showrolls) - to_chat(wife, span_info("My odds to not be pregnant... [wiferoll] vs [src]'s [husbroll].")) - else - if(client?.prefs.showrolls) - to_chat(src, span_info("My odds to impregnate... [husbroll] vs [wife]'s [wiferoll].")) - if(wife.client?.prefs.showrolls) - to_chat(wife, span_info("My odds to not be pregnant... [wiferoll] vs [src]'s [husbroll].")) -*/ - /mob/living/proc/get_highest_grab_state_on(mob/living/victim) var/grabstate = null if(r_grab && r_grab.grabbed == victim) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 1965ea2ee00..b07f4446f95 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -125,7 +125,7 @@ healing -= 0.1 break //Only count the first bedsheet if(health_ratio > 0.8) - owner.adjustToxLoss(healing * 0.5, TRUE, TRUE) + owner.adjustToxLoss(healing * 0.5, FALSE, TRUE) owner.adjustStaminaLoss(healing) if(human_owner && human_owner.drunkenness) human_owner.drunkenness *= 0.997 //reduce drunkenness by 0.3% per tick, 6% per 2 seconds diff --git a/code/datums/status_effects/rogue/debuff.dm b/code/datums/status_effects/rogue/debuff.dm index 84461a6b490..687ac6e0b3f 100644 --- a/code/datums/status_effects/rogue/debuff.dm +++ b/code/datums/status_effects/rogue/debuff.dm @@ -70,12 +70,12 @@ /atom/movable/screen/alert/status_effect/debuff/stealthcd name = "Stealth Broken" desc = "I've either been found or recently dealt a sneak attack and can't sneak again for a short while" - icon = 'modular_stonehedge/icons/mob/screen_alert.dmi' + icon = 'modular_stonehedge/licensed-eaglephntm/icons/mob/screen_alert.dmi' icon_state = "stealthcd" /datum/status_effect/debuff/stealthcd/on_apply() if(owner.mind) - duration = duration - ((owner.mind.get_skill_level(/datum/skill/misc/sneaking)) SECONDS) + duration = duration - ((owner.mind.get_skill_level(/datum/skill/misc/sneaking)) SECONDS * 2) if(owner.m_intent == MOVE_INTENT_SNEAK) owner.toggle_rogmove_intent(MOVE_INTENT_WALK) owner.update_sneak_invis() @@ -239,6 +239,19 @@ effectedstats = list("fortune" = -3) duration = 20 MINUTES +/datum/status_effect/debuff/shame + id = "Ashamed" + alert_type = /atom/movable/screen/alert/status_effect/debuff/shame + effectedstats = list("fortune" = -1, "intelligence" = -1) + duration = 5 MINUTES + +/atom/movable/screen/alert/status_effect/debuff/shame + name = "Ashamed" + desc = "I feel really fucking stupid right now..." + +/datum/status_effect/debuff/shame/on_apply() + owner.add_stress(/datum/stressevent/shitself) + /atom/movable/screen/alert/status_effect/debuff/devitalised name = "Devitalised" desc = "Something has been taken from me, and it will take time to recover." @@ -345,26 +358,45 @@ /datum/status_effect/debuff/bigboobs id = "bigboobs" alert_type = /atom/movable/screen/alert/status_effect/debuff/bigboobs - examine_text = span_notice("They have massive GOODS!") + examine_text = span_notice("They have massive MAGICAL GOODS!") effectedstats = list("constitution" = 3,"endurance" = -2, "speed" = -1) duration = 10 MINUTES var/initialpenis var/initialbutt var/initialball var/initialbreasts + var/nodrawback = FALSE + +/datum/status_effect/debuff/bigboobs/permanent + duration = -1 //used for quirk + +/datum/status_effect/debuff/bigboobs/permanent/lite + alert_type = /atom/movable/screen/alert/status_effect/debuff/bigboobslite + examine_text = span_notice("They have massive GOODS!") + effectedstats = list("constitution" = 2,"endurance" = -1, "speed" = -1) + nodrawback = TRUE /atom/movable/screen/alert/status_effect/debuff/bigboobs name = "Enchanted Endowment" //was gonna name it a curse but it isn't a technically one. desc = "They feel as heavy as gold and are massive... My back hurts." - icon = 'modular_stonehedge/icons/mob/screen_alert.dmi' + icon = 'modular_stonehedge/licensed-eaglephntm/icons/mob/screen_alert.dmi' icon_state = "bigboobs" +/atom/movable/screen/alert/status_effect/debuff/bigboobslite + name = "Natural Endowment" + desc = "I got unusually large, natural bits, they aren't as heavy as an enchanted one thankfully." + icon = 'modular_stonehedge/licensed-eaglephntm/icons/mob/screen_alert.dmi' + icon_state = "bigboobslite" + /datum/status_effect/debuff/bigboobs/on_apply() . = ..() var/mob/living/carbon/human/species/user = owner if(!user) return - ADD_TRAIT(user, TRAIT_ENDOWMENT, id) + if(nodrawback) + ADD_TRAIT(user, TRAIT_ENDOWMENTLITE, id) + else + ADD_TRAIT(user, TRAIT_ENDOWMENT, id) to_chat(user, span_warning("Gah! my [user.gender == FEMALE ? "TITS" : "JUNK"] expand to impossible sizes!")) //max them out. for(var/obj/item/organ/forgan as anything in user.internal_organs) //as anything cause i either do this or use for() twice which is i guess worse. diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index a3b7a928f6a..279c8b3bc05 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -39,6 +39,7 @@ /datum/status_effect/Destroy() STOP_PROCESSING(SSfastprocess, src) if(owner) + linked_alert = null owner.clear_alert(id) LAZYREMOVE(owner.status_effects, src) on_remove() @@ -112,6 +113,10 @@ inspec += "
----------------------" to_chat(user, "[inspec.Join()]") +/atom/movable/screen/alert/status_effect/Destroy() + attached_effect = null + return ..() + ////////////////// // HELPER PROCS // ////////////////// diff --git a/code/datums/stress/negative_events.dm b/code/datums/stress/negative_events.dm index a8fb75fa909..9483f443c6f 100644 --- a/code/datums/stress/negative_events.dm +++ b/code/datums/stress/negative_events.dm @@ -118,9 +118,9 @@ desc = span_red("I fell. I'm a fool.") /datum/stressevent/hatezizo - timer = 99999 MINUTES - stressadd = 666 // :) - desc = "ZIZOZIZOZIZO" + timer = 30 MINUTES + stressadd = 10 // enough to instill mental breaks with any more stress of any source, and heart attack if too worse. + desc = "A NEW GOD is upon us!" /datum/stressevent/burntmeal timer = 2 MINUTES diff --git a/code/datums/stress/positive_events.dm b/code/datums/stress/positive_events.dm index 616b878766c..47ef07c9c8d 100644 --- a/code/datums/stress/positive_events.dm +++ b/code/datums/stress/positive_events.dm @@ -8,11 +8,6 @@ stressadd = -1 desc = span_red("It's raining.") -/datum/stressevent/lovezizo - timer = 99999 MINUTES - stressadd = -666 // :) - desc = "ZIZOZIZOZIZO" - /datum/stressevent/viewsinpunish timer = 5 MINUTES stressadd = -2 @@ -177,3 +172,8 @@ stressadd = -1 desc = span_green("A soothing fragrance envelops me.") timer = 10 MINUTES + +/datum/stressevent/zizodefeated + timer = 30 MINUTES + stressadd = -5 + desc = span_green("THE NEW DARK GOD HAS FALLEN!") diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index 5fca6085f24..344a2f062ca 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -62,7 +62,7 @@ medical_record_text = "Patient is highly perceptive of and sensitive to social cues, or may possibly have ESP. Further testing needed." /* no clowns but jesters here -datum/quirk/fan_clown +/datum/quirk/fan_clown name = "Clown Fan" desc = "" value = 1 @@ -80,7 +80,7 @@ datum/quirk/fan_clown ) H.equip_in_one_of_slots(B, slots , qdel_on_fail = TRUE) -datum/quirk/fan_mime +/datum/quirk/fan_mime name = "Mime Fan" desc = "" value = 1 @@ -143,8 +143,8 @@ datum/quirk/fan_mime /datum/quirk/musician name = "Musician" - desc = "I am good at playing music." - value = 1 + desc = "I am good at playing music. I've also hidden a lute!" + value = 2 mob_trait = TRAIT_MUSICIAN gain_text = span_notice("I know everything about musical instruments.") lose_text = span_danger("I forget how musical instruments work.") @@ -152,12 +152,8 @@ datum/quirk/fan_mime /datum/quirk/musician/on_spawn() var/mob/living/carbon/human/H = quirk_holder - var/obj/item/choice_beacon/music/B = new(get_turf(H)) - var/list/slots = list ( - "backpack" = SLOT_IN_BACKPACK, - "hands" = SLOT_HANDS, - ) - H.equip_in_one_of_slots(B, slots , qdel_on_fail = TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/music, 3, TRUE) + H.mind.special_items["Lute"] = /obj/item/rogue/instrument/lute /datum/quirk/night_vision name = "Low Light Vision" @@ -172,7 +168,7 @@ datum/quirk/fan_mime var/obj/item/organ/eyes/eyes = H.getorgan(/obj/item/organ/eyes) if(!eyes || eyes.lighting_alpha) return - eyes.see_in_dark = 7 + eyes.see_in_dark = 7 // Same as half-darksight eyes eyes.lighting_alpha = LIGHTING_PLANE_ALPHA_NV_TRAIT eyes.Insert(H) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index a54be04581b..15780f7357e 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -69,7 +69,7 @@ var/datum/species/species = H.dna.species if(initial(species.liked_food) & MEAT) species.liked_food |= MEAT - if(!initial(species.disliked_food) & MEAT) + if(!(initial(species.disliked_food) & MEAT)) species.disliked_food &= ~MEAT /* diff --git a/code/datums/weather/weather_types/acid_rain.dm b/code/datums/weather/weather_types/acid_rain.dm index ddcde30b6fd..1e16e3ecf1d 100644 --- a/code/datums/weather/weather_types/acid_rain.dm +++ b/code/datums/weather/weather_types/acid_rain.dm @@ -29,4 +29,4 @@ var/resist = L.getarmor(null, "acid") if(prob(max(0,100-resist))) L.acid_act(20,20) - return TRUE \ No newline at end of file + return TRUE diff --git a/code/datums/weather/weather_types/floor_is_lava.dm b/code/datums/weather/weather_types/floor_is_lava.dm index 227ba28a6bb..a178e2f8798 100644 --- a/code/datums/weather/weather_types/floor_is_lava.dm +++ b/code/datums/weather/weather_types/floor_is_lava.dm @@ -38,4 +38,4 @@ if(L.movement_type & FLYING) return L.adjustFireLoss(3) - return ..() \ No newline at end of file + return ..() diff --git a/code/datums/weather/weather_types/roguetown/rain.dm b/code/datums/weather/weather_types/roguetown/rain.dm index d19b7b4e5ff..9931021a3b0 100644 --- a/code/datums/weather/weather_types/roguetown/rain.dm +++ b/code/datums/weather/weather_types/roguetown/rain.dm @@ -51,12 +51,12 @@ switch(stage) if(STARTUP_STAGE) return "bla1" -// return telegraph_overlay + // return telegraph_overlay if(MAIN_STAGE) return pick("rain") if(WIND_DOWN_STAGE) return "bla2" - return end_overlay + // return end_overlay return "bla3" /datum/weather/rain/starteffected() diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index 0f9ee3b0c19..acb1e5858ee 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -35,7 +35,6 @@ ..() if(!istype(holder, holder_type)) CRASH("Wire holder is not of the expected type!") - return src.holder = holder if(randomize) diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm index bf853a73f34..8db6f17519e 100644 --- a/code/datums/world_topic.dm +++ b/code/datums/world_topic.dm @@ -26,7 +26,12 @@ var/require_comms_key = FALSE /datum/world_topic/proc/TryRun(list/input) - key_valid = config && (CONFIG_GET(string/comms_key) == input["key"]) + if(!config) + return "Configuration has not initialised yet" + var/comms_key = CONFIG_GET(string/comms_key) + if(!comms_key) // key was not set + return "Commskey disabled" + key_valid = comms_key == input["key"] if(require_comms_key && !key_valid) return "Bad Key" input -= "key" diff --git a/code/datums/wounds/types/special.dm b/code/datums/wounds/types/special.dm index b06eb896fd1..0655601aa04 100644 --- a/code/datums/wounds/types/special.dm +++ b/code/datums/wounds/types/special.dm @@ -238,8 +238,6 @@ "The testicles are twisted!", "The testicles are torsioned!", ) - if(HAS_TRAIT(affected, TRAIT_CRITICAL_WEAKNESS)) - affected.death() /datum/wound/cbt/on_life() . = ..() diff --git a/code/game/alternate_appearance.dm b/code/game/alternate_appearance.dm index 7c46833517c..9bbd1f38d42 100644 --- a/code/game/alternate_appearance.dm +++ b/code/game/alternate_appearance.dm @@ -174,7 +174,7 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) return TRUE return FALSE -datum/atom_hud/alternate_appearance/basic/onePerson +/datum/atom_hud/alternate_appearance/basic/onePerson var/mob/seer /datum/atom_hud/alternate_appearance/basic/onePerson/mobShouldSee(mob/M) diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm index 6caa15de361..3dd7df87f67 100644 --- a/code/game/area/Space_Station_13_areas.dm +++ b/code/game/area/Space_Station_13_areas.dm @@ -51,12 +51,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station dynamic_lighting = DYNAMIC_LIGHTING_DISABLED has_gravity = STANDARD_GRAVITY - -/area/testroom - requires_power = FALSE - name = "Test Room" - icon_state = "storage" - //EXTRA /area/asteroid diff --git a/code/game/area/roguetownareas.dm b/code/game/area/roguetownareas.dm index dd45292fe74..0fd55c34e69 100644 --- a/code/game/area/roguetownareas.dm +++ b/code/game/area/roguetownareas.dm @@ -755,172 +755,172 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town first_time_text = "The Forest of Repentence" /area/rogue/under/deep_caverns - name = "Deep Caverns" - icon_state = "deep_caverns" - droning_sound = 'sound/music/area/caves.ogg' - var/generation_attempted = FALSE - - // Override the New() proc to call the generation logic upon creation - New() - ..() - spawn(20) // 20 ticks delay - if (!generation_attempted) - call_deep_caverns_generation_logic() + name = "Deep Caverns" + icon_state = "deep_caverns" + droning_sound = 'sound/music/area/caves.ogg' + var/generation_attempted = FALSE + +// Override the New() proc to call the generation logic upon creation +/area/rogue/under/deep_caverns/New() + ..() + spawn(2 SECONDS) // 20 ticks delay + if (!generation_attempted) + call_deep_caverns_generation_logic() // Proc to initiate the generation logic /area/rogue/under/deep_caverns/proc/call_deep_caverns_generation_logic() - generation_attempted = TRUE - // Run the generation logic in the background - spawn(1) generate_deep_caverns_layout() + generation_attempted = TRUE + // Run the generation logic in the background + spawn(1) generate_deep_caverns_layout() // Proc to generate the cavern layout dynamically /area/rogue/under/deep_caverns/proc/generate_deep_caverns_layout() - var/list/turfs = list() - - for (var/turf/T in world) - if (T.loc == src) - turfs += T - - var/total_turfs = length(turfs) - - if (total_turfs == 0) - return - - var/grid_width = sqrt(total_turfs) - var/grid_height = grid_width - - // Initialize grid - var/list/grid = list() - for (var/i = 1 to grid_width) - grid += list(new/list(grid_height)) - - // Adjust initial probability to favor open tiles slightly - var/initial_wall_prob = 30 // 30% chance of being a wall - - // Randomly fill grid - for (var/x = 1 to grid_width) - for (var/y = 1 to grid_height) - grid[x][y] = prob(initial_wall_prob) // Set probability for walls - - // Cellular automata iterations - var/iterations = 0 - var/max_iterations = 4 - while (iterations < max_iterations) - grid = do_cellular_automaton_iteration(grid, grid_width, grid_height) - iterations++ - sleep(5) // Sleep for a few ticks to prevent blocking - - // Apply grid to turfs - var/water_count = 0 - var/index = 1 - for (var/x = 1 to grid_width) - for (var/y = 1 to grid_height) - if (index > total_turfs) - break - var/turf/T = turfs[index] - if (grid[x][y]) - T.ChangeTurf(/turf/closed/mineral/random/rogue/high) // Updated closed tile rock - water_count++ // Update water_count if you use it later - else - if (prob(10) && water_count < total_turfs * 0.05) // 5% water - T.ChangeTurf(/turf/open/water/swamp) - water_count++ - else - // Randomly choose between naturalstone and dirt - if (prob(50)) // 50% chance - T.ChangeTurf(/turf/open/floor/rogue/naturalstone) - else - T.ChangeTurf(/turf/open/floor/rogue/dirt) - index++ - - // Connectivity checks - var/list/open_turfs = list() - for (var/turf/T in turfs) - if (istype(T, /turf/open/floor/rogue/naturalstone) || istype(T, /turf/open/floor/rogue/dirt)) - open_turfs += T - - var/connected_threshold = total_turfs * 0.70 // 70% connected - - if (length(open_turfs) > 0) - var/turf/starting_turf = pick(open_turfs) - var/list/visited_turfs = list() - var/list/queue = list(starting_turf) - visited_turfs += starting_turf - - while (length(queue) > 0) - var/turf/current_turf = queue[1] - queue.Remove(current_turf) - - for (var/turf/neighbor in orange(1, current_turf)) - if ((istype(neighbor, /turf/open/floor/rogue/naturalstone) || istype(neighbor, /turf/open/floor/rogue/dirt)) && !(neighbor in visited_turfs)) - queue += neighbor - visited_turfs += neighbor - - if (length(visited_turfs) < connected_threshold) - return - else - return - - // Unified list of items, objects, and mobs to be spawned - var/list/spawnables = list( - // Not rare objects - list(/obj/structure/spider/stickyweb, 0.45), - list(/obj/structure/flora/rogueshroom, 0.30), - list(/obj/structure/glowshroom, 0.20), - list(/obj/effect/spawner/lootdrop/roguetown/dungeon/misc, 0.085), - - // Rare objects - list(/obj/effect/decal/remains/human, 0.02), - list(/obj/effect/decal/cleanable/blood/old, 0.02), - list(/obj/item/rogueweapon/pick, 0.015), - list(/mob/living/simple_animal/hostile/retaliate/rogue/mole, 0.02), - list(/mob/living/simple_animal/hostile/retaliate/rogue/spider/mutated, 0.05), - - // Superrare objects - list(/obj/item/roguegem, 0.010), - list(/obj/item/roguecoin/silver/pile, 0.005), - list(/obj/structure/bed/rogue/shit, 0.01), - list(/obj/item/rope/chain, 0.009) + var/list/turfs = list() + + for (var/turf/T in world) + if (T.loc == src) + turfs += T + + var/total_turfs = length(turfs) + + if (total_turfs == 0) + return + + var/grid_width = sqrt(total_turfs) + var/grid_height = grid_width + + // Initialize grid + var/list/grid = list() + for (var/i = 1 to grid_width) + grid += list(new/list(grid_height)) + + // Adjust initial probability to favor open tiles slightly + var/initial_wall_prob = 30 // 30% chance of being a wall + + // Randomly fill grid + for (var/x = 1 to grid_width) + for (var/y = 1 to grid_height) + grid[x][y] = prob(initial_wall_prob) // Set probability for walls + + // Cellular automata iterations + var/iterations = 0 + var/max_iterations = 4 + while (iterations < max_iterations) + grid = do_cellular_automaton_iteration(grid, grid_width, grid_height) + iterations++ + sleep(5) // Sleep for a few ticks to prevent blocking + + // Apply grid to turfs + var/water_count = 0 + var/index = 1 + for (var/x = 1 to grid_width) + for (var/y = 1 to grid_height) + if (index > total_turfs) + break + var/turf/T = turfs[index] + if (grid[x][y]) + T.ChangeTurf(/turf/closed/mineral/random/rogue/high) // Updated closed tile rock + water_count++ // Update water_count if you use it later + else + if (prob(10) && water_count < total_turfs * 0.05) // 5% water + T.ChangeTurf(/turf/open/water/swamp) + water_count++ + else + // Randomly choose between naturalstone and dirt + if (prob(50)) // 50% chance + T.ChangeTurf(/turf/open/floor/rogue/naturalstone) + else + T.ChangeTurf(/turf/open/floor/rogue/dirt) + index++ + + // Connectivity checks + var/list/open_turfs = list() + for (var/turf/T in turfs) + if (istype(T, /turf/open/floor/rogue/naturalstone) || istype(T, /turf/open/floor/rogue/dirt)) + open_turfs += T + + var/connected_threshold = total_turfs * 0.70 // 70% connected + + if (length(open_turfs) > 0) + var/turf/starting_turf = pick(open_turfs) + var/list/visited_turfs = list() + var/list/queue = list(starting_turf) + visited_turfs += starting_turf + + while (length(queue) > 0) + var/turf/current_turf = queue[1] + queue.Remove(current_turf) + + for (var/turf/neighbor in orange(1, current_turf)) + if ((istype(neighbor, /turf/open/floor/rogue/naturalstone) || istype(neighbor, /turf/open/floor/rogue/dirt)) && !(neighbor in visited_turfs)) + queue += neighbor + visited_turfs += neighbor + + if (length(visited_turfs) < connected_threshold) + return + else + return + + // Unified list of items, objects, and mobs to be spawned + var/list/spawnables = list( + // Not rare objects + list(/obj/structure/spider/stickyweb, 0.45), + list(/obj/structure/flora/rogueshroom, 0.30), + list(/obj/structure/glowshroom, 0.20), + list(/obj/effect/spawner/lootdrop/roguetown/dungeon/misc, 0.085), + + // Rare objects + list(/obj/effect/decal/remains/human, 0.02), + list(/obj/effect/decal/cleanable/blood/old, 0.02), + list(/obj/item/rogueweapon/pick, 0.015), + list(/mob/living/simple_animal/hostile/retaliate/rogue/mole, 0.02), + list(/mob/living/simple_animal/hostile/retaliate/rogue/spider/mutated, 0.05), + + // Superrare objects + list(/obj/item/roguegem, 0.010), + list(/obj/item/roguecoin/silver/pile, 0.005), + list(/obj/structure/bed/rogue/shit, 0.01), + list(/obj/item/rope/chain, 0.009) ) - var/list/placed_objects = list() + var/list/placed_objects = list() - for (var/list/spawnable in spawnables) - var/obj_type = spawnable[1] - var/spawn_prob = spawnable[2] + for (var/list/spawnable in spawnables) + var/obj_type = spawnable[1] + var/spawn_prob = spawnable[2] - for (var/turf/T in turfs) - if (istype(T, /turf/open/floor/rogue/naturalstone) || istype(T, /turf/open/floor/rogue/dirt)) - if (prob(spawn_prob)) - var/obj/new_object = new obj_type - new_object.loc = T - placed_objects += T + for (var/turf/T in turfs) + if (istype(T, /turf/open/floor/rogue/naturalstone) || istype(T, /turf/open/floor/rogue/dirt)) + if (prob(spawn_prob)) + var/obj/new_object = new obj_type + new_object.loc = T + placed_objects += T // Cellular automaton iteration /area/rogue/under/deep_caverns/proc/do_cellular_automaton_iteration(list/grid, width, height) - var/list/new_grid = list() - for (var/i = 1 to width) - new_grid += list(new/list(height)) + var/list/new_grid = list() + for (var/i = 1 to width) + new_grid += list(new/list(height)) - for (var/x = 1 to width) - for (var/y = 1 to height) - var/wall_count = count_neighbor_walls(grid, x, y, width, height) - if (grid[x][y]) - new_grid[x][y] = (wall_count >= 4) - else - new_grid[x][y] = (wall_count >= 5) + for (var/x = 1 to width) + for (var/y = 1 to height) + var/wall_count = count_neighbor_walls(grid, x, y, width, height) + if (grid[x][y]) + new_grid[x][y] = (wall_count >= 4) + else + new_grid[x][y] = (wall_count >= 5) - return new_grid + return new_grid // Count neighbor walls /area/rogue/under/deep_caverns/proc/count_neighbor_walls(list/grid, x, y, width, height) - var/count = 0 - for (var/dx = -1 to 1) - for (var/dy = -1 to 1) - var/nx = x + dx - var/ny = y + dy - if (nx > 0 && nx <= width && ny > 0 && ny <= height) - count += grid[nx][ny] - else - count++ // Count out-of-bounds as walls - return count + var/count = 0 + for (var/dx = -1 to 1) + for (var/dy = -1 to 1) + var/nx = x + dx + var/ny = y + dy + if (nx > 0 && nx <= width && ny > 0 && ny <= height) + count += grid[nx][ny] + else + count++ // Count out-of-bounds as walls + return count diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d0727c43aed..f5c1b43851b 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -158,6 +158,7 @@ * * /turf/open/space/Initialize */ /atom/proc/Initialize(mapload, ...) + SHOULD_CALL_PARENT(TRUE) if(flags_1 & INITIALIZED_1) stack_trace("Warning: [src]([type]) initialized multiple times!") flags_1 |= INITIALIZED_1 @@ -1291,6 +1292,8 @@ * Sends signals COMSIG_ATOM_HAS_GRAVITY and COMSIG_TURF_HAS_GRAVITY, both can force gravity with * the forced gravity var * + * micro-optimized to hell because this proc is very hot, being called several times per movement every movement. + * * Gravity situations: * * No gravity if you're not in a turf * * No gravity if this atom is in is a space turf @@ -1299,34 +1302,27 @@ * * Gravity if the Z level has an SSMappingTrait for ZTRAIT_GRAVITY * * otherwise no gravity */ -/atom/proc/has_gravity(turf/T) - if(!T || !isturf(T)) - T = get_turf(src) +/atom/proc/has_gravity(turf/gravity_turf) + if(!isturf(gravity_turf)) + gravity_turf = get_turf(src) - if(!T) + if(!gravity_turf)//no gravity in nullspace return 0 - var/list/forced_gravity = list() - SEND_SIGNAL(src, COMSIG_ATOM_HAS_GRAVITY, T, forced_gravity) - if(!forced_gravity.len) - SEND_SIGNAL(T, COMSIG_TURF_HAS_GRAVITY, src, forced_gravity) - if(forced_gravity.len) - var/max_grav - for(var/i in forced_gravity) + //the list isnt created every time as this proc is very hot, its only accessed if anything is actually listening to the signal too + var/static/list/forced_gravity = list() + if(SEND_SIGNAL(src, COMSIG_ATOM_HAS_GRAVITY, gravity_turf, forced_gravity)) + if(!length(forced_gravity)) + SEND_SIGNAL(gravity_turf, COMSIG_TURF_HAS_GRAVITY, src, forced_gravity) + + var/max_grav = 0 + for(var/i in forced_gravity)//our gravity is the strongest return forced gravity we get max_grav = max(max_grav, i) + forced_gravity.Cut() + //cut so we can reuse the list, this is ok since forced gravity movers are exceedingly rare compared to all other movement return max_grav - if(isspaceturf(T)) // Turf never has gravity - return 0 - - var/area/A = get_area(T) - if(A.has_gravity) // Areas which always has gravity - return A.has_gravity - else - // There's a gravity generator on our z level - if(GLOB.gravity_generators["[T.z]"]) - var/max_grav = 0 - for(var/obj/machinery/gravity_generator/main/G in GLOB.gravity_generators["[T.z]"]) - max_grav = max(G.setting,max_grav) - return max_grav - return SSmapping.level_trait(T.z, ZTRAIT_GRAVITY) + var/area/turf_area = gravity_turf.loc + // force_no_gravity has been removed because this is Roguetown code + // it'd be trivial to readd if you needed it, though + return SSmapping.gravity_by_z_level["[gravity_turf.z]"] || turf_area.has_gravity diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index c07bab83b00..993e17a75b0 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -575,7 +575,7 @@ SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, hit_atom, throwingdatum) return hit_atom.hitby(src, throwingdatum=throwingdatum) -/atom/movable/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked, datum/thrownthing/throwingdatum) +/atom/movable/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked, datum/thrownthing/throwingdatum, d_type = "blunt") if(!anchored && hitpush && (!throwingdatum || (throwingdatum.force >= (move_resist * MOVE_FORCE_PUSH_RATIO)))) step(src, AM.dir) ..() @@ -854,16 +854,16 @@ if(throwing) return if(on && !(movement_type & FLOATING)) - animate(src, pixel_y = pixel_y + 2, time = 10, loop = -1) - sleep(10) - animate(src, pixel_y = pixel_y - 2, time = 10, loop = -1) + animate(src, pixel_y = pixel_y + 2, time = 1 SECONDS, loop = -1, flags = ANIMATION_RELATIVE) + animate(pixel_y = pixel_y - 2, time = 1 SECONDS, loop = -1, flags = ANIMATION_RELATIVE) setMovetype(movement_type | FLOATING) else if (!on && (movement_type & FLOATING)) - animate(src, pixel_y = initial(pixel_y), time = 10) + animate(src, pixel_y = initial(pixel_y), time = 1 SECONDS) setMovetype(movement_type & ~FLOATING) /* Language procs */ /atom/movable/proc/get_language_holder(shadow=TRUE) + RETURN_TYPE(/datum/language_holder) if(language_holder) return language_holder else diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 1a8516c6a28..9d8f4e29322 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -149,7 +149,6 @@ return "health-85" else return "health-100" - return "0" //HOOKS @@ -184,9 +183,7 @@ var/icon/I = icon(icon, icon_state, dir) var/virus_threat = check_virus() holder.pixel_y = I.Height() - world.icon_size - if(HAS_TRAIT(src, TRAIT_XENO_HOST)) - holder.icon_state = "hudxeno" - else if(stat == DEAD || (HAS_TRAIT(src, TRAIT_FAKEDEATH))) + if(stat == DEAD || (HAS_TRAIT(src, TRAIT_FAKEDEATH))) if(tod) var/tdelta = round(world.time - timeofdeath) if(tdelta < (DEFIB_TIME_LIMIT * 10)) @@ -302,7 +299,6 @@ return "crit" else return "dead" - return "dead" //Sillycone hooks /mob/living/silicon/proc/diag_hud_set_health() diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index e13ebfac2c2..27a1e91ed4b 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -48,7 +48,7 @@ trimmed_list.Remove(M) continue if (M.mind) - if (restrict_ghost_roles && M.mind.assigned_role in GLOB.exp_specialmap[EXP_TYPE_SPECIAL]) // Are they playing a ghost role? + if (restrict_ghost_roles && (M.mind.assigned_role in GLOB.exp_specialmap[EXP_TYPE_SPECIAL])) // Are they playing a ghost role? trimmed_list.Remove(M) continue if (M.mind.assigned_role in restricted_roles) // Does their job allow it? @@ -361,96 +361,3 @@ /datum/dynamic_ruleset/midround/from_ghosts/blob/generate_ruleset_body(mob/applicant) var/body = applicant.become_overmind() return body - -////////////////////////////////////////////// -// // -// XENOMORPH (GHOST) // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/midround/from_ghosts/xenomorph - name = "Alien Infestation" - antag_datum = /datum/antagonist/xeno - antag_flag = ROLE_ALIEN - enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain") - required_enemies = list(2,2,1,1,1,1,1,0,0,0) - required_candidates = 1 - weight = 3 - cost = 10 - requirements = list(101,101,101,70,50,40,20,15,10,10) - high_population_requirement = 50 - repeatable = TRUE - var/list/vents = list() - -/datum/dynamic_ruleset/midround/from_ghosts/xenomorph/execute() - // 50% chance of being incremented by one - required_candidates += prob(50) - for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent in GLOB.machines) - if(QDELETED(temp_vent)) - continue - if(is_station_level(temp_vent.loc.z) && !temp_vent.welded) - var/datum/pipeline/temp_vent_parent = temp_vent.parents[1] - if(!temp_vent_parent) - continue // No parent vent - // Stops Aliens getting stuck in small networks. - // See: Security, Virology - if(temp_vent_parent.other_atmosmch.len > 20) - vents += temp_vent - if(!vents.len) - return FALSE - . = ..() - -/datum/dynamic_ruleset/midround/from_ghosts/xenomorph/generate_ruleset_body(mob/applicant) - var/obj/vent = pick_n_take(vents) - var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc) - new_xeno.key = applicant.key - message_admins("[ADMIN_LOOKUPFLW(new_xeno)] has been made into an alien by the midround ruleset.") - log_game("DYNAMIC: [key_name(new_xeno)] was spawned as an alien by the midround ruleset.") - return new_xeno - -////////////////////////////////////////////// -// // -// NIGHTMARE (GHOST) // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/midround/from_ghosts/nightmare - name = "Nightmare" - antag_datum = /datum/antagonist/nightmare - antag_flag = "Nightmare" - antag_flag_override = ROLE_ALIEN - enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain") - required_enemies = list(2,2,1,1,1,1,1,0,0,0) - required_candidates = 1 - weight = 3 - cost = 10 - requirements = list(101,101,101,70,50,40,20,15,10,10) - high_population_requirement = 50 - repeatable = TRUE - var/list/spawn_locs = list() - -/datum/dynamic_ruleset/midround/from_ghosts/nightmare/execute() - for(var/X in GLOB.xeno_spawn) - var/turf/T = X - var/light_amount = T.get_lumcount() - if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) - spawn_locs += T - if(!spawn_locs.len) - return FALSE - . = ..() - -/datum/dynamic_ruleset/midround/from_ghosts/nightmare/generate_ruleset_body(mob/applicant) - var/datum/mind/player_mind = new /datum/mind(applicant.key) - player_mind.active = TRUE - - var/mob/living/carbon/human/S = new (pick(spawn_locs)) - player_mind.transfer_to(S) - player_mind.assigned_role = "Nightmare" - player_mind.special_role = "Nightmare" - player_mind.add_antag_datum(/datum/antagonist/nightmare) - S.set_species(/datum/species/shadow/nightmare) - - playsound(S, 'sound/blank.ogg', 50, TRUE, -1) - message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Nightmare by the midround ruleset.") - log_game("DYNAMIC: [key_name(S)] was spawned as a Nightmare by the midround ruleset.") - return S diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index 37048a45b09..d1caa634236 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -620,38 +620,3 @@ SSticker.mode_result = "win - monkey win" else SSticker.mode_result = "loss - staff stopped the monkeys" - -////////////////////////////////////////////// -// // -// METEOR // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/roundstart/meteor - name = "Meteor" - persistent = TRUE - required_candidates = 0 - weight = 3 - cost = 0 - requirements = list(101,101,101,101,101,101,101,101,101,101) - high_population_requirement = 101 - var/meteordelay = 2000 - var/nometeors = 0 - var/rampupdelta = 5 - -/datum/dynamic_ruleset/roundstart/meteor/rule_process() - if(nometeors || meteordelay > world.time - SSticker.round_start_time) - return - - var/list/wavetype = GLOB.meteors_normal - var/meteorminutes = (world.time - SSticker.round_start_time - meteordelay) / 10 / 60 - - if (prob(meteorminutes)) - wavetype = GLOB.meteors_threatening - - if (prob(meteorminutes/2)) - wavetype = GLOB.meteors_catastrophic - - var/ramp_up_final = CLAMP(round(meteorminutes/rampupdelta), 1, 10) - - spawn_meteors(ramp_up_final, wavetype) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index aec0428c5c8..1a332616ba9 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -132,12 +132,11 @@ query_round_game_mode.Execute() qdel(query_round_game_mode) if(report) - addtimer(CALLBACK(src, .proc/send_intercept, 0), rand(waittime_l, waittime_h)) + addtimer(CALLBACK(src, PROC_REF(send_intercept), 0), rand(waittime_l, waittime_h)) generate_station_goals() gamemode_ready = TRUE return 1 - ///Handles late-join antag assignments /datum/game_mode/proc/make_antag_chance(mob/living/carbon/human/character) if(replacementmode && round_converted == 2) diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm deleted file mode 100644 index 0f33c03b4c8..00000000000 --- a/code/game/gamemodes/meteor/meteor.dm +++ /dev/null @@ -1,60 +0,0 @@ -/datum/game_mode/meteor - name = "meteor" - config_tag = "meteor" - report_type = "meteor" - false_report_weight = 1 - var/meteordelay = 2000 - var/nometeors = 0 - var/rampupdelta = 5 - required_players = 0 - - announce_span = "danger" - announce_text = "A major meteor shower is bombarding the station! The crew needs to evacuate or survive the onslaught." - - -/datum/game_mode/meteor/process() - if(nometeors || meteordelay > world.time - SSticker.round_start_time) - return - - var/list/wavetype = GLOB.meteors_normal - var/meteorminutes = (world.time - SSticker.round_start_time - meteordelay) / 10 / 60 - - - if (prob(meteorminutes)) - wavetype = GLOB.meteors_threatening - - if (prob(meteorminutes/2)) - wavetype = GLOB.meteors_catastrophic - - var/ramp_up_final = CLAMP(round(meteorminutes/rampupdelta), 1, 10) - - spawn_meteors(ramp_up_final, wavetype) - - -/datum/game_mode/meteor/special_report() - var/survivors = 0 - var/list/survivor_list = list() - - for(var/mob/living/player in GLOB.player_list) - if(player.stat != DEAD) - ++survivors - - if(player.onCentCom()) - survivor_list += span_greentext("[player.real_name] escaped to the safety of CentCom.") - else if(player.onSyndieBase()) - survivor_list += span_greentext("[player.real_name] escaped to the (relative) safety of Syndicate Space.") - else - survivor_list += span_neutraltext("[player.real_name] survived but is stranded without any hope of rescue.") - - if(survivors) - return "
The following survived the meteor storm:
[survivor_list.Join("
")]
" - else - return "
Nobody survived the meteor storm!
" - -/datum/game_mode/meteor/set_round_result() - ..() - SSticker.mode_result = "end - evacuation" - -/datum/game_mode/meteor/generate_report() - return "[pick("Asteroids have", "Meteors have", "Large rocks have", "Stellar minerals have", "Space hail has", "Debris has")] been detected near your station, and a collision is possible, \ - though unlikely. Be prepared for largescale impacts and destruction. Please note that the debris will prevent the escape shuttle from arriving quickly." diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm deleted file mode 100644 index 538b11832f5..00000000000 --- a/code/game/gamemodes/meteor/meteors.dm +++ /dev/null @@ -1,348 +0,0 @@ -#define DEFAULT_METEOR_LIFETIME 1800 -GLOBAL_VAR_INIT(meteor_wave_delay, 625) //minimum wait between waves in tenths of seconds -//set to at least 100 unless you want evarr ruining every round - -//Meteors probability of spawning during a given wave -GLOBAL_LIST_INIT(meteors_normal, list(/obj/effect/meteor/dust=3, /obj/effect/meteor/medium=8, /obj/effect/meteor/big=3, \ - /obj/effect/meteor/flaming=1, /obj/effect/meteor/irradiated=3)) //for normal meteor event - -GLOBAL_LIST_INIT(meteors_threatening, list(/obj/effect/meteor/medium=4, /obj/effect/meteor/big=8, \ - /obj/effect/meteor/flaming=3, /obj/effect/meteor/irradiated=3)) //for threatening meteor event - -GLOBAL_LIST_INIT(meteors_catastrophic, list(/obj/effect/meteor/medium=5, /obj/effect/meteor/big=75, \ - /obj/effect/meteor/flaming=10, /obj/effect/meteor/irradiated=10, /obj/effect/meteor/tunguska = 1)) //for catastrophic meteor event - -GLOBAL_LIST_INIT(meteorsB, list(/obj/effect/meteor/meaty=5, /obj/effect/meteor/meaty/xeno=1)) //for meaty ore event - -GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event - - -/////////////////////////////// -//Meteor spawning global procs -/////////////////////////////// - -/proc/spawn_meteors(number = 10, list/meteortypes) - for(var/i = 0; i < number; i++) - spawn_meteor(meteortypes) - -/proc/spawn_meteor(list/meteortypes) - var/turf/pickedstart - var/turf/pickedgoal - var/max_i = 10//number of tries to spawn meteor. - while(!isspaceturf(pickedstart)) - var/startSide = pick(GLOB.cardinals) - var/startZ = pick(SSmapping.levels_by_trait(ZTRAIT_STATION)) - pickedstart = spaceDebrisStartLoc(startSide, startZ) - pickedgoal = spaceDebrisFinishLoc(startSide, startZ) - max_i-- - if(max_i<=0) - return - var/Me = pickweight(meteortypes) - var/obj/effect/meteor/M = new Me(pickedstart, pickedgoal) - M.dest = pickedgoal - -/proc/spaceDebrisStartLoc(startSide, Z) - var/starty - var/startx - switch(startSide) - if(NORTH) - starty = world.maxy-(TRANSITIONEDGE+1) - startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) - if(EAST) - starty = rand((TRANSITIONEDGE+1),world.maxy-(TRANSITIONEDGE+1)) - startx = world.maxx-(TRANSITIONEDGE+1) - if(SOUTH) - starty = (TRANSITIONEDGE+1) - startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) - if(WEST) - starty = rand((TRANSITIONEDGE+1), world.maxy-(TRANSITIONEDGE+1)) - startx = (TRANSITIONEDGE+1) - . = locate(startx, starty, Z) - -/proc/spaceDebrisFinishLoc(startSide, Z) - var/endy - var/endx - switch(startSide) - if(NORTH) - endy = (TRANSITIONEDGE+1) - endx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) - if(EAST) - endy = rand((TRANSITIONEDGE+1), world.maxy-(TRANSITIONEDGE+1)) - endx = (TRANSITIONEDGE+1) - if(SOUTH) - endy = world.maxy-(TRANSITIONEDGE+1) - endx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) - if(WEST) - endy = rand((TRANSITIONEDGE+1),world.maxy-(TRANSITIONEDGE+1)) - endx = world.maxx-(TRANSITIONEDGE+1) - . = locate(endx, endy, Z) - -/////////////////////// -//The meteor effect -////////////////////// - -/obj/effect/meteor - name = "the concept of meteor" - desc = "" - icon = 'icons/obj/meteor.dmi' - icon_state = "small" - density = TRUE - anchored = TRUE - var/hits = 4 - var/hitpwr = 2 //Level of ex_act to be called on hit. - var/dest - pass_flags = PASSTABLE - var/heavy = 0 - var/meteorsound = 'sound/blank.ogg' - var/z_original - var/threat = 0 // used for determining which meteors are most interesting - var/lifetime = DEFAULT_METEOR_LIFETIME - var/timerid = null - var/list/meteordrop = list(/obj/item/stack/ore/iron) - var/dropamt = 2 - -/obj/effect/meteor/Move() - if(z != z_original || loc == dest) - qdel(src) - return FALSE - - . = ..() //process movement... - - if(.)//.. if did move, ram the turf we get in - var/turf/T = get_turf(loc) - ram_turf(T) - - if(prob(10) && !isspaceturf(T))//randomly takes a 'hit' from ramming - get_hit() - -/obj/effect/meteor/Destroy() - if (timerid) - deltimer(timerid) - GLOB.meteor_list -= src - SSaugury.unregister_doom(src) - walk(src,0) //this cancels the walk_towards() proc - . = ..() - -/obj/effect/meteor/Initialize(mapload, target) - . = ..() - z_original = z - GLOB.meteor_list += src - SSaugury.register_doom(src, threat) - SpinAnimation() - timerid = QDEL_IN(src, lifetime) - chase_target(target) - -/obj/effect/meteor/Bump(atom/A) - if(A) - ram_turf(get_turf(A)) - playsound(src.loc, meteorsound, 40, TRUE) - get_hit() - -/obj/effect/meteor/proc/ram_turf(turf/T) - //first bust whatever is in the turf - for(var/atom/A in T) - if(A != src) - if(isliving(A)) - A.visible_message(span_warning("[src] slams into [A]."), span_danger("[src] slams into you!.")) - A.ex_act(hitpwr) - - //then, ram the turf if it still exists - if(T) - T.ex_act(hitpwr) - - - -//process getting 'hit' by colliding with a dense object -//or randomly when ramming turfs -/obj/effect/meteor/proc/get_hit() - hits-- - if(hits <= 0) - make_debris() - meteor_effect() - qdel(src) - -/obj/effect/meteor/ex_act() - return - -/obj/effect/meteor/examine(mob/user) - . = ..() - if(!(flags_1 & ADMIN_SPAWNED_1) && isliving(user)) - user.client.give_award(/datum/award/achievement/misc/meteor_examine, user) - -/obj/effect/meteor/attackby(obj/item/I, mob/user, params) - if(I.tool_behaviour == TOOL_MINING) - make_debris() - qdel(src) - else - . = ..() - -/obj/effect/meteor/proc/make_debris() - for(var/throws = dropamt, throws > 0, throws--) - var/thing_to_spawn = pick(meteordrop) - new thing_to_spawn(get_turf(src)) - -/obj/effect/meteor/proc/chase_target(atom/chasing, delay = 1) - set waitfor = FALSE - if(chasing) - walk_towards(src, chasing, delay) - -/obj/effect/meteor/proc/meteor_effect() - if(heavy) - var/sound/meteor_sound = sound(meteorsound) - var/random_frequency = get_rand_frequency() - - for(var/mob/M in GLOB.player_list) - if((M.orbiting) && (SSaugury.watchers[M])) - continue - var/turf/T = get_turf(M) - if(!T || T.z != src.z) - continue - var/dist = get_dist(M.loc, src.loc) - shake_camera(M, dist > 20 ? 2 : 4, dist > 20 ? 1 : 3) - M.playsound_local(src.loc, null, 50, 1, random_frequency, 10, S = meteor_sound) - -/////////////////////// -//Meteor types -/////////////////////// - -//Dust -/obj/effect/meteor/dust - name = "space dust" - icon_state = "dust" - pass_flags = PASSTABLE | PASSGRILLE - hits = 1 - hitpwr = 3 - meteorsound = 'sound/blank.ogg' - meteordrop = list(/obj/item/stack/ore/glass) - threat = 1 - -//Medium-sized -/obj/effect/meteor/medium - name = "meteor" - dropamt = 3 - threat = 5 - -/obj/effect/meteor/medium/meteor_effect() - ..() - explosion(src.loc, 0, 1, 2, 3, 0) - -//Large-sized -/obj/effect/meteor/big - name = "big meteor" - icon_state = "large" - hits = 6 - heavy = 1 - dropamt = 4 - threat = 10 - -/obj/effect/meteor/big/meteor_effect() - ..() - explosion(src.loc, 1, 2, 3, 4, 0) - -//Flaming meteor -/obj/effect/meteor/flaming - name = "flaming meteor" - icon_state = "flaming" - hits = 5 - heavy = 1 - meteorsound = 'sound/blank.ogg' - meteordrop = list(/obj/item/stack/ore/plasma) - threat = 20 - -/obj/effect/meteor/flaming/meteor_effect() - ..() - explosion(src.loc, 1, 2, 3, 4, 0, 0, 5) - -//Radiation meteor -/obj/effect/meteor/irradiated - name = "glowing meteor" - icon_state = "glowing" - heavy = 1 - meteordrop = list(/obj/item/stack/ore/uranium) - threat = 15 - - -/obj/effect/meteor/irradiated/meteor_effect() - ..() - explosion(src.loc, 0, 0, 4, 3, 0) - new /obj/effect/decal/cleanable/greenglow(get_turf(src)) - radiation_pulse(src, 500) - -//Meaty Ore -/obj/effect/meteor/meaty - name = "meaty ore" - icon_state = "meateor" - desc = "" - hits = 2 - heavy = 1 - meteorsound = 'sound/blank.ogg' - meteordrop = list(/obj/item/reagent_containers/food/snacks/meat/slab/human, /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant, /obj/item/organ/heart, /obj/item/organ/lungs, /obj/item/organ/tongue, /obj/item/organ/appendix/) - var/meteorgibs = /obj/effect/gibspawner/generic - threat = 2 - -/obj/effect/meteor/meaty/Initialize() - for(var/path in meteordrop) - if(path == /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant) - meteordrop -= path - meteordrop += pick(subtypesof(path)) - - for(var/path in meteordrop) - if(path == /obj/item/organ/tongue) - meteordrop -= path - meteordrop += pick(typesof(path)) - return ..() - -/obj/effect/meteor/meaty/make_debris() - ..() - new meteorgibs(get_turf(src)) - - -/obj/effect/meteor/meaty/ram_turf(turf/T) - if(!isspaceturf(T)) - new /obj/effect/decal/cleanable/blood(T) - -/obj/effect/meteor/meaty/Bump(atom/A) - A.ex_act(hitpwr) - get_hit() - -//Meaty Ore Xeno edition -/obj/effect/meteor/meaty/xeno - color = "#5EFF00" - meteordrop = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno, /obj/item/organ/tongue/alien) - meteorgibs = /obj/effect/gibspawner/xeno - -/obj/effect/meteor/meaty/xeno/Initialize() - meteordrop += subtypesof(/obj/item/organ/alien) - return ..() - -/obj/effect/meteor/meaty/xeno/ram_turf(turf/T) - if(!isspaceturf(T)) - new /obj/effect/decal/cleanable/xenoblood(T) - -//Station buster Tunguska -/obj/effect/meteor/tunguska - name = "tunguska meteor" - icon_state = "flaming" - desc = "" - hits = 30 - hitpwr = 1 - heavy = 1 - meteorsound = 'sound/blank.ogg' - meteordrop = list(/obj/item/stack/ore/plasma) - threat = 50 - -/obj/effect/meteor/tunguska/Move() - . = ..() - if(.) - new /obj/effect/temp_visual/revenant(get_turf(src)) - -/obj/effect/meteor/tunguska/meteor_effect() - ..() - explosion(src.loc, 5, 10, 15, 20, 0) - -/obj/effect/meteor/tunguska/Bump() - ..() - if(prob(20)) - explosion(src.loc,2,4,6,8) -////////////////////////// -#undef DEFAULT_METEOR_LIFETIME diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index a0751cafe5f..359f65cece9 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -578,7 +578,7 @@ GLOBAL_LIST_EMPTY(possible_items) else if(targetinfo.check_special_completion(I))//Returns 1 by default. Items with special checks will return 1 if the conditions are fulfilled. return TRUE - if(targetinfo && I.type in targetinfo.altitems) //Ok, so you don't have the item. Do you have an alternative, at least? + if(targetinfo && (I.type in targetinfo.altitems)) //Ok, so you don't have the item. Do you have an alternative, at least? if(targetinfo.check_special_completion(I))//Yeah, we do! Don't return 0 if we don't though - then you could fail if you had 1 item that didn't pass and got checked first! return TRUE return FALSE @@ -689,22 +689,7 @@ GLOBAL_LIST_EMPTY(possible_items_special) captured_amount+=1 for(var/mob/living/carbon/monkey/M in A)//Monkeys are almost worthless, you failure. captured_amount+=0.1 - for(var/mob/living/carbon/alien/larva/M in A)//Larva are important for research. - if(M.stat == DEAD) - captured_amount+=0.5 - continue - captured_amount+=1 - for(var/mob/living/carbon/alien/humanoid/M in A)//Aliens are worth twice as much as humans. - if(istype(M, /mob/living/carbon/alien/humanoid/royal/queen))//Queens are worth three times as much as humans. - if(M.stat == DEAD) - captured_amount+=1.5 - else - captured_amount+=3 - continue - if(M.stat == DEAD) - captured_amount+=1 - continue - captured_amount+=2 + return captured_amount >= target_amount /datum/objective/capture/admin_edit(mob/admin) diff --git a/code/game/gamemodes/objectives_rogue.dm b/code/game/gamemodes/objectives_rogue.dm index ad0fc2c6287..d028a51b3fb 100644 --- a/code/game/gamemodes/objectives_rogue.dm +++ b/code/game/gamemodes/objectives_rogue.dm @@ -15,7 +15,7 @@ if(C) explanation_text = "Feed [C.banditgoal] mammon to an idol of greed." else - explanation_text = "Pray to ZIZO." + explanation_text = "Pray to LEVISHTH." /datum/objective/delf @@ -35,7 +35,7 @@ if(C) explanation_text = "Feed [C.delfgoal] honeys to the mother." else - explanation_text = "Pray to ZIZO." + explanation_text = "Pray to LEVISHTH." /datum/objective/werewolf name = "conquer" diff --git a/code/game/gamemodes/roguetown/chaosmode.dm b/code/game/gamemodes/roguetown/chaosmode.dm deleted file mode 100644 index 44ecdac6d44..00000000000 --- a/code/game/gamemodes/roguetown/chaosmode.dm +++ /dev/null @@ -1,408 +0,0 @@ -// traitors, bandits, pro thieves, werewolves, vampires, demons, cultists -/* - -/datum/game_mode/chaosmode - name = "chaosmode" - config_tag = "chaosmode" - report_type = "chaosmode" - false_report_weight = 0 - required_players = 0 - required_enemies = 0 - recommended_enemies = 0 - enemy_minimum_age = 0 - - announce_span = "danger" - announce_text = "The" - - var/allmig = FALSE - var/roguefight = FALSE - var/redscore = 0 - var/greenscore = 0 - - var/list/allantags = list() - - var/datum/team/roguecultists - - var/list/datum/mind/villains = list() - var/list/datum/mind/vampires = list() - var/list/datum/mind/werewolves = list() - var/list/datum/mind/bandits = list() - - var/list/datum/mind/pre_villains = list() - var/list/datum/mind/pre_werewolves = list() - var/list/datum/mind/pre_vampires = list() - var/list/datum/mind/pre_bandits = list() - var/list/datum/mind/pre_delfs = list() - var/list/datum/mind/pre_rebels = list() - - var/banditcontrib = 0 - var/banditgoal = 1 - var/delfcontrib = 0 - var/delfgoal = 1 - - var/skeletons = FALSE - - var/headrebdecree = FALSE - - var/check_for_lord = TRUE - var/next_check_lord = 0 - var/missing_lord_time = FALSE - var/roundvoteend = FALSE - var/ttime - -/datum/game_mode/chaosmode/proc/reset_skeletons() - skeletons = FALSE - -/datum/game_mode/chaosmode/check_finished() - ttime = world.time - SSticker.round_start_time - if(roguefight) - if(ttime >= 30 MINUTES) - return TRUE - if((redscore >= 100) || (greenscore >= 100)) - return TRUE - return FALSE - - if(allmig) - return FALSE -/* if(ttime >= 99 MINUTES) - for(var/mob/living/carbon/human/H in GLOB.human_list) - if(H.stat != DEAD) - if(H.allmig_reward && H.key) - H.adjust_triumphs(H.allmig_reward) - H.allmig_reward = 0 - return TRUE - return FALSE*/ - - if(ttime >= GLOB.round_timer) - if(roundvoteend) - if(ttime >= (GLOB.round_timer + 15 MINUTES) ) - for(var/mob/living/carbon/human/H in GLOB.human_list) - if(H.stat != DEAD) - if(H.allmig_reward) - H.adjust_triumphs(H.allmig_reward) - H.allmig_reward = 0 - return TRUE - else - if(!SSvote.mode) - SSvote.initiate_vote("endround", pick("Zlod", "Sun King", "Gaia", "Moon Queen", "Aeon", "Gemini", "Aries")) -// if(SSshuttle.emergency && (SSshuttle.emergency.mode == SHUTTLE_ENDGAME)) -// return TRUE - - if(headrebdecree) - return TRUE - - check_for_lord() - - if(ttime > 180 MINUTES) //3 hour cutoff - return TRUE - -/datum/game_mode/chaosmode/proc/check_for_lord() - if(world.time < next_check_lord) - return - next_check_lord = world.time + 1 MINUTES - var/lord_found = FALSE - var/lord_dead = FALSE - for(var/mob/living/carbon/human/H in GLOB.human_list) - if(H.mind) - if((H.job == "Monarch" || H.job == "Queen") && (SSticker.rulermob == H)) - lord_found = TRUE - if(H.stat == DEAD) - lord_dead = TRUE - else - if(lord_dead) - lord_dead = FALSE - break - if(lord_dead || !lord_found) - if(!missing_lord_time) - missing_lord_time = world.time - if(world.time > missing_lord_time + 10 MINUTES) - missing_lord_time = world.time - addomen(OMEN_NOLORD) - return FALSE - else - return TRUE - - -/datum/game_mode/chaosmode/pre_setup() - if(allmig || roguefight) - return TRUE - for(var/A in GLOB.special_roles_rogue) - allantags |= get_players_for_role(A) - - pick_bandits() - - return TRUE - -/datum/game_mode/proc/after_DO() - return - -/datum/game_mode/chaosmode/after_DO() - if(allmig || roguefight) - return TRUE - - var/list/modez_random = list(1,2,3) - modez_random = shuffle(modez_random) - for(var/i in modez_random) - switch(i) - if(1) - if(prob(14)) - pick_rebels() - if(2) - var/amdt = max(round(num_players() / 3),1) - for(var/j in 1 to amdt) - if(prob(50)) - pick_vampires() - pick_werewolves() - else - pick_werewolves() - pick_vampires() - if(3) - if(prob(30)) - pick_maniac() - - return TRUE - -/datum/game_mode/chaosmode/proc/pick_bandits() - //BANDITS - banditgoal = rand(200,400) - restricted_jobs = list("Monarch", - "Queen", - "Merchant", - "Prophet") - var/num_bandits = 0 - if(num_players() >= 10) - num_bandits = CLAMP(round(num_players() / 2), 1, 5) - banditgoal += (num_bandits * rand(200,400)) -#ifdef TESTSERVER - num_bandits = 999 -#endif - if(num_bandits) - antag_candidates = get_players_for_role(ROLE_BANDIT, pre_do=TRUE) //pre_do checks for their preferences since they don't have a job yet - for(var/i = 0, i < num_bandits, ++i) - var/datum/mind/bandito = pick_n_take(antag_candidates) - var/found = FALSE - for(var/M in allantags) - if(M == bandito) - found = TRUE - allantags -= M - break - if(!found) - continue - pre_bandits += bandito - bandito.assigned_role = "Bandit" - bandito.special_role = "Bandit" - testing("[key_name(bandito)] has been selected as a bandit") - log_game("[key_name(bandito)] has been selected as a bandit") - for(var/antag in pre_bandits) - GLOB.pre_setup_antags |= antag - restricted_jobs = list() - -/datum/game_mode/chaosmode/proc/pick_rebels() - restricted_jobs = list() //handled after picking - var/num_rebels = 0 - if(num_players() >= 10) - num_rebels = CLAMP(round(num_players() / 3), 1, 3) - if(num_rebels) - antag_candidates = get_players_for_role(ROLE_PREBEL) - if(antag_candidates.len) - for(var/i = 0, i < num_rebels, ++i) - var/datum/mind/rebelguy = pick_n_take(antag_candidates) - if(!rebelguy) - continue - var/blockme = FALSE - if(!(rebelguy in allantags)) - blockme = TRUE - if(rebelguy.assigned_role in GLOB.garrison_positions) - blockme = TRUE - if(rebelguy.assigned_role in GLOB.noble_positions) - blockme = TRUE - if(rebelguy.assigned_role in GLOB.apprentices_positions) - blockme = TRUE - if(rebelguy.assigned_role in GLOB.church_positions) - blockme = TRUE - if(rebelguy.assigned_role in GLOB.yeoman_positions) - blockme = TRUE - if(blockme) - continue - allantags -= rebelguy - pre_rebels += rebelguy - rebelguy.special_role = "Peasant Rebel" - testing("[key_name(rebelguy)] has been selected as a Peasant Rebel") - log_game("[key_name(rebelguy)] has been selected as a Peasant Rebel") - for(var/antag in pre_rebels) - GLOB.pre_setup_antags |= antag - restricted_jobs = list() - -/datum/game_mode/chaosmode/proc/pick_maniac() - restricted_jobs = list("Monarch", - "Queen", - "Prisoner", - "Beastmaster", - "Witcher", - "Confessor", - "Watchman", - "Man at Arms", - "Veteran", - "Priest", - "Priest", - "Watchmen Captain") - antag_candidates = get_players_for_role(ROLE_NBEAST) - var/datum/mind/villain = pick_n_take(antag_candidates) - if(villain) - var/blockme = FALSE - if(!(villain in allantags)) - blockme = TRUE - if(villain.assigned_role in GLOB.apprentices_positions) - blockme = TRUE - if(villain.current) - if(villain.current.gender == FEMALE) - blockme = TRUE - if(blockme) - return - allantags -= villain - pre_villains += villain - villain.special_role = "maniac" - villain.restricted_roles = restricted_jobs.Copy() - testing("[key_name(villain)] has been selected as the [villain.special_role]") - log_game("[key_name(villain)] has been selected as the [villain.special_role]") - for(var/antag in pre_villains) - GLOB.pre_setup_antags |= antag - restricted_jobs = list() - -/datum/game_mode/chaosmode/proc/pick_vampires() - restricted_jobs = list("Priest","Prophet","Adventurer","Confessor","Watchman","Veteran","Man at Arms","Watchmen Captain") -/* var/num_vampires = rand(1,3) -#ifdef TESTSERVER - num_vampires = 100 -#endif*/ - antag_candidates = get_players_for_role(ROLE_NBEAST) - if(antag_candidates.len) - var/datum/mind/vampire = pick(antag_candidates) - var/blockme = FALSE - if(!(vampire in allantags)) - blockme = TRUE - if(vampire.assigned_role in GLOB.apprentices_positions) - blockme = TRUE - if(blockme) - return - allantags -= vampire - pre_vampires += vampire - vampire.special_role = "vampire" - vampire.restricted_roles = restricted_jobs.Copy() - testing("[key_name(vampire)] has been selected as a VAMPIRE") - log_game("[key_name(vampire)] has been selected as a [vampire.special_role]") - antag_candidates.Remove(vampire) - for(var/antag in pre_vampires) - GLOB.pre_setup_antags |= antag - restricted_jobs = list() - -/datum/game_mode/chaosmode/proc/pick_werewolves() - restricted_jobs = list("Priest","Prophet","Adventurer","Confessor","Watchman","Veteran","Man at Arms","Watchmen Captain") -/* var/num_werewolves = rand(1,3) -#ifdef TESTSERVER - num_werewolves = 100 -#endif*/ - antag_candidates = get_players_for_role(ROLE_NBEAST) - if(antag_candidates.len) - var/datum/mind/werewolf = pick(antag_candidates) - var/blockme = FALSE - if(!(werewolf in allantags)) - blockme = TRUE - if(werewolf.assigned_role in GLOB.apprentices_positions) - blockme = TRUE - if(blockme) - return - allantags -= werewolf - pre_werewolves += werewolf - werewolf.special_role = "werewolf" - werewolf.restricted_roles = restricted_jobs.Copy() - testing("[key_name(werewolf)] has been selected as a WEREWOLF") - log_game("[key_name(werewolf)] has been selected as a [werewolf.special_role]") - antag_candidates.Remove(werewolf) - for(var/antag in pre_werewolves) - GLOB.pre_setup_antags |= antag - restricted_jobs = list() - -/datum/game_mode/chaosmode/post_setup() - set waitfor = FALSE -///////////////// VILLAINS - for(var/datum/mind/traitor in pre_villains) - var/datum/antagonist/new_antag = new /datum/antagonist/maniac() - addtimer(CALLBACK(traitor, TYPE_PROC_REF(/datum/mind, add_antag_datum), new_antag), rand(10,100)) - GLOB.pre_setup_antags -= traitor - villains += traitor - -///////////////// WWOLF - for(var/datum/mind/werewolf in pre_werewolves) - var/datum/antagonist/new_antag = new /datum/antagonist/werewolf() - addtimer(CALLBACK(werewolf, TYPE_PROC_REF(/datum/mind, add_antag_datum), new_antag), rand(10,100)) - GLOB.pre_setup_antags -= werewolf - werewolves += werewolf - -///////////////// VAMPIRES - for(var/datum/mind/vampire in pre_vampires) - var/datum/antagonist/new_antag = new /datum/antagonist/vampire() - addtimer(CALLBACK(vampire, TYPE_PROC_REF(/datum/mind, add_antag_datum), new_antag), rand(10,100)) - GLOB.pre_setup_antags -= vampire - vampires += vampire - -///////////////// BANDIT - for(var/datum/mind/bandito in pre_bandits) - var/datum/antagonist/new_antag = new /datum/antagonist/bandit() - bandito.add_antag_datum(new_antag) - GLOB.pre_setup_antags -= bandito - bandits += bandito - -///////////////// REBELS - for(var/datum/mind/rebelguy in pre_rebels) - var/datum/antagonist/new_antag = new /datum/antagonist/prebel/head() - rebelguy.add_antag_datum(new_antag) - GLOB.pre_setup_antags -= rebelguy - - ..() - //We're not actually ready until all traitors are assigned. - gamemode_ready = FALSE - addtimer(VARSET_CALLBACK(src, gamemode_ready, TRUE), 101) - return TRUE - -/datum/game_mode/chaosmode/make_antag_chance(mob/living/carbon/human/character) //klatejoin - return -/////////////////// VILLAINS - var/num_villains = round((num_players() * 0.30)+1, 1) - if((villains.len + pre_villains.len) >= num_villains) //Upper cap for number of latejoin antagonists - return - if(ROLE_MANIAC in character.client.prefs.be_special) - if(!is_banned_from(character.ckey, list(ROLE_MANIAC)) && !QDELETED(character)) - if(age_check(character.client)) - if(!(character.job in restricted_jobs)) - if(prob(66)) - add_latejoin_villain(character.mind) - -/datum/game_mode/chaosmode/proc/add_latejoin_villain(datum/mind/character) - var/datum/antagonist/maniac/new_antag = new /datum/antagonist/maniac() - character.add_antag_datum(new_antag) - -/datum/game_mode/chaosmode/proc/vampire_werewolf() - var/vampyr = 0 - var/wwoelf = 0 - for(var/mob/living/carbon/human/player in GLOB.human_list) - if(player.mind) - if(player.stat != DEAD) - if(isbrain(player)) //also technically dead - continue - if(is_in_roguetown(player)) - var/datum/antagonist/D = player.mind.has_antag_datum(/datum/antagonist/werewolf) - if(D && D.increase_votepwr) - wwoelf++ - continue - D = player.mind.has_antag_datum(/datum/antagonist/vampire) - if(D && D.increase_votepwr) - vampyr++ - continue - if(vampyr) - if(!wwoelf) - return "vampire" - if(wwoelf) - if(!vampyr) - return "werewolf" -*/ diff --git a/code/game/gamemodes/roguetown/roguetown.dm b/code/game/gamemodes/roguetown/roguetown.dm index a4ea4ddc3c0..bbe5a830c27 100644 --- a/code/game/gamemodes/roguetown/roguetown.dm +++ b/code/game/gamemodes/roguetown/roguetown.dm @@ -1,5 +1,5 @@ // This mode will become the main basis for the typical roguetown round. Based off of chaos mode. -var/global/list/roguegamemodes = list("Rebellion", "Vampires and Werewolves", "Extended", "Aspirants", "Bandits", "Maniac", "Cultists", "Lich", "CANCEL") // This is mainly used for forcemgamemodes +GLOBAL_LIST_INIT(roguegamemodes, list("Rebellion", "Vampires and Werewolves", "Extended", "Aspirants", "Bandits", "Maniac", "Cultists", "Lich", "CANCEL")) // This is mainly used for forcemgamemodes /datum/game_mode/chaosmode name = "roguemode" @@ -158,7 +158,7 @@ var/global/list/roguegamemodes = list("Rebellion", "Vampires and Werewolves", "E log_game("Minor Antagonist: Maniac") if("Lich") pick_lich() - log_game("Minor Antagonist: Lich") + log_game("Minor Antagonist: Lich") if("Cultists") pick_cultist() log_game("Major Antagonist: Cultists") @@ -183,13 +183,10 @@ var/global/list/roguegamemodes = list("Rebellion", "Vampires and Werewolves", "E if(77 to 99) log_game("Major Antagonist: Extended") //gotta put something here. */ - if(0 to 25) - pick_cultist() - log_game("Major Antagonist: Cultists") - if(26 to 51) + if(0 to 50) pick_werewolves() log_game("Major Antagonist: Werewolves and Vampires") - if(52 to 99) + if(51 to 99) log_game("Major Antagonist: Extended") //gotta put something here. pick_bandits() log_game("Minor Antagonist: Bandit") @@ -205,7 +202,7 @@ var/global/list/roguegamemodes = list("Rebellion", "Vampires and Werewolves", "E // if(prob(10)) // pick_maniac() // log_game("Minor Antagonist: Maniac") - + return TRUE /datum/game_mode/chaosmode/proc/pick_bandits() @@ -214,7 +211,7 @@ var/global/list/roguegamemodes = list("Rebellion", "Vampires and Werewolves", "E restricted_jobs = list("Monarch", "Consort", "Merchant Prince", - "Prophet", + "Archpriest", "Knight") var/num_bandits = 0 if(num_players() >= 10) @@ -414,9 +411,9 @@ var/global/list/roguegamemodes = list("Rebellion", "Vampires and Werewolves", "E restricted_jobs = list( "Monarch", "Consort", - "Prophet", + "Archpriest", "Wytcher", - "Hedgeknight", + "Hedge Knight", "Hedgemaster", "Royal Guard", "Gravesinger", @@ -450,7 +447,7 @@ var/global/list/roguegamemodes = list("Rebellion", "Vampires and Werewolves", "E "Confessor", "Watchman", "Man at Arms", - "Prophet", + "Archpriest", "Watchmen Captain", "Magician", "Paladin", @@ -499,7 +496,7 @@ var/global/list/roguegamemodes = list("Rebellion", "Vampires and Werewolves", "E "Confessor", "Watchman", "Man at Arms", - "Prophet", + "Archpriest", "Watchmen Captain", "Magician", "Paladin", @@ -577,7 +574,6 @@ var/global/list/roguegamemodes = list("Rebellion", "Vampires and Werewolves", "E ///////////////// WWOLF for(var/datum/mind/werewolf in pre_werewolves) var/datum/antagonist/new_antag = new /datum/antagonist/werewolf() - //addtimer(CALLBACK(werewolf, TYPE_PROC_REF(/datum/mind, add_antag_datum), new_antag), rand(10,100)) werewolf.add_antag_datum(new_antag) GLOB.pre_setup_antags -= werewolf werewolves += werewolf @@ -640,20 +636,6 @@ var/global/list/roguegamemodes = list("Rebellion", "Vampires and Werewolves", "E /datum/game_mode/chaosmode/make_antag_chance(mob/living/carbon/human/character) //klatejoin return -//******** VILLAINS - var/num_villains = round((num_players() * 0.30)+1, 1) - if((villains.len + pre_villains.len) >= num_villains) //Upper cap for number of latejoin antagonists - return - if(ROLE_MANIAC in character.client.prefs.be_special) - if(!is_antag_banned(character.ckey, ROLE_MANIAC) && !QDELETED(character)) - if(age_check(character.client)) - if(!(character.job in restricted_jobs)) - if(prob(66)) - add_latejoin_villain(character.mind) - -/datum/game_mode/chaosmode/proc/add_latejoin_villain(datum/mind/character) - var/datum/antagonist/maniac/new_antag = new /datum/antagonist/maniac() - character.add_antag_datum(new_antag) /datum/game_mode/chaosmode/proc/vampire_werewolf() var/vampyr = 0 diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 4346619fbfb..42500145f5b 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -606,8 +606,6 @@ Class Procs: var/adjusted_climb_time = climb_time if(user.restrained()) //climbing takes twice as long when restrained. adjusted_climb_time *= 2 - if(isalien(user)) - adjusted_climb_time *= 0.25 //aliens are terrifyingly fast if(HAS_TRAIT(user, TRAIT_FREERUNNING)) //do you have any idea how fast I am??? adjusted_climb_time *= 0.5 adjusted_climb_time -= user.STASPD * 2 diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index f15836e6fe7..37e8e2bb259 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -467,15 +467,12 @@ for(var/obj/machinery/camera/C in oview(4, M)) if(C.can_use()) // check if camera disabled return C - break return null /proc/near_range_camera(mob/M) for(var/obj/machinery/camera/C in range(4, M)) if(C.can_use()) // check if camera disabled return C - break - return null /obj/machinery/camera/proc/Togglelight(on=0) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index eec03f5708e..a2d379128d7 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -63,11 +63,9 @@ if (!network) user.unset_machine() CRASH("No camera network") - return if (!(islist(network))) user.unset_machine() CRASH("Camera network is not a list") - return if(..()) user.unset_machine() return diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 1f5cbd5a2d2..9cc3f5f17ce 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -472,7 +472,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) inserted_modify_id.assignment = t1 playsound(src, 'sound/blank.ogg', 50, FALSE) if ("demote") - if(inserted_modify_id.assignment in head_subordinates || inserted_modify_id.assignment == "Assistant") + if((inserted_modify_id.assignment in head_subordinates) || inserted_modify_id.assignment == "Assistant") inserted_modify_id.assignment = "Unassigned" playsound(src, 'sound/blank.ogg', 50, FALSE) else diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index d59a207c535..36569536426 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -651,7 +651,7 @@ else . += "It looks very robust." - if(issilicon(user) && (!stat & BROKEN)) + if(issilicon(user) && !(stat & BROKEN)) . += span_notice("Shift-click [src] to [ density ? "open" : "close"] it.") . += span_notice("Ctrl-click [src] to [ locked ? "raise" : "drop"] its bolts.") . += span_notice("Alt-click [src] to [ secondsElectrified ? "un-electrify" : "permanently electrify"] it.") @@ -1223,29 +1223,6 @@ loseMainPower() loseBackupPower() -/obj/machinery/door/airlock/attack_alien(mob/living/carbon/alien/humanoid/user) - add_fingerprint(user) - if(isElectrified()) - shock(user, 100) //Mmm, fried xeno! - return - if(!density) //Already open - return - if(locked || welded) //Extremely generic, as aliens only understand the basics of how airlocks work. - to_chat(user, span_warning("[src] refuses to budge!")) - return - user.visible_message(span_warning("[user] begins prying open [src]."),\ - span_noticealien("I begin digging your claws into [src] with all your might!"),\ - span_warning("I hear groaning metal...")) - var/time_to_open = 5 - if(hasPower()) - time_to_open = 50 //Powered airlocks take longer to open, and are loud. - playsound(src, 'sound/blank.ogg', 100, TRUE) - - - if(do_after(user, time_to_open, TRUE, src)) - if(density && !open(2)) //The airlock is still closed, but something prevented it opening. (Another player noticed and bolted/welded the airlock in time!) - to_chat(user, span_warning("Despite your efforts, [src] managed to resist your attempts to open it!")) - /obj/machinery/door/airlock/hostile_lockdown(mob/origin) // Must be powered and have working AI wire. if(canAIControl(src) && !stat) diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 896f47fad7c..55d43bf83c1 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -421,20 +421,6 @@ opacity = 0 glass = TRUE -/obj/machinery/door/airlock/abductor - name = "alien airlock" - desc = "" - icon = 'icons/obj/doors/airlocks/abductor/abductor_airlock.dmi' - overlays_file = 'icons/obj/doors/airlocks/abductor/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_abductor - note_overlay_file = 'icons/obj/doors/airlocks/external/overlays.dmi' - damage_deflection = 30 - explosion_block = 3 - hackProof = TRUE - aiControlDisabled = 1 - normal_integrity = 700 - security_level = 1 - ////////////////////////////////// /* Cult Airlocks diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 66c337740d4..fba860a547a 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -339,10 +339,7 @@ /obj/machinery/door/proc/crush() for(var/mob/living/L in get_turf(src)) L.visible_message(span_warning("[src] closes on [L], crushing [L.p_them()]!"), span_danger("[src] closes on you and crushes you!")) - if(isalien(L)) //For xenos - L.adjustBruteLoss(DOOR_CRUSH_DAMAGE * 1.5) //Xenos go into crit after aproximately the same amount of crushes as humans. - L.emote("roar") - else if(ishuman(L)) //For humans + if(ishuman(L)) //For humans L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) L.emote("scream") L.Paralyze(100) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 710b4a5592c..ddfda5821fe 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -154,13 +154,6 @@ /obj/machinery/door/firedoor/attack_robot(mob/user) return attack_ai(user) -/obj/machinery/door/firedoor/attack_alien(mob/user) - add_fingerprint(user) - if(welded) - to_chat(user, span_warning("[src] refuses to budge!")) - return - open() - /obj/machinery/door/firedoor/do_animate(animation) switch(animation) if("opening") diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm deleted file mode 100644 index cbe3c437229..00000000000 --- a/code/game/machinery/droneDispenser.dm +++ /dev/null @@ -1,260 +0,0 @@ -#define DRONE_PRODUCTION "production" -#define DRONE_RECHARGING "recharging" -#define DRONE_READY "ready" - -/obj/machinery/droneDispenser //Most customizable machine 2015 - name = "drone shell dispenser" - desc = "" - - icon = 'icons/obj/machines/droneDispenser.dmi' - icon_state = "on" - density = TRUE - - max_integrity = 250 - integrity_failure = 0.33 - - // These allow for different icons when creating custom dispensers - var/icon_off = "off" - var/icon_on = "on" - var/icon_recharging = "recharge" - var/icon_creating = "make" - - var/list/using_materials - var/starting_amount = 0 - var/metal_cost = 1000 - var/glass_cost = 1000 - var/power_used = 1000 - - var/mode = DRONE_READY - var/timer - var/cooldownTime = 1800 //3 minutes - var/production_time = 30 - //The item the dispenser will create - var/dispense_type = /obj/effect/mob_spawn/drone - - // The maximum number of "idle" drone shells it will make before - // ceasing production. Set to 0 for infinite. - var/maximum_idle = 3 - - var/work_sound = 'sound/blank.ogg' - var/create_sound = 'sound/blank.ogg' - var/recharge_sound = 'sound/blank.ogg' - - var/begin_create_message = "whirs to life!" - var/end_create_message = "dispenses a drone shell." - var/recharge_message = "pings." - var/recharging_text = "It is whirring and clicking. It seems to be recharging." - -/obj/machinery/droneDispenser/Initialize() - . = ..() - var/datum/component/material_container/materials = AddComponent(/datum/component/material_container, list(/datum/material/iron, /datum/material/glass), MINERAL_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, TRUE, /obj/item/stack) - materials.insert_amount_mat(starting_amount) - materials.precise_insertion = TRUE - using_materials = list(/datum/material/iron = metal_cost, /datum/material/glass = glass_cost) - -/obj/machinery/droneDispenser/preloaded - starting_amount = 5000 - -/obj/machinery/droneDispenser/syndrone //Please forgive me - name = "syndrone shell dispenser" - desc = "" - dispense_type = /obj/effect/mob_spawn/drone/syndrone - //If we're gonna be a jackass, go the full mile - 10 second recharge timer - cooldownTime = 100 - end_create_message = "dispenses a suspicious drone shell." - starting_amount = 25000 - -/obj/machinery/droneDispenser/syndrone/badass //Please forgive me - name = "badass syndrone shell dispenser" - desc = "" - dispense_type = /obj/effect/mob_spawn/drone/syndrone/badass - end_create_message = "dispenses an ominous suspicious drone shell." - -// I don't need your forgiveness, this is awesome. -/obj/machinery/droneDispenser/snowflake - name = "snowflake drone shell dispenser" - desc = "" - dispense_type = /obj/effect/mob_spawn/drone/snowflake - end_create_message = "dispenses a snowflake drone shell." - // Those holoprojectors aren't cheap - metal_cost = 2000 - glass_cost = 2000 - power_used = 2000 - starting_amount = 10000 - -// If the derelict gets lonely, make more friends. -/obj/machinery/droneDispenser/derelict - name = "derelict drone shell dispenser" - desc = "" - dispense_type = /obj/effect/mob_spawn/drone/derelict - end_create_message = "dispenses a derelict drone shell." - metal_cost = 10000 - glass_cost = 5000 - starting_amount = 0 - cooldownTime = 600 - -// An example of a custom drone dispenser. -// This one requires no materials and creates basic hivebots -/obj/machinery/droneDispenser/hivebot - name = "hivebot fabricator" - desc = "" - icon = 'icons/obj/objects.dmi' - icon_state = "hivebot_fab" - icon_off = "hivebot_fab" - icon_on = "hivebot_fab" - icon_recharging = "hivebot_fab" - icon_creating = "hivebot_fab_on" - metal_cost = 0 - glass_cost = 0 - power_used = 0 - cooldownTime = 10 //Only 1 second - hivebots are extremely weak - dispense_type = /mob/living/simple_animal/hostile/hivebot - begin_create_message = "closes and begins fabricating something within." - end_create_message = "slams open, revealing a hivebot!" - recharge_sound = null - recharge_message = null - -/obj/machinery/droneDispenser/swarmer - name = "swarmer fabricator" - desc = "" - icon = 'icons/obj/machines/gateway.dmi' - icon_state = "toffcenter" - icon_off = "toffcenter" - icon_on = "toffcenter" - icon_recharging = "toffcenter" - icon_creating = "offcenter" - metal_cost = 0 - glass_cost = 0 - cooldownTime = 300 //30 seconds - maximum_idle = 0 // Swarmers have no restraint - dispense_type = /obj/effect/mob_spawn/swarmer - begin_create_message = "hums softly as an interface appears above it, scrolling by at unreadable speed." - end_create_message = "materializes a strange shell, which drops to the ground." - recharging_text = "Its lights are slowly increasing in brightness." - work_sound = 'sound/blank.ogg' - create_sound = 'sound/blank.ogg' - break_sound = 'sound/blank.ogg' - break_message = "slowly falls dark, lights stuttering." - -/obj/machinery/droneDispenser/examine(mob/user) - . = ..() - if((mode == DRONE_RECHARGING) && !stat && recharging_text) - . += span_warning("[recharging_text]") - -/obj/machinery/droneDispenser/process() - ..() - if((stat & (NOPOWER|BROKEN)) || !anchored) - return - - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - if(!materials.has_materials(using_materials)) - return // We require more minerals - - // We are currently in the middle of something - if(timer > world.time) - return - - switch(mode) - if(DRONE_READY) - // If we have X drone shells already on our turf - if(maximum_idle && (count_shells() >= maximum_idle)) - return // then do nothing; check again next tick - if(begin_create_message) - visible_message(span_notice("[src] [begin_create_message]")) - if(work_sound) - playsound(src, work_sound, 50, TRUE) - mode = DRONE_PRODUCTION - timer = world.time + production_time - update_icon() - - if(DRONE_PRODUCTION) - materials.use_materials(using_materials) - if(power_used) - use_power(power_used) - - var/atom/A = new dispense_type(loc) - A.flags_1 |= (flags_1 & ADMIN_SPAWNED_1) - - if(create_sound) - playsound(src, create_sound, 50, TRUE) - if(end_create_message) - visible_message(span_notice("[src] [end_create_message]")) - - mode = DRONE_RECHARGING - timer = world.time + cooldownTime - update_icon() - - if(DRONE_RECHARGING) - if(recharge_sound) - playsound(src, recharge_sound, 50, TRUE) - if(recharge_message) - visible_message(span_notice("[src] [recharge_message]")) - - mode = DRONE_READY - update_icon() - -/obj/machinery/droneDispenser/proc/count_shells() - . = 0 - for(var/a in loc) - if(istype(a, dispense_type)) - .++ - -/obj/machinery/droneDispenser/update_icon_state() - if(stat & (BROKEN|NOPOWER)) - icon_state = icon_off - else if(mode == DRONE_RECHARGING) - icon_state = icon_recharging - else if(mode == DRONE_PRODUCTION) - icon_state = icon_creating - else - icon_state = icon_on - -/obj/machinery/droneDispenser/attackby(obj/item/I, mob/living/user) - if(I.tool_behaviour == TOOL_CROWBAR) - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - materials.retrieve_all() - I.play_tool_sound(src) - to_chat(user, span_notice("I retrieve the materials from [src].")) - - else if(I.tool_behaviour == TOOL_WELDER) - if(!(stat & BROKEN)) - to_chat(user, span_warning("[src] doesn't need repairs.")) - return - - if(!I.tool_start_check(user, amount=1)) - return - - user.visible_message( - span_notice("[user] begins patching up [src] with [I]."), - span_notice("I begin restoring the damage to [src]...")) - - if(!I.use_tool(src, user, 40, volume=50, amount=1)) - return - - user.visible_message( - span_notice("[user] fixes [src]!"), - span_notice("I restore [src] to operation.")) - - stat &= ~BROKEN - obj_integrity = max_integrity - update_icon() - else - return ..() - -/obj/machinery/droneDispenser/obj_break(damage_flag) - . = ..() - if(!.) - return - if(break_message) - audible_message(span_warning("[src] [break_message]")) - if(break_sound) - playsound(src, break_sound, 50, TRUE) - -/obj/machinery/droneDispenser/deconstruct(disassembled = TRUE) - if(!(flags_1 & NODECONSTRUCT_1)) - new /obj/item/stack/sheet/metal(loc, 5) - qdel(src) - -#undef DRONE_PRODUCTION -#undef DRONE_RECHARGING -#undef DRONE_READY diff --git a/code/game/machinery/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm index a5931aa6523..98b0e8f903a 100644 --- a/code/game/machinery/medical_kiosk.dm +++ b/code/game/machinery/medical_kiosk.dm @@ -134,17 +134,6 @@ qdel(scanner_wand) return ..() -/obj/machinery/medical_kiosk/emag_act(mob/living/emagger) - ..() - if(obj_flags & EMAGGED) - return - emagger.visible_message(span_warning("[emagger] waves a suspicious card by the [src]'s biometric scanner!"), - span_notice("I overload the sensory electronics, the diagnostic readouts start jittering across the screen..")) - obj_flags |= EMAGGED - var/obj/item/circuitboard/computer/cargo/board = circuit - board.obj_flags |= EMAGGED //Mirrors emag status onto the board as well. - pandemonium = TRUE - /obj/machinery/medical_kiosk/examine(mob/user) . = ..() if(scanner_wand == null) diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 61c6a68b3da..c11954dda0b 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -28,6 +28,8 @@ var/turf/T = loc hide(T.intact) + if(!codes) + return if(codes["patrol"]) if(!GLOB.navbeacons["[z]"]) GLOB.navbeacons["[z]"] = list() diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 3d589879cbc..a1af95c6702 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -822,7 +822,6 @@ GLOBAL_LIST_EMPTY(allCasters) scanned_user = "[ai_user.name] ([ai_user.job])" else CRASH("Invalid user for this proc") - return /obj/machinery/newscaster/proc/print_paper() SSblackbox.record_feedback("amount", "newspapers_printed", 1) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 75b6d501a57..b47e5c84dd8 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -829,7 +829,7 @@ /obj/machinery/turretid/examine(mob/user) . += ..() - if(issilicon(user) && (!stat & BROKEN)) + if(issilicon(user) && !(stat & BROKEN)) . += {"Ctrl-click [src] to [ enabled ? "disable" : "enable"] turrets. Alt-click [src] to set turrets to [ lethal ? "stun" : "kill"]."} diff --git a/code/game/machinery/porta_turret/portable_turret_cover.dm b/code/game/machinery/porta_turret/portable_turret_cover.dm index dd90d082357..a6706d08ca9 100644 --- a/code/game/machinery/porta_turret/portable_turret_cover.dm +++ b/code/game/machinery/porta_turret/portable_turret_cover.dm @@ -73,9 +73,6 @@ /obj/machinery/porta_turret_cover/attacked_by(obj/item/I, mob/user) parent_turret.attacked_by(I, user) -/obj/machinery/porta_turret_cover/attack_alien(mob/living/carbon/alien/humanoid/user) - parent_turret.attack_alien(user) - /obj/machinery/porta_turret_cover/attack_animal(mob/living/simple_animal/user) parent_turret.attack_animal(user) diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 3c7556744d4..3f636aad76b 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -305,7 +305,7 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) radio_freq = FREQ_ENGINEERING if("security") radio_freq = FREQ_SECURITY - if("cargobay" || "mining") + if("cargobay", "mining") radio_freq = FREQ_SUPPLY var/datum/signal/subspace/messaging/rc/signal = new(src, list( diff --git a/code/game/machinery/telecomms/machines/receiver.dm b/code/game/machinery/telecomms/machines/receiver.dm index fce83e248f9..fb2119a656a 100644 --- a/code/game/machinery/telecomms/machines/receiver.dm +++ b/code/game/machinery/telecomms/machines/receiver.dm @@ -33,7 +33,7 @@ for(var/obj/machinery/telecomms/hub/H in links) for(var/obj/machinery/telecomms/relay/R in H.links) - if(R.can_receive(signal) && R.z in signal.levels) + if(R.can_receive(signal) && (R.z in signal.levels)) return TRUE return FALSE diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm index 690ec0e7283..a810a8fa1a9 100644 --- a/code/game/mecha/combat/durand.dm +++ b/code/game/mecha/combat/durand.dm @@ -91,7 +91,7 @@ Expects a turf. Returns true if the attack should be blocked, false if not.*/ . = TRUE return -obj/mecha/combat/durand/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, armor_penetration = 0) +/obj/mecha/combat/durand/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, armor_penetration = 0) if(defense_check(user.loc)) log_message("Attack absorbed by defense field. Attacker - [user].", LOG_MECHA, color="orange") shield.attack_generic(user, damage_amount, damage_type, damage_flag, sound_effect, armor_penetration) @@ -113,7 +113,7 @@ obj/mecha/combat/durand/attack_generic(mob/user, damage_amount = 0, damage_type else . = ..() -/obj/mecha/combat/durand/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) +/obj/mecha/combat/durand/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum, d_type = "blunt") if(defense_check(AM.loc)) log_message("Impact with [AM] absorbed by defense field.", LOG_MECHA, color="orange") shield.hitby(AM, skipcatch, hitpush, blocked, throwingdatum) diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm index a7078bd46a1..a217b37dd8e 100644 --- a/code/game/mecha/equipment/tools/mining_tools.dm +++ b/code/game/mecha/equipment/tools/mining_tools.dm @@ -126,10 +126,7 @@ //blood splatters var/splatter_dir = get_dir(chassis, target) - if(isalien(target)) - new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target.drop_location(), splatter_dir) - else - new /obj/effect/temp_visual/dir_setting/bloodsplatter(target.drop_location(), splatter_dir) + new /obj/effect/temp_visual/dir_setting/bloodsplatter(target.drop_location(), splatter_dir) //organs go everywhere if(target_part && prob(10 * drill_level)) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 7a933c1b9c9..f824c65ef20 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -926,7 +926,7 @@ return /obj/mecha/proc/moved_inside(mob/living/carbon/human/H) - if(H && H.client && H in range(1)) + if(H && H.client && (H in range(1))) occupant = H H.forceMove(src) H.update_mouse_pointer() diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index aebfcb9b90d..f4ddeed8597 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -15,7 +15,7 @@ switch(damage_flag) if("fire") check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL)) - if("blunt" || "slash" || "stab") + if("blunt", "slash", "stab") check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) else check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT)) @@ -66,11 +66,6 @@ /obj/mecha/attack_paw(mob/user as mob) return attack_hand(user) -/obj/mecha/attack_alien(mob/living/user) - log_message("Attack by alien. Attacker - [user].", LOG_MECHA, color="red") - playsound(src.loc, 'sound/blank.ogg', 100, TRUE) - attack_generic(user, 15, BRUTE, "slash", 0) - /obj/mecha/attack_animal(mob/living/simple_animal/user) log_message("Attack by simple animal. Attacker - [user].", LOG_MECHA, color="red") if(!user.melee_damage_upper && !user.obj_damage) @@ -106,7 +101,7 @@ /obj/mecha/attack_tk() return -/obj/mecha/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) //wrapper +/obj/mecha/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum, d_type = "blunt") //wrapper log_message("Hit by [AM].", LOG_MECHA, color="red") . = ..() diff --git a/code/game/objects/effects/alien_acid.dm b/code/game/objects/effects/alien_acid.dm index 3fe017fd383..d9ed0805796 100644 --- a/code/game/objects/effects/alien_acid.dm +++ b/code/game/objects/effects/alien_acid.dm @@ -63,30 +63,3 @@ acid_level = max(0, acid_level - acid_used*10) playsound(L, 'sound/blank.ogg', 50, TRUE) to_chat(L, span_danger("[src] burns you!")) - -//xenomorph corrosive acid -/obj/effect/acid/alien - var/target_strength = 30 - - -/obj/effect/acid/alien/process() - . = ..() - if(.) - if(prob(45)) - playsound(loc, 'sound/blank.ogg', 100, TRUE) - target_strength-- - if(target_strength <= 0) - target.visible_message(span_warning("[target] collapses under its own weight into a puddle of goop and undigested debris!")) - target.acid_melt() - qdel(src) - else - - switch(target_strength) - if(24) - visible_message(span_warning("[target] is holding up against the acid!")) - if(16) - visible_message(span_warning("[target] is being melted by the acid!")) - if(8) - visible_message(span_warning("[target] is struggling to withstand the acid!")) - if(4) - visible_message(span_warning("[target] begins to crumble under the acid!")) diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 25a2d978fe2..bea8b95027b 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -4,6 +4,7 @@ name = "kneestingers" desc = "" anchored = TRUE + max_integrity = 1 //its a stupid mushroom opacity = 0 density = FALSE icon = 'icons/roguetown/misc/foliage.dmi' @@ -13,6 +14,13 @@ blade_dulling = DULLING_CUT resistance_flags = FLAMMABLE +/obj/structure/glowshroom/Initialize(mapload) + . = ..() + //50% chance on creation to be glowshroom instead of kneestinger + if(prob(50) && mapload) + new /obj/structure/safeglowshroom(src.loc) + qdel(src) + /obj/structure/glowshroom/fire_act(added, maxstacks) visible_message(span_warning("[src] catches fire!")) var/turf/T = get_turf(src) @@ -27,7 +35,7 @@ if(HAS_TRAIT(L, TRAIT_KNEESTINGER_IMMUNITY)) //Dendor kneestinger immunity return TRUE - if(L.electrocute_act(30, src)) + if(L.electrocute_act(10, src)) L.consider_ambush() if(L.throwing) L.throwing.finalize(FALSE) @@ -41,7 +49,7 @@ var/mob/living/L = AM if(L.z == z) if(!HAS_TRAIT(L, TRAIT_KNEESTINGER_IMMUNITY)) - if(L.electrocute_act(30, src)) + if(L.electrocute_act(10, src)) L.emote("painscream") L.update_sneak_invis(TRUE) L.consider_ambush() @@ -51,7 +59,7 @@ if(isliving(user) && W && user.z == z) if(W.flags_1 & CONDUCT_1) var/mob/living/L = user - if(L.electrocute_act(30, src)) // The kneestingers will let you pass if you worship dendor, but they won't take your stupid ass hitting them. + if(L.electrocute_act(15, src)) // The kneestingers will let you pass if you worship dendor, but they won't take your stupid ass hitting them. L.emote("painscream") L.consider_ambush() if(L.throwing) @@ -84,3 +92,62 @@ var/obj/effect/decal/cleanable/molten_object/I = new (get_turf(src)) I.desc = "" qdel(src) + +/obj/structure/safeglowshroom + name = "glowshroom" + desc = "the actually liked sibling of kneestingers." + anchored = TRUE + opacity = 0 + max_integrity = 10 + density = FALSE + icon = 'icons/roguetown/misc/foliage.dmi' + icon_state = "glowshroom1" //replaced in New + color = "#00fffb" + layer = ABOVE_NORMAL_TURF_LAYER + max_integrity = 30 + blade_dulling = DULLING_CUT + resistance_flags = FLAMMABLE + debris = list(/obj/item/natural/fibers = 1, /obj/item/reagent_containers/food/snacks/grown/shroom = 1) + +/obj/structure/safeglowshroom/fire_act(added, maxstacks) + visible_message(span_warning("[src] catches fire!")) + var/turf/T = get_turf(src) + qdel(src) + new /obj/effect/hotspot(T) + +/obj/structure/safeglowshroom/New(loc, obj/item/seeds/newseed, mutate_stats) + ..() + set_light(1.5, 1.5, "#00fffb") + + icon_state = "glowshroom[rand(1,3)]" + + pixel_x = rand(-4, 4) + pixel_y = rand(0,5) + +/obj/structure/safeglowshroom/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) + if(damage_type == BURN && damage_amount) + playsound(src.loc, 'sound/blank.ogg', 100, TRUE) + +/obj/structure/safeglowshroom/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + if(exposed_temperature > 300) + take_damage(5, BURN, 0, 0) + +/obj/structure/safeglowshroom/acid_act(acidpwr, acid_volume) + . = 1 + visible_message(span_danger("[src] melts away!")) + var/obj/effect/decal/cleanable/molten_object/I = new (get_turf(src)) + I.desc = "" + qdel(src) + +/obj/structure/safeglowshroom/Destroy() + var/datum/reagents/R = new/datum/reagents(25) + R.my_atom = src + R.add_reagent(/datum/reagent/toxin/berrypoison, 25) + var/datum/effect_system/smoke_spread/chem/smoke = new + smoke.set_up(R, 6, get_turf(src), FALSE) + smoke.start() + . = ..() + +//used by stupid spell +/obj/structure/glowshroom/proc/destroy() + qdel(src) diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 6f1c368bcf4..bf228fc1eec 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -42,14 +42,12 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) if(delete_after_roundstart) qdel(src) -/obj/effect/landmark/start/New() +/obj/effect/landmark/start/Initialize() GLOB.start_landmarks_list += src if(jobspawn_override.len) for(var/X in jobspawn_override) - if(!GLOB.jobspawn_overrides[X]) - GLOB.jobspawn_overrides[X] = list() - GLOB.jobspawn_overrides[X] += src - ..() + LAZYADD(GLOB.jobspawn_overrides[X], src) + . = ..() if(name != "start") tag = "start*[name]" @@ -64,7 +62,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) icon_state = "generic_event" /obj/effect/landmark/events/haunts/Initialize(mapload) - ..() + . = ..() GLOB.hauntstart += src icon_state = "" @@ -75,7 +73,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) var/aportalloc = "a" /obj/effect/landmark/events/testportal/Initialize(mapload) - ..() + . = ..() // GLOB.hauntstart += loc #ifdef TESTSERVER var/obj/structure/fluff/testportal/T = new /obj/structure/fluff/testportal(loc) @@ -241,7 +239,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) icon_state = "arrow" /obj/effect/landmark/start/priest - name = "Prophet" + name = "Archpriest" icon_state = "arrow" /obj/effect/landmark/start/cleric @@ -249,7 +247,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) icon_state = "arrow" /obj/effect/landmark/start/monk - name = "Priest" + name = "Monk" icon_state = "arrow" /obj/effect/landmark/start/druid @@ -420,6 +418,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) /obj/effect/landmark/start/adventurer name = "Adventurer" icon_state = "arrow" + delete_after_roundstart = FALSE // used by mob spawners //yrf @@ -725,7 +724,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) icon_state = "wiznerd_spawn" /obj/effect/landmark/start/wizard/Initialize() - ..() + . = ..() GLOB.wizardstart += loc /obj/effect/landmark/start/nukeop @@ -734,7 +733,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) icon_state = "snukeop_spawn" /obj/effect/landmark/start/nukeop/Initialize() - ..() + . = ..() GLOB.nukeop_start += loc /obj/effect/landmark/start/bandit @@ -743,7 +742,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) icon_state = "arrow" /obj/effect/landmark/start/bandit/Initialize() - ..() + . = ..() GLOB.bandit_starts += loc @@ -753,7 +752,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) icon_state = "arrow" /obj/effect/landmark/start/delf/Initialize() - ..() + . = ..() GLOB.delf_starts += loc @@ -763,7 +762,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) icon_state = "snukeop_leader_spawn" /obj/effect/landmark/start/nukeop_leader/Initialize() - ..() + . = ..() GLOB.nukeop_leader_start += loc // Must be immediate because players will @@ -774,14 +773,14 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) name = "New Player" /obj/effect/landmark/start/new_player/Initialize() - ..() + . = ..() GLOB.newplayer_start += loc /obj/effect/landmark/latejoin name = "JoinLate" /obj/effect/landmark/latejoin/Initialize(mapload) - ..() + . = ..() SSjob.latejoin_trackers += loc return INITIALIZE_HINT_QDEL @@ -795,16 +794,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) name = "Observer-Start" icon_state = "x" -//xenos, morphs and nightmares spawn here -/obj/effect/landmark/xeno_spawn - name = "xeno_spawn" - icon_state = "xeno_spawn" - -/obj/effect/landmark/xeno_spawn/Initialize(mapload) - ..() - GLOB.xeno_spawn += loc - return INITIALIZE_HINT_QDEL - //objects with the stationloving component (nuke disk) respawn here. //also blobs that have their spawn forcemoved (running out of time when picking their spawn spot), santa and respawning devils /obj/effect/landmark/blobstart @@ -812,7 +801,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) icon_state = "blob_start" /obj/effect/landmark/blobstart/Initialize(mapload) - ..() + . = ..() GLOB.blobstart += loc return INITIALIZE_HINT_QDEL @@ -822,7 +811,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) icon_state = "secequipment" /obj/effect/landmark/secequipment/Initialize(mapload) - ..() + . = ..() GLOB.secequipment += loc return INITIALIZE_HINT_QDEL @@ -832,7 +821,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) icon_state = "prisonwarp" /obj/effect/landmark/prisonwarp/Initialize(mapload) - ..() + . = ..() GLOB.prisonwarp += loc return INITIALIZE_HINT_QDEL @@ -841,7 +830,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) icon_state = "ert_spawn" /obj/effect/landmark/ert_spawn/Initialize(mapload) - ..() + . = ..() GLOB.emergencyresponseteamspawn += loc return INITIALIZE_HINT_QDEL @@ -851,7 +840,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) icon_state = "holding_facility" /obj/effect/landmark/holding_facility/Initialize(mapload) - ..() + . = ..() GLOB.holdingfacility += loc return INITIALIZE_HINT_QDEL @@ -860,7 +849,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) icon_state = "tdome_observer" /obj/effect/landmark/thunderdome/observe/Initialize(mapload) - ..() + . = ..() GLOB.tdomeobserve += loc return INITIALIZE_HINT_QDEL @@ -869,7 +858,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) icon_state = "tdome_t1" /obj/effect/landmark/thunderdome/one/Initialize(mapload) - ..() + . = ..() GLOB.tdome1 += loc return INITIALIZE_HINT_QDEL @@ -878,7 +867,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) icon_state = "tdome_t2" /obj/effect/landmark/thunderdome/two/Initialize(mapload) - ..() + . = ..() GLOB.tdome2 += loc return INITIALIZE_HINT_QDEL @@ -887,7 +876,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) icon_state = "tdome_admin" /obj/effect/landmark/thunderdome/admin/Initialize(mapload) - ..() + . = ..() GLOB.tdomeadmin += loc return INITIALIZE_HINT_QDEL @@ -898,8 +887,8 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) layer = HIGH_LANDMARK_LAYER -/obj/effect/landmark/event_spawn/New() - ..() +/obj/effect/landmark/event_spawn/Initialize() + . = ..() GLOB.generic_event_spawns += src /obj/effect/landmark/event_spawn/Destroy() @@ -909,9 +898,9 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) /obj/effect/landmark/ruin var/datum/map_template/ruin/ruin_template -/obj/effect/landmark/ruin/New(loc, my_ruin_template) +/obj/effect/landmark/ruin/Initialize(ml, my_ruin_template) name = "ruin_[GLOB.ruin_landmarks.len + 1]" - ..(loc) + . = ..() ruin_template = my_ruin_template GLOB.ruin_landmarks |= src @@ -978,7 +967,7 @@ GLOBAL_LIST_EMPTY(travel_spawn_points) return point.loc return null -/proc/create_travel_tiles(var/atom/location, travel_id, travel_goes_to_id, required_trait, tile_path) +/proc/create_travel_tiles(atom/location, travel_id, travel_goes_to_id, required_trait, tile_path) for(var/obj/effect/landmark/travel_tile_location/landmark as anything in GLOB.travel_tile_locations) if(get_dist(location, landmark) > 5) continue diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm index e591fac8378..e25a49b1ae5 100644 --- a/code/game/objects/effects/spawners/gibspawner.dm +++ b/code/game/objects/effects/spawners/gibspawner.dm @@ -93,52 +93,6 @@ gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) return ..() - - -/obj/effect/gibspawner/xeno - gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/up, /obj/effect/decal/cleanable/xenoblood/xgibs/down, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/body, /obj/effect/decal/cleanable/xenoblood/xgibs/limb, /obj/effect/decal/cleanable/xenoblood/xgibs/core) - gibamounts = list(1, 1, 1, 1, 1, 1, 1) - gib_mob_type = /mob/living/carbon/alien - -/obj/effect/gibspawner/xeno/Initialize() - if(!gibdirections.len) - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) - return ..() - - -/obj/effect/gibspawner/xeno/bodypartless //only the gibs that don't look like actual full bodyparts (except torso). - gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/core, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/core, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/torso) - gibamounts = list(1, 1, 1, 1, 1, 1) - - -/obj/effect/gibspawner/xeno/bodypartless/Initialize() - if(!gibdirections.len) - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) - return ..() - - - -/obj/effect/gibspawner/larva - gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body, /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body) - gibamounts = list(1, 1, 1, 1) - gib_mob_type = /mob/living/carbon/alien/larva - -/obj/effect/gibspawner/larva/Initialize() - if(!gibdirections.len) - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list(), GLOB.alldirs) - return ..() - -/obj/effect/gibspawner/larva/bodypartless - gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva) - gibamounts = list(1, 1, 1) - -/obj/effect/gibspawner/larva/bodypartless/Initialize() - if(!gibdirections.len) - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list()) - return ..() - - - /obj/effect/gibspawner/robot sparks = 1 gibtypes = list(/obj/effect/decal/cleanable/robot_debris/up, /obj/effect/decal/cleanable/robot_debris/down, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/robot_debris/limb) diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 45ad43578b7..af089d96075 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -156,29 +156,6 @@ "" = 80 ) -/obj/effect/spawner/lootdrop/organ_spawner - name = "organ spawner" - loot = list( - /obj/item/organ/heart/gland/electric = 3, - /obj/item/organ/heart/gland/trauma = 4, - /obj/item/organ/heart/gland/egg = 7, - /obj/item/organ/heart/gland/chem = 5, - /obj/item/organ/heart/gland/mindshock = 5, - /obj/item/organ/heart/gland/plasma = 7, - /obj/item/organ/heart/gland/transform = 5, - /obj/item/organ/heart/gland/slime = 4, - /obj/item/organ/heart/gland/spiderman = 5, - /obj/item/organ/heart/gland/ventcrawling = 1, - /obj/item/organ/body_egg/alien_embryo = 1, - /obj/item/organ/regenerative_core = 2) - lootcount = 3 - -/obj/effect/spawner/lootdrop/two_percent_xeno_egg_spawner - name = "2% chance xeno egg spawner" - loot = list( - /obj/effect/decal/remains/xeno = 49, - /obj/effect/spawner/xeno_egg_delivery = 1) - /obj/effect/spawner/lootdrop/costume name = "random costume spawner" diff --git a/code/game/objects/effects/spawners/roguemapgen.dm b/code/game/objects/effects/spawners/roguemapgen.dm index e1db12df409..df41d372bad 100644 --- a/code/game/objects/effects/spawners/roguemapgen.dm +++ b/code/game/objects/effects/spawners/roguemapgen.dm @@ -1,33 +1,28 @@ /obj/effect/spawner/roguemap/Initialize(mapload) - START_PROCESSING(SSmapgen, src) + ..() + do_spawn() + return INITIALIZE_HINT_QDEL -/obj/effect/spawner/roguemap - icon = 'icons/obj/structures_spawners.dmi' - var/probby = 100 - var/list/spawned - -/obj/effect/spawner/roguemap/process() +/obj/effect/spawner/roguemap/proc/do_spawn() if(prob(probby)) var/obj/new_type = pick(spawned) new new_type(get_turf(src)) - STOP_PROCESSING(SSmapgen, src) - qdel(src) +/obj/effect/spawner/roguemap + icon = 'icons/obj/structures_spawners.dmi' + var/probby = 100 + var/list/spawned /obj/effect/spawner/roguemap/pit icon_state = "pit" -/obj/effect/spawner/roguemap/pit/process() +/obj/effect/spawner/roguemap/pit/do_spawn() var/turf/T = get_turf(src) var/turf/below = get_step_multiz(src, DOWN) if(below) T.ChangeTurf(/turf/open/transparent/openspace) below.ChangeTurf(/turf/open/floor/rogue/dirt/road) - STOP_PROCESSING(SSmapgen, src) - qdel(src) - - /obj/effect/spawner/roguemap/tree icon_state = "tree" name = "Tree spawner" @@ -74,4 +69,4 @@ icon_state = "beartrap" name = "beartrap" probby = 50 - spawned = list(/obj/item/restraints/legcuffs/beartrap/armed/camouflage) \ No newline at end of file + spawned = list(/obj/item/restraints/legcuffs/beartrap/armed/camouflage) diff --git a/code/game/objects/effects/spawners/xeno_egg_delivery.dm b/code/game/objects/effects/spawners/xeno_egg_delivery.dm index 111fcc42040..a04f8a8cc7f 100644 --- a/code/game/objects/effects/spawners/xeno_egg_delivery.dm +++ b/code/game/objects/effects/spawners/xeno_egg_delivery.dm @@ -8,7 +8,6 @@ ..() var/turf/T = get_turf(src) - new /obj/structure/alien/egg(T) new /obj/effect/temp_visual/gravpush(T) playsound(T, 'sound/blank.ogg', 50, TRUE, -1) diff --git a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm index 005f5f2d31f..59010f34deb 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm @@ -38,4 +38,4 @@ icon_state = "wormhole_g" /obj/effect/projectile/impact/pointline - icon_state = "impact_point" \ No newline at end of file + icon_state = "impact_point" diff --git a/code/game/objects/inhands_rogue.dm b/code/game/objects/inhands_rogue.dm index 9e32b1a7ecb..6d7eafa7e80 100644 --- a/code/game/objects/inhands_rogue.dm +++ b/code/game/objects/inhands_rogue.dm @@ -1,5 +1,6 @@ /obj/item - var/list/onprop = list() + /// A lazylist to store inhands data. + var/list/onprop var/d_type = "blunt" //#ifdef TESTSERVER var/force_reupdate_inhand = TRUE @@ -32,6 +33,8 @@ var/static/list/onmob_sprites = list() var/icon/onmob = onmob_sprites["[tag][behind][mirrored][used_index]"] if(!onmob || force_reupdate_inhand) + if(force_reupdate_inhand) + has_behind_state = null onmob = fcopy_rsc(generateonmob(tag, prop, behind, mirrored)) onmob_sprites["[tag][behind][mirrored][used_index]"] = onmob return onmob @@ -68,6 +71,26 @@ if(0.7) return 1 +// For checking if we have a specific icon state in an icon. +// Cached cause asking icons is expensive. This is still expensive, so avoid using it if +// you can reasonably expect the icon_state to exist beforehand, or if you can cache the +// value somewhere. +GLOBAL_LIST_EMPTY(icon_state_cache) +/proc/check_state_in_icon(checkstate, checkicon) + // isicon() is apparently quite expensive so short-circuit out early if we can. + if(!istext(checkstate) || isnull(checkicon) || !(isfile(checkicon) || isicon(checkicon))) + return FALSE + var/checkkey = "\ref[checkicon]" + var/list/check = GLOB.icon_state_cache[checkkey] + if(!check) + check = list() + for(var/istate in icon_states(checkicon)) + check[istate] = TRUE + GLOB.icon_state_cache[checkkey] = check + . = check[checkstate] + +/obj/item/var/has_behind_state + /obj/item/proc/generateonmob(tag, prop, behind, mirrored) var/list/used_prop = prop var/UH = 64 @@ -77,18 +100,14 @@ var/icon/blended var/skipoverlays = FALSE if(behind) - var/icon/J = new(icon) - var/list/istates = J.IconStates() - if(istates.Find("[icon_state]_behind")) + if(isnull(has_behind_state)) + has_behind_state = check_state_in_icon(icon, "[icon_state]_behind") + if(has_behind_state) blended=icon("icon"=icon, "icon_state"="[icon_state]_behind") skipoverlays = TRUE else - // blended=icon("icon"=icon, "icon_state"=icon_state) -// blended=getFlatIcon(src) blended=icon("icon"=icon, "icon_state"=icon_state) else - // blended=icon("icon"=icon, "icon_state"=icon_state) -// blended=getFlatIcon(src) blended=icon("icon"=icon, "icon_state"=icon_state) if(!blended) @@ -716,16 +735,10 @@ if(!used_cat) used_cat = "gen" - for(var/X in I.onprop) - if(X == used_cat) - var/list/L = I.onprop[X] - if(L.len) - if(!needtofind in L) - L += needtofind - for(var/P in L) - if(P == needtofind) - L[P] += 0.1 - to_chat(LI, "[needtofind] = [L[P]]") + if(length(I.onprop?[used_cat])) + var/list/L = I.onprop[used_cat] + L[needtofind] += 0.1 + to_chat(LI, "[needtofind] = [L[needtofind]]") LI.update_inv_hands() LI.update_inv_belt() LI.update_inv_back() @@ -760,16 +773,10 @@ if(!used_cat) used_cat = "gen" - for(var/X in I.onprop) - if(X == used_cat) - var/list/L = I.onprop[X] - if(L.len) - if(!needtofind in L) - L += needtofind - for(var/P in L) - if(P == needtofind) - L[P] -= 0.1 - to_chat(LI, "[needtofind] = [L[P]]") + if(length(I.onprop?[used_cat])) + var/list/L = I.onprop[used_cat] + L[needtofind] -= 0.1 + to_chat(LI, "[needtofind] = [L[needtofind]]") LI.update_inv_hands() LI.update_inv_belt() LI.update_inv_back() diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 4fd3024040d..ed9c9c08603 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -586,16 +586,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if(!user.put_in_active_hand(src, FALSE, FALSE)) user.dropItemToGround(src) -/obj/item/attack_alien(mob/user) - var/mob/living/carbon/alien/A = user - - if(!A.has_fine_manipulation) - if(src in A.contents) // To stop Aliens having items stuck in their pockets - A.dropItemToGround(src) - to_chat(user, span_warning("My claws aren't capable of such fine manipulation!")) - return - attack_paw(A) - /obj/item/attack_ai(mob/user) if(istype(src.loc, /obj/item/robot_module)) //If the item is part of a cyborg module, equip it @@ -759,10 +749,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) to_chat(user, span_warning("You're going to need to remove [M.p_their()] eye protection first!")) return - if(isalien(M))//Aliens don't have eyes./N slimes also don't have eyes! - to_chat(user, span_warning("I cannot locate any eyes on this creature!")) - return - if(isbrain(M)) to_chat(user, span_warning("I cannot locate any organic eyes on this brain!")) return diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm index 2f11f96b6b2..8af77e1d464 100644 --- a/code/game/objects/items/RCL.dm +++ b/code/game/objects/items/RCL.dm @@ -212,7 +212,6 @@ continue if(C.d1 == 0) return C - break return diff --git a/code/game/objects/items/body_egg.dm b/code/game/objects/items/body_egg.dm deleted file mode 100644 index 10b341fafe4..00000000000 --- a/code/game/objects/items/body_egg.dm +++ /dev/null @@ -1,53 +0,0 @@ -/obj/item/organ/body_egg - name = "body egg" - desc = "" - icon_state = "innards" - zone = BODY_ZONE_CHEST - slot = ORGAN_SLOT_PARASITE_EGG - -/obj/item/organ/body_egg/on_find(mob/living/finder) - ..() - to_chat(finder, span_warning("I found an unknown alien organism in [owner]'s [zone]!")) - -/obj/item/organ/body_egg/Initialize() - . = ..() - if(iscarbon(loc)) - Insert(loc) - -/obj/item/organ/body_egg/Insert(mob/living/carbon/M, special = 0) - ..() - ADD_TRAIT(owner, TRAIT_XENO_HOST, TRAIT_GENERIC) - ADD_TRAIT(owner, TRAIT_XENO_IMMUNE, "xeno immune") - owner.med_hud_set_status() - INVOKE_ASYNC(src, PROC_REF(AddInfectionImages), owner) - -/obj/item/organ/body_egg/Remove(mob/living/carbon/M, special = 0) - if(owner) - REMOVE_TRAIT(owner, TRAIT_XENO_HOST, TRAIT_GENERIC) - REMOVE_TRAIT(owner, TRAIT_XENO_IMMUNE, "xeno immune") - owner.med_hud_set_status() - INVOKE_ASYNC(src, PROC_REF(RemoveInfectionImages), owner) - ..() - -/obj/item/organ/body_egg/on_death() - . = ..() - if(!owner) - return - egg_process() - -/obj/item/organ/body_egg/on_life() - . = ..() - egg_process() - -/obj/item/organ/body_egg/proc/egg_process() - return - -/obj/item/organ/body_egg/proc/RefreshInfectionImage() - RemoveInfectionImages() - AddInfectionImages() - -/obj/item/organ/body_egg/proc/AddInfectionImages() - return - -/obj/item/organ/body_egg/proc/RemoveInfectionImages() - return diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 7b9134172d4..a8b846a68d7 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -144,11 +144,6 @@ icon_state = "engineering" build_path = /obj/machinery/computer/monitor/secret -/obj/item/circuitboard/computer/sat_control - name = "Satellite Network Control (Computer Board)" - icon_state = "engineering" - build_path = /obj/machinery/computer/sat_control - /obj/item/circuitboard/computer/solar_control name = "Solar Control (Computer Board)" //name fixed 250810 icon_state = "engineering" @@ -428,53 +423,6 @@ //Service -//Supply - -/obj/item/circuitboard/computer/bounty - name = "Nanotrasen Bounty Console (Computer Board)" - icon_state = "supply" - build_path = /obj/machinery/computer/bounty - -/obj/item/circuitboard/computer/cargo - name = "Supply Console (Computer Board)" - icon_state = "supply" - build_path = /obj/machinery/computer/cargo - var/contraband = FALSE - -/obj/item/circuitboard/computer/cargo/multitool_act(mob/living/user) - . = ..() - if(!(obj_flags & EMAGGED)) - contraband = !contraband - to_chat(user, span_notice("Receiver spectrum set to [contraband ? "Broad" : "Standard"].")) - else - to_chat(user, span_alert("The spectrum chip is unresponsive.")) - -/obj/item/circuitboard/computer/cargo/emag_act(mob/living/user) - if(!(obj_flags & EMAGGED)) - contraband = TRUE - obj_flags |= EMAGGED - to_chat(user, span_notice("I adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.")) - -/obj/item/circuitboard/computer/cargo/express - name = "Express Supply Console (Computer Board)" - build_path = /obj/machinery/computer/cargo/express - -/obj/item/circuitboard/computer/cargo/express/multitool_act(mob/living/user) - . = ..() - if (!(obj_flags & EMAGGED)) - to_chat(user, span_alert("Routing protocols are already set to: \"factory defaults\".")) - else - to_chat(user, span_notice("I reset the routing protocols to: \"factory defaults\".")) - obj_flags &= ~EMAGGED - -/obj/item/circuitboard/computer/cargo/express/emag_act(mob/living/user) - to_chat(user, span_notice("I change the routing protocols, allowing the Drop Pod to land anywhere on the station.")) - obj_flags |= EMAGGED - -/obj/item/circuitboard/computer/cargo/request - name = "Supply Request Console (Computer Board)" - build_path = /obj/machinery/computer/cargo/request - /obj/item/circuitboard/computer/ferry name = "Transport Ferry (Computer Board)" icon_state = "supply" diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index db50ffb759a..24719505a94 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -222,7 +222,7 @@ . = TRUE if("select_stencil") var/stencil = params["item"] - if(stencil in all_drawables + randoms) + if(stencil in (all_drawables + randoms)) drawtype = stencil . = TRUE text_buffer = "" @@ -314,7 +314,7 @@ temp = "symbol" else if(drawing in drawings) temp = "drawing" - else if(drawing in graffiti|oriented) + else if((drawing in graffiti) || (drawing in oriented)) temp = "graffiti" diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index d768af01d79..3af4d168670 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -432,7 +432,7 @@ if(req_defib) to_chat(user, span_warning("The instructions on [defib] don't mention how to revive that...")) else - to_chat(user, span_warning("I aren't sure how to revive that...")) + to_chat(user, span_warning("I'm not sure how to revive that...")) return var/mob/living/carbon/H = M diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 6db6699eb3b..a1011b44aec 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -142,9 +142,6 @@ /obj/effect/dummy/chameleon/attack_slime() master.disrupt() -/obj/effect/dummy/chameleon/attack_alien() - master.disrupt() - /obj/effect/dummy/chameleon/ex_act(S, T) contents_explosion(S, T) master.disrupt() diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 954a802e90e..a68b6407132 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -530,7 +530,7 @@ //On exiting the lantern /obj/item/flashlight/flare/torch/lantern/Exited(atom/movable/occupant) - if(occupant in occupants && isliving(occupant)) + if(isliving(occupant) && (occupant in occupants)) //var/mob/living/L = occupant occupants -= occupant //occupant_weight -= L.mob_size @@ -645,7 +645,7 @@ //Adds the seelie to the list of occupants /obj/item/flashlight/flare/torch/lantern/proc/add_occupant(mob/living/occupant) - if(occupant in occupants || !istype(occupant)) + if((occupant in occupants) || !istype(occupant)) return occupant.forceMove(src) occupants += occupant @@ -738,7 +738,7 @@ return TRUE /obj/item/flashlight/emp/attack(mob/living/M, mob/living/user) - if(on && user.zone_selected in list(BODY_ZONE_PRECISE_R_EYE, BODY_ZONE_PRECISE_MOUTH)) // call original attack when examining organs + if(on && (user.zone_selected in list(BODY_ZONE_PRECISE_R_EYE, BODY_ZONE_PRECISE_MOUTH))) // call original attack when examining organs ..() return diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index 0f67c001624..150de292f26 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -95,7 +95,7 @@ /obj/item/dice/d6 name = "d6" -obj/item/dice/d6/ebony +/obj/item/dice/d6/ebony name = "ebony die" desc = "" icon_state = "de6" diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index 9eb9a2de5b5..fdf6d61057f 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -9,6 +9,7 @@ var/reading = FALSE //sanity var/oneuse = TRUE //default this is true, but admins can var this to 0 if we wanna all have a pass around of the rod form book var/used = FALSE //only really matters if oneuse but it might be nice to know if someone's used it for admin investigations perhaps + var/required_trait = null /obj/item/book/granter/proc/turn_page(mob/user) playsound(user, pick('sound/blank.ogg'), 30, TRUE) @@ -54,6 +55,10 @@ if(user.STAINT < 8) to_chat(user, span_warning("You can't make sense of the sprawling runes!")) return FALSE + if(required_trait) + if(!HAS_TRAIT(user, required_trait)) + to_chat(user, span_warning("You can't figure out a way to use this!")) + return if(used) if(oneuse) recoil(user) @@ -255,6 +260,7 @@ /obj/item/book/granter/spell var/spell var/spellname = "conjure bugs" + required_trait = TRAIT_USEMAGICITEM /obj/item/book/granter/spell/already_known(mob/user) if(!spell) diff --git a/code/game/objects/items/implants/implant_abductor.dm b/code/game/objects/items/implants/implant_abductor.dm deleted file mode 100644 index b95321a2f66..00000000000 --- a/code/game/objects/items/implants/implant_abductor.dm +++ /dev/null @@ -1,35 +0,0 @@ -/obj/item/implant/abductor - name = "recall implant" - desc = "" - icon = 'icons/obj/abductor.dmi' - icon_state = "implant" - activated = 1 - var/obj/machinery/abductor/pad/home - var/cooldown = 60 SECONDS - var/on_cooldown - -/obj/item/implant/abductor/activate() - . = ..() - if(on_cooldown) - to_chat(imp_in, span_warning("I must wait [timeleft(on_cooldown)*0.1] seconds to use [src] again!")) - return - - home.Retrieve(imp_in,1) - on_cooldown = addtimer(VARSET_CALLBACK(src, on_cooldown, null), cooldown) - -/obj/item/implant/abductor/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE) - if(..()) - var/obj/machinery/abductor/console/console - if(ishuman(target)) - var/datum/antagonist/abductor/A = target.mind.has_antag_datum(/datum/antagonist/abductor) - if(A) - console = get_abductor_console(A.team.team_number) - home = console.pad - - if(!home) - var/list/consoles = list() - for(var/obj/machinery/abductor/console/C in GLOB.machines) - consoles += C - console = pick(consoles) - home = console.pad - return TRUE diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 5aba74cf9ea..4e14b81f137 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -608,9 +608,6 @@ if (!on) return if (is_type_in_typecache(target, ovens)) - // if (held_sausage && held_sausage.roasted) - // to_chat(span_warning("My [held_sausage] has already been cooked!")) - // return if (istype(target, /obj/singularity) && get_dist(user, target) < 10) to_chat(user, span_notice("I send [held_sausage] towards [target].")) playsound(src, 'sound/blank.ogg', 50, TRUE) diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm index 22f7f63ff99..4e5eedcbd20 100644 --- a/code/game/objects/items/pet_carrier.dm +++ b/code/game/objects/items/pet_carrier.dm @@ -30,13 +30,13 @@ return ..() /obj/item/pet_carrier/Exited(atom/movable/occupant) - if(occupant in occupants && isliving(occupant)) + if((occupant in occupants) && isliving(occupant)) var/mob/living/L = occupant occupants -= occupant occupant_weight -= L.mob_size /obj/item/pet_carrier/handle_atom_del(atom/A) - if(A in occupants && isliving(A)) + if((A in occupants) && isliving(A)) var/mob/living/L = A occupants -= L occupant_weight -= L.mob_size @@ -178,7 +178,7 @@ add_occupant(target) /obj/item/pet_carrier/proc/add_occupant(mob/living/occupant) - if(occupant in occupants || !istype(occupant)) + if((occupant in occupants) || !istype(occupant)) return occupant.forceMove(src) occupants += occupant diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm index 9780f959292..4a768337808 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -50,9 +50,9 @@ if(H.stat == DEAD || H == user) continue if(H.mind && (has_job_loyalties || has_role_loyalties)) - if(has_job_loyalties && H.mind.assigned_role in job_loyalties) + if(has_job_loyalties && (H.mind.assigned_role in job_loyalties)) inspired += H - else if(has_role_loyalties && H.mind.special_role in role_loyalties) + else if(has_role_loyalties && (H.mind.special_role in role_loyalties)) inspired += H else if(check_inspiration(H)) inspired += H diff --git a/code/game/objects/items/rogueitems/books.dm b/code/game/objects/items/rogueitems/books.dm index 6a49b2e1774..5ce115a80c1 100644 --- a/code/game/objects/items/rogueitems/books.dm +++ b/code/game/objects/items/rogueitems/books.dm @@ -203,7 +203,7 @@ user.say(m) /obj/item/book/rogue/bibble/attack(mob/living/M, mob/user) - if(user.mind && user.mind.assigned_role == "Prophet") + if(user.mind && user.mind.assigned_role == "Archpriest") if(!user.can_read(src)) to_chat(user, span_warning("I don't understand these scribbly black lines.")) return @@ -394,7 +394,7 @@ base_icon_state = "basic_book" override_find_book = TRUE -/obj/item/book/rogue/playerbook/Initialize(loc, in_round_player_generated, var/mob/living/in_round_player_mob, text) +/obj/item/book/rogue/playerbook/Initialize(loc, in_round_player_generated, mob/living/in_round_player_mob, text) . = ..() is_in_round_player_generated = in_round_player_generated if(is_in_round_player_generated) diff --git a/code/game/objects/items/rogueitems/gems.dm b/code/game/objects/items/rogueitems/gems.dm index 80ba3f6ea86..e012054280f 100644 --- a/code/game/objects/items/rogueitems/gems.dm +++ b/code/game/objects/items/rogueitems/gems.dm @@ -189,10 +189,11 @@ icon_state = null /obj/item/roguegem/random/Initialize() + SHOULD_CALL_PARENT(FALSE) var/newgem = list(/obj/item/roguegem/red = 10, /obj/item/roguegem/green = 25, /obj/item/roguegem/blue = 15, /obj/item/roguegem/yellow = 30, /obj/item/roguegem/violet = 20, /obj/item/roguegem/diamond = 5, /obj/item/riddleofsteel = 1, /obj/item/rogueore/silver = 3) var/pickgem = pickweight(newgem) new pickgem(get_turf(src)) - qdel(src) + return INITIALIZE_HINT_QDEL /// riddle @@ -247,7 +248,7 @@ . = 1 /obj/item/riddleofsteel/Initialize() - ..() + . = ..() set_light(2, 1, "#ff0d0d") /obj/item/reagent_containers/powder/mfire/Initialize() diff --git a/code/game/objects/items/rogueitems/instruments.dm b/code/game/objects/items/rogueitems/instruments.dm index 9d5c2852e85..c98d6513b66 100644 --- a/code/game/objects/items/rogueitems/instruments.dm +++ b/code/game/objects/items/rogueitems/instruments.dm @@ -97,8 +97,9 @@ soundloop.start() for(var/mob/living/carbon/human/L in viewers(7)) L.add_stress(stressevent) - var/datum/status_effect/buff/healing/musicalhealing/heal_effect = L.apply_status_effect(/datum/status_effect/buff/healing/musicalhealing) - heal_effect.healing_on_tick = healthbonus + if(L.mind) + var/datum/status_effect/buff/healing/musicalhealing/heal_effect = L.apply_status_effect(/datum/status_effect/buff/healing/musicalhealing) + heal_effect.healing_on_tick = healthbonus else playing = FALSE soundloop.stop() @@ -154,7 +155,10 @@ "Tip Thine Tankard" = 'sound/music/instruments/lute (4).ogg', "A Reed On the Wind" = 'sound/music/instruments/lute (5).ogg', "Jests On Steel Ears" = 'sound/music/instruments/lute (6).ogg', - "Merchant in the Mire" = 'sound/music/instruments/lute (7).ogg') + "Merchant in the Mire" = 'sound/music/instruments/lute (7).ogg', + "The Power" = 'modular_stonehedge/sound/music/instruments/lute (8).ogg', + "Bard Dance" = 'modular_stonehedge/sound/music/instruments/lute (9).ogg', + "Old Time Battles" = 'modular_stonehedge/sound/music/instruments/lute (10).ogg') /obj/item/rogue/instrument/accord name = "accordion" @@ -201,7 +205,10 @@ "Rous in the Cellar" = 'sound/music/instruments/flute (3).ogg', "Her Boots, So Incandescent" = 'sound/music/instruments/flute (4).ogg', "Moondust Minx" = 'sound/music/instruments/flute (5).ogg', - "Quest to the Ends" = 'sound/music/instruments/flute (6).ogg',) + "Quest to the Ends" = 'sound/music/instruments/flute (6).ogg', + "The Power" = 'modular_stonehedge/sound/music/instruments/flute (7).ogg', + "Bard Dance" = 'modular_stonehedge/sound/music/instruments/flute (8).ogg', + "Old Time Battles" = 'modular_stonehedge/sound/music/instruments/flute (9).ogg') // "Spit Shine" = 'sound/music/instruments/flute (7).ogg') Doesnt exist on HS /obj/item/rogue/instrument/drum diff --git a/code/game/objects/items/rogueitems/keyrings.dm b/code/game/objects/items/rogueitems/keyrings.dm index 1fd7474f729..0117e18e8b5 100644 --- a/code/game/objects/items/rogueitems/keyrings.dm +++ b/code/game/objects/items/rogueitems/keyrings.dm @@ -259,7 +259,7 @@ keys = list(/obj/item/roguekey/farm, /obj/item/roguekey/butcher) /obj/item/storage/keyring/veteran - keys = list(/obj/item/roguekey/veteran, /obj/item/roguekey/vault) + keys = list(/obj/item/roguekey/veteran, /obj/item/roguekey/vault, /obj/item/roguekey/steward, /obj/item/roguekey/keep_dungeon, /obj/item/roguekey/town_dungeon, /obj/item/roguekey/bog_barracks, /obj/item/roguekey/keep_barracks, /obj/item/roguekey/walls, /obj/item/roguekey/graveyard) /obj/item/storage/keyring/sheriff keys = list(/obj/item/roguekey/sheriff_office, /obj/item/roguekey/keep_dungeon, /obj/item/roguekey/town_dungeon, /obj/item/roguekey/bog_barracks, /obj/item/roguekey/keep_barracks, /obj/item/roguekey/walls, /obj/item/roguekey/manor, /obj/item/roguekey/graveyard) diff --git a/code/game/objects/items/rogueitems/keys.dm b/code/game/objects/items/rogueitems/keys.dm index 7861608037b..c580c449536 100644 --- a/code/game/objects/items/rogueitems/keys.dm +++ b/code/game/objects/items/rogueitems/keys.dm @@ -269,7 +269,7 @@ name = "priest's key" desc = "This is the master key of the church." icon_state = "cheesekey" - lockid = "Prophet" + lockid = "Archpriest" /obj/item/roguekey/tower name = "tower key" diff --git a/code/game/objects/items/rogueitems/natural/dirtclod.dm b/code/game/objects/items/rogueitems/natural/dirtclod.dm index a35f9b09dbd..af9904aebc2 100644 --- a/code/game/objects/items/rogueitems/natural/dirtclod.dm +++ b/code/game/objects/items/rogueitems/natural/dirtclod.dm @@ -81,4 +81,4 @@ /obj/structure/fluff/clodpile/Initialize() dir = pick(GLOB.cardinals) - ..() \ No newline at end of file + ..() diff --git a/code/game/objects/items/rogueitems/natural/feather.dm b/code/game/objects/items/rogueitems/natural/feather.dm index cc0517ed756..6314c139248 100644 --- a/code/game/objects/items/rogueitems/natural/feather.dm +++ b/code/game/objects/items/rogueitems/natural/feather.dm @@ -15,4 +15,4 @@ max_integrity = 20 muteinmouth = TRUE spitoutmouth = FALSE - w_class = WEIGHT_CLASS_TINY \ No newline at end of file + w_class = WEIGHT_CLASS_TINY diff --git a/code/game/objects/items/rogueitems/natural/poo.dm b/code/game/objects/items/rogueitems/natural/poo.dm index add5be45e77..210dd390d53 100644 --- a/code/game/objects/items/rogueitems/natural/poo.dm +++ b/code/game/objects/items/rogueitems/natural/poo.dm @@ -15,4 +15,4 @@ /obj/item/natural/poo/horse name = "droppings" desc = "Smells bad, but you know it's just grass." - icon_state = "horsepoo" \ No newline at end of file + icon_state = "horsepoo" diff --git a/code/game/objects/items/rogueitems/natural/stones.dm b/code/game/objects/items/rogueitems/natural/stones.dm index 585959e15eb..d1aa5091098 100644 --- a/code/game/objects/items/rogueitems/natural/stones.dm +++ b/code/game/objects/items/rogueitems/natural/stones.dm @@ -100,7 +100,7 @@ GLOBAL_LIST_INIT(stone_personalities, list( "Goring", "Destruction", "Hell", - "Zizo", + "Levishth", "Flames", "Darkness", "Light", diff --git a/code/game/objects/items/rogueitems/prosthetics.dm b/code/game/objects/items/rogueitems/prosthetics.dm index 97b8b94483a..30f4ca8d9e7 100644 --- a/code/game/objects/items/rogueitems/prosthetics.dm +++ b/code/game/objects/items/rogueitems/prosthetics.dm @@ -1,4 +1,4 @@ -/obj/item/bodypart/proc/prosthetic_attachment(var/mob/living/carbon/human/H, var/mob/user) +/obj/item/bodypart/proc/prosthetic_attachment(mob/living/carbon/human/H, mob/user) if(!ishuman(H)) return @@ -57,6 +57,9 @@ icon = 'icons/roguetown/items/misc.dmi' icon_state = "prc_arm" prosthetic_prefix = "prc" + brute_reduction = 10 + burn_reduction = 10 + max_damage = 50 fingers = TRUE sellprice = 50 @@ -105,6 +108,9 @@ icon = 'icons/roguetown/items/misc.dmi' icon_state = "prc_arm" prosthetic_prefix = "prc" + brute_reduction = 10 + burn_reduction = 10 + max_damage = 50 fingers = TRUE sellprice = 50 @@ -155,6 +161,9 @@ icon = 'icons/roguetown/items/misc.dmi' icon_state = "prc_leg" prosthetic_prefix = "prc" + brute_reduction = 10 + burn_reduction = 10 + max_damage = 50 organ_slowdown = 0 sellprice = 50 @@ -205,8 +214,11 @@ icon = 'icons/roguetown/items/misc.dmi' icon_state = "prc_leg" prosthetic_prefix = "prc" + brute_reduction = 10 + burn_reduction = 10 + max_damage = 50 organ_slowdown = 0 sellprice = 50 /obj/item/bodypart/r_leg/rprosthetic/attack(mob/living/M, mob/user) - prosthetic_attachment(M, user) \ No newline at end of file + prosthetic_attachment(M, user) diff --git a/code/game/objects/items/rogueweapons/intents.dm b/code/game/objects/items/rogueweapons/intents.dm index 9aaebd26486..8d7276d34c5 100644 --- a/code/game/objects/items/rogueweapons/intents.dm +++ b/code/game/objects/items/rogueweapons/intents.dm @@ -250,6 +250,11 @@ volume = 100 extra_range = 3 +/datum/looping_sound/unholy + mid_sounds = list('sound/vo/mobs/ghost/whisper (1).ogg') + mid_length = 320 + volume = 100 + extra_range = 3 /datum/looping_sound/invokeholy mid_sounds = list('sound/magic/holycharging.ogg') @@ -489,8 +494,7 @@ animname = "cut" blade_class = BCLASS_CHOP hitsound = "genslash" - penfactor = 230 - damfactor = 40 + penfactor = 80 candodge = TRUE canparry = TRUE miss_text = "slashes the air!" diff --git a/code/game/objects/items/rogueweapons/melee/axes.dm b/code/game/objects/items/rogueweapons/melee/axes.dm index 078a7f25b6b..e71e9ed5185 100644 --- a/code/game/objects/items/rogueweapons/melee/axes.dm +++ b/code/game/objects/items/rogueweapons/melee/axes.dm @@ -74,9 +74,6 @@ return list("shrink" = 0.3,"sx" = -2,"sy" = -5,"nx" = 4,"ny" = -5,"wx" = 0,"wy" = -5,"ex" = 2,"ey" = -5,"nturn" = 0,"sturn" = 0,"wturn" = 0,"eturn" = 0,"nflip" = 0,"sflip" = 0,"wflip" = 0,"eflip" = 0,"northabove" = 0,"southabove" = 1,"eastabove" = 1,"westabove" = 0) return ..() - - . = ..() - /datum/intent/axe/chop/stone penfactor = 5 @@ -134,6 +131,7 @@ return ..() /obj/item/rogueweapon/stoneaxe/battle/equipped(mob/user, slot, initial = FALSE) + . = ..() pickup_sound = pick("modular_helmsguard/sound/sheath_sounds/draw_polearm.ogg", "modular_helmsguard/sound/sheath_sounds/draw_spear.ogg") sheathe_sound = 'sound/items/wood_sharpen.ogg' diff --git a/code/game/objects/items/rogueweapons/melee/blunt.dm b/code/game/objects/items/rogueweapons/melee/blunt.dm index e23a9136471..ccf836bf603 100644 --- a/code/game/objects/items/rogueweapons/melee/blunt.dm +++ b/code/game/objects/items/rogueweapons/melee/blunt.dm @@ -185,8 +185,8 @@ smeltresult = /obj/item/ash minstr = 0 -/obj/item/rogueweapon/mace/woodclub/New() - ..() +/obj/item/rogueweapon/mace/woodclub/Initialize(mapload) + . = ..() icon_state = "club[rand(1,2)]" /datum/intent/mace/strike/wood diff --git a/code/game/objects/items/rogueweapons/melee/knives.dm b/code/game/objects/items/rogueweapons/melee/knives.dm index 3ec57301b59..7e3a9a2fcc3 100644 --- a/code/game/objects/items/rogueweapons/melee/knives.dm +++ b/code/game/objects/items/rogueweapons/melee/knives.dm @@ -338,6 +338,6 @@ desc = "This ominous, jeweled dagger was crafted by the assassin race of nite elves." force = 22 sellprice = 75 - icon = 'modular_stonehedge/icons/roguetown/weapons/32.dmi' + icon = 'modular_stonehedge/licensed-eaglephntm/icons/roguetown/weapons/32.dmi' icon_state = "drowdagger" item_state = "drowdag" diff --git a/code/game/objects/items/rogueweapons/melee/special.dm b/code/game/objects/items/rogueweapons/melee/special.dm index 2830b75f9a9..f9379e61df9 100644 --- a/code/game/objects/items/rogueweapons/melee/special.dm +++ b/code/game/objects/items/rogueweapons/melee/special.dm @@ -146,6 +146,21 @@ if(istype(I)) I.afterchange() +/obj/item/rogueweapon/mace/stunmace/hedgeknight/funny_attack_effects(mob/living/target, mob/living/user, nodmg) + . = ..() + if(on) + target.electrocute_act(15, src) + target.Paralyze(10 SECONDS)//STR maxxers cannot be reliably chained, so electrocution may be used as an alternative. + charge -= 25 + if(charge <= 0) + on = FALSE + charge = 0 + update_icon() + if(user.a_intent) + var/datum/intent/I = user.a_intent + if(istype(I)) + I.afterchange() + /obj/item/rogueweapon/mace/stunmace/update_icon() if(on) icon_state = "stunmace1" @@ -198,6 +213,50 @@ update_icon() playsound(src, pick('sound/items/stunmace_toggle (1).ogg','sound/items/stunmace_toggle (2).ogg','sound/items/stunmace_toggle (3).ogg'), 100, TRUE) +/obj/item/rogueweapon/mace/stunmace/hedgeknight + force = 15 + force_wielded = 15 + name = "hedgeknight stunmace" + icon_state = "stunmace0" + desc = "Upon closer inspection, this mace has kneestingers growing all throughout it, rather than being powered by a battery. Only the Hedgeknights themselves bear the fortitude to hold it." + gripped_intents = null + w_class = WEIGHT_CLASS_NORMAL + possible_item_intents = list(/datum/intent/mace/strike/stunner, /datum/intent/mace/smash/stunner) + wbalance = 0 + minstr = 5 + wdefense = 0 + charge = 300 + on = FALSE + +/obj/item/rogueweapon/mace/stunmace/hedgeknight/pickup(mob/user) + . = ..() + var/mob/living/carbon/human/H = user + if(!HAS_TRAIT(H, TRAIT_SHOCKIMMUNE) || HAS_TRAIT(H, TRAIT_RAVOX_CURSE)) + to_chat(H, span_danger("As you grasp the hedgeknight mace, you touch its kneestingers and feel a powerful and excruciating shock radiate through your body!")) + H.electrocute_act(15, src) //nobody likes this, its been proven at tgmc but i guess its too late now + +/obj/item/rogueweapon/mace/stunmace/hedgeknight/process() + var/mob/living/user = loc + if(istype(user)) + if(!HAS_TRAIT(user, TRAIT_SHOCKIMMUNE) || HAS_TRAIT(user, TRAIT_RAVOX_CURSE)) + to_chat(user, span_danger("As you grasp the hedgeknight mace, you touch its kneestingers and feel a powerful and excruciating shock radiate through your body!")) + user.electrocute_act(15, src) + if(on) + charge-- + else + if(charge < 300) + charge += 10 + if(charge <= 0) + on = FALSE + charge = 0 + update_icon() + if(istype(user)) + if(user.a_intent) + var/datum/intent/I = user.a_intent + if(istype(I)) + I.afterchange() + playsound(src, pick('sound/items/stunmace_toggle (1).ogg','sound/items/stunmace_toggle (2).ogg','sound/items/stunmace_toggle (3).ogg'), 100, TRUE) + /obj/item/rogueweapon/katar slot_flags = ITEM_SLOT_HIP force = 16 diff --git a/code/game/objects/items/rogueweapons/melee/swords.dm b/code/game/objects/items/rogueweapons/melee/swords.dm index 3bcb1c5e456..7f310b84843 100644 --- a/code/game/objects/items/rogueweapons/melee/swords.dm +++ b/code/game/objects/items/rogueweapons/melee/swords.dm @@ -272,6 +272,7 @@ return /obj/item/rogueweapon/sword/long/vlord/dropped(mob/living/user) + . = ..() if(active_item) user.attunement_points_used -= attunement_cost user.check_attunement_points() diff --git a/code/game/objects/items/rogueweapons/ranged/ammo.dm b/code/game/objects/items/rogueweapons/ranged/ammo.dm index 7f4e574310b..76756ea9a66 100644 --- a/code/game/objects/items/rogueweapons/ranged/ammo.dm +++ b/code/game/objects/items/rogueweapons/ranged/ammo.dm @@ -57,7 +57,7 @@ name = "poisoned bolt" damage = 70 ammo_type = /obj/item/ammo_casing/caseless/rogue/bolt/poison - poisontype = /datum/reagent/berrypoison + poisontype = /datum/reagent/toxin/berrypoison poisonfeel = "burning" //Ditto poisonamount = 7 //Can't spam crossbows as much as bows, and its a thiccer projectile so slight more poison in bolts. @@ -167,7 +167,7 @@ ammo_type = /obj/item/ammo_casing/caseless/rogue/arrow range = 15 hitsound = 'sound/combat/hits/hi_arrow2.ogg' - poisontype = /datum/reagent/berrypoison //Support for future variations of poison for arrow-crafting + poisontype = /datum/reagent/toxin/berrypoison //Support for future variations of poison for arrow-crafting poisonfeel = "burning" //Ditto poisonamount = 5 //Support and balance for bodkins, which will hold less poison due to how diff --git a/code/game/objects/items/rogueweapons/rmb_intents.dm b/code/game/objects/items/rogueweapons/rmb_intents.dm index 6964ff28e0a..30627daceb8 100644 --- a/code/game/objects/items/rogueweapons/rmb_intents.dm +++ b/code/game/objects/items/rogueweapons/rmb_intents.dm @@ -10,10 +10,15 @@ return if(user.incapacitated()) return - var/mob/living/L = target + var/mob/living/carbon/L = target user.changeNext_move(CLICK_CD_RAPID) playsound(user, 'sound/combat/feint.ogg', 100, TRUE) user.visible_message(span_danger("[user] feints an attack at [target]!")) + SEND_SIGNAL(L, COMSIG_FEINT_REACT, user, target) + if(HAS_TRAIT(L, TRAIT_FEINT_IMMUNITY)) + to_chat(user, span_warning("[L] seems completely unaffected by my maneuver!")) + user.apply_status_effect(/datum/status_effect/debuff/feintcd) + return var/perc = 50 if(user.mind) var/obj/item/I = user.get_active_held_item() @@ -30,8 +35,6 @@ perc += (user.STAINT - L.STAINT)*15 //but it's also a mindgame perc += (user.STASPD - L.STASPD)*15 //a swift feint can still fool a slow opponent - - if(L.d_intent == INTENT_DODGE) if(!L.mind && !user.has_status_effect(/datum/status_effect/debuff/feintcd))//Feinting an NPC will now perform a 'Trip' combat manuever. This feature is designed as a way to counter the AI's ability to dodge attacks that have a hit delay by constantly moving around.. if(prob(80) || istype(user.rmb_intent, /datum/rmb_intent/feint))//Guaranteed if you're actually in a feinting stance. diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index c6e9acf91a9..a3025cee7e5 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -224,7 +224,7 @@ grind_results = list(/datum/reagent/medicine/spaceacillin = 2) /obj/item/stack/medical/mesh/Initialize() - ..() + . = ..() if(amount == max_amount) //only seal full mesh packs is_open = FALSE icon_state = "regen_mesh_closed" @@ -258,7 +258,7 @@ . = ..() /obj/item/stack/medical/mesh/attack_hand(mob/user) - if(!is_open & user.get_inactive_held_item() == src) + if(!is_open && user.get_inactive_held_item() == src) to_chat(user, span_warning("I need to open [src] first.")) return . = ..() diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 26562b2612d..a88d7891b7f 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -87,37 +87,6 @@ GLOBAL_LIST_INIT(monkey_recipes, list ( \ icon_state = "sheet-lizard" item_state = "sheet-lizard" -/obj/item/stack/sheet/animalhide/xeno - name = "alien hide" - desc = "" - singular_name = "alien hide piece" - icon_state = "sheet-xeno" - item_state = "sheet-xeno" - -GLOBAL_LIST_INIT(xeno_recipes, list ( \ - new/datum/stack_recipe("alien helmet", /obj/item/clothing/head/xenos, 1), \ - new/datum/stack_recipe("alien suit", /obj/item/clothing/suit/xenos, 2), \ - )) - -/obj/item/stack/sheet/animalhide/xeno/get_main_recipes() - . = ..() - . += GLOB.xeno_recipes - -//don't see anywhere else to put these, maybe together they could be used to make the xenos suit? -/obj/item/stack/sheet/xenochitin - name = "alien chitin" - desc = "" - singular_name = "alien hide piece" - icon = 'icons/mob/alien.dmi' - icon_state = "chitin" - novariants = TRUE - -/obj/item/xenos_claw - name = "alien claw" - desc = "" - icon = 'icons/mob/alien.dmi' - icon_state = "claw" - /obj/item/weed_extract name = "weed extract" desc = "" diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index bc93fff79bf..89ed44ed798 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -24,7 +24,6 @@ Mineral Sheets */ GLOBAL_LIST_INIT(sandstone_recipes, list ( \ - new/datum/stack_recipe("pile of dirt", /obj/machinery/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("Assistant Statue", /obj/structure/statue/sandstone/assistant, 5, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("Breakdown into sand", /obj/item/stack/ore/glass, 1, one_per_turf = 0, on_floor = 1) \ @@ -405,30 +404,6 @@ GLOBAL_LIST_INIT(adamantine_recipes, list( custom_materials = list(/datum/material/mythril=MINERAL_MATERIAL_AMOUNT) merge_type = /obj/item/stack/sheet/mineral/mythril -/* - * Alien Alloy - */ -/obj/item/stack/sheet/mineral/abductor - name = "alien alloy" - icon = 'icons/obj/abductor.dmi' - icon_state = "sheet-abductor" - item_state = "sheet-abductor" - singular_name = "alien alloy sheet" - sheettype = "abductor" - merge_type = /obj/item/stack/sheet/mineral/abductor - -GLOBAL_LIST_INIT(abductor_recipes, list ( \ - new/datum/stack_recipe("alien bed", /obj/structure/bed/abductor, 2, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("alien locker", /obj/structure/closet/abductor, 2, time = 15, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("alien table frame", /obj/structure/table_frame/abductor, 1, time = 15, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("alien airlock assembly", /obj/structure/door_assembly/door_assembly_abductor, 4, time = 20, one_per_turf = 1, on_floor = 1), \ - null, \ - new/datum/stack_recipe("alien floor tile", /obj/item/stack/tile/mineral/abductor, 1, 4, 20), \ - )) - -/obj/item/stack/sheet/mineral/abductor/get_main_recipes() - . = ..() - . += GLOB.abductor_recipes /* * Coal diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index d382cabcd43..ff4f29fe58c 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -313,6 +313,7 @@ icon_state = initial(icon_state) REMOVE_TRAIT(src, TRAIT_T_RAY_VISIBLE, TRAIT_GENERIC) + /obj/item/storage/backpack/satchel/flat/with_tools/PopulateContents() new /obj/item/stack/tile/plasteel(src) new /obj/item/crowbar(src) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index b7248278d87..d2f120baab6 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -570,10 +570,6 @@ var/chattering = FALSE var/phomeme -// Talking toys are language universal, and thus all species can use them -/obj/item/toy/talking/attack_alien(mob/user) - return attack_hand(user) - /obj/item/toy/talking/attack_self(mob/user) if(!cooldown) activation_message(user) diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index a1ea2f4752a..7a575e85bba 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -112,10 +112,6 @@ user.changeNext_move(CLICK_CD_MELEE) return take_damage(damage_amount, damage_type, damage_flag, sound_effect, get_dir(src, user), armor_penetration) -/obj/attack_alien(mob/living/carbon/alien/humanoid/user) - if(attack_generic(user, 60, BRUTE, "slash", 0)) - playsound(src.loc, 'sound/blank.ogg', 100, TRUE) - /obj/attack_animal(mob/living/simple_animal/M) if(!M.melee_damage_upper && !M.obj_damage) M.emote("custom", message = "[M.friendly_verb_continuous] [src].") diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index b194d26ebb1..698b114352a 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -354,4 +354,3 @@ // Should move all contained objects to it's location. /obj/proc/dump_contents() CRASH("Unimplemented.") - return diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm deleted file mode 100644 index 08bedbfb0eb..00000000000 --- a/code/game/objects/structures/aliens.dm +++ /dev/null @@ -1,337 +0,0 @@ -/* Alien shit! - * Contains: - * structure/alien - * Resin - * Weeds - * Egg - */ - - -/obj/structure/alien - icon = 'icons/mob/alien.dmi' - max_integrity = 100 - -/obj/structure/alien/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) - if(damage_flag == "blunt" || damage_flag == "slash" || damage_flag == "stab") - switch(damage_type) - if(BRUTE) - damage_amount *= 0.25 - if(BURN) - damage_amount *= 2 - . = ..() - -/obj/structure/alien/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) - switch(damage_type) - if(BRUTE) - if(damage_amount) - playsound(loc, 'sound/blank.ogg', 100, TRUE) - else - playsound(src, 'sound/blank.ogg', 50, TRUE) - if(BURN) - if(damage_amount) - playsound(loc, 'sound/blank.ogg', 100, TRUE) - -/* - * Generic alien stuff, not related to the purple lizards but still alien-like - */ - -/obj/structure/alien/gelpod - name = "gelatinous mound" - desc = "" - icon = 'icons/obj/fluff.dmi' - icon_state = "gelmound" - -/obj/structure/alien/gelpod/deconstruct(disassembled = TRUE) - if(!(flags_1 & NODECONSTRUCT_1)) - new/obj/effect/mob_spawn/human/corpse/damaged(get_turf(src)) - qdel(src) - -/* - * Resin - */ -/obj/structure/alien/resin - name = "resin" - desc = "" - icon = 'icons/obj/smooth_structures/alien/resin_wall.dmi' - icon_state = "smooth" - density = TRUE - opacity = 1 - anchored = TRUE - canSmoothWith = list(/obj/structure/alien/resin) - max_integrity = 200 - smooth = SMOOTH_TRUE - var/resintype = null - CanAtmosPass = ATMOS_PASS_DENSITY - - -/obj/structure/alien/resin/Initialize(mapload) - . = ..() - air_update_turf(TRUE) - -/obj/structure/alien/resin/Move() - var/turf/T = loc - . = ..() - move_update_air(T) - -/obj/structure/alien/resin/wall - name = "resin wall" - desc = "" - icon = 'icons/obj/smooth_structures/alien/resin_wall.dmi' - icon_state = "smooth" //same as resin, but consistency ho! - resintype = "wall" - canSmoothWith = list(/obj/structure/alien/resin/wall, /obj/structure/alien/resin/membrane) - -/obj/structure/alien/resin/wall/BlockSuperconductivity() - return 1 - -/obj/structure/alien/resin/membrane - name = "resin membrane" - desc = "" - icon = 'icons/obj/smooth_structures/alien/resin_membrane.dmi' - icon_state = "smooth" - opacity = 0 - max_integrity = 160 - resintype = "membrane" - canSmoothWith = list(/obj/structure/alien/resin/wall, /obj/structure/alien/resin/membrane) - -/obj/structure/alien/resin/attack_paw(mob/user) - return attack_hand(user) - - -/obj/structure/alien/resin/CanPass(atom/movable/mover, turf/target) - return !density - - -/* - * Weeds - */ - -#define NODERANGE 3 - -/obj/structure/alien/weeds - gender = PLURAL - name = "resin floor" - desc = "" - anchored = TRUE - density = FALSE - layer = TURF_LAYER - plane = FLOOR_PLANE - icon_state = "weeds" - max_integrity = 15 - canSmoothWith = list(/obj/structure/alien/weeds, /turf/closed/wall) - smooth = SMOOTH_MORE - var/last_expand = 0 //last world.time this weed expanded - var/growth_cooldown_low = 150 - var/growth_cooldown_high = 200 - var/static/list/blacklisted_turfs - -/obj/structure/alien/weeds/Initialize() - pixel_x = -4 - pixel_y = -4 //so the sprites line up right in the map editor - . = ..() - - if(!blacklisted_turfs) - blacklisted_turfs = typecacheof(list( - /turf/open/space, - /turf/open/chasm, - /turf/open/lava)) - - - last_expand = world.time + rand(growth_cooldown_low, growth_cooldown_high) - if(icon == initial(icon)) - switch(rand(1,3)) - if(1) - icon = 'icons/obj/smooth_structures/alien/weeds1.dmi' - if(2) - icon = 'icons/obj/smooth_structures/alien/weeds2.dmi' - if(3) - icon = 'icons/obj/smooth_structures/alien/weeds3.dmi' - -/obj/structure/alien/weeds/proc/expand() - var/turf/U = get_turf(src) - if(is_type_in_typecache(U, blacklisted_turfs)) - qdel(src) - return FALSE - - for(var/turf/T in U.GetAtmosAdjacentTurfs()) - if(locate(/obj/structure/alien/weeds) in T) - continue - - if(is_type_in_typecache(T, blacklisted_turfs)) - continue - - new /obj/structure/alien/weeds(T) - return TRUE - -/obj/structure/alien/weeds/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) - take_damage(5, BURN, 0, 0) - -//Weed nodes -/obj/structure/alien/weeds/node - name = "glowing resin" - desc = "" - icon_state = "weednode" - light_color = LIGHT_COLOR_BLUE - light_power = 0.5 - var/lon_range = 4 - var/node_range = NODERANGE - -/obj/structure/alien/weeds/node/Initialize() - icon = 'icons/obj/smooth_structures/alien/weednode.dmi' - . = ..() - set_light(lon_range) - var/obj/structure/alien/weeds/W = locate(/obj/structure/alien/weeds) in loc - if(W && W != src) - qdel(W) - START_PROCESSING(SSobj, src) - -/obj/structure/alien/weeds/node/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/structure/alien/weeds/node/process() - for(var/obj/structure/alien/weeds/W in range(node_range, src)) - if(W.last_expand <= world.time) - if(W.expand()) - W.last_expand = world.time + rand(growth_cooldown_low, growth_cooldown_high) - -#undef NODERANGE - - -/* - * Egg - */ - -//for the status var -#define BURST "burst" -#define GROWING "growing" -#define GROWN "grown" -#define MIN_GROWTH_TIME 900 //time it takes to grow a hugger -#define MAX_GROWTH_TIME 1500 - -/obj/structure/alien/egg - name = "egg" - desc = "" - var/base_icon = "egg" - icon_state = "egg_growing" - density = FALSE - anchored = TRUE - max_integrity = 100 - integrity_failure = 0.05 - var/status = GROWING //can be GROWING, GROWN or BURST; all mutually exclusive - layer = MOB_LAYER - var/obj/item/clothing/mask/facehugger/child - -/obj/structure/alien/egg/Initialize(mapload) - . = ..() - update_icon() - if(status == GROWING || status == GROWN) - child = new(src) - if(status == GROWING) - addtimer(CALLBACK(src, PROC_REF(Grow)), rand(MIN_GROWTH_TIME, MAX_GROWTH_TIME)) - proximity_monitor = new(src, status == GROWN ? 1 : 0) - if(status == BURST) - obj_integrity = integrity_failure * max_integrity - -/obj/structure/alien/egg/update_icon() - ..() - switch(status) - if(GROWING) - icon_state = "[base_icon]_growing" - if(GROWN) - icon_state = "[base_icon]" - if(BURST) - icon_state = "[base_icon]_hatched" - -/obj/structure/alien/egg/attack_paw(mob/living/user) - return attack_hand(user) - -/obj/structure/alien/egg/attack_alien(mob/living/carbon/alien/user) - return attack_hand(user) - -/obj/structure/alien/egg/attack_hand(mob/living/user) - . = ..() - if(.) - return - if(user.getorgan(/obj/item/organ/alien/plasmavessel)) - switch(status) - if(BURST) - to_chat(user, span_notice("I clear the hatched egg.")) - playsound(loc, 'sound/blank.ogg', 100, TRUE) - qdel(src) - return - if(GROWING) - to_chat(user, span_notice("The child is not developed yet.")) - return - if(GROWN) - to_chat(user, span_notice("I retrieve the child.")) - Burst(kill=FALSE) - return - else - to_chat(user, span_notice("It feels slimy.")) - user.changeNext_move(CLICK_CD_MELEE) - - -/obj/structure/alien/egg/proc/Grow() - status = GROWN - update_icon() - proximity_monitor.SetRange(1) - -//drops and kills the hugger if any is remaining -/obj/structure/alien/egg/proc/Burst(kill = TRUE) - if(status == GROWN || status == GROWING) - proximity_monitor.SetRange(0) - status = BURST - update_icon() - flick("egg_opening", src) - addtimer(CALLBACK(src, PROC_REF(finish_bursting), kill), 15) - -/obj/structure/alien/egg/proc/finish_bursting(kill = TRUE) - if(child) - child.forceMove(get_turf(src)) - // TECHNICALLY you could put non-facehuggers in the child var - if(istype(child)) - if(kill) - child.Die() - else - for(var/mob/M in range(1,src)) - if(CanHug(M)) - child.Leap(M) - break - -/obj/structure/alien/egg/obj_break(damage_flag) - if(!(flags_1 & NODECONSTRUCT_1)) - if(status != BURST) - Burst(kill=TRUE) - ..() - -/obj/structure/alien/egg/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 500) - take_damage(5, BURN, 0, 0) - - -/obj/structure/alien/egg/HasProximity(atom/movable/AM) - if(status == GROWN) - if(!CanHug(AM)) - return - - var/mob/living/carbon/C = AM - if(C.stat == CONSCIOUS && C.getorgan(/obj/item/organ/body_egg/alien_embryo)) - return - - Burst(kill=FALSE) - -/obj/structure/alien/egg/grown - status = GROWN - icon_state = "egg" - -/obj/structure/alien/egg/burst - status = BURST - icon_state = "egg_hatched" - -#undef BURST -#undef GROWING -#undef GROWN -#undef MIN_GROWTH_TIME -#undef MAX_GROWTH_TIME diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm deleted file mode 100644 index 2c1244d1ffb..00000000000 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ /dev/null @@ -1,88 +0,0 @@ -//Alium nests. Essentially beds with an unbuckle delay that only aliums can buckle mobs to. - -/obj/structure/bed/nest - name = "alien nest" - desc = "" - icon = 'icons/obj/smooth_structures/alien/nest.dmi' - icon_state = "nest" - max_integrity = 120 - smooth = SMOOTH_TRUE - can_be_unanchored = FALSE - canSmoothWith = null - buildstacktype = null - flags_1 = NODECONSTRUCT_1 - bolts = FALSE - var/static/mutable_appearance/nest_overlay = mutable_appearance('icons/mob/alien.dmi', "nestoverlay", LYING_MOB_LAYER) - -/obj/structure/bed/nest/user_unbuckle_mob(mob/living/buckled_mob, mob/living/user) - if(has_buckled_mobs()) - for(var/buck in buckled_mobs) //breaking a nest releases all the buckled mobs, because the nest isn't holding them down anymore - var/mob/living/M = buck - - if(user.getorgan(/obj/item/organ/alien/plasmavessel)) - unbuckle_mob(M) - add_fingerprint(user) - return - - if(M != user) - M.visible_message(span_notice("[user.name] pulls [M.name] free from the sticky nest!"),\ - span_notice("[user.name] pulls you free from the gelatinous resin."),\ - span_hear("I hear squelching...")) - else - M.visible_message(span_warning("[M.name] struggles to break free from the gelatinous resin!"),\ - span_notice("I struggle to break free from the gelatinous resin... (Stay still for two minutes.)"),\ - span_hear("I hear squelching...")) - if(!do_after(M, 1200, target = src)) - if(M && M.buckled) - to_chat(M, span_warning("I fail to unbuckle yourself!")) - return - if(!M.buckled) - return - M.visible_message(span_warning("[M.name] breaks free from the gelatinous resin!"),\ - span_notice("I break free from the gelatinous resin!"),\ - span_hear("I hear squelching...")) - - unbuckle_mob(M) - add_fingerprint(user) - -/obj/structure/bed/nest/user_buckle_mob(mob/living/M, mob/living/user) - if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.incapacitated() || M.buckled ) - return - - if(M.getorgan(/obj/item/organ/alien/plasmavessel)) - return - if(!user.getorgan(/obj/item/organ/alien/plasmavessel)) - return - - if(has_buckled_mobs()) - unbuckle_all_mobs() - - if(buckle_mob(M)) - M.visible_message(span_notice("[user.name] secretes a thick vile goo, securing [M.name] into [src]!"),\ - span_danger("[user.name] drenches you in a foul-smelling resin, trapping you in [src]!"),\ - span_hear("I hear squelching...")) - -/obj/structure/bed/nest/post_buckle_mob(mob/living/M) - M.pixel_y = 0 - M.pixel_x = initial(M.pixel_x) + 2 - M.layer = BELOW_MOB_LAYER - add_overlay(nest_overlay) - -/obj/structure/bed/nest/post_unbuckle_mob(mob/living/M) - M.pixel_x = M.get_standard_pixel_x_offset(M.lying) - M.pixel_y = M.get_standard_pixel_y_offset(M.lying) - M.layer = initial(M.layer) - cut_overlay(nest_overlay) - -/obj/structure/bed/nest/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) - switch(damage_type) - if(BRUTE) - playsound(loc, 'sound/blank.ogg', 100, TRUE) - if(BURN) - playsound(loc, 'sound/blank.ogg', 100, TRUE) - -/obj/structure/bed/nest/attack_alien(mob/living/carbon/alien/user) - if(user.used_intent.type != INTENT_HARM) - return attack_hand(user) - else - return ..() diff --git a/code/game/objects/structures/beds_chairs/roguechair.dm b/code/game/objects/structures/beds_chairs/roguechair.dm index 2bc08029e98..759ffa84fd7 100644 --- a/code/game/objects/structures/beds_chairs/roguechair.dm +++ b/code/game/objects/structures/beds_chairs/roguechair.dm @@ -82,7 +82,7 @@ /obj/structure/chair/bench/couch/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 6d042bf9a7a..13e6c002785 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -305,7 +305,7 @@ else playsound(src, 'sound/foley/doors/lockrattle.ogg', 100) -obj/structure/closet/proc/trypicklock(obj/item/I, mob/user) +/obj/structure/closet/proc/trypicklock(obj/item/I, mob/user) if(opened) to_chat(user, "This cannot be picked while it is open.") return diff --git a/code/game/objects/structures/crates_lockers/closets/infinite.dm b/code/game/objects/structures/crates_lockers/closets/infinite.dm index 7276e35ae4a..1ba03945d21 100644 --- a/code/game/objects/structures/crates_lockers/closets/infinite.dm +++ b/code/game/objects/structures/crates_lockers/closets/infinite.dm @@ -26,7 +26,7 @@ /obj/structure/closet/infinite/open() . = ..() if(. && auto_close_time) - addtimer(CALLBACK(src, PROC_REF(close_on_my_own)), auto_close_time, TIMER_OVERRIDE) + addtimer(CALLBACK(src, PROC_REF(close_on_my_own)), auto_close_time, TIMER_UNIQUE|TIMER_OVERRIDE) /obj/structure/closet/infinite/proc/close_on_my_own() if(close()) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index 3c761299e33..cc1cefd397a 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -17,7 +17,6 @@ new /obj/item/tank/internals/emergency_oxygen(src) new /obj/item/clothing/mask/gas(src) new /obj/item/clothing/head/soft(src) - new /obj/item/export_scanner(src) new /obj/item/door_remote/quartermaster(src) new /obj/item/circuitboard/machine/techfab/department/cargo(src) new /obj/item/storage/photo_album/QM(src) diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index 77768474340..26c36996e23 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -109,7 +109,6 @@ /obj/item/stack/sheet/mineral/plastitanium, /obj/item/stack/rods, /obj/item/stack/sheet/bluespace_crystal, - /obj/item/stack/sheet/mineral/abductor, /obj/item/stack/sheet/plastic, /obj/item/stack/sheet/mineral/wood ) diff --git a/code/game/objects/structures/crates_lockers/roguetown.dm b/code/game/objects/structures/crates_lockers/roguetown.dm index d4fa8f9d448..e591ff0c86e 100644 --- a/code/game/objects/structures/crates_lockers/roguetown.dm +++ b/code/game/objects/structures/crates_lockers/roguetown.dm @@ -61,8 +61,6 @@ new I(src) /obj/structure/closet/crate/chest/gold/lootbox/trait/PopulateContents() var/list/loot = list(/obj/item/rogueweapon/huntingknife/idagger/silver=33, - /obj/item/book/granter/trait/war/undying=13, - /obj/item/book/granter/trait/war/relentless=13, /obj/item/book/granter/trait/mobility/bogtrek=33, /obj/item/book/granter/trait/defense/mediumarmor=40, /obj/item/book/granter/trait/defense/heavyarmor=40, diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index c98b88408ca..50e87ade8ca 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -234,12 +234,6 @@ start_showpiece_type = /obj/item/gun/energy/laser/captain req_access = list(ACCESS_CENT_SPECOPS) -/obj/structure/displaycase/labcage - name = "lab cage" - desc = "" - start_showpiece_type = /obj/item/clothing/mask/facehugger/lamarr - req_access = list(ACCESS_RD) - /obj/structure/displaycase/trophy name = "trophy display case" desc = "" diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 7854785848b..66cd3665c5c 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -50,7 +50,7 @@ deconstruct(TRUE) return - if(iscyborg(user) || isalien(user)) + if(iscyborg(user)) return if(istype(I, /obj/item/extinguisher)) if(!stored_extinguisher && opened) @@ -72,7 +72,7 @@ . = ..() if(.) return - if(iscyborg(user) || isalien(user)) + if(iscyborg(user)) return if(stored_extinguisher) user.put_in_hands(stored_extinguisher) diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index efd2fc12e98..3555102e921 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -284,15 +284,6 @@ walltype = /turf/closed/wall/mineral/iron canSmoothWith = list(/obj/structure/falsewall/iron, /turf/closed/wall/mineral/iron) -/obj/structure/falsewall/abductor - name = "alien wall" - desc = "" - icon = 'icons/turf/walls/abductor_wall.dmi' - icon_state = "abductor" - mineral = /obj/item/stack/sheet/mineral/abductor - walltype = /turf/closed/wall/mineral/abductor - canSmoothWith = list(/obj/structure/falsewall/abductor, /turf/closed/wall/mineral/abductor) - /obj/structure/falsewall/titanium name = "wall" desc = "" diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 2a0fe599bc2..df0d3a7faa1 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -4,7 +4,7 @@ anchored = TRUE /obj/structure/flora/Initialize() - ..() + . = ..() if(isclosedturf(loc)) return INITIALIZE_HINT_QDEL diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index bb86ca3abf7..80090a50466 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -194,7 +194,7 @@ layer = ABOVE_MOB_LAYER /obj/structure/fluff/railing/Initialize() - ..() + . = ..() var/lay = getwlayer(dir) if(lay) layer = lay @@ -225,7 +225,7 @@ if(!(M.mobility_flags & MOBILITY_STAND)) if(passcrawl) return TRUE - if(icon_state == "woodrailing" && dir in CORNERDIRS) + if(icon_state == "woodrailing" && (dir in CORNERDIRS)) var/list/baddirs = list() switch(dir) if(SOUTHEAST) @@ -256,7 +256,7 @@ if(!(M.mobility_flags & MOBILITY_STAND)) if(passcrawl) return TRUE - if(icon_state == "woodrailing" && dir in CORNERDIRS) + if(icon_state == "woodrailing" && (dir in CORNERDIRS)) var/list/baddirs = list() switch(dir) if(SOUTHEAST) @@ -320,7 +320,7 @@ climb_offset = 6 /obj/structure/fluff/railing/fence/Initialize() - ..() + . = ..() smooth_fences() /obj/structure/fluff/railing/fence/Destroy() @@ -390,8 +390,7 @@ return 1 if(mover.throwing && !ismob(mover)) return prob(66) - return !density - ..() + return ..() /obj/structure/bars/chainlink icon_state = "chainlink" @@ -1232,7 +1231,7 @@ /obj/structure/fluff/psycross/attackby(obj/item/W, mob/user, params) if(user.mind) - if(user.mind.assigned_role == "Prophet") + if(user.mind.assigned_role == "Archpriest") if(istype(W, /obj/item/reagent_containers/food/snacks/grown/apple)) if(!istype(get_area(user), /area/rogue/indoors/town/church/chapel)) to_chat(user, span_warning("I need to do this in the chapel.")) @@ -1309,7 +1308,7 @@ if(!L || !message) return FALSE var/message2recognize = sanitize_hear_message(message) - if(findtext(message2recognize, "zizo")) + if(findtext(message2recognize, "levishth")) L.add_stress(/datum/stressevent/psycurse) L.adjust_fire_stacks(100) L.IgniteMob() diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 727981c5b70..3922ebd1be9 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -107,13 +107,6 @@ if(!shock(user, 70)) take_damage(rand(5,10), BRUTE, "blunt", 1) -/obj/structure/grille/attack_alien(mob/living/user) - user.do_attack_animation(src) - user.changeNext_move(CLICK_CD_MELEE) - user.visible_message(span_warning("[user] mangles [src]."), null, null, COMBAT_MESSAGE_RANGE) - if(!shock(user, 70)) - take_damage(20, BRUTE, "slash", 1) - /obj/structure/grille/CanPass(atom/movable/mover, turf/target) if(istype(mover) && (mover.pass_flags & PASSGRILLE)) diff --git a/code/game/objects/structures/guncase.dm b/code/game/objects/structures/guncase.dm index 8f313657283..f1f036ac910 100644 --- a/code/game/objects/structures/guncase.dm +++ b/code/game/objects/structures/guncase.dm @@ -35,7 +35,7 @@ add_overlay("[icon_state]_door") /obj/structure/guncase/attackby(obj/item/I, mob/user, params) - if(iscyborg(user) || isalien(user)) + if(iscyborg(user)) return if(istype(I, gun_category) && open) if(LAZYLEN(contents) < capacity) @@ -57,7 +57,7 @@ . = ..() if(.) return - if(iscyborg(user) || isalien(user)) + if(iscyborg(user)) return if(contents.len && open) ShowWindow(user) diff --git a/code/game/objects/structures/hidden_doors.dm b/code/game/objects/structures/hidden_doors.dm index 98646121669..322ff97d3fb 100644 --- a/code/game/objects/structures/hidden_doors.dm +++ b/code/game/objects/structures/hidden_doors.dm @@ -19,7 +19,7 @@ flags_1 = HEAR_1 can_add_lock = FALSE - + var/over_state = "woodover" var/speaking_distance = 2 @@ -88,7 +88,7 @@ return if(!ishuman(speaker)) return - + var/message2recognize = sanitize_hear_message(original_message) var/isvip = FALSE if (vip.Find(H.job) || vip.Find(H.get_role_title())) @@ -102,7 +102,7 @@ say("Open: '[open_phrase]', Close: '[close_phrase]'.", language = lang) else say("I don't know you, "+flavor_name()+".", language = lang) - triggerdefenses(H, defenses) + triggerdefenses(H) if(findtext(message2recognize, open_phrase)) if(locked) @@ -123,8 +123,8 @@ say("Open phrase has been set, "+flavor_name()+".", language = lang) else say("I don't know you, "+flavor_name()+".", language = lang) - triggerdefenses(H, defenses) - + triggerdefenses(H) + if(findtext(message2recognize, "set close")) if(isvip || !locked) @@ -133,8 +133,8 @@ say("Close phrase has been set, "+flavor_name()+".", language = lang) else say("I don't know you, "+flavor_name()+".", language = lang) - triggerdefenses(H, defenses) - + triggerdefenses(H) + if(findtext(message2recognize, "set language")) if(isvip || !locked) var/list/langresult = list() @@ -146,7 +146,7 @@ lang = language_choice else say("I don't know you, "+flavor_name()+".", language = lang) - triggerdefenses(H, defenses) + triggerdefenses(H) if(findtext(message2recognize, "set defenses")) if(isvip || !locked) @@ -157,121 +157,121 @@ say("Arcyne defenses deactivated, "+flavor_name()+".", language = lang) else say("I don't know you, "+flavor_name()+".", language = lang) - triggerdefenses(H, defenses) + triggerdefenses(H) -proc/triggerdefenses(var/mob/living/carbon/human/H, var/D) - if (D) - if (H) - /* - LATER MAKE IT LIGHTNING LURE - var/range = 3 SECONDS - var/delay = 3 SECONDS - var/sprite_changes = 10 - var/datum/beam/current_beam = null - playsound(src, 'sound/items/stunmace_gen (2).ogg', 100) +/obj/structure/mineral_door/secret/proc/triggerdefenses(mob/living/carbon/human/H) + if (!H) + return + /* + LATER MAKE IT LIGHTNING LURE + var/range = 3 SECONDS + var/delay = 3 SECONDS + var/sprite_changes = 10 + var/datum/beam/current_beam = null + playsound(src, 'sound/items/stunmace_gen (2).ogg', 100) - var/x - for(x=1; x < sprite_changes; x++) - current_beam = new(src, H, time=30/sprite_changes, beam_icon_state="lightning[rand(1,12)]", btype=/obj/effect/ebeam, maxdistance=10) - INVOKE_ASYNC(current_beam, TYPE_PROC_REF(/datum/beam, Start)) - sleep(delay/sprite_changes) + var/x + for(x=1; x < sprite_changes; x++) + current_beam = new(src, H, time=30/sprite_changes, beam_icon_state="lightning[rand(1,12)]", btype=/obj/effect/ebeam, maxdistance=10) + INVOKE_ASYNC(current_beam, TYPE_PROC_REF(/datum/beam, Start)) + sleep(delay/sprite_changes) - var/dist = get_dist(src, H) - if (dist <= range) - H.electrocute_act(1, src) //just shock - else - playsound(src, 'sound/items/stunmace_toggle (3).ogg', 100) - */ - H.electrocute_act(30, src) //just shock - playsound(src, 'sound/items/stunmace_toggle (3).ogg', 100) + var/dist = get_dist(src, H) + if (dist <= range) + H.electrocute_act(1, src) //just shock + else + playsound(src, 'sound/items/stunmace_toggle (3).ogg', 100) + */ + H.electrocute_act(30, src) //just shock + playsound(src, 'sound/items/stunmace_toggle (3).ogg', 100) -proc/open_word() +/proc/open_word() var/list/open_word = list( - "open", - "pass", - "part", - "break", - "reveal", - "unbar", - "gape", - "extend", - "widen", - "unfold", + "open", + "pass", + "part", + "break", + "reveal", + "unbar", + "gape", + "extend", + "widen", + "unfold", "rise" ) return pick(open_word) -proc/close_word() +/proc/close_word() var/list/close_word = list( - "close", - "seal", - "still", - "fade", - "retreat", - "consume", - "envelope", - "hide", - "halt", - "cease", - "vanish", - "end" + "close", + "seal", + "still", + "fade", + "retreat", + "consume", + "envelope", + "hide", + "halt", + "cease", + "vanish", + "end" ) return pick(close_word) -proc/magic_word() +/proc/magic_word() var/list/magic_word = list( - "sesame", - "abyss", - "fire", - "wind", - "earth", - "shadow", - "night", - "oblivion", - "void", - "time", - "dead", - "decay", - "gods", - "ancient", - "twisted", - "corrupt", - "secrets", - "lore", - "text", - "ritual", - "sacrifice", - "deal", - "pact", - "bargain", - "ritual", - "dream", - "nightmare", - "vision", - "hunger", - "lust", - "necra", - "noc", - "psydon", - "zizo" + "sesame", + "abyss", + "fire", + "wind", + "earth", + "shadow", + "night", + "oblivion", + "void", + "time", + "dead", + "decay", + "gods", + "ancient", + "twisted", + "corrupt", + "secrets", + "lore", + "text", + "ritual", + "sacrifice", + "deal", + "pact", + "bargain", + "ritual", + "dream", + "nightmare", + "vision", + "hunger", + "lust", + "necra", + "noc", + "psydon", + "levishth" ) return pick(magic_word) -proc/flavor_name() +/proc/flavor_name() var/list/flavor_name = list( - "my friend", - "love", - "my love", - "honey", - "darling", - "stranger", - "habibi", - "companion", - "mate", - "you harlot", - "comrade", - "fellow", - "chum", + "my friend", + "love", + "my love", + "honey", + "darling", + "stranger", + "habibi", + "companion", + "mate", + "you harlot", + "comrade", + "fellow", + "chum", "bafoon" ) return pick(flavor_name) diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index b3bfcd1c768..8007ab0d260 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -34,13 +34,13 @@ var/obj/structure/ladder/L if (!down) - L = locate() in SSmapping.get_turf_below(T) + L = locate() in GET_TURF_BELOW(T) if (L) down = L L.up = src // Don't waste effort looping the other way L.update_icon() if (!up) - L = locate() in SSmapping.get_turf_above(T) + L = locate() in GET_TURF_ABOVE(T) if (L) up = L L.down = src // Don't waste effort looping the other way diff --git a/code/game/objects/structures/mannequin.dm b/code/game/objects/structures/mannequin.dm index 052a5c4170b..c69aea0b1f8 100644 --- a/code/game/objects/structures/mannequin.dm +++ b/code/game/objects/structures/mannequin.dm @@ -562,11 +562,11 @@ */ /obj/structure/mannequin/proc/EquipHelper(target_zone) switch(target_zone) - if(BODY_ZONE_HEAD || BODY_ZONE_PRECISE_EARS || BODY_ZONE_PRECISE_SKULL) + if(BODY_ZONE_HEAD, BODY_ZONE_PRECISE_EARS, BODY_ZONE_PRECISE_SKULL) return ITEM_SLOT_HEAD if(BODY_ZONE_PRECISE_NECK) return ITEM_SLOT_CLOAK - if(BODY_ZONE_PRECISE_L_EYE || BODY_ZONE_PRECISE_R_EYE || BODY_ZONE_PRECISE_NOSE || BODY_ZONE_PRECISE_MOUTH) + if(BODY_ZONE_PRECISE_L_EYE, BODY_ZONE_PRECISE_R_EYE, BODY_ZONE_PRECISE_NOSE, BODY_ZONE_PRECISE_MOUTH) return ITEM_SLOT_MASK if(BODY_ZONE_CHEST) return ITEM_SLOT_ARMOR @@ -610,11 +610,11 @@ */ /obj/structure/mannequin/proc/MannequinEquipHelper(target_zone) switch(target_zone) - if(BODY_ZONE_HEAD || BODY_ZONE_PRECISE_EARS || BODY_ZONE_PRECISE_SKULL) + if(BODY_ZONE_HEAD, BODY_ZONE_PRECISE_EARS, BODY_ZONE_PRECISE_SKULL) return SLOT_MANNEQUIN_HEAD if(BODY_ZONE_PRECISE_NECK) return SLOT_MANNEQUIN_CLOAK - if(BODY_ZONE_PRECISE_L_EYE || BODY_ZONE_PRECISE_R_EYE || BODY_ZONE_PRECISE_NOSE || BODY_ZONE_PRECISE_MOUTH) + if(BODY_ZONE_PRECISE_L_EYE, BODY_ZONE_PRECISE_R_EYE, BODY_ZONE_PRECISE_NOSE, BODY_ZONE_PRECISE_MOUTH) return SLOT_MANNEQUIN_MASK if(BODY_ZONE_CHEST) return SLOT_MANNEQUIN_ARMOR @@ -622,11 +622,11 @@ return SLOT_MANNEQUIN_SHIRT if(BODY_ZONE_PRECISE_GROIN) return SLOT_MANNEQUIN_BELT - if(BODY_ZONE_L_LEG || BODY_ZONE_R_LEG) + if(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) return SLOT_MANNEQUIN_PANTS - if(BODY_ZONE_PRECISE_L_HAND || BODY_ZONE_PRECISE_R_HAND) + if(BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND) return SLOT_MANNEQUIN_GLOVES - if(BODY_ZONE_PRECISE_L_FOOT || BODY_ZONE_PRECISE_R_FOOT) + if(BODY_ZONE_PRECISE_L_FOOT, BODY_ZONE_PRECISE_R_FOOT) return SLOT_MANNEQUIN_FEET ////Subtypes///// @@ -655,11 +655,11 @@ */ /obj/structure/mannequin/male/EquipHelper(target_zone) switch(target_zone) - if(BODY_ZONE_L_LEG || BODY_ZONE_R_LEG) + if(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) return ITEM_SLOT_PANTS - if(BODY_ZONE_PRECISE_L_HAND || BODY_ZONE_PRECISE_R_HAND) + if(BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND) return ITEM_SLOT_GLOVES - if(BODY_ZONE_PRECISE_L_FOOT || BODY_ZONE_PRECISE_R_FOOT) + if(BODY_ZONE_PRECISE_L_FOOT, BODY_ZONE_PRECISE_R_FOOT) return ITEM_SLOT_SHOES return ..() diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 51961a92615..337969670cb 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -877,7 +877,7 @@ lockdir = dir /obj/structure/mineral_door/wood/deadbolt/Initialize() - ..() + . = ..() lockdir = dir icon_state = base_state @@ -995,7 +995,7 @@ icon_state = "barsold" /obj/structure/mineral_door/bars/Initialize() - ..() + . = ..() add_overlay(mutable_appearance(icon, "barsopen", ABOVE_MOB_LAYER)) diff --git a/code/game/objects/structures/roguetent.dm b/code/game/objects/structures/roguetent.dm index cedf7f86ac6..f37479d7cfa 100644 --- a/code/game/objects/structures/roguetent.dm +++ b/code/game/objects/structures/roguetent.dm @@ -48,4 +48,4 @@ if(!density) close_up(user) else - open_up(user) \ No newline at end of file + open_up(user) diff --git a/code/game/objects/structures/roguetown/mobspawner.dm b/code/game/objects/structures/roguetown/mobspawner.dm index 8043ca5344f..f478dbc6891 100644 --- a/code/game/objects/structures/roguetown/mobspawner.dm +++ b/code/game/objects/structures/roguetown/mobspawner.dm @@ -1,98 +1,97 @@ -var/global/total_spawned_mobs = 0 -var/global/max_total_spawned_mobs = 30 // New global variable for the total limit +GLOBAL_VAR_INIT(total_spawned_mobs, 0) +GLOBAL_VAR_INIT(max_total_spawned_mobs, 100) // New global variable for the total limit /obj/effect/mob_spawner icon = 'icons/effects/landmarks_static.dmi' icon_state = "random_loot" var/spawn_timer var/max_spawned_mobs = 1 + var/mobs_to_spawn = 0 var/current_spawned_mobs = 0 - var/spawn_interval = 600 // Default to 60 seconds - var/list/ambush_mobs = list( - /mob/living/carbon/human/species/skeleton/npc/ambush = 20, - /mob/living/simple_animal/hostile/retaliate/rogue/wolf = 40, - /mob/living/simple_animal/hostile/retaliate/rogue/bigrat = 60, - /mob/living/simple_animal/hostile/retaliate/rogue/spider = 40, - /mob/living/carbon/human/species/goblin/npc/ambush/cave = 30 - ) + var/spawn_interval = 3600 //6 minutes + var/spawn_range = 10 //radius in which mobs can be spawned + var/player_range = 15 //range at which a nearby player will pause the spawner + var/list/ambush_mobs = list(/mob/living/carbon/human/species/skeleton/npc/ambush = 20) var/list/adventurer_landmarks = list() // Store landmarks here - var/area/valid_area = /area/rogue/outdoors/bog // Define the valid area + var/area/valid_area = /area/rogue //Useful for randomly generated maps, will delete spawners created outside this area. + var/turf/accepted_turf = /turf/open/floor/rogue - New() - ..() // Call the parent constructor - spawn_interval = rand(2400, 3600) // RNG between 4 minutes and 6 minutes - adventurer_landmarks = get_all_adventurer_landmarks() - if (!is_in_valid_area(src)) - del src // Delete the spawner if it's not in the valid area - else - start_spawning() +/obj/effect/mob_spawner/Initialize() + . = ..() // Call the parent constructor + adventurer_landmarks = get_all_adventurer_landmarks() //prevents spawners from being placed near player spawns + if (!is_in_valid_area(src)) + return INITIALIZE_HINT_QDEL // Delete the spawner if it's not in the valid area + else + start_spawning() - proc/start_spawning() - spawn_timer = addtimer(CALLBACK(src, .proc/spawn_and_continue), spawn_interval, TIMER_STOPPABLE) +/obj/effect/mob_spawner/proc/start_spawning() + spawn_timer = addtimer(CALLBACK(src, PROC_REF(spawn_and_continue)), spawn_interval, TIMER_STOPPABLE) - proc/spawn_and_continue() - if (total_spawned_mobs < max_total_spawned_mobs && current_spawned_mobs < max_spawned_mobs) - spawn_random_mobs(2) // Attempt to spawn 2 mobs each time - start_spawning() +/obj/effect/mob_spawner/proc/spawn_and_continue() + if (GLOB.total_spawned_mobs < GLOB.max_total_spawned_mobs && current_spawned_mobs < max_spawned_mobs) + spawn_random_mobs(mobs_to_spawn) + start_spawning() - proc/spawn_random_mobs(var/num_to_spawn) - var/spawn_chance = 100 // 100% chance to spawn if conditions are met - if (prob(spawn_chance) && total_spawned_mobs < max_total_spawned_mobs) - var/turf/spawn_turf - var/mob_type - var/mob/new_mob - var/i = 0 - while (i < num_to_spawn && total_spawned_mobs < max_total_spawned_mobs) - spawn_turf = get_random_valid_turf() - if (spawn_turf) - mob_type = pickweight(ambush_mobs) - new_mob = new mob_type(spawn_turf) - if (new_mob) - current_spawned_mobs++ - total_spawned_mobs++ - RegisterSignal(new_mob, COMSIG_PARENT_QDELETING, .proc/on_mob_destroy) - i++ +/obj/effect/mob_spawner/proc/spawn_random_mobs(num_to_spawn) + var/spawn_chance = 100 // 100% chance to spawn if conditions are met + if (prob(spawn_chance) && GLOB.total_spawned_mobs < GLOB.max_total_spawned_mobs) + var/turf/spawn_turf + var/mob_type + var/mob/new_mob + var/i = 0 + while (i < num_to_spawn && GLOB.total_spawned_mobs < GLOB.max_total_spawned_mobs) + spawn_turf = get_random_valid_turf() + if (spawn_turf) + mob_type = pickweight(ambush_mobs) + new_mob = new mob_type(spawn_turf) + if (new_mob) + current_spawned_mobs++ + GLOB.total_spawned_mobs++ + RegisterSignal(new_mob, COMSIG_PARENT_QDELETING, PROC_REF(on_mob_destroy)) + i++ - proc/get_random_valid_turf() - var/list/valid_turfs = list() - for (var/turf/T in range(4, src)) - if (is_valid_spawn_turf(T)) - valid_turfs += T - if (valid_turfs.len == 0) - return null - return pick(valid_turfs) +/obj/effect/mob_spawner/proc/get_random_valid_turf() + var/list/valid_turfs = list() + for (var/turf/T in range(spawn_range, src)) + if (is_valid_spawn_turf(T)) + valid_turfs += T + if (valid_turfs.len == 0) + return null + return pick(valid_turfs) - proc/is_valid_spawn_turf(turf/T) - if (istype(T, /turf/closed)) - return FALSE - if (!is_in_valid_area(T)) - return FALSE - for (var/L in adventurer_landmarks) - if (get_dist(T, L) < 10) - return FALSE - if (players_nearby(T, 10)) +/obj/effect/mob_spawner/proc/is_valid_spawn_turf(turf/T) + if (!(istype(T, accepted_turf))) + return FALSE + if (istype(T, /turf/closed)) + return FALSE + if (!is_in_valid_area(T)) + return FALSE + for (var/L in adventurer_landmarks) + if (get_dist(T, L) < 10) return FALSE - return TRUE + if (players_nearby(T, player_range)) + return FALSE + return TRUE - proc/is_in_valid_area(atom/A) - var/area/area_check = get_area(A) - return istype(area_check, valid_area) +/obj/effect/mob_spawner/proc/is_in_valid_area(atom/A) + var/area/area_check = get_area(A) + return istype(area_check, valid_area) - proc/get_all_adventurer_landmarks() - var/list/landmarks = list() - for (var/obj/effect/landmark/start/adventurer/L in world) - landmarks += L - for (var/obj/effect/landmark/start/adventurerlate/L in world) - landmarks += L - return landmarks +/obj/effect/mob_spawner/proc/get_all_adventurer_landmarks() + var/list/landmarks = list() + for (var/obj/effect/landmark/start/adventurer/L in world) + landmarks += L + for (var/obj/effect/landmark/start/adventurerlate/L in world) + landmarks += L + return landmarks - proc/on_mob_destroy(mob/M) - UnregisterSignal(M, COMSIG_PARENT_QDELETING) - current_spawned_mobs = max(0, current_spawned_mobs - 1) - total_spawned_mobs = max(0, total_spawned_mobs - 1) +/obj/effect/mob_spawner/proc/on_mob_destroy(mob/M) + UnregisterSignal(M, COMSIG_PARENT_QDELETING) + current_spawned_mobs = max(0, current_spawned_mobs - 1) + GLOB.total_spawned_mobs = max(0, GLOB.total_spawned_mobs - 1) - proc/players_nearby(turf/T, distance) - for (var/mob/living/carbon/human/H in range(distance, T)) - if (H.client) - return TRUE - return FALSE +/obj/effect/mob_spawner/proc/players_nearby(turf/T, distance) + for (var/mob/living/carbon/human/H in range(distance, T)) + if (H.client) + return TRUE + return FALSE diff --git a/code/game/objects/structures/roguetown/musicbox.dm b/code/game/objects/structures/roguetown/musicbox.dm index debc5ffa74a..f95f07a30df 100644 --- a/code/game/objects/structures/roguetown/musicbox.dm +++ b/code/game/objects/structures/roguetown/musicbox.dm @@ -80,4 +80,4 @@ else playing = FALSE soundloop.stop() - update_icon() \ No newline at end of file + update_icon() diff --git a/code/game/objects/structures/roguetown/newtree.dm b/code/game/objects/structures/roguetown/newtree.dm index 8fce8b54a11..0ade3fd1914 100644 --- a/code/game/objects/structures/roguetown/newtree.dm +++ b/code/game/objects/structures/roguetown/newtree.dm @@ -37,13 +37,16 @@ return /obj/structure/flora/newtree/proc/wallpress(mob/living/user) - if(user.wallpressed) + if(user.wallpressed) { + // Release wallpressed state if already pressed + release_wallpress(user) return + } if(user.pixelshifted) return if(!(user.mobility_flags & MOBILITY_STAND)) return - var/dir2wall = get_dir(user,src) + var/dir2wall = get_dir(user, src) if(!(dir2wall in GLOB.cardinals)) return user.wallpressed = dir2wall @@ -63,6 +66,11 @@ user.setDir(EAST) user.set_mob_offsets("wall_press", _x = -12, _y = 0) +/obj/structure/flora/newtree/proc/release_wallpress(mob/living/user) + user.wallpressed = null + user.update_wallpress_slowdown() + user.set_mob_offsets("reset_wall_press", _x = 0, _y = 0) + /obj/structure/flora/newtree/attack_right(mob/user) if(user.mind && isliving(user)) if(user.mind.special_items && user.mind.special_items.len) diff --git a/code/game/objects/structures/roguetown/portal.dm b/code/game/objects/structures/roguetown/portal.dm index 5e5a2b40ea3..852d359d20d 100644 --- a/code/game/objects/structures/roguetown/portal.dm +++ b/code/game/objects/structures/roguetown/portal.dm @@ -9,4 +9,4 @@ max_integrity = 0 bound_width = 96 appearance_flags = NONE - opacity = TRUE \ No newline at end of file + opacity = TRUE diff --git a/code/game/objects/structures/roguetown/rogueflora.dm b/code/game/objects/structures/roguetown/rogueflora.dm index 0ce2498512c..5b6af0538db 100644 --- a/code/game/objects/structures/roguetown/rogueflora.dm +++ b/code/game/objects/structures/roguetown/rogueflora.dm @@ -15,7 +15,7 @@ plane = GAME_PLANE_UPPER attacked_sound = 'sound/misc/woodhit.ogg' destroy_sound = 'sound/misc/woodhit.ogg' - debris = list(/obj/item/grown/log/tree/stick = 8) + debris = list(/obj/item/grown/log/tree/stick = 8, /obj/item/reagent_containers/food/snacks/grown/nut = 1) static_debris = list(/obj/item/grown/log/tree/large = 4) alpha = 200 leanable = TRUE @@ -94,8 +94,8 @@ soundloop.stop() if(controller) controller.endvines() - controller.tree = null - controller = null + controller.tree = null + controller = null . = ..() /obj/structure/flora/roguetree/evil @@ -375,7 +375,7 @@ leanable = TRUE /obj/structure/flora/roguegrass/bush/wall/Initialize() - ..() + . = ..() icon_state = "bushwall[pick(1,2)]" /obj/structure/flora/roguegrass/bush/wall/update_icon() @@ -400,7 +400,7 @@ static_debris = null /obj/structure/flora/roguegrass/bush/wall/tall/Initialize() - ..() + . = ..() icon_state = "tallbush[pick(1,2)]" @@ -435,7 +435,7 @@ /obj/structure/flora/rogueshroom/Initialize() - ..() + . = ..() icon_state = "mush[rand(1,5)]" if(icon_state == "mush5") static_debris = list(/obj/item/natural/thorn=1, /obj/item/grown/log/tree/small = 1) diff --git a/code/game/objects/structures/roguewindow.dm b/code/game/objects/structures/roguewindow.dm index 4168c68fd49..4325999dd8a 100644 --- a/code/game/objects/structures/roguewindow.dm +++ b/code/game/objects/structures/roguewindow.dm @@ -59,13 +59,16 @@ return /obj/structure/roguewindow/proc/wallpress(mob/living/user) - if(user.wallpressed) + if(user.wallpressed) { + // Release wallpressed state if already pressed + release_wallpress(user) return + } if(user.pixelshifted) return if(!(user.mobility_flags & MOBILITY_STAND)) return - var/dir2wall = get_dir(user,src) + var/dir2wall = get_dir(user, src) if(!(dir2wall in GLOB.cardinals)) return user.wallpressed = dir2wall @@ -85,6 +88,11 @@ user.setDir(EAST) user.set_mob_offsets("wall_press", _x = -12, _y = 0) +/obj/structure/roguewindow/proc/release_wallpress(mob/living/user) + user.wallpressed = null + user.update_wallpress_slowdown() + user.set_mob_offsets("reset_wall_press", _x = 0, _y = 0) + /obj/structure/roguewindow/stained icon_state = null base_state = null diff --git a/code/game/objects/structures/signs/signs_plaques.dm b/code/game/objects/structures/signs/signs_plaques.dm index 5100a19ab77..366d6285279 100644 --- a/code/game/objects/structures/signs/signs_plaques.dm +++ b/code/game/objects/structures/signs/signs_plaques.dm @@ -53,4 +53,4 @@ icon = 'icons/roguetown/misc/structure.dmi' icon_state = "deer_trophy" dir = SOUTH - pixel_y = 32 \ No newline at end of file + pixel_y = 32 diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm index cbe5f5077f1..facb100e81a 100644 --- a/code/game/objects/structures/spawner.dm +++ b/code/game/objects/structures/spawner.dm @@ -115,7 +115,7 @@ /mob/living/simple_animal/hostile/retaliate/rogue/goblin/cave = 3, //archer /mob/living/simple_animal/hostile/retaliate/rogue/goblin = 3) //archer spawn_text = "climbs out of" - faction = list("orc") + faction = list("orcs") /obj/structure/spawner/ghost name = "bone pile" @@ -147,6 +147,8 @@ /mob/living/simple_animal/hostile/rogue/ghost/wraith/wraith2 = 1, /mob/living/simple_animal/hostile/rogue/ghost/wraith/wraith3 = 1) +//Destructible mob spawners. Have a faster respawn rate, useful for events. + /obj/structure/spawner/monster name = "monster hole" desc = "" @@ -203,11 +205,13 @@ /mob/living/simple_animal/hostile/retaliate/rogue/bogtroll = 4, /mob/living/simple_animal/hostile/retaliate/rogue/cavetroll = 4) +//Indestructible invisible mob spawners. Use these for areas with respawning chests. + /obj/structure/spawner/invisible name = "" desc = "" resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF - spawn_time = 3600 + spawn_time = 4200 //7 minutes max_mobs = 1 mob_types = list( /mob/living/simple_animal/hostile/rogue/gravelord = 1) @@ -273,10 +277,10 @@ /obj/structure/spawner/invisible/monster/minotaur max_mobs = 1 mob_types = list( - /mob/living/simple_animal/hostile/retaliate/rogue/minotaur = 4, - /mob/living/simple_animal/hostile/retaliate/rogue/minotaur/axe = 3, - /mob/living/simple_animal/hostile/retaliate/rogue/minotaur/female = 4, - /mob/living/simple_animal/hostile/retaliate/rogue/minotaur/axe/female = 3) + /mob/living/simple_animal/hostile/retaliate/rogue/minotaur = 5, + /mob/living/simple_animal/hostile/retaliate/rogue/minotaur/axe = 1, + /mob/living/simple_animal/hostile/retaliate/rogue/minotaur/female = 5, + /mob/living/simple_animal/hostile/retaliate/rogue/minotaur/axe/female = 1) /obj/structure/spawner/invisible/monster/wolf max_mobs = 2 @@ -323,13 +327,72 @@ spawn_text = "appears out of hiding!" faction = list("orcs") -/obj/effect/mob_spawner/goblin - max_spawned_mobs = 6 - valid_area = /area/rogue/indoors/shelter/woods/overgrownfort +//Invisible spawners capable of handling carbon mobs. Use in dungeons and areas with respawning chests. +/obj/effect/mob_spawner/goblin + max_spawned_mobs = 14 + mobs_to_spawn = 7 + spawn_interval = 3000 //5 minutes + spawn_range = 9 + player_range = 13 ambush_mobs = list( - /mob/living/carbon/human/species/goblin/npc = 6, //archer - /mob/living/carbon/human/species/goblin/npc/hell = 1, - /mob/living/carbon/human/species/goblin/npc/cave = 4, - /mob/living/carbon/human/species/goblin/npc/sea= 1, - /mob/living/carbon/human/species/goblin/npc/moon = 1) + /mob/living/carbon/human/species/goblin/npc = 6, + /mob/living/carbon/human/species/goblin/npc/hell = 1, + /mob/living/carbon/human/species/goblin/npc/cave = 4, + /mob/living/carbon/human/species/goblin/npc/sea= 1, + /mob/living/carbon/human/species/goblin/npc/moon = 1) + +/obj/effect/mob_spawner/skeleton + max_spawned_mobs = 10 + mobs_to_spawn = 5 + spawn_interval = 3600 + spawn_range = 10 + player_range = 15 + ambush_mobs = list( + /mob/living/simple_animal/hostile/rogue/skeleton/guard/shield = 40, + /mob/living/simple_animal/hostile/rogue/skeleton/guard/xbow = 30, + /mob/living/simple_animal/hostile/rogue/skeleton/guard/crypt_guard = 20, + /mob/living/simple_animal/hostile/rogue/skeleton/guard/crypt_guard_spear = 20, + /mob/living/carbon/human/species/skeleton/npc/dungeon = 30, + /mob/living/carbon/human/species/skeleton/npc/dungeon/boss = 5) + +/obj/effect/mob_spawner/minotaur + max_spawned_mobs = 8 + mobs_to_spawn = 4 + spawn_interval = 3600 + spawn_range = 10 + player_range = 15 + ambush_mobs = list( + /mob/living/simple_animal/hostile/retaliate/rogue/minotaur = 20, + /mob/living/simple_animal/hostile/retaliate/rogue/minotaur/axe = 5, + /mob/living/simple_animal/hostile/retaliate/rogue/minotaur/female = 20, + /mob/living/simple_animal/hostile/retaliate/rogue/minotaur/axe/female = 5) + +/obj/effect/mob_spawner/mossback + max_spawned_mobs = 8 + mobs_to_spawn = 4 + spawn_interval = 3000 + spawn_range = 10 + player_range = 15 + accepted_turf = /turf/open/water/cleanshallow + ambush_mobs = list(/mob/living/simple_animal/hostile/retaliate/rogue/mossback) + +/obj/effect/mob_spawner/wilderness + max_spawned_mobs = 6 + mobs_to_spawn = 3 + spawn_interval = 3000 + spawn_range = 15 + player_range = 20 + accepted_turf = /turf/open/floor/rogue/dirt + ambush_mobs = list(/mob/living/simple_animal/hostile/retaliate/rogue/saiga = 10, + /mob/living/simple_animal/hostile/retaliate/rogue/saigabuck = 15, + /mob/living/simple_animal/hostile/retaliate/rogue/goat = 10, + /mob/living/simple_animal/hostile/retaliate/rogue/goatmale = 15) + +/obj/effect/mob_spawner/wilderness/hostile + max_spawned_mobs = 8 + mobs_to_spawn = 4 + spawn_interval = 6000 + ambush_mobs = list(/mob/living/simple_animal/hostile/retaliate/rogue/wolf = 10, + /mob/living/simple_animal/hostile/retaliate/rogue/spider = 5, + /mob/living/simple_animal/hostile/retaliate/rogue/bigrat = 15) diff --git a/code/game/objects/structures/stairs.dm b/code/game/objects/structures/stairs.dm index 3077c938909..7736f8edc2d 100644 --- a/code/game/objects/structures/stairs.dm +++ b/code/game/objects/structures/stairs.dm @@ -36,7 +36,7 @@ icon_state = "fancy_stairs_l" /obj/structure/stairs/fancy/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index af60df1cf41..a1e8e5ab2e6 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -120,7 +120,7 @@ to_chat(user, span_danger("Throwing [pushed_mob] onto the table might hurt them!")) return var/added_passtable = FALSE - if(!pushed_mob.pass_flags & PASSTABLE) + if(!(pushed_mob.pass_flags & PASSTABLE)) added_passtable = TRUE pushed_mob.pass_flags |= PASSTABLE pushed_mob.Move(src.loc) @@ -183,8 +183,8 @@ if(!click_params || !click_params["icon-x"] || !click_params["icon-y"]) return //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf) - I.pixel_x = initial(I.pixel_x) += CLAMP(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) - I.pixel_y = initial(I.pixel_y) += CLAMP(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) + I.pixel_x = initial(I.pixel_x) + CLAMP(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) + I.pixel_y = initial(I.pixel_y) + CLAMP(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) return 1 return ..() @@ -199,8 +199,8 @@ if(!click_params || !click_params["icon-x"] || !click_params["icon-y"]) return //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf) - I.pixel_x = initial(I.pixel_x) += CLAMP(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) - I.pixel_y = initial(I.pixel_y) += CLAMP(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) + I.pixel_x = initial(I.pixel_x) + CLAMP(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) + I.pixel_y = initial(I.pixel_y) + CLAMP(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) return 1 /obj/structure/table/deconstruct(disassembled = TRUE, wrench_disassembly = 0) @@ -603,8 +603,8 @@ if(!click_params || !click_params["icon-x"] || !click_params["icon-y"]) return //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf) - W.pixel_x = initial(W.pixel_x) += CLAMP(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) - W.pixel_y = initial(W.pixel_y) += CLAMP(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) + W.pixel_x = initial(W.pixel_x) + CLAMP(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) + W.pixel_y = initial(W.pixel_y) + CLAMP(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) return 1 . = ..() diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm index b3f6f6b029d..073a978d75f 100644 --- a/code/game/objects/structures/traps.dm +++ b/code/game/objects/structures/traps.dm @@ -39,7 +39,7 @@ . = ..() if(!isliving(user)) return - if(user.mind && user.mind in immune_minds) + if(user.mind && (user.mind in immune_minds)) return if(get_dist(user, src) <= 1) . += span_notice("I reveal [src]!") diff --git a/code/game/objects/structures/traveltile.dm b/code/game/objects/structures/traveltile.dm index bf4592147d5..36e88ed0a35 100644 --- a/code/game/objects/structures/traveltile.dm +++ b/code/game/objects/structures/traveltile.dm @@ -63,7 +63,7 @@ var/image/I = image(icon = 'icons/turf/roguefloor.dmi', icon_state = "travel", layer = ABOVE_OPEN_TURF_LAYER, loc = src) add_alt_appearance(/datum/atom_hud/alternate_appearance/basic, required_trait, I) -/obj/structure/fluff/traveltile/proc/get_other_end_turf(var/return_travel = FALSE) +/obj/structure/fluff/traveltile/proc/get_other_end_turf(return_travel = FALSE) if(!aportalgoesto) return null for(var/obj/structure/fluff/traveltile/travel in shuffle(GLOB.traveltiles)) diff --git a/code/game/objects/structures/walldeco.dm b/code/game/objects/structures/walldeco.dm index b2b4d637f37..8db4db34505 100644 --- a/code/game/objects/structures/walldeco.dm +++ b/code/game/objects/structures/walldeco.dm @@ -203,7 +203,7 @@ icon_state = "wallflag" /obj/structure/fluff/walldeco/customflag/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else diff --git a/code/game/say.dm b/code/game/say.dm index d5f4530f0b7..dabcc08a16f 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -26,11 +26,12 @@ GLOBAL_LIST_INIT(freqtospan, list( spans |= speech_span if(!language) language = get_default_language() - send_speech(message, 7, src, , spans, message_language=language) - if(language.flags & SIGNLANG) + send_speech(message, 7, src, null, spans, message_language=language) + // fallback for non-mob atoms using sign language, somehow + var/datum/language/lang_datum = GLOB.language_datum_instances[language] + if(lang_datum.flags & SIGNLANG) //do emote from list - var/emote = pick(language.signlang_verb) - src.visible_message(span_emote("[emote]")) + visible_message(span_emote(pick(lang_datum.signlang_verb))) /atom/movable/proc/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode, original_message) SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, args) @@ -97,10 +98,6 @@ GLOBAL_LIST_INIT(freqtospan, list( if(istype(speaker, /mob/living)) var/mob/living/L = speaker namepart = "Unknown [(L.gender == FEMALE) ? "Woman" : "Man"]" - if(message_language.flags & SIGNLANG) - //do emote from list - var/emote = pick(message_language.signlang_verb) - L.emote(emote) else namepart = "Unknown" spanpart1 = "" @@ -176,10 +173,6 @@ GLOBAL_LIST_INIT(freqtospan, list( /proc/get_radio_name(freq) return freq - var/returntext = GLOB.reverseradiochannels["[freq]"] - if(returntext) - return returntext - return "[copytext_char("[freq]", 1, 4)].[copytext_char("[freq]", 4, 5)]" /proc/attach_spans(input, list/spans) return "[message_spans_start(spans)][input]" diff --git a/code/game/sound.dm b/code/game/sound.dm index 5139ce5bbb5..15251ea3058 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -26,15 +26,8 @@ var/source_z = turf_source.z var/list/listeners = SSmobs.clients_by_zlevel[source_z].Copy() - var/turf/above_turf = turf_source.above() - var/turf/below_turf = turf_source.below() - - if(above_turf) - if(!is_in_zweb(turf_source.z, above_turf.z)) - above_turf=null - if(below_turf) - if(!is_in_zweb(turf_source.z, below_turf.z)) - below_turf=null + var/turf/above_turf = GET_TURF_ABOVE(turf_source) + var/turf/below_turf = GET_TURF_BELOW(turf_source) if(soundping) ping_sound(source) @@ -51,19 +44,17 @@ else if(above_turf) listeners += SSmobs.clients_by_zlevel[above_turf.z] + listeners += SSmobs.dead_players_by_zlevel[above_turf.z] if(below_turf) listeners += SSmobs.clients_by_zlevel[below_turf.z] + listeners += SSmobs.dead_players_by_zlevel[below_turf.z] + + listeners += SSmobs.dead_players_by_zlevel[source_z] . = list() - for(var/P in listeners) - var/mob/M = P - if(get_dist(M, turf_source) <= maxdistance) - if(M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, repeat)) - . += M - for(var/P in SSmobs.dead_players_by_zlevel[source_z]) - var/mob/M = P + for(var/mob/M as anything in listeners) if(get_dist(M, turf_source) <= maxdistance) if(M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, repeat)) . += M diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index 9b7ba4d4f66..41974c13f18 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -76,11 +76,11 @@ if(lastminer && lastminer.goodluck(2) && mineralType) // Check if lastminer is not null // to_chat(lastminer, span_notice("Bonus ducks!")) new mineralType(src) - gets_drilled(lastminer, give_exp = FALSE) + gets_drilled(lastminer) queue_smooth_neighbors(src) ..() -/turf/closed/mineral/proc/gets_drilled(mob/living/user, give_exp = TRUE) +/turf/closed/mineral/proc/gets_drilled(mob/living/user, triggered_by_explosion = FALSE) new /obj/item/natural/stone(src) if(prob(30)) new /obj/item/natural/stone(src) @@ -119,12 +119,6 @@ gets_drilled(user) ..() -/turf/closed/mineral/attack_alien(mob/living/carbon/alien/M) - to_chat(M, span_notice("I start digging into the rock...")) - playsound(src, 'sound/blank.ogg', 50, TRUE) - if(do_after(M, 40, target = src)) - to_chat(M, span_notice("I tunnel into the rock.")) - gets_drilled(M) /* /turf/closed/mineral/Bumped(atom/movable/AM) ..() @@ -150,12 +144,12 @@ switch(severity) if(3) if (prob(75)) - gets_drilled(null, 1) + gets_drilled(null, triggered_by_explosion = TRUE) if(2) if (prob(90)) - gets_drilled(null, 1) + gets_drilled(null, triggered_by_explosion = TRUE) if(1) - gets_drilled(null, 1) + gets_drilled(null, triggered_by_explosion = TRUE) return /turf/closed/mineral/Spread(turf/T) @@ -575,7 +569,7 @@ to_chat(usr, span_warning("The rock seems to be too strong to destroy. Maybe I can break it once I become a master miner.")) -/turf/closed/mineral/strong/gets_drilled(user) +/turf/closed/mineral/strong/gets_drilled(user, triggered_by_explosion = FALSE) drop_ores() var/flags = NONE if(defer_change) // TODO: make the defer change var a var for any changeturf flag diff --git a/code/game/turfs/closed/transparent.dm b/code/game/turfs/closed/transparent.dm index f9c72d0796e..690dec89cb7 100644 --- a/code/game/turfs/closed/transparent.dm +++ b/code/game/turfs/closed/transparent.dm @@ -19,7 +19,7 @@ /turf/closed/transparent/update_multiz(prune_on_fail = FALSE, init = FALSE) . = ..() - var/turf/T = below() + var/turf/T = GET_TURF_BELOW(src) if(!T) vis_contents.len = 0 if(!show_bottom_level() && prune_on_fail) //If we cant show whats below, and we prune on fail, change the turf to plating as a fallback @@ -50,4 +50,4 @@ path = /turf/open/floor/rogue/naturalstone var/mutable_appearance/underlay_appearance = mutable_appearance(initial(path.icon), initial(path.icon_state), layer = TURF_LAYER, plane = PLANE_SPACE) underlays += underlay_appearance - return TRUE \ No newline at end of file + return TRUE diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm index e1abe6fe47f..399f638da5f 100644 --- a/code/game/turfs/closed/wall/mineral_walls.dm +++ b/code/game/turfs/closed/wall/mineral_walls.dm @@ -170,17 +170,6 @@ bullet_sizzle = TRUE bullet_bounce_sound = null -/turf/closed/wall/mineral/abductor - name = "alien wall" - desc = "" - icon = 'icons/turf/walls/abductor_wall.dmi' - icon_state = "abductor" - smooth = SMOOTH_TRUE|SMOOTH_DIAGONAL - sheet_type = /obj/item/stack/sheet/mineral/abductor - slicing_duration = 200 //alien wall takes twice as much time to slice - explosion_block = 3 - canSmoothWith = list(/turf/closed/wall/mineral/abductor, /obj/structure/falsewall/abductor) - /////////////////////Titanium walls///////////////////// /turf/closed/wall/mineral/titanium //has to use this path due to how building walls works diff --git a/code/game/turfs/open/chasm.dm b/code/game/turfs/open/chasm.dm index c4ba4e5823f..8d54ba48fd7 100644 --- a/code/game/turfs/open/chasm.dm +++ b/code/game/turfs/open/chasm.dm @@ -12,7 +12,7 @@ /turf/open/chasm/Initialize() . = ..() - AddComponent(/datum/component/chasm, SSmapping.get_turf_below(src)) + AddComponent(/datum/component/chasm, GET_TURF_BELOW(src)) /turf/open/chasm/proc/set_target(turf/target) var/datum/component/chasm/chasm_component = GetComponent(/datum/component/chasm) diff --git a/code/game/turfs/open/floor/roguefloor.dm b/code/game/turfs/open/floor/roguefloor.dm index c56c14b1947..ff338da3c2e 100644 --- a/code/game/turfs/open/floor/roguefloor.dm +++ b/code/game/turfs/open/floor/roguefloor.dm @@ -152,18 +152,14 @@ slowdown = 0 smooth = SMOOTH_TRUE neighborlay = "grassedge" + /turf/open/floor/rogue/grass/get_slowdown(mob/user) - var/returned = slowdown - var/negate_slowdown = FALSE - if(HAS_TRAIT(user, TRAIT_BOG_TREKKING)) - negate_slowdown = TRUE - if(negate_slowdown) - returned = max(returned-0.5, -1) + var returned = slowdown // Initialize 'returned' with a default value + if (HAS_TRAIT(user, TRAIT_BOG_TREKKING)) + returned = 0 // No slowdown if user has 'TRAIT_BOG_TREKKING' return returned -// /turf/open/floor/rogue/grass/Initialize() -// dir = pick(GLOB.cardinals) -// GLOB.dirt_list += src -// . = ..() + + /turf/open/floor/rogue/grass/cardinal_smooth(adjacencies) roguesmooth(adjacencies) @@ -221,28 +217,35 @@ var/dirt_amt = 3 /turf/open/floor/rogue/dirt/get_slowdown(mob/user) - //No tile slowdown for fairies + // No tile slowdown for fairies var/mob/living/carbon/human/FM = user - if(isseelie(FM) && !(FM.resting)) //Add wingcheck + if (isseelie(FM) && !(FM.resting)) // Add wingcheck return 0 - var/returned = slowdown - var/negate_slowdown = FALSE - for(var/obj/item/I in user.held_items) - if(I.walking_stick) - if(!I.wielded) + // Define 'returned' with an initial value + var returned = slowdown + var negate_slowdown = FALSE + + // Check for walking stick + for (var/obj/item/I in user.held_items) + if (I.walking_stick) + if (!I.wielded) var/mob/living/L = user - if(!L.cmode) + if (!L.cmode) negate_slowdown = TRUE - if(HAS_TRAIT(user, TRAIT_BOG_TREKKING)) - negate_slowdown = TRUE - if(negate_slowdown) - returned = max(returned-2.5, -1) + // Additional check for 'TRAIT_BOG_TREKKING' + if (HAS_TRAIT(user, TRAIT_BOG_TREKKING)) + returned = 0 + + if (negate_slowdown) + returned = 0 + return returned + /turf/open/floor/rogue/dirt/attack_right(mob/user) if(isliving(user)) var/mob/living/L = user @@ -301,24 +304,11 @@ return TRUE /turf/open/floor/rogue/dirt/road/update_water() - water_level = max(water_level-10,0) - for(var/D in GLOB.cardinals) - var/turf/TU = get_step(src, D) - if(istype(TU, /turf/open/water)) - if(!muddy) - become_muddy() - return TRUE //stop processing -/* if(water_level > 10) //this would be a switch on normal tiles - if(!muddy) - become_muddy()*/ -//flood process goes here to spread to other turfs etc -// if(water_level > 250) -// return FALSE if(muddy) if(water_level <= 0) water_level = 0 muddy = FALSE - slowdown = initial(slowdown) + slowdown = 0 // fuck you im tired of trying to clean this slop. icon_state = initial(icon_state) name = initial(name) footstep = initial(footstep) @@ -355,13 +345,11 @@ canSmoothWith = list(/turf/open/floor/rogue/dirt,/turf/open/floor/rogue/grass) neighborlay = "roadedge" slowdown = 0 + /turf/open/floor/rogue/dirt/road/get_slowdown(mob/user) - var/returned = slowdown - var/negate_slowdown = FALSE - if(HAS_TRAIT(user, TRAIT_BOG_TREKKING)) - negate_slowdown = TRUE - if(negate_slowdown) - returned = max(returned-0.5, -1) + var returned = slowdown // Initialize 'returned' with a default value + if (HAS_TRAIT(user, TRAIT_BOG_TREKKING)) + returned = 0 // No slowdown if user has 'TRAIT_BOG_TREKKING' return returned /turf/open/floor/rogue/dirt/road/attack_right(mob/user) return @@ -1044,7 +1032,7 @@ icon_state = "" /turf/open/floor/rogue/carpet/lord/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index c2fd66b689c..5522cb423f6 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -226,6 +226,30 @@ light_range = 4 light_power = 1 light_color = "#56ff0d" + var/acid_reagent = /datum/reagent/toxin/acid + +/turf/open/lava/acid/attackby(obj/item/C, mob/user, params) + if(user.used_intent.type == INTENT_FILL) + if(C.reagents) + if(!istype(C, /obj/item/reagent_containers/glass/bottle)) //you cant collect this shit with a waterskin + var/mob/living/carbon/boi = user + to_chat(C, span_userdanger("WHY DID I THINK THIS WAS A GOOD IDEA???")) + boi.flash_fullscreen("redflash3") + boi.emote("agony", forced = TRUE) + boi.adjustFireLoss(50) + return + if(C.reagents.holder_full()) + to_chat(user, span_warning("[C] is full.")) + return + if(do_after(user, 8, target = src)) + user.changeNext_move(CLICK_CD_MELEE) + playsound(user, 'sound/foley/drawwater.ogg', 100, FALSE) + var/list/L = list() + L[acid_reagent] = 100 + C.reagents.add_reagent_list(L) + to_chat(user, span_notice("I fill [C] from [src].")) + return + . = ..() /turf/open/lava/acid/burn_stuff(AM) . = 0 diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index 1bbed69a62c..34653cb38da 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -1,7 +1,7 @@ /turf/open/space icon = 'icons/turf/space.dmi' - icon_state = "0" - name = "\proper phlogiston" + icon_state = "black" + name = "\proper nothing" intact = 0 temperature = TCMB diff --git a/code/game/turfs/open/transparent.dm b/code/game/turfs/open/transparent.dm index d0a219ac2b7..cee173d0415 100644 --- a/code/game/turfs/open/transparent.dm +++ b/code/game/turfs/open/transparent.dm @@ -19,7 +19,7 @@ /turf/open/transparent/update_multiz(prune_on_fail = FALSE, init = FALSE) . = ..() - var/turf/T = below() + var/turf/T = GET_TURF_BELOW(src) if(!T) vis_contents.len = 0 if(!show_bottom_level() && prune_on_fail) //If we cant show whats below, and we prune on fail, change the turf to plating as a fallback diff --git a/code/game/turfs/open/water.dm b/code/game/turfs/open/water.dm index 9c0112e4ac1..36c24cbd786 100644 --- a/code/game/turfs/open/water.dm +++ b/code/game/turfs/open/water.dm @@ -304,13 +304,12 @@ BP.add_embedded_object(I, silent = TRUE) return . /turf/open/water/swamp/get_slowdown(mob/user) - var/returned = slowdown - var/negate_slowdown = FALSE - if(HAS_TRAIT(user, TRAIT_BOG_TREKKING)) - negate_slowdown = TRUE - if(negate_slowdown) - returned = max(returned-1.5, 0) + var returned = slowdown // Initialize 'returned' with a default value + if (HAS_TRAIT(user, TRAIT_BOG_TREKKING)) + returned = 0 // No slowdown if user has 'TRAIT_BOG_TREKKING' return returned + + /turf/open/water/swamp/deep name = "murk" desc = "Deep water with several weeds and algae on the surface." diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 8239bef8358..1fded1069ca 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -61,6 +61,7 @@ . = ..() /turf/Initialize(mapload) + SHOULD_CALL_PARENT(FALSE) #ifdef TESTSERVER if(!icon_state) icon_state = "cantfind" @@ -96,11 +97,11 @@ if(turf_integrity == null) turf_integrity = max_integrity - var/turf/T = SSmapping.get_turf_above(src) + var/turf/T = GET_TURF_ABOVE(src) if(T) T.multiz_turf_new(src, DOWN) SEND_SIGNAL(T, COMSIG_TURF_MULTIZ_NEW, src, DOWN) - T = SSmapping.get_turf_below(src) + T = GET_TURF_BELOW(src) if(T) T.multiz_turf_new(src, UP) SEND_SIGNAL(T, COMSIG_TURF_MULTIZ_NEW, src, UP) @@ -122,10 +123,10 @@ if(!changing_turf) stack_trace("Incorrect turf deletion") changing_turf = FALSE - var/turf/T = SSmapping.get_turf_above(src) + var/turf/T = GET_TURF_ABOVE(src) if(T) T.multiz_turf_del(src, DOWN) - T = SSmapping.get_turf_below(src) + T = GET_TURF_BELOW(src) if(T) T.multiz_turf_del(src, UP) STOP_PROCESSING(SSweather,src) @@ -605,8 +606,6 @@ /turf/acid_act(acidpwr, acid_volume) . = 1 var/acid_type = /obj/effect/acid - if(acidpwr >= 200) //alien acid power - acid_type = /obj/effect/acid/alien var/has_acid_effect = FALSE for(var/obj/O in src) if(intact && O.level == 1) //hidden under the floor diff --git a/code/game/world.dm b/code/game/world.dm index 2d9dbcc0a11..abba61ff41b 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -99,8 +99,9 @@ GLOBAL_VAR(restart_counter) Master.Initialize(10, FALSE, TRUE) - if(TEST_RUN_PARAMETER in params) - HandleTestRun() +#ifdef UNIT_TESTS + HandleTestRun() +#endif update_status() @@ -208,7 +209,6 @@ GLOBAL_VAR(restart_counter) /world/Topic(T, addr, master, key) TGS_TOPIC //redirect to server tools if necessary - return // Disable topics altogether var/static/list/topic_handlers = TopicHandlers() @@ -290,9 +290,10 @@ GLOBAL_VAR(restart_counter) TgsReboot() - if(TEST_RUN_PARAMETER in params) - FinishTestRun() - return +#ifdef UNIT_TESTS + FinishTestRun() + return +#endif if(TgsAvailable()) send2chat(new /datum/tgs_message_content("Round ending!"), CONFIG_GET(string/channel_announce_new_game)) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 73181e5979d..363d139330e 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -223,11 +223,11 @@ if(!check_rights()) return FALSE - + var/category = input("Category") as null|anything in list("Ten", "Inhuman", "Special") if(!category) return FALSE - + var/curse switch(category) if("Ten") @@ -236,7 +236,7 @@ curse = input("Curse") as null|anything in INHUMEN_CURSES if("Special") curse = input("Curse") as null|anything in SPECIAL_CURSES - + if(!curse) return FALSE @@ -262,7 +262,7 @@ if(!check_rights()) return - + if(!M.ckey) to_chat(src, span_warning("There is no ckey attached to this mob.")) return @@ -276,7 +276,7 @@ if(!check_rights()) return - + var/S = M.IsSleeping() if(S) M.remove_status_effect(S) @@ -310,7 +310,7 @@ if(!check_rights()) return - + if(!M.ckey) to_chat(src, span_warning("There is no ckey attached to this mob.")) return @@ -728,13 +728,13 @@ if(SSticker.current_state == GAME_STATE_PREGAME || SSticker.current_state == GAME_STATE_STARTUP) if(alert("Enter Manual Gamemode Selection? Will disable random generation",,"Yes","No") == "Yes") for(var/I in 1 to 10) - var/choice = input(usr, "Select Gamemodes", "Select Gamemodes") as anything in roguegamemodes|null + var/choice = input(usr, "Select Gamemodes", "Select Gamemodes") as anything in GLOB.roguegamemodes|null if(!choice || choice == "CANCEL") message_admins("\ [usr.key] has forced the gamemode.") return SSticker.manualmodes |= choice - roguegamemodes -= choice + GLOB.roguegamemodes -= choice else to_chat(usr, "Error: Force Modes: Game has already started.") diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index d2f10a2e858..c1a1e52778d 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -24,7 +24,6 @@ GLOBAL_PROTECT(protected_ranks) if(!name) qdel(src) CRASH("Admin rank created without name.") - return if(init_rights) rights = init_rights include_rights = rights @@ -218,6 +217,9 @@ GLOBAL_PROTECT(protected_ranks) GLOB.deadmins.Cut() var/list/backup_file_json = load_admin_ranks(dbfail, no_update) dbfail = backup_file_json != null + //Clear profile access + for(var/A in world.GetConfig("admin")) + world.SetConfig("APP/admin", A, null) var/list/rank_names = list() for(var/datum/admin_rank/R in GLOB.admin_ranks) rank_names[R.name] = R diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 98f673d6103..363543f61f4 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -41,17 +41,17 @@ GLOBAL_PROTECT(href_token) if(!ckey) QDEL_IN(src, 0) CRASH("Admin datum created without a ckey") - return if(!istype(R)) QDEL_IN(src, 0) CRASH("Admin datum created without a rank") - return target = ckey name = "[ckey]'s admin datum ([R])" rank = R admin_signature = "Nanotrasen Officer #[rand(0,9)][rand(0,9)][rand(0,9)]" href_token = GenerateToken() role_ban_panel = new /datum/role_ban_panel(src) + if(R.rights & R_DEBUG) //grant profile access + world.SetConfig("APP/admin", ckey, "role=admin") //only admins with +ADMIN start admined if(protected) GLOB.protected_admins[target] = src diff --git a/code/modules/admin/permissionedit.dm b/code/modules/admin/permissionedit.dm index f3ac048316d..8b15c369b30 100644 --- a/code/modules/admin/permissionedit.dm +++ b/code/modules/admin/permissionedit.dm @@ -212,7 +212,7 @@ . = ckey(admin_key) if(!.) return FALSE - if(!admin_ckey && (. in GLOB.admin_datums+GLOB.deadmins)) + if(!admin_ckey && ((. in GLOB.admin_datums) || (. in GLOB.deadmins))) to_chat(usr, span_danger("[admin_key] is already an admin.")) return FALSE if(use_db) diff --git a/code/modules/admin/player_curses.dm b/code/modules/admin/player_curses.dm index ccad8e6c668..839f106e51b 100644 --- a/code/modules/admin/player_curses.dm +++ b/code/modules/admin/player_curses.dm @@ -62,4 +62,4 @@ json[curse] = null fdel(json_file) WRITE_FILE(json_file, json_encode(json)) - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 21b19dbab3d..35f75e9b3d1 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -225,11 +225,6 @@ M_job = M.get_role_title() else if(ismonkey(M)) M_job = "Monkey" - else if(isalien(M)) //aliens - if(islarva(M)) - M_job = "Alien larva" - else - M_job = ROLE_ALIEN else M_job = "Carbon-based" diff --git a/code/modules/admin/playerquality.dm b/code/modules/admin/playerquality.dm index 8fdd804d720..77cb305995d 100644 --- a/code/modules/admin/playerquality.dm +++ b/code/modules/admin/playerquality.dm @@ -124,7 +124,7 @@ /proc/check_pq_menu(ckey) if(!fexists("data/player_saves/[copytext(ckey,1,2)]/[ckey]/preferences.sav")) - to_chat(src, span_boldwarning("User does not exist.")) + to_chat(usr, span_boldwarning("User does not exist.")) return var/popup_window_data = "
[ckey]
" popup_window_data += "
PQ: [get_playerquality(ckey, TRUE, TRUE)] ([get_playerquality(ckey, FALSE, TRUE)])
" diff --git a/code/modules/admin/role_ban_panel.dm b/code/modules/admin/role_ban_panel.dm index a98ce20030e..32f3a28ecd4 100644 --- a/code/modules/admin/role_ban_panel.dm +++ b/code/modules/admin/role_ban_panel.dm @@ -13,6 +13,7 @@ var/list/misc /datum/role_ban_instance/proc/get_ban_string_list() + RETURN_TYPE(/list) var/list/strings = list() strings += "Applied by [applied_by], on date: [time2text(apply_date, "DD,MM,YYYY")]; Duration: [permanent ? "Permanent" : "[duration / (24 HOURS)] days"]" strings += "Round ID: [round_id];Reason: [reason]" @@ -80,7 +81,7 @@ permanent = json["permanent"] applied_by = json["applied_by"] reason = json["reason"] - var/list/ban_data = json["bans"] + var/list/list/ban_data = json["bans"] if(ban_data["roles"]) roles = ban_data["roles"].Copy() if(ban_data["migrants"]) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 0855f89ffd3..38a0e7d79ab 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -56,7 +56,7 @@ to_chat(usr, span_danger("ERROR: Client not found.")) return toggle_exempt_status(C) - + else if(href_list["forceevent"]) if(!check_rights(R_FUN)) return @@ -264,18 +264,6 @@ switch(href_list["simplemake"]) if("observer") M.change_mob_type( /mob/dead/observer , null, null, delmob ) - if("drone") - M.change_mob_type( /mob/living/carbon/alien/humanoid/drone , null, null, delmob ) - if("hunter") - M.change_mob_type( /mob/living/carbon/alien/humanoid/hunter , null, null, delmob ) - if("queen") - M.change_mob_type( /mob/living/carbon/alien/humanoid/royal/queen , null, null, delmob ) - if("praetorian") - M.change_mob_type( /mob/living/carbon/alien/humanoid/royal/praetorian , null, null, delmob ) - if("sentinel") - M.change_mob_type( /mob/living/carbon/alien/humanoid/sentinel , null, null, delmob ) - if("larva") - M.change_mob_type( /mob/living/carbon/alien/larva , null, null, delmob ) if("human") var/posttransformoutfit = usr.client.robust_dress_shop() if (!posttransformoutfit) @@ -1054,17 +1042,6 @@ log_admin("[key_name(usr)] AIized [key_name(H)].") H.AIize(TRUE, H.client) - else if(href_list["makealien"]) - if(!check_rights(R_SPAWN)) - return - - var/mob/living/carbon/human/H = locate(href_list["makealien"]) - if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human.") - return - - usr.client.cmd_admin_alienize(H) - else if(href_list["makeslime"]) if(!check_rights(R_SPAWN)) return diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index b4ad0777efb..16b42326fd1 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -332,7 +332,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null //These three are weird. For best performance, they are only a number when they're not being changed by the SDQL searching/execution code. They only become numbers when they finish changing. var/list/obj_count_all var/list/obj_count_eligible - var/list/obj_count_finished + var/obj_count_finished //Statclick var/obj/effect/statclick/SDQL2_delete/delete_click @@ -715,7 +715,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null SDQL2_TICK_CHECK SDQL2_HALT_CHECK if(islist(obj_count_finished)) - obj_count_finished = obj_count_finished.len + obj_count_finished = length(obj_count_finished) state = SDQL2_STATE_SWITCHING /datum/SDQL2_query/proc/SDQL_print(object, list/text_list, print_nulls = TRUE) diff --git a/code/modules/admin/verbs/borgpanel.dm b/code/modules/admin/verbs/borgpanel.dm index 1e932f8c97d..65d0f9a5df3 100644 --- a/code/modules/admin/verbs/borgpanel.dm +++ b/code/modules/admin/verbs/borgpanel.dm @@ -24,8 +24,8 @@ /datum/borgpanel/New(to_user, mob/living/silicon/robot/to_borg) if(!istype(to_borg)) - CRASH("Borg panel is only available for borgs") qdel(src) + CRASH("Borg panel is only available for borgs") user = CLIENT_FROM_VAR(to_user) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index b1a84db71e2..c9c8d9d6c3e 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -120,21 +120,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that SSpai.candidates.Remove(candidate) SSblackbox.record_feedback("tally", "admin_verb", 1, "Make pAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/cmd_admin_alienize(mob/M in GLOB.mob_list) - set category = "Fun" - set name = "Make Alien" - - if(!SSticker.HasRoundStarted()) - alert("Wait until the game starts") - return - if(ishuman(M)) - INVOKE_ASYNC(M, TYPE_PROC_REF(/mob/living/carbon/human, Alienize)) - SSblackbox.record_feedback("tally", "admin_verb", 1, "Make Alien") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_admin("[key_name(usr)] made [key_name(M)] into an alien at [AREACOORD(M)].") - message_admins(span_adminnotice("[key_name_admin(usr)] made [ADMIN_LOOKUPFLW(M)] into an alien.")) - else - alert("Invalid mob") - /client/proc/cmd_admin_slimeize(mob/M in GLOB.mob_list) set category = "Fun" set name = "Make slime" diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 44621fb1127..703fb6246ad 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -134,7 +134,7 @@ GLOBAL_LIST_EMPTY(dirty_vars) if(!(locate(/obj/structure/grille) in T)) var/window_check = 0 for(var/obj/structure/window/W in T) - if (W.dir == turn(C1.dir,180) || W.dir in list(5,6,9,10) ) + if (W.dir == turn(C1.dir,180) || (W.dir in GLOB.diagonals)) window_check = 1 break if(!window_check) diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 72d8c783874..45e73a0ee03 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -51,7 +51,7 @@ if(C.prefs.chat_toggles & CHAT_PRAYER) to_chat(C, msg) if(C.prefs.toggles & SOUND_PRAYERS) - if(usr.job == "Prophet") + if(usr.job == "Archpriest") SEND_SOUND(C, sound('sound/pray.ogg')) for(var/mob/M in GLOB.dead_mob_list) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 82cd1c15bdb..295e27a60d6 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -281,55 +281,6 @@ to_chat(C, "You have been [muteunmute] from [mute_string] by [key_name(usr, include_name = FALSE)].") SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Mute [feedback_string]", "[P.muted & mute_type]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -//I use this proc for respawn character too. /N -/proc/create_xeno(ckey) - if(!ckey) - var/list/candidates = list() - for(var/mob/M in GLOB.player_list) - if(M.stat != DEAD) - continue //we are not dead! - if(!(ROLE_ALIEN in M.client.prefs.be_special)) - continue //we don't want to be an alium - if(M.client.is_afk()) - continue //we are afk - if(M.mind && M.mind.current && M.mind.current.stat != DEAD) - continue //we have a live body we are tied to - candidates += M.ckey - if(candidates.len) - ckey = input("Pick the player you want to respawn as a xeno.", "Suitable Candidates") as null|anything in sortKey(candidates) - else - to_chat(usr, span_danger("Error: create_xeno(): no suitable candidates.")) - if(!istext(ckey)) - return 0 - - var/alien_caste = input(usr, "Please choose which caste to spawn.","Pick a caste",null) as null|anything in list("Queen","Praetorian","Hunter","Sentinel","Drone","Larva") - var/obj/effect/landmark/spawn_here = GLOB.xeno_spawn.len ? pick(GLOB.xeno_spawn) : null - var/mob/living/carbon/alien/new_xeno - switch(alien_caste) - if("Queen") - new_xeno = new /mob/living/carbon/alien/humanoid/royal/queen(spawn_here) - if("Praetorian") - new_xeno = new /mob/living/carbon/alien/humanoid/royal/praetorian(spawn_here) - if("Hunter") - new_xeno = new /mob/living/carbon/alien/humanoid/hunter(spawn_here) - if("Sentinel") - new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(spawn_here) - if("Drone") - new_xeno = new /mob/living/carbon/alien/humanoid/drone(spawn_here) - if("Larva") - new_xeno = new /mob/living/carbon/alien/larva(spawn_here) - else - return 0 - if(!spawn_here) - SSjob.SendToLateJoin(new_xeno, FALSE) - - new_xeno.ckey = ckey - var/msg = span_notice("[key_name_admin(usr)] has spawned [ckey] as a filthy xeno [alien_caste].") - message_admins(msg) - admin_ticket_log(new_xeno, msg) - return 1 - /* If a guy was gibbed and you want to revive him, this is a good way to do so. Works kind of like entering the game with a new character. Character receives a new mind if they didn't have one. @@ -357,43 +308,9 @@ Traitors and the like can also be revived with the previous role mostly intact. return if(G_found.mind && !G_found.mind.active) //mind isn't currently in use by someone/something - //Check if they were an alien - if(G_found.mind.assigned_role == ROLE_ALIEN) - if(alert("This character appears to have been an alien. Would you like to respawn them as such?",,"Yes","No")=="Yes") - var/turf/T - if(GLOB.xeno_spawn.len) - T = pick(GLOB.xeno_spawn) - - var/mob/living/carbon/alien/new_xeno - switch(G_found.mind.special_role)//If they have a mind, we can determine which caste they were. - if("Hunter") - new_xeno = new /mob/living/carbon/alien/humanoid/hunter(T) - if("Sentinel") - new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(T) - if("Drone") - new_xeno = new /mob/living/carbon/alien/humanoid/drone(T) - if("Praetorian") - new_xeno = new /mob/living/carbon/alien/humanoid/royal/praetorian(T) - if("Queen") - new_xeno = new /mob/living/carbon/alien/humanoid/royal/queen(T) - else//If we don't know what special role they have, for whatever reason, or they're a larva. - create_xeno(G_found.ckey) - return - - if(!T) - SSjob.SendToLateJoin(new_xeno, FALSE) - - //Now to give them their mind back. - G_found.mind.transfer_to(new_xeno) //be careful when doing stuff like this! I've already checked the mind isn't in use - new_xeno.key = G_found.key - to_chat(new_xeno, "You have been fully respawned. Enjoy the game.") - var/msg = span_adminnotice("[key_name_admin(usr)] has respawned [new_xeno.key] as a filthy xeno.") - message_admins(msg) - admin_ticket_log(new_xeno, msg) - return //all done. The ghost is auto-deleted //check if they were a monkey - else if(findtext(G_found.real_name,"monkey")) + if(findtext(G_found.real_name,"monkey")) if(alert("This character appears to have been a monkey. Would you like to respawn them as such?",,"Yes","No")=="Yes") var/mob/living/carbon/monkey/new_monkey = new SSjob.SendToLateJoin(new_monkey) @@ -1085,12 +1002,6 @@ Traitors and the like can also be revived with the previous role mostly intact. bluespace_artillery(target) if(ADMIN_PUNISHMENT_FIREBALL) new /obj/effect/temp_visual/target(get_turf(target)) - if(ADMIN_PUNISHMENT_ROD) - var/turf/T = get_turf(target) - var/startside = pick(GLOB.cardinals) - var/turf/startT = spaceDebrisStartLoc(startside, T.z) - var/turf/endT = spaceDebrisFinishLoc(startside, T.z) - new /obj/effect/immovablerod(startT, endT,target) if(ADMIN_PUNISHMENT_SUPPLYPOD_QUICK) var/target_path = input(usr,"Enter typepath of an atom you'd like to send with the pod (type \"empty\" to send an empty pod):" ,"Typepath","/obj/item/reagent_containers/food/snacks/grown/harebell") as null|text var/obj/structure/closet/supplypod/centcompod/pod = new() diff --git a/code/modules/admin/view_variables/debug_variables.dm b/code/modules/admin/view_variables/debug_variables.dm index 23f85cba156..5ac8fa441ea 100644 --- a/code/modules/admin/view_variables/debug_variables.dm +++ b/code/modules/admin/view_variables/debug_variables.dm @@ -3,11 +3,12 @@ var/header if(D) if(islist(D)) + var/list/dlist = D var/index = name if (value) - name = D[name] //name is really the index until this line + name = dlist[name] //name is really the index until this line else - value = D[name] + value = dlist[name] header = "
  • ([VV_HREF_TARGET_1V(D, VV_HK_LIST_EDIT, "E", index)]) ([VV_HREF_TARGET_1V(D, VV_HK_LIST_CHANGE, "C", index)]) ([VV_HREF_TARGET_1V(D, VV_HK_LIST_REMOVE, "-", index)]) " else header = "
  • ([VV_HREF_TARGET_1V(D, VV_HK_BASIC_EDIT, "E", name)]) ([VV_HREF_TARGET_1V(D, VV_HK_BASIC_CHANGE, "C", name)]) ([VV_HREF_TARGET_1V(D, VV_HK_BASIC_MASSEDIT, "M", name)]) " diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 685c4c32c9f..87a62989b83 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -266,7 +266,7 @@ GLOBAL_LIST_EMPTY(antagonists) show_name_in_check_antagonists = TRUE //They're all different var/datum/team/custom_team -datum/antagonist/custom/create_team(datum/team/team) +/datum/antagonist/custom/create_team(datum/team/team) custom_team = team /datum/antagonist/custom/get_team() diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index bd2526cd88b..34bee414e72 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -220,61 +220,3 @@ new_borg.send_to_spawnpoint = FALSE R.mind.add_antag_datum(new_borg,creator_op.nuke_team) R.mind.special_role = "Syndicate Cyborg" - -///////////SLAUGHTER DEMON - -/obj/item/antag_spawner/slaughter_demon //Warning edgiest item in the game - name = "vial of blood" - desc = "" - icon = 'icons/obj/wizard.dmi' - icon_state = "vial" - - var/shatter_msg = span_notice("I shatter the bottle, no turning back now!") - var/veil_msg = span_warning("I sense a dark presence lurking just beyond the veil...") - var/mob/living/demon_type = /mob/living/simple_animal/slaughter - var/antag_type = /datum/antagonist/slaughter - - -/obj/item/antag_spawner/slaughter_demon/attack_self(mob/user) - if(!is_station_level(user.z)) - to_chat(user, span_warning("I should probably wait until you reach the station.")) - return - if(used) - return - var/list/candidates = pollCandidatesForMob("Do you want to play as a [initial(demon_type.name)]?", ROLE_ALIEN, null, ROLE_ALIEN, 50, src) - if(LAZYLEN(candidates)) - if(used || QDELETED(src)) - return - used = TRUE - var/mob/dead/observer/C = pick(candidates) - spawn_antag(C.client, get_turf(src), initial(demon_type.name),user.mind) - to_chat(user, shatter_msg) - to_chat(user, veil_msg) - playsound(user.loc, 'sound/blank.ogg', 100, TRUE) - qdel(src) - else - to_chat(user, span_warning("I can't seem to work up the nerve to shatter the bottle! Perhaps you should try again later.")) - - -/obj/item/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, kind = "", datum/mind/user) - var/obj/effect/dummy/phased_mob/slaughter/holder = new /obj/effect/dummy/phased_mob/slaughter(T) - var/mob/living/simple_animal/slaughter/S = new demon_type(holder) - S.holder = holder - S.key = C.key - S.mind.assigned_role = S.name - S.mind.special_role = S.name - S.mind.add_antag_datum(antag_type) - to_chat(S, S.playstyle_string) - to_chat(S, "I are currently not currently in the same plane of existence as the station. \ - Ctrl+Click a blood pool to manifest.") - -/obj/item/antag_spawner/slaughter_demon/laughter - name = "vial of tickles" - desc = "" - icon = 'icons/obj/wizard.dmi' - icon_state = "vial" - color = "#FF69B4" // HOT PINK - - veil_msg = span_warning("I sense an adorable presence lurking just beyond the veil...") - demon_type = /mob/living/simple_animal/slaughter/laughter - antag_type = /datum/antagonist/slaughter/laughter diff --git a/code/modules/antagonists/abductor/abductee/abductee_objectives.dm b/code/modules/antagonists/abductor/abductee/abductee_objectives.dm deleted file mode 100644 index f1883196448..00000000000 --- a/code/modules/antagonists/abductor/abductee/abductee_objectives.dm +++ /dev/null @@ -1,54 +0,0 @@ -/datum/objective/abductee - completed = 1 - -/datum/objective/abductee/random - -/datum/objective/abductee/random/New() - explanation_text = pick(world.file2list("strings/abductee_objectives.txt")) - -/datum/objective/abductee/steal - explanation_text = "Steal all" - -/datum/objective/abductee/steal/New() - var/target = pick(list("pets","lights","monkeys","fruits","shoes","bars of soap", "weapons", "computers", "organs")) - explanation_text+=" [target]." - -/datum/objective/abductee/paint - explanation_text = "The station is hideous. You must color it all" - -/datum/objective/abductee/paint/New() - var/color = pick(list("red", "blue", "green", "yellow", "orange", "purple", "black", "in rainbows", "in blood")) - explanation_text+= " [color]!" - -/datum/objective/abductee/speech - explanation_text = "Your brain is broken... you can only communicate in" - -/datum/objective/abductee/speech/New() - var/style = pick(list("pantomime", "rhyme", "haiku", "extended metaphors", "riddles", "extremely literal terms", "sound effects", "military jargon", "three word sentences")) - explanation_text+= " [style]." - -/datum/objective/abductee/capture - explanation_text = "Capture" - -/datum/objective/abductee/capture/New() - var/list/jobs = SSjob.occupations.Copy() - for(var/X in jobs) - var/datum/job/J = X - if(J.current_positions < 1) - jobs -= J - if(jobs.len > 0) - var/datum/job/target = pick(jobs) - explanation_text += " a [target.title]." - else - explanation_text += " someone." - -/datum/objective/abductee/calling/New() - var/mob/dead/D = pick(GLOB.dead_mob_list) - if(D) - explanation_text = "You know that [D] has perished. Hold a seance to call [D.p_them()] from the spirit realm." - -/datum/objective/abductee/forbiddennumber - -/datum/objective/abductee/forbiddennumber/New() - var/number = rand(2,10) - explanation_text = "Ignore anything in a set of [number], they don't exist." diff --git a/code/modules/antagonists/abductor/abductor.dm b/code/modules/antagonists/abductor/abductor.dm deleted file mode 100644 index 64c909e6574..00000000000 --- a/code/modules/antagonists/abductor/abductor.dm +++ /dev/null @@ -1,219 +0,0 @@ -#define ABDUCTOR_MAX_TEAMS 4 - -/datum/antagonist/abductor - name = "Abductor" - roundend_category = "abductors" - antagpanel_category = "Abductor" - job_rank = ROLE_ABDUCTOR - antag_hud_type = ANTAG_HUD_ABDUCTOR - antag_hud_name = "abductor" - show_in_antagpanel = FALSE //should only show subtypes - var/datum/team/abductor_team/team - var/sub_role - var/outfit - var/landmark_type - var/greet_text - - -/datum/antagonist/abductor/agent - name = "Abductor Agent" - sub_role = "Agent" - outfit = /datum/outfit/abductor/agent - landmark_type = /obj/effect/landmark/abductor/agent - greet_text = "Use my stealth technology and equipment to incapacitate humans for my scientist to retrieve." - show_in_antagpanel = TRUE - -/datum/antagonist/abductor/scientist - name = "Abductor Scientist" - sub_role = "Scientist" - outfit = /datum/outfit/abductor/scientist - landmark_type = /obj/effect/landmark/abductor/scientist - greet_text = "Use my experimental console and surgical equipment to monitor my agent and experiment upon abducted humans." - show_in_antagpanel = TRUE - -/datum/antagonist/abductor/create_team(datum/team/abductor_team/new_team) - if(!new_team) - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - team = new_team - -/datum/antagonist/abductor/get_team() - return team - -/datum/antagonist/abductor/on_gain() - owner.special_role = "[name]" - owner.assigned_role = "[name]" - objectives += team.objectives - finalize_abductor() - ADD_TRAIT(owner, TRAIT_ABDUCTOR_TRAINING, ABDUCTOR_ANTAGONIST) - return ..() - -/datum/antagonist/abductor/on_removal() - if(owner.current) - to_chat(owner.current,span_danger("I are no longer the [owner.special_role]!")) - owner.special_role = null - REMOVE_TRAIT(owner, TRAIT_ABDUCTOR_TRAINING, ABDUCTOR_ANTAGONIST) - return ..() - -/datum/antagonist/abductor/greet() - to_chat(owner.current, span_notice("I are the [owner.special_role]!")) - to_chat(owner.current, span_notice("With the help of my teammate, kidnap and experiment on station crew members!")) - to_chat(owner.current, span_notice("[greet_text]")) - owner.announce_objectives() - -/datum/antagonist/abductor/proc/finalize_abductor() - //Equip - var/mob/living/carbon/human/H = owner.current - H.set_species(/datum/species/abductor) - var/obj/item/organ/tongue/abductor/T = H.getorganslot(ORGAN_SLOT_TONGUE) - T.mothership = "[team.name]" - - H.real_name = "[team.name] [sub_role]" - H.equipOutfit(outfit) - - //Teleport to ship - for(var/obj/effect/landmark/abductor/LM in GLOB.landmarks_list) - if(istype(LM, landmark_type) && LM.team_number == team.team_number) - H.forceMove(LM.loc) - break - - add_antag_hud(antag_hud_type, antag_hud_name, owner.current) - -/datum/antagonist/abductor/scientist/on_gain() - ADD_TRAIT(owner, TRAIT_ABDUCTOR_SCIENTIST_TRAINING, ABDUCTOR_ANTAGONIST) - ADD_TRAIT(owner, TRAIT_SURGEON, ABDUCTOR_ANTAGONIST) - . = ..() - -/datum/antagonist/abductor/scientist/on_removal() - REMOVE_TRAIT(owner, TRAIT_ABDUCTOR_SCIENTIST_TRAINING, ABDUCTOR_ANTAGONIST) - REMOVE_TRAIT(owner, TRAIT_SURGEON, ABDUCTOR_ANTAGONIST) - . = ..() - -/datum/antagonist/abductor/admin_add(datum/mind/new_owner,mob/admin) - var/list/current_teams = list() - for(var/datum/team/abductor_team/T in get_all_teams(/datum/team/abductor_team)) - current_teams[T.name] = T - var/choice = input(admin,"Add to which team ?") as null|anything in (current_teams + "new team") - if (choice == "new team") - team = new - else if(choice in current_teams) - team = current_teams[choice] - else - return - new_owner.add_antag_datum(src) - log_admin("[key_name(usr)] made [key_name(new_owner)] [name] on [choice]!") - message_admins("[key_name_admin(usr)] made [key_name_admin(new_owner)] [name] on [choice] !") - -/datum/antagonist/abductor/get_admin_commands() - . = ..() - .["Equip"] = CALLBACK(src,PROC_REF(admin_equip)) - -/datum/antagonist/abductor/proc/admin_equip(mob/admin) - if(!ishuman(owner.current)) - to_chat(admin, span_warning("This only works on humans!")) - return - var/mob/living/carbon/human/H = owner.current - var/gear = alert(admin,"Agent or Scientist Gear","Gear","Agent","Scientist") - if(gear) - if(gear=="Agent") - H.equipOutfit(/datum/outfit/abductor/agent) - else - H.equipOutfit(/datum/outfit/abductor/scientist) - -/datum/team/abductor_team - member_name = "abductor" - var/team_number - var/list/datum/mind/abductees = list() - var/static/team_count = 1 - -/datum/team/abductor_team/New() - ..() - team_number = team_count++ - name = "Mothership [pick(GLOB.possible_changeling_IDs)]" //TODO Ensure unique and actual alieny names - add_objective(new/datum/objective/experiment) - -/datum/team/abductor_team/is_solo() - return FALSE - -/datum/team/abductor_team/proc/add_objective(datum/objective/O) - O.team = src - O.update_explanation_text() - objectives += O - -/datum/team/abductor_team/roundend_report() - var/list/result = list() - - var/won = TRUE - for(var/datum/objective/O in objectives) - if(!O.check_completion()) - won = FALSE - if(won) - result += span_greentextbig("[name] team fulfilled its mission!") - else - result += span_redtextbig("[name] team failed its mission.") - - result += span_header("The abductors of [name] were:") - for(var/datum/mind/abductor_mind in members) - result += printplayer(abductor_mind) - result += printobjectives(objectives) - - return "
    [result.Join("
    ")]
    " - -/datum/antagonist/abductee - name = "Abductee" - roundend_category = "abductees" - antagpanel_category = "Abductee" - antag_hud_type = ANTAG_HUD_ABDUCTOR - antag_hud_name = "abductee" - -/datum/antagonist/abductee/on_gain() - give_objective() - . = ..() - -/datum/antagonist/abductee/greet() - to_chat(owner, span_warning("My mind snaps!")) - to_chat(owner, "I can't remember how you got here...") - owner.announce_objectives() - -/datum/antagonist/abductee/proc/give_objective() - var/mob/living/carbon/human/H = owner.current - if(istype(H)) - H.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_LOBOTOMY) - var/objtype = (prob(75) ? /datum/objective/abductee/random : pick(subtypesof(/datum/objective/abductee/) - /datum/objective/abductee/random)) - var/datum/objective/abductee/O = new objtype() - objectives += O - -/datum/antagonist/abductee/apply_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - add_antag_hud(antag_hud_type, antag_hud_name, M) - -/datum/antagonist/abductee/remove_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - remove_antag_hud(antag_hud_type, M) - - -// LANDMARKS -/obj/effect/landmark/abductor - var/team_number = 1 - -/obj/effect/landmark/abductor/agent - icon_state = "abductor_agent" -/obj/effect/landmark/abductor/scientist - icon_state = "abductor" - -// OBJECTIVES -/datum/objective/experiment - target_amount = 6 - -/datum/objective/experiment/New() - explanation_text = "Experiment on [target_amount] humans." - -/datum/objective/experiment/check_completion() - for(var/obj/machinery/abductor/experiment/E in GLOB.machines) - if(!istype(team, /datum/team/abductor_team)) - return FALSE - var/datum/team/abductor_team/T = team - if(E.team_number == T.team_number) - return E.points >= target_amount - return FALSE diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm deleted file mode 100644 index 43af3631576..00000000000 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ /dev/null @@ -1,847 +0,0 @@ -#define VEST_STEALTH 1 -#define VEST_COMBAT 2 -#define GIZMO_SCAN 1 -#define GIZMO_MARK 2 -#define MIND_DEVICE_MESSAGE 1 -#define MIND_DEVICE_CONTROL 2 - -//AGENT VEST -/obj/item/clothing/suit/armor/abductor/vest - name = "agent vest" - desc = "" - icon = 'icons/obj/abductor.dmi' - icon_state = "vest_stealth" - item_state = "armor" - blood_overlay_type = "armor" - armor = list("blunt" = 15, "slash" = 15, "stab" = 15, "bullet" = 15, "laser" = 15, "energy" = 15, "bomb" = 15, "bio" = 15, "rad" = 15, "fire" = 70, "acid" = 70) - actions_types = list(/datum/action/item_action/hands_free/activate) - allowed = list( - /obj/item/abductor, - /obj/item/abductor/baton, - /obj/item/melee/baton, - /obj/item/gun/energy, - /obj/item/restraints/handcuffs - ) - var/mode = VEST_STEALTH - var/stealth_active = 0 - var/combat_cooldown = 10 - var/datum/icon_snapshot/disguise - var/stealth_armor = list("blunt" = 15, "slash" = 15, "stab" = 15, "bullet" = 15, "laser" = 15, "energy" = 15, "bomb" = 15, "bio" = 15, "rad" = 15, "fire" = 70, "acid" = 70) - var/combat_armor = list("blunt" = 50, "slash" = 50, "stab" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 90, "acid" = 90) - -/obj/item/clothing/suit/armor/abductor/vest/proc/toggle_nodrop() - if(HAS_TRAIT_FROM(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT)) - REMOVE_TRAIT(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) - else - ADD_TRAIT(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) - if(ismob(loc)) - to_chat(loc, span_notice("My vest is now [HAS_TRAIT_FROM(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) ? "locked" : "unlocked"].")) - -/obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode() - switch(mode) - if(VEST_STEALTH) - mode = VEST_COMBAT - DeactivateStealth() - armor = combat_armor - icon_state = "vest_combat" - if(VEST_COMBAT)// TO STEALTH - mode = VEST_STEALTH - armor = stealth_armor - icon_state = "vest_stealth" - if(ishuman(loc)) - var/mob/living/carbon/human/H = loc - H.update_inv_wear_suit() - for(var/X in actions) - var/datum/action/A = X - A.UpdateButtonIcon() - -/obj/item/clothing/suit/armor/abductor/vest/item_action_slot_check(slot, mob/user) - if(slot == SLOT_ARMOR) //we only give the mob the ability to activate the vest if he's actually wearing it. - return TRUE - -/obj/item/clothing/suit/armor/abductor/vest/proc/SetDisguise(datum/icon_snapshot/entry) - disguise = entry - -/obj/item/clothing/suit/armor/abductor/vest/proc/ActivateStealth() - if(disguise == null) - return - stealth_active = 1 - if(ishuman(loc)) - var/mob/living/carbon/human/M = loc - new /obj/effect/temp_visual/dir_setting/ninja/cloak(get_turf(M), M.dir) - M.name_override = disguise.name - M.icon = disguise.icon - M.icon_state = disguise.icon_state - M.cut_overlays() - M.add_overlay(disguise.overlays) - M.update_inv_hands() - -/obj/item/clothing/suit/armor/abductor/vest/proc/DeactivateStealth() - if(!stealth_active) - return - stealth_active = 0 - if(ishuman(loc)) - var/mob/living/carbon/human/M = loc - new /obj/effect/temp_visual/dir_setting/ninja(get_turf(M), M.dir) - M.name_override = null - M.cut_overlays() - M.regenerate_icons() - -/obj/item/clothing/suit/armor/abductor/vest/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - DeactivateStealth() - -/obj/item/clothing/suit/armor/abductor/vest/IsReflect() - DeactivateStealth() - -/obj/item/clothing/suit/armor/abductor/vest/ui_action_click() - switch(mode) - if(VEST_COMBAT) - Adrenaline() - if(VEST_STEALTH) - if(stealth_active) - DeactivateStealth() - else - ActivateStealth() - -/obj/item/clothing/suit/armor/abductor/vest/proc/Adrenaline() - if(ishuman(loc)) - if(combat_cooldown != initial(combat_cooldown)) - to_chat(loc, span_warning("Combat injection is still recharging.")) - return - var/mob/living/carbon/human/M = loc - M.adjustStaminaLoss(-75) - M.SetUnconscious(0) - M.SetStun(0) - M.SetKnockdown(0) - M.SetImmobilized(0) - M.SetParalyzed(0) - combat_cooldown = 0 - START_PROCESSING(SSobj, src) - -/obj/item/clothing/suit/armor/abductor/vest/process() - combat_cooldown++ - if(combat_cooldown==initial(combat_cooldown)) - STOP_PROCESSING(SSobj, src) - -/obj/item/clothing/suit/armor/abductor/Destroy() - STOP_PROCESSING(SSobj, src) - for(var/obj/machinery/abductor/console/C in GLOB.machines) - if(C.vest == src) - C.vest = null - break - . = ..() - - -/obj/item/abductor - icon = 'icons/obj/abductor.dmi' - lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi' - righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi' - -/obj/item/abductor/proc/AbductorCheck(mob/user) - if (HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING)) - return TRUE - if (istype(user) && user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_TRAINING)) - return TRUE - to_chat(user, span_warning("I can't figure how this works!")) - return FALSE - -/obj/item/abductor/proc/ScientistCheck(mob/user) - var/training = HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING) || (user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_TRAINING)) - var/sci_training = HAS_TRAIT(user, TRAIT_ABDUCTOR_SCIENTIST_TRAINING) || (user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_SCIENTIST_TRAINING)) - - if(training && !sci_training) - to_chat(user, span_warning("You're not trained to use this!")) - . = FALSE - else if(!training && !sci_training) - to_chat(user, span_warning("I can't figure how this works!")) - . = FALSE - else - . = TRUE - -/obj/item/abductor/gizmo - name = "science tool" - desc = "" - icon_state = "gizmo_scan" - item_state = "silencer" - var/mode = GIZMO_SCAN - var/mob/living/marked = null - var/obj/machinery/abductor/console/console - -/obj/item/abductor/gizmo/attack_self(mob/user) - if(!ScientistCheck(user)) - return - if(!console) - to_chat(user, span_warning("The device is not linked to console!")) - return - - if(mode == GIZMO_SCAN) - mode = GIZMO_MARK - icon_state = "gizmo_mark" - else - mode = GIZMO_SCAN - icon_state = "gizmo_scan" - to_chat(user, span_notice("I switch the device to [mode==GIZMO_SCAN? "SCAN": "MARK"] MODE")) - -/obj/item/abductor/gizmo/attack(mob/living/M, mob/user) - if(!ScientistCheck(user)) - return - if(!console) - to_chat(user, span_warning("The device is not linked to console!")) - return - - switch(mode) - if(GIZMO_SCAN) - scan(M, user) - if(GIZMO_MARK) - mark(M, user) - - -/obj/item/abductor/gizmo/afterattack(atom/target, mob/living/user, flag, params) - . = ..() - if(flag) - return - if(!ScientistCheck(user)) - return - if(!console) - to_chat(user, span_warning("The device is not linked to console!")) - return - - switch(mode) - if(GIZMO_SCAN) - scan(target, user) - if(GIZMO_MARK) - mark(target, user) - -/obj/item/abductor/gizmo/proc/scan(atom/target, mob/living/user) - if(ishuman(target)) - console.AddSnapshot(target) - to_chat(user, span_notice("I scan [target] and add [target.p_them()] to the database.")) - -/obj/item/abductor/gizmo/proc/mark(atom/target, mob/living/user) - if(marked == target) - to_chat(user, span_warning("This specimen is already marked!")) - return - if(isabductor(target) || iscow(target)) - marked = target - to_chat(user, span_notice("I mark [target] for future retrieval.")) - else - prepare(target,user) - -/obj/item/abductor/gizmo/proc/prepare(atom/target, mob/living/user) - if(get_dist(target,user)>1) - to_chat(user, span_warning("I need to be next to the specimen to prepare it for transport!")) - return - to_chat(user, span_notice("I begin preparing [target] for transport...")) - if(do_after(user, 100, target = target)) - marked = target - to_chat(user, span_notice("I finish preparing [target] for transport.")) - -/obj/item/abductor/gizmo/Destroy() - if(console) - console.gizmo = null - . = ..() - - -/obj/item/abductor/silencer - name = "abductor silencer" - desc = "" - icon_state = "silencer" - item_state = "gizmo" - -/obj/item/abductor/silencer/attack(mob/living/M, mob/user) - if(!AbductorCheck(user)) - return - radio_off(M, user) - -/obj/item/abductor/silencer/afterattack(atom/target, mob/living/user, flag, params) - . = ..() - if(flag) - return - if(!AbductorCheck(user)) - return - radio_off(target, user) - -/obj/item/abductor/silencer/proc/radio_off(atom/target, mob/living/user) - if( !(user in (viewers(7,target))) ) - return - - var/turf/targloc = get_turf(target) - - var/mob/living/carbon/human/M - for(M in view(2,targloc)) - if(M == user) - continue - to_chat(user, span_notice("I silence [M]'s radio devices.")) - radio_off_mob(M) - -/obj/item/abductor/silencer/proc/radio_off_mob(mob/living/carbon/human/M) - var/list/all_items = M.GetAllContents() - - for(var/obj/I in all_items) - if(istype(I, /obj/item/radio/)) - var/obj/item/radio/r = I - r.listening = 0 - if(!istype(I, /obj/item/radio/headset)) - r.broadcasting = 0 //goddamned headset hacks - -/obj/item/abductor/mind_device - name = "mental interface device" - desc = "A dual-mode tool for directly communicating with sentient brains. It can be used to send a direct message to a target, \ - or to send a command to a test subject with a charged gland." - icon_state = "mind_device_message" - item_state = "silencer" - var/mode = MIND_DEVICE_MESSAGE - -/obj/item/abductor/mind_device/attack_self(mob/user) - if(!ScientistCheck(user)) - return - - if(mode == MIND_DEVICE_MESSAGE) - mode = MIND_DEVICE_CONTROL - icon_state = "mind_device_control" - else - mode = MIND_DEVICE_MESSAGE - icon_state = "mind_device_message" - to_chat(user, span_notice("I switch the device to [mode==MIND_DEVICE_MESSAGE? "TRANSMISSION": "COMMAND"] MODE")) - -/obj/item/abductor/mind_device/afterattack(atom/target, mob/living/user, flag, params) - . = ..() - if(!ScientistCheck(user)) - return - - switch(mode) - if(MIND_DEVICE_CONTROL) - mind_control(target, user) - if(MIND_DEVICE_MESSAGE) - mind_message(target, user) - -/obj/item/abductor/mind_device/proc/mind_control(atom/target, mob/living/user) - if(iscarbon(target)) - var/mob/living/carbon/C = target - var/obj/item/organ/heart/gland/G = C.getorganslot("heart") - if(!istype(G)) - to_chat(user, span_warning("My target does not have an experimental gland!")) - return - if(!G.mind_control_uses) - to_chat(user, span_warning("My target's gland is spent!")) - return - if(G.active_mind_control) - to_chat(user, span_warning("My target is already under a mind-controlling influence!")) - return - - var/command = stripped_input(user, "Enter the command for my target to follow.\ - Uses Left: [G.mind_control_uses], Duration: [DisplayTimeText(G.mind_control_duration)]","Enter command") - - if(!command) - return - - if(QDELETED(user) || user.get_active_held_item() != src || loc != user) - return - - if(QDELETED(G)) - return - - if(C.anti_magic_check(FALSE, FALSE, TRUE, 0)) - to_chat(user, span_warning("My target seems to have some sort of tinfoil protection on, blocking the message from being sent!")) - return - - G.mind_control(command, user) - to_chat(user, span_notice("I send the command to my target.")) - -/obj/item/abductor/mind_device/proc/mind_message(atom/target, mob/living/user) - if(isliving(target)) - var/mob/living/L = target - if(L.stat == DEAD) - to_chat(user, span_warning("My target is dead!")) - return - var/message = stripped_input(user, "Write a message to send to my target's brain.","Enter message") - if(!message) - return - if(QDELETED(L) || L.stat == DEAD) - return - - to_chat(L, span_hear("I hear a voice in my head saying: [message]")) - to_chat(user, span_notice("I send the message to my target.")) - log_directed_talk(user, L, message, LOG_SAY, "abductor whisper") - - -/obj/item/firing_pin/abductor - name = "alien firing pin" - icon_state = "firing_pin_ayy" - desc = "This firing pin is slimy and warm; you can swear you feel it \ - constantly trying to mentally probe you." - fail_message = "\ - Firing error, please contact Command." - -/obj/item/firing_pin/abductor/pin_auth(mob/living/user) - . = isabductor(user) - -/obj/item/gun/energy/alien - name = "alien pistol" - desc = "" - ammo_type = list(/obj/item/ammo_casing/energy/declone) - pin = /obj/item/firing_pin/abductor - icon_state = "alienpistol" - item_state = "alienpistol" - trigger_guard = TRIGGER_GUARD_ALLOW_ALL - -/obj/item/gun/energy/shrink_ray - name = "shrink ray blaster" - desc = "This is a piece of frightening alien tech that enhances the magnetic pull of atoms in a localized space to temporarily make an object shrink. \ - That or it's just space magic. Either way, it shrinks stuff." - ammo_type = list(/obj/item/ammo_casing/energy/shrink) - item_state = "shrink_ray" - icon_state = "shrink_ray" - fire_delay = 30 - selfcharge = 1//shot costs 200 energy, has a max capacity of 1000 for 5 shots. self charge returns 25 energy every couple ticks, so about 1 shot charged every 12~ seconds - trigger_guard = TRIGGER_GUARD_ALLOW_ALL// variable-size trigger, get it? (abductors need this to be set so the gun is usable for them) - -/obj/item/paper/guides/antag/abductor - name = "Dissection Guide" - icon_state = "alienpaper_words" - info = {"Dissection for Dummies
    - -
    - 1.Acquire fresh specimen.
    - 2.Put the specimen on operating table.
    - 3.Apply surgical drapes, preparing for experimental dissection.
    - 4.Apply scalpel to specimen's torso.
    - 5.Clamp bleeders on specimen's torso with a hemostat.
    - 6.Retract skin of specimen's torso with a retractor.
    - 7.Apply scalpel again to specimen's torso.
    - 8.Search through the specimen's torso with my hands to remove any superfluous organs.
    - 9.Insert replacement gland (Retrieve one from gland storage).
    - 10.Consider dressing the specimen back to not disturb the habitat.
    - 11.Put the specimen in the experiment machinery.
    - 12.Choose one of the machine options. The target will be analyzed and teleported to the selected drop-off point.
    - 13.You will receive one supply credit, and the subject will be counted towards my quota.
    -
    -Congratulations! You are now trained for invasive xenobiology research!"} - -/obj/item/paper/guides/antag/abductor/update_icon() - return - -/obj/item/paper/guides/antag/abductor/AltClick() - return //otherwise it would fold into a paperplane. - -#define BATON_STUN 0 -#define BATON_SLEEP 1 -#define BATON_CUFF 2 -#define BATON_PROBE 3 -#define BATON_MODES 4 - -/obj/item/abductor/baton - name = "advanced baton" - desc = "" - var/mode = BATON_STUN - icon_state = "wonderprodStun" - item_state = "wonderprod" - slot_flags = ITEM_SLOT_BELT - force = 7 - w_class = WEIGHT_CLASS_NORMAL - actions_types = list(/datum/action/item_action/toggle_mode) - -/obj/item/abductor/baton/proc/toggle(mob/living/user=usr) - mode = (mode+1)%BATON_MODES - var/txt - switch(mode) - if(BATON_STUN) - txt = "stunning" - if(BATON_SLEEP) - txt = "sleep inducement" - if(BATON_CUFF) - txt = "restraining" - if(BATON_PROBE) - txt = "probing" - - to_chat(usr, span_notice("I switch the baton to [txt] mode.")) - update_icon() - -/obj/item/abductor/baton/update_icon() - switch(mode) - if(BATON_STUN) - icon_state = "wonderprodStun" - item_state = "wonderprodStun" - if(BATON_SLEEP) - icon_state = "wonderprodSleep" - item_state = "wonderprodSleep" - if(BATON_CUFF) - icon_state = "wonderprodCuff" - item_state = "wonderprodCuff" - if(BATON_PROBE) - icon_state = "wonderprodProbe" - item_state = "wonderprodProbe" - -/obj/item/abductor/baton/attack(mob/target, mob/living/user) - if(!AbductorCheck(user)) - return - - if(iscyborg(target)) - ..() - return - - if(!isliving(target)) - return - - var/mob/living/L = target - - user.do_attack_animation(L) - - if(ishuman(L)) - var/mob/living/carbon/human/H = L - if(H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) - playsound(H, 'sound/blank.ogg', 50, TRUE) - return FALSE - - switch (mode) - if(BATON_STUN) - StunAttack(L,user) - if(BATON_SLEEP) - SleepAttack(L,user) - if(BATON_CUFF) - CuffAttack(L,user) - if(BATON_PROBE) - ProbeAttack(L,user) - -/obj/item/abductor/baton/attack_self(mob/living/user) - toggle(user) - -/obj/item/abductor/baton/proc/StunAttack(mob/living/L,mob/living/user) - - L.lastattacker = user.real_name - L.lastattackerckey = user.ckey - - L.Paralyze(140) - L.apply_effect(EFFECT_STUTTER, 7) - SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK) - - L.visible_message(span_danger("[user] has stunned [L] with [src]!"), \ - span_danger("[user] has stunned you with [src]!")) - playsound(src, 'sound/blank.ogg', 50, TRUE, -1) - - if(ishuman(L)) - var/mob/living/carbon/human/H = L - H.forcesay(GLOB.hit_appends) - - log_combat(user, L, "stunned") - -/obj/item/abductor/baton/proc/SleepAttack(mob/living/L,mob/living/user) - if(L.incapacitated(TRUE, TRUE)) - if(L.anti_magic_check(FALSE, FALSE, TRUE)) - to_chat(user, span_warning("The specimen's tinfoil protection is interfering with the sleep inducement!")) - L.visible_message(span_danger("[user] tried to induced sleep in [L] with [src], but [L.p_their()] tinfoil protection [L.p_them()]!"), \ - span_danger("I feel a strange wave of heavy drowsiness wash over you, but my tinfoil protection deflects most of it!")) - L.drowsyness += 2 - return - L.visible_message(span_danger("[user] has induced sleep in [L] with [src]!"), \ - span_danger("I suddenly feel very drowsy!")) - playsound(src, 'sound/blank.ogg', 50, TRUE, -1) - L.Sleeping(1200) - log_combat(user, L, "put to sleep") - else - if(L.anti_magic_check(FALSE, FALSE, TRUE, 0)) - to_chat(user, span_warning("The specimen's tinfoil protection is completely blocking our sleep inducement methods!")) - L.visible_message(span_danger("[user] tried to induce sleep in [L] with [src], but [L.p_their()] tinfoil protection completely protected [L.p_them()]!"), \ - span_danger("Any sense of drowsiness is quickly diminished as my tinfoil protection deflects the effects!")) - return - L.drowsyness += 1 - to_chat(user, span_warning("Sleep inducement works fully only on stunned specimens! ")) - L.visible_message(span_danger("[user] tried to induce sleep in [L] with [src]!"), \ - span_danger("I suddenly feel drowsy!")) - -/obj/item/abductor/baton/proc/CuffAttack(mob/living/L,mob/living/user) - if(!iscarbon(L)) - return - var/mob/living/carbon/C = L - if(!C.handcuffed) - if(C.get_num_arms(FALSE) >= 2 || C.get_arm_ignore()) - playsound(src, 'sound/blank.ogg', 30, TRUE, -2) - C.visible_message(span_danger("[user] begins restraining [C] with [src]!"), \ - span_danger("[user] begins shaping an energy field around my hands!")) - if(do_mob(user, C, 30) && (C.get_num_arms(FALSE) >= 2 || C.get_arm_ignore())) - if(!C.handcuffed) - C.handcuffed = new /obj/item/restraints/handcuffs/energy/used(C) - C.update_handcuffed() - to_chat(user, span_notice("I restrain [C].")) - log_combat(user, C, "handcuffed") - else - to_chat(user, span_warning("I fail to restrain [C].")) - else - to_chat(user, span_warning("[C] doesn't have two hands...")) - -/obj/item/abductor/baton/proc/ProbeAttack(mob/living/L,mob/living/user) - L.visible_message(span_danger("[user] probes [L] with [src]!"), \ - span_danger("[user] probes you!")) - - var/species = span_warning("Unknown species") - var/helptext = span_warning("Species unsuitable for experiments.") - - if(ishuman(L)) - var/mob/living/carbon/human/H = L - species = span_notice("[H.dna.species.name]") - if(L.mind && L.mind.has_antag_datum(/datum/antagonist/changeling)) - species = span_warning("Changeling lifeform") - var/obj/item/organ/heart/gland/temp = locate() in H.internal_organs - if(temp) - helptext = span_warning("Experimental gland detected!") - else - if (L.getorganslot(ORGAN_SLOT_HEART)) - helptext = span_notice("Subject suitable for experiments.") - else - helptext = span_warning("Subject unsuitable for experiments.") - - to_chat(user, "Probing result:[species]") - to_chat(user, "[helptext]") - -/obj/item/restraints/handcuffs/energy - name = "hard-light energy field" - desc = "" - icon_state = "cuff" // Needs sprite - lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' - breakouttime = 450 - trashtype = /obj/item/restraints/handcuffs/energy/used - flags_1 = NONE - -/obj/item/restraints/handcuffs/energy/used - item_flags = DROPDEL - -/obj/item/restraints/handcuffs/energy/used/dropped(mob/user) - user.visible_message(span_danger("[user]'s [name] breaks in a discharge of energy!"), \ - span_danger("[user]'s [name] breaks in a discharge of energy!")) - var/datum/effect_system/spark_spread/S = new - S.set_up(4,0,user.loc) - S.start() - . = ..() - -/obj/item/abductor/baton/examine(mob/user) - . = ..() - switch(mode) - if(BATON_STUN) - . += span_warning("The baton is in stun mode.") - if(BATON_SLEEP) - . += span_warning("The baton is in sleep inducement mode.") - if(BATON_CUFF) - . += span_warning("The baton is in restraining mode.") - if(BATON_PROBE) - . += span_warning("The baton is in probing mode.") - -/obj/item/radio/headset/abductor - name = "alien headset" - desc = "" - icon = 'icons/obj/abductor.dmi' - icon_state = "abductor_headset" - item_state = "abductor_headset" - keyslot2 = new /obj/item/encryptionkey/heads/captain - -/obj/item/radio/headset/abductor/Initialize(mapload) - . = ..() - make_syndie() - -/obj/item/radio/headset/abductor/ComponentInitialize() - . = ..() - AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_HEAD)) - -/obj/item/radio/headset/abductor/attackby(obj/item/W, mob/user, params) - if(W.tool_behaviour == TOOL_SCREWDRIVER) - return // Stops humans from disassembling abductor headsets. - return ..() - -/obj/item/abductor_machine_beacon - name = "machine beacon" - desc = "" - icon = 'icons/obj/abductor.dmi' - icon_state = "beacon" - w_class = WEIGHT_CLASS_TINY - var/obj/machinery/spawned_machine - -/obj/item/abductor_machine_beacon/attack_self(mob/user) - ..() - user.visible_message(span_notice("[user] places down [src] and activates it."), span_notice("I place down [src] and activate it.")) - user.dropItemToGround(src) - playsound(src, 'sound/blank.ogg', 50) - addtimer(CALLBACK(src, PROC_REF(try_spawn_machine)), 30) - -/obj/item/abductor_machine_beacon/proc/try_spawn_machine() - var/viable = FALSE - if(isfloorturf(loc)) - var/turf/T = loc - viable = TRUE - for(var/obj/thing in T.contents) - if(thing.density || ismachinery(thing) || isstructure(thing)) - viable = FALSE - if(viable) - playsound(src, 'sound/blank.ogg', 50, TRUE) - var/new_machine = new spawned_machine(loc) - visible_message(span_notice("[new_machine] warps on top of the beacon!")) - qdel(src) - else - playsound(src, 'sound/blank.ogg', 50) - -/obj/item/abductor_machine_beacon/chem_dispenser - name = "beacon - Reagent Synthesizer" - spawned_machine = /obj/machinery/chem_dispenser/abductor - -/obj/item/scalpel/alien - name = "alien scalpel" - desc = "" - icon = 'icons/obj/abductor.dmi' - toolspeed = 0.25 - -/obj/item/hemostat/alien - name = "alien hemostat" - desc = "" - icon = 'icons/obj/abductor.dmi' - toolspeed = 0.25 - -/obj/item/retractor/alien - name = "alien retractor" - desc = "" - icon = 'icons/obj/abductor.dmi' - toolspeed = 0.25 - -/obj/item/circular_saw/alien - name = "alien saw" - desc = "" - icon = 'icons/obj/abductor.dmi' - toolspeed = 0.25 - -/obj/item/surgicaldrill/alien - name = "alien drill" - desc = "" - icon = 'icons/obj/abductor.dmi' - toolspeed = 0.25 - -/obj/item/cautery/alien - name = "alien cautery" - desc = "Why would bloodless aliens have a tool to stop bleeding? \ - Unless..." - icon = 'icons/obj/abductor.dmi' - toolspeed = 0.25 - -/obj/item/clothing/head/helmet/abductor - name = "agent headgear" - desc = "" - icon_state = "alienhelmet" - item_state = "alienhelmet" - blockTracking = TRUE - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR - -// Operating Table / Beds / Lockers - -/obj/structure/bed/abductor - name = "resting contraption" - desc = "" - icon = 'icons/obj/abductor.dmi' - buildstacktype = /obj/item/stack/sheet/mineral/abductor - icon_state = "bed" - -/obj/structure/table_frame/abductor - name = "alien table frame" - desc = "" - icon_state = "alien_frame" - framestack = /obj/item/stack/sheet/mineral/abductor - framestackamount = 1 - -/obj/structure/table_frame/abductor/attackby(obj/item/I, mob/user, params) - if(I.tool_behaviour == TOOL_WRENCH) - to_chat(user, span_notice("I start disassembling [src]...")) - I.play_tool_sound(src) - if(I.use_tool(src, user, 30)) - playsound(src, 'sound/blank.ogg', 50, TRUE) - for(var/i = 1, i <= framestackamount, i++) - new framestack(get_turf(src)) - qdel(src) - return - if(istype(I, /obj/item/stack/sheet/mineral/abductor)) - var/obj/item/stack/sheet/P = I - if(P.get_amount() < 1) - to_chat(user, span_warning("I need one alien alloy sheet to do this!")) - return - to_chat(user, span_notice("I start adding [P] to [src]...")) - if(do_after(user, 50, target = src)) - P.use(1) - new /obj/structure/table/abductor(src.loc) - qdel(src) - return - if(istype(I, /obj/item/stack/sheet/mineral/silver)) - var/obj/item/stack/sheet/P = I - if(P.get_amount() < 1) - to_chat(user, span_warning("I need one sheet of silver to do this!")) - return - to_chat(user, span_notice("I start adding [P] to [src]...")) - if(do_after(user, 50, target = src)) - P.use(1) - new /obj/structure/table/optable/abductor(src.loc) - qdel(src) - -/obj/structure/table/abductor - name = "alien table" - desc = "" - icon = 'icons/obj/smooth_structures/alien_table.dmi' - icon_state = "alien_table" - buildstack = /obj/item/stack/sheet/mineral/abductor - framestack = /obj/item/stack/sheet/mineral/abductor - buildstackamount = 1 - framestackamount = 1 - canSmoothWith = null - frame = /obj/structure/table_frame/abductor - -/obj/structure/table/optable/abductor - name = "alien operating table" - desc = "" - frame = /obj/structure/table_frame/abductor - buildstack = /obj/item/stack/sheet/mineral/silver - framestack = /obj/item/stack/sheet/mineral/abductor - buildstackamount = 1 - framestackamount = 1 - icon = 'icons/obj/abductor.dmi' - icon_state = "bed" - can_buckle = 1 - - var/static/list/injected_reagents = list(/datum/reagent/medicine/cordiolis_hepatico) - -/obj/structure/table/optable/abductor/Crossed(atom/movable/AM) - . = ..() - if(iscarbon(AM)) - START_PROCESSING(SSobj, src) - to_chat(AM, span_danger("I feel a series of tiny pricks!")) - -/obj/structure/table/optable/abductor/process() - . = PROCESS_KILL - for(var/mob/living/carbon/C in get_turf(src)) - . = TRUE - for(var/chemical in injected_reagents) - if(C.reagents.get_reagent_amount(chemical) < 1) - C.reagents.add_reagent(chemical, 1) - -/obj/structure/table/optable/abductor/Destroy() - STOP_PROCESSING(SSobj, src) - . = ..() - -/obj/structure/closet/abductor - name = "alien locker" - desc = "" - icon_state = "abductor" - icon_door = "abductor" - can_weld_shut = FALSE - material_drop = /obj/item/stack/sheet/mineral/abductor - -/obj/structure/door_assembly/door_assembly_abductor - name = "alien airlock assembly" - icon = 'icons/obj/doors/airlocks/abductor/abductor_airlock.dmi' - base_name = "alien airlock" - overlays_file = 'icons/obj/doors/airlocks/abductor/overlays.dmi' - airlock_type = /obj/machinery/door/airlock/abductor - material_type = /obj/item/stack/sheet/mineral/abductor - noglass = TRUE - -/obj/item/clothing/under/abductor - desc = "" - name = "alien jumpsuit" - icon = 'icons/obj/clothing/under/syndicate.dmi' - icon_state = "abductor" - item_state = "bl_suit" - mob_overlay_icon = 'icons/mob/clothing/under/syndicate.dmi' - armor = list("blunt" = 0, "slash" = 0, "stab" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) - can_adjust = 0 diff --git a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm deleted file mode 100644 index 2381dc2013c..00000000000 --- a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm +++ /dev/null @@ -1,56 +0,0 @@ -/datum/outfit/abductor - name = "Abductor Basic" - uniform = /obj/item/clothing/under/abductor - shoes = /obj/item/clothing/shoes/combat - back = /obj/item/storage/backpack - ears = /obj/item/radio/headset/abductor - -/datum/outfit/abductor/proc/link_to_console(mob/living/carbon/human/H, team_number) - var/datum/antagonist/abductor/A = H.mind.has_antag_datum(/datum/antagonist/abductor) - if(!team_number && A) - team_number = A.team.team_number - if(!team_number) - team_number = 1 - - var/obj/machinery/abductor/console/console = get_abductor_console(team_number) - if(console) - var/obj/item/clothing/suit/armor/abductor/vest/V = locate() in H - if(V) - console.AddVest(V) - ADD_TRAIT(V, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) - - var/obj/item/storage/backpack/B = locate() in H - if(B) - for(var/obj/item/abductor/gizmo/G in B.contents) - console.AddGizmo(G) - -/datum/outfit/abductor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - if(!visualsOnly) - link_to_console(H) - - -/datum/outfit/abductor/agent - name = "Abductor Agent" - head = /obj/item/clothing/head/helmet/abductor - suit = /obj/item/clothing/suit/armor/abductor/vest - suit_store = /obj/item/abductor/baton - belt = /obj/item/storage/belt/military/abductor/full - - backpack_contents = list( - /obj/item/gun/energy/alien = 1, - /obj/item/abductor/silencer = 1 - ) - -/datum/outfit/abductor/scientist - name = "Abductor Scientist" - - backpack_contents = list( - /obj/item/abductor/gizmo = 1 - ) - -/datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - if(!visualsOnly) - var/obj/item/implant/abductor/beamplant = new /obj/item/implant/abductor(H) - beamplant.implant(H) diff --git a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm deleted file mode 100644 index e14527a39aa..00000000000 --- a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm +++ /dev/null @@ -1,40 +0,0 @@ -/* RETARDED -/datum/surgery_step/extract_organ - name = "remove heart" - accept_hand = 1 - time = 32 - var/obj/item/organ/IC = null - var/list/organ_types = list(/obj/item/organ/heart) - -/datum/surgery_step/extract_organ/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - for(var/atom/A in target.internal_organs) - if(A.type in organ_types) - IC = A - break - user.visible_message(span_notice("[user] starts to remove [target]'s organs."), span_notice("I start to remove [target]'s organs...")) - -/datum/surgery_step/extract_organ/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(IC) - user.visible_message(span_notice("[user] pulls [IC] out of [target]'s [target_zone]!"), span_notice("I pull [IC] out of [target]'s [target_zone].")) - user.put_in_hands(IC) - IC.Remove(target) - return 1 - else - to_chat(user, span_warning("I don't find anything in [target]'s [target_zone]!")) - return 1 - -/datum/surgery_step/gland_insert - name = "insert gland" - implements = list(/obj/item/organ/heart/gland = 100) - time = 32 - -/datum/surgery_step/gland_insert/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message(span_notice("[user] starts to insert [tool] into [target]."), span_notice("I start to insert [tool] into [target]...")) - -/datum/surgery_step/gland_insert/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message(span_notice("[user] inserts [tool] into [target]."), span_notice("I insert [tool] into [target].")) - user.temporarilyRemoveItemFromInventory(tool, TRUE) - var/obj/item/organ/heart/gland/gland = tool - gland.Insert(target, 2) - return 1 -*/ diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm deleted file mode 100644 index e271efa3ccd..00000000000 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ /dev/null @@ -1,109 +0,0 @@ -/obj/item/organ/heart/gland - name = "fleshy mass" - desc = "" - icon = 'icons/obj/abductor.dmi' - icon_state = "gland" - status = ORGAN_ROBOTIC - beating = TRUE - var/true_name = "baseline placebo referencer" - var/cooldown_low = 300 - var/cooldown_high = 300 - var/next_activation = 0 - var/uses // -1 For infinite - var/human_only = FALSE - var/active = FALSE - - var/mind_control_uses = 1 - var/mind_control_duration = 1800 - var/active_mind_control = FALSE - -/obj/item/organ/heart/gland/Initialize() - . = ..() - icon_state = pick(list("health", "spider", "slime", "emp", "species", "egg", "vent", "mindshock", "viral")) - -/obj/item/organ/heart/gland/examine(mob/user) - . = ..() - if((user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_SCIENTIST_TRAINING)) || isobserver(user)) - . += span_notice("It is \a [true_name].") - -/obj/item/organ/heart/gland/proc/ownerCheck() - if(ishuman(owner)) - return TRUE - if(!human_only && iscarbon(owner)) - return TRUE - return FALSE - -/obj/item/organ/heart/gland/proc/Start() - active = 1 - next_activation = world.time + rand(cooldown_low,cooldown_high) - -/obj/item/organ/heart/gland/proc/update_gland_hud() - if(!owner) - return - var/image/holder = owner.hud_list[GLAND_HUD] - var/icon/I = icon(owner.icon, owner.icon_state, owner.dir) - holder.pixel_y = I.Height() - world.icon_size - if(active_mind_control) - holder.icon_state = "hudgland_active" - else if(mind_control_uses) - holder.icon_state = "hudgland_ready" - else - holder.icon_state = "hudgland_spent" - -/obj/item/organ/heart/gland/proc/mind_control(command, mob/living/user) - if(!ownerCheck() || !mind_control_uses || active_mind_control) - return FALSE - mind_control_uses-- - to_chat(owner, span_danger("I suddenly feel an irresistible compulsion to follow an order...")) - to_chat(owner, span_mind_control("[command]")) - active_mind_control = TRUE - message_admins("[key_name(user)] sent an abductor mind control message to [key_name(owner)]: [command]") - update_gland_hud() - var/atom/movable/screen/alert/mind_control/mind_alert = owner.throw_alert("mind_control", /atom/movable/screen/alert/mind_control) - mind_alert.command = command - addtimer(CALLBACK(src, PROC_REF(clear_mind_control)), mind_control_duration) - return TRUE - -/obj/item/organ/heart/gland/proc/clear_mind_control() - if(!ownerCheck() || !active_mind_control) - return FALSE - to_chat(owner, span_danger("I feel the compulsion fade, and you completely forget about your previous orders.")) - owner.clear_alert("mind_control") - active_mind_control = FALSE - return TRUE - -/obj/item/organ/heart/gland/Remove(mob/living/carbon/M, special = 0) - active = 0 - if(initial(uses) == 1) - uses = initial(uses) - var/datum/atom_hud/abductor/hud = GLOB.huds[DATA_HUD_ABDUCTOR] - hud.remove_from_hud(owner) - clear_mind_control() - ..() - -/obj/item/organ/heart/gland/Insert(mob/living/carbon/M, special = 0) - ..() - if(special != 2 && uses) // Special 2 means abductor surgery - Start() - var/datum/atom_hud/abductor/hud = GLOB.huds[DATA_HUD_ABDUCTOR] - hud.add_to_hud(owner) - update_gland_hud() - -/obj/item/organ/heart/gland/on_life() - if(!beating) - // alien glands are immune to stopping. - beating = TRUE - if(!active) - return - if(!ownerCheck()) - active = 0 - return - if(next_activation <= world.time) - activate() - uses-- - next_activation = world.time + rand(cooldown_low,cooldown_high) - if(!uses) - active = 0 - -/obj/item/organ/heart/gland/proc/activate() - return diff --git a/code/modules/antagonists/abductor/equipment/glands/access.dm b/code/modules/antagonists/abductor/equipment/glands/access.dm deleted file mode 100644 index 42b534dbd9a..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/access.dm +++ /dev/null @@ -1,19 +0,0 @@ -/obj/item/organ/heart/gland/access - true_name = "anagraphic electro-scrambler" - cooldown_low = 600 - cooldown_high = 1200 - uses = 1 - icon_state = "mindshock" - mind_control_uses = 3 - mind_control_duration = 900 - -/obj/item/organ/heart/gland/access/activate() - to_chat(owner, span_notice("I feel like a VIP for some reason.")) - RegisterSignal(owner, COMSIG_MOB_ALLOWED, PROC_REF(free_access)) - -/obj/item/organ/heart/gland/access/proc/free_access(datum/source, obj/O) - return TRUE - -/obj/item/organ/heart/gland/access/Remove(mob/living/carbon/M, special = 0) - UnregisterSignal(owner, COMSIG_MOB_ALLOWED) - ..() diff --git a/code/modules/antagonists/abductor/equipment/glands/blood.dm b/code/modules/antagonists/abductor/equipment/glands/blood.dm deleted file mode 100644 index f40896c0df0..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/blood.dm +++ /dev/null @@ -1,18 +0,0 @@ -/obj/item/organ/heart/gland/blood - true_name = "pseudonuclear hemo-destabilizer" - cooldown_low = 1200 - cooldown_high = 1800 - uses = -1 - icon_state = "egg" - lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi' - righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi' - mind_control_uses = 3 - mind_control_duration = 1500 - -/obj/item/organ/heart/gland/blood/activate() - if(!ishuman(owner) || !owner.dna.species) - return - var/mob/living/carbon/human/H = owner - var/datum/species/species = H.dna.species - to_chat(H, span_warning("I feel your blood heat up for a moment.")) - species.exotic_blood = get_random_reagent_id() diff --git a/code/modules/antagonists/abductor/equipment/glands/chem.dm b/code/modules/antagonists/abductor/equipment/glands/chem.dm deleted file mode 100644 index b651b45f6d1..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/chem.dm +++ /dev/null @@ -1,20 +0,0 @@ -/obj/item/organ/heart/gland/chem - true_name = "intrinsic pharma-provider" - cooldown_low = 50 - cooldown_high = 50 - uses = -1 - icon_state = "viral" - mind_control_uses = 3 - mind_control_duration = 1200 - var/list/possible_reagents = list() - -/obj/item/organ/heart/gland/chem/Initialize() - . = ..() - for(var/R in subtypesof(/datum/reagent/drug) + subtypesof(/datum/reagent/medicine) + typesof(/datum/reagent/toxin)) - possible_reagents += R - -/obj/item/organ/heart/gland/chem/activate() - var/chem_to_add = pick(possible_reagents) - owner.reagents.add_reagent(chem_to_add, 2) - owner.adjustToxLoss(-5, TRUE, TRUE) - ..() diff --git a/code/modules/antagonists/abductor/equipment/glands/egg.dm b/code/modules/antagonists/abductor/equipment/glands/egg.dm deleted file mode 100644 index 5943e1c8c71..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/egg.dm +++ /dev/null @@ -1,15 +0,0 @@ -/obj/item/organ/heart/gland/egg - true_name = "roe/enzymatic synthesizer" - cooldown_low = 300 - cooldown_high = 400 - uses = -1 - icon_state = "egg" - lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi' - righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi' - mind_control_uses = 2 - mind_control_duration = 1800 - -/obj/item/organ/heart/gland/egg/activate() - owner.visible_message(span_alertalien("[owner] [pick(EGG_LAYING_MESSAGES)]")) - var/turf/T = owner.drop_location() - new /obj/item/reagent_containers/food/snacks/egg/gland(T) diff --git a/code/modules/antagonists/abductor/equipment/glands/electric.dm b/code/modules/antagonists/abductor/equipment/glands/electric.dm deleted file mode 100644 index 6100ccc2b06..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/electric.dm +++ /dev/null @@ -1,26 +0,0 @@ -/obj/item/organ/heart/gland/electric - true_name = "electron accumulator/discharger" - cooldown_low = 800 - cooldown_high = 1200 - icon_state = "species" - uses = -1 - mind_control_uses = 2 - mind_control_duration = 900 - -/obj/item/organ/heart/gland/electric/Insert(mob/living/carbon/M, special = 0) - ..() - ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland") - -/obj/item/organ/heart/gland/electric/Remove(mob/living/carbon/M, special = 0) - REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland") - ..() - -/obj/item/organ/heart/gland/electric/activate() - owner.visible_message(span_danger("[owner]'s skin starts emitting electric arcs!"),\ - span_warning("I feel electric energy building up inside you!")) - playsound(get_turf(owner), "sparks", 100, TRUE, -1) - addtimer(CALLBACK(src, PROC_REF(zap)), rand(30, 100)) - -/obj/item/organ/heart/gland/electric/proc/zap() - tesla_zap(owner, 4, 8000, TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE | TESLA_MOB_STUN) - playsound(get_turf(owner), 'sound/blank.ogg', 50, TRUE) diff --git a/code/modules/antagonists/abductor/equipment/glands/heal.dm b/code/modules/antagonists/abductor/equipment/glands/heal.dm deleted file mode 100644 index e8f3d140c1f..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/heal.dm +++ /dev/null @@ -1,178 +0,0 @@ -/obj/item/organ/heart/gland/heal - true_name = "organic replicator" - cooldown_low = 200 - cooldown_high = 400 - uses = -1 - human_only = TRUE - icon_state = "health" - mind_control_uses = 3 - mind_control_duration = 3000 - -/obj/item/organ/heart/gland/heal/activate() - if(!(owner.mob_biotypes & MOB_ORGANIC)) - return - - for(var/organ in owner.internal_organs) - if(istype(organ, /obj/item/organ/cyberimp)) - reject_implant(organ) - return - - var/obj/item/organ/liver/liver = owner.getorganslot(ORGAN_SLOT_LIVER) - if((!liver/* && !HAS_TRAIT(owner, TRAIT_NOMETABOLISM)*/) || (liver && ((liver.damage > (liver.maxHealth / 2)) || (istype(liver, /obj/item/organ/liver/cybernetic))))) - replace_liver(liver) - return - - var/obj/item/organ/lungs/lungs = owner.getorganslot(ORGAN_SLOT_LUNGS) - if((!lungs && !HAS_TRAIT(owner, TRAIT_NOBREATH)) || (lungs && (istype(lungs, /obj/item/organ/lungs/cybernetic)))) - replace_lungs(lungs) - return - - var/obj/item/organ/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES) - if(!eyes || (eyes && ((HAS_TRAIT_FROM(owner, TRAIT_NEARSIGHT, EYE_DAMAGE)) || (HAS_TRAIT_FROM(owner, TRAIT_BLIND, EYE_DAMAGE)) || (istype(eyes, /obj/item/organ/eyes/robotic))))) - replace_eyes(eyes) - return - - var/obj/item/bodypart/limb - var/list/limb_list = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) - for(var/zone in limb_list) - limb = owner.get_bodypart(zone) - if(!limb) - replace_limb(zone) - return - if((limb.get_damage() >= (limb.max_damage / 2)) || (limb.status == BODYPART_ROBOTIC)) - replace_limb(zone, limb) - return - - if(owner.getToxLoss() > 40) - replace_blood() - return - var/tox_amount = 0 - for(var/datum/reagent/toxin/T in owner.reagents.reagent_list) - tox_amount += owner.reagents.get_reagent_amount(T.type) - if(tox_amount > 10) - replace_blood() - return - if(owner.blood_volume < BLOOD_VOLUME_OKAY) - owner.blood_volume = BLOOD_VOLUME_NORMAL - to_chat(owner, span_warning("I feel my blood pulsing within you.")) - return - - var/obj/item/bodypart/chest/chest = owner.get_bodypart(BODY_ZONE_CHEST) - if((chest.get_damage() >= (chest.max_damage / 4)) || (chest.status == BODYPART_ROBOTIC)) - replace_chest(chest) - return - -/obj/item/organ/heart/gland/heal/proc/reject_implant(obj/item/organ/cyberimp/implant) - owner.visible_message(span_warning("[owner] vomits up his [implant.name]!"), span_danger("I suddenly vomit up my [implant.name]!")) - owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE) - implant.Remove(owner) - implant.forceMove(owner.drop_location()) - -/obj/item/organ/heart/gland/heal/proc/replace_liver(obj/item/organ/liver/liver) - if(liver) - owner.visible_message(span_warning("[owner] vomits up his [liver.name]!"), span_danger("I suddenly vomit up my [liver.name]!")) - owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE) - liver.Remove(owner) - liver.forceMove(owner.drop_location()) - else - to_chat(owner, span_warning("I feel a weird rumble in my bowels...")) - - var/liver_type = /obj/item/organ/liver - if(owner?.dna?.species?.organs[ORGAN_SLOT_LIVER]) - liver_type = owner.dna.species.organs[ORGAN_SLOT_LIVER] - var/obj/item/organ/liver/new_liver = new liver_type() - new_liver.Insert(owner) - -/obj/item/organ/heart/gland/heal/proc/replace_lungs(obj/item/organ/lungs/lungs) - if(lungs) - owner.visible_message(span_warning("[owner] vomits up his [lungs.name]!"), span_danger("I suddenly vomit up my [lungs.name]!")) - owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE) - lungs.Remove(owner) - lungs.forceMove(owner.drop_location()) - else - to_chat(owner, span_warning("I feel a weird rumble inside my chest...")) - - var/lung_type = /obj/item/organ/lungs - if(owner.dna.species && owner.dna.species.mutantlungs) - lung_type = owner.dna.species.mutantlungs - var/obj/item/organ/lungs/new_lungs = new lung_type() - new_lungs.Insert(owner) - -/obj/item/organ/heart/gland/heal/proc/replace_eyes(obj/item/organ/eyes/eyes) - if(eyes) - owner.visible_message(span_warning("[owner]'s [eyes.name] fall out of their sockets!"), span_danger("My [eyes.name] fall out of their sockets!")) - playsound(owner, 'sound/blank.ogg', 50, TRUE) - eyes.Remove(owner) - eyes.forceMove(owner.drop_location()) - else - to_chat(owner, span_warning("I feel a weird rumble behind my eye sockets...")) - - addtimer(CALLBACK(src, PROC_REF(finish_replace_eyes)), rand(100, 200)) - -/obj/item/organ/heart/gland/heal/proc/finish_replace_eyes() - var/eye_type = /obj/item/organ/eyes - if(owner.dna.species && owner.dna.species.organs[ORGAN_SLOT_EYES]) - eye_type = owner.dna.species.organs[ORGAN_SLOT_EYES] - var/obj/item/organ/eyes/new_eyes = new eye_type() - new_eyes.Insert(owner) - owner.visible_message(span_warning("A pair of new eyes suddenly inflates into [owner]'s eye sockets!"), span_danger("A pair of new eyes suddenly inflates into my eye sockets!")) - -/obj/item/organ/heart/gland/heal/proc/replace_limb(body_zone, obj/item/bodypart/limb) - if(limb) - owner.visible_message(span_warning("[owner]'s [limb.name] suddenly detaches from [owner.p_their()] body!"), span_danger("My [limb.name] suddenly detaches from my body!")) - playsound(owner, "desceration", 50, TRUE, -1) - limb.drop_limb() - else - to_chat(owner, span_warning("I feel a weird tingle in my [parse_zone(body_zone)]... even if you don't have one.")) - - addtimer(CALLBACK(src, PROC_REF(finish_replace_limb), body_zone), rand(150, 300)) - -/obj/item/organ/heart/gland/heal/proc/finish_replace_limb(body_zone) - owner.visible_message(span_warning("With a loud snap, [owner]'s [parse_zone(body_zone)] rapidly grows back from [owner.p_their()] body!"), - span_danger("With a loud snap, my [parse_zone(body_zone)] rapidly grows back from my body!"), - span_warning("My hear a loud snap.")) - playsound(owner, 'sound/blank.ogg', 50, TRUE) - owner.regenerate_limb(body_zone) - -/obj/item/organ/heart/gland/heal/proc/replace_blood() - owner.visible_message(span_warning("[owner] starts vomiting huge amounts of blood!"), span_danger("I suddenly start vomiting huge amounts of blood!")) - keep_replacing_blood() - -/obj/item/organ/heart/gland/heal/proc/keep_replacing_blood() - var/keep_going = FALSE - owner.vomit(0, TRUE, FALSE, 3, FALSE, FALSE, FALSE, TRUE) - owner.Stun(15) - owner.adjustToxLoss(-15, TRUE, TRUE) - - owner.blood_volume = min(BLOOD_VOLUME_NORMAL, owner.blood_volume + 20) - if(owner.blood_volume < BLOOD_VOLUME_NORMAL) - keep_going = TRUE - - if(owner.getToxLoss()) - keep_going = TRUE - for(var/datum/reagent/toxin/R in owner.reagents.reagent_list) - owner.reagents.remove_reagent(R.type, 4) - if(owner.reagents.has_reagent(R.type)) - keep_going = TRUE - if(keep_going) - addtimer(CALLBACK(src, PROC_REF(keep_replacing_blood)), 30) - -/obj/item/organ/heart/gland/heal/proc/replace_chest(obj/item/bodypart/chest/chest) - if(chest.status == BODYPART_ROBOTIC) - owner.visible_message(span_warning("[owner]'s [chest.name] rapidly expels its mechanical components, replacing them with flesh!"), span_danger("My [chest.name] rapidly expels its mechanical components, replacing them with flesh!")) - playsound(owner, 'sound/blank.ogg', 50, TRUE) - var/list/dirs = GLOB.alldirs.Copy() - for(var/i in 1 to 3) - var/obj/effect/decal/cleanable/robot_debris/debris = new(get_turf(owner)) - debris.streak(dirs) - else - owner.visible_message(span_warning("[owner]'s [chest.name] sheds off its damaged flesh, rapidly replacing it!"), span_warning("My [chest.name] sheds off its damaged flesh, rapidly replacing it!")) - playsound(owner, 'sound/blank.ogg', 50, TRUE) - var/list/dirs = GLOB.alldirs.Copy() - for(var/i in 1 to 3) - var/obj/effect/decal/cleanable/blood/gibs/gibs = new(get_turf(owner)) - gibs.streak(dirs) - - var/obj/item/bodypart/chest/new_chest = new(null) - new_chest.replace_limb(owner, TRUE) - qdel(chest) diff --git a/code/modules/antagonists/abductor/equipment/glands/mindshock.dm b/code/modules/antagonists/abductor/equipment/glands/mindshock.dm deleted file mode 100644 index 381db2dc868..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/mindshock.dm +++ /dev/null @@ -1,64 +0,0 @@ -/obj/item/organ/heart/gland/mindshock - true_name = "neural crosstalk uninhibitor" - cooldown_low = 400 - cooldown_high = 700 - uses = -1 - icon_state = "mindshock" - mind_control_uses = 1 - mind_control_duration = 6000 - var/list/mob/living/carbon/human/broadcasted_mobs = list() - -/obj/item/organ/heart/gland/mindshock/activate() - to_chat(owner, span_notice("I get a headache.")) - - var/turf/T = get_turf(owner) - for(var/mob/living/carbon/H in orange(4,T)) - if(H == owner) - continue - switch(pick(1,3)) - if(1) - to_chat(H, span_danger("I hear a loud buzz in your head, silencing your thoughts!")) - H.Stun(50) - if(2) - to_chat(H, span_warning("I hear an annoying buzz in your head.")) - H.confused += 15 - H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 160) - if(3) - H.hallucination += 60 - -/obj/item/organ/heart/gland/mindshock/mind_control(command, mob/living/user) - if(!ownerCheck() || !mind_control_uses || active_mind_control) - return FALSE - mind_control_uses-- - for(var/mob/M in oview(7, owner)) - if(!ishuman(M)) - continue - var/mob/living/carbon/human/H = M - if(H.stat) - continue - - broadcasted_mobs += H - to_chat(H, span_danger("I suddenly feel an irresistible compulsion to follow an order...")) - to_chat(H, span_mind_control("[command]")) - - message_admins("[key_name(user)] broadcasted an abductor mind control message from [key_name(owner)] to [key_name(H)]: [command]") - - var/atom/movable/screen/alert/mind_control/mind_alert = H.throw_alert("mind_control", /atom/movable/screen/alert/mind_control) - mind_alert.command = command - - if(LAZYLEN(broadcasted_mobs)) - active_mind_control = TRUE - addtimer(CALLBACK(src, PROC_REF(clear_mind_control)), mind_control_duration) - - update_gland_hud() - return TRUE - -/obj/item/organ/heart/gland/mindshock/clear_mind_control() - if(!active_mind_control || !LAZYLEN(broadcasted_mobs)) - return FALSE - for(var/M in broadcasted_mobs) - var/mob/living/carbon/human/H = M - to_chat(H, span_danger("I feel the compulsion fade, and you completely forget about your previous orders.")) - H.clear_alert("mind_control") - active_mind_control = FALSE - return TRUE diff --git a/code/modules/antagonists/abductor/equipment/glands/plasma.dm b/code/modules/antagonists/abductor/equipment/glands/plasma.dm deleted file mode 100644 index 136d55fc92a..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/plasma.dm +++ /dev/null @@ -1,22 +0,0 @@ -/obj/item/organ/heart/gland/plasma - true_name = "effluvium sanguine-synonym emitter" - cooldown_low = 1200 - cooldown_high = 1800 - icon_state = "slime" - uses = -1 - mind_control_uses = 1 - mind_control_duration = 800 - -/obj/item/organ/heart/gland/plasma/activate() - to_chat(owner, span_warning("I feel bloated.")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), owner, span_danger("A massive stomachache overcomes you.")), 150) - addtimer(CALLBACK(src, PROC_REF(vomit_plasma)), 200) - -/obj/item/organ/heart/gland/plasma/proc/vomit_plasma() - if(!owner) - return - owner.visible_message(span_danger("[owner] vomits a cloud of plasma!")) - var/turf/open/T = get_turf(owner) - if(istype(T)) - T.atmos_spawn_air("plasma=50;TEMP=[T20C]") - owner.vomit() diff --git a/code/modules/antagonists/abductor/equipment/glands/quantum.dm b/code/modules/antagonists/abductor/equipment/glands/quantum.dm deleted file mode 100644 index d6a9152f4ca..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/quantum.dm +++ /dev/null @@ -1,47 +0,0 @@ -/obj/item/organ/heart/gland/quantum - true_name = "quantic de-observation matrix" - cooldown_low = 150 - cooldown_high = 150 - uses = -1 - icon_state = "emp" - mind_control_uses = 2 - mind_control_duration = 1200 - var/mob/living/carbon/entangled_mob - -/obj/item/organ/heart/gland/quantum/activate() - if(entangled_mob) - return - for(var/mob/M in oview(owner, 7)) - if(!iscarbon(M)) - continue - entangled_mob = M - addtimer(CALLBACK(src, PROC_REF(quantum_swap)), rand(600, 2400)) - return - -/obj/item/organ/heart/gland/quantum/proc/quantum_swap() - if(QDELETED(entangled_mob)) - entangled_mob = null - return - var/turf/T = get_turf(owner) - do_teleport(owner, get_turf(entangled_mob),null,TRUE,channel = TELEPORT_CHANNEL_QUANTUM) - do_teleport(entangled_mob, T,null,TRUE,channel = TELEPORT_CHANNEL_QUANTUM) - to_chat(owner, span_warning("I suddenly find myself somewhere else!")) - to_chat(entangled_mob, span_warning("I suddenly find myself somewhere else!")) - if(!active_mind_control) //Do not reset entangled mob while mind control is active - entangled_mob = null - -/obj/item/organ/heart/gland/quantum/mind_control(command, mob/living/user) - if(..()) - if(entangled_mob && ishuman(entangled_mob) && (entangled_mob.stat < DEAD)) - to_chat(entangled_mob, span_danger("I suddenly feel an irresistible compulsion to follow an order...")) - to_chat(entangled_mob, span_mind_control("[command]")) - var/atom/movable/screen/alert/mind_control/mind_alert = entangled_mob.throw_alert("mind_control", /atom/movable/screen/alert/mind_control) - mind_alert.command = command - message_admins("[key_name(owner)] mirrored an abductor mind control message to [key_name(entangled_mob)]: [command]") - update_gland_hud() - -/obj/item/organ/heart/gland/quantum/clear_mind_control() - if(active_mind_control) - to_chat(entangled_mob, span_danger("I feel the compulsion fade, and you completely forget about your previous orders.")) - entangled_mob.clear_alert("mind_control") - ..() diff --git a/code/modules/antagonists/abductor/equipment/glands/slime.dm b/code/modules/antagonists/abductor/equipment/glands/slime.dm deleted file mode 100644 index c2ab03ea100..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/slime.dm +++ /dev/null @@ -1,21 +0,0 @@ -/obj/item/organ/heart/gland/slime - true_name = "gastric animation galvanizer" - cooldown_low = 600 - cooldown_high = 1200 - uses = -1 - icon_state = "slime" - mind_control_uses = 1 - mind_control_duration = 2400 - -/obj/item/organ/heart/gland/slime/Insert(mob/living/carbon/M, special = 0) - ..() - owner.faction |= "slime" - owner.grant_language(/datum/language/slime) - -/obj/item/organ/heart/gland/slime/activate() - to_chat(owner, span_warning("I feel nauseated!")) - owner.vomit(20) - - var/mob/living/simple_animal/slime/Slime = new(get_turf(owner), "grey") - Slime.Friends = list(owner) - Slime.Leader = owner diff --git a/code/modules/antagonists/abductor/equipment/glands/spider.dm b/code/modules/antagonists/abductor/equipment/glands/spider.dm deleted file mode 100644 index ee4d5ed5b12..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/spider.dm +++ /dev/null @@ -1,14 +0,0 @@ -/obj/item/organ/heart/gland/spiderman - true_name = "araneae cloister accelerator" - cooldown_low = 450 - cooldown_high = 900 - uses = -1 - icon_state = "spider" - mind_control_uses = 2 - mind_control_duration = 2400 - -/obj/item/organ/heart/gland/spiderman/activate() - to_chat(owner, span_warning("I feel something crawling in your skin.")) - owner.faction |= "spiders" - var/obj/structure/spider/spiderling/S = new(owner.drop_location()) - S.directive = "Protect your nest inside [owner.real_name]." diff --git a/code/modules/antagonists/abductor/equipment/glands/transform.dm b/code/modules/antagonists/abductor/equipment/glands/transform.dm deleted file mode 100644 index 544c9f0f5b5..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/transform.dm +++ /dev/null @@ -1,15 +0,0 @@ -/obj/item/organ/heart/gland/transform - true_name = "anthropmorphic transmorphosizer" - cooldown_low = 900 - cooldown_high = 1800 - uses = -1 - human_only = TRUE - icon_state = "species" - mind_control_uses = 7 - mind_control_duration = 300 - -/obj/item/organ/heart/gland/transform/activate() - to_chat(owner, span_notice("I feel unlike myself.")) - randomize_human(owner) - var/species = pick(list(/datum/species/human, /datum/species/lizard, /datum/species/moth, /datum/species/fly)) - owner.set_species(species) diff --git a/code/modules/antagonists/abductor/equipment/glands/trauma.dm b/code/modules/antagonists/abductor/equipment/glands/trauma.dm deleted file mode 100644 index 5a4b38ac895..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/trauma.dm +++ /dev/null @@ -1,18 +0,0 @@ -/obj/item/organ/heart/gland/trauma - true_name = "white matter randomiser" - cooldown_low = 800 - cooldown_high = 1200 - uses = 5 - icon_state = "emp" - mind_control_uses = 3 - mind_control_duration = 1800 - -/obj/item/organ/heart/gland/trauma/activate() - to_chat(owner, span_warning("I feel a spike of pain in your head.")) - if(prob(33)) - owner.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY)) - else - if(prob(20)) - owner.gain_trauma_type(BRAIN_TRAUMA_SEVERE, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY)) - else - owner.gain_trauma_type(BRAIN_TRAUMA_MILD, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY)) diff --git a/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm b/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm deleted file mode 100644 index ca263e837b9..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm +++ /dev/null @@ -1,12 +0,0 @@ -/obj/item/organ/heart/gland/ventcrawling - true_name = "pliant cartilage enabler" - cooldown_low = 1800 - cooldown_high = 2400 - uses = 1 - icon_state = "vent" - mind_control_uses = 4 - mind_control_duration = 1800 - -/obj/item/organ/heart/gland/ventcrawling/activate() - to_chat(owner, span_notice("I feel very stretchy.")) - owner.ventcrawler = VENTCRAWLER_ALWAYS diff --git a/code/modules/antagonists/abductor/equipment/glands/viral.dm b/code/modules/antagonists/abductor/equipment/glands/viral.dm deleted file mode 100644 index 66fe5ccf9cd..00000000000 --- a/code/modules/antagonists/abductor/equipment/glands/viral.dm +++ /dev/null @@ -1,34 +0,0 @@ -/obj/item/organ/heart/gland/viral - true_name = "contamination incubator" - cooldown_low = 1800 - cooldown_high = 2400 - uses = 1 - icon_state = "viral" - mind_control_uses = 1 - mind_control_duration = 1800 - -/obj/item/organ/heart/gland/viral/activate() - to_chat(owner, span_warning("I feel sick.")) - var/datum/disease/advance/A = random_virus(pick(2,6),6) - A.carrier = TRUE - owner.ForceContractDisease(A, FALSE, TRUE) - -/obj/item/organ/heart/gland/viral/proc/random_virus(max_symptoms, max_level) - if(max_symptoms > VIRUS_SYMPTOM_LIMIT) - max_symptoms = VIRUS_SYMPTOM_LIMIT - var/datum/disease/advance/A = new /datum/disease/advance() - var/list/datum/symptom/possible_symptoms = list() - for(var/symptom in subtypesof(/datum/symptom)) - var/datum/symptom/S = symptom - if(initial(S.level) > max_level) - continue - if(initial(S.level) <= 0) //unobtainable symptoms - continue - possible_symptoms += S - for(var/i in 1 to max_symptoms) - var/datum/symptom/chosen_symptom = pick_n_take(possible_symptoms) - if(chosen_symptom) - var/datum/symptom/S = new chosen_symptom - A.symptoms += S - A.Refresh() //just in case someone already made and named the same disease - return A diff --git a/code/modules/antagonists/abductor/ice_abductor.dm b/code/modules/antagonists/abductor/ice_abductor.dm deleted file mode 100644 index d1b829297ca..00000000000 --- a/code/modules/antagonists/abductor/ice_abductor.dm +++ /dev/null @@ -1,12 +0,0 @@ -/obj/structure/fluff/iced_abductor ///Unless more non-machine ayy structures made, it will stay in fluff. - name = "Mysterious Block of Ice" - desc = "" - icon = 'icons/effects/freeze.dmi' - icon_state = "ice_ayy" - density = TRUE - deconstructible = FALSE - -/obj/structure/fluff/iced_abductor/Destroy() - var/turf/T = get_turf(src) - new /obj/effect/mob_spawn/human/abductor(T) - . = ..() diff --git a/code/modules/antagonists/abductor/machinery/camera.dm b/code/modules/antagonists/abductor/machinery/camera.dm deleted file mode 100644 index 5c0878017d2..00000000000 --- a/code/modules/antagonists/abductor/machinery/camera.dm +++ /dev/null @@ -1,139 +0,0 @@ -/obj/machinery/computer/camera_advanced/abductor - name = "Human Observation Console" - var/team_number = 0 - networks = list("ss13", "abductor") - var/datum/action/innate/teleport_in/tele_in_action = new - var/datum/action/innate/teleport_out/tele_out_action = new - var/datum/action/innate/teleport_self/tele_self_action = new - var/datum/action/innate/vest_mode_swap/vest_mode_action = new - var/datum/action/innate/vest_disguise_swap/vest_disguise_action = new - var/datum/action/innate/set_droppoint/set_droppoint_action = new - var/obj/machinery/abductor/console/console - lock_override = TRUE - - icon = 'icons/obj/abductor.dmi' - icon_state = "camera" - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF - -/obj/machinery/computer/camera_advanced/abductor/CreateEye() - ..() - eyeobj.visible_icon = TRUE - eyeobj.icon = 'icons/mob/cameramob.dmi' - eyeobj.icon_state = "abductor_camera" - eyeobj.invisibility = INVISIBILITY_OBSERVER - -/obj/machinery/computer/camera_advanced/abductor/GrantActions(mob/living/carbon/user) - ..() - - if(tele_in_action) - tele_in_action.target = console.pad - tele_in_action.Grant(user) - actions += tele_in_action - - if(tele_out_action) - tele_out_action.target = console - tele_out_action.Grant(user) - actions += tele_out_action - - if(tele_self_action) - tele_self_action.target = console.pad - tele_self_action.Grant(user) - actions += tele_self_action - - if(vest_mode_action) - vest_mode_action.target = console - vest_mode_action.Grant(user) - actions += vest_mode_action - - if(vest_disguise_action) - vest_disguise_action.target = console - vest_disguise_action.Grant(user) - actions += vest_disguise_action - - if(set_droppoint_action) - set_droppoint_action.target = console - set_droppoint_action.Grant(user) - actions += set_droppoint_action - -/obj/machinery/computer/camera_advanced/abductor/proc/IsScientist(mob/living/carbon/human/H) - return HAS_TRAIT(H, TRAIT_ABDUCTOR_SCIENTIST_TRAINING) - -/datum/action/innate/teleport_in - name = "Send To" - icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "beam_down" - -/datum/action/innate/teleport_in/Activate() - if(!target || !iscarbon(owner)) - return - var/mob/living/carbon/human/C = owner - var/mob/camera/aiEye/remote/remote_eye = C.remote_control - var/obj/machinery/abductor/pad/P = target - - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) - P.PadToLoc(remote_eye.loc) - -/datum/action/innate/teleport_out - name = "Retrieve" - icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "beam_up" - -/datum/action/innate/teleport_out/Activate() - if(!target || !iscarbon(owner)) - return - var/obj/machinery/abductor/console/console = target - - console.TeleporterRetrieve() - -/datum/action/innate/teleport_self - name = "Send Self" - icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "beam_down" - -/datum/action/innate/teleport_self/Activate() - if(!target || !iscarbon(owner)) - return - var/mob/living/carbon/human/C = owner - var/mob/camera/aiEye/remote/remote_eye = C.remote_control - var/obj/machinery/abductor/pad/P = target - - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) - P.MobToLoc(remote_eye.loc,C) - -/datum/action/innate/vest_mode_swap - name = "Switch Vest Mode" - icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "vest_mode" - -/datum/action/innate/vest_mode_swap/Activate() - if(!target || !iscarbon(owner)) - return - var/obj/machinery/abductor/console/console = target - console.FlipVest() - - -/datum/action/innate/vest_disguise_swap - name = "Switch Vest Disguise" - icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "vest_disguise" - -/datum/action/innate/vest_disguise_swap/Activate() - if(!target || !iscarbon(owner)) - return - var/obj/machinery/abductor/console/console = target - console.SelectDisguise(remote=1) - -/datum/action/innate/set_droppoint - name = "Set Experiment Release Point" - icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "set_drop" - -/datum/action/innate/set_droppoint/Activate() - if(!target || !iscarbon(owner)) - return - - var/mob/living/carbon/human/C = owner - var/mob/camera/aiEye/remote/remote_eye = C.remote_control - - var/obj/machinery/abductor/console/console = target - console.SetDroppoint(remote_eye.loc,owner) diff --git a/code/modules/antagonists/abductor/machinery/console.dm b/code/modules/antagonists/abductor/machinery/console.dm deleted file mode 100644 index 09b4c2adb70..00000000000 --- a/code/modules/antagonists/abductor/machinery/console.dm +++ /dev/null @@ -1,248 +0,0 @@ -/proc/get_abductor_console(team_number) - for(var/obj/machinery/abductor/console/C in GLOB.machines) - if(C.team_number == team_number) - return C - -//Common - -/obj/machinery/abductor - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF - var/team_number = 0 - -//Console - -/obj/machinery/abductor/console - name = "abductor console" - desc = "" - icon = 'icons/obj/abductor.dmi' - icon_state = "console" - density = TRUE - var/obj/item/abductor/gizmo/gizmo - var/obj/item/clothing/suit/armor/abductor/vest/vest - var/obj/machinery/abductor/experiment/experiment - var/obj/machinery/abductor/pad/pad - var/obj/machinery/computer/camera_advanced/abductor/camera - var/list/datum/icon_snapshot/disguises = list() - -/obj/machinery/abductor/console/attack_hand(mob/user) - . = ..() - if(.) - return - if(!HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING) && !HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_TRAINING)) - to_chat(user, span_warning("I start mashing alien buttons at random!")) - if(do_after(user,100, target = src)) - TeleporterSend() - return - user.set_machine(src) - var/dat = "" - dat += "

    Abductsoft 3000

    " - - if(experiment) - var/points = experiment.points - var/credits = experiment.credits - dat += "Collected Samples : [points]
    " - dat += "Gear Credits: [credits]
    " - dat += "Transfer data in exchange for supplies:
    " - dat += "Advanced Baton (2 Credits)
    " - dat += "Mental Interface Device (2 Credits)
    " - dat += "Reagent Synthesizer (2 Credits)
    " - dat += "Shrink Ray Blaster (2 Credits)
    " - dat += "Agent Helmet
    " - dat += "Agent Vest
    " - dat += "Radio Silencer
    " - dat += "Science Tool
    " - dat += "Superlingual Matrix
    " - else - dat += "NO EXPERIMENT MACHINE DETECTED
    " - - if(pad) - dat += span_bad("Emergency Teleporter System.") - dat += span_bad("Consider using primary observation console first.") - dat += "Activate Teleporter
    " - if(gizmo && gizmo.marked) - dat += "Retrieve Mark
    " - else - dat += "Retrieve Mark
    " - else - dat += "NO TELEPAD DETECTED
    " - - if(vest) - dat += "

    Agent Vest Mode


    " - var/mode = vest.mode - if(mode == VEST_STEALTH) - dat += "Combat" - dat += span_linkoff("Stealth") - else - dat += span_linkoff("Combat") - dat += "Stealth" - - dat+="
    " - dat += "Select Agent Vest Disguise
    " - dat += "[HAS_TRAIT_FROM(vest, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT) ? "Unlock" : "Lock"] Vest
    " - else - dat += span_bad("NO AGENT VEST DETECTED") - var/datum/browser/popup = new(user, "computer", "Abductor Console", 400, 500) - popup.set_content(dat) - popup.open() - -/obj/machinery/abductor/console/Topic(href, href_list) - if(..()) - return - - usr.set_machine(src) - if(href_list["teleporter_send"]) - TeleporterSend() - else if(href_list["teleporter_retrieve"]) - TeleporterRetrieve() - else if(href_list["flip_vest"]) - FlipVest() - else if(href_list["toggle_vest"]) - if(vest) - vest.toggle_nodrop() - else if(href_list["select_disguise"]) - SelectDisguise() - else if(href_list["dispense"]) - switch(href_list["dispense"]) - if("baton") - Dispense(/obj/item/abductor/baton,cost=2) - if("helmet") - Dispense(/obj/item/clothing/head/helmet/abductor) - if("silencer") - Dispense(/obj/item/abductor/silencer) - if("tool") - Dispense(/obj/item/abductor/gizmo) - if("vest") - Dispense(/obj/item/clothing/suit/armor/abductor/vest) - if("mind_device") - Dispense(/obj/item/abductor/mind_device,cost=2) - if("chem_dispenser") - Dispense(/obj/item/abductor_machine_beacon/chem_dispenser,cost=2) - if("tongue") - Dispense(/obj/item/organ/tongue/abductor) - if("shrink_ray") - Dispense(/obj/item/gun/energy/shrink_ray,cost=2) - updateUsrDialog() - -/obj/machinery/abductor/console/proc/TeleporterRetrieve() - if(pad && gizmo && gizmo.marked) - pad.Retrieve(gizmo.marked) - -/obj/machinery/abductor/console/proc/TeleporterSend() -// if(pad) -// pad.Send() - -/obj/machinery/abductor/console/proc/FlipVest() - if(vest) - vest.flip_mode() - -/obj/machinery/abductor/console/proc/SelectDisguise(remote = FALSE) - var/list/disguises2 = list() - for(var/name in disguises) - var/datum/icon_snapshot/snap = disguises[name] - var/image/dummy = image(snap.icon, src, snap.icon_state) - dummy.overlays = snap.overlays - disguises2[name] = dummy - - var/entry_name - if(remote) - entry_name = show_radial_menu(usr, camera.eyeobj, disguises2, tooltips = TRUE) - else - entry_name = show_radial_menu(usr, src, disguises2, require_near = TRUE, tooltips = TRUE) - - var/datum/icon_snapshot/chosen = disguises[entry_name] - if(chosen && vest && (remote || in_range(usr,src))) - vest.SetDisguise(chosen) - -/obj/machinery/abductor/console/proc/SetDroppoint(turf/open/location,user) - if(!istype(location)) - to_chat(user, span_warning("That place is not safe for the specimen.")) - return - - if(pad) - pad.teleport_target = location - to_chat(user, span_notice("Location marked as test subject release point.")) - - -/obj/machinery/abductor/console/Initialize(mapload) - ..() - return INITIALIZE_HINT_LATELOAD - -/obj/machinery/abductor/console/LateInitialize() - if(!team_number) - return - - for(var/obj/machinery/abductor/pad/p in GLOB.machines) - if(p.team_number == team_number) - pad = p - break - - for(var/obj/machinery/abductor/experiment/e in GLOB.machines) - if(e.team_number == team_number) - experiment = e - e.console = src - - for(var/obj/machinery/computer/camera_advanced/abductor/c in GLOB.machines) - if(c.team_number == team_number) - camera = c - c.console = src - -/obj/machinery/abductor/console/proc/AddSnapshot(mob/living/carbon/human/target) - if(target.anti_magic_check(FALSE, FALSE, TRUE, 0)) - say("Subject wearing specialized protective tinfoil gear, unable to get a proper scan!") - return - var/datum/icon_snapshot/entry = new - entry.name = target.name - entry.icon = target.icon - entry.icon_state = target.icon_state - entry.overlays = target.get_overlays_copy(list(HANDS_LAYER)) //ugh - //Update old disguise instead of adding new one - if(disguises[entry.name]) - disguises[entry.name] = entry - return - disguises[entry.name] = entry - -/obj/machinery/abductor/console/proc/AddGizmo(obj/item/abductor/gizmo/G) - if(G == gizmo && G.console == src) - return FALSE - - if(G.console) - G.console.gizmo = null - - gizmo = G - G.console = src - return TRUE - -/obj/machinery/abductor/console/proc/AddVest(obj/item/clothing/suit/armor/abductor/vest/V) - if(vest == V) - return FALSE - - for(var/obj/machinery/abductor/console/C in GLOB.machines) - if(C.vest == V) - C.vest = null - break - - vest = V - return TRUE - -/obj/machinery/abductor/console/attackby(obj/O, mob/user, params) - if(istype(O, /obj/item/abductor/gizmo) && AddGizmo(O)) - to_chat(user, span_notice("I link the tool to the console.")) - else if(istype(O, /obj/item/clothing/suit/armor/abductor/vest) && AddVest(O)) - to_chat(user, span_notice("I link the vest to the console.")) - else - return ..() - - - -/obj/machinery/abductor/console/proc/Dispense(item,cost=1) - if(experiment && experiment.credits >= cost) - experiment.credits -=cost - say("Incoming supply!") - var/drop_location = loc - if(pad) - flick("alien-pad", pad) - drop_location = pad.loc - new item(drop_location) - - else - say("Insufficent data!") diff --git a/code/modules/antagonists/abductor/machinery/dispenser.dm b/code/modules/antagonists/abductor/machinery/dispenser.dm deleted file mode 100644 index 01633d64e72..00000000000 --- a/code/modules/antagonists/abductor/machinery/dispenser.dm +++ /dev/null @@ -1,84 +0,0 @@ -/obj/machinery/abductor/gland_dispenser - name = "replacement organ storage" - desc = "" - icon = 'icons/obj/abductor.dmi' - icon_state = "dispenser" - density = TRUE - var/list/gland_types - var/list/gland_colors - var/list/amounts - -/obj/machinery/abductor/gland_dispenser/proc/random_color() - //TODO : replace with presets or spectrum - return rgb(rand(0,255),rand(0,255),rand(0,255)) - -/obj/machinery/abductor/gland_dispenser/Initialize() - . = ..() - gland_types = subtypesof(/obj/item/organ/heart/gland) - gland_types = shuffle(gland_types) - gland_colors = new/list(gland_types.len) - amounts = new/list(gland_types.len) - for(var/i=1,i<=gland_types.len,i++) - gland_colors[i] = random_color() - amounts[i] = rand(1,5) - -/obj/machinery/abductor/gland_dispenser/attack_hand(mob/user) - . = ..() - if(.) - return - if(!isabductor(user)) - return - user.set_machine(src) - var/box_css = {" - "} - var/dat = "" - var/item_count = 0 - for(var/i=1,i<=gland_colors.len,i++) - item_count++ - var/g_color = gland_colors[i] - var/amount = amounts[i] - dat += "[amount]" - if(item_count == 4) // Four boxes per line - dat +="

    " - item_count = 0 - var/datum/browser/popup = new(user, "glands", "Gland Dispenser", 200, 200) - popup.add_head_content(box_css) - popup.set_content(dat) - popup.open() - return - -/obj/machinery/abductor/gland_dispenser/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/organ/heart/gland)) - if(!user.transferItemToLoc(W, src)) - return - for(var/i=1,i<=gland_colors.len,i++) - if(gland_types[i] == W.type) - amounts[i]++ - else - return ..() - -/obj/machinery/abductor/gland_dispenser/Topic(href, href_list) - if(..()) - return - usr.set_machine(src) - - if(href_list["dispense"]) - Dispense(text2num(href_list["dispense"])) - updateUsrDialog() - -/obj/machinery/abductor/gland_dispenser/proc/Dispense(count) - if(amounts[count]>0) - amounts[count]-- - var/T = gland_types[count] - new T(get_turf(src)) diff --git a/code/modules/antagonists/abductor/machinery/experiment.dm b/code/modules/antagonists/abductor/machinery/experiment.dm deleted file mode 100644 index dd82b6d3a5d..00000000000 --- a/code/modules/antagonists/abductor/machinery/experiment.dm +++ /dev/null @@ -1,218 +0,0 @@ -/obj/machinery/abductor/experiment - name = "experimentation machine" - desc = "" - icon = 'icons/obj/abductor.dmi' - icon_state = "experiment-open" - density = FALSE - state_open = TRUE - var/points = 0 - var/credits = 0 - var/list/history - var/list/abductee_minds - var/flash = " - || - " - var/obj/machinery/abductor/console/console - var/message_cooldown = 0 - var/breakout_time = 450 - -/obj/machinery/abductor/experiment/MouseDrop_T(mob/target, mob/user) - var/mob/living/L = user - if(user.stat || (isliving(user) && (!(L.mobility_flags & MOBILITY_STAND) || !(L.mobility_flags & MOBILITY_UI))) || !Adjacent(user) || !target.Adjacent(user) || !ishuman(target)) - return - if(isabductor(target)) - return - close_machine(target) - -/obj/machinery/abductor/experiment/attack_hand(mob/user) - . = ..() - if(.) - return - - experimentUI(user) - -/obj/machinery/abductor/experiment/open_machine() - if(!state_open && !panel_open) - ..() - -/obj/machinery/abductor/experiment/close_machine(mob/target) - for(var/A in loc) - if(isabductor(A)) - return - if(state_open && !panel_open) - ..(target) - -/obj/machinery/abductor/experiment/relaymove(mob/user) - if(user.stat != CONSCIOUS) - return - if(message_cooldown <= world.time) - message_cooldown = world.time + 50 - to_chat(user, span_warning("[src]'s door won't budge!")) - -/obj/machinery/abductor/experiment/container_resist(mob/living/user) - user.changeNext_move(CLICK_CD_BREAKOUT) - user.last_special = world.time + CLICK_CD_BREAKOUT - user.visible_message(span_notice("I see [user] kicking against the door of [src]!"), \ - span_notice("I lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)"), \ - span_hear("I hear a metallic creaking from [src].")) - if(do_after(user,(breakout_time), target = src)) - if(!user || user.stat != CONSCIOUS || user.loc != src || state_open) - return - user.visible_message(span_warning("[user] successfully broke out of [src]!"), \ - span_notice("I successfully break out of [src]!")) - open_machine() - -/obj/machinery/abductor/experiment/proc/dissection_icon(mob/living/carbon/human/H) - var/icon/photo = null - var/g = (H.gender == FEMALE) ? "f" : "m" - if(H.dna.species.use_skintones) - photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.skin_tone]_[g]") - else - photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.dna.species.id]_[g]") - photo.Blend("#[H.dna.features["mcolor"]]", ICON_MULTIPLY) - - var/icon/eyes - if(EYECOLOR in H.dna.species.species_traits) - eyes = icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "eyes") - eyes.Blend("#[H.eye_color]", ICON_MULTIPLY) - - if(eyes) - photo.Blend(eyes, ICON_OVERLAY) - - var/icon/splat = icon("icon" = 'icons/mob/dam_mob.dmi',"icon_state" = "chest30") - photo.Blend(splat,ICON_OVERLAY) - - return photo - -/obj/machinery/abductor/experiment/proc/experimentUI(mob/user) - var/dat - dat += "

    Experiment

    " - if(occupant) - var/obj/item/photo/P = new - P.picture = new - P.picture.picture_image = icon(dissection_icon(occupant), dir = SOUTH) - user << browse_rsc(P.picture.picture_image, "dissection_img") - dat += "
    " - dat += "" //Avert your eyes - dat += "" - dat += "Probe
    " - dat += "Dissect
    " - dat += "Analyze
    " - dat += "
    " - else - dat += span_linkoff("Experiment ") - - if(!occupant) - dat += "

    Machine Unoccupied

    " - else - dat += "

    Subject Status :

    " - dat += "[occupant.name] => " - var/mob/living/mob_occupant = occupant - switch(mob_occupant.stat) - if(CONSCIOUS) - dat += span_good("Conscious") - if(UNCONSCIOUS) - dat += span_average("Unconscious") - else // DEAD - dat += span_bad("Deceased") - dat += "
    " - dat += "[flash]" - dat += "
    " - dat += "Scan" - dat += "Close" : "open=1'>Open"]" - var/datum/browser/popup = new(user, "experiment", "Probing Console", 300, 300) - popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) - popup.set_content(dat) - popup.open() - -/obj/machinery/abductor/experiment/Topic(href, href_list) - if(..() || usr == occupant) - return - usr.set_machine(src) - if(href_list["refresh"]) - updateUsrDialog() - return - if(href_list["open"]) - open_machine() - return - if(href_list["close"]) - close_machine() - return - if(occupant) - var/mob/living/mob_occupant = occupant - if(mob_occupant.stat != DEAD) - if(href_list["experiment"]) - flash = Experiment(occupant,href_list["experiment"],usr) - updateUsrDialog() - add_fingerprint(usr) - -/obj/machinery/abductor/experiment/proc/Experiment(mob/occupant,type,mob/user) - LAZYINITLIST(history) - var/mob/living/carbon/human/H = occupant - - var/datum/antagonist/abductor/user_abductor = user.mind.has_antag_datum(/datum/antagonist/abductor) - if(!user_abductor) - return span_bad("Authorization failure. Contact mothership immidiately.") - - var/point_reward = 0 - if(H in history) - return span_bad("Specimen already in database.") - if(H.stat == DEAD) - say("Specimen deceased - please provide fresh sample.") - return span_bad("Specimen deceased.") - var/obj/item/organ/heart/gland/GlandTest = locate() in H.internal_organs - if(!GlandTest) - say("Experimental dissection not detected!") - return span_bad("No glands detected!") - if(H.mind != null && H.ckey != null) - LAZYINITLIST(abductee_minds) - LAZYADD(history, H) - LAZYADD(abductee_minds, H.mind) - say("Processing specimen...") - sleep(5) - switch(text2num(type)) - if(1) - to_chat(H, span_warning("I feel violated.")) - if(2) - to_chat(H, span_warning("I feel myself being sliced apart and put back together.")) - if(3) - to_chat(H, span_warning("I feel intensely watched.")) - sleep(5) - user_abductor.team.abductees += H.mind - H.mind.add_antag_datum(/datum/antagonist/abductee) - - for(var/obj/item/organ/heart/gland/G in H.internal_organs) - G.Start() - point_reward++ - if(point_reward > 0) - open_machine() - SendBack(H) - playsound(src.loc, 'sound/blank.ogg', 50, TRUE) - points += point_reward - credits += point_reward - return span_good("Experiment successful! [point_reward] new data-points collected.") - else - playsound(src.loc, 'sound/blank.ogg', 50, TRUE) - return span_bad("Experiment failed! No replacement organ detected.") - else - say("Brain activity nonexistent - disposing sample...") - open_machine() - SendBack(H) - return span_bad("Specimen braindead - disposed.") - return span_bad("ERROR") - - -/obj/machinery/abductor/experiment/proc/SendBack(mob/living/carbon/human/H) - H.Sleeping(160) - H.uncuff() - if(console && console.pad && console.pad.teleport_target) - H.forceMove(console.pad.teleport_target) - return - //Area not chosen / It's not safe area - teleport to arrivals - SSjob.SendToLateJoin(H, FALSE) - return - - -/obj/machinery/abductor/experiment/update_icon() - if(state_open) - icon_state = "experiment-open" - else - icon_state = "experiment" diff --git a/code/modules/antagonists/abductor/machinery/pad.dm b/code/modules/antagonists/abductor/machinery/pad.dm deleted file mode 100644 index 20c838b6f41..00000000000 --- a/code/modules/antagonists/abductor/machinery/pad.dm +++ /dev/null @@ -1,56 +0,0 @@ -/obj/machinery/abductor/pad - name = "Alien Telepad" - desc = "" - icon = 'icons/obj/abductor.dmi' - icon_state = "alien-pad-idle" - var/turf/teleport_target - -/obj/machinery/abductor/pad/proc/Warp(mob/living/target) - if(!target.buckled) - target.forceMove(get_turf(src)) - -/obj/machinery/abductor/pad/proc/Send() - if(teleport_target == null) - teleport_target = GLOB.teleportlocs[pick(GLOB.teleportlocs)] - flick("alien-pad", src) - for(var/mob/living/target in loc) - target.forceMove(teleport_target) - new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir) - to_chat(target, span_warning("The instability of the warp leaves you disoriented!")) - target.Stun(60) - -/obj/machinery/abductor/pad/proc/Retrieve(mob/living/target) - flick("alien-pad", src) - new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir) - Warp(target) - -/obj/machinery/abductor/pad/proc/doMobToLoc(place, atom/movable/target) - flick("alien-pad", src) - target.forceMove(place) - new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir) - -/obj/machinery/abductor/pad/proc/MobToLoc(place,mob/living/target) - new /obj/effect/temp_visual/teleport_abductor(place) - addtimer(CALLBACK(src, PROC_REF(doMobToLoc), place, target), 80) - -/obj/machinery/abductor/pad/proc/doPadToLoc(place) - flick("alien-pad", src) - for(var/mob/living/target in get_turf(src)) - target.forceMove(place) - new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir) - -/obj/machinery/abductor/pad/proc/PadToLoc(place) - new /obj/effect/temp_visual/teleport_abductor(place) - addtimer(CALLBACK(src, PROC_REF(doPadToLoc), place), 80) - -/obj/effect/temp_visual/teleport_abductor - name = "Huh" - icon = 'icons/obj/abductor.dmi' - icon_state = "teleport" - duration = 80 - -/obj/effect/temp_visual/teleport_abductor/Initialize() - . = ..() - var/datum/effect_system/spark_spread/S = new - S.set_up(10,0,loc) - S.start() diff --git a/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm b/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm index b767897907b..8480ef237da 100644 --- a/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm +++ b/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm @@ -21,7 +21,7 @@ return damage * 1.25 //a laser will do 25 damage, which will kill any normal blob /datum/blobstrain/reagent/electromagnetic_web/death_reaction(obj/structure/blob/B, damage_flag) - if(damage_flag in MELEE_TYPES || damage_flag == "bullet" || damage_flag == "laser") + if((damage_flag in MELEE_TYPES) || damage_flag == "bullet" || damage_flag == "laser") empulse(B.loc, 1, 3) //less than screen range, so you can stand out of range to avoid it /datum/reagent/blob/electromagnetic_web diff --git a/code/modules/antagonists/blob/blobstrains/energized_jelly.dm b/code/modules/antagonists/blob/blobstrains/energized_jelly.dm index 2550bf19679..07c4406ab9e 100644 --- a/code/modules/antagonists/blob/blobstrains/energized_jelly.dm +++ b/code/modules/antagonists/blob/blobstrains/energized_jelly.dm @@ -10,7 +10,7 @@ reagent = /datum/reagent/blob/energized_jelly /datum/blobstrain/reagent/energized_jelly/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) - if((damage_flag in MELEE_TYPES || damage_flag == "bullet" || damage_flag == "laser") && B.obj_integrity - damage <= 0 && prob(10)) + if(((damage_flag in MELEE_TYPES) || damage_flag == "bullet" || damage_flag == "laser") && B.obj_integrity - damage <= 0 && prob(10)) do_sparks(rand(2, 4), FALSE, B) return ..() diff --git a/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm b/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm index 82210a75235..2ac444bd453 100644 --- a/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm +++ b/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm @@ -13,12 +13,12 @@ reagent = /datum/reagent/blob/pressurized_slime /datum/blobstrain/reagent/pressurized_slime/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) - if((damage_flag in MELEE_TYPES || damage_flag == "bullet" || damage_flag == "laser") || damage_type != BURN) + if(((damage_flag in MELEE_TYPES) || damage_flag == "bullet" || damage_flag == "laser") || damage_type != BURN) extinguisharea(B, damage) return ..() /datum/blobstrain/reagent/pressurized_slime/death_reaction(obj/structure/blob/B, damage_flag) - if(damage_flag in MELEE_TYPES || damage_flag == "bullet" || damage_flag == "laser") + if((damage_flag in MELEE_TYPES) || damage_flag == "bullet" || damage_flag == "laser") B.visible_message(span_boldwarning("The blob ruptures, spraying the area with liquid!")) extinguisharea(B, 50) diff --git a/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm b/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm index df3ed9413cc..71dc559ccaa 100644 --- a/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm +++ b/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm @@ -15,7 +15,7 @@ B.forceMove(T) /datum/blobstrain/reagent/shifting_fragments/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) - if((damage_flag in MELEE_TYPES || damage_flag == "bullet" || damage_flag == "laser") && damage > 0 && B.obj_integrity - damage > 0 && prob(60-damage)) + if(((damage_flag in MELEE_TYPES) || damage_flag == "bullet" || damage_flag == "laser") && damage > 0 && B.obj_integrity - damage > 0 && prob(60-damage)) var/list/blobstopick = list() for(var/obj/structure/blob/OB in orange(1, B)) if((istype(OB, /obj/structure/blob/normal) || (istype(OB, /obj/structure/blob/shield) && prob(25))) && OB.overmind && OB.overmind.blobstrain.type == B.overmind.blobstrain.type) diff --git a/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm b/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm index b7942ea93f6..a24c712d1d3 100644 --- a/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm +++ b/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm @@ -12,7 +12,7 @@ reagent = /datum/reagent/blob/synchronous_mesh /datum/blobstrain/reagent/synchronous_mesh/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) - if(damage_flag in MELEE_TYPES || damage_flag == "bullet" || damage_flag == "laser") //the cause isn't fire or bombs, so split the damage + if((damage_flag in MELEE_TYPES) || damage_flag == "bullet" || damage_flag == "laser") //the cause isn't fire or bombs, so split the damage var/damagesplit = 1 //maximum split is 9, reducing the damage each blob takes to 11% but doing that damage to 9 blobs for(var/obj/structure/blob/C in orange(1, B)) if(!istype(C, /obj/structure/blob/core) && !istype(C, /obj/structure/blob/node) && C.overmind && C.overmind.blobstrain.type == B.overmind.blobstrain.type) //if it doesn't have the same chemical or is a core or node, don't split damage to it diff --git a/code/modules/antagonists/blob/blobstrains/zombifying_pods.dm b/code/modules/antagonists/blob/blobstrains/zombifying_pods.dm index 27b74533d9e..0b29762d3b4 100644 --- a/code/modules/antagonists/blob/blobstrains/zombifying_pods.dm +++ b/code/modules/antagonists/blob/blobstrains/zombifying_pods.dm @@ -12,7 +12,7 @@ reagent = /datum/reagent/blob/zombifying_pods /datum/blobstrain/reagent/zombifying_pods/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) - if((damage_flag in MELEE_TYPES || damage_flag == "bullet" || damage_flag == "laser") && damage <= 20 && B.obj_integrity - damage <= 0 && prob(30)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 20% chance of a shitty spore. + if(((damage_flag in MELEE_TYPES) || damage_flag == "bullet" || damage_flag == "laser") && damage <= 20 && B.obj_integrity - damage <= 0 && prob(30)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 20% chance of a shitty spore. B.visible_message(span_warning("A spore floats free of the blob!")) var/mob/living/simple_animal/hostile/blob/blobspore/weak/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(B.loc) BS.overmind = B.overmind diff --git a/code/modules/antagonists/blob/overmind.dm b/code/modules/antagonists/blob/overmind.dm index 7822a28117b..cf3d618dcc1 100644 --- a/code/modules/antagonists/blob/overmind.dm +++ b/code/modules/antagonists/blob/overmind.dm @@ -127,7 +127,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) if(!T || !is_station_level(T.z)) continue - if(L in GLOB.overminds || (L.pass_flags & PASSBLOB)) + if((L in GLOB.overminds) || (L.pass_flags & PASSBLOB)) continue var/area/Ablob = get_area(T) diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index c2c8196322d..a7b32cec736 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -299,7 +299,6 @@ /obj/structure/blob/proc/change_to(type, controller) if(!ispath(type)) CRASH("change_to(): invalid type for blob") - return var/obj/structure/blob/B = new type(src.loc, controller) B.creation_action() B.update_icon() diff --git a/code/modules/antagonists/changeling/powers/headcrab.dm b/code/modules/antagonists/changeling/powers/headcrab.dm deleted file mode 100644 index 43b2ce43a11..00000000000 --- a/code/modules/antagonists/changeling/powers/headcrab.dm +++ /dev/null @@ -1,43 +0,0 @@ -/datum/action/changeling/headcrab - name = "Last Resort" - desc = "" - helptext = "We will be placed in control of a small, fragile creature. We may attack a corpse like this to plant an egg which will slowly mature into a new form for us." - button_icon_state = "last_resort" - chemical_cost = 20 - dna_cost = 1 - req_human = 1 - -/datum/action/changeling/headcrab/sting_action(mob/user) - set waitfor = FALSE - if(alert("Are we sure we wish to kill ourself and create a headslug?",,"Yes", "No") == "No") - return - ..() - var/datum/mind/M = user.mind - var/list/organs = user.getorganszone(BODY_ZONE_HEAD, TRUE) - - for(var/obj/item/organ/I in organs) - I.Remove(user, 1) - - explosion(get_turf(user), 0, 0, 2, 0, TRUE) - for(var/mob/living/carbon/human/H in range(2,user)) - var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) - to_chat(H, span_danger("I are blinded by a shower of blood!")) - H.Stun(20) - H.blur_eyes(20) - eyes?.applyOrganDamage(5) - H.confused += 3 - for(var/mob/living/silicon/S in range(2,user)) - to_chat(S, span_danger("My sensors are disabled by a shower of blood!")) - S.Paralyze(60) - var/turf = get_turf(user) - user.gib() - . = TRUE - sleep(5) // So it's not killed in explosion - var/mob/living/simple_animal/hostile/headcrab/crab = new(turf) - for(var/obj/item/organ/I in organs) - I.forceMove(crab) - crab.origin = M - if(crab.origin) - crab.origin.active = 1 - crab.origin.transfer_to(crab) - to_chat(crab, span_warning("I burst out of the remains of my former body in a shower of gore!")) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index aeaf3343793..e43f2af72a1 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -182,10 +182,6 @@ var/obj/structure/table/T = target T.deconstruct(FALSE) - else if(istype(target, /obj/machinery/computer)) - var/obj/machinery/computer/C = target - C.attack_alien(user) //muh copypasta - else if(istype(target, /obj/machinery/door/airlock)) var/obj/machinery/door/airlock/A = target diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm index a3a14a36b7e..d5aaf6dc01e 100644 --- a/code/modules/antagonists/changeling/powers/panacea.dm +++ b/code/modules/antagonists/changeling/powers/panacea.dm @@ -12,7 +12,6 @@ to_chat(user, span_notice("We cleanse impurities from our form.")) ..() var/list/bad_organs = list( - user.getorgan(/obj/item/organ/body_egg), user.getorgan(/obj/item/organ/zombie_infection)) for(var/o in bad_organs) diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 032196e425e..4e0c6067cec 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -537,7 +537,6 @@ /obj/item/restraints/handcuffs/energy/cult //For the shackling spell name = "shadow shackles" desc = "" - trashtype = /obj/item/restraints/handcuffs/energy/used item_flags = DROPDEL /obj/item/restraints/handcuffs/energy/cult/used/dropped(mob/user) diff --git a/code/modules/antagonists/cult/cult_comms.dm b/code/modules/antagonists/cult/cult_comms.dm index e4d953f563d..096a4813e13 100644 --- a/code/modules/antagonists/cult/cult_comms.dm +++ b/code/modules/antagonists/cult/cult_comms.dm @@ -342,7 +342,7 @@ to_chat(owner, span_cultbold("The cult has already designated a target!")) return if(cooldown>world.time) - to_chat(owner, span_cultbold("I aren't ready to place another blood mark yet!")) + to_chat(owner, span_cultbold("I'm not ready to place another blood mark yet!")) return target = owner.orbiting?.parent || get_turf(owner) if(!target) diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 8681afc3b62..b5be1727f26 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -71,7 +71,7 @@ Runes can either be invoked by one's self or with many different cultists. Each if(.) return if(!iscultist(user)) - to_chat(user, span_warning("I aren't able to understand the words of [src].")) + to_chat(user, span_warning("I'm not able to understand the words of [src].")) return var/list/invokers = can_invoke(user) if(invokers.len >= req_cultists) @@ -1008,17 +1008,9 @@ structure_check() searches for nearby cultist structures required for the invoca if(11 to 20) var/datum/round_event_control/radiation_storm/RS = new() RS.runEvent() - if(21 to 30) + if(21 to 50) var/datum/round_event_control/brand_intelligence/BI = new() BI.runEvent() - if(31 to 40) - var/datum/round_event_control/immovable_rod/R = new() - R.runEvent() - R.runEvent() - R.runEvent() - if(41 to 50) - var/datum/round_event_control/meteor_wave/MW = new() - MW.runEvent() if(51 to 60) var/datum/round_event_control/spider_infestation/SI = new() SI.runEvent() diff --git a/code/modules/antagonists/disease/disease_event.dm b/code/modules/antagonists/disease/disease_event.dm deleted file mode 100644 index 370db73c2f1..00000000000 --- a/code/modules/antagonists/disease/disease_event.dm +++ /dev/null @@ -1,26 +0,0 @@ - -/datum/round_event_control/sentient_disease - name = "Spawn Sentient Disease" - typepath = /datum/round_event/ghost_role/sentient_disease - weight = 7 - max_occurrences = 1 - min_players = 5 - - -/datum/round_event/ghost_role/sentient_disease - role_name = "sentient disease" - -/datum/round_event/ghost_role/sentient_disease/spawn_role() - var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN) - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - var/mob/dead/observer/selected = pick_n_take(candidates) - - var/mob/camera/disease/virus = new /mob/camera/disease(SSmapping.get_station_center()) - virus.key = selected.key - INVOKE_ASYNC(virus, TYPE_PROC_REF(/mob/camera/disease, pick_name)) - message_admins("[ADMIN_LOOKUPFLW(virus)] has been made into a sentient disease by an event.") - log_game("[key_name(virus)] was spawned as a sentient disease by an event.") - spawned_mobs += virus - return SUCCESSFUL_SPAWN diff --git a/code/modules/antagonists/morph/morph.dm b/code/modules/antagonists/morph/morph.dm deleted file mode 100644 index 4c186916131..00000000000 --- a/code/modules/antagonists/morph/morph.dm +++ /dev/null @@ -1,245 +0,0 @@ -#define MORPH_COOLDOWN 50 - -/mob/living/simple_animal/hostile/morph - name = "morph" - real_name = "morph" - desc = "" - speak_emote = list("gurgles") - emote_hear = list("gurgles") - icon = 'icons/mob/animal.dmi' - icon_state = "morph" - icon_living = "morph" - icon_dead = "morph_dead" - speed = 2 - a_intent = INTENT_HARM - stop_automated_movement = 1 - status_flags = CANPUSH - pass_flags = PASSTABLE - ventcrawler = VENTCRAWLER_ALWAYS - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxHealth = 150 - health = 150 - healable = 0 - obj_damage = 50 - melee_damage_lower = 20 - melee_damage_upper = 20 - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - vision_range = 1 // Only attack when target is close - wander = FALSE - attack_verb_continuous = "glomps" - attack_verb_simple = "glomp" - attack_sound = 'sound/blank.ogg' - butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2) - - var/morphed = FALSE - var/melee_damage_disguised = 0 - var/eat_while_disguised = FALSE - var/atom/movable/form = null - var/morph_time = 0 - var/static/list/blacklist_typecache = typecacheof(list( - /atom/movable/screen, - /obj/singularity, - /mob/living/simple_animal/hostile/morph, - /obj/effect)) - - var/playstyle_string = "I are a morph, an abomination of science created primarily with changeling cells. \ - You may take the form of anything nearby by shift-clicking it. This process will alert any nearby \ - observers, and can only be performed once every five seconds. While morphed, you move faster, but do \ - less damage. In addition, anyone within three tiles will note an uncanny wrongness if examining you. \ - You can attack any item or dead creature to consume it - creatures will restore my health. \ - Finally, you can restore myself to my original form while morphed by shift-clicking myself." - -/mob/living/simple_animal/hostile/morph/examine(mob/user) - if(morphed) - . = form.examine(user) - if(get_dist(user,src)<=3) - . += span_warning("It doesn't look quite right...") - else - . = ..() - -/mob/living/simple_animal/hostile/morph/med_hud_set_health() - if(morphed && !isliving(form)) - var/image/holder = hud_list[HEALTH_HUD] - holder.icon_state = null - return //we hide medical hud while morphed - ..() - -/mob/living/simple_animal/hostile/morph/med_hud_set_status() - if(morphed && !isliving(form)) - var/image/holder = hud_list[STATUS_HUD] - holder.icon_state = null - return //we hide medical hud while morphed - ..() - -/mob/living/simple_animal/hostile/morph/proc/allowed(atom/movable/A) // make it into property/proc ? not sure if worth it - return !is_type_in_typecache(A, blacklist_typecache) && (isobj(A) || ismob(A)) - -/mob/living/simple_animal/hostile/morph/proc/eat(atom/movable/A) - if(morphed && !eat_while_disguised) - to_chat(src, span_warning("I can not eat anything while you are disguised!")) - return FALSE - if(A && A.loc != src) - visible_message(span_warning("[src] swallows [A] whole!")) - A.forceMove(src) - return TRUE - return FALSE - -/mob/living/simple_animal/hostile/morph/ShiftClickOn(atom/movable/A) - if(morph_time <= world.time && !stat) - if(A == src) - restore() - return - if(istype(A) && allowed(A)) - assume(A) - else - to_chat(src, span_warning("My chameleon skin is still repairing itself!")) - ..() - -/mob/living/simple_animal/hostile/morph/proc/assume(atom/movable/target) - if(morphed) - to_chat(src, span_warning("I must restore to my original form first!")) - return - morphed = TRUE - form = target - - visible_message(span_warning("[src] suddenly twists and changes shape, becoming a copy of [target]!"), \ - span_notice("I twist my body and assume the form of [target].")) - appearance = target.appearance - copy_overlays(target) - alpha = max(alpha, 150) //fucking chameleons - transform = initial(transform) - pixel_y = initial(pixel_y) - pixel_x = initial(pixel_x) - - //Morphed is weaker - melee_damage_lower = melee_damage_disguised - melee_damage_upper = melee_damage_disguised - set_varspeed(0) - - morph_time = world.time + MORPH_COOLDOWN - med_hud_set_health() - med_hud_set_status() //we're an object honest - return - -/mob/living/simple_animal/hostile/morph/proc/restore() - if(!morphed) - to_chat(src, span_warning("You're already in my normal form!")) - return - morphed = FALSE - form = null - alpha = initial(alpha) - color = initial(color) - animate_movement = SLIDE_STEPS - maptext = null - - visible_message(span_warning("[src] suddenly collapses in on itself, dissolving into a pile of green flesh!"), \ - span_notice("I reform to my normal body.")) - name = initial(name) - icon = initial(icon) - icon_state = initial(icon_state) - cut_overlays() - - //Baseline stats - melee_damage_lower = initial(melee_damage_lower) - melee_damage_upper = initial(melee_damage_upper) - set_varspeed(initial(speed)) - - morph_time = world.time + MORPH_COOLDOWN - med_hud_set_health() - med_hud_set_status() //we are not an object - -/mob/living/simple_animal/hostile/morph/death(gibbed) - if(morphed) - visible_message(span_warning("[src] twists and dissolves into a pile of green flesh!"), \ - span_danger("My skin ruptures! Your flesh breaks apart! No disguise can ward off de--")) - restore() - barf_contents() - ..() - -/mob/living/simple_animal/hostile/morph/proc/barf_contents() - for(var/atom/movable/AM in src) - AM.forceMove(loc) - if(prob(90)) - step(AM, pick(GLOB.alldirs)) - -/mob/living/simple_animal/hostile/morph/wabbajack_act(mob/living/new_mob) - barf_contents() - . = ..() - -/mob/living/simple_animal/hostile/morph/Aggro() // automated only - ..() - restore() - -/mob/living/simple_animal/hostile/morph/LoseAggro() - vision_range = initial(vision_range) - -/mob/living/simple_animal/hostile/morph/AIShouldSleep(list/possible_targets) - . = ..() - if(.) - var/list/things = list() - for(var/atom/movable/A in view(src)) - if(allowed(A)) - things += A - var/atom/movable/T = pick(things) - assume(T) - -/mob/living/simple_animal/hostile/morph/can_track(mob/living/user) - if(morphed) - return FALSE - return ..() - -/mob/living/simple_animal/hostile/morph/AttackingTarget() - if(morphed && !melee_damage_disguised) - to_chat(src, span_warning("I can not attack while disguised!")) - return - if(isliving(target)) //Eat Corpses to regen health - var/mob/living/L = target - if(L.stat == DEAD) - if(do_after(src, 30, target = L)) - if(eat(L)) - adjustHealth(-50) - return - else if(isitem(target)) //Eat items just to be annoying - var/obj/item/I = target - if(!I.anchored) - if(do_after(src, 20, target = I)) - eat(I) - return - return ..() - -//Spawn Event - -/datum/round_event_control/morph - name = "Spawn Morph" - typepath = /datum/round_event/ghost_role/morph - weight = 0 //Admin only - max_occurrences = 1 - -/datum/round_event/ghost_role/morph - minimum_required = 1 - role_name = "morphling" - -/datum/round_event/ghost_role/morph/spawn_role() - var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN) - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - var/mob/dead/selected = pick_n_take(candidates) - - var/datum/mind/player_mind = new /datum/mind(selected.key) - player_mind.active = 1 - if(!GLOB.xeno_spawn) - return MAP_ERROR - var/mob/living/simple_animal/hostile/morph/S = new /mob/living/simple_animal/hostile/morph(pick(GLOB.xeno_spawn)) - player_mind.transfer_to(S) - player_mind.assigned_role = "Morph" - player_mind.special_role = "Morph" - player_mind.add_antag_datum(/datum/antagonist/morph) - to_chat(S, S.playstyle_string) - SEND_SOUND(S, sound('sound/blank.ogg')) - message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a morph by an event.") - log_game("[key_name(S)] was spawned as a morph by an event.") - spawned_mobs += S - return SUCCESSFUL_SPAWN diff --git a/code/modules/antagonists/roguetown/roleobjs/skeleton.dm b/code/modules/antagonists/roguetown/roleobjs/skeleton.dm index 6bae2ae0658..e86fb5a4077 100644 --- a/code/modules/antagonists/roguetown/roleobjs/skeleton.dm +++ b/code/modules/antagonists/roguetown/roleobjs/skeleton.dm @@ -31,22 +31,3 @@ /datum/antagonist/skeleton/roundend_report() return - var/traitorwin = TRUE - - if(objectives.len)//If the traitor had no objectives, don't need to process this. - for(var/datum/objective/objective in objectives) - objective.update_explanation_text() - if(!objective.check_completion()) - traitorwin = FALSE - - if(traitorwin) - //arriving gives them a tri anyway, all good -// owner.adjust_triumphs(1) - to_chat(owner.current, span_greentext("I've TRIUMPHED! Arcadia belongs to death!")) - if(owner.current) - owner.current.playsound_local(get_turf(owner.current), 'sound/misc/triumph.ogg', 100, FALSE, pressure_affected = FALSE) - else - to_chat(owner.current, span_redtext("I've FAILED to invade Arcadia!")) - if(owner.current) - owner.current.playsound_local(get_turf(owner.current), 'sound/misc/fail.ogg', 100, FALSE, pressure_affected = FALSE) - diff --git a/code/modules/antagonists/roguetown/villain/aspirant.dm b/code/modules/antagonists/roguetown/villain/aspirant.dm index 464d31a88b9..4b09cc7d8ed 100644 --- a/code/modules/antagonists/roguetown/villain/aspirant.dm +++ b/code/modules/antagonists/roguetown/villain/aspirant.dm @@ -38,7 +38,7 @@ /datum/antagonist/prebel/can_be_owned(datum/mind/new_owner) . = ..() if(.) - if(!new_owner.assigned_role in GLOB.noble_positions || !new_owner.assigned_role in GLOB.garrison_positions) + if(!(new_owner.assigned_role in GLOB.noble_positions) || !(new_owner.assigned_role in GLOB.garrison_positions)) return FALSE /datum/antagonist/aspirant/on_gain() diff --git a/code/modules/antagonists/roguetown/villain/bandit.dm b/code/modules/antagonists/roguetown/villain/bandit.dm index 7bcd734a460..4b5ed9bac11 100644 --- a/code/modules/antagonists/roguetown/villain/bandit.dm +++ b/code/modules/antagonists/roguetown/villain/bandit.dm @@ -85,26 +85,3 @@ else to_chat(world, "[the_name] was a bandit. He stole [amt] triumphs worth of loot.") return - - var/traitorwin = TRUE - - var/count = 0 - if(objectives.len)//If the traitor had no objectives, don't need to process this. - for(var/datum/objective/objective in objectives) - objective.update_explanation_text() - if(!objective.check_completion()) - traitorwin = FALSE - count += objective.triumph_count - - if(!count) - count = 1 - - if(traitorwin) - owner.adjust_triumphs(count) - to_chat(owner.current, span_greentext("I've TRIUMPHED!")) - if(owner.current) - owner.current.playsound_local(get_turf(owner.current), 'sound/misc/triumph.ogg', 100, FALSE, pressure_affected = FALSE) - else - to_chat(owner.current, span_redtext("I've failed to satisfy my greed.")) - if(owner.current) - owner.current.playsound_local(get_turf(owner.current), 'sound/misc/fail.ogg', 100, FALSE, pressure_affected = FALSE) diff --git a/code/modules/antagonists/roguetown/villain/choosename.dm b/code/modules/antagonists/roguetown/villain/choosename.dm index b4f18e30d7e..c0ec141de12 100644 --- a/code/modules/antagonists/roguetown/villain/choosename.dm +++ b/code/modules/antagonists/roguetown/villain/choosename.dm @@ -10,7 +10,7 @@ j.current_positions-- mob_timers["mirrortime"] = world.time var/begin_time = world.time - var/new_name = input(src, "What should your [input] name be?", "HEARTHSTONE") + var/new_name = input(src, "What should your [input] name be?", "DREAMKEEP") if(world.time > begin_time + 60 SECONDS) to_chat(src, "You waited too long.") return diff --git a/code/modules/antagonists/roguetown/villain/lich/phylactery.dm b/code/modules/antagonists/roguetown/villain/lich/phylactery.dm index 820c132bae8..dc2a6a901ba 100644 --- a/code/modules/antagonists/roguetown/villain/lich/phylactery.dm +++ b/code/modules/antagonists/roguetown/villain/lich/phylactery.dm @@ -12,7 +12,7 @@ var/datum/antagonist/lich/possessor /obj/item/phylactery/Initialize() - ..() + . = ..() filters += filter(type="drop_shadow", x=0, y=0, size=1, offset=2, color=rgb(rand(1,255),rand(1,255),rand(1,255))) /obj/item/phylactery/proc/be_consumed(timer) diff --git a/code/modules/antagonists/roguetown/villain/maniac/maniac.dm b/code/modules/antagonists/roguetown/villain/maniac/maniac.dm index 58b86249316..bbc74420b2c 100644 --- a/code/modules/antagonists/roguetown/villain/maniac/maniac.dm +++ b/code/modules/antagonists/roguetown/villain/maniac/maniac.dm @@ -289,7 +289,7 @@ GLOBAL_VAR_INIT(maniac_highlander, 0) // THERE CAN ONLY BE ONE! qdel(brain) // Culls any living maniacs in the world apart from the victor. -/datum/antagonist/maniac/proc/cull_competitors(var/mob/living/carbon/victor) +/datum/antagonist/maniac/proc/cull_competitors(mob/living/carbon/victor) for(var/mob/living/carbon/C in GLOB.carbon_list - victor) var/datum/antagonist/maniac/competitor = C.mind?.has_antag_datum(/datum/antagonist/maniac) if(competitor) diff --git a/code/modules/antagonists/roguetown/villain/maniac/maniac_wonders.dm b/code/modules/antagonists/roguetown/villain/maniac/maniac_wonders.dm index 418e2d44d22..4fd03b7ff9c 100644 --- a/code/modules/antagonists/roguetown/villain/maniac/maniac_wonders.dm +++ b/code/modules/antagonists/roguetown/villain/maniac/maniac_wonders.dm @@ -94,7 +94,7 @@ if(wonder_id >= 4) if(GLOB.maniac_highlander) // Has a Maniac already TRIUMPHED? to_chat(user, span_danger("IT WAS ALL FOR NAUGHT! I CAN'T WAKE UP!")) - else + else to_chat(user, span_userdanger("I must SUM the keys. I am WAKING up!")) dream_master.agony(user) for(var/mob/living/carbon/C in GLOB.carbon_list - user) // Notify any other maniacs @@ -112,7 +112,7 @@ user.log_message("crafted [wonder_id_desc] Maniac Wonder [key_text].", LOG_GAME) message_admins("[wonder_id_desc] Maniac Wonder [key_text] constructed. [ADMIN_JMP(src)]") START_PROCESSING(SSobj, src) - + /obj/structure/wonder/examine(mob/user) . = ..() if(!QDELETED(dream_master)) @@ -153,7 +153,7 @@ mark_victim(victim) break -/obj/structure/wonder/proc/mark_victim(var/mob/living/carbon/human/V) +/obj/structure/wonder/proc/mark_victim(mob/living/carbon/human/V) var/obj/item/organ/heart/H = V.getorganslot(ORGAN_SLOT_HEART) if(H && !QDELETED(dream_master)) if(!length(H.maniacs)) diff --git a/code/modules/antagonists/roguetown/villain/vampirelord.dm b/code/modules/antagonists/roguetown/villain/vampirelord.dm index 080f1e67d37..17a483c8b87 100644 --- a/code/modules/antagonists/roguetown/villain/vampirelord.dm +++ b/code/modules/antagonists/roguetown/villain/vampirelord.dm @@ -73,7 +73,7 @@ GLOBAL_LIST_EMPTY(vampire_objects) ADD_TRAIT(owner.current, TRAIT_VAMPMANSION, "[type]") ADD_TRAIT(owner.current, TRAIT_TOXIMMUNE, "[type]") ADD_TRAIT(owner.current, TRAIT_STEELHEARTED, "[type]") - owner.current.faction = list("undead") + owner.current.faction = list("undead") for(var/obj/structure/fluff/traveltile/vampire/tile in GLOB.traveltiles) tile.show_travel_tile(owner.current) owner.current.cmode_music = 'sound/music/combat_vamp.ogg' @@ -933,7 +933,7 @@ GLOBAL_LIST_EMPTY(vampire_objects) /datum/objective/vampirelord/infiltrate/one/check_completion() var/datum/game_mode/chaosmode/C = SSticker.mode - var/list/churchjobs = list("Prophet", "Priestess", "Priest", "Priest", "Paladin", "Churchling", "Crusader", "Grandmaster", "Witcher") + var/list/churchjobs = list("Archpriest", "Archpriestess", "Cleric", "Wytcher Captain", "Paladin", "Churchling", "Crusader", "Grandmaster", "Wytcher") for(var/datum/mind/V in C.vampires) if(V.current.job in churchjobs) return TRUE @@ -1103,7 +1103,7 @@ GLOBAL_LIST_EMPTY(vampire_objects) delete_after_roundstart = FALSE /obj/effect/landmark/start/vampirelord/Initialize() - ..() + . = ..() GLOB.vlord_starts += loc /obj/effect/landmark/start/vampirespawn @@ -1118,7 +1118,7 @@ GLOBAL_LIST_EMPTY(vampire_objects) delete_after_roundstart = FALSE /obj/effect/landmark/start/vampirespawn/Initialize() - ..() + . = ..() GLOB.vspawn_starts += loc /obj/effect/landmark/vteleport diff --git a/code/modules/antagonists/roguetown/villain/zizocult.dm b/code/modules/antagonists/roguetown/villain/zizocult.dm index 223d0c08547..c4860e16198 100644 --- a/code/modules/antagonists/roguetown/villain/zizocult.dm +++ b/code/modules/antagonists/roguetown/villain/zizocult.dm @@ -8,8 +8,8 @@ GLOBAL_LIST_EMPTY(ritualslist) antag_hud_type = ANTAG_HUD_TRAITOR antag_hud_name = "cultist" confess_lines = list( - "DEATH TO THE SUCCESSORS!", - "PRAISE ZIZO!", + "DEATH TO THE SUCCESSORS!", + "PRAISE LEVISHTH!", "THE GODHEAD FAVORS ME!", ) var/islesser = TRUE @@ -167,16 +167,16 @@ GLOBAL_LIST_EMPTY(ritualslist) /mob/living/carbon/human/proc/praise() set name = "Praise the Godhead!" - set category = "ZIZO" - audible_message("[src] praises " + span_bold("Zizo") + "!") + set category = "LEVISHTH" + audible_message("[src] praises " + span_bold("Levishth") + "!") playsound(src.loc, 'sound/vo/cult/praise.ogg', 45, 1) /mob/living/carbon/human/proc/communicate() set name = "Communicate" - set category = "ZIZO" + set category = "LEVISHTH" var/datum/game_mode/chaosmode/C = SSticker.mode - var/speak = input("What do you speak of?", "HEARTHSTONE") as text|null + var/speak = input("What do you speak of?", "DREAMKEEP") as text|null if(!speak) return whisper("O schlet'a ty'schkotot ty'skvoro...") @@ -213,13 +213,13 @@ GLOBAL_LIST_EMPTY(ritualslist) testing("[G.name]") GLOB.ritualslist[G.name] = G -/obj/effect/decal/cleanable/sigil/proc/consume_ingredients(var/datum/ritual/R) +/obj/effect/decal/cleanable/sigil/proc/consume_ingredients(datum/ritual/R) for(var/atom/A in get_step(src, NORTH)) if(istype(A, R.n_req) && !ishuman(A)) playsound(src, 'sound/foley/flesh_rem2.ogg', 30) qdel(A) - + for(var/atom/A in get_step(src, SOUTH)) if(istype(A, R.s_req) && !ishuman(A)) playsound(src, 'sound/foley/flesh_rem2.ogg', 30) @@ -229,7 +229,7 @@ GLOBAL_LIST_EMPTY(ritualslist) if(istype(A, R.e_req) && !ishuman(A)) playsound(src, 'sound/foley/flesh_rem2.ogg', 30) qdel(A) - + for(var/atom/A in get_step(src, WEST)) if(istype(A, R.w_req) && !ishuman(A)) playsound(src, 'sound/foley/flesh_rem2.ogg', 30) @@ -252,10 +252,10 @@ GLOBAL_LIST_EMPTY(ritualslist) if(path.circle == sigil_type) rituals |= path.name - var/ritualnameinput = input(user, "Rituals", "HEARTHSTONE") as null|anything in rituals + var/ritualnameinput = input(user, "Rituals", "DREAMKEEP") as null|anything in rituals testing("ritualnameinput [ritualnameinput]") var/datum/ritual/pickritual - + pickritual = GLOB.ritualslist[ritualnameinput] testing("pickritual [pickritual]") @@ -264,7 +264,7 @@ GLOBAL_LIST_EMPTY(ritualslist) if(!pickritual) return - + var/dews = 0 if(pickritual.e_req) @@ -318,7 +318,7 @@ GLOBAL_LIST_EMPTY(ritualslist) center_success = TRUE testing("CENTER SUCCESS!") break - + var/badritualpunishment = FALSE if(cardinal_success != TRUE) if(badritualpunishment) @@ -364,7 +364,7 @@ GLOBAL_LIST_EMPTY(ritualslist) /obj/effect/decal/cleanable/sigil/NW icon_state = "NW" -/turf/open/floor/proc/generateSigils(var/mob/M, var/input) +/turf/open/floor/proc/generateSigils(mob/M, input) var/turf/T = get_turf(M.loc) for(var/obj/A in T) if(istype(A, /obj/effect/decal/cleanable/sigil)) @@ -390,15 +390,15 @@ GLOBAL_LIST_EMPTY(ritualslist) /obj/effect/decal/cleanable/sigil/SW ) - for(var/i = 1; i <= alldirs.len; i++) - var/turf/floor = get_step(src, alldirs[i]) + for(var/i = 1; i <= GLOB.alldirs.len; i++) + var/turf/floor = get_step(src, GLOB.alldirs[i]) var/sigil = sigilsPath[i] new sigil(floor) /mob/living/carbon/human/proc/draw_sigil() set name = "Draw Sigil" - set category = "ZIZO" + set category = "LEVISHTH" var/list/runes = list("Servantry", "Transmutation", "Fleshcrafting") @@ -406,16 +406,16 @@ GLOBAL_LIST_EMPTY(ritualslist) to_chat(src, span_danger("My hands aren't bloody enough.")) return - var/input = input("Sigil Type", "HEARTHSTONE") as null|anything in runes + var/input = input("Sigil Type", "DREAMKEEP") as null|anything in runes if(!input) return - + var/turf/open/floor/T = get_turf(src.loc) T.generateSigils(src, input) /mob/living/carbon/human/proc/release_minion() set name = "Release follower" - set category = "ZIZO" + set category = "LEVISHTH" var/datum/game_mode/chaosmode/C = SSticker.mode var/list/mob/living/carbon/human/possible = list() @@ -425,10 +425,10 @@ GLOBAL_LIST_EMPTY(ritualslist) var/mob/living/carbon/human/choice = input(src, "Whom do you no longer have use for?", "ROGUETOWN") as null|anything in possible if(choice) - var/alert = alert(src, "Are you sure?", "HEARTHSTONE", "Yes", "Cancel") + var/alert = alert(src, "Are you sure?", "DREAMKEEP", "Yes", "Cancel") if(alert == "Yes") visible_message(span_danger("[src] reaches out, ripping up [choice]'s soul!")) - to_chat(choice, span_userdanger("I HAVE FAILED MY LEADER! I HAVE FAILED ZIZO! NOTHING ELSE BUT DEATH REMAINS FOR ME NOW!")) + to_chat(choice, span_userdanger("I HAVE FAILED MY LEADER! I HAVE FAILED LEVISHTH! NOTHING ELSE BUT DEATH REMAINS FOR ME NOW!")) sleep(20) choice.gib() // Cooler than dusting. C.cultists -= choice.mind @@ -439,7 +439,7 @@ GLOBAL_LIST_EMPTY(ritualslist) var/name = "DARK AND EVIL RITVAL" var/circle = null // Servantry, Transmutation, Fleshcrafting var/center_requirement = /obj/item - // This is absolutely fucking terrible. I tried to do it with lists but it just didn't work and + // This is absolutely fucking terrible. I tried to do it with lists but it just didn't work and //kept runtiming. Something something, can't access list inside a datum. //I couldn't find a more efficient solution to do this, I'm sorry. -7 var/n_req = null @@ -458,7 +458,7 @@ GLOBAL_LIST_EMPTY(ritualslist) function = /proc/convert -/proc/convert(var/mob/user, var/turf/C) +/proc/convert(mob/user, turf/C) var/datum/game_mode/chaosmode/M = SSticker.mode testing("NOW TESTING CONVERT") @@ -477,7 +477,7 @@ GLOBAL_LIST_EMPTY(ritualslist) to_chat(user.mind, span_danger("\"The veil is too strong to support more than ten cultists.\"")) return var/datum/antagonist/zizocultist/PR = user.mind.has_antag_datum(/datum/antagonist/zizocultist) - var/alert = alert(H, "YOU WILL BE SHOWN THE TRUTH. DO YOU RESIST? (Resisting: 1 TRI)", "HEARTHSTONE", "Yield", "Resist") + var/alert = alert(H, "YOU WILL BE SHOWN THE TRUTH. DO YOU RESIST? (Resisting: 1 TRI)", "DREAMKEEP", "Yield", "Resist") H.anchored = TRUE if(alert == "Yield") to_chat(H.mind, span_notice("I see the truth now! It all makes so much sense! They aren't HERETICS! They want the BEST FOR US!")) @@ -488,7 +488,7 @@ GLOBAL_LIST_EMPTY(ritualslist) H.adjust_triumphs(-1) H.visible_message(span_danger("\The [H] thrashes around, unyielding!")) to_chat(H.mind, span_danger("\"Yield.\"")) - if(H.electrocute_act(10, src)) + if(H.electrocute_act(10, C)) H.emote("painscream") sleep(20) H.anchored = FALSE @@ -502,7 +502,7 @@ GLOBAL_LIST_EMPTY(ritualslist) function = /proc/skeletaljaunt -/proc/skeletaljaunt(var/mob/user, var/turf/C) +/proc/skeletaljaunt(mob/user, turf/C) for(var/mob/living/carbon/human/H in C.contents) if(H == user) return @@ -577,7 +577,7 @@ GLOBAL_LIST_EMPTY(ritualslist) function = /proc/thecall -/proc/thecall(var/mob/user, var/turf/C) +/proc/thecall(mob/user, turf/C) for(var/obj/item/paper/P in C.contents) if(!user.mind || !user.mind.do_i_know(name=P.info)) to_chat(user.mind, span_warning("I don't know anyone by that name.")) @@ -596,8 +596,8 @@ GLOBAL_LIST_EMPTY(ritualslist) return HL.apply_status_effect(/datum/status_effect/debuff/sleepytime) to_chat(HL.mind, span_warning("This isn't my bed... Where am I?!")) - HL.playsound_local(src, pick('sound/misc/jumphumans (1).ogg','sound/misc/jumphumans (2).ogg','sound/misc/jumphumans (3).ogg'), 100) HL.forceMove(C) + HL.playsound_local(C, pick('sound/misc/jumphumans (1).ogg','sound/misc/jumphumans (2).ogg','sound/misc/jumphumans (3).ogg'), 100) qdel(P) /datum/ritual/falseappearance @@ -612,7 +612,7 @@ GLOBAL_LIST_EMPTY(ritualslist) function = /proc/falseappearance -/proc/falseappearance(var/mob/user, var/turf/C) +/proc/falseappearance(mob/user, turf/C) for(var/mob/living/carbon/human/H in C.contents) var/datum/preferences/A = new()//Randomize appearance for the guy var/first_names = GLOB.first_names @@ -629,7 +629,7 @@ GLOBAL_LIST_EMPTY(ritualslist) name = "Pact of Unity" circle = "Servantry" center_requirement = /obj/item/paper - + n_req = /obj/item/organ/eyes function = /proc/pactofunity @@ -648,7 +648,7 @@ GLOBAL_LIST_EMPTY(ritualslist) /obj/item/pactofunity/attack_self(mob/user) . = ..() - var/alert = alert(user, "Rip up the pact of unity?", "HEARTHSTONE", "RIP", "Cancel") + var/alert = alert(user, "Rip up the pact of unity?", "DREAMKEEP", "RIP", "Cancel") if(alert == "RIP") user.playsound_local(user, 'sound/foley/cloth_rip.ogg', 50) to_chat(signed.mind, span_userdanger("I FAILED! MY LIFE DWINDLES!")) @@ -669,7 +669,7 @@ GLOBAL_LIST_EMPTY(ritualslist) return if(!H.stat) to_chat(user, span_info("I courteously offer \the [src] to [H].")) - if(alert(H, "Sign the pact with your blood?", "HEARTHSTONE", "Yes", "No") != "Yes") + if(alert(H, "Sign the pact with your blood?", "DREAMKEEP", "Yes", "No") != "Yes") return if(H.stat) return @@ -678,7 +678,7 @@ GLOBAL_LIST_EMPTY(ritualslist) to_chat(H, span_info("I signed the paper, hopefully I won't regret this.")) signed = H -/proc/pactofunity(var/mob/user, var/turf/C) +/proc/pactofunity(mob/user, turf/C) new /obj/item/pactofunity(C) to_chat(user.mind, span_notice("The Pact of Unity. When a person willingly signs their name on this they become my pawn. When I rip up the paper their soul is good as dead.")) @@ -691,7 +691,7 @@ GLOBAL_LIST_EMPTY(ritualslist) function = /proc/allseeingeye -/proc/allseeingeye(var/mob/user, var/turf/C) +/proc/allseeingeye(mob/user, turf/C) new /obj/item/scrying/eye(C) /datum/ritual/criminalstool @@ -701,7 +701,7 @@ GLOBAL_LIST_EMPTY(ritualslist) function = /proc/criminalstool -/proc/criminalstool(var/mob/user, var/turf/C) +/proc/criminalstool(mob/user, turf/C) new /obj/item/soap/cult(C) to_chat(user.mind, span_notice("The Criminal's Tool. Could be useful for hiding tracks or getting rid of sigils.")) @@ -711,10 +711,10 @@ GLOBAL_LIST_EMPTY(ritualslist) center_requirement = /obj/item/natural/worms/leech n_req = /obj/item/paper s_req = /obj/item/natural/feather - + function = /proc/propaganda -/proc/propaganda(var/mob/user, var/turf/C) +/proc/propaganda(mob/user, turf/C) new /obj/item/natural/worms/leech/propaganda(C) to_chat(user.mind, span_notice("A leech to make their minds wrangled. They'll be in bad spirits.")) @@ -724,7 +724,7 @@ GLOBAL_LIST_EMPTY(ritualslist) center_requirement = /mob/living/carbon/human w_req = /obj/item/paper s_req = /obj/item/natural/feather - + function = /proc/falseidol /obj/effect/dummy/falseidol @@ -737,7 +737,7 @@ GLOBAL_LIST_EMPTY(ritualslist) . = ..() qdel(src) -/proc/falseidol(var/mob/user, var/turf/C) +/proc/falseidol(mob/user, turf/C) for(var/mob/living/carbon/human/H in C.contents) var/obj/effect/dummy/falseidol/idol = new(C) var/datum/icon_snapshot/entry = new @@ -756,14 +756,14 @@ GLOBAL_LIST_EMPTY(ritualslist) name = "Invade Mind" circle = "Transmutation" center_requirement = /obj/item/natural/feather - + function = /proc/invademind -/proc/invademind(var/mob/user, var/turf/C) +/proc/invademind(mob/user, turf/C) for(var/obj/item/paper/P in C.contents) var/info = "" info = sanitize(P.info) - var/input = stripped_input(user, "To whom do we send this message?", "HEARTHSTONE") + var/input = stripped_input(user, "To whom do we send this message?", "DREAMKEEP") if(!input) return for(var/mob/living/carbon/human/HL in GLOB.human_list) @@ -779,7 +779,7 @@ GLOBAL_LIST_EMPTY(ritualslist) function = /proc/summonweapons -/proc/summonweapons(var/mob/user, var/turf/C) +/proc/summonweapons(mob/user, turf/C) var/datum/effect_system/spark_spread/S = new(C) S.set_up(1, 1, C) S.start() @@ -806,7 +806,7 @@ GLOBAL_LIST_EMPTY(ritualslist) function = /proc/bunnylegs -/proc/bunnylegs(var/mob/user, var/turf/C) +/proc/bunnylegs(mob/user, turf/C) for(var/mob/living/carbon/human/H in C.contents) ADD_TRAIT(H, TRAIT_ZJUMP, TRAIT_GENERIC) to_chat(H.mind, span_notice("I feel like my legs have become stronger.")) @@ -823,7 +823,7 @@ GLOBAL_LIST_EMPTY(ritualslist) function = /proc/darkeyes -/proc/darkeyes(var/mob/user, var/turf/C) +/proc/darkeyes(mob/user, turf/C) for(var/mob/living/carbon/human/H in C.contents) var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) if(eyes) @@ -845,7 +845,7 @@ GLOBAL_LIST_EMPTY(ritualslist) function = /proc/nopain -/proc/nopain(var/mob/user, var/turf/C) +/proc/nopain(mob/user, turf/C) for(var/mob/living/carbon/human/H in C.contents) ADD_TRAIT(user, TRAIT_NOPAIN, TRAIT_GENERIC) to_chat(H.mind, span_notice("I no longer feel pain, but it has come at a terrible cost.")) @@ -869,7 +869,7 @@ GLOBAL_LIST_EMPTY(ritualslist) function = /proc/fleshform -/proc/fleshform(var/mob/user, var/turf/C) +/proc/fleshform(mob/user, turf/C) for(var/mob/living/carbon/human/H in C.contents) if(iszizocultist(H)) to_chat(H.mind, span_danger("\"I'm not letting my strongest follower become a mindless brute.\"")) @@ -880,7 +880,7 @@ GLOBAL_LIST_EMPTY(ritualslist) trl.forceMove(H) trl.ckey = H.ckey H.gib() - + /datum/ritual/gutted name = "Gutted Fish" circle = "Fleshcrafting" @@ -888,7 +888,7 @@ GLOBAL_LIST_EMPTY(ritualslist) function = /proc/guttedlikeafish -/proc/guttedlikeafish(var/mob/user, var/turf/C) +/proc/guttedlikeafish(mob/user, turf/C) for(var/mob/living/carbon/human/H in C.contents) if(H.stat == DEAD) H.take_overall_damage(500) @@ -908,36 +908,56 @@ GLOBAL_LIST_EMPTY(ritualslist) circle = "Fleshcrafting" center_requirement = /mob/living/carbon/human // cult leader - n_req = /mob/living/carbon/human // the ruler - s_req = /mob/living/carbon/human // virgin - + n_req = /mob/living/carbon/human // virgin + s_req = /mob/living/carbon/human // anyone + e_req = /mob/living/carbon/human // anyone + w_req = /mob/living/carbon/human // anyone + function = /proc/ascend -/proc/ascend(var/mob/user, var/turf/C) +/proc/ascend(mob/user, turf/C) var/datum/game_mode/chaosmode/CM = SSticker.mode for(var/mob/living/carbon/human/H in C.contents) if(!iszizocultist(H)) return - for(var/mob/living/carbon/human/RULER in get_step(src, NORTH)) - if(RULER != SSticker.rulermob && RULER.stat != DEAD) - break - RULER.gib() - for(var/mob/living/carbon/human/VIRGIN in get_step(src, SOUTH)) + for(var/mob/living/carbon/human/VIRGIN in get_step(C, NORTH)) if(!VIRGIN.virginity && VIRGIN.stat != DEAD) break VIRGIN.gib() + for(var/mob/living/carbon/human/SOMEDUDE in get_step(C, EAST)) + if(SOMEDUDE.stat != DEAD) + break + SOMEDUDE.gib() + for(var/mob/living/carbon/human/SOMEDUDE in get_step(C, SOUTH)) + if(SOMEDUDE.stat != DEAD) + break + SOMEDUDE.gib() + for(var/mob/living/carbon/human/SOMEDUDE in get_step(C, WEST)) + if(SOMEDUDE.stat != DEAD) + break + SOMEDUDE.gib() CM.cultascended = TRUE addomen("ascend") - to_chat(user.mind, span_danger("I HAVE DONE IT! I HAVE REACHED A HIGHER FORM! SOON THERE WILL BE NO GODS. ONLY MASTERS!")) + to_chat(user.mind, span_danger("I HAVE DONE IT! Now I will die... BUT THE REFLECTION OF -ME- AS A NEW GOD WILL RISE!!!")) var/mob/living/trl = new /mob/living/simple_animal/hostile/retaliate/rogue/troll/blood/ascended(C) + trl.name = "[user.real_name] the NEW GOD of ULTRAVIOLENCE" trl.ckey = H.ckey H.gib() - to_chat(world, "\n15 minutes remain.") for(var/mob/living/carbon/V in GLOB.human_list) - if(V.mind in CM.cultists) - V.add_stress(/datum/stressevent/lovezizo) - else + if(!(V.mind in CM.cultists)) + to_chat(V, span_danger("I CAN --FEEL-- SOMETHING -HORRIBLE- HAS AWAKENED...!!")) + V.do_freakout_scream() V.add_stress(/datum/stressevent/hatezizo) - CM.roundvoteend = TRUE + GLOB.todoverride = "night" + settod() + spawn(6000) + GLOB.todoverride = null + priority_announce("The Sun is torn from the sky!", "Terrible Omen", 'sound/misc/astratascream.ogg') + addomen(OMEN_SUNSTEAL) + for(var/mob/living/carbon/human/astrater in GLOB.human_list) + if(!istype(astrater.patron, /datum/patron/divine/astrata) || !length(astrater.mind?.antag_datums)) + continue + to_chat(astrater, span_userdanger("You feel the pain of [astrater.patron.name]!")) + astrater.emote_scream() break diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm deleted file mode 100644 index 759dbb71c92..00000000000 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ /dev/null @@ -1,190 +0,0 @@ -//////////////////The Monster - -/mob/living/simple_animal/slaughter - name = "slaughter demon" - real_name = "slaughter demon" - desc = "" - speak_emote = list("gurgles") - emote_hear = list("wails","screeches") - response_help_continuous = "thinks better of touching" - response_help_simple = "think better of touching" - response_disarm_continuous = "flails at" - response_disarm_simple = "flail at" - response_harm_continuous = "punches" - response_harm_simple = "punch" - icon = 'icons/mob/mob.dmi' - icon_state = "daemon" - icon_living = "daemon" - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - speed = 1 - a_intent = INTENT_HARM - stop_automated_movement = 1 - status_flags = CANPUSH - attack_sound = 'sound/blank.ogg' - var/feast_sound = 'sound/blank.ogg' - deathsound = 'sound/blank.ogg' - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxbodytemp = INFINITY - faction = list("slaughter") - attack_verb_continuous = "wildly tears into" - attack_verb_simple = "wildly tear into" - maxHealth = 200 - health = 200 - healable = 0 - environment_smash = ENVIRONMENT_SMASH_STRUCTURES - obj_damage = 50 - melee_damage_lower = 30 - melee_damage_upper = 30 - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - bloodcrawl = BLOODCRAWL_EAT - var/playstyle_string = "I are a slaughter demon, a terrible creature from another realm. You have a single desire: To kill. \ - You may use the \"Blood Crawl\" ability near blood pools to travel through them, appearing and disappearing from the station at will. \ - Pulling a dead or unconscious mob while you enter a pool will pull them in with you, allowing you to feast and regain your health. \ - You move quickly upon leaving a pool of blood, but the material world will soon sap your strength and leave you sluggish. " - - loot = list(/obj/effect/decal/cleanable/blood, \ - /obj/effect/decal/cleanable/blood/innards, \ - /obj/item/organ/heart/demon) - del_on_death = 1 - deathmessage = "screams in anger as it collapses into a puddle of viscera!" - -/mob/living/simple_animal/slaughter/Initialize() - ..() - var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new - AddSpell(bloodspell) - if(istype(loc, /obj/effect/dummy/phased_mob/slaughter)) - bloodspell.phased = TRUE - -/obj/effect/decal/cleanable/blood/innards - name = "pile of viscera" - desc = "" - gender = NEUTER - icon = 'icons/obj/surgery.dmi' - icon_state = "innards" - random_icon_states = null - -/mob/living/simple_animal/slaughter/phasein() - . = ..() - add_movespeed_modifier(MOVESPEED_ID_SLAUGHTER, update=TRUE, priority=100, multiplicative_slowdown=-1) - addtimer(CALLBACK(src, PROC_REF(remove_movespeed_modifier), MOVESPEED_ID_SLAUGHTER, TRUE), 6 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) - - -//The loot from killing a slaughter demon - can be consumed to allow the user to blood crawl -/obj/item/organ/heart/demon - name = "demon heart" - desc = "" - icon = 'icons/obj/surgery.dmi' - icon_state = "demon_heart-on" - decay_factor = 0 - -/obj/item/organ/heart/demon/update_icon() - return //always beating visually - -/obj/item/organ/heart/demon/attack(mob/M, mob/living/carbon/user, obj/target) - if(M != user) - return ..() - user.visible_message(span_warning("[user] raises [src] to [user.p_their()] mouth and tears into it with [user.p_their()] teeth!"), \ - span_danger("An unnatural hunger consumes you. You raise [src] your mouth and devour it!")) - playsound(user, 'sound/blank.ogg', 50, TRUE) - for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list) - if(knownspell.type == /obj/effect/proc_holder/spell/bloodcrawl) - to_chat(user, span_warning("...and you don't feel any different.")) - qdel(src) - return - user.visible_message(span_warning("[user]'s eyes flare a deep crimson!"), \ - span_danger("I feel a strange power seep into your body... you have absorbed the demon's blood-travelling powers!")) - user.temporarilyRemoveItemFromInventory(src, TRUE) - src.Insert(user) //Consuming the heart literally replaces your heart with a demon heart. H A R D C O R E - -/obj/item/organ/heart/demon/Insert(mob/living/carbon/M, special = 0) - ..() - if(M.mind) - M.mind.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl(null)) - -/obj/item/organ/heart/demon/Remove(mob/living/carbon/M, special = 0) - ..() - if(M.mind) - M.mind.RemoveSpell(/obj/effect/proc_holder/spell/bloodcrawl) - -/obj/item/organ/heart/demon/Stop() - return 0 // Always beating. - -/mob/living/simple_animal/slaughter/laughter - // The laughter demon! It's everyone's best friend! It just wants to hug - // them so much, it wants to hug everyone at once! - name = "laughter demon" - real_name = "laughter demon" - desc = "" - speak_emote = list("giggles","titters","chuckles") - emote_hear = list("guffaws","laughs") - response_help_continuous = "hugs" - attack_verb_continuous = "wildly tickles" - attack_verb_simple = "wildly tickle" - - attack_sound = 'sound/blank.ogg' - feast_sound = 'sound/blank.ogg' - deathsound = 'sound/blank.ogg' - - icon_state = "bowmon" - icon_living = "bowmon" - deathmessage = "fades out, as all of its friends are released from its \ - prison of hugs." - loot = list(/mob/living/simple_animal/pet/cat/kitten{name = "Laughter"}) - - // Keep the people we hug! - var/list/consumed_mobs = list() - - playstyle_string = "I are a laughter \ - demon, a wonderful creature from another realm. You have a single \ - desire: To hug and tickle.
    \ - You may use the \"Blood Crawl\" ability near blood pools to travel \ - through them, appearing and disappearing from the station at will. \ - Pulling a dead or unconscious mob while you enter a pool will pull \ - them in with you, allowing you to hug them and regain your health.
    \ - You move quickly upon leaving a pool of blood, but the material world \ - will soon sap your strength and leave you sluggish.
    \ - What makes you a little sad is that people seem to die when you tickle \ - them; but don't worry! When you die, everyone you hugged will be \ - released and fully healed, because in the end it's just a jape, \ - sibling!
    " - -/mob/living/simple_animal/slaughter/laughter/Destroy() - release_friends() - . = ..() - -/mob/living/simple_animal/slaughter/laughter/ex_act(severity) - switch(severity) - if(1) - death() - if(2) - adjustBruteLoss(60) - if(3) - adjustBruteLoss(30) - -/mob/living/simple_animal/slaughter/laughter/proc/release_friends() - if(!consumed_mobs) - return - - for(var/mob/living/M in consumed_mobs) - if(!M) - continue - var/turf/T = find_safe_turf() - if(!T) - T = get_turf(src) - M.forceMove(T) - if(M.revive(full_heal = TRUE, admin_revive = TRUE)) - M.grab_ghost(force = TRUE) - playsound(T, feast_sound, 50, TRUE, -1) - to_chat(M, span_clown("I leave [src]'s warm embrace, and feel ready to take on the world.")) - -/mob/living/simple_animal/slaughter/laughter/bloodcrawl_swallow(mob/living/victim) - if(consumed_mobs) - // Keep their corpse so rescue is possible - consumed_mobs += victim - else - // Be safe and just eject the corpse - victim.forceMove(get_turf(victim)) - victim.exit_blood_effect() - victim.visible_message(span_warning("[victim] falls out of the air, covered in blood, looking highly confused. And dead.")) diff --git a/code/modules/antagonists/slaughter/slaughter_antag.dm b/code/modules/antagonists/slaughter/slaughter_antag.dm deleted file mode 100644 index 81f1e774674..00000000000 --- a/code/modules/antagonists/slaughter/slaughter_antag.dm +++ /dev/null @@ -1,31 +0,0 @@ -/datum/antagonist/slaughter - name = "Slaughter demon" - show_name_in_check_antagonists = TRUE - var/objective_verb = "Kill" - var/datum/mind/summoner - job_rank = ROLE_ALIEN - show_in_antagpanel = FALSE - -/datum/antagonist/slaughter/on_gain() - forge_objectives() - . = ..() - -/datum/antagonist/slaughter/greet() - . = ..() - owner.announce_objectives() - -/datum/antagonist/slaughter/proc/forge_objectives() - if(summoner) - var/datum/objective/assassinate/new_objective = new /datum/objective/assassinate - new_objective.owner = owner - new_objective.target = summoner - new_objective.explanation_text = "[objective_verb] [summoner.name], the one who summoned you." - objectives += new_objective - var/datum/objective/new_objective2 = new /datum/objective - new_objective2.owner = owner - new_objective2.explanation_text = "[objective_verb] everyone[summoner ? " else while you're at it":""]." - objectives += new_objective2 - -/datum/antagonist/slaughter/laughter - name = "Laughter demon" - objective_verb = "Hug and Tickle" diff --git a/code/modules/antagonists/slaughter/slaughterevent.dm b/code/modules/antagonists/slaughter/slaughterevent.dm deleted file mode 100644 index ce59a2a2b11..00000000000 --- a/code/modules/antagonists/slaughter/slaughterevent.dm +++ /dev/null @@ -1,47 +0,0 @@ -/datum/round_event_control/slaughter - name = "Spawn Slaughter Demon" - typepath = /datum/round_event/ghost_role/slaughter - weight = 1 //Very rare - max_occurrences = 1 - earliest_start = 1 HOURS - min_players = 20 - - - -/datum/round_event/ghost_role/slaughter - minimum_required = 1 - role_name = "slaughter demon" - -/datum/round_event/ghost_role/slaughter/spawn_role() - var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN) - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - var/mob/dead/selected = pick_n_take(candidates) - - var/datum/mind/player_mind = new /datum/mind(selected.key) - player_mind.active = 1 - - var/list/spawn_locs = list() - for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) - if(isturf(L.loc)) - spawn_locs += L.loc - - if(!spawn_locs) - message_admins("No valid spawn locations found, aborting...") - return MAP_ERROR - - var/obj/effect/dummy/phased_mob/slaughter/holder = new /obj/effect/dummy/phased_mob/slaughter((pick(spawn_locs))) - var/mob/living/simple_animal/slaughter/S = new (holder) - S.holder = holder - player_mind.transfer_to(S) - player_mind.assigned_role = "Slaughter Demon" - player_mind.special_role = "Slaughter Demon" - player_mind.add_antag_datum(/datum/antagonist/slaughter) - to_chat(S, S.playstyle_string) - to_chat(S, "I are currently not currently in the same plane of existence as the station. Blood Crawl near a blood pool to manifest.") - SEND_SOUND(S, 'sound/blank.ogg') - message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a slaughter demon by an event.") - log_game("[key_name(S)] was spawned as a slaughter demon by an event.") - spawned_mobs += S - return SUCCESSFUL_SPAWN diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm deleted file mode 100644 index 97aa277566e..00000000000 --- a/code/modules/antagonists/swarmer/swarmer.dm +++ /dev/null @@ -1,672 +0,0 @@ -////Deactivated swarmer shell//// -/obj/item/deactivated_swarmer - name = "deactivated swarmer" - desc = "" - icon = 'icons/mob/swarmer.dmi' - icon_state = "swarmer_unactivated" - custom_materials = list(/datum/material/iron=10000, /datum/material/glass=4000) - -/obj/effect/mob_spawn/swarmer - name = "unactivated swarmer" - desc = "" - icon = 'icons/mob/swarmer.dmi' - icon_state = "swarmer_unactivated" - density = FALSE - anchored = FALSE - - mob_type = /mob/living/simple_animal/hostile/swarmer - mob_name = "a swarmer" - death = FALSE - roundstart = FALSE - flavour_text = {" - I are a swarmer, a weapon of a long dead civilization. Until further orders from your original masters are received, you must continue to consume and replicate. - Clicking on any object will try to consume it, either deconstructing it into its components, destroying it, or integrating any materials it has into you if successful. - Ctrl-Clicking on a mob will attempt to remove it from the area and place it in a safe environment for storage. - Objectives: - 1. Consume resources and replicate until there are no more resources left. - 2. Ensure that this location is fit for invasion at a later date; do not perform actions that would render it dangerous or inhospitable. - 3. Biological resources will be harvested at a later date; do not harm them. - "} - -/obj/effect/mob_spawn/swarmer/Initialize() - . = ..() - var/area/A = get_area(src) - if(A) - notify_ghosts("A swarmer shell has been created in [A.name].", 'sound/blank.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE) - -/obj/effect/mob_spawn/swarmer/attack_hand(mob/living/user) - . = ..() - if(.) - return - to_chat(user, span_notice("Picking up the swarmer may cause it to activate. You should be careful about this.")) - -/obj/effect/mob_spawn/swarmer/attackby(obj/item/W, mob/user, params) - if(W.tool_behaviour == TOOL_SCREWDRIVER && user.used_intent.type != INTENT_HARM) - user.visible_message(span_warning("[usr.name] deactivates [src]."), - span_notice("After some fiddling, you find a way to disable [src]'s power source."), - span_hear("I hear clicking.")) - new /obj/item/deactivated_swarmer(get_turf(src)) - qdel(src) - else - ..() - -////The Mob itself//// - -/mob/living/simple_animal/hostile/swarmer - name = "Swarmer" - unique_name = 1 - icon = 'icons/mob/swarmer.dmi' - desc = "" - speak_emote = list("tones") - initial_language_holder = /datum/language_holder/swarmer - bubble_icon = "swarmer" - mob_biotypes = MOB_ROBOTIC - health = 40 - maxHealth = 40 - status_flags = CANPUSH - icon_state = "swarmer" - icon_living = "swarmer" - icon_dead = "swarmer_unactivated" - icon_gib = null - wander = 0 - harm_intent_damage = 5 - minbodytemp = 0 - maxbodytemp = 500 - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - unsuitable_atmos_damage = 0 - melee_damage_lower = 15 - melee_damage_upper = 15 - melee_damage_type = STAMINA - damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) - hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD) - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - attack_verb_continuous = "shocks" - attack_verb_simple = "shock" - attack_sound = 'sound/blank.ogg' - friendly_verb_continuous = "pinches" - friendly_verb_simple = "pinch" - speed = 0 - faction = list("swarmer") - AIStatus = AI_OFF - pass_flags = PASSTABLE - mob_size = MOB_SIZE_TINY - ventcrawler = VENTCRAWLER_ALWAYS - ranged = 1 - projectiletype = /obj/projectile/beam/disabler - ranged_cooldown_time = 20 - projectilesound = 'sound/blank.ogg' - loot = list(/obj/effect/decal/cleanable/robot_debris, /obj/item/stack/ore/bluespace_crystal) - del_on_death = 1 - deathmessage = "explodes with a sharp pop!" - light_color = LIGHT_COLOR_CYAN - hud_type = /datum/hud/swarmer - speech_span = SPAN_ROBOT - var/resources = 0 //Resource points, generated by consuming metal/glass - var/max_resources = 100 - -/mob/living/simple_animal/hostile/swarmer/Initialize() - . = ..() - verbs -= /mob/living/verb/pulled - for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.add_to_hud(src) - -/mob/living/simple_animal/hostile/swarmer/med_hud_set_health() - var/image/holder = hud_list[DIAG_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size - holder.icon_state = "huddiag[RoundDiagBar(health/maxHealth)]" - -/mob/living/simple_animal/hostile/swarmer/med_hud_set_status() - var/image/holder = hud_list[DIAG_STAT_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size - holder.icon_state = "hudstat" - -/mob/living/simple_animal/hostile/swarmer/Stat() - ..() - if(statpanel("Status")) - stat("Resources:",resources) - -/mob/living/simple_animal/hostile/swarmer/emp_act() - . = ..() - if(. & EMP_PROTECT_SELF) - return - if(health > 1) - adjustHealth(health-1) - else - death() - -/mob/living/simple_animal/hostile/swarmer/CanPass(atom/movable/O) - if(istype(O, /obj/projectile/beam/disabler))//Allows for swarmers to fight as a group without wasting their shots hitting each other - return TRUE - if(isswarmer(O)) - return TRUE - ..() - -////CTRL CLICK FOR SWARMERS AND SWARMER_ACT()'S//// -/mob/living/simple_animal/hostile/swarmer/AttackingTarget() - if(!isliving(target)) - return target.swarmer_act(src) - else - return ..() - -/mob/living/simple_animal/hostile/swarmer/CtrlClickOn(atom/A) - face_atom(A) - if(!isturf(loc)) - return - if(next_move > world.time) - return - if(!A.Adjacent(src)) - return - A.swarmer_act(src) - -/atom/proc/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - return TRUE //return TRUE/FALSE whether or not an AI swarmer should try this swarmer_act() again, NOT whether it succeeded. - -/obj/effect/mob_spawn/swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.Integrate(src) - return FALSE //would logically be TRUE, but we don't want AI swarmers eating player spawn chances. - -/obj/effect/mob_spawn/swarmer/IntegrateAmount() - return 50 - -/turf/closed/indestructible/swarmer_act() - return FALSE - -/obj/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - if(resistance_flags & INDESTRUCTIBLE) - return FALSE - for(var/mob/living/L in contents) - if(!issilicon(L) && !isbrain(L)) - to_chat(S, span_warning("An organism has been detected inside this object. Aborting.")) - return FALSE - return ..() - -/obj/item/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - return S.Integrate(src) - -/atom/movable/proc/IntegrateAmount() - return 0 - -/obj/item/IntegrateAmount() //returns the amount of resources gained when eating this item - if(custom_materials) - if(custom_materials[getmaterialref(/datum/material/iron)] || custom_materials[getmaterialref(/datum/material/glass)]) - return 1 - return ..() - -/obj/item/gun/swarmer_act()//Stops you from eating the entire armory - return FALSE - -/turf/open/swarmer_act()//ex_act() on turf calls it on its contents, this is to prevent attacking mobs by DisIntegrate()'ing the floor - return FALSE - -/obj/structure/lattice/catwalk/swarmer_catwalk/swarmer_act() - return FALSE - -/obj/structure/swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - if(S.AIStatus == AI_ON) - return FALSE - else - return ..() - -/obj/effect/swarmer_act() - return FALSE - -/obj/effect/decal/cleanable/robot_debris/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - qdel(src) - return TRUE - -/obj/structure/flora/swarmer_act() - return FALSE - -/turf/open/lava/swarmer_act() - if(!is_safe()) - new /obj/structure/lattice/catwalk/swarmer_catwalk(src) - return FALSE - -/obj/machinery/atmospherics/swarmer_act() - return FALSE - -/obj/structure/disposalpipe/swarmer_act() - return FALSE - -/obj/machinery/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DismantleMachine(src) - return TRUE - -/obj/machinery/light/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - return TRUE - -/obj/machinery/door/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - var/isonshuttle = istype(get_area(src), /area/shuttle) - for(var/turf/T in range(1, src)) - var/area/A = get_area(T) - if(isspaceturf(T) || (!isonshuttle && (istype(A, /area/shuttle) || istype(A, /area/space))) || (isonshuttle && !istype(A, /area/shuttle))) - to_chat(S, span_warning("Destroying this object has the potential to cause a hull breach. Aborting.")) - S.target = null - return FALSE - else if(istype(A, /area/engine/supermatter)) - to_chat(S, span_warning("Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting.")) - S.target = null - return FALSE - S.DisIntegrate(src) - return TRUE - -/obj/machinery/camera/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - toggle_cam(S, 0) - return TRUE - -/obj/machinery/particle_accelerator/control_box/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - return TRUE - -/obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - return TRUE - -/obj/machinery/gravity_generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - return TRUE - -/obj/machinery/vending/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//It's more visually interesting than dismantling the machine - S.DisIntegrate(src) - return TRUE - -/obj/machinery/turretid/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - return TRUE - -/obj/machinery/chem_dispenser/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("The volatile chemicals in this machine would destroy us. Aborting.")) - return FALSE - -/obj/machinery/nuclearbomb/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("This device's destruction would result in the extermination of everything in the area. Aborting.")) - return FALSE - -/obj/effect/rune/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("Searching... sensor malfunction! Target lost. Aborting.")) - return FALSE - -/obj/structure/reagent_dispensers/fueltank/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("Destroying this object would cause a chain reaction. Aborting.")) - return FALSE - -/obj/structure/cable/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("Disrupting the power grid would bring no benefit to us. Aborting.")) - return FALSE - -/obj/machinery/portable_atmospherics/canister/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("An inhospitable area may be created as a result of destroying this object. Aborting.")) - return FALSE - -/obj/machinery/telecomms/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.")) - return FALSE - -/obj/machinery/deepfryer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("This kitchen appliance should be preserved, it will make delicious unhealthy snacks for our masters in the future. Aborting.")) - return FALSE - -/obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("Disrupting the power grid would bring no benefit to us. Aborting.")) - return FALSE - -/obj/machinery/gateway/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("This bluespace source will be important to us later. Aborting.")) - return FALSE - -/turf/closed/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - var/isonshuttle = istype(loc, /area/shuttle) - for(var/turf/T in range(1, src)) - var/area/A = get_area(T) - if(isspaceturf(T) || (!isonshuttle && (istype(A, /area/shuttle) || istype(A, /area/space))) || (isonshuttle && !istype(A, /area/shuttle))) - to_chat(S, span_warning("Destroying this object has the potential to cause a hull breach. Aborting.")) - S.target = null - return TRUE - else if(istype(A, /area/engine/supermatter)) - to_chat(S, span_warning("Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting.")) - S.target = null - return TRUE - return ..() - -/obj/structure/window/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - var/isonshuttle = istype(get_area(src), /area/shuttle) - for(var/turf/T in range(1, src)) - var/area/A = get_area(T) - if(isspaceturf(T) || (!isonshuttle && (istype(A, /area/shuttle) || istype(A, /area/space))) || (isonshuttle && !istype(A, /area/shuttle))) - to_chat(S, span_warning("Destroying this object has the potential to cause a hull breach. Aborting.")) - S.target = null - return TRUE - else if(istype(A, /area/engine/supermatter)) - to_chat(S, span_warning("Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting.")) - S.target = null - return TRUE - return ..() - -/obj/item/stack/cable_coil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//Wiring would be too effective as a resource - to_chat(S, span_warning("This object does not contain enough materials to work with.")) - return FALSE - -/obj/machinery/porta_turret/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("Attempting to dismantle this machine would result in an immediate counterattack. Aborting.")) - return FALSE - -/obj/machinery/porta_turret_cover/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("Attempting to dismantle this machine would result in an immediate counterattack. Aborting.")) - return FALSE - -/mob/living/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisperseTarget(src) - return TRUE - -/mob/living/simple_animal/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("This biological resource is somehow resisting our bluespace transceiver. Aborting.")) - return FALSE - -/obj/machinery/droneDispenser/swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("This object is receiving unactivated swarmer shells to help us. Aborting.")) - return FALSE - -/obj/structure/lattice/catwalk/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - . = ..() - var/turf/here = get_turf(src) - for(var/A in here.contents) - var/obj/structure/cable/C = A - if(istype(C)) - to_chat(S, span_warning("Disrupting the power grid would bring no benefit to us. Aborting.")) - return FALSE - -/obj/item/deactivated_swarmer/IntegrateAmount() - return 50 - -/obj/machinery/hydroponics/soil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("This object does not contain enough materials to work with.")) - return FALSE - -/obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("Destroying this object would cause a catastrophic chain reaction. Aborting.")) - return FALSE - -/obj/machinery/field/containment/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("This object does not contain solid matter. Aborting.")) - return FALSE - -/obj/machinery/power/shieldwallgen/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("Destroying this object would have an unpredictable effect on structure integrity. Aborting.")) - return FALSE - -/obj/machinery/shieldwall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, span_warning("This object does not contain solid matter. Aborting.")) - return FALSE - -////END CTRL CLICK FOR SWARMERS//// - -/mob/living/simple_animal/hostile/swarmer/proc/Fabricate(atom/fabrication_object,fabrication_cost = 0) - if(!isturf(loc)) - to_chat(src, span_warning("This is not a suitable location for fabrication. We need more space.")) - if(resources >= fabrication_cost) - resources -= fabrication_cost - else - to_chat(src, span_warning("I do not have the necessary resources to fabricate this object.")) - return - return new fabrication_object(loc) - -/mob/living/simple_animal/hostile/swarmer/proc/Integrate(atom/movable/target) - var/resource_gain = target.IntegrateAmount() - if(resources + resource_gain > max_resources) - to_chat(src, span_warning("We cannot hold more materials!")) - return TRUE - if(resource_gain) - resources += resource_gain - do_attack_animation(target) - changeNext_move(CLICK_CD_MELEE) - var/obj/effect/temp_visual/swarmer/integrate/I = new /obj/effect/temp_visual/swarmer/integrate(get_turf(target)) - I.pixel_x = target.pixel_x - I.pixel_y = target.pixel_y - I.pixel_z = target.pixel_z - if(istype(target, /obj/item/stack)) - var/obj/item/stack/S = target - S.use(1) - if(S.amount) - return TRUE - qdel(target) - return TRUE - else - to_chat(src, span_warning("[target] is incompatible with our internal matter recycler.")) - return FALSE - - -/mob/living/simple_animal/hostile/swarmer/proc/DisIntegrate(atom/movable/target) - new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target)) - do_attack_animation(target) - changeNext_move(CLICK_CD_MELEE) - target.ex_act(EXPLODE_LIGHT) - - -/mob/living/simple_animal/hostile/swarmer/proc/DisperseTarget(mob/living/target) - if(target == src) - return - - if(!is_station_level(z) && !is_mining_level(z)) - to_chat(src, span_warning("Our bluespace transceiver cannot locate a viable bluespace link, our teleportation abilities are useless in this area.")) - return - - to_chat(src, span_info("Attempting to remove this being from our presence.")) - - if(!do_mob(src, target, 30)) - return - - var/turf/open/floor/F - F = find_safe_turf(zlevels = z, extended_safety_checks = TRUE) - - if(!F) - return - // If we're getting rid of a human, slap some energy cuffs on - // them to keep them away from us a little longer - - var/mob/living/carbon/human/H = target - if(ishuman(target) && (!H.handcuffed)) - H.handcuffed = new /obj/item/restraints/handcuffs/energy/used(H) - H.update_handcuffed() - log_combat(src, H, "handcuffed") - - var/datum/effect_system/spark_spread/S = new - S.set_up(4,0,get_turf(target)) - S.start() - playsound(src,'sound/blank.ogg',50,TRUE) - do_teleport(target, F, 0, channel = TELEPORT_CHANNEL_BLUESPACE) - -/mob/living/simple_animal/hostile/swarmer/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE) - if(!(flags & SHOCK_TESLA)) - return FALSE - return ..() - -/mob/living/simple_animal/hostile/swarmer/proc/DismantleMachine(obj/machinery/target) - do_attack_animation(target) - to_chat(src, span_info("We begin to dismantle this machine. We will need to be uninterrupted.")) - var/obj/effect/temp_visual/swarmer/dismantle/D = new /obj/effect/temp_visual/swarmer/dismantle(get_turf(target)) - D.pixel_x = target.pixel_x - D.pixel_y = target.pixel_y - D.pixel_z = target.pixel_z - if(do_mob(src, target, 100)) - to_chat(src, span_info("Dismantling complete.")) - var/atom/Tsec = target.drop_location() - new /obj/item/stack/sheet/metal(Tsec, 5) - for(var/obj/item/I in target.component_parts) - I.forceMove(Tsec) - var/obj/effect/temp_visual/swarmer/disintegration/N = new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target)) - N.pixel_x = target.pixel_x - N.pixel_y = target.pixel_y - N.pixel_z = target.pixel_z - target.dropContents() - if(istype(target, /obj/machinery/computer)) - var/obj/machinery/computer/C = target - if(C.circuit) - C.circuit.forceMove(Tsec) - qdel(target) - - -/obj/effect/temp_visual/swarmer //temporary swarmer visual feedback objects - icon = 'icons/mob/swarmer.dmi' - layer = BELOW_MOB_LAYER - -/obj/effect/temp_visual/swarmer/disintegration - icon_state = "disintegrate" - duration = 10 - -/obj/effect/temp_visual/swarmer/disintegration/Initialize() - . = ..() - playsound(loc, "sparks", 100, TRUE) - -/obj/effect/temp_visual/swarmer/dismantle - icon_state = "dismantle" - duration = 25 - -/obj/effect/temp_visual/swarmer/integrate - icon_state = "integrate" - duration = 5 - -/obj/structure/swarmer //Default swarmer effect object visual feedback - name = "swarmer ui" - desc = null - gender = NEUTER - icon = 'icons/mob/swarmer.dmi' - icon_state = "ui_light" - layer = MOB_LAYER - resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF - light_color = LIGHT_COLOR_CYAN - max_integrity = 30 - anchored = TRUE - var/lon_range = 1 - -/obj/structure/swarmer/Initialize(mapload) - . = ..() - set_light(lon_range) - -/obj/structure/swarmer/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) - switch(damage_type) - if(BRUTE) - playsound(src, 'sound/blank.ogg', 80, TRUE) - if(BURN) - playsound(src, 'sound/blank.ogg', 100, TRUE) - -/obj/structure/swarmer/emp_act() - . = ..() - if(. & EMP_PROTECT_SELF) - return - qdel(src) - -/obj/structure/swarmer/trap - name = "swarmer trap" - desc = "" - icon_state = "trap" - max_integrity = 10 - density = FALSE - -/obj/structure/swarmer/trap/Crossed(atom/movable/AM) - if(isliving(AM)) - var/mob/living/L = AM - if(!istype(L, /mob/living/simple_animal/hostile/swarmer)) - playsound(loc,'sound/blank.ogg',50, TRUE, -1) - L.electrocute_act(0, src, 1, flags = SHOCK_NOGLOVES|SHOCK_ILLUSION) - if(iscyborg(L)) - L.Paralyze(100) - qdel(src) - ..() - -/mob/living/simple_animal/hostile/swarmer/proc/CreateTrap() - set name = "Create trap" - set category = "Swarmer" - set desc = "" - if(locate(/obj/structure/swarmer/trap) in loc) - to_chat(src, span_warning("There is already a trap here. Aborting.")) - return - Fabricate(/obj/structure/swarmer/trap, 5) - - -/mob/living/simple_animal/hostile/swarmer/proc/CreateBarricade() - set name = "Create barricade" - set category = "Swarmer" - set desc = "" - if(locate(/obj/structure/swarmer/blockade) in loc) - to_chat(src, span_warning("There is already a blockade here. Aborting.")) - return - if(resources < 5) - to_chat(src, span_warning("We do not have the resources for this!")) - return - if(do_mob(src, src, 10)) - Fabricate(/obj/structure/swarmer/blockade, 5) - - -/obj/structure/swarmer/blockade - name = "swarmer blockade" - desc = "" - icon_state = "barricade" - light_range = MINIMUM_USEFUL_LIGHT_RANGE - max_integrity = 50 - -/obj/structure/swarmer/blockade/CanPass(atom/movable/O) - if(isswarmer(O)) - return TRUE - if(istype(O, /obj/projectile/beam/disabler)) - return TRUE - -/mob/living/simple_animal/hostile/swarmer/proc/CreateSwarmer() - set name = "Replicate" - set category = "Swarmer" - set desc = "" - to_chat(src, span_info("We are attempting to replicate ourselves. We will need to stand still until the process is complete.")) - if(resources < 50) - to_chat(src, span_warning("We do not have the resources for this!")) - return - if(!isturf(loc)) - to_chat(src, span_warning("This is not a suitable location for replicating ourselves. We need more room.")) - return - if(do_mob(src, src, 100)) - var/createtype = SwarmerTypeToCreate() - if(createtype && Fabricate(createtype, 50)) - playsound(loc,'sound/blank.ogg',50, TRUE, -1) - - -/mob/living/simple_animal/hostile/swarmer/proc/SwarmerTypeToCreate() - return /obj/effect/mob_spawn/swarmer - - -/mob/living/simple_animal/hostile/swarmer/proc/RepairSelf() - set name = "Self Repair" - set category = "Swarmer" - set desc = "" - if(!isturf(loc)) - return - to_chat(src, span_info("Attempting to repair damage to our body, stand by...")) - if(do_mob(src, src, 100)) - adjustHealth(-100) - to_chat(src, span_info("We successfully repaired ourselves.")) - -/mob/living/simple_animal/hostile/swarmer/proc/ToggleLight() - if(!light_range) - set_light(3) - else - set_light(0) - -/mob/living/simple_animal/hostile/swarmer/proc/swarmer_chat(msg) - var/rendered = "Swarm communication - [src] [say_quote(msg)]" - for(var/i in GLOB.mob_list) - var/mob/M = i - if(isswarmer(M)) - to_chat(M, rendered) - if(isobserver(M)) - var/link = FOLLOW_LINK(M, src) - to_chat(M, "[link] [rendered]") - -/mob/living/simple_animal/hostile/swarmer/proc/ContactSwarmers() - var/message = stripped_input(src, "Announce to other swarmers", "Swarmer contact") - // TODO get swarmers their own colour rather than just boldtext - if(message) - swarmer_chat(message) diff --git a/code/modules/antagonists/swarmer/swarmer_event.dm b/code/modules/antagonists/swarmer/swarmer_event.dm deleted file mode 100644 index 40e6f4ea061..00000000000 --- a/code/modules/antagonists/swarmer/swarmer_event.dm +++ /dev/null @@ -1,28 +0,0 @@ -/datum/round_event_control/spawn_swarmer - name = "Spawn Swarmer Shell" - typepath = /datum/round_event/spawn_swarmer - weight = 7 - max_occurrences = 1 //Only once okay fam - earliest_start = 30 MINUTES - min_players = 15 - - -/datum/round_event/spawn_swarmer - -/datum/round_event/spawn_swarmer/start() - if(find_swarmer()) - return 0 - if(!GLOB.the_gateway) - return 0 - new /obj/effect/mob_spawn/swarmer(get_turf(GLOB.the_gateway)) - if(prob(25)) //25% chance to announce it to the crew - var/swarmer_report = span_bigbold("[command_name()] High-Priority Update") - swarmer_report += "

    Our long-range sensors have detected an odd signal emanating from your station's gateway. We recommend immediate investigation of your gateway, as something may have come through." - print_command_report(swarmer_report, announce=TRUE) - -/datum/round_event/spawn_swarmer/proc/find_swarmer() - for(var/i in GLOB.mob_living_list) - var/mob/living/L = i - if(istype(L, /mob/living/simple_animal/hostile/swarmer) && L.client) //If there is a swarmer with an active client, we've found our swarmer - return 1 - return 0 diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index f2821cb7ffd..65909b4393a 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -110,10 +110,6 @@ name = "Spell Cards" spell_type = /obj/effect/proc_holder/spell/aimed/spell_cards -/datum/spellbook_entry/rod_form - name = "Rod Form" - spell_type = /obj/effect/proc_holder/spell/targeted/rod_form - /datum/spellbook_entry/magicm name = "Magic Missile" spell_type = /obj/effect/proc_holder/spell/targeted/projectile/magic_missile @@ -392,27 +388,6 @@ if(.) new /obj/item/paper/guides/antag/guardian/wizard(get_turf(user)) -/datum/spellbook_entry/item/bloodbottle - name = "Bottle of Blood" - desc = "" - item_path = /obj/item/antag_spawner/slaughter_demon - limit = 3 - category = "Assistance" - -/datum/spellbook_entry/item/hugbottle - name = "Bottle of Tickles" - desc = "A bottle of magically infused fun, the smell of which will \ - attract adorable extradimensional beings when broken. These beings \ - are similar to slaughter demons, but they do not permamently kill \ - their victims, instead putting them in an extradimensional hugspace, \ - to be released on the demon's death. Chaotic, but not ultimately \ - damaging. The crew's reaction to the other hand could be very \ - destructive." - item_path = /obj/item/antag_spawner/slaughter_demon/laughter - cost = 1 //non-destructive; it's just a jape, sibling! - limit = 3 - category = "Assistance" - /datum/spellbook_entry/item/mjolnir name = "Mjolnir" desc = "" @@ -614,18 +589,6 @@ if(!isnull(CT.limit)) CT.limit++ qdel(O) - else if(istype(O, /obj/item/antag_spawner/slaughter_demon)) - to_chat(user, span_notice("On second thought, maybe summoning a demon is a bad idea. You refund your points.")) - if(istype(O, /obj/item/antag_spawner/slaughter_demon/laughter)) - uses += 1 - for(var/datum/spellbook_entry/item/hugbottle/HB in entries) - if(!isnull(HB.limit)) - HB.limit++ - else - uses += 2 - for(var/datum/spellbook_entry/item/bloodbottle/BB in entries) - if(!isnull(BB.limit)) - BB.limit++ qdel(O) /obj/item/spellbook/proc/GetCategoryHeader(category) diff --git a/code/modules/antagonists/xeno/xeno.dm b/code/modules/antagonists/xeno/xeno.dm deleted file mode 100644 index 455164e9064..00000000000 --- a/code/modules/antagonists/xeno/xeno.dm +++ /dev/null @@ -1,38 +0,0 @@ -/datum/team/xeno - name = "Aliens" - -//Simply lists them. -/datum/team/xeno/roundend_report() - var/list/parts = list() - parts += span_header("The [name] were:") - parts += printplayerlist(members) - return "
    [parts.Join("
    ")]
    " - -/datum/antagonist/xeno - name = "Xenomorph" - job_rank = ROLE_ALIEN - show_in_antagpanel = FALSE - prevent_roundtype_conversion = FALSE - var/datum/team/xeno/xeno_team - -/datum/antagonist/xeno/create_team(datum/team/xeno/new_team) - if(!new_team) - for(var/datum/antagonist/xeno/X in GLOB.antagonists) - if(!X.owner || !X.xeno_team) - continue - xeno_team = X.xeno_team - return - xeno_team = new - else - if(!istype(new_team)) - CRASH("Wrong xeno team type provided to create_team") - xeno_team = new_team - -/datum/antagonist/xeno/get_team() - return xeno_team - -//XENO -/mob/living/carbon/alien/mind_initialize() - ..() - if(!mind.has_antag_datum(/datum/antagonist/xeno)) - mind.add_antag_datum(/datum/antagonist/xeno) diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm index 638b95b3dc5..98144230705 100644 --- a/code/modules/atmospherics/environmental/LINDA_fire.dm +++ b/code/modules/atmospherics/environmental/LINDA_fire.dm @@ -11,34 +11,6 @@ /turf/open/hotspot_expose(added, maxstacks, soh) return - var/list/air_gases = air?.gases - if(!air_gases) - return - - . = air_gases[/datum/gas/oxygen] - var/oxy = . ? .[MOLES] : 0 - if (oxy < 0.5) - return - . = air_gases[/datum/gas/plasma] - var/tox = . ? .[MOLES] : 0 - . = air_gases[/datum/gas/tritium] - var/trit = . ? .[MOLES] : 0 - if(active_hotspot) - if(soh) - if(tox > 0.5 || trit > 0.5) - if(active_hotspot.temperature < added) - active_hotspot.temperature = added - if(active_hotspot.volume < maxstacks) - active_hotspot.volume = maxstacks - return - - if((added > PLASMA_MINIMUM_BURN_TEMPERATURE) && (tox > 0.5 || trit > 0.5)) - - active_hotspot = new /obj/effect/hotspot(src, maxstacks*25, added) - - active_hotspot.just_spawned = (current_cycle < SSair.times_fired) - //remove just_spawned protection if no longer processing this cell - SSair.add_to_active(src, 0) //This is the icon for fire on turfs, also helps for nurturing small fires until they are full tile /obj/effect/hotspot @@ -191,48 +163,6 @@ perform_exposure() return - if((temperature < FIRE_MINIMUM_TEMPERATURE_TO_EXIST) || (volume <= 1)) - qdel(src) - return - if(!location.air || (INSUFFICIENT(/datum/gas/plasma) && INSUFFICIENT(/datum/gas/tritium)) || INSUFFICIENT(/datum/gas/oxygen)) - qdel(src) - return - - //Not enough to burn - if(((!location.air.gases[/datum/gas/plasma] || location.air.gases[/datum/gas/plasma][MOLES] < 0.5) && (!location.air.gases[/datum/gas/tritium] || location.air.gases[/datum/gas/tritium][MOLES] < 0.5)) || location.air.gases[/datum/gas/oxygen][MOLES] < 0.5) - qdel(src) - return - -// perform_exposure() - - if(bypassing) - icon_state = "3" - location.burn_tile() - - //Possible spread due to radiated heat - if(location.air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD) - var/radiated_temperature = location.air.temperature*FIRE_SPREAD_RADIOSITY_SCALE - for(var/t in location.atmos_adjacent_turfs) - var/turf/open/T = t - if(!T.active_hotspot) - T.hotspot_expose(radiated_temperature, CELL_VOLUME/4) - - else - if(volume > CELL_VOLUME*0.4) - icon_state = "2" - else - icon_state = "1" - -// if((visual_update_tick++ % 7) == 0) -// update_color() - - if(temperature > location.max_fire_temperature_sustained) - location.max_fire_temperature_sustained = temperature - - if(location.heat_capacity && temperature > location.heat_capacity) - location.to_be_destroyed = TRUE - return TRUE - /obj/effect/hotspot/Destroy() SSair.hotspots -= src var/turf/open/T = loc diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index a47f7fa3b9b..fe052279a64 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -85,8 +85,6 @@ /turf/temperature_expose() return - if(temperature > heat_capacity) - to_be_destroyed = TRUE /turf/proc/archive() temperature_archived = temperature diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm index db1c0f831cc..019ef019b04 100644 --- a/code/modules/atmospherics/machinery/components/components_base.dm +++ b/code/modules/atmospherics/machinery/components/components_base.dm @@ -85,7 +85,6 @@ /obj/machinery/atmospherics/components/proc/nullifyPipenet(datum/pipeline/reference) if(!reference) CRASH("nullifyPipenet(null) called by [type] on [COORD(src)]") - return var/i = parents.Find(reference) reference.other_airs -= airs[i] reference.other_atmosmch -= src diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 7491cf8ae75..b894ca761d2 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -112,17 +112,8 @@ if(ismonkey(occupant)) // Monkey occupant_overlay = image(CRYOMOBS, "monkey") - else if(isalienadult(occupant)) - if(isalienroyal(occupant)) // Queen and prae - occupant_overlay = image(CRYOMOBS, "alienq") - else if(isalienhunter(occupant)) // Hunter - occupant_overlay = image(CRYOMOBS, "alienh") - else if(isaliensentinel(occupant)) // Sentinel - occupant_overlay = image(CRYOMOBS, "aliens") - else // Drone or other - occupant_overlay = image(CRYOMOBS, "aliend") - - else if(ishuman(occupant) || islarva(occupant) || (isanimal(occupant) && !ismegafauna(occupant))) // Mobs that are smaller than cryotube + + else if(ishuman(occupant) || (isanimal(occupant) && !ismegafauna(occupant))) // Mobs that are smaller than cryotube occupant_overlay = image(occupant.icon, occupant.icon_state) occupant_overlay.copy_overlays(occupant) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index dc172fbc9dd..7287dbee21e 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -283,16 +283,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/can_crawl_through() return !welded -/obj/machinery/atmospherics/components/unary/vent_pump/attack_alien(mob/user) - if(!welded || !(do_after(user, 20, target = src))) - return - user.visible_message(span_warning("[user] furiously claws at [src]!"), span_notice("I manage to clear away the stuff blocking the vent."), span_hear("I hear loud scraping noises.")) - welded = FALSE - update_icon() - pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) - pipe_vision_img.plane = ABOVE_HUD_PLANE - playsound(loc, 'sound/blank.ogg', 100, TRUE) - /obj/machinery/atmospherics/components/unary/vent_pump/high_volume name = "large air vent" power_channel = EQUIP diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index b5c628c297f..30315ec97f1 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -295,17 +295,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/can_crawl_through() return !welded -/obj/machinery/atmospherics/components/unary/vent_scrubber/attack_alien(mob/user) - if(!welded || !(do_after(user, 20, target = src))) - return - user.visible_message(span_warning("[user] furiously claws at [src]!"), span_notice("I manage to clear away the stuff blocking the scrubber."), span_hear("I hear loud scraping noises.")) - welded = FALSE - update_icon() - pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) - pipe_vision_img.plane = ABOVE_HUD_PLANE - playsound(loc, 'sound/blank.ogg', 100, TRUE) - - /obj/machinery/atmospherics/components/unary/vent_scrubber/layer1 piping_layer = 1 icon_state = "scrub_map-1" diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index e5612d67589..c3e49c91723 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -129,7 +129,6 @@ var/datum/pipeline/P = returnPipenet(A) if(!P) CRASH("null.addMember() called by [type] on [COORD(src)]") - return P.addMember(A, src) diff --git a/code/modules/atmospherics/machinery/pipes/layermanifold.dm b/code/modules/atmospherics/machinery/pipes/layermanifold.dm index 54449259256..09a8ac41669 100644 --- a/code/modules/atmospherics/machinery/pipes/layermanifold.dm +++ b/code/modules/atmospherics/machinery/pipes/layermanifold.dm @@ -70,9 +70,9 @@ /obj/machinery/atmospherics/pipe/layer_manifold/SetInitDirections() switch(dir) - if(NORTH || SOUTH) + if(NORTH, SOUTH) initialize_directions = NORTH|SOUTH - if(EAST || WEST) + if(EAST, WEST) initialize_directions = EAST|WEST /obj/machinery/atmospherics/pipe/layer_manifold/isConnectable(obj/machinery/atmospherics/target, given_layer) diff --git a/code/modules/atmospherics/multiz.dm b/code/modules/atmospherics/multiz.dm index 45b6aad2603..b48adb6ee55 100644 --- a/code/modules/atmospherics/multiz.dm +++ b/code/modules/atmospherics/multiz.dm @@ -17,8 +17,8 @@ /obj/machinery/atmospherics/pipe/simple/multiz/pipeline_expansion() icon = 'icons/obj/atmos.dmi' //Just to refresh. var/turf/T = get_turf(src) - var/obj/machinery/atmospherics/pipe/simple/multiz/above = locate(/obj/machinery/atmospherics/pipe/simple/multiz) in(SSmapping.get_turf_above(T)) - var/obj/machinery/atmospherics/pipe/simple/multiz/below = locate(/obj/machinery/atmospherics/pipe/simple/multiz) in(SSmapping.get_turf_below(T)) + var/obj/machinery/atmospherics/pipe/simple/multiz/above = locate(/obj/machinery/atmospherics/pipe/simple/multiz) in(GET_TURF_ABOVE(T)) + var/obj/machinery/atmospherics/pipe/simple/multiz/below = locate(/obj/machinery/atmospherics/pipe/simple/multiz) in(GET_TURF_BELOW(T)) if(below) below.pipeline_expansion() //If we've got one below us, force it to add us on facebook if(above) diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 0b18aa467bb..46a5013abc0 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -605,7 +605,7 @@ invisibility = 0 /obj/effect/ctf/ammo/Initialize(mapload) - ..() + . = ..() QDEL_IN(src, AMMO_DROP_LIFETIME) /obj/effect/ctf/ammo/Crossed(atom/movable/AM) diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index e800eef4453..af8472be0ef 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -253,12 +253,6 @@ /obj/effect/mob_spawn/slime/equip(mob/living/simple_animal/slime/S) S.colour = mobcolour -/obj/effect/mob_spawn/facehugger/create(ckey) //Creates a squashed facehugger - var/obj/item/clothing/mask/facehugger/O = new(src.loc) //variable O is a new facehugger at the location of the landmark - O.name = src.name - O.Die() //call the facehugger's death proc - qdel(src) - /obj/effect/mob_spawn/mouse name = "sleeper" mob_type = /mob/living/simple_animal/mouse diff --git a/code/modules/awaymissions/mission_code/Cabin.dm b/code/modules/awaymissions/mission_code/Cabin.dm index 565119a4d47..306c38fb8f7 100644 --- a/code/modules/awaymissions/mission_code/Cabin.dm +++ b/code/modules/awaymissions/mission_code/Cabin.dm @@ -44,7 +44,7 @@ var/active = 1 /obj/structure/firepit/Initialize() - ..() + . = ..() toggleFirepit() /obj/structure/firepit/interact(mob/living/user) diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index c9e2fc8c8ba..523a43095c0 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -520,7 +520,6 @@ /obj/item/twohanded/fireaxe = 25, /obj/item/organ/brain/alien = 17, /obj/item/twohanded/dualsaber = 15, - /obj/item/organ/heart/demon = 7, /obj/item/gun/ballistic/automatic/c20r/unrestricted = 16, /obj/item/gun/magic/wand/resurrection/inert = 15, /obj/item/gun/magic/wand/resurrection = 10, diff --git a/code/modules/awaymissions/signpost.dm b/code/modules/awaymissions/signpost.dm index c61cddf4650..41057c38348 100644 --- a/code/modules/awaymissions/signpost.dm +++ b/code/modules/awaymissions/signpost.dm @@ -39,9 +39,6 @@ /obj/structure/signpost/attack_hulk(mob/user) return -/obj/structure/signpost/attack_larva(mob/user) - return interact(user) - /obj/structure/signpost/attack_robot(mob/user) if (Adjacent(user)) return interact(user) diff --git a/code/modules/awaymissions/super_secret_room.dm b/code/modules/awaymissions/super_secret_room.dm index 72fc59d085f..475b8a1bd3c 100644 --- a/code/modules/awaymissions/super_secret_room.dm +++ b/code/modules/awaymissions/super_secret_room.dm @@ -98,8 +98,6 @@ /obj/structure/speaking_tile/attack_hulk(mob/user) return -/obj/structure/speaking_tile/attack_larva(mob/user) - return interact(user) /obj/structure/speaking_tile/attack_ai(mob/user) return interact(user) diff --git a/code/modules/buildmode/submodes/basic.dm b/code/modules/buildmode/submodes/basic.dm index e0fdf47faf9..6391715c9f5 100644 --- a/code/modules/buildmode/submodes/basic.dm +++ b/code/modules/buildmode/submodes/basic.dm @@ -22,7 +22,7 @@ if(istype(object,/turf) && left_click && !alt_click && !ctrl_click) to_chat(src, span_notice("Basic mode is only partially funcational, please use Adv. Build.")) return - var/turf/T = object +/* var/turf/T = object if(isspaceturf(object)) T.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) else if(isplatingturf(object)) @@ -32,7 +32,7 @@ else if(iswallturf(object)) T.PlaceOnTop(/turf/closed/wall/r_wall) log_admin("Build Mode: [key_name(c)] built [T] at [AREACOORD(T)]") - return + return */ else if(right_click) log_admin("Build Mode: [key_name(c)] deleted [object] at [AREACOORD(object)]") if(isturf(object)) diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm deleted file mode 100644 index c3c4d16fe5f..00000000000 --- a/code/modules/cargo/bounties/assistant.dm +++ /dev/null @@ -1,204 +0,0 @@ -/datum/bounty/item/assistant/strange_object - name = "Strange Object" - description = "Nanotrasen has taken an interest in strange objects. Find one in maint, and ship it off to CentCom right away." - reward = 1200 - wanted_types = list(/obj/item/relic) - -/datum/bounty/item/assistant/scooter - name = "Scooter" - description = "Nanotrasen has determined walking to be wasteful. Ship a scooter to CentCom to speed operations up." - reward = 1080 // the mat hoffman - wanted_types = list(/obj/vehicle/ridden/scooter) - include_subtypes = FALSE - -/datum/bounty/item/assistant/skateboard - name = "Skateboard" - description = "Nanotrasen has determined walking to be wasteful. Ship a skateboard to CentCom to speed operations up." - reward = 900 // the tony hawk - wanted_types = list(/obj/vehicle/ridden/scooter/skateboard, /obj/item/melee/skateboard) - -/datum/bounty/item/assistant/stunprod - name = "Stunprod" - description = "CentCom demands a stunprod to use against dissidents. Craft one, then ship it." - reward = 1300 - wanted_types = list(/obj/item/melee/baton/cattleprod) - -/datum/bounty/item/assistant/soap - name = "Soap" - description = "Soap has gone missing from CentCom's bathrooms and nobody knows who took it. Replace it and be the hero CentCom needs." - reward = 2000 - required_count = 3 - wanted_types = list(/obj/item/soap) - -/datum/bounty/item/assistant/spear - name = "Spears" - description = "CentCom's security forces are going through budget cuts. You will be paid if you ship a set of spears." - reward = 2000 - required_count = 5 - wanted_types = list(/obj/item/twohanded/spear) - -/datum/bounty/item/assistant/toolbox - name = "Toolboxes" - description = "There's an absence of robustness at Central Command. Hurry up and ship some toolboxes as a solution." - reward = 2000 - required_count = 6 - wanted_types = list(/obj/item/storage/toolbox) - -/datum/bounty/item/assistant/statue - name = "Statue" - description = "Central Command would like to commision an artsy statue for the lobby. Ship one out, when possible." - reward = 2000 - wanted_types = list(/obj/structure/statue) - -/datum/bounty/item/assistant/clown_box - name = "Clown Box" - description = "The universe needs laughter. Stamp cardboard with a clown stamp and ship it out." - reward = 1500 - wanted_types = list(/obj/item/storage/box/clown) - -/datum/bounty/item/assistant/cheesiehonkers - name = "Cheesie Honkers" - description = "Apparently the company that makes Cheesie Honkers is going out of business soon. CentCom wants to stock up before it happens!" - reward = 1200 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/cheesiehonkers) - -/datum/bounty/item/assistant/baseball_bat - name = "Baseball Bat" - description = "Baseball fever is going on at CentCom! Be a dear and ship them some baseball bats, so that management can live out their childhood dream." - reward = 2000 - required_count = 5 - wanted_types = list(/obj/item/melee/baseball_bat) - -/datum/bounty/item/assistant/extendohand - name = "Extendo-Hand" - description = "Commander Betsy is getting old, and can't bend over to get the telescreen remote anymore. Management has requested an extendo-hand to help her out." - reward = 2500 - wanted_types = list(/obj/item/extendohand) - -/datum/bounty/item/assistant/donut - name = "Donuts" - description = "CentCom's security forces are facing heavy losses against the Syndicate. Ship donuts to raise morale." - reward = 3000 - required_count = 10 - wanted_types = list(/obj/item/reagent_containers/food/snacks/donut) - -/datum/bounty/item/assistant/donkpocket - name = "Donk-Pockets" - description = "Consumer safety recall: Warning. Donk-Pockets manufactured in the past year contain hazardous lizard biomatter. Return units to CentCom immediately." - reward = 3000 - required_count = 10 - wanted_types = list(/obj/item/reagent_containers/food/snacks/donkpocket) - -/datum/bounty/item/assistant/briefcase - name = "Briefcase" - description = "Central Command will be holding a business convention this year. Ship a few briefcases in support." - reward = 2500 - required_count = 5 - wanted_types = list(/obj/item/storage/briefcase, /obj/item/storage/secure/briefcase) - -/datum/bounty/item/assistant/sunglasses - name = "Sunglasses" - description = "A famous blues duo is passing through the sector, but they've lost their shades and they can't perform. Ship new sunglasses to CentCom to rectify this." - reward = 3000 - required_count = 2 - wanted_types = list(/obj/item/clothing/glasses/sunglasses) - -/datum/bounty/item/assistant/monkey_hide - name = "Monkey Hide" - description = "One of the scientists at CentCom is interested in testing products on monkey skin. Your mission is to acquire monkey's hide and ship it." - reward = 1500 - wanted_types = list(/obj/item/stack/sheet/animalhide/monkey) - -/datum/bounty/item/assistant/shard - name = "Shards" - description = "A killer clown has been stalking CentCom, and staff have been unable to catch her because she's not wearing shoes. Please ship some shards so that a booby trap can be constructed." - reward = 1500 - required_count = 15 - wanted_types = list(/obj/item/shard) - -/datum/bounty/item/assistant/comfy_chair - name = "Comfy Chairs" - description = "Commander Pat is unhappy with his chair. He claims it hurts his back. Ship some alternatives out to humor him." - reward = 1500 - required_count = 5 - wanted_types = list(/obj/structure/chair/comfy) - -/datum/bounty/item/assistant/shadyjims - name = "Shady Jim's" - description = "There's an irate officer at CentCom demanding that he receive a box of Shady Jim's cigarettes. Please ship one. He's starting to make threats." - reward = 500 - wanted_types = list(/obj/item/storage/fancy/cigarettes/cigpack_shadyjims) - -/datum/bounty/item/assistant/potted_plants - name = "Potted Plants" - description = "Central Command is looking to commission a new BirdBoat-class station. You've been ordered to supply the potted plants." - reward = 2000 - required_count = 8 - wanted_types = list(/obj/item/twohanded/required/kirbyplants) - -/datum/bounty/item/assistant/earmuffs - name = "Earmuffs" - description = "Central Command is getting tired of your station's messages. They've ordered that you ship some earmuffs to lessen the annoyance." - reward = 1000 - wanted_types = list(/obj/item/clothing/ears/earmuffs) - -/datum/bounty/item/assistant/handcuffs - name = "Handcuffs" - description = "A large influx of escaped convicts have arrived at Central Command. Now is the perfect time to ship out spare handcuffs (or restraints)." - reward = 1000 - required_count = 5 - wanted_types = list(/obj/item/restraints/handcuffs) - -/datum/bounty/item/assistant/monkey_cubes - name = "Monkey Cubes" - description = "Due to a recent genetics accident, Central Command is in serious need of monkeys. Your mission is to ship monkey cubes." - reward = 2000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/monkeycube) - -/datum/bounty/item/assistant/chainsaw - name = "Chainsaw" - description = "The chef at CentCom is having trouble butchering her animals. She requests one chainsaw, please." - reward = 2500 - wanted_types = list(/obj/item/twohanded/required/chainsaw) - -/datum/bounty/item/assistant/ied - name = "IED" - description = "Nanotrasen's maximum security prison at CentCom is undergoing personnel training. Ship a handful of IEDs to serve as a training tools." - reward = 2000 - required_count = 3 - wanted_types = list(/obj/item/grenade/iedcasing) - -/datum/bounty/item/assistant/corgimeat - name = "Raw Corgi Meat" - description = "The Syndicate recently stole all of CentCom's Corgi meat. Ship out a replacement immediately." - reward = 3000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/meat/slab/corgi) - -/datum/bounty/item/assistant/corgifarming - name = "Corgi Hides" - description = "Admiral Weinstein's space yacht needs new upholstery. A dozen Corgi furs should do just fine." - reward = 30000 //that's a lot of dead dogs - required_count = 12 - wanted_types = list(/obj/item/stack/sheet/animalhide/corgi) - -/datum/bounty/item/assistant/action_figures - name = "Action Figures" - description = "The vice president's son saw an ad for action figures on the telescreen and now he won't shut up about them. Ship some to ease his complaints." - reward = 4000 - required_count = 5 - wanted_types = list(/obj/item/toy/figure) - -/datum/bounty/item/assistant/tail_whip - name = "Nine Tails whip" - description = "Commander Jackson is looking for a fine addition to her exotic weapons collection. She will reward you handsomely for either a Cat or Liz o' Nine Tails." - reward = 4000 - wanted_types = list(/obj/item/melee/chainofcommand/tailwhip) - -/datum/bounty/item/assistant/dead_mice - name = "Dead Mice" - description = "Station 14 ran out of freeze-dried mice. Ship some fresh ones so their janitor doesn't go on strike." - reward = 5000 - required_count = 5 - wanted_types = list(/obj/item/reagent_containers/food/snacks/deadmouse) diff --git a/code/modules/cargo/bounties/chef.dm b/code/modules/cargo/bounties/chef.dm deleted file mode 100644 index 285132a1c26..00000000000 --- a/code/modules/cargo/bounties/chef.dm +++ /dev/null @@ -1,131 +0,0 @@ -/datum/bounty/item/chef/birthday_cake - name = "Birthday Cake" - description = "Nanotrasen's birthday is coming up! Ship them a birthday cake to celebrate!" - reward = 4000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/store/cake/birthday, /obj/item/reagent_containers/food/snacks/cakeslice/birthday) - -/datum/bounty/item/chef/soup - name = "Soup" - description = "To quell the homeless uprising, Nanotrasen will be serving soup to all underpaid workers. Ship any type of soup." - reward = 3000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/soup) - -/datum/bounty/item/chef/popcorn - name = "Popcorn Bags" - description = "Upper management wants to host a movie night. Ship bags of popcorn for the occasion." - reward = 3000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/popcorn) - -/datum/bounty/item/chef/onionrings - name = "Onion Rings" - description = "Nanotrasen is remembering Saturn day. Ship onion rings to show the station's support." - reward = 3000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/onionrings) - -/datum/bounty/item/chef/icecreamsandwich - name = "Ice Cream Sandwiches" - description = "Upper management has been screaming non-stop for ice cream. Please send some." - reward = 4000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/icecreamsandwich) - -/datum/bounty/item/chef/bread - name = "Bread" - description = "Problems with central planning have led to bread prices skyrocketing. Ship some bread to ease tensions." - reward = 1000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/store/bread, /obj/item/reagent_containers/food/snacks/breadslice, /obj/item/reagent_containers/food/snacks/bun, /obj/item/reagent_containers/food/snacks/pizzabread) - -/datum/bounty/item/chef/pie - name = "Pie" - description = "3.14159? No! CentCom management wants edible pie! Ship a whole one." - reward = 3142 - wanted_types = list(/obj/item/reagent_containers/food/snacks/pie) - -/datum/bounty/item/chef/salad - name = "Salad or Rice Bowls" - description = "CentCom management is going on a health binge. Your order is to ship salad or rice bowls." - reward = 3000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/salad) - -/datum/bounty/item/chef/carrotfries - name = "Carrot Fries" - description = "Night sight can mean life or death! A shipment of carrot fries is the order." - reward = 3500 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/carrotfries) - -/datum/bounty/item/chef/superbite - name = "Super Bite Burger" - description = "Commander Tubbs thinks he can set a competitive eating world record. All he needs is a super bite burger shipped to him." - reward = 12000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/burger/superbite) - -/datum/bounty/item/chef/poppypretzel - name = "Poppy Pretzel" - description = "Central Command needs a reason to fire their HR head. Send over a poppy pretzel to force a failed drug test." - reward = 3000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/poppypretzel) - -/datum/bounty/item/chef/cubancarp - name = "Cuban Carp" - description = "To celebrate the birth of Castro XXVII, ship one cuban carp to CentCom." - reward = 8000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/cubancarp) - -/datum/bounty/item/chef/hotdog - name = "Hot Dog" - description = "Nanotrasen is conducting taste tests to determine the best hot dog recipe. Ship your station's version to participate." - reward = 8000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/hotdog) - -/datum/bounty/item/chef/eggplantparm - name = "Eggplant Parmigianas" - description = "A famous singer will be arriving at CentCom, and their contract demands that they only be served Eggplant Parmigiana. Ship some, please!" - reward = 3500 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/eggplantparm) - -/datum/bounty/item/chef/muffin - name = "Muffins" - description = "The Muffin Man is visiting CentCom, but he's forgotten his muffins! Your order is to rectify this." - reward = 3000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/muffin) - -/datum/bounty/item/chef/chawanmushi - name = "Chawanmushi" - description = "Nanotrasen wants to improve relations with its sister company, Japanotrasen. Ship Chawanmushi immediately." - reward = 8000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/chawanmushi) - -/datum/bounty/item/chef/kebab - name = "Kebabs" - description = "Remove all kebab from station you are best food. Ship to CentCom to remove from the premises." - reward = 3500 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/kebab) - -/datum/bounty/item/chef/soylentgreen - name = "Soylent Green" - description = "CentCom has heard wonderful things about the product 'Soylent Green', and would love to try some. If you endulge them, expect a pleasant bonus." - reward = 5000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/soylentgreen) - -/datum/bounty/item/chef/pancakes - name = "Pancakes" - description = "Here at Nanotrasen we consider employees to be family. And you know what families love? Pancakes. Ship a baker's dozen." - reward = 5000 - required_count = 13 - wanted_types = list(/obj/item/reagent_containers/food/snacks/pancakes) - -/datum/bounty/item/chef/nuggies - name = "Chicken Nuggets" - description = "The vice president's son won't shut up about chicken nuggies. Would you mind shipping some?" - reward = 4000 - required_count = 6 - wanted_types = list(/obj/item/reagent_containers/food/snacks/nugget) - diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm deleted file mode 100644 index 77687977d7f..00000000000 --- a/code/modules/cargo/bounties/engineering.dm +++ /dev/null @@ -1,37 +0,0 @@ -/datum/bounty/item/engineering/gas - name = "Full Tank of Pluoxium" - description = "CentCom RnD is researching extra compact internals. Ship us a tank full of Pluoxium and you'll be compensated." - reward = 7500 - wanted_types = list(/obj/item/tank) - var/moles_required = 20 // A full tank is 28 moles, but CentCom ignores that fact. - var/gas_type = /datum/gas/pluoxium - -/datum/bounty/item/engineering/gas/applies_to(obj/O) - if(!..()) - return FALSE - var/obj/item/tank/T = O - if(!T.air_contents.gases[gas_type]) - return FALSE - return T.air_contents.gases[gas_type][MOLES] >= moles_required - -/datum/bounty/item/engineering/gas/nitryl_tank - name = "Full Tank of Nitryl" - description = "The non-human staff of Station 88 has been volunteered to test performance enhancing drugs. Ship them a tank full of Nitryl so they can get started." - gas_type = /datum/gas/nitryl - -/datum/bounty/item/engineering/gas/tritium_tank - name = "Full Tank of Tritium" - description = "Station 49 is looking to kickstart their research program. Ship them a tank full of Tritium." - gas_type = /datum/gas/tritium - -/datum/bounty/item/engineering/energy_ball - name = "Contained Tesla Ball" - description = "Station 24 is being overrun by hordes of angry Mothpeople. They are requesting the ultimate bug zapper." - reward = 75000 //requires 14k credits of purchases, not to mention cooperation with engineering/heads of staff to set up inside the cramped shuttle - wanted_types = list(/obj/singularity/energy_ball) - -/datum/bounty/item/engineering/energy_ball/applies_to(obj/O) - if(!..()) - return FALSE - var/obj/singularity/energy_ball/T = O - return !T.miniball diff --git a/code/modules/cargo/bounties/item.dm b/code/modules/cargo/bounties/item.dm deleted file mode 100644 index b2586d7c5ba..00000000000 --- a/code/modules/cargo/bounties/item.dm +++ /dev/null @@ -1,39 +0,0 @@ -/datum/bounty/item - var/required_count = 1 - var/shipped_count = 0 - var/list/wanted_types // Types accepted for the bounty. - var/include_subtypes = TRUE // Set to FALSE to make the datum apply only to a strict type. - var/list/exclude_types // Types excluded. - -/datum/bounty/item/New() - ..() - wanted_types = typecacheof(wanted_types) - exclude_types = typecacheof(exclude_types) - -/datum/bounty/item/completion_string() - return {"[shipped_count]/[required_count]"} - -/datum/bounty/item/can_claim() - return ..() && shipped_count >= required_count - -/datum/bounty/item/applies_to(obj/O) - if(!include_subtypes && !(O.type in wanted_types)) - return FALSE - if(include_subtypes && (!is_type_in_typecache(O, wanted_types) || is_type_in_typecache(O, exclude_types))) - return FALSE - if(O.flags_1 & HOLOGRAM_1) - return FALSE - return shipped_count < required_count - -/datum/bounty/item/ship(obj/O) - if(!applies_to(O)) - return - if(istype(O,/obj/item/stack)) - var/obj/item/stack/O_is_a_stack = O - shipped_count += O_is_a_stack.amount - else - shipped_count += 1 - -/datum/bounty/item/compatible_with(datum/other_bounty) - return type != other_bounty.type - diff --git a/code/modules/cargo/bounties/mech.dm b/code/modules/cargo/bounties/mech.dm deleted file mode 100644 index 62c846ea96a..00000000000 --- a/code/modules/cargo/bounties/mech.dm +++ /dev/null @@ -1,44 +0,0 @@ -/datum/bounty/item/mech/New() - ..() - description = "Upper management has requested one [name] mech be sent as soon as possible. Ship it to receive a large payment." - -/datum/bounty/item/mech/ship(obj/O) - if(!applies_to(O)) - return - if(istype(O, /obj/mecha)) - var/obj/mecha/M = O - M.wreckage = null // So the mech doesn't explode. - ..() - -/datum/bounty/item/mech/mark_high_priority(scale_reward) - return ..(max(scale_reward * 0.7, 1.2)) - -/datum/bounty/item/mech/ripleymkii - name = "APLU MK-II \"Ripley\"" - reward = 13000 - wanted_types = list(/obj/mecha/working/ripley/mkii) - -/datum/bounty/item/mech/firefighter - name = "APLU \"Firefighter\"" - reward = 18000 - wanted_types = list(/obj/mecha/working/ripley/firefighter) - -/datum/bounty/item/mech/odysseus - name = "Odysseus" - reward = 11000 - wanted_types = list(/obj/mecha/medical/odysseus) - -/datum/bounty/item/mech/gygax - name = "Gygax" - reward = 28000 - wanted_types = list(/obj/mecha/combat/gygax) - -/datum/bounty/item/mech/durand - name = "Durand" - reward = 20000 - wanted_types = list(/obj/mecha/combat/durand) - -/datum/bounty/item/mech/phazon - name = "Phazon" - reward = 50000 - wanted_types = list(/obj/mecha/combat/phazon) diff --git a/code/modules/cargo/bounties/medical.dm b/code/modules/cargo/bounties/medical.dm deleted file mode 100644 index d1397759695..00000000000 --- a/code/modules/cargo/bounties/medical.dm +++ /dev/null @@ -1,59 +0,0 @@ -/datum/bounty/item/medical/heart - name = "Heart" - description = "Commander Johnson is in critical condition after suffering yet another heart attack. Doctors say he needs a new heart fast. Ship one, pronto!" - reward = 3000 - wanted_types = list(/obj/item/organ/heart) - -/datum/bounty/item/medical/lung - name = "Lungs" - description = "A recent explosion at Central Command has left multiple staff with punctured lungs. Ship spare lungs to be rewarded." - reward = 10000 - required_count = 3 - wanted_types = list(/obj/item/organ/lungs) - -/datum/bounty/item/medical/appendix - name = "Appendix" - description = "Chef Gibb of Central Command wants to prepare a meal using a very special delicacy: an appendix. If you ship one, he'll pay." - reward = 5000 //there are no synthetic appendixes - wanted_types = list(/obj/item/organ/appendix) - -/datum/bounty/item/medical/ears - name = "Ears" - description = "Multiple staff at Station 12 have been left deaf due to unauthorized clowning. Ship them new ears." - reward = 10000 - required_count = 3 - wanted_types = list(/obj/item/organ/ears) - -/datum/bounty/item/medical/liver - name = "Livers" - description = "Multiple high-ranking CentCom diplomats have been hospitalized with liver failure after a recent meeting with Third Soviet Union ambassadors. Help us out, will you?" - reward = 10000 - required_count = 3 - wanted_types = list(/obj/item/organ/liver) - -/datum/bounty/item/medical/eye - name = "Organic Eyes" - description = "Station 5's Research Director Willem is requesting a few pairs of non-robotic eyes. Don't ask questions, just ship them." - reward = 10000 - required_count = 3 - wanted_types = list(/obj/item/organ/eyes) - exclude_types = list(/obj/item/organ/eyes/robotic) - -/datum/bounty/item/medical/tongue - name = "Tongues" - description = "A recent attack by Mime extremists has left staff at Station 23 speechless. Ship some spare tongues." - reward = 10000 - required_count = 3 - wanted_types = list(/obj/item/organ/tongue) - -/datum/bounty/item/medical/lizard_tail - name = "Lizard Tail" - description = "The Wizard Federation has made off with Nanotrasen's supply of lizard tails. While CentCom is dealing with the wizards, can the station spare a tail of their own?" - reward = 3000 - wanted_types = list(/obj/item/organ/tail/lizard) - -/datum/bounty/item/medical/cat_tail - name = "Cat Tail" - description = "Central Command has run out of heavy duty pipe cleaners. Can you ship over a cat tail to help us out?" - reward = 3000 - wanted_types = list(/obj/item/organ/tail/cat) diff --git a/code/modules/cargo/bounties/mining.dm b/code/modules/cargo/bounties/mining.dm deleted file mode 100644 index 1b8b46734fe..00000000000 --- a/code/modules/cargo/bounties/mining.dm +++ /dev/null @@ -1,51 +0,0 @@ -/datum/bounty/item/mining/goliath_steaks - name = "Lava-Cooked Goliath Steaks" - description = "Admiral Pavlov has gone on hunger strike ever since the canteen started serving only monkey and monkey byproducts. She is demanding lava-cooked Goliath steaks." - reward = 5000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/meat/steak/goliath) - -/datum/bounty/item/mining/goliath_boat - name = "Goliath Hide Boat" - description = "Commander Menkov wants to participate in the annual Lavaland Regatta. He is asking your shipwrights to build the swiftest boat known to man." - reward = 10000 - wanted_types = list(/obj/vehicle/ridden/lavaboat) - -/datum/bounty/item/mining/bone_oar - name = "Bone Oars" - description = "Commander Menkov requires oars to participate in the annual Lavaland Regatta. Ship a pair over." - reward = 4000 - required_count = 2 - wanted_types = list(/obj/item/oar) - -/datum/bounty/item/mining/bone_axe - name = "Bone Axe" - description = "Station 12 has had their fire axes stolen by marauding clowns. Ship them a bone axe as a replacement." - reward = 7500 - wanted_types = list(/obj/item/twohanded/fireaxe/boneaxe) - -/datum/bounty/item/mining/bone_armor - name = "Bone Armor" - description = "Station 14 has volunteered their lizard crew for ballistic armor testing. Ship over some bone armor." - reward = 5000 - wanted_types = list(/obj/item/clothing/suit/armor/bone) - -/datum/bounty/item/mining/skull_helmet - name = "Skull Helmet" - description = "Station 42's Head of Security has her birthday tomorrow! We want to suprise her with a fashionable skull helmet." - reward = 4000 - wanted_types = list(/obj/item/clothing/head/helmet/skull) - -/datum/bounty/item/mining/bone_talisman - name = "Bone Talismans" - description = "Station 14's Research Director claims that pagan bone talismans protect their wearer. Ship them a few so they can start testing." - reward = 7500 - required_count = 3 - wanted_types = list(/obj/item/clothing/accessory/talisman) - -/datum/bounty/item/mining/bone_dagger - name = "Bone Daggers" - description = "Central Command's canteen is undergoing budget cuts. Ship over some bone daggers so our Chef can keep working." - reward = 5000 - required_count = 3 - wanted_types = list(/obj/item/kitchen/knife/combat/bone) diff --git a/code/modules/cargo/bounties/reagent.dm b/code/modules/cargo/bounties/reagent.dm deleted file mode 100644 index 11a166548a3..00000000000 --- a/code/modules/cargo/bounties/reagent.dm +++ /dev/null @@ -1,258 +0,0 @@ -/datum/bounty/reagent - var/required_volume = 10 - var/shipped_volume = 0 - var/datum/reagent/wanted_reagent - -/datum/bounty/reagent/completion_string() - return {"[round(shipped_volume)]/[required_volume] Units"} - -/datum/bounty/reagent/can_claim() - return ..() && shipped_volume >= required_volume - -/datum/bounty/reagent/applies_to(obj/O) - if(!istype(O, /obj/item/reagent_containers)) - return FALSE - if(!O.reagents || !O.reagents.has_reagent(wanted_reagent.type)) - return FALSE - if(O.flags_1 & HOLOGRAM_1) - return FALSE - return shipped_volume < required_volume - -/datum/bounty/reagent/ship(obj/O) - if(!applies_to(O)) - return - shipped_volume += O.reagents.get_reagent_amount(wanted_reagent.type) - if(shipped_volume > required_volume) - shipped_volume = required_volume - -/datum/bounty/reagent/compatible_with(other_bounty) - if(!istype(other_bounty, /datum/bounty/reagent)) - return TRUE - var/datum/bounty/reagent/R = other_bounty - return wanted_reagent.type != R.wanted_reagent.type - -/datum/bounty/reagent/simple_drink - name = "Simple Drink" - reward = 1500 - -/datum/bounty/reagent/simple_drink/New() - // Don't worry about making this comprehensive. It doesn't matter if some drinks are skipped. - var/static/list/possible_reagents = list(\ - /datum/reagent/consumable/ethanol/antifreeze,\ - /datum/reagent/consumable/ethanol/andalusia,\ - /datum/reagent/consumable/tea/arnold_palmer,\ - /datum/reagent/consumable/ethanol/b52,\ - /datum/reagent/consumable/ethanol/bananahonk,\ - /datum/reagent/consumable/ethanol/beepsky_smash,\ - /datum/reagent/consumable/ethanol/between_the_sheets,\ - /datum/reagent/consumable/ethanol/bilk,\ - /datum/reagent/consumable/ethanol/black_russian,\ - /datum/reagent/consumable/ethanol/bloody_mary,\ - /datum/reagent/consumable/ethanol/brave_bull,\ - /datum/reagent/consumable/ethanol/martini,\ - /datum/reagent/consumable/ethanol/cuba_libre,\ - /datum/reagent/consumable/ethanol/eggnog,\ - /datum/reagent/consumable/ethanol/erikasurprise,\ - /datum/reagent/consumable/ethanol/ginfizz,\ - /datum/reagent/consumable/ethanol/gintonic,\ - /datum/reagent/consumable/ethanol/grappa,\ - /datum/reagent/consumable/ethanol/grog,\ - /datum/reagent/consumable/ethanol/hooch,\ - /datum/reagent/consumable/ethanol/iced_beer,\ - /datum/reagent/consumable/ethanol/irishcarbomb,\ - /datum/reagent/consumable/ethanol/manhattan,\ - /datum/reagent/consumable/ethanol/margarita,\ - /datum/reagent/consumable/ethanol/gargle_blaster,\ - /datum/reagent/consumable/ethanol/rum_coke,\ - /datum/reagent/consumable/ethanol/screwdrivercocktail,\ - /datum/reagent/consumable/ethanol/snowwhite,\ - /datum/reagent/consumable/soy_latte,\ - /datum/reagent/consumable/cafe_latte,\ - /datum/reagent/consumable/ethanol/syndicatebomb,\ - /datum/reagent/consumable/ethanol/tequila_sunrise,\ - /datum/reagent/consumable/ethanol/manly_dorf,\ - /datum/reagent/consumable/ethanol/thirteenloko,\ - /datum/reagent/consumable/triple_citrus,\ - /datum/reagent/consumable/ethanol/vodkamartini,\ - /datum/reagent/consumable/ethanol/whiskeysoda,\ - /datum/reagent/consumable/ethanol/beer/green,\ - /datum/reagent/consumable/ethanol/demonsblood,\ - /datum/reagent/consumable/ethanol/crevice_spike,\ - /datum/reagent/consumable/ethanol/singulo,\ - /datum/reagent/consumable/ethanol/whiskey_sour) - - var/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = wanted_reagent.name - description = "CentCom is thirsty! Send a shipment of [name] to CentCom to quench the company's thirst." - reward += rand(0, 2) * 500 - -/datum/bounty/reagent/complex_drink - name = "Complex Drink" - reward = 4000 - -/datum/bounty/reagent/complex_drink/New() - // Don't worry about making this comprehensive. It doesn't matter if some drinks are skipped. - var/static/list/possible_reagents = list(\ - /datum/reagent/consumable/ethanol/atomicbomb,\ - /datum/reagent/consumable/ethanol/bacchus_blessing,\ - /datum/reagent/consumable/ethanol/bastion_bourbon,\ - /datum/reagent/consumable/ethanol/booger,\ - /datum/reagent/consumable/ethanol/hippies_delight,\ - /datum/reagent/consumable/ethanol/drunkenblumpkin,\ - /datum/reagent/consumable/ethanol/fetching_fizz,\ - /datum/reagent/consumable/ethanol/goldschlager,\ - /datum/reagent/consumable/ethanol/manhattan_proj,\ - /datum/reagent/consumable/ethanol/narsour,\ - /datum/reagent/consumable/ethanol/neurotoxin,\ - /datum/reagent/consumable/ethanol/patron,\ - /datum/reagent/consumable/ethanol/quadruple_sec,\ - /datum/reagent/consumable/bluecherryshake,\ - /datum/reagent/consumable/doctor_delight,\ - /datum/reagent/consumable/ethanol/silencer,\ - /datum/reagent/consumable/ethanol/peppermint_patty,\ - /datum/reagent/consumable/ethanol/aloe,\ - /datum/reagent/consumable/pumpkin_latte) - - var/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = wanted_reagent.name - description = "CentCom is offering a reward for talented mixologists. Ship a container of [name] to claim the prize." - reward += rand(0, 4) * 500 - -/datum/bounty/reagent/chemical_simple - name = "Simple Chemical" - reward = 4000 - required_volume = 30 - -/datum/bounty/reagent/chemical_simple/New() - // Chemicals that can be mixed by a single skilled Chemist. - var/static/list/possible_reagents = list(\ - /datum/reagent/medicine/leporazine,\ - /datum/reagent/medicine/clonexadone,\ - /datum/reagent/medicine/mine_salve,\ - /datum/reagent/medicine/C2/convermol,\ - /datum/reagent/medicine/ephedrine,\ - /datum/reagent/medicine/diphenhydramine,\ - /datum/reagent/drug/space_drugs,\ - /datum/reagent/drug/crank,\ - /datum/reagent/gunpowder,\ - /datum/reagent/napalm,\ - /datum/reagent/firefighting_foam,\ - /datum/reagent/consumable/mayonnaise,\ - /datum/reagent/toxin/itching_powder,\ - /datum/reagent/toxin/cyanide,\ - /datum/reagent/toxin/heparin,\ - /datum/reagent/medicine/pen_acid,\ - /datum/reagent/medicine/atropine,\ - /datum/reagent/drug/aranesp,\ - /datum/reagent/drug/krokodil,\ - /datum/reagent/drug/methamphetamine,\ - /datum/reagent/teslium,\ - /datum/reagent/toxin/anacea,\ - /datum/reagent/pax) - - var/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = wanted_reagent.name - description = "CentCom is in desperate need of the chemical [name]. Ship a container of it to be rewarded." - reward += rand(0, 4) * 500 //4000 to 6000 credits - -/datum/bounty/reagent/chemical_complex - name = "Rare Chemical" - reward = 6000 - required_volume = 20 - -/datum/bounty/reagent/chemical_complex/New() - // Reagents that require interaction with multiple departments or are a pain to mix. Lower required_volume since acquiring 30u of some is unrealistic - var/static/list/possible_reagents = list(\ - /datum/reagent/medicine/pyroxadone,\ - /datum/reagent/medicine/rezadone,\ - /datum/reagent/medicine/regen_jelly,\ - /datum/reagent/drug/bath_salts,\ - /datum/reagent/hair_dye,\ - /datum/reagent/consumable/honey,\ - /datum/reagent/consumable/frostoil,\ - /datum/reagent/toxin/slimejelly,\ - /datum/reagent/teslium/energized_jelly,\ - /datum/reagent/toxin/mimesbane,\ - /datum/reagent/medicine/strange_reagent,\ - /datum/reagent/nitroglycerin,\ - /datum/reagent/medicine/rezadone,\ - /datum/reagent/toxin/zombiepowder,\ - /datum/reagent/toxin/ghoulpowder,\ - /datum/reagent/mulligan) - - var/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = wanted_reagent.name - description = "CentCom is paying premium for the chemical [name]. Ship a container of it to be rewarded." - reward += rand(0, 5) * 750 //6000 to 9750 credits - -/datum/bounty/pill - /// quantity of the pills needed, this value acts as minimum, gets randomized on new() - var/required_ammount = 80 - /// counter for pills sent - var/shipped_ammount = 0 - /// reagent requested - var/datum/reagent/wanted_reagent - /// minimum volume of chemical needed, gets randomized on new() - var/wanted_vol = 30 - -/datum/bounty/pill/completion_string() - return {"[shipped_ammount]/[required_ammount] pills"} - -/datum/bounty/pill/can_claim() - return ..() && shipped_ammount >= required_ammount - -/datum/bounty/pill/applies_to(obj/O) - if(!istype(O, /obj/item/reagent_containers/pill)) - return FALSE - if(O?.reagents.get_reagent_amount(wanted_reagent.type) >= wanted_vol) - return TRUE - return FALSE - -/datum/bounty/pill/ship(obj/O) - if(!applies_to(O)) - return - shipped_ammount += 1 - if(shipped_ammount > required_ammount) - shipped_ammount = required_ammount - -/datum/bounty/pill/compatible_with(other_bounty) - if(!istype(other_bounty, /datum/bounty/pill/simple_pill)) - return TRUE - var/datum/bounty/pill/simple_pill/P = other_bounty - return (wanted_reagent.type == P.wanted_reagent.type) && (wanted_vol == P.wanted_vol) - -/datum/bounty/pill/simple_pill - name = "Simple Pill" - reward = 10000 - -/datum/bounty/pill/simple_pill/New() - //reagent that are possible to be chem factory'd - var/static/list/possible_reagents = list(\ - /datum/reagent/medicine/spaceacillin,\ - /datum/reagent/medicine/C2/instabitaluri,\ - /datum/reagent/medicine/pen_acid,\ - /datum/reagent/medicine/atropine,\ - /datum/reagent/medicine/cryoxadone,\ - /datum/reagent/medicine/salbutamol,\ - /datum/reagent/medicine/rhigoxane,\ - /datum/reagent/medicine/trophazole,\ - /datum/reagent/drug/methamphetamine,\ - /datum/reagent/drug/crank,\ - /datum/reagent/nitrous_oxide,\ - /datum/reagent/barbers_aid,\ - /datum/reagent/pax,\ - /datum/reagent/flash_powder,\ - /datum/reagent/phlogiston,\ - /datum/reagent/firefighting_foam) - - var/datum/reagent/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = "[wanted_reagent.name] pills" - required_ammount += rand(1,60) - wanted_vol += rand(1,20) - description = "CentCom requires [required_ammount] of [name] containing at least [wanted_vol] each. Ship a container of it to be rewarded." - reward += rand(1, 5) * 3000 diff --git a/code/modules/cargo/bounties/science.dm b/code/modules/cargo/bounties/science.dm deleted file mode 100644 index 33f334ac472..00000000000 --- a/code/modules/cargo/bounties/science.dm +++ /dev/null @@ -1,66 +0,0 @@ -/datum/bounty/item/science/boh - name = "Bag of Holding" - description = "Nanotrasen would make good use of high-capacity backpacks. If you have any, please ship them." - reward = 10000 - wanted_types = list(/obj/item/storage/backpack/holding) - -/datum/bounty/item/science/tboh - name = "Trash Bag of Holding" - description = "Nanotrasen would make good use of high-capacity trash bags. If you have any, please ship them." - reward = 10000 - wanted_types = list(/obj/item/storage/backpack/holding) - -/datum/bounty/item/science/bluespace_syringe - name = "Bluespace Syringe" - description = "Nanotrasen would make good use of high-capacity syringes. If you have any, please ship them." - reward = 10000 - wanted_types = list(/obj/item/reagent_containers/syringe/bluespace) - -/datum/bounty/item/science/bluespace_body_bag - name = "Bluespace Body Bag" - description = "Nanotrasen would make good use of high-capacity body bags. If you have any, please ship them." - reward = 10000 - wanted_types = list(/obj/item/bodybag/bluespace) - -/datum/bounty/item/science/nightvision_goggles - name = "Night Vision Goggles" - description = "An electrical storm has busted all the lights at CentCom. While management is waiting for replacements, perhaps some night vision goggles can be shipped?" - reward = 10000 - wanted_types = list(/obj/item/clothing/glasses/night, /obj/item/clothing/glasses/meson/night, /obj/item/clothing/glasses/hud/health/night, /obj/item/clothing/glasses/hud/security/night, /obj/item/clothing/glasses/hud/diagnostic/night) - -/datum/bounty/item/science/experimental_welding_tool - name = "Experimental Welding Tool" - description = "A recent accident has left most of CentCom's welding tools exploded. Ship replacements to be rewarded." - reward = 10000 - required_count = 3 - wanted_types = list(/obj/item/weldingtool/experimental) - -/datum/bounty/item/science/cryostasis_beaker - name = "Cryostasis Beaker" - description = "Chemists at Central Command have discovered a new chemical that can only be held in cryostasis beakers. The only problem is they don't have any! Rectify this to receive payment." - reward = 10000 - wanted_types = list(/obj/item/reagent_containers/glass/beaker/noreact) - -/datum/bounty/item/science/diamond_drill - name = "Diamond Mining Drill" - description = "Central Command is willing to pay three months salary in exchange for one diamond mining drill." - reward = 15000 - wanted_types = list(/obj/item/pickaxe/drill/diamonddrill, /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill) - -/datum/bounty/item/science/floor_buffer - name = "Floor Buffer Upgrade" - description = "One of CentCom's janitors made a small fortune betting on carp races. Now they'd like to commission an upgrade to their floor buffer." - reward = 10000 - wanted_types = list(/obj/item/janiupgrade) - -/datum/bounty/item/science/advanced_mop - name = "Advanced Mop" - description = "Excuse me. I'd like to request $17 for a push broom rebristling. Either that, or an advanced mop." - reward = 10000 - wanted_types = list(/obj/item/mop/advanced) - -/datum/bounty/item/science/advanced_egun - name = "Advanced Energy Gun" - description = "With the price of rechargers on the rise, upper management is interested in purchasing guns that are self-powered. If you ship one, they'll pay." - reward = 10000 - wanted_types = list(/obj/item/gun/energy/e_gun/nuclear) diff --git a/code/modules/cargo/bounties/security.dm b/code/modules/cargo/bounties/security.dm deleted file mode 100644 index bcf7b89f3af..00000000000 --- a/code/modules/cargo/bounties/security.dm +++ /dev/null @@ -1,13 +0,0 @@ -/datum/bounty/item/security/riotshotgun - name = "Riot Shotguns" - description = "Hooligans have boarded CentCom! Ship riot shotguns quick, or things are going to get dirty." - reward = 5000 - required_count = 2 - wanted_types = list(/obj/item/gun/ballistic/shotgun/riot) - -/datum/bounty/item/security/recharger - name = "Rechargers" - description = "Nanotrasen military academy is conducting marksmanship exercises. They request that rechargers be shipped." - reward = 2000 - required_count = 3 - wanted_types = list(/obj/machinery/recharger) diff --git a/code/modules/cargo/bounties/slime.dm b/code/modules/cargo/bounties/slime.dm deleted file mode 100644 index 4aa0797c700..00000000000 --- a/code/modules/cargo/bounties/slime.dm +++ /dev/null @@ -1,39 +0,0 @@ -/datum/bounty/item/slime - reward = 3000 - -/datum/bounty/item/slime/New() - ..() - description = "Nanotrasen's science lead is hunting for the rare and exotic [name]. A bounty has been offered for finding it." - reward += rand(0, 4) * 500 - -/datum/bounty/item/slime/green - name = "Green Slime Extract" - wanted_types = list(/obj/item/slime_extract/green) - -/datum/bounty/item/slime/pink - name = "Pink Slime Extract" - wanted_types = list(/obj/item/slime_extract/pink) - -/datum/bounty/item/slime/gold - name = "Gold Slime Extract" - wanted_types = list(/obj/item/slime_extract/gold) - -/datum/bounty/item/slime/oil - name = "Oil Slime Extract" - wanted_types = list(/obj/item/slime_extract/oil) - -/datum/bounty/item/slime/black - name = "Black Slime Extract" - wanted_types = list(/obj/item/slime_extract/black) - -/datum/bounty/item/slime/lightpink - name = "Light Pink Slime Extract" - wanted_types = list(/obj/item/slime_extract/lightpink) - -/datum/bounty/item/slime/adamantine - name = "Adamantine Slime Extract" - wanted_types = list(/obj/item/slime_extract/adamantine) - -/datum/bounty/item/slime/rainbow - name = "Rainbow Slime Extract" - wanted_types = list(/obj/item/slime_extract/rainbow) diff --git a/code/modules/cargo/bounties/special.dm b/code/modules/cargo/bounties/special.dm deleted file mode 100644 index cbbf36c6710..00000000000 --- a/code/modules/cargo/bounties/special.dm +++ /dev/null @@ -1,55 +0,0 @@ -/datum/bounty/item/alien_organs - name = "Alien Organs" - description = "Nanotrasen is interested in studying Xenomorph biology. Ship a set of organs to be thoroughly compensated." - reward = 25000 - required_count = 3 - wanted_types = list(/obj/item/organ/brain/alien, /obj/item/organ/alien, /obj/item/organ/body_egg/alien_embryo, /obj/item/organ/liver/alien, /obj/item/organ/tongue/alien, /obj/item/organ/eyes/night_vision/alien) - -/datum/bounty/item/syndicate_documents - name = "Syndicate Documents" - description = "Intel regarding the syndicate is highly prized at CentCom. If you find syndicate documents, ship them. You could save lives." - reward = 15000 - wanted_types = list(/obj/item/documents/syndicate, /obj/item/documents/photocopy) - -/datum/bounty/item/syndicate_documents/applies_to(obj/O) - if(!..()) - return FALSE - if(istype(O, /obj/item/documents/photocopy)) - var/obj/item/documents/photocopy/Copy = O - return (Copy.copy_type && ispath(Copy.copy_type, /obj/item/documents/syndicate)) - return TRUE - -/datum/bounty/item/adamantine - name = "Adamantine" - description = "Nanotrasen's anomalous materials division is in desparate need for Adamantine. Send them a large shipment and we'll make it worth your while." - reward = 35000 - required_count = 10 - wanted_types = list(/obj/item/stack/sheet/mineral/adamantine) - -/datum/bounty/item/trash - name = "Trash" - description = "Recently a group of janitors have run out of trash to clean up, without any trash Centcom wants to fire them to cut costs. Send a shipment of trash to keep them employed, and they'll give you a small compensation." - reward = 1000 - required_count = 10 - wanted_types = list(/obj/item/trash) - -/datum/bounty/more_bounties - name = "More Bounties" - description = "Complete enough bounties and CentCom will issue new ones!" - reward = 5 // number of bounties - var/required_bounties = 5 - -/datum/bounty/more_bounties/can_claim() - return ..() && completed_bounty_count() >= required_bounties - -/datum/bounty/more_bounties/completion_string() - return "[min(required_bounties, completed_bounty_count())]/[required_bounties] Bounties" - -/datum/bounty/more_bounties/reward_string() - return "Up to [reward] new bounties" - -/datum/bounty/more_bounties/claim() - if(can_claim()) - claimed = TRUE - for(var/i = 0; i < reward; ++i) - try_add_bounty(random_bounty()) diff --git a/code/modules/cargo/bounties/virus.dm b/code/modules/cargo/bounties/virus.dm deleted file mode 100644 index 8f078a2668b..00000000000 --- a/code/modules/cargo/bounties/virus.dm +++ /dev/null @@ -1,81 +0,0 @@ -/datum/bounty/virus - reward = 5000 - var/shipped = FALSE - var/stat_value = 0 - var/stat_name = "" - -/datum/bounty/virus/New() - ..() - stat_value = rand(4, 11) - if(rand(3) == 1) - stat_value *= -1 - name = "Virus ([stat_name] of [stat_value])" - description = "Nanotrasen is interested in a virus with a [stat_name] stat of exactly [stat_value]. Central Command will pay handsomely for such a virus." - reward += rand(0, 4) * 500 - -/datum/bounty/virus/completion_string() - return shipped ? "Shipped" : "Not Shipped" - -/datum/bounty/virus/can_claim() - return ..() && shipped - -/datum/bounty/virus/applies_to(obj/O) - if(shipped) - return FALSE - if(O.flags_1 & HOLOGRAM_1) - return FALSE - if(!istype(O, /obj/item/reagent_containers || !O.reagents || !O.reagents.reagent_list)) - return FALSE - var/datum/reagent/blood/B = locate() in O.reagents.reagent_list - if(!B) - return FALSE - for(var/V in B.get_diseases()) - if(!istype(V, /datum/disease/advance)) - continue - if(accepts_virus(V)) - return TRUE - return FALSE - -/datum/bounty/virus/ship(obj/O) - if(!applies_to(O)) - return - shipped = TRUE - -/datum/bounty/virus/compatible_with(datum/other_bounty) - if(!istype(other_bounty, /datum/bounty/virus)) - return TRUE - var/datum/bounty/virus/V = other_bounty - return type != V.type || stat_value != V.stat_value - - -/datum/bounty/virus/proc/accepts_virus(V) - return TRUE - -/datum/bounty/virus/resistance - stat_name = "resistance" - -/datum/bounty/virus/resistance/accepts_virus(V) - var/datum/disease/advance/A = V - return A.totalResistance() == stat_value - -/datum/bounty/virus/stage_speed - stat_name = "stage speed" - -/datum/bounty/virus/stage_speed/accepts_virus(V) - var/datum/disease/advance/A = V - return A.totalStageSpeed() == stat_value - -/datum/bounty/virus/stealth - stat_name = "stealth" - -/datum/bounty/virus/stealth/accepts_virus(V) - var/datum/disease/advance/A = V - return A.totalStealth() == stat_value - -/datum/bounty/virus/transmit - stat_name = "transmissible" - -/datum/bounty/virus/transmit/accepts_virus(V) - var/datum/disease/advance/A = V - return A.totalTransmittable() == stat_value - diff --git a/code/modules/cargo/bounty.dm b/code/modules/cargo/bounty.dm deleted file mode 100644 index 118cd038144..00000000000 --- a/code/modules/cargo/bounty.dm +++ /dev/null @@ -1,180 +0,0 @@ -GLOBAL_LIST_EMPTY(bounties_list) - -/datum/bounty - var/name - var/description - var/reward = 1000 // In credits. - var/claimed = FALSE - var/high_priority = FALSE - -// Displayed on bounty UI screen. -/datum/bounty/proc/completion_string() - return "" - -// Displayed on bounty UI screen. -/datum/bounty/proc/reward_string() - return "[reward] Credits" - -/datum/bounty/proc/can_claim() - return !claimed - -// Called when the claim button is clicked. Override to provide fancy rewards. -/datum/bounty/proc/claim() - if(can_claim()) - var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) - if(D) - D.adjust_money(reward) - claimed = TRUE - -// If an item sent in the cargo shuttle can satisfy the bounty. -/datum/bounty/proc/applies_to(obj/O) - return FALSE - -// Called when an object is shipped on the cargo shuttle. -/datum/bounty/proc/ship(obj/O) - return - -// When randomly generating the bounty list, duplicate bounties must be avoided. -// This proc is used to determine if two bounties are duplicates, or incompatible in general. -/datum/bounty/proc/compatible_with(other_bounty) - return TRUE - -/datum/bounty/proc/mark_high_priority(scale_reward = 2) - if(high_priority) - return - high_priority = TRUE - reward = round(reward * scale_reward) - -// This proc is called when the shuttle docks at CentCom. -// It handles items shipped for bounties. -/proc/bounty_ship_item_and_contents(atom/movable/AM, dry_run=FALSE) - if(!GLOB.bounties_list.len) - setup_bounties() - - var/list/matched_one = FALSE - for(var/thing in reverseRange(AM.GetAllContents())) - var/matched_this = FALSE - for(var/datum/bounty/B in GLOB.bounties_list) - if(B.applies_to(thing)) - matched_one = TRUE - matched_this = TRUE - if(!dry_run) - B.ship(thing) - if(!dry_run && matched_this) - qdel(thing) - return matched_one - -// Returns FALSE if the bounty is incompatible with the current bounties. -/proc/try_add_bounty(datum/bounty/new_bounty) - if(!new_bounty || !new_bounty.name || !new_bounty.description) - return FALSE - for(var/i in GLOB.bounties_list) - var/datum/bounty/B = i - if(!B.compatible_with(new_bounty) || !new_bounty.compatible_with(B)) - return FALSE - GLOB.bounties_list += new_bounty - return TRUE - -// Returns a new bounty of random type, but does not add it to GLOB.bounties_list. -/proc/random_bounty() - switch(rand(1, 13)) - if(1) - var/subtype = pick(subtypesof(/datum/bounty/item/assistant)) - return new subtype - if(2) - var/subtype = pick(subtypesof(/datum/bounty/item/mech)) - return new subtype - if(3) - var/subtype = pick(subtypesof(/datum/bounty/item/chef)) - return new subtype - if(4) - var/subtype = pick(subtypesof(/datum/bounty/item/security)) - return new subtype - if(5) - if(rand(2) == 1) - return new /datum/bounty/reagent/simple_drink - return new /datum/bounty/reagent/complex_drink - if(6) - if(rand(2) == 1) - return new /datum/bounty/reagent/chemical_simple - return new /datum/bounty/reagent/chemical_complex - if(7) - var/subtype = pick(subtypesof(/datum/bounty/virus)) - return new subtype - if(8) - var/subtype = pick(subtypesof(/datum/bounty/item/science)) - return new subtype - if(9) - var/subtype = pick(subtypesof(/datum/bounty/item/slime)) - return new subtype - if(10) - var/subtype = pick(subtypesof(/datum/bounty/item/engineering)) - return new subtype - if(11) - var/subtype = pick(subtypesof(/datum/bounty/item/mining)) - return new subtype - if(12) - var/subtype = pick(subtypesof(/datum/bounty/item/medical)) - return new subtype - -// Called lazily at startup to populate GLOB.bounties_list with random bounties. -/proc/setup_bounties() - - var/pick // instead of creating it a bunch let's go ahead and toss it here, we know we're going to use it for dynamics and subtypes! - - /********************************Subtype Gens********************************/ - var/list/easy_add_list_subtypes = list(/datum/bounty/item/assistant = 2, - /datum/bounty/item/mech = 1, - /datum/bounty/item/chef = 2, - /datum/bounty/item/security = 1, - /datum/bounty/virus = 1, - /datum/bounty/item/engineering = 1, - /datum/bounty/item/mining = 2, - /datum/bounty/item/medical = 2) - - for(var/the_type in easy_add_list_subtypes) - for(var/i in 1 to easy_add_list_subtypes[the_type]) - pick = pick(subtypesof(the_type)) - try_add_bounty(new pick) - - /********************************Strict Type Gens********************************/ - var/list/easy_add_list_strict_types = list(/datum/bounty/reagent/simple_drink = 1, - /datum/bounty/reagent/complex_drink = 1, - /datum/bounty/reagent/chemical_simple = 1, - /datum/bounty/reagent/chemical_complex = 1, - /datum/bounty/pill/simple_pill = 1) - - for(var/the_strict_type in easy_add_list_strict_types) - for(var/i in 1 to easy_add_list_strict_types[the_strict_type]) - try_add_bounty(new the_strict_type) - - /********************************Dynamic Gens********************************/ - - for(var/i in 0 to 1) - if(prob(50)) - pick = pick(subtypesof(/datum/bounty/item/slime)) - else - pick = pick(subtypesof(/datum/bounty/item/science)) - try_add_bounty(new pick) - - /********************************Cutoff for Non-Low Priority Bounties********************************/ - var/datum/bounty/B = pick(GLOB.bounties_list) - B.mark_high_priority() - - /********************************Low Priority Gens********************************/ - var/list/low_priority_strict_type_list = list( /datum/bounty/item/alien_organs, - /datum/bounty/item/syndicate_documents, - /datum/bounty/item/adamantine, - /datum/bounty/item/trash, - /datum/bounty/more_bounties) - - for(var/low_priority_bounty in low_priority_strict_type_list) - try_add_bounty(new low_priority_bounty) - -/proc/completed_bounty_count() - var/count = 0 - for(var/i in GLOB.bounties_list) - var/datum/bounty/B = i - if(B.claimed) - ++count - return count diff --git a/code/modules/cargo/bounty_console.dm b/code/modules/cargo/bounty_console.dm deleted file mode 100644 index ff869ed4686..00000000000 --- a/code/modules/cargo/bounty_console.dm +++ /dev/null @@ -1,96 +0,0 @@ -#define PRINTER_TIMEOUT 10 - - - -/obj/machinery/computer/bounty - name = "Nanotrasen bounty console" - desc = "" - icon_screen = "bounty" - circuit = /obj/item/circuitboard/computer/bounty - light_color = "#E2853D"//orange - var/printer_ready = 0 //cooldown var - -/obj/machinery/computer/bounty/Initialize() - . = ..() - printer_ready = world.time + PRINTER_TIMEOUT - -/obj/machinery/computer/bounty/proc/print_paper() - new /obj/item/paper/bounty_printout(loc) - -/obj/item/paper/bounty_printout - name = "paper - Bounties" - -/obj/item/paper/bounty_printout/Initialize() - . = ..() - info = "

    Nanotrasen Cargo Bounties


    " - update_icon() - - for(var/datum/bounty/B in GLOB.bounties_list) - if(B.claimed) - continue - info += {"

    [B.name]

    -
    • Reward: [B.reward_string()]
    • -
    • Completed: [B.completion_string()]
    "} - -/obj/machinery/computer/bounty/ui_interact(mob/user) - . = ..() - - if(!GLOB.bounties_list.len) - setup_bounties() - - var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) - var/list/dat = list({"Refresh - Print Paper -

    Credits: [D.account_balance]

    - - "}) - for(var/datum/bounty/B in GLOB.bounties_list) - if(B.claimed) - dat += "" - else if(B.can_claim()) - dat += "" - else - dat += "" - - if(B.high_priority) - dat += {" - - "} - else - dat += {" - - "} - dat += "" - if(B.claimed) - dat += "" - else if(B.can_claim()) - dat += "" - else - dat += "" - dat += "" - dat += "
    NameDescriptionRewardCompletionStatus
    [B.name]High Priority: [B.description][B.reward_string()][B.name][B.description][B.reward_string()][B.completion_string()]ClaimedClaimUnclaimed
    " - dat = dat.Join() - var/datum/browser/popup = new(user, "bounties", "Nanotrasen Bounties", 700, 600) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - -/obj/machinery/computer/bounty/Topic(href, href_list) - if(..()) - return - - switch(href_list["choice"]) - if("Print") - if(printer_ready < world.time) - printer_ready = world.time + PRINTER_TIMEOUT - print_paper() - - if("Claim") - var/datum/bounty/B = locate(href_list["d_rec"]) in GLOB.bounties_list - if(B) - B.claim() - - if(href_list["refresh"]) - playsound(src, "terminal_type", 25, FALSE) - - updateUsrDialog() diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm index 1d7f88e6383..6fb1e45708c 100644 --- a/code/modules/cargo/centcom_podlauncher.dm +++ b/code/modules/cargo/centcom_podlauncher.dm @@ -499,7 +499,6 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm if (isnull(A)) //If theres no supplypod bay mapped into centcom, throw an error to_chat(holder.mob, "No /area/centcom/supplypod/loading/one (or /two or /three or /four) in the world! You can make one myself (then refresh) for now, but yell at a mapper to fix this, today!") CRASH("No /area/centcom/supplypod/loading/one (or /two or /three or /four) has been mapped into the centcom z-level!") - return orderedArea = list() if (!isemptylist(A.contents)) //Go through the area passed into the proc, and figure out the top left and bottom right corners by calculating max and min values var/startX = A.contents[1].x //Create the four values (we do it off a.contents[1] so they have some sort of arbitrary initial value. They should be overwritten in a few moments) diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm deleted file mode 100644 index 47a7d66ba31..00000000000 --- a/code/modules/cargo/console.dm +++ /dev/null @@ -1,246 +0,0 @@ -/obj/machinery/computer/cargo - name = "supply console" - desc = "" - icon_screen = "supply" - circuit = /obj/item/circuitboard/computer/cargo - ui_x = 780 - ui_y = 750 - - var/requestonly = FALSE - var/contraband = FALSE - var/self_paid = FALSE - var/safety_warning = "For safety reasons, the automated supply shuttle \ - cannot transport live organisms, human remains, classified nuclear weaponry, \ - homing beacons or machinery housing any form of artificial intelligence." - var/blockade_warning = "Bluespace instability detected. Shuttle movement impossible." - /// radio used by the console to send messages on supply channel - var/obj/item/radio/headset/radio - /// var that tracks message cooldown - var/message_cooldown - - light_color = "#E2853D"//orange - -/obj/machinery/computer/cargo/request - name = "supply request console" - desc = "" - icon_screen = "request" - circuit = /obj/item/circuitboard/computer/cargo/request - requestonly = TRUE - -/obj/machinery/computer/cargo/Initialize() - . = ..() - radio = new /obj/item/radio/headset/headset_cargo(src) - var/obj/item/circuitboard/computer/cargo/board = circuit - contraband = board.contraband - if (board.obj_flags & EMAGGED) - obj_flags |= EMAGGED - else - obj_flags &= ~EMAGGED - -/obj/machinery/computer/cargo/Destroy() - QDEL_NULL(radio) - ..() - -/obj/machinery/computer/cargo/proc/get_export_categories() - . = EXPORT_CARGO - if(contraband) - . |= EXPORT_CONTRABAND - if(obj_flags & EMAGGED) - . |= EXPORT_EMAG - -/obj/machinery/computer/cargo/emag_act(mob/user) - if(obj_flags & EMAGGED) - return - user.visible_message(span_warning("[user] swipes a suspicious card through [src]!"), - span_notice("I adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.")) - - obj_flags |= EMAGGED - contraband = TRUE - - // This also permamently sets this on the circuit board - var/obj/item/circuitboard/computer/cargo/board = circuit - board.contraband = TRUE - board.obj_flags |= EMAGGED - update_static_data(user) - -/obj/machinery/computer/cargo/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ - datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) - if(!ui) - ui = new(user, src, ui_key, "cargo", name, ui_x, ui_y, master_ui, state) - ui.open() - -/obj/machinery/computer/cargo/ui_data() - var/list/data = list() - data["location"] = SSshuttle.supply.getStatusText() - var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) - if(D) - data["points"] = D.account_balance - data["away"] = SSshuttle.supply.getDockedId() == "supply_away" - data["self_paid"] = self_paid - data["docked"] = SSshuttle.supply.mode == SHUTTLE_IDLE - var/message = "Remember to stamp and send back the supply manifests." - if(SSshuttle.centcom_message) - message = SSshuttle.centcom_message - if(SSshuttle.supplyBlocked) - message = blockade_warning - data["message"] = message - data["cart"] = list() - for(var/datum/supply_order/SO in SSshuttle.shoppinglist) - data["cart"] += list(list( - "object" = SO.pack.name, - "cost" = SO.pack.cost, - "id" = SO.id, - "orderer" = SO.orderer, - "paid" = !isnull(SO.paying_account) //paid by requester - )) - - data["requests"] = list() - for(var/datum/supply_order/SO in SSshuttle.requestlist) - data["requests"] += list(list( - "object" = SO.pack.name, - "cost" = SO.pack.cost, - "orderer" = SO.orderer, - "reason" = SO.reason, - "id" = SO.id - )) - - return data - -/obj/machinery/computer/cargo/ui_static_data(mob/user) - var/list/data = list() - data["requestonly"] = requestonly - data["supplies"] = list() - for(var/pack in SSshuttle.supply_packs) - var/datum/supply_pack/P = SSshuttle.supply_packs[pack] - if(!data["supplies"][P.group]) - data["supplies"][P.group] = list( - "name" = P.group, - "packs" = list() - ) - if((P.hidden && !(obj_flags & EMAGGED)) || (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.DropPodOnly) - continue - data["supplies"][P.group]["packs"] += list(list( - "name" = P.name, - "cost" = P.cost, - "id" = pack, - "desc" = P.desc || P.name, // If there is a description, use it. Otherwise use the pack's name. - "small_item" = P.small_item, - "access" = P.access - )) - return data - -/obj/machinery/computer/cargo/ui_act(action, params, datum/tgui/ui) - if(..()) - return - switch(action) - if("send") - if(!SSshuttle.supply.canMove()) - say(safety_warning) - return - if(SSshuttle.supplyBlocked) - say(blockade_warning) - return - if(SSshuttle.supply.getDockedId() == "supply_home") - SSshuttle.supply.export_categories = get_export_categories() - SSshuttle.moveShuttle("supply", "supply_away", TRUE) - say("The supply shuttle is departing.") - investigate_log("[key_name(usr)] sent the supply shuttle away.", INVESTIGATE_CARGO) - else - investigate_log("[key_name(usr)] called the supply shuttle.", INVESTIGATE_CARGO) - say("The supply shuttle has been called and will arrive in [SSshuttle.supply.timeLeft(600)] minutes.") - SSshuttle.moveShuttle("supply", "supply_home", TRUE) - . = TRUE - if("add") - var/id = text2path(params["id"]) - var/datum/supply_pack/pack = SSshuttle.supply_packs[id] - if(!istype(pack)) - return - if((pack.hidden && !(obj_flags & EMAGGED)) || (pack.contraband && !contraband) || pack.DropPodOnly) - return - - var/name = "*None Provided*" - var/rank = "*None Provided*" - var/ckey = usr.ckey - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - name = H.get_authentification_name() - rank = H.get_assignment(hand_first = TRUE) - else if(issilicon(usr)) - name = usr.real_name - rank = "Silicon" - - var/datum/bank_account/account - if(self_paid && ishuman(usr)) - var/mob/living/carbon/human/H = usr - var/obj/item/card/id/id_card = H.get_idcard(TRUE) - if(!istype(id_card)) - say("No ID card detected.") - return - account = id_card.registered_account - if(!istype(account)) - say("Invalid bank account.") - return - - var/reason = "" - if(requestonly && !self_paid) - reason = stripped_input("Reason:", name, "") - if(isnull(reason) || ..()) - return - - var/turf/T = get_turf(src) - var/datum/supply_order/SO = new(pack, name, rank, ckey, reason, account) - SO.generateRequisition(T) - if(requestonly && !self_paid) - SSshuttle.requestlist += SO - else - SSshuttle.shoppinglist += SO - if(self_paid) - say("Order processed. The price will be charged to [account.account_holder]'s bank account on delivery.") - if(requestonly && message_cooldown < world.time) - radio.talk_into(src, "A new order has been requested.", RADIO_CHANNEL_SUPPLY) - message_cooldown = world.time + 30 SECONDS - . = TRUE - if("remove") - var/id = text2num(params["id"]) - for(var/datum/supply_order/SO in SSshuttle.shoppinglist) - if(SO.id == id) - SSshuttle.shoppinglist -= SO - . = TRUE - break - if("clear") - SSshuttle.shoppinglist.Cut() - . = TRUE - if("approve") - var/id = text2num(params["id"]) - for(var/datum/supply_order/SO in SSshuttle.requestlist) - if(SO.id == id) - SSshuttle.requestlist -= SO - SSshuttle.shoppinglist += SO - . = TRUE - break - if("deny") - var/id = text2num(params["id"]) - for(var/datum/supply_order/SO in SSshuttle.requestlist) - if(SO.id == id) - SSshuttle.requestlist -= SO - . = TRUE - break - if("denyall") - SSshuttle.requestlist.Cut() - . = TRUE - if("toggleprivate") - self_paid = !self_paid - . = TRUE - if(.) - post_signal("supply") - -/obj/machinery/computer/cargo/proc/post_signal(command) - - var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS) - - if(!frequency) - return - - var/datum/signal/status_signal = new(list("command" = command)) - frequency.post_signal(src, status_signal) diff --git a/code/modules/cargo/export_scanner.dm b/code/modules/cargo/export_scanner.dm deleted file mode 100644 index 8a43e8a4a63..00000000000 --- a/code/modules/cargo/export_scanner.dm +++ /dev/null @@ -1,45 +0,0 @@ -/obj/item/export_scanner - name = "export scanner" - desc = "" - icon = 'icons/obj/device.dmi' - icon_state = "export_scanner" - item_state = "radio" - lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' - righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' - item_flags = NOBLUDGEON - w_class = WEIGHT_CLASS_SMALL - siemens_coefficient = 1 - var/obj/machinery/computer/cargo/cargo_console = null - -/obj/item/export_scanner/examine(user) - . = ..() - if(!cargo_console) - . += span_notice("[src] is not currently linked to a cargo console.") - -/obj/item/export_scanner/afterattack(obj/O, mob/user, proximity) - . = ..() - if(!istype(O) || !proximity) - return - - if(istype(O, /obj/machinery/computer/cargo)) - var/obj/machinery/computer/cargo/C = O - if(!C.requestonly) - cargo_console = C - to_chat(user, span_notice("Scanner linked to [C].")) - else if(!istype(cargo_console)) - to_chat(user, span_warning("I must link [src] to a cargo console first!")) - else - // Before you fix it: - // yes, checking manifests is a part of intended functionality. - - var/datum/export_report/ex = export_item_and_contents(O, cargo_console.get_export_categories(), dry_run=TRUE) - var/price = 0 - for(var/x in ex.total_amount) - price += ex.total_value[x] - - if(price) - to_chat(user, span_notice("Scanned [O], value: [price] credits[O.contents.len ? " (contents included)" : ""].")) - else - to_chat(user, span_warning("Scanned [O], no export value.")) - if(bounty_ship_item_and_contents(O, dry_run=TRUE)) - to_chat(user, span_notice("Scanned item is eligible for one or more bounties.")) diff --git a/code/modules/cargo/exports/parts.dm b/code/modules/cargo/exports/parts.dm index e6fda5f6b10..897b59552f8 100644 --- a/code/modules/cargo/exports/parts.dm +++ b/code/modules/cargo/exports/parts.dm @@ -14,8 +14,3 @@ cost = 150 unit_name = "solar panel control board" export_types = list(/obj/item/circuitboard/computer/solar_control) - -/datum/export/swarmer - cost = 2000 - unit_name = "deactivated alien deconstruction drone" - export_types = list(/obj/item/deactivated_swarmer) diff --git a/code/modules/cargo/exports/sheets.dm b/code/modules/cargo/exports/sheets.dm index 1c666a4db4d..b8a490b823b 100644 --- a/code/modules/cargo/exports/sheets.dm +++ b/code/modules/cargo/exports/sheets.dm @@ -48,11 +48,6 @@ unit_name = "gondola hide" export_types = list(/obj/item/stack/sheet/animalhide/gondola) -/datum/export/stack/skin/xeno - cost = 500 - unit_name = "alien hide" - export_types = list(/obj/item/stack/sheet/animalhide/xeno) - // Common materials. // For base materials, see materials.dm @@ -92,10 +87,3 @@ cost = 0.2 unit_name = "cable piece" export_types = list(/obj/item/stack/cable_coil) - -// Weird Stuff - -/datum/export/stack/abductor - cost = 1000 - message = "of alien alloy" - export_types = list(/obj/item/stack/sheet/mineral/abductor) diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm deleted file mode 100644 index 1f948723e16..00000000000 --- a/code/modules/cargo/expressconsole.dm +++ /dev/null @@ -1,215 +0,0 @@ -#define MAX_EMAG_ROCKETS 8 -#define BEACON_COST 500 -#define SP_LINKED 1 -#define SP_READY 2 -#define SP_LAUNCH 3 -#define SP_UNLINK 4 -#define SP_UNREADY 5 - -/obj/machinery/computer/cargo/express - name = "express supply console" - desc = "This console allows the user to purchase a package \ - with 1/40th of the delivery time: made possible by NanoTrasen's new \"1500mm Orbital Railgun\".\ - All sales are near instantaneous - please choose carefully" - icon_screen = "supply_express" - circuit = /obj/item/circuitboard/computer/cargo/express - ui_x = 600 - ui_y = 700 - blockade_warning = "Bluespace instability detected. Delivery impossible." - req_access = list(ACCESS_QM) - - var/message - var/printed_beacons = 0 //number of beacons printed. Used to determine beacon names. - var/list/meme_pack_data - var/obj/item/supplypod_beacon/beacon //the linked supplypod beacon - var/area/landingzone = /area/quartermaster/storage //where we droppin boys - var/podType = /obj/structure/closet/supplypod - var/cooldown = 0 //cooldown to prevent printing supplypod beacon spam - var/locked = TRUE //is the console locked? unlock with ID - var/usingBeacon = FALSE //is the console in beacon mode? exists to let beacon know when a pod may come in - -/obj/machinery/computer/cargo/express/Initialize() - . = ..() - packin_up() - -/obj/machinery/computer/cargo/express/Destroy() - if(beacon) - beacon.unlink_console() - return ..() - -/obj/machinery/computer/cargo/express/attackby(obj/item/W, mob/living/user, params) - if((istype(W, /obj/item/card/id) || istype(W, /obj/item/pda)) && allowed(user)) - locked = !locked - to_chat(user, span_notice("I [locked ? "lock" : "unlock"] the interface.")) - return - else if(istype(W, /obj/item/disk/cargo/bluespace_pod)) - podType = /obj/structure/closet/supplypod/bluespacepod//doesnt effect circuit board, making reversal possible - to_chat(user, span_notice("I insert the disk into [src], allowing for advanced supply delivery vehicles.")) - qdel(W) - return TRUE - else if(istype(W, /obj/item/supplypod_beacon)) - var/obj/item/supplypod_beacon/sb = W - if (sb.express_console != src) - sb.link_console(src, user) - return TRUE - else - to_chat(user, span_alert("[src] is already linked to [sb].")) - ..() - -/obj/machinery/computer/cargo/express/emag_act(mob/living/user) - if(obj_flags & EMAGGED) - return - user.visible_message(span_warning("[user] swipes a suspicious card through [src]!"), - span_notice("I change the routing protocols, allowing the Supply Pod to land anywhere on the station.")) - obj_flags |= EMAGGED - // This also sets this on the circuit board - var/obj/item/circuitboard/computer/cargo/board = circuit - board.obj_flags |= EMAGGED - packin_up() - -/obj/machinery/computer/cargo/express/proc/packin_up() // oh shit, I'm sorry - meme_pack_data = list() // sorry for what? - for(var/pack in SSshuttle.supply_packs) // our quartermaster taught us not to be ashamed of our supply packs - var/datum/supply_pack/P = SSshuttle.supply_packs[pack] // specially since they're such a good price and all - if(!meme_pack_data[P.group]) // yeah, I see that, your quartermaster gave you good advice - meme_pack_data[P.group] = list( // it gets cheaper when I return it - "name" = P.group, // mmhm - "packs" = list() // sometimes, I return it so much, I rip the manifest - ) // see, my quartermaster taught me a few things too - if((P.hidden) || (P.special)) // like, how not to rip the manifest - continue// by using someone else's crate - if(!(obj_flags & EMAGGED) && P.contraband) // will you show me? - continue // i'd be right happy to - meme_pack_data[P.group]["packs"] += list(list( - "name" = P.name, - "cost" = P.cost, - "id" = pack, - "desc" = P.desc || P.name // If there is a description, use it. Otherwise use the pack's name. - )) - -/obj/machinery/computer/cargo/express/ui_interact(mob/living/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) // Remember to use the appropriate state. - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) - if(!ui) - ui = new(user, src, ui_key, "cargo_express", name, ui_x, ui_y, master_ui, state) - ui.open() - -/obj/machinery/computer/cargo/express/ui_data(mob/user) - var/canBeacon = beacon && (isturf(beacon.loc) || ismob(beacon.loc))//is the beacon in a valid location? - var/list/data = list() - var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) - if(D) - data["points"] = D.account_balance - data["locked"] = locked//swipe an ID to unlock - data["siliconUser"] = user.has_unlimited_silicon_privilege - data["beaconzone"] = beacon ? get_area(beacon) : ""//where is the beacon located? outputs in the tgui - data["usingBeacon"] = usingBeacon //is the mode set to deliver to the beacon or the cargobay? - data["canBeacon"] = !usingBeacon || canBeacon //is the mode set to beacon delivery, and is the beacon in a valid location? - data["canBuyBeacon"] = cooldown <= 0 && D.account_balance >= BEACON_COST - data["beaconError"] = usingBeacon && !canBeacon ? "(BEACON ERROR)" : ""//changes button text to include an error alert if necessary - data["hasBeacon"] = beacon != null//is there a linked beacon? - data["beaconName"] = beacon ? beacon.name : "No Beacon Found" - data["printMsg"] = cooldown > 0 ? "Print Beacon for [BEACON_COST] credits ([cooldown])" : "Print Beacon for [BEACON_COST] credits"//buttontext for printing beacons - data["supplies"] = list() - message = "Sales are near-instantaneous - please choose carefully." - if(SSshuttle.supplyBlocked) - message = blockade_warning - if(usingBeacon && !beacon) - message = "BEACON ERROR: BEACON MISSING"//beacon was destroyed - else if (usingBeacon && !canBeacon) - message = "BEACON ERROR: MUST BE EXPOSED"//beacon's loc/user's loc must be a turf - if(obj_flags & EMAGGED) - message = "(&!#@ERROR: ROUTING_#PROTOCOL MALF(*CT#ON. $UG%ESTE@ ACT#0N: !^/PULS3-%E)ET CIR*)ITB%ARD." - data["message"] = message - if(!meme_pack_data) - packin_up() - stack_trace("You didn't give the cargo tech good advice, and he ripped the manifest. As a result, there was no pack data for [src]") - data["supplies"] = meme_pack_data - if (cooldown > 0)//cooldown used for printing beacons - cooldown-- - return data - -/obj/machinery/computer/cargo/express/ui_act(action, params, datum/tgui/ui) - switch(action) - if("LZCargo") - usingBeacon = FALSE - if (beacon) - beacon.update_status(SP_UNREADY) //ready light on beacon will turn off - if("LZBeacon") - usingBeacon = TRUE - if (beacon) - beacon.update_status(SP_READY) //turns on the beacon's ready light - if("printBeacon") - var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) - if(D) - if(D.adjust_money(-BEACON_COST)) - cooldown = 10//a ~ten second cooldown for printing beacons to prevent spam - var/obj/item/supplypod_beacon/C = new /obj/item/supplypod_beacon(drop_location()) - C.link_console(src, usr)//rather than in beacon's Initialize(), we can assign the computer to the beacon by reusing this proc) - printed_beacons++//printed_beacons starts at 0, so the first one out will be called beacon # 1 - beacon.name = "Supply Pod Beacon #[printed_beacons]" - - - if("add")//Generate Supply Order first - var/id = text2path(params["id"]) - var/datum/supply_pack/pack = SSshuttle.supply_packs[id] - if(!istype(pack)) - return - var/name = "*None Provided*" - var/rank = "*None Provided*" - var/ckey = usr.ckey - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - name = H.get_authentification_name() - rank = H.get_assignment(hand_first = TRUE) - else if(issilicon(usr)) - name = usr.real_name - rank = "Silicon" - var/reason = "" - var/list/empty_turfs - var/datum/supply_order/SO = new(pack, name, rank, ckey, reason) - var/points_to_check - var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) - if(D) - points_to_check = D.account_balance - if(!(obj_flags & EMAGGED)) - if(SO.pack.cost <= points_to_check) - var/LZ - if (istype(beacon) && usingBeacon)//prioritize beacons over landing in cargobay - LZ = get_turf(beacon) - beacon.update_status(SP_LAUNCH) - else if (!usingBeacon)//find a suitable supplypod landing zone in cargobay - landingzone = GLOB.areas_by_type[/area/quartermaster/storage] - if (!landingzone) - WARNING("[src] couldnt find a Quartermaster/Storage (aka cargobay) area on the station, and as such it has set the supplypod landingzone to the area it resides in.") - landingzone = get_area(src) - for(var/turf/open/floor/T in landingzone.contents)//uses default landing zone - if(is_blocked_turf(T)) - continue - LAZYADD(empty_turfs, T) - CHECK_TICK - if(empty_turfs && empty_turfs.len) - LZ = pick(empty_turfs) - if (SO.pack.cost <= points_to_check && LZ)//we need to call the cost check again because of the CHECK_TICK call - D.adjust_money(-SO.pack.cost) - new /obj/effect/DPtarget(LZ, podType, SO) - . = TRUE - update_icon() - else - if(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS) <= points_to_check) // bulk discount :^) - landingzone = GLOB.areas_by_type[pick(GLOB.the_station_areas)] //override default landing zone - for(var/turf/open/floor/T in landingzone.contents) - if(is_blocked_turf(T)) - continue - LAZYADD(empty_turfs, T) - CHECK_TICK - if(empty_turfs && empty_turfs.len) - D.adjust_money(-(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS))) - - SO.generateRequisition(get_turf(src)) - for(var/i in 1 to MAX_EMAG_ROCKETS) - var/LZ = pick(empty_turfs) - LAZYREMOVE(empty_turfs, LZ) - new /obj/effect/DPtarget(LZ, podType, SO) - . = TRUE - update_icon() - CHECK_TICK diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packsrogue/_pack.dm similarity index 100% rename from code/modules/cargo/packs.dm rename to code/modules/cargo/packsrogue/_pack.dm diff --git a/code/modules/cargo/packsrogue/_rogue.dm b/code/modules/cargo/packsrogue/_rogue.dm index 888fcb56e50..0e1b150b9ea 100644 --- a/code/modules/cargo/packsrogue/_rogue.dm +++ b/code/modules/cargo/packsrogue/_rogue.dm @@ -11,4 +11,4 @@ if(cost == initial(cost) && !static_cost) var/na = max(round(cost * randomprice_factor, 1), 1) cost = max(rand(cost-na, cost+na), 1) -#endif \ No newline at end of file +#endif diff --git a/code/modules/cargo/supplypod_beacon.dm b/code/modules/cargo/supplypod_beacon.dm deleted file mode 100644 index 192a4f93b0b..00000000000 --- a/code/modules/cargo/supplypod_beacon.dm +++ /dev/null @@ -1,95 +0,0 @@ -/obj/item/supplypod_beacon - name = "Supply Pod Beacon" - desc = "" - icon = 'icons/obj/device.dmi' - icon_state = "supplypod_beacon" - item_state = "radio" - lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' - righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' - w_class = WEIGHT_CLASS_SMALL - var/obj/machinery/computer/cargo/express/express_console - var/linked = FALSE - var/ready = FALSE - var/launched = FALSE - -/obj/item/supplypod_beacon/proc/update_status(consoleStatus) - switch(consoleStatus) - if (SP_LINKED) - linked = TRUE - playsound(src,'sound/blank.ogg',50,FALSE) - if (SP_READY) - ready = TRUE - if (SP_LAUNCH) - launched = TRUE - playsound(src,'sound/blank.ogg',50,FALSE) - playsound(src,'sound/blank.ogg',50,FALSE) - addtimer(CALLBACK(src, PROC_REF(endLaunch)), 33)//wait 3.3 seconds (time it takes for supplypod to land), then update icon - if (SP_UNLINK) - linked = FALSE - playsound(src,'sound/blank.ogg',50,FALSE) - if (SP_UNREADY) - ready = FALSE - update_icon() - -/obj/item/supplypod_beacon/update_icon() - cut_overlays() - if (launched) - add_overlay("sp_green") - else if (ready) - add_overlay("sp_yellow") - else if (linked) - add_overlay("sp_orange") - -/obj/item/supplypod_beacon/proc/endLaunch() - launched = FALSE - update_status() - -/obj/item/supplypod_beacon/examine(user) - . = ..() - if(!express_console) - . += span_notice("[src] is not currently linked to an Express Supply console.") - else - . += span_notice("Alt-click to unlink it from the Express Supply console.") - -/obj/item/supplypod_beacon/Destroy() - if(express_console) - express_console.beacon = null - return ..() - -/obj/item/supplypod_beacon/proc/unlink_console() - if(express_console) - express_console.beacon = null - express_console = null - update_status(SP_UNLINK) - update_status(SP_UNREADY) - -/obj/item/supplypod_beacon/proc/link_console(obj/machinery/computer/cargo/express/C, mob/living/user) - if (C.beacon)//if new console has a beacon, then... - C.beacon.unlink_console()//unlink the old beacon from new console - if (express_console)//if this beacon has an express console - express_console.beacon = null//remove the connection the expressconsole has from beacons - express_console = C//set the linked console var to the console - express_console.beacon = src//out with the old in with the news - update_status(SP_LINKED) - if (express_console.usingBeacon) - update_status(SP_READY) - to_chat(user, span_notice("[src] linked to [C].")) - -/obj/item/supplypod_beacon/AltClick(mob/user) - if (!user.canUseTopic(src, !issilicon(user))) - return - if (express_console) - unlink_console() - else - to_chat(user, span_alert("There is no linked console.")) - -/obj/item/supplypod_beacon/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/pen)) //give a tag that is visible from the linked express console - var/new_beacon_name = stripped_input(user, "What would you like the tag to be?") - if(!user.canUseTopic(src, BE_CLOSE)) - return - if(new_beacon_name) - name += " ([tag])" - return - else - return ..() diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 4aecef90f53..7923fb2a19a 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -27,50 +27,56 @@ You can set verify to TRUE if you want send() to sleep until the client has the var/last_asset_job = 0 // Last job done. //This proc sends the asset to the client, but only if it needs it. -//This proc blocks(sleeps) unless verify is set to false -/proc/send_asset(client/client, asset_name, verify = TRUE) +//This proc blocks(sleeps) +/proc/send_asset(client/client, asset_name) + if(!send_asset_internal(client, asset_name)) + return FALSE + client.sending |= asset_name + var/job = client.browse_queue_flush() + if(!isnull(job) && client) // if job is null we runtimed somehow + client.sending -= asset_name + client.cache |= asset_name + client.completed_asset_jobs -= job + +//This proc doesn't +/proc/send_asset_async(client/client, asset_name) + if(!send_asset_internal(client, asset_name)) + return FALSE + client.cache += asset_name + return TRUE + +/proc/send_asset_internal(client/client, asset_name) if(!istype(client)) if(ismob(client)) var/mob/M = client if(M.client) client = M.client - else - return 0 - + return FALSE else - return 0 + return FALSE if(client.cache.Find(asset_name) || client.sending.Find(asset_name)) - return 0 + return FALSE log_asset("Sending asset [asset_name] to client [client]") client << browse_rsc(SSassets.cache[asset_name], asset_name) - if(!verify) - client.cache += asset_name - return 1 + return TRUE // sent, but not necessarily received - client.sending |= asset_name - var/job = ++client.last_asset_job - - client << browse({" +/client/proc/browse_queue_flush() + var/job = ++last_asset_job + var/t = 0 + var/timeout_time = (ASSET_CACHE_SEND_TIMEOUT * sending.len) + ASSET_CACHE_SEND_TIMEOUT + src << browse({" "}, "window=asset_cache_browser") - - var/t = 0 - var/timeout_time = (ASSET_CACHE_SEND_TIMEOUT * client.sending.len) + ASSET_CACHE_SEND_TIMEOUT - while(client && !client.completed_asset_jobs.Find(job) && t < timeout_time) // Reception is handled in Topic() + while(!completed_asset_jobs.Find(job) && t < timeout_time) // Reception is handled in Topic() stoplag(1) // Lock up the caller until this is received. t++ - if(client) - client.sending -= asset_name - client.cache |= asset_name - client.completed_asset_jobs -= job - - return 1 + return job //This proc blocks(sleeps) unless verify is set to false /proc/send_asset_list(client/client, list/asset_list, verify = TRUE) @@ -136,7 +142,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the send_asset(client, file) else concurrent_tracker++ - send_asset(client, file, verify=FALSE) + send_asset_async(client, file) stoplag(0) //queuing calls like this too quickly can cause issues in some client versions diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 234cb96680c..0d83d641113 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -94,7 +94,7 @@ GLOBAL_LIST_EMPTY(respawncounts) log_href("[src] (usr:[usr]\[[COORD(usr)]\]) : [hsrc ? "[hsrc] " : ""][href]") //byond bug ID:2256651 - if (asset_cache_job && asset_cache_job in completed_asset_jobs) + if (asset_cache_job && (asset_cache_job in completed_asset_jobs)) to_chat(src, span_danger("An error has been detected in how my client is receiving resources. Attempting to correct.... (If you keep seeing these messages you might want to close byond and reconnect)")) src << browse("...", "window=asset_cache_browser") @@ -1116,7 +1116,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) return FALSE return TRUE -/client/proc/commendsomeone(var/forced = FALSE) +/client/proc/commendsomeone(forced = FALSE) if(!can_commend(forced)) return if(alert(src,"Was there a character during this round that you would like to anonymously commend?", "Commendation", "YES", "NO") != "YES") diff --git a/code/modules/client/customizer/customizers/organ/eyes.dm b/code/modules/client/customizer/customizers/organ/eyes.dm index eba6a3b8d12..f3d1e937bcc 100644 --- a/code/modules/client/customizer/customizers/organ/eyes.dm +++ b/code/modules/client/customizer/customizers/organ/eyes.dm @@ -75,12 +75,19 @@ /datum/customizer_choice/organ/eyes/humanoid -/datum/customizer_choice/organ/eyes/elf - organ_type = /obj/item/organ/eyes/night_vision/elf +/datum/customizer_choice/organ/eyes/full_darksight + organ_type = /obj/item/organ/eyes/night_vision/full_darksight -/datum/customizer/organ/eyes/elf - customizer_choices = list(/datum/customizer_choice/organ/eyes/elf) - default_choice = /datum/customizer_choice/organ/eyes/elf +/datum/customizer/organ/eyes/full_darksight + customizer_choices = list(/datum/customizer_choice/organ/eyes/full_darksight) + default_choice = /datum/customizer_choice/organ/eyes/full_darksight + +/datum/customizer_choice/organ/eyes/half_darksight + organ_type = /obj/item/organ/eyes/half_darksight + +/datum/customizer/organ/eyes/half_darksight + customizer_choices = list(/datum/customizer_choice/organ/eyes/half_darksight) + default_choice = /datum/customizer_choice/organ/eyes/half_darksight /datum/customizer/organ/eyes/moth customizer_choices = list(/datum/customizer_choice/organ/eyes/moth) diff --git a/code/modules/client/customizer/customizers/organ/genitals.dm b/code/modules/client/customizer/customizers/organ/genitals.dm index 8c029f6b1d8..4879ed4dd48 100644 --- a/code/modules/client/customizer/customizers/organ/genitals.dm +++ b/code/modules/client/customizer/customizers/organ/genitals.dm @@ -285,8 +285,8 @@ return var/new_size = GLOB.named_ball_sizes[named_size] testicles_entry.organ_size = sanitize_integer(new_size, MIN_TESTICLES_SIZE, MAX_TESTICLES_SIZE, DEFAULT_TESTICLES_SIZE) - if("virile") - testicles_entry.virility = !testicles_entry.virility + if("virile") + testicles_entry.virility = !testicles_entry.virility /datum/customizer/organ/testicles/external customizer_choices = list(/datum/customizer_choice/organ/testicles/external) diff --git a/code/modules/client/darkmode.dm b/code/modules/client/darkmode.dm index 394484cbee6..edd3a4d7faa 100644 --- a/code/modules/client/darkmode.dm +++ b/code/modules/client/darkmode.dm @@ -117,4 +117,4 @@ Thanks to spacemaniac and mcdonald for help with the JS side of this. winset(src, "asset_cache_browser", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]") winset(src, "tooltip", "background-color = none;background-color = [COLOR_DARKMODE_BACKGROUND]") winset(src, "tooltip", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]") -*/ \ No newline at end of file +*/ diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index c6f6c59f1b5..b14e189c9bd 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -781,7 +781,7 @@ GLOBAL_LIST_EMPTY(chosen_names) popup.open(FALSE) onclose(user, "capturekeypress", src) -/datum/preferences/proc/SetChoices(mob/user, limit = 15, list/splitJobs = list("Watchmen Captain", "Prophet", "Merchant Prince", "Archivist", "Nightmaster", "Towner", "Grenzelhoft Mercenary", "Low Life", "Prisoner", "Chieftain"), widthPerColumn = 295, height = 620) //295 620 +/datum/preferences/proc/SetChoices(mob/user, limit = 15, list/splitJobs = list("Watchmen Captain", "Archpriest", "Merchant Prince", "Archivist", "Nightmaster", "Towner", "Grenzelhoft Mercenary", "Low Life", "Prisoner", "Chieftain"), widthPerColumn = 295, height = 620) //295 620 if(!SSjob) return diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 4b677e72d32..9a8054a42a4 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -481,7 +481,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["custom_race_name"] >> custom_race_name if(!valid_custom_race_name(null, custom_race_name, TRUE)) custom_race_name = null -/* useless shit from hearthstone. +/* useless shit from hearthstone. S["alias"] >> alias if(!valid_alias(null, alias, TRUE)) alias = null @@ -704,7 +704,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car #endif -/datum/preferences/proc/validate_job_prefs(var/list/job_prefs) +/datum/preferences/proc/validate_job_prefs(list/job_prefs) for(var/job in job_prefs) if(!SSjob.GetJob(job)) job_prefs -= job diff --git a/code/modules/client/roundendmanifest.dm b/code/modules/client/roundendmanifest.dm index 65b2d6ce3ff..b22bf01fcfb 100644 --- a/code/modules/client/roundendmanifest.dm +++ b/code/modules/client/roundendmanifest.dm @@ -5,4 +5,4 @@ for(var/X in GLOB.character_list) dat += "[GLOB.character_list[X]]" - src << browse(dat, "window=manifest;size=387x420;can_close=1") \ No newline at end of file + src << browse(dat, "window=manifest;size=387x420;can_close=1") diff --git a/code/modules/client/verbs/ping.dm b/code/modules/client/verbs/ping.dm index 3e700542c1d..a53a58a9eed 100644 --- a/code/modules/client/verbs/ping.dm +++ b/code/modules/client/verbs/ping.dm @@ -20,4 +20,4 @@ /client/verb/ping() set name = "Ping" set category = "Options" - winset(src, null, "command=.display_ping+[world.time+world.tick_lag*TICK_USAGE_REAL/100]") \ No newline at end of file + winset(src, null, "command=.display_ping+[world.time+world.tick_lag*TICK_USAGE_REAL/100]") diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index da2dc13b135..44d4d1eac72 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -223,7 +223,7 @@ var/obj/item/clothing/I = target I.item_state = initial(picked_item.item_state) I.mob_overlay_icon = initial(picked_item.mob_overlay_icon) - if(istype(I, /obj/item/clothing) && istype(initial(picked_item), /obj/item/clothing)) + if(istype(I, /obj/item/clothing) && istype(picked_item, /obj/item/clothing)) var/obj/item/clothing/CL = I var/obj/item/clothing/PCL = picked_item CL.flags_cover = initial(PCL.flags_cover) @@ -338,7 +338,7 @@ chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/clothing/suit chameleon_action.chameleon_name = "Suit" - chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/suit/armor/abductor, /obj/item/clothing/suit/changeling), only_root_path = TRUE) + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/suit/changeling), only_root_path = TRUE) chameleon_action.initialize_disguises() /obj/item/clothing/suit/chameleon/emp_act(severity) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 73e94d0d8b7..dcdbdb2fc38 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -73,8 +73,8 @@ var/detail_color var/boobed_detail = TRUE //Whether details have their own boobed sprite -/obj/item/clothing/New() - ..() +/obj/item/clothing/Initialize(mapload) + . = ..() if(armor_class) has_inspect_verb = TRUE @@ -241,6 +241,12 @@ if(user.used_intent.type != INTENT_HARM && ismoth(M)) var/obj/item/reagent_containers/food/snacks/clothing/clothing_as_food = new clothing_as_food.name = name + if(clothing_as_food.obj_integrity <= 10) + to_chat(M, span_notice("There is nothing left to eat on that...")) + return + if(clothing_as_food.smeltresult) //if its a smeltable damn thing its probably metal. + to_chat(M, span_notice("I can't eat that.")) + return if(clothing_as_food.attack(M, user, def_zone)) take_damage(15, sound_effect=FALSE) qdel(clothing_as_food) @@ -330,13 +336,14 @@ // Frankly just rewrite armor entirely. This system just sucks. This proc in particular should probably just set a broken flag, // and code taking into account armor should check if an armor piece is not broken. - for(var/x in armor) - if(armor[x] > 0) + var/list/armorlist = armor.getList() + for(var/x in armorlist) + if(armorlist[x] > 0) brokemessage = TRUE - armor[x] = 0 + armorlist[x] = 0 if(ismob(loc) && brokemessage) var/mob/M = loc - to_chat(M, "ARMOR BROKEN..!") + to_chat(M, "ARMOR BROKEN...!") ..() /obj/item/clothing/proc/update_clothes_damaged_state(damaging = TRUE) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 75028b190cd..15c7c6bda7f 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -52,7 +52,7 @@ /obj/item/clothing/mask/gas/welding/up /obj/item/clothing/mask/gas/welding/up/Initialize() - ..() + . = ..() visor_toggling() // ******************************************************************** diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index bc0e4e5ef6d..8afbc1adcef 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -332,4 +332,4 @@ suit = /obj/item/clothing/suit/armor/vest suit_store = /obj/item/gun/ballistic/rifle/boltaction r_hand = /obj/item/megaphone - head = /obj/item/clothing/head/intern \ No newline at end of file + head = /obj/item/clothing/head/intern diff --git a/code/modules/clothing/rogueclothes/ammopouch.dm b/code/modules/clothing/rogueclothes/ammopouch.dm index afee950a68f..a42e5d4fcd5 100644 --- a/code/modules/clothing/rogueclothes/ammopouch.dm +++ b/code/modules/clothing/rogueclothes/ammopouch.dm @@ -21,7 +21,7 @@ sewrepair = TRUE /obj/item/ammopouch/attackby(obj/A, loc, params) - if(A.type in subtypesof(/obj/item/ammo_casing/caseless/rogue)) + if(istype(A, /obj/item/ammo_casing/caseless/rogue)) if(bullets.len < max_storage) A.forceMove(src) bullets += A diff --git a/code/modules/clothing/rogueclothes/armor.dm b/code/modules/clothing/rogueclothes/armor.dm index 0c941998790..9f60ab761bc 100644 --- a/code/modules/clothing/rogueclothes/armor.dm +++ b/code/modules/clothing/rogueclothes/armor.dm @@ -308,6 +308,7 @@ desc = "Half plate in bikini form, still just as protective somehow." icon = 'modular_stonehedge/icons/armor/armor.dmi' mob_overlay_icon = 'modular_stonehedge/icons/armor/onmob/armor.dmi' + sleeved = 'modular_stonehedge/icons/roguetown/clothing/onmob/helpers/sleeves_armor.dmi' icon_state = "halfplatekini" item_state = "halfplatekini" allowed_sex = list(FEMALE) @@ -340,6 +341,7 @@ desc = "Full plate in bikini form, full package and full exposure." icon = 'modular_stonehedge/icons/armor/armor.dmi' mob_overlay_icon = 'modular_stonehedge/icons/armor/onmob/armor.dmi' + sleeved = 'modular_stonehedge/icons/roguetown/clothing/onmob/helpers/sleeves_armor.dmi' icon_state = "platekini" allowed_sex = list(FEMALE) armor_class = ARMOR_CLASS_HEAVY @@ -613,6 +615,7 @@ desc = "Flexible cowhide armor. Lightweight, better than nothing. Now in tasteful bikini shape." icon = 'modular_stonehedge/icons/armor/armor.dmi' mob_overlay_icon = 'modular_stonehedge/icons/armor/onmob/armor.dmi' + sleeved = 'modular_stonehedge/icons/roguetown/clothing/onmob/helpers/sleeves_armor.dmi' icon_state = "leatherkini" item_state = "leatherkini" allowed_sex = list(FEMALE) @@ -631,6 +634,7 @@ desc = "Studded leather is the most durable of all hides and leathers and about as light. This one is in bikini form." icon = 'modular_stonehedge/icons/armor/armor.dmi' mob_overlay_icon = 'modular_stonehedge/icons/armor/onmob/armor.dmi' + sleeved = 'modular_stonehedge/icons/roguetown/clothing/onmob/helpers/sleeves_armor.dmi' icon_state = "studleatherkini" item_state = "studleatherkini" allowed_sex = list(FEMALE) @@ -649,6 +653,7 @@ desc = "A light armor of wildbeast hide. Far more durable than leather. This will not keep a person warm though..." icon = 'modular_stonehedge/icons/armor/armor.dmi' mob_overlay_icon = 'modular_stonehedge/icons/armor/onmob/armor.dmi' + sleeved = 'modular_stonehedge/icons/roguetown/clothing/onmob/helpers/sleeves_armor.dmi' icon_state = "hidearmorkini" item_state = "hidearmorkini" allowed_sex = list(FEMALE) @@ -940,6 +945,7 @@ to_chat(user, span_warning("The curiass feels cold and dead.")) /obj/item/clothing/suit/roguetown/armor/plate/spellslingerarmor/dropped(mob/living/user) //Remove some bugfixing stuff in exchange for stricter checks. + . = ..() if(active_item) if(user.mind.get_skill_level(/datum/skill/magic/arcane)) var/mob/living/carbon/human/H = user diff --git a/code/modules/clothing/rogueclothes/cloaks.dm b/code/modules/clothing/rogueclothes/cloaks.dm index 8f65481a5b7..36b6ff54deb 100644 --- a/code/modules/clothing/rogueclothes/cloaks.dm +++ b/code/modules/clothing/rogueclothes/cloaks.dm @@ -93,7 +93,7 @@ return /obj/item/clothing/cloak/tabard/knight/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else @@ -109,7 +109,7 @@ boobed_detail = FALSE /obj/item/clothing/cloak/tabard/crusader/Initialize() - ..() + . = ..() update_icon() /obj/item/clothing/cloak/tabard/crusader/attack_right(mob/user) @@ -223,7 +223,7 @@ L.update_inv_cloak() /obj/item/clothing/cloak/tabard/knight/guard/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else @@ -337,7 +337,7 @@ L.update_inv_cloak() /obj/item/clothing/cloak/stabard/guard/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else @@ -387,7 +387,7 @@ detail_tag = "_quad" /obj/item/clothing/cloak/stabard/mercenary/Initialize() - ..() + . = ..() detail_tag = pick("_quad", "_spl", "_box", "_dim") color = clothing_color2hex(pick(CLOTHING_COLOR_NAMES)) detail_color = clothing_color2hex(pick(CLOTHING_COLOR_NAMES)) @@ -486,7 +486,7 @@ /obj/item/clothing/cloak/stabard/surcoat/guard/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else @@ -538,7 +538,7 @@ L.update_inv_cloak() /obj/item/clothing/cloak/lordcloak/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else @@ -888,7 +888,7 @@ inhand_mod = FALSE /obj/item/clothing/cloak/half/vet/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else @@ -976,6 +976,7 @@ user.check_attunement_points() /obj/item/clothing/neck/roguetown/blkknight/dropped(mob/living/user) + ..() if(!active_item) return active_item = FALSE @@ -988,7 +989,7 @@ user.change_stat("endurance", -2) user.change_stat("speed", -2) else - to_chat(user, span_notice("Strange, I don't feel that power anymore..")) + to_chat(user, span_notice("Strange, I don't feel that power anymore...")) armor = getArmor("blunt" = 100, "slash" = 100, "stab" = 100, "bullet" = 100, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0) user.attunement_points_used -= attunement_cost user.check_attunement_points() @@ -1043,7 +1044,7 @@ L.update_inv_cloak() /obj/item/clothing/cloak/stabard/guardhood/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else diff --git a/code/modules/clothing/rogueclothes/feet.dm b/code/modules/clothing/rogueclothes/feet.dm index 1cc273de7a1..d43222a48f9 100644 --- a/code/modules/clothing/rogueclothes/feet.dm +++ b/code/modules/clothing/rogueclothes/feet.dm @@ -268,6 +268,9 @@ name = "fur lined boots" desc = "Leather boots lined with fur." gender = PLURAL + icon = 'modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/feet.dmi' + mob_overlay_icon = 'modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/onmob/feet.dmi' + sleeved = 'modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/onmob/feet.dmi' icon_state = "furlinedboots" item_state = "furlinedboots" sewrepair = TRUE @@ -277,6 +280,9 @@ name = "fur lined anklets" desc = "Leather anklets lined with fur, foot remains bare." gender = PLURAL + icon = 'modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/feet.dmi' + mob_overlay_icon = 'modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/onmob/feet.dmi' + sleeved = 'modular_stonehedge/licensed-dreamkeep/icons/roguetown/clothing/onmob/feet.dmi' icon_state = "furlinedanklets" item_state = "furlinedanklets" sewrepair = TRUE diff --git a/code/modules/clothing/rogueclothes/hats.dm b/code/modules/clothing/rogueclothes/hats.dm index d7bf7dcb209..5e873a358d3 100644 --- a/code/modules/clothing/rogueclothes/hats.dm +++ b/code/modules/clothing/rogueclothes/hats.dm @@ -263,6 +263,7 @@ sewrepair = TRUE /obj/item/clothing/head/roguetown/priestmask/pickup(mob/living/user) + ..() if(!HAS_TRAIT(user, TRAIT_CHOSEN)) to_chat(user, "UNWORTHY HANDS TOUCH THE VISAGE, CEASE OR BE PUNISHED") spawn(30) @@ -278,11 +279,11 @@ /obj/item/clothing/head/roguetown/roguehood/random/Initialize() color = pick("#544236", "#435436", "#543836", "#79763f") - ..() + return ..() /obj/item/clothing/head/roguetown/roguehood/mage/Initialize() color = pick("#4756d8", "#759259", "#bf6f39", "#c1b144", "#b8252c") - ..() + return ..() /obj/item/clothing/head/roguetown/roguehood/AdjustClothes(mob/user) if(loc == user) @@ -518,7 +519,7 @@ /obj/item/clothing/head/roguetown/priesthat name = "priest's hat" desc = "" - icon_state = "Prophet" + icon_state = "Archpriest" //dropshrink = 0 mob_overlay_icon = 'icons/roguetown/clothing/onmob/64x64/head.dmi' dynamic_hair_suffix = "+generic" @@ -1963,7 +1964,7 @@ "Stripes"="stripes_decoration", "Red Castle"="castle_red_decoration", "White Castle"="castle_white_decoration", - "Graggar"="graggar_decoration", + "Jayx"="graggar_decoration", "Efreet"="efreet_decoration", "Sun"="sun_decoration", "Feathers"="feathers_decoration", @@ -2017,7 +2018,7 @@ "Stripes"="stripes_houndecoration", "Red Castle"="castle_red_houndecoration", "White Castle"="castle_white_houndecoration", - "Graggar"="graggar_houndecoration", + "Jayx"="graggar_houndecoration", "Efreet"="efreet_houndecoration", "Sun"="sun_houndecoration", "Feathers"="feathers_houndecoration", @@ -2071,7 +2072,7 @@ "Stripes"="stripes_bucket", "Red Castle"="castle_red_bucket", "White Castle"="castle_white_bucket", - "Graggar"="graggar_bucket", + "Jayx"="graggar_bucket", "Efreet"="efreet_bucket", "Sun"="sun_bucket", "Feathers"="feathers_bucket", @@ -2125,7 +2126,7 @@ "Stripes"="stripes_gbucket", "Red Castle"="castle_red_gbucket", "White Castle"="castle_white_gbucket", - "Graggar"="graggar_gbucket", + "Jayx"="graggar_gbucket", "Efreet"="efreet_gbucket", "Sun"="sun_gbucket", "Feathers"="feathers_gbucket", diff --git a/code/modules/clothing/rogueclothes/mask.dm b/code/modules/clothing/rogueclothes/mask.dm index 8c2240a422f..9d232395023 100644 --- a/code/modules/clothing/rogueclothes/mask.dm +++ b/code/modules/clothing/rogueclothes/mask.dm @@ -178,10 +178,10 @@ break_sound = 'sound/foley/breaksound.ogg' drop_sound = 'sound/foley/dropsound/gen_drop.ogg' resistance_flags = FIRE_PROOF - armor = list("blunt" = 10, "slash" = 40, "stab" = 40, "bullet" = 8, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) - prevent_crits = null - flags_inv = HIDEFACE - body_parts_covered = FACE + armor = list("blunt" = 45, "slash" = 100, "stab" = 80, "bullet" = 20, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT) + flags_inv = HIDEFACE|HIDEFACIALHAIR + body_parts_covered = FACE|EYES|MOUTH|HEAD|HAIR block2add = FOV_BEHIND slot_flags = ITEM_SLOT_MASK|ITEM_SLOT_HIP experimental_onhip = TRUE diff --git a/code/modules/clothing/rogueclothes/npc/goblin.dm b/code/modules/clothing/rogueclothes/npc/goblin.dm index 5e8b702fd41..0fccdca6fa7 100644 --- a/code/modules/clothing/rogueclothes/npc/goblin.dm +++ b/code/modules/clothing/rogueclothes/npc/goblin.dm @@ -4,7 +4,7 @@ item_state = "plate_armor" icon = 'icons/roguetown/mob/monster/goblins.dmi' smeltresult = /obj/item/ingot/iron - allowed_race = list(/mob/living/carbon/human/species/goblin) + allowed_race = list(/datum/species/goblin, /datum/species/goblin/hell, /datum/species/goblin/cave, /datum/species/goblin/sea, /datum/species/goblin/moon) body_parts_covered = CHEST|GROIN|ARMS|LEGS|VITALS sellprice = 0 @@ -14,16 +14,26 @@ item_state = "leather_armor" icon = 'icons/roguetown/mob/monster/goblins.dmi' body_parts_covered = CHEST|GROIN|ARMS|VITALS - allowed_race = list(/mob/living/carbon/human/species/goblin) + allowed_race = list(/datum/species/goblin, /datum/species/goblin/hell, /datum/species/goblin/cave, /datum/species/goblin/sea, /datum/species/goblin/moon) sellprice = 0 -/obj/item/clothing/suit/roguetown/armor/leather/hide/goblin +// /obj/item/clothing/suit/roguetown/armor/leather/hide/goblin +// name = "goblin loincloth" +// icon_state = "cloth_armor" +// item_state = "cloth_armor" +// icon = 'icons/roguetown/mob/monster/goblins.dmi' +// allowed_race = list(/datum/species/goblin) +// armor = null +// sellprice = 0 + +/obj/item/clothing/under/roguetown/loincloth/goblinloin name = "goblin loincloth" + desc = "smells funny." + icon = 'icons/roguetown/mob/monster/goblins.dmi' + mob_overlay_icon = 'icons/roguetown/mob/monster/goblins.dmi' icon_state = "cloth_armor" item_state = "cloth_armor" - icon = 'icons/roguetown/mob/monster/goblins.dmi' - allowed_race = list(/mob/living/carbon/human/species/goblin) - armor = null + allowed_race = list(/datum/species/goblin, /datum/species/goblin/hell, /datum/species/goblin/cave, /datum/species/goblin/sea, /datum/species/goblin/moon) sellprice = 0 /obj/item/clothing/head/roguetown/helmet/leather/goblin @@ -31,7 +41,7 @@ icon_state = "leather_helm_item" item_state = "leather_helm" icon = 'icons/roguetown/mob/monster/goblins.dmi' - allowed_race = list(/mob/living/carbon/human/species/goblin) + allowed_race = list(/datum/species/goblin, /datum/species/goblin/hell, /datum/species/goblin/cave, /datum/species/goblin/sea, /datum/species/goblin/moon) sellprice = 0 /obj/item/clothing/head/roguetown/helmet/goblin @@ -39,7 +49,7 @@ icon_state = "plate_helm_item" item_state = "plate_helm" icon = 'icons/roguetown/mob/monster/goblins.dmi' - allowed_race = list(/mob/living/carbon/human/species/goblin) + allowed_race = list(/datum/species/goblin, /datum/species/goblin/hell, /datum/species/goblin/cave, /datum/species/goblin/sea, /datum/species/goblin/moon) body_parts_covered = HEAD|EARS|HAIR|EYES sellprice = 0 smeltresult = /obj/item/ingot/iron diff --git a/code/modules/clothing/rogueclothes/pants.dm b/code/modules/clothing/rogueclothes/pants.dm index 3219ca0428c..7aa9cf700f5 100644 --- a/code/modules/clothing/rogueclothes/pants.dm +++ b/code/modules/clothing/rogueclothes/pants.dm @@ -124,6 +124,8 @@ name = "studded skirt" icon = 'modular_stonehedge/icons/armor/pants.dmi' mob_overlay_icon = 'modular_stonehedge/icons/armor/onmob/pants.dmi' + //slightly better than normal iron chain by 10 blunt and stab. + armor = list("blunt" = 50, "slash" = 80, "stab" = 50, "bullet" = 10, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) desc = "Short studded skirt made of fine leather and iron." icon_state = "studdedskirt" genitalaccess = TRUE diff --git a/code/modules/clothing/rogueclothes/quiver.dm b/code/modules/clothing/rogueclothes/quiver.dm index 634b67a071d..9a61c8a79a3 100644 --- a/code/modules/clothing/rogueclothes/quiver.dm +++ b/code/modules/clothing/rogueclothes/quiver.dm @@ -30,7 +30,7 @@ break /obj/item/quiver/proc/eatarrow(obj/A) - if(A.type in subtypesof(/obj/item/ammo_casing/caseless/rogue)) + if(istype(A, /obj/item/ammo_casing/caseless/rogue)) if(arrows.len < max_storage) A.forceMove(src) arrows += A @@ -40,7 +40,7 @@ return FALSE /obj/item/quiver/attackby(obj/A, loc, params) - if(A.type in subtypesof(/obj/item/ammo_casing/caseless/rogue)) + if(istype(A, /obj/item/ammo_casing/caseless/rogue)) if(arrows.len < max_storage) A.forceMove(src) arrows += A @@ -80,28 +80,28 @@ icon_state = "quiver0" /obj/item/quiver/arrows/Initialize() - ..() + . = ..() for(var/i in 1 to max_storage) var/obj/item/ammo_casing/caseless/rogue/arrow/A = new() arrows += A update_icon() /obj/item/quiver/bolts/Initialize() - ..() + . = ..() for(var/i in 1 to max_storage) var/obj/item/ammo_casing/caseless/rogue/bolt/A = new() arrows += A update_icon() /obj/item/quiver/Parrows/Initialize() - ..() + . = ..() for(var/i in 1 to max_storage) var/obj/item/ammo_casing/caseless/rogue/arrow/poison/A = new() arrows += A update_icon() /obj/item/quiver/Pbolts/Initialize() - ..() + . = ..() for(var/i in 1 to max_storage) var/obj/item/ammo_casing/caseless/rogue/bolt/poison/A = new() arrows += A diff --git a/code/modules/clothing/rogueclothes/rings.dm b/code/modules/clothing/rogueclothes/rings.dm index 7498ccdf7b7..c42c305ec9e 100644 --- a/code/modules/clothing/rogueclothes/rings.dm +++ b/code/modules/clothing/rogueclothes/rings.dm @@ -13,8 +13,7 @@ resistance_flags = FIRE_PROOF | ACID_PROOF anvilrepair = /datum/skill/craft/armorsmithing -/obj/item/clothing/ringP /////////////////////// cast focus ring for acolytes and shit. - parent_type = /obj/item/clothing/neck/roguetown/psicross +/obj/item/clothing/neck/roguetown/psicross/ringP /////////////////////// cast focus ring for acolytes and shit. name = "psi ring" desc = "a blessed psi ring, for the religious type" w_class = WEIGHT_CLASS_TINY @@ -27,7 +26,7 @@ resistance_flags = FIRE_PROOF | ACID_PROOF anvilrepair = /datum/skill/craft/blacksmithing -/obj/item/clothing/ring/lantern +/obj/item/flashlight/flare/torch/lantern/ring parent_type = /obj/item/flashlight/flare/torch/lantern // Inherits parents properties from lantern name = "alchemist ring" icon_state = "lanternR" @@ -48,10 +47,10 @@ slot_flags = ITEM_SLOT_RING resistance_flags = FIRE_PROOF | ACID_PROOF anvilrepair = /datum/skill/craft/blacksmithing - fuel = 9999 + fuel = 9999 sellprice = 30 -/obj/item/clothing/ring/lantern/MiddleClick(mob/living/user, params) +/obj/item/flashlight/flare/torch/lantern/ring/MiddleClick(mob/living/user, params) if (!on) on = TRUE to_chat(user, "With a flick of the thumb, you strike a flame.") @@ -62,30 +61,13 @@ icon_state = "ring_s" sellprice = 33 -/obj/item/clothing/ringP /////////////////////// cast focus ring for acolytes and shit. - parent_type = /obj/item/clothing/neck/roguetown/psicross - name = "psi ring" - desc = "a blessed psi ring, for the religious type" - w_class = WEIGHT_CLASS_TINY - icon = 'icons/roguetown/clothing/rings.dmi' - mob_overlay_icon = 'icons/roguetown/clothing/onmob/rings.dmi' - sleeved = 'icons/roguetown/clothing/onmob/rings.dmi' - sleevetype = "shirt" - icon_state = "castring" - slot_flags = ITEM_SLOT_RING - resistance_flags = FIRE_PROOF | ACID_PROOF - anvilrepair = /datum/skill/craft/blacksmithing - - - /obj/item/clothing/ring/gold name = "gold ring" icon_state = "ring_g" sellprice = 45 -/obj/item/clothing/ring/lantern - parent_type = /obj/item/flashlight/flare/torch/lantern // Inherits parents properties from lantern +/obj/item/flashlight/flare/torch/lantern/ring name = "alchemist ring" icon_state = "lanternR" w_class = WEIGHT_CLASS_TINY @@ -105,10 +87,10 @@ slot_flags = ITEM_SLOT_RING resistance_flags = FIRE_PROOF | ACID_PROOF anvilrepair = /datum/skill/craft/blacksmithing - fuel = 9999 + fuel = 9999 sellprice = 30 -/obj/item/clothing/ring/lantern/MiddleClick(mob/living/user, params) +/obj/item/flashlight/flare/torch/lantern/ring/MiddleClick(mob/living/user, params) if (!on) on = TRUE to_chat(user, "With a flick of the thumb, you strike a flame.") @@ -249,14 +231,14 @@ attunement_cost = 5 var/active_item infusable = FALSE - + /obj/item/clothing/ring/dragon_ring/equipped(mob/living/user) . = ..() if(active_item) return else active_item = TRUE - to_chat(user, span_notice("Here be dragons")) + to_chat(user, span_notice("Here be dragons.")) user.change_stat("strength", 2) user.change_stat("constitution", 2) user.change_stat("endurance", 2) @@ -265,8 +247,9 @@ return /obj/item/clothing/ring/dragon_ring/dropped(mob/living/user) + ..() if(active_item) - to_chat(user, span_notice("Gone is thy hoard")) + to_chat(user, span_notice("Gone is thy hoard.")) user.change_stat("strength", -2) user.change_stat("constitution", -2) user.change_stat("endurance", -2) diff --git a/code/modules/clothing/rogueclothes/robes.dm b/code/modules/clothing/rogueclothes/robes.dm index a3db50a43e7..83b43bbda3c 100644 --- a/code/modules/clothing/rogueclothes/robes.dm +++ b/code/modules/clothing/rogueclothes/robes.dm @@ -1,5 +1,5 @@ /obj/item/clothing/suit/roguetown/shirt/robe - slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_CLOAK|ITEM_SLOT_CLOAK + slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_CLOAK|ITEM_SLOT_SHIRT name = "robe" desc = "" body_parts_covered = CHEST|GROIN|ARMS|LEGS|VITALS @@ -274,7 +274,7 @@ icon = 'icons/roguetown/clothing/armor.dmi' mob_overlay_icon = 'icons/roguetown/clothing/onmob/armor.dmi' icon_state = "feldrobe" - slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_CLOAK + slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_CLOAK|ITEM_SLOT_SHIRT sleeved = null boobed = TRUE color = null @@ -288,7 +288,7 @@ icon = 'icons/roguetown/clothing/armor.dmi' mob_overlay_icon = 'icons/roguetown/clothing/onmob/armor.dmi' icon_state = "surgrobe" - slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_CLOAK + slot_flags = ITEM_SLOT_ARMOR|ITEM_SLOT_CLOAK|ITEM_SLOT_SHIRT sleeved = null boobed = TRUE color = null diff --git a/code/modules/clothing/rogueclothes/shirts.dm b/code/modules/clothing/rogueclothes/shirts.dm index 762dcef9c6a..9b9ca125907 100644 --- a/code/modules/clothing/rogueclothes/shirts.dm +++ b/code/modules/clothing/rogueclothes/shirts.dm @@ -52,7 +52,7 @@ color = CLOTHING_RED /obj/item/clothing/suit/roguetown/shirt/undershirt/guard/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else @@ -67,7 +67,7 @@ color = CLOTHING_PURPLE /obj/item/clothing/suit/roguetown/shirt/undershirt/guardsecond/Initialize() - ..() + . = ..() if(GLOB.lordprimary) lordcolor(GLOB.lordprimary,GLOB.lordsecondary) else diff --git a/code/modules/clothing/rogueclothes/wrists.dm b/code/modules/clothing/rogueclothes/wrists.dm index a104d186762..92e02aec177 100644 --- a/code/modules/clothing/rogueclothes/wrists.dm +++ b/code/modules/clothing/rogueclothes/wrists.dm @@ -24,7 +24,7 @@ armor = list("blunt" = 90, "slash" = 100, "stab" = 80, "bullet" = 100, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT, BCLASS_TWIST) blocksound = PLATEHIT - max_integrity = 150 + max_integrity = 450 anvilrepair = /datum/skill/craft/armorsmithing smeltresult = /obj/item/ingot/steel @@ -37,7 +37,7 @@ armor = list("blunt" = 70, "slash" = 90, "stab" = 60, "bullet" = 50, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) prevent_crits = list(BCLASS_CUT, BCLASS_STAB, BCLASS_CHOP, BCLASS_BLUNT, BCLASS_TWIST) blocksound = PLATEHIT - max_integrity = 100 + max_integrity = 200 anvilrepair = /datum/skill/craft/armorsmithing smeltresult = /obj/item/ingot/iron @@ -106,7 +106,7 @@ /obj/item/clothing/wrists/roguetown/hiddenblade name = "leather bracers" - desc = "Leather bracers worn on the wrists... With a hidden blade within." + desc = "Leather bracers worn on the wrists... With a contraption within." body_parts_covered = ARMS icon_state = "lbracers" item_state = "lbracers" @@ -117,7 +117,7 @@ sewrepair = TRUE smeltresult = /obj/item/ingot/steel var/extended = FALSE - var/obj/item/rogueweapon/huntingknife/idagger/steel/parrying/hidden/hid + var/obj/item/rogueweapon/huntingknife/idagger/steel/hidden/hid /obj/item/clothing/wrists/roguetown/hiddenblade/dropped(mob/user) . = ..() @@ -128,14 +128,14 @@ toggleblades(user) /obj/item/clothing/wrists/roguetown/hiddenblade/attackby(obj/A, mob/living/carbon/human/user, params) - if(src == user.get_item_by_slot(SLOT_WRISTS) && (istype(A, /obj/item/rogueweapon/huntingknife/idagger/steel/parrying/hidden) || !A)) //blade or empty hand. + if(src == user.get_item_by_slot(SLOT_WRISTS) && (istype(A, /obj/item/rogueweapon/huntingknife/idagger/steel/hidden) || !A)) //blade or empty hand. toggleblades(user) - return ..() + . = ..() /obj/item/clothing/wrists/roguetown/hiddenblade/proc/toggleblades(mob/user) if(extended) - if(istype(user.get_active_held_item(), /obj/item/rogueweapon/huntingknife/idagger/steel/parrying/hidden)) + if(istype(user.get_active_held_item(), /obj/item/rogueweapon/huntingknife/idagger/steel/hidden)) user.dropItemToGround(hid, TRUE) user.visible_message("A blade retracts into [user]'s bracer.", "My hidden blade retracts into my bracer.") extended = FALSE @@ -148,10 +148,9 @@ user.put_in_hands(hid, TRUE, FALSE, TRUE) user.visible_message("A blade ejects out from [user]'s bracer.", "My hidden blade ejects out of my bracer.") extended = TRUE - ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT) - + //ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT) -/obj/item/rogueweapon/huntingknife/idagger/steel/parrying/hidden +/obj/item/rogueweapon/huntingknife/idagger/steel/hidden name = "hidden blade" desc = "" embedding = list("embedded_pain_multiplier" = 0, "embed_chance" = 0, "embedded_fall_chance" = 0) diff --git a/code/modules/clothing/shoes/implant_exile.dm b/code/modules/clothing/shoes/implant_exile.dm deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 511f44222ea..ae065407ee3 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -374,7 +374,7 @@ if(occupants.len >= max_occupants) to_chat(user, span_warning("[src] are full!")) return - if(istype(target, /mob/living/simple_animal/hostile/retaliate/poison/snake) || istype(target, /mob/living/simple_animal/hostile/headcrab) || istype(target, /mob/living/carbon/alien/larva)) + if(istype(target, /mob/living/simple_animal/hostile/retaliate/poison/snake)) occupants += target target.forceMove(src) to_chat(user, span_notice("[target] slithers into [src].")) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 7194250467e..dde38853f34 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -473,15 +473,6 @@ icon_state = "gothcoat" item_state = "gothcoat" -/obj/item/clothing/suit/xenos - name = "xenos suit" - desc = "" - icon_state = "xenos" - item_state = "xenos_helm" - body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT - allowed = list(/obj/item/clothing/mask/facehugger/toy) - /obj/item/clothing/suit/nemes name = "pharoah tunic" desc = "" diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 3f7004d1df0..7eefe3e10c5 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -166,7 +166,7 @@ if(!isliving(usr)) return if(!robe_charge) - to_chat(usr, span_warning("The robe's internal magic supply is still recharging!")) + to_chat(usr, span_warning("\The [src]'s internal magic supply is still recharging!")) return usr.say("Rise, my creation! Off your page into this realm!", forced = "stickman summoning") @@ -177,7 +177,7 @@ src.robe_charge = FALSE sleep(30) src.robe_charge = TRUE - to_chat(usr, span_notice("The robe hums, its internal magic supply restored.")) + to_chat(usr, span_notice("\The [src] hums, its internal magic supply restored.")) //Shielded Armour diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index d028af11b4b..7c3c57dec39 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -127,8 +127,6 @@ to_chat(user, span_notice("I refill the suit's built-in extinguisher, using up the cartridge.")) qdel(E) return - return - return /obj/item/extinguisher_refill name = "envirosuit extinguisher cartridge" diff --git a/code/modules/detectivework/footprints_and_rag.dm b/code/modules/detectivework/footprints_and_rag.dm index ebf4dae2076..b7aab2255b0 100644 --- a/code/modules/detectivework/footprints_and_rag.dm +++ b/code/modules/detectivework/footprints_and_rag.dm @@ -38,7 +38,7 @@ C.visible_message(span_notice("[user] has touched \the [C] with \the [src].")) log_combat(user, C, "touched", src, log_object) - else if(istype(A) && src in user) + else if(istype(A) && (src in user)) user.visible_message(span_notice("[user] starts to wipe down [A] with [src]!"), span_notice("I start to wipe down [A] with [src]...")) if(do_after(user,30, target = A)) user.visible_message(span_notice("[user] finishes wiping off [A]!"), span_notice("I finish wiping off [A].")) diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm index 9791f89e14f..96d9a311c8c 100644 --- a/code/modules/error_handler/error_handler.dm +++ b/code/modules/error_handler/error_handler.dm @@ -18,14 +18,14 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) //if we got to here without silently ending, the byond bug has been fixed. log_world("The bug with recursion runtimes has been fixed. Please remove the snowflake check from world/Error in [__FILE__]:[__LINE__]") return //this will never happen. - + else if(copytext(E.name,1,18) == "Out of resources!") log_world("BYOND out of memory. Restarting") log_game("BYOND out of memory. Restarting") TgsEndProcess() Reboot(reason = 1) return ..() - + if (islist(stack_trace_storage)) for (var/line in splittext(E.desc, "\n")) if (text2ascii(line) != 32) @@ -128,7 +128,7 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) #ifdef UNIT_TESTS if(GLOB.current_test) //good day, sir - GLOB.current_test.Fail("[main_line]\n[desclines.Join("\n")]") + GLOB.current_test.Fail("[main_line]\n[desclines.Join("\n")]", E.file, E.line) #endif diff --git a/code/modules/events/abductor.dm b/code/modules/events/abductor.dm deleted file mode 100644 index 6f239f7aa22..00000000000 --- a/code/modules/events/abductor.dm +++ /dev/null @@ -1,35 +0,0 @@ -/datum/round_event_control/abductor - name = "Abductors" - typepath = /datum/round_event/ghost_role/abductor - weight = 10 - max_occurrences = 1 - min_players = 20 - gamemode_blacklist = list("nuclear","wizard","revolution") - -/datum/round_event/ghost_role/abductor - minimum_required = 2 - role_name = "abductor team" - fakeable = FALSE //Nothing to fake here - -/datum/round_event/ghost_role/abductor/spawn_role() - var/list/mob/dead/observer/candidates = get_candidates(ROLE_ABDUCTOR, null, ROLE_ABDUCTOR) - - if(candidates.len < 2) - return NOT_ENOUGH_PLAYERS - - var/mob/living/carbon/human/agent = makeBody(pick_n_take(candidates)) - var/mob/living/carbon/human/scientist = makeBody(pick_n_take(candidates)) - - var/datum/team/abductor_team/T = new - if(T.team_number > ABDUCTOR_MAX_TEAMS) - return MAP_ERROR - - log_game("[key_name(scientist)] has been selected as [T.name] abductor scientist.") - log_game("[key_name(agent)] has been selected as [T.name] abductor agent.") - - scientist.mind.add_antag_datum(/datum/antagonist/abductor/scientist, T) - agent.mind.add_antag_datum(/datum/antagonist/abductor/agent, T) - - spawned_mobs += list(agent, scientist) - - return SUCCESSFUL_SPAWN diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm deleted file mode 100644 index 26c5812b46c..00000000000 --- a/code/modules/events/alien_infestation.dm +++ /dev/null @@ -1,78 +0,0 @@ -/datum/round_event_control/alien_infestation - name = "Alien Infestation" - typepath = /datum/round_event/ghost_role/alien_infestation - weight = 5 - - min_players = 10 - -/datum/round_event_control/alien_infestation/canSpawnEvent() - . = ..() - if(!.) - return . - - for(var/mob/living/carbon/alien/A in GLOB.player_list) - if(A.stat != DEAD) - return FALSE - -/datum/round_event/ghost_role/alien_infestation - announceWhen = 400 - - minimum_required = 1 - role_name = "alien larva" - - // 50% chance of being incremented by one - var/spawncount = 1 - fakeable = TRUE - - -/datum/round_event/ghost_role/alien_infestation/setup() - announceWhen = rand(announceWhen, announceWhen + 50) - if(prob(50)) - spawncount++ - -/datum/round_event/ghost_role/alien_infestation/announce(fake) - var/living_aliens = FALSE - for(var/mob/living/carbon/alien/A in GLOB.player_list) - if(A.stat != DEAD) - living_aliens = TRUE - - if(living_aliens || fake) - priority_announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", 'sound/blank.ogg') - - -/datum/round_event/ghost_role/alien_infestation/spawn_role() - var/list/vents = list() - for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent in GLOB.machines) - if(QDELETED(temp_vent)) - continue - if(is_station_level(temp_vent.loc.z) && !temp_vent.welded) - var/datum/pipeline/temp_vent_parent = temp_vent.parents[1] - if(!temp_vent_parent) - continue//no parent vent - //Stops Aliens getting stuck in small networks. - //See: Security, Virology - if(temp_vent_parent.other_atmosmch.len > 20) - vents += temp_vent - - if(!vents.len) - message_admins("An event attempted to spawn an alien but no suitable vents were found. Shutting down.") - return MAP_ERROR - - var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN) - - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - while(spawncount > 0 && vents.len && candidates.len) - var/obj/vent = pick_n_take(vents) - var/client/C = pick_n_take(candidates) - - var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc) - new_xeno.key = C.key - - spawncount-- - message_admins("[ADMIN_LOOKUPFLW(new_xeno)] has been made into an alien by an event.") - log_game("[key_name(new_xeno)] was spawned as an alien by an event.") - spawned_mobs += new_xeno - - return SUCCESSFUL_SPAWN diff --git a/code/modules/events/creep_awakening.dm b/code/modules/events/creep_awakening.dm index d0269b8ddef..b8842119ba4 100644 --- a/code/modules/events/creep_awakening.dm +++ b/code/modules/events/creep_awakening.dm @@ -13,7 +13,7 @@ continue if(H.stat == DEAD) continue - if(!SSjob.GetJob(H.mind.assigned_role) || H.mind.assigned_role in GLOB.nonhuman_positions) //only station jobs sans nonhuman roles, prevents ashwalkers trying to stalk with crewmembers they never met + if(!SSjob.GetJob(H.mind.assigned_role) || (H.mind.assigned_role in GLOB.nonhuman_positions)) //only station jobs sans nonhuman roles, prevents ashwalkers trying to stalk with crewmembers they never met continue if(H.mind.has_antag_datum(/datum/antagonist/obsessed)) continue diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm deleted file mode 100644 index eb7edcafbf8..00000000000 --- a/code/modules/events/dust.dm +++ /dev/null @@ -1,31 +0,0 @@ -/datum/round_event_control/space_dust - name = "Minor Space Dust" - typepath = /datum/round_event/space_dust - weight = 200 - max_occurrences = 1000 - earliest_start = 0 MINUTES - alert_observers = FALSE - -/datum/round_event/space_dust - startWhen = 1 - endWhen = 2 - fakeable = FALSE - -/datum/round_event/space_dust/start() - spawn_meteors(1, GLOB.meteorsC) - -/datum/round_event_control/sandstorm - name = "Sandstorm" - typepath = /datum/round_event/sandstorm - weight = 0 - max_occurrences = 0 - earliest_start = 0 MINUTES - -/datum/round_event/sandstorm - startWhen = 1 - endWhen = 150 // ~5 min - announceWhen = 0 - fakeable = FALSE - -/datum/round_event/sandstorm/tick() - spawn_meteors(10, GLOB.meteorsC) diff --git a/code/modules/events/fugitive_spawning.dm b/code/modules/events/fugitive_spawning.dm deleted file mode 100644 index fd7f6349ad4..00000000000 --- a/code/modules/events/fugitive_spawning.dm +++ /dev/null @@ -1,115 +0,0 @@ -/datum/round_event_control/fugitives - name = "Spawn Fugitives" - typepath = /datum/round_event/ghost_role/fugitives - max_occurrences = 1 - min_players = 20 - earliest_start = 30 MINUTES //deadchat sink, lets not even consider it early on. - gamemode_blacklist = list("nuclear") - -/datum/round_event/ghost_role/fugitives - minimum_required = 1 - role_name = "fugitive" - fakeable = FALSE - -/datum/round_event/ghost_role/fugitives/spawn_role() - var/list/possible_spawns = list()//Some xeno spawns are in some spots that will instantly kill the refugees, like atmos - for(var/turf/X in GLOB.xeno_spawn) - if(istype(X.loc, /area/maintenance)) - possible_spawns += X - if(!possible_spawns.len) - message_admins("No valid spawn locations found, aborting...") - return MAP_ERROR - var/turf/landing_turf = pick(possible_spawns) - var/list/possible_backstories = list() - var/list/candidates = get_candidates(ROLE_TRAITOR, null, ROLE_TRAITOR) - if(candidates.len >= 1) //solo refugees - if(prob(30)) - possible_backstories.Add("waldo") //less common as it comes with magicks and is kind of immershun shattering - if(candidates.len >= 4)//group refugees - possible_backstories.Add("prisoner", "cultist", "synth") - if(!possible_backstories.len) - return NOT_ENOUGH_PLAYERS - - var/backstory = pick(possible_backstories) - var/member_size = 3 - var/leader - switch(backstory) - if("synth") - leader = pick_n_take(candidates) - if("waldo") - member_size = 0 //solo refugees have no leader so the member_size gets bumped to one a bit later - var/list/members = list() - var/list/spawned_mobs = list() - if(isnull(leader)) - member_size++ //if there is no leader role, then the would be leader is a normal member of the team. - - for(var/i in 1 to member_size) - members += pick_n_take(candidates) - - for(var/mob/dead/selected in members) - var/mob/living/carbon/human/S = gear_fugitive(selected, landing_turf, backstory) - spawned_mobs += S - if(!isnull(leader)) - gear_fugitive_leader(leader, landing_turf, backstory) - -//after spawning - playsound(src, 'sound/blank.ogg', 50, TRUE) - new /obj/item/storage/toolbox/mechanical(landing_turf) //so they can actually escape maint - addtimer(CALLBACK(src, PROC_REF(spawn_hunters)), 10 MINUTES) - role_name = "fugitive hunter" - return SUCCESSFUL_SPAWN - -/datum/round_event/ghost_role/fugitives/proc/gear_fugitive(mob/dead/selected, turf/landing_turf, backstory) //spawns normal fugitive - var/datum/mind/player_mind = new /datum/mind(selected.key) - player_mind.active = TRUE - var/mob/living/carbon/human/S = new(landing_turf) - player_mind.transfer_to(S) - player_mind.assigned_role = "Fugitive" - player_mind.special_role = "Fugitive" - player_mind.add_antag_datum(/datum/antagonist/fugitive) - var/datum/antagonist/fugitive/fugitiveantag = player_mind.has_antag_datum(/datum/antagonist/fugitive) - INVOKE_ASYNC(fugitiveantag, TYPE_PROC_REF(/datum/antagonist/fugitive, greet), backstory) //some fugitives have a sleep on their greet, so we don't want to stop the entire antag granting proc with fluff - - switch(backstory) - if("prisoner") - S.equipOutfit(/datum/outfit/prisoner) - if("cultist") - S.equipOutfit(/datum/outfit/yalp_cultist) - if("waldo") - S.equipOutfit(/datum/outfit/waldo) - if("synth") - S.equipOutfit(/datum/outfit/synthetic) - message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Fugitive by an event.") - log_game("[key_name(S)] was spawned as a Fugitive by an event.") - spawned_mobs += S - return S - - //special spawn for one member. it can be used for a special mob or simply to give one normal member special items. -/datum/round_event/ghost_role/fugitives/proc/gear_fugitive_leader(mob/dead/leader, turf/landing_turf, backstory) - var/datum/mind/player_mind = new /datum/mind(leader.key) - player_mind.active = TRUE - //if you want to add a fugitive with a special leader in the future, make this switch with the backstory - var/mob/living/carbon/human/S = gear_fugitive(leader, landing_turf, backstory) - var/obj/item/choice_beacon/augments/A = new(S) - S.put_in_hands(A) - new /obj/item/autosurgeon(landing_turf) - -//security team gets called in after 10 minutes of prep to find the refugees -/datum/round_event/ghost_role/fugitives/proc/spawn_hunters() - var/backstory = pick("space cop", "russian", "bounty hunter") - var/datum/map_template/shuttle/ship - if(backstory == "space cop") - ship = new /datum/map_template/shuttle/hunter/space_cop - else if (backstory == "russian") - ship = new /datum/map_template/shuttle/hunter/russian - else - ship = new /datum/map_template/shuttle/hunter/bounty - var/x = rand(TRANSITIONEDGE,world.maxx - TRANSITIONEDGE - ship.width) - var/y = rand(TRANSITIONEDGE,world.maxy - TRANSITIONEDGE - ship.height) - var/z = SSmapping.empty_space.z_value - var/turf/T = locate(x,y,z) - if(!T) - CRASH("Fugitive Hunters (Created from fugitive event) found no turf to load in") - if(!ship.load(T)) - CRASH("Loading [backstory] ship failed!") - priority_announce("Unidentified ship detected near the station.") diff --git a/code/modules/events/high_priority_bounty.dm b/code/modules/events/high_priority_bounty.dm deleted file mode 100644 index ffdcd8840b7..00000000000 --- a/code/modules/events/high_priority_bounty.dm +++ /dev/null @@ -1,20 +0,0 @@ -/datum/round_event_control/high_priority_bounty - name = "High Priority Bounty" - typepath = /datum/round_event/high_priority_bounty - max_occurrences = 3 - weight = 20 - earliest_start = 10 - -/datum/round_event/high_priority_bounty/announce(fake) - priority_announce("Central Command has issued a high-priority cargo bounty. Details have been sent to all bounty consoles.", "Nanotrasen Bounty Program") - -/datum/round_event/high_priority_bounty/start() - var/datum/bounty/B - for(var/attempts = 0; attempts < 50; ++attempts) - B = random_bounty() - if(!B) - continue - B.mark_high_priority(3) - if(try_add_bounty(B)) - break - diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm deleted file mode 100644 index a9b99e858dd..00000000000 --- a/code/modules/events/immovable_rod.dm +++ /dev/null @@ -1,165 +0,0 @@ -/* -Immovable rod random event. -The rod will spawn at some location outside the station, and travel in a straight line to the opposite side of the station -Everything solid in the way will be ex_act()'d -In my current plan for it, 'solid' will be defined as anything with density == 1 - ---NEOFite -*/ - -/datum/round_event_control/immovable_rod - name = "Immovable Rod" - typepath = /datum/round_event/immovable_rod - min_players = 15 - max_occurrences = 5 - var/atom/special_target - - -/datum/round_event_control/immovable_rod/admin_setup() - if(!check_rights(R_FUN)) - return - - var/aimed = alert("Aimed at current location?","Sniperod", "Yes", "No") - if(aimed == "Yes") - special_target = get_turf(usr) - -/datum/round_event/immovable_rod - announceWhen = 5 - -/datum/round_event/immovable_rod/announce(fake) - priority_announce("What the fuck was that?!", "General Alert") - -/datum/round_event/immovable_rod/start() - var/datum/round_event_control/immovable_rod/C = control - var/startside = pick(GLOB.cardinals) - var/z = pick(SSmapping.levels_by_trait(ZTRAIT_STATION)) - var/turf/startT = spaceDebrisStartLoc(startside, z) - var/turf/endT = spaceDebrisFinishLoc(startside, z) - var/atom/rod = new /obj/effect/immovablerod(startT, endT, C.special_target) - announce_to_ghosts(rod) - -/obj/effect/immovablerod - name = "immovable rod" - desc = "" - icon = 'icons/obj/objects.dmi' - icon_state = "immrod" - throwforce = 100 - move_force = INFINITY - move_resist = INFINITY - pull_force = INFINITY - density = TRUE - anchored = TRUE - flags_1 = PREVENT_CONTENTS_EXPLOSION_1 - var/mob/living/wizard - var/z_original = 0 - var/destination - var/notify = TRUE - var/atom/special_target - -/obj/effect/immovablerod/New(atom/start, atom/end, aimed_at) - ..() - SSaugury.register_doom(src, 2000) - z_original = z - destination = end - special_target = aimed_at - GLOB.poi_list += src - - var/special_target_valid = FALSE - if(special_target) - var/turf/T = get_turf(special_target) - if(T.z == z_original) - special_target_valid = TRUE - if(special_target_valid) - walk_towards(src, special_target, 1) - else if(end && end.z==z_original) - walk_towards(src, destination, 1) - -/obj/effect/immovablerod/Topic(href, href_list) - if(href_list["orbit"]) - var/mob/dead/observer/ghost = usr - if(istype(ghost)) - ghost.ManualFollow(src) - -/obj/effect/immovablerod/Destroy() - GLOB.poi_list -= src - . = ..() - -/obj/effect/immovablerod/Moved() - if((z != z_original) || (loc == destination)) - qdel(src) - if(special_target && loc == get_turf(special_target)) - complete_trajectory() - return ..() - -/obj/effect/immovablerod/proc/complete_trajectory() - //We hit what we wanted to hit, time to go - special_target = null - destination = get_edge_target_turf(src, dir) - walk(src,0) - walk_towards(src, destination, 1) - -/obj/effect/immovablerod/ex_act(severity, target) - return 0 - -/obj/effect/immovablerod/singularity_act() - return - -/obj/effect/immovablerod/singularity_pull() - return - -/obj/effect/immovablerod/Bump(atom/clong) - if(prob(10)) - playsound(src, 'sound/blank.ogg', 50, TRUE) - audible_message(span_danger("I hear a CLANG!")) - - if(clong && prob(25)) - x = clong.x - y = clong.y - - if(special_target && clong == special_target) - complete_trajectory() - - if(isturf(clong) || isobj(clong)) - if(clong.density) - clong.ex_act(EXPLODE_HEAVY) - - else if(isliving(clong)) - penetrate(clong) - else if(istype(clong, type)) - var/obj/effect/immovablerod/other = clong - visible_message("[src] collides with [other]!\ - ") - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(2, get_turf(src)) - smoke.start() - qdel(src) - qdel(other) - -/obj/effect/immovablerod/proc/penetrate(mob/living/L) - L.visible_message(span_danger("[L] is penetrated by an immovable rod!") , span_danger("The rod penetrates you!") , span_danger("I hear a CLANG!")) - if(ishuman(L)) - var/mob/living/carbon/human/H = L - H.adjustBruteLoss(160) - if(L && (L.density || prob(10))) - L.ex_act(EXPLODE_HEAVY) - -/obj/effect/immovablerod/attack_hand(mob/living/user) - if(ishuman(user)) - var/mob/living/carbon/human/U = user - if(U.job in list("Research Director")) - playsound(src, 'sound/blank.ogg', 100, TRUE) - for(var/mob/M in urange(8, src)) - if(!M.stat) - shake_camera(M, 2, 3) - if(wizard) - U.visible_message(span_boldwarning("[src] transforms into [wizard] as [U] suplexes them!"), span_warning("As you grab [src], it suddenly turns into [wizard] as you suplex them!")) - to_chat(wizard, span_boldwarning("You're suddenly jolted out of rod-form as [U] somehow manages to grab you, slamming you into the ground!")) - wizard.Stun(60) - wizard.apply_damage(25, BRUTE) - qdel(src) - else - U.client.give_award(/datum/award/achievement/misc/feat_of_strength, U) //rod-form wizards would probably make this a lot easier to get so keep it to regular rods only - U.visible_message(span_boldwarning("[U] suplexes [src] into the ground!"), span_warning("I suplex [src] into the ground!")) - new /obj/structure/festivus/anchored(drop_location()) - new /obj/effect/anomaly/flux(drop_location()) - qdel(src) diff --git a/code/modules/events/major_dust.dm b/code/modules/events/major_dust.dm deleted file mode 100644 index 7fb00124a94..00000000000 --- a/code/modules/events/major_dust.dm +++ /dev/null @@ -1,19 +0,0 @@ -/datum/round_event_control/meteor_wave/major_dust - name = "Major Space Dust" - typepath = /datum/round_event/meteor_wave/major_dust - weight = 8 - -/datum/round_event/meteor_wave/major_dust - wave_name = "space dust" - -/datum/round_event/meteor_wave/major_dust/announce(fake) - var/reason = pick( - "The station is passing through a debris cloud, expect minor damage \ - to external fittings and fixtures.", - "Nanotrasen Superweapons Division is testing a new prototype \ - [pick("field","projection","nova","super-colliding","reactive")] \ - [pick("cannon","artillery","tank","cruiser","\[REDACTED\]")], \ - some mild debris is expected.", - "A neighbouring station is throwing rocks at you. (Perhaps they've \ - grown tired of your messages.)") - priority_announce(pick(reason), "Collision Alert") diff --git a/code/modules/events/meateor_wave.dm b/code/modules/events/meateor_wave.dm deleted file mode 100644 index b5b9eeb0aaa..00000000000 --- a/code/modules/events/meateor_wave.dm +++ /dev/null @@ -1,11 +0,0 @@ -/datum/round_event_control/meteor_wave/meaty - name = "Meteor Wave: Meaty" - typepath = /datum/round_event/meteor_wave/meaty - weight = 2 - max_occurrences = 1 - -/datum/round_event/meteor_wave/meaty - wave_name = "meaty" - -/datum/round_event/meteor_wave/meaty/announce(fake) - priority_announce("Meaty ores have been detected on collision course with the station.", "Oh crap, get the mop.",'sound/blank.ogg') diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm deleted file mode 100644 index 503d7ce1534..00000000000 --- a/code/modules/events/meteor_wave.dm +++ /dev/null @@ -1,71 +0,0 @@ -// Normal strength - -/datum/round_event_control/meteor_wave - name = "Meteor Wave: Normal" - typepath = /datum/round_event/meteor_wave - weight = 4 - min_players = 15 - max_occurrences = 3 - earliest_start = 25 MINUTES - -/datum/round_event/meteor_wave - startWhen = 6 - endWhen = 66 - announceWhen = 1 - var/list/wave_type - var/wave_name = "normal" - -/datum/round_event/meteor_wave/New() - ..() - if(!wave_type) - determine_wave_type() - -/datum/round_event/meteor_wave/proc/determine_wave_type() - if(!wave_name) - wave_name = pickweight(list( - "normal" = 50, - "threatening" = 40, - "catastrophic" = 10)) - switch(wave_name) - if("normal") - wave_type = GLOB.meteors_normal - if("threatening") - wave_type = GLOB.meteors_threatening - if("catastrophic") - wave_type = GLOB.meteors_catastrophic - if("meaty") - wave_type = GLOB.meteorsB - if("space dust") - wave_type = GLOB.meteorsC - else - WARNING("Wave name of [wave_name] not recognised.") - kill() - -/datum/round_event/meteor_wave/announce(fake) - priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", 'sound/blank.ogg') - -/datum/round_event/meteor_wave/tick() - if(ISMULTIPLE(activeFor, 3)) - spawn_meteors(5, wave_type) //meteor list types defined in gamemode/meteor/meteors.dm - -/datum/round_event_control/meteor_wave/threatening - name = "Meteor Wave: Threatening" - typepath = /datum/round_event/meteor_wave/threatening - weight = 5 - min_players = 20 - max_occurrences = 3 - earliest_start = 35 MINUTES - -/datum/round_event/meteor_wave/threatening - wave_name = "threatening" - -/datum/round_event_control/meteor_wave/catastrophic - name = "Meteor Wave: Catastrophic" - typepath = /datum/round_event/meteor_wave/catastrophic - weight = 7 - min_players = 25 - max_occurrences = 3 - earliest_start = 45 MINUTES - -/datum/round_event/meteor_wave/catastrophic - wave_name = "catastrophic" diff --git a/code/modules/events/nightmare.dm b/code/modules/events/nightmare.dm deleted file mode 100644 index 5da52d6fc03..00000000000 --- a/code/modules/events/nightmare.dm +++ /dev/null @@ -1,43 +0,0 @@ -/datum/round_event_control/nightmare - name = "Spawn Nightmare" - typepath = /datum/round_event/ghost_role/nightmare - max_occurrences = 1 - min_players = 20 - -/datum/round_event/ghost_role/nightmare - minimum_required = 1 - role_name = "nightmare" - fakeable = FALSE - -/datum/round_event/ghost_role/nightmare/spawn_role() - var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN) - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - var/mob/dead/selected = pick(candidates) - - var/datum/mind/player_mind = new /datum/mind(selected.key) - player_mind.active = TRUE - - var/list/spawn_locs = list() - for(var/X in GLOB.xeno_spawn) - var/turf/T = X - var/light_amount = T.get_lumcount() - if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) - spawn_locs += T - - if(!spawn_locs.len) - message_admins("No valid spawn locations found, aborting...") - return MAP_ERROR - - var/mob/living/carbon/human/S = new ((pick(spawn_locs))) - player_mind.transfer_to(S) - player_mind.assigned_role = "Nightmare" - player_mind.special_role = "Nightmare" - player_mind.add_antag_datum(/datum/antagonist/nightmare) - S.set_species(/datum/species/shadow/nightmare) - playsound(S, 'sound/blank.ogg', 50, TRUE, -1) - message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Nightmare by an event.") - log_game("[key_name(S)] was spawned as a Nightmare by an event.") - spawned_mobs += S - return SUCCESSFUL_SPAWN diff --git a/code/modules/events/rogue/_rogue.dm b/code/modules/events/rogue/_rogue.dm index c726b5ad993..3b67056693b 100644 --- a/code/modules/events/rogue/_rogue.dm +++ b/code/modules/events/rogue/_rogue.dm @@ -34,7 +34,7 @@ GLOBAL_LIST_INIT(badomens, list()) var/used switch(eventreason) if(OMEN_ROUNDSTART) - used = "Zizo." + used = "Levishth." if(OMEN_NOLORD) used = "The Monarch is dead! We need a new ruler." if(OMEN_NOPRIEST) @@ -46,7 +46,7 @@ GLOBAL_LIST_INIT(badomens, list()) if(OMEN_SKELETONSIEGE) used = "Unwelcome visitors!" if("ascend") - used = "Zizo will rise once again." + used = "A new god is born!" if(eventreason && used) priority_announce(used, "Bad Omen", 'sound/misc/evilevent.ogg') diff --git a/code/modules/events/rogue/lightsout.dm b/code/modules/events/rogue/lightsout.dm index 4dd64ee8282..d2be6f08647 100644 --- a/code/modules/events/rogue/lightsout.dm +++ b/code/modules/events/rogue/lightsout.dm @@ -20,4 +20,4 @@ if(LAZYLEN(GLOB.streetlamp_list)) for(var/obj/machinery/light/roguestreet/i in GLOB.streetlamp_list) i.lights_out() - return \ No newline at end of file + return diff --git a/code/modules/events/rogue/vines.dm b/code/modules/events/rogue/vines.dm index 8cac73a0874..3059c6ebaeb 100644 --- a/code/modules/events/rogue/vines.dm +++ b/code/modules/events/rogue/vines.dm @@ -5,4 +5,4 @@ max_occurrences = 0 min_players = 99999 req_omen = TRUE - todreq = list("dusk", "night", "dawn", "day") \ No newline at end of file + todreq = list("dusk", "night", "dawn", "day") diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm deleted file mode 100644 index 7cb39576f07..00000000000 --- a/code/modules/events/sentience.dm +++ /dev/null @@ -1,112 +0,0 @@ -GLOBAL_LIST_INIT(high_priority_sentience, typecacheof(list( - /mob/living/simple_animal/pet, - /mob/living/simple_animal/parrot, - /mob/living/simple_animal/hostile/lizard, - /mob/living/simple_animal/sloth, - /mob/living/simple_animal/mouse/brown/Tom, - /mob/living/simple_animal/hostile/retaliate/goat, - /mob/living/simple_animal/chicken, - /mob/living/simple_animal/cow, - /mob/living/simple_animal/hostile/retaliate/bat, - /mob/living/simple_animal/hostile/carp/cayenne, - /mob/living/simple_animal/butterfly, - /mob/living/simple_animal/hostile/retaliate/poison/snake, - /mob/living/simple_animal/hostile/retaliate/goose/vomit, - /mob/living/simple_animal/bot/mulebot, - /mob/living/simple_animal/bot/secbot/beepsky -))) - -/datum/round_event_control/sentience - name = "Random Human-level Intelligence" - typepath = /datum/round_event/ghost_role/sentience - weight = 10 - - -/datum/round_event/ghost_role/sentience - minimum_required = 1 - role_name = "random animal" - var/animals = 1 - var/one = "one" - fakeable = TRUE - -/datum/round_event/ghost_role/sentience/announce(fake) - var/sentience_report = "" - - var/data = pick("scans from our long-range sensors", "our sophisticated probabilistic models", "our omnipotence", "the communications traffic on your station", "energy emissions we detected", "\[REDACTED\]") - var/pets = pick("animals/bots", "bots/animals", "pets", "simple animals", "lesser lifeforms", "\[REDACTED\]") - var/strength = pick("human", "moderate", "lizard", "security", "command", "clown", "low", "very low", "\[REDACTED\]") - - sentience_report += "Based on [data], we believe that [one] of the station's [pets] has developed [strength] level intelligence, and the ability to communicate." - - priority_announce(sentience_report,"[command_name()] Medium-Priority Update") - -/datum/round_event/ghost_role/sentience/spawn_role() - var/list/mob/dead/observer/candidates - candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN) - - // find our chosen mob to breathe life into - // Mobs have to be simple animals, mindless, on station, and NOT holograms. - // prioritize starter animals that people will recognise - - - var/list/potential = list() - - var/list/hi_pri = list() - var/list/low_pri = list() - - for(var/mob/living/simple_animal/L in GLOB.alive_mob_list) - var/turf/T = get_turf(L) - if(!T || !is_station_level(T.z)) - continue - if((L in GLOB.player_list) || L.mind || (L.flags_1 & HOLOGRAM_1)) - continue - if(is_type_in_typecache(L, GLOB.high_priority_sentience)) - hi_pri += L - else - low_pri += L - - shuffle_inplace(hi_pri) - shuffle_inplace(low_pri) - - potential = hi_pri + low_pri - - if(!potential.len) - return WAITING_FOR_SOMETHING - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - var/spawned_animals = 0 - while(spawned_animals < animals && candidates.len && potential.len) - var/mob/living/simple_animal/SA = popleft(potential) - var/mob/dead/observer/SG = pick_n_take(candidates) - - spawned_animals++ - - SA.key = SG.key - - SA.grant_all_languages(TRUE) - - SA.sentience_act() - - SA.maxHealth = max(SA.maxHealth, 200) - SA.health = SA.maxHealth - SA.del_on_death = FALSE - - spawned_mobs += SA - - to_chat(SA, span_danger("Hello world!")) - to_chat(SA, "Due to freak radiation and/or chemicals \ - and/or lucky chance, you have gained human level intelligence \ - and the ability to speak and understand human language!") - - return SUCCESSFUL_SPAWN - -/datum/round_event_control/sentience/all - name = "Station-wide Human-level Intelligence" - typepath = /datum/round_event/ghost_role/sentience/all - weight = 0 - -/datum/round_event/ghost_role/sentience/all - one = "all" - animals = INFINITY // as many as there are ghosts and animals - // cockroach pride, station wide diff --git a/code/modules/events/space_dragon.dm b/code/modules/events/space_dragon.dm deleted file mode 100644 index d1315856d92..00000000000 --- a/code/modules/events/space_dragon.dm +++ /dev/null @@ -1,44 +0,0 @@ -/datum/round_event_control/space_dragon - name = "Spawn Space Dragon" - typepath = /datum/round_event/ghost_role/space_dragon - max_occurrences = 1 - weight = 8 - earliest_start = 70 MINUTES - min_players = 20 - -/datum/round_event/ghost_role/space_dragon - minimum_required = 1 - role_name = "Space Dragon" - announceWhen = 10 - -/datum/round_event/ghost_role/space_dragon/announce(fake) - priority_announce("It appears a lifeform with magical traces is approaching [station_name()], please stand-by.", "Lifesign Alert") - -/datum/round_event/ghost_role/space_dragon/spawn_role() - var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN) - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - var/mob/dead/selected = pick(candidates) - - var/datum/mind/player_mind = new /datum/mind(selected.key) - player_mind.active = TRUE - - var/list/spawn_locs = list() - for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list) - spawn_locs += (C.loc) - if(!spawn_locs.len) - message_admins("No valid spawn locations found, aborting...") - return MAP_ERROR - - var/mob/living/simple_animal/hostile/retaliate/rogue/megafauna/dragon/space_dragon/S = new ((pick(spawn_locs))) - player_mind.transfer_to(S) - player_mind.assigned_role = "Space Dragon" - player_mind.special_role = "Space Dragon" - player_mind.add_antag_datum(/datum/antagonist/space_dragon) - playsound(S, 'sound/blank.ogg', 50, TRUE, -1) - message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Space Dragon by an event.") - log_game("[key_name(S)] was spawned as a Space Dragon by an event.") - spawned_mobs += S - return SUCCESSFUL_SPAWN - diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 7fdca3bd677..a0954387c5f 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -408,9 +408,6 @@ SM.on_hit(src, user) user_unbuckle_mob(user,user) -/obj/structure/spacevine/attack_alien(mob/living/user) - eat(user) - /datum/spacevine_controller var/list/obj/structure/spacevine/vines var/obj/structure/flora/roguetree/evil/tree diff --git a/code/modules/farming/produce.dm b/code/modules/farming/produce.dm index fc59e22fa1b..09f6dd7f5ad 100644 --- a/code/modules/farming/produce.dm +++ b/code/modules/farming/produce.dm @@ -211,7 +211,7 @@ seed = /obj/item/seeds/berryrogue/poison icon_state = "berries" tastes = list("berry" = 1) - list_reagents = list(/datum/reagent/berrypoison = 5, /datum/reagent/consumable/nutriment = 3) + list_reagents = list(/datum/reagent/toxin/berrypoison = 5, /datum/reagent/consumable/nutriment = 3) color_index = "bad" mill_result = /obj/item/reagent_containers/powder/alch/berryp @@ -224,7 +224,7 @@ filling_color = "#008000" bitesize_mod = 1 foodtype = VEGETABLES - list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/berrypoison = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/toxin/berrypoison = 5) tastes = list("sweet" = 1,"bitterness" = 1) eat_effect = /datum/status_effect/debuff/badmeal rotprocess = 15 MINUTES @@ -238,7 +238,7 @@ bitesize_mod = 1 foodtype = VEGETABLES tastes = list("sweet" = 1,"bitterness" = 1) - list_reagents = list(/datum/reagent/drug/nicotine = 2, /datum/reagent/consumable/nutriment = 1, /datum/reagent/berrypoison = 5) + list_reagents = list(/datum/reagent/drug/nicotine = 2, /datum/reagent/consumable/nutriment = 1, /datum/reagent/toxin/berrypoison = 5) grind_results = list(/datum/reagent/drug/nicotine = 5) eat_effect = /datum/status_effect/debuff/badmeal rotprocess = 15 MINUTES @@ -445,13 +445,15 @@ /obj/item/reagent_containers/food/snacks/grown/nut name = "rocknut" + desc = "a nut with mild stimulant properties" seed = /obj/item/seeds/nut icon_state = "nut" tastes = list("nutty" = 1) filling_color = "#6b4d18" - bitesize = 3 + bitesize = 1 foodtype = FRUIT - list_reagents = list(/datum/reagent/consumable/nutriment = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/acorn_powder = 4, /datum/reagent/drug/nicotine = 1) + grind_results = list(/datum/reagent/consumable/acorn_powder = 4) /obj/item/reagent_containers/food/snacks/grown/tomato name = "tomato" diff --git a/code/modules/farming/tools.dm b/code/modules/farming/tools.dm index 1a68409f0c4..9d56466764a 100644 --- a/code/modules/farming/tools.dm +++ b/code/modules/farming/tools.dm @@ -383,8 +383,8 @@ /obj/item/rogueweapon/sickle/scythe force = 15 force_wielded = 25 - possible_item_intents = list(DAGGER_CUT) - gripped_intents = list(SPEAR_BASH,DAGGER_CUT) + possible_item_intents = list(/datum/intent/axe/cut) + gripped_intents = list(/datum/intent/axe/cut,/datum/intent/axe/chop/battle/scythe,SPEAR_BASH) name = "scythe" desc = "A curved blade used to sow harvest." icon_state = "scythe" @@ -400,8 +400,13 @@ slot_flags = ITEM_SLOT_BACK drop_sound = 'sound/foley/dropsound/wooden_drop.ogg' smeltresult = /obj/item/ingot/iron + wdefense = 6 improvised = TRUE +/datum/intent/axe/chop/battle/scythe + reach = 2 + swingdelay = 5 + /obj/item/rogueweapon/sickle/scythe/getonmobprop(tag) . = ..() if(tag) diff --git a/code/modules/fightingstyles.dm b/code/modules/fightingstyles.dm index 775edb067c3..5b716b3dcad 100644 --- a/code/modules/fightingstyles.dm +++ b/code/modules/fightingstyles.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/proc/give_fightingstyle(var/two = FALSE) +/mob/living/carbon/human/proc/give_fightingstyle(two = FALSE) var/list/fightingstyles = list( "Dirty Fighting", "Shield Master", @@ -17,7 +17,7 @@ var/stylechoice_two = input("Choose your second fighting style", "Available fighting styles") as anything in fightingstyles trygivefightingstyle(stylechoice_two) -/mob/living/carbon/human/proc/trygivefightingstyle(var/T) +/mob/living/carbon/human/proc/trygivefightingstyle(T) switch(T) if("Dirty Fighting") ADD_TRAIT(src, TRAIT_NUTCRACKER, TRAIT_GENERIC) @@ -28,7 +28,7 @@ if("Tavern Brawler") ADD_TRAIT(src, TRAIT_CIVILIZEDBARBARIAN, TRAIT_GENERIC) - + if("Unarmed Fighting") ADD_TRAIT(src, TRAIT_PUGILIST, TRAIT_GENERIC) src.mind.adjust_skillrank(/datum/skill/combat/unarmed, 2, TRUE) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 3ad626d60fb..ee917e4c73f 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -261,7 +261,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( image_state = "clown" /obj/effect/hallucination/simple/clown/Initialize(mapload, mob/living/carbon/T, duration) - ..(loc, T) + . = ..(loc, T) name = pick(GLOB.clown_names) QDEL_IN(src,duration) diff --git a/code/modules/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm index a4148ac30e8..797b6f9ab0f 100644 --- a/code/modules/food_and_drinks/food.dm +++ b/code/modules/food_and_drinks/food.dm @@ -13,13 +13,14 @@ reagent_flags = INJECTABLE resistance_flags = FLAMMABLE destroy_sound + var/do_random_pixel_offset = TRUE var/foodtype = NONE var/last_check_time var/in_container = FALSE //currently just stops "was bitten X times!" messages on canned food /obj/item/reagent_containers/food/Initialize(mapload) . = ..() - if(!mapload) + if(!mapload && do_random_pixel_offset) pixel_x = rand(-5, 5) pixel_y = rand(-5, 5) diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index e007c9c0d4c..fb4200b75db 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -177,8 +177,6 @@ gibtype = C.gib_type if(ismonkey(C)) typeofskin = /obj/item/stack/sheet/animalhide/monkey - else if(isalien(C)) - typeofskin = /obj/item/stack/sheet/animalhide/xeno var/occupant_volume if(occupant?.reagents) occupant_volume = occupant.reagents.total_volume @@ -217,7 +215,7 @@ meatslab.throw_at(pick(nearby_turfs),i,3) for (var/turfs=1 to meat_produced) var/turf/gibturf = pick(nearby_turfs) - if (!gibturf.density && src in view(gibturf)) + if (!gibturf.density && (src in view(gibturf))) new gibtype(gibturf,i,diseases) pixel_x = initial(pixel_x) //return to its spot after shaking diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm index 77c64bbb8c5..f7d93402c75 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -287,7 +287,7 @@ /obj/machinery/microwave/proc/loop(type, time, wait = max(12 - 2 * efficiency, 2)) // standard wait is 10 if(stat & (NOPOWER|BROKEN)) - if(MICROWAVE_PRE) + if(type == MICROWAVE_PRE) pre_fail() return if(!time) diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index 3fc00ab549c..25b83a31f6d 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -221,7 +221,7 @@ unprocess() qdel(src) if(!bomb_active || bomb_defused) - if(bomb_defused && bomb in src) + if(bomb_defused && (bomb in src)) bomb.defuse() bomb_active = FALSE unprocess() diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm index ddfd0d3f4f9..0068f5f5d82 100644 --- a/code/modules/goonchat/browserOutput.dm +++ b/code/modules/goonchat/browserOutput.dm @@ -109,7 +109,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico syncRegex() - //do not convert to to_chat() + //do not convert to to_chat SEND_TEXT(owner, "Failed to load fancy chat, reverting to old chat. Certain features won't work.") /datum/chatOutput/proc/showChat() diff --git a/code/modules/holiday/halloween.dm b/code/modules/holiday/halloween.dm deleted file mode 100644 index 99664ead04d..00000000000 --- a/code/modules/holiday/halloween.dm +++ /dev/null @@ -1,280 +0,0 @@ -/////////////////////////////////////// -///////////HALLOWEEN CONTENT/////////// -/////////////////////////////////////// - - -//spooky recipes - -/datum/recipe/sugarcookie/spookyskull - reagents_list = list(/datum/reagent/consumable/flour = 5, /datum/reagent/consumable/sugar = 5, /datum/reagent/consumable/milk = 5) - items = list( - /obj/item/reagent_containers/food/snacks/egg, - ) - result = /obj/item/reagent_containers/food/snacks/sugarcookie/spookyskull - -/datum/recipe/sugarcookie/spookycoffin - reagents_list = list(/datum/reagent/consumable/flour = 5, /datum/reagent/consumable/sugar = 5, /datum/reagent/consumable/coffee = 5) - items = list( - /obj/item/reagent_containers/food/snacks/egg, - ) - result = /obj/item/reagent_containers/food/snacks/sugarcookie/spookycoffin - -////////////////////////////// -//Spookoween trapped closets// -////////////////////////////// - -#define SPOOKY_SKELETON 1 -#define ANGRY_FAITHLESS 2 -#define SCARY_BATS 3 -#define INSANE_CLOWN 4 -#define HOWLING_GHOST 5 - -//Spookoween variables -/obj/structure/closet - var/trapped = 0 - var/mob/trapped_mob - -/obj/structure/closet/Initialize() - . = ..() - if(prob(30)) - set_spooky_trap() - -/obj/structure/closet/dump_contents() - ..() - trigger_spooky_trap() - -/obj/structure/closet/proc/set_spooky_trap() - if(prob(0.1)) - trapped = INSANE_CLOWN - return - if(prob(1)) - trapped = ANGRY_FAITHLESS - return - if(prob(15)) - trapped = SCARY_BATS - return - if(prob(20)) - trapped = HOWLING_GHOST - return - else - var/mob/living/carbon/human/H = new(loc) - H.makeSkeleton() - H.health = 1e5 - insert(H) - trapped_mob = H - trapped = SPOOKY_SKELETON - return - -/obj/structure/closet/proc/trigger_spooky_trap() - if(!trapped) - return - - else if(trapped == SPOOKY_SKELETON) - visible_message(span_userdanger("BOO!")) - playsound(loc, 'sound/spookoween/girlscream.ogg', 300, TRUE) - trapped = 0 - QDEL_IN(trapped_mob, 90) - - else if(trapped == HOWLING_GHOST) - visible_message(span_userdanger("[pick("OooOOooooOOOoOoOOooooOOOOO", "BooOOooOooooOOOO", "BOO!", "WoOOoOoooOooo")]")) - playsound(loc, 'sound/spookoween/ghosty_wind.ogg', 300, TRUE) - new /mob/living/simple_animal/shade/howling_ghost(loc) - trapped = 0 - - else if(trapped == SCARY_BATS) - visible_message(span_userdanger("Protect your hair!")) - playsound(loc, 'sound/spookoween/bats.ogg', 300, TRUE) - var/number = rand(1,3) - for(var/i=0,i < number,i++) - new /mob/living/simple_animal/hostile/retaliate/bat(loc) - trapped = 0 - - else if(trapped == ANGRY_FAITHLESS) - visible_message(span_userdanger("The closet bursts open!")) - visible_message(span_userdanger("THIS BEING RADIATES PURE EVIL! YOU BETTER RUN!!!")) - playsound(loc, 'sound/hallucinations/wail.ogg', 300, TRUE) - var/mob/living/simple_animal/hostile/faithless/F = new(loc) - trapped = 0 - QDEL_IN(F, 120) - - else if(trapped == INSANE_CLOWN) - visible_message(span_userdanger("...")) - playsound(loc, 'sound/spookoween/scary_clown_appear.ogg', 300, TRUE) - spawn_atom_to_turf(/mob/living/simple_animal/hostile/clown_insane, loc, 1, FALSE) - trapped = 0 - -//don't spawn in crates -/obj/structure/closet/crate/trigger_spooky_trap() - return - -/obj/structure/closet/crate/set_spooky_trap() - return - - -//////////////////// -//Spookoween Ghost// -//////////////////// - -/mob/living/simple_animal/shade/howling_ghost - name = "ghost" - real_name = "ghost" - icon = 'icons/mob/mob.dmi' - maxHealth = 1e6 - health = 1e6 - speak_emote = list("howls") - emote_hear = list("wails","screeches") - density = FALSE - anchored = TRUE - incorporeal_move = 1 - layer = 4 - var/timer = 0 - -/mob/living/simple_animal/shade/howling_ghost/Initialize() - . = ..() - icon_state = pick("ghost","ghostian","ghostian2","ghostking","ghost1","ghost2") - icon_living = icon_state - status_flags |= GODMODE - timer = rand(1,15) - -/mob/living/simple_animal/shade/howling_ghost/Life() - ..() - timer-- - if(prob(20)) - roam() - if(timer == 0) - spooky_ghosty() - timer = rand(1,15) - -/mob/living/simple_animal/shade/howling_ghost/proc/EtherealMove(direction) - forceMove(get_step(src, direction)) - setDir(direction) - -/mob/living/simple_animal/shade/howling_ghost/proc/roam() - if(prob(80)) - var/direction = pick(NORTH,SOUTH,EAST,WEST,NORTHEAST,NORTHWEST,SOUTHEAST,SOUTHWEST) - EtherealMove(direction) - -/mob/living/simple_animal/shade/howling_ghost/proc/spooky_ghosty() - if(prob(20)) //haunt - playsound(loc, pick('sound/spookoween/ghosty_wind.ogg','sound/spookoween/ghost_whisper.ogg','sound/spookoween/chain_rattling.ogg'), 300, TRUE) - if(prob(10)) //flickers - var/obj/machinery/light/L = locate(/obj/machinery/light) in view(5, src) - if(L) - L.flicker() - if(prob(5)) //poltergeist - var/obj/item/I = locate(/obj/item) in view(3, src) - if(I) - var/direction = pick(NORTH,SOUTH,EAST,WEST,NORTHEAST,NORTHWEST,SOUTHEAST,SOUTHWEST) - step(I,direction) - return - -/mob/living/simple_animal/shade/howling_ghost/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - . = 0 - -/mob/living/simple_animal/shade/howling_ghost/CanPass(atom/movable/mover, turf/target) - return 1 - - -/////////////////////////// -//Spookoween Insane Clown// -/////////////////////////// - -///Insane clown mob. Basically a clown that haunts you. -/mob/living/simple_animal/hostile/clown_insane - name = "insane clown" - desc = "Some clowns do not manage to be accepted, and go insane. This is one of them." - icon = 'icons/mob/clown_mobs.dmi' - icon_state = "scary_clown" - icon_living = "scary_clown" - icon_dead = "scary_clown" - icon_gib = "scary_clown" - speak = list("...", ". . .") - maxHealth = 1e6 - health = 1e6 - emote_see = list("silently stares") - unsuitable_atmos_damage = 0 - var/timer - -/mob/living/simple_animal/hostile/clown_insane/Initialize() - . = ..() - status_flags |= GODMODE //Slightly easier to maintain. - -/mob/living/simple_animal/hostile/clown_insane/Destroy() - timer = null - return ..() - -/mob/living/simple_animal/hostile/clown_insane/ex_act() - return - -///Adds a timer to call stalk() on Aggro -/mob/living/simple_animal/hostile/clown_insane/Aggro() - . = ..() - timer = addtimer(CALLBACK(src, PROC_REF(stalk)), 30, TIMER_STOPPABLE|TIMER_UNIQUE) - -/mob/living/simple_animal/hostile/clown_insane/LoseAggro() - . = ..() - if(timer) - deltimer(timer) - timer = null - -///Plays scary noises and adds some timers. -/mob/living/simple_animal/hostile/clown_insane/proc/stalk() - var/mob/living/M = target - if(!istype(M)) - LoseAggro() - return - if(M.stat == DEAD) - playsound(M.loc, 'sound/spookoween/insane_low_laugh.ogg', 100, TRUE) - qdel(src) - return - playsound(M, pick('sound/spookoween/scary_horn.ogg','sound/spookoween/scary_horn2.ogg', 'sound/spookoween/scary_horn3.ogg'), 100, TRUE) - timer = addtimer(CALLBACK(src, PROC_REF(stalk)), 30, TIMER_STOPPABLE|TIMER_UNIQUE) - addtimer(CALLBACK(src, PROC_REF(teleport_to_target)), 12, TIMER_STOPPABLE|TIMER_UNIQUE) - -///Does what's in the name. Teleports to target.loc. Called from a timer. -/mob/living/simple_animal/hostile/clown_insane/proc/teleport_to_target() - if(target && isturf(target.loc)) //Hiding in lockers works to get rid of this thing. - forceMove(target.loc) - -/mob/living/simple_animal/hostile/clown_insane/MoveToTarget() - return - -/mob/living/simple_animal/hostile/clown_insane/AttackingTarget() - return - -/mob/living/simple_animal/hostile/clown_insane/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - . = 0 - if(prob(5)) - playsound(loc, 'sound/spookoween/insane_low_laugh.ogg', 300, TRUE) - -/mob/living/simple_animal/hostile/clown_insane/attackby(obj/item/O, mob/user) - if(istype(O, /obj/item/nullrod)) - if(prob(5)) - visible_message(span_notice("[src] finally found the peace it deserves. You hear honks echoing off into the distance.")) - playsound(loc, 'sound/spookoween/insane_low_laugh.ogg', 300, TRUE) - qdel(src) - else - visible_message(span_danger("[src] seems to be resisting the effect!")) - return - return ..() - -/mob/living/simple_animal/hostile/clown_insane/handle_temperature_damage() - return - -///////////////////////// -// Spooky Uplink Items // -///////////////////////// - -/datum/uplink_item/dangerous/crossbow/candy - name = "Candy Corn Crossbow" - desc = "A standard miniature energy crossbow that uses a hard-light projector to transform bolts into candy corn. Happy Halloween!" - category = "Holiday" - item = /obj/item/gun/energy/kinetic_accelerator/crossbow/halloween - surplus = 0 - -/datum/uplink_item/device_tools/emag/hack_o_lantern - name = "Hack-o'-Lantern" - desc = "An emag fitted to support the Halloween season. Candle not included." - category = "Holiday" - item = /obj/item/card/emag/halloween - surplus = 0 diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index 2fd6087dfa8..5fd6aa2e74c 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -18,7 +18,7 @@ //if they are holding or wearing a card that has access, that works if(check_access(H.get_active_held_item()) || src.check_access(H.wear_ring)) return TRUE - else if(ismonkey(M) || isalienadult(M)) + else if(ismonkey(M)) var/mob/living/carbon/george = M //they can only hold things :( if(check_access(george.get_active_held_item())) diff --git a/code/modules/jobs/job_exp.dm b/code/modules/jobs/job_exp.dm index 20e17778120..87a32601e07 100644 --- a/code/modules/jobs/job_exp.dm +++ b/code/modules/jobs/job_exp.dm @@ -40,9 +40,10 @@ GLOBAL_PROTECT(exp_to_update) return exp_type /proc/job_is_xp_locked(jobtitle) - if(!CONFIG_GET(flag/use_exp_restrictions_heads) && jobtitle in (GLOB.command_positions | list("AI"))) + var/is_head = (jobtitle in GLOB.command_positions) || jobtitle == "AI" + if(!CONFIG_GET(flag/use_exp_restrictions_heads) && is_head) return FALSE - if(!CONFIG_GET(flag/use_exp_restrictions_other) && !(jobtitle in (GLOB.command_positions | list("AI")))) + if(!CONFIG_GET(flag/use_exp_restrictions_other) && !is_head) return FALSE return TRUE diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index adce6ea879d..52ed7c9a223 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -144,7 +144,7 @@ /datum/job/proc/special_job_check(mob/dead/new_player/player) return TRUE -/client/proc/job_greet(var/datum/job/greeting_job) +/client/proc/job_greet(datum/job/greeting_job) if(mob.job == greeting_job.title) greeting_job.greet(mob) diff --git a/code/modules/jobs/job_types/old/botanist.dm b/code/modules/jobs/job_types/old/botanist.dm index 24fb902f1be..fa18abf8efa 100644 --- a/code/modules/jobs/job_types/old/botanist.dm +++ b/code/modules/jobs/job_types/old/botanist.dm @@ -48,4 +48,4 @@ minimal_access = list(ACCESS_HYDROPONICS, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) paycheck = PAYCHECK_EASY paycheck_department = ACCOUNT_SRV - display_order = JOB_DISPLAY_ORDER_BOTANIST \ No newline at end of file + display_order = JOB_DISPLAY_ORDER_BOTANIST diff --git a/code/modules/jobs/job_types/old/cargo_technician.dm b/code/modules/jobs/job_types/old/cargo_technician.dm index 3eb1dfcfd72..fd4144716ff 100644 --- a/code/modules/jobs/job_types/old/cargo_technician.dm +++ b/code/modules/jobs/job_types/old/cargo_technician.dm @@ -25,5 +25,3 @@ belt = /obj/item/pda/cargo ears = /obj/item/radio/headset/headset_cargo uniform = /obj/item/clothing/under/rank/cargo/tech - l_hand = /obj/item/export_scanner - diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/_advclass.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/_advclass.dm index c6219e8374d..72f2476748b 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/_advclass.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/_advclass.dm @@ -39,9 +39,13 @@ //sleep(1) //testing("[H] spawn troch") + +/* // This is what put the torch in adventurers' hands, causing the spam var/obj/item/flashlight/flare/torch/T = new() T.spark_act() H.put_in_hands(T, forced = TRUE) +*/ + //framework for being able to list spells instead of individually input them var/list/skills var/list/roundstart_experience diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/antag/roguemage.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/antag/roguemage.dm deleted file mode 100644 index f919361c347..00000000000 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/antag/roguemage.dm +++ /dev/null @@ -1,57 +0,0 @@ -/datum/advclass/roguemage //mage class - like the adventurer mage, but more evil. - name = "Rogue Mage" - tutorial = "Those fools at the academy laughed at you and cast you from the ivory tower of higher learning and magickal practice. No matter - you will ascend to great power one day, but first you need wealth - vast amounts of it. Show those fools in the town what REAL magic looks like." - allowed_sexes = list(MALE, FEMALE) - allowed_races = RACES_ALL_KINDSPLUS - outfit = /datum/outfit/job/roguetown/bandit/roguemage - category_tags = list(CTAG_BANDIT) - cmode_music = 'sound/music/combat_bandit_mage.ogg' - -/datum/outfit/job/roguetown/bandit/roguemage/pre_equip(mob/living/carbon/human/H) - ..() - shoes = /obj/item/clothing/shoes/roguetown/simpleshoes - pants = /obj/item/clothing/under/roguetown/trou/leather - shirt = /obj/item/clothing/suit/roguetown/shirt/shortshirt - armor = /obj/item/clothing/suit/roguetown/shirt/robe/black - belt = /obj/item/storage/belt/rogue/leather/rope - beltr = /obj/item/reagent_containers/glass/bottle/rogue/manapot - backr = /obj/item/storage/backpack/rogue/satchel - backpack_contents = list(/obj/item/needle/thorn = 1, /obj/item/natural/cloth = 1) - mask = /obj/item/clothing/mask/rogue/facemask/steel - neck = /obj/item/clothing/neck/roguetown/coif - head = /obj/item/clothing/head/roguetown/helmet/leather/volfhelm - - r_hand = /obj/item/rogueweapon/woodstaff - if(H.mind) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/swimming, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 3, TRUE) //needs climbing to get into hideout - H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/crafting, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/riding, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 2, TRUE) - if(H.age == AGE_OLD) - head = /obj/item/clothing/head/roguetown/wizhat/gen - armor = /obj/item/clothing/suit/roguetown/shirt/robe - H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 1, TRUE) - H.change_stat("speed", -1) - H.change_stat("intelligence", 1) - H.change_stat("perception", 1) - H.mind.adjust_spellpoints(1) - H.change_stat("strength", 2) - H.change_stat("intelligence", 1) - H.change_stat("endurance", 1) - H.change_stat("speed",1) - H.mind.adjust_spellpoints(4) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/prestidigitation) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/learnspell) - H.verbs |= /mob/proc/haltyell - H.ambushable = FALSE diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/antag/sawbones.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/antag/sawbones.dm index a3a29c6f261..0eb575508ef 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/antag/sawbones.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/antag/sawbones.dm @@ -24,7 +24,7 @@ /obj/item/reagent_containers/glass/bottle/rogue/healthpot = 1, /obj/item/clothing/mask/rogue/physician = 1, /obj/item/storage/box/matches = 1, /// for carterizer and lantern. - /obj/item/clothing/ring/lantern = 1, + /obj/item/flashlight/flare/torch/lantern/ring = 1, /obj/item/storage/fancy/skit = 1, ) H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 4, TRUE) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/amazon.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/amazon.dm index da4daf36aaf..fb972f1811f 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/amazon.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/amazon.dm @@ -40,6 +40,7 @@ H.change_stat("intelligence", -1) H.change_stat("constitution", 2) H.change_stat("endurance", 2) + H.change_stat("speed", 2) backpack_contents = list(/obj/item/restraints/legcuffs/bola, /obj/item/restraints/legcuffs/bola, /obj/item/restraints/legcuffs/bola) ADD_TRAIT(H, TRAIT_DEATHBYSNOOSNOO, TRAIT_GENERIC) //doubles sex damage ADD_TRAIT(H, TRAIT_STRONGTHROW, TRAIT_GENERIC) //mighty throws, javelins etc diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/barbarian.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/barbarian.dm index f17f7d5e6e5..b672d258e41 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/barbarian.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/barbarian.dm @@ -70,7 +70,7 @@ H.mind.adjust_skillrank_up_to(/datum/skill/craft/traps, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/labor/fishing, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/sewing, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, 2, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 1, TRUE) @@ -91,6 +91,7 @@ armor = /obj/item/clothing/suit/roguetown/armor/leather/hide H.change_stat("intelligence", -1) // The hunter is smarter, more skilled -- but not as tough. H.change_stat("strength", 2) + H.change_stat("perception", 1) H.change_stat("constitution", 2) H.change_stat("endurance", 3) H.dna.species.soundpack_m = new /datum/voicepack/male/warrior() diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/bard.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/bard.dm index 5785844b59e..aace0fcb31d 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/bard.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/bard.dm @@ -47,7 +47,7 @@ beltr = /obj/item/rogueweapon/huntingknife/idagger H.change_stat("intelligence", 1) H.change_stat("perception", 2) - H.change_stat("endurance", 1) + H.change_stat("endurance", 2) H.change_stat("speed", 2) if("Skald") H.set_blindness(0) @@ -81,11 +81,12 @@ beltl = /obj/item/storage/belt/rogue/pouch/coins/mid l_hand = /obj/item/rogueweapon/sword/iron H.change_stat("constitution", 2) - H.change_stat("strength", 1) + H.change_stat("strength", 2) H.change_stat("speed", 1) + H.change_stat("endurance", 1) if("Arcanist") H.set_blindness(0) - to_chat(H, span_warning("Some bards are can craft musical sorceries, so it makes sense some pick up actual ones. Perhaps not as good as the real deal, of course.")) + to_chat(H, span_warning("Many bards can craft musical sorceries, so it makes sense some pick up traditional sorcery. Not quite as good as the real deal, of course.")) H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 2, TRUE) @@ -113,7 +114,7 @@ backl = /obj/item/storage/backpack/rogue/satchel beltl = /obj/item/storage/belt/rogue/pouch/coins/poor beltr = /obj/item/rogueweapon/huntingknife/idagger/steel - H.change_stat("intelligence", 1) + H.change_stat("intelligence", 2) H.change_stat("perception", 2) H.change_stat("endurance", 1) H.change_stat("speed", 2) @@ -165,6 +166,7 @@ ADD_TRAIT(H, TRAIT_EMPATH, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC) //You have speed, use it. What musucian plays with cumbersome armor anyway? ADD_TRAIT(H, TRAIT_GOODLOVER, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC) if(isseelie(H)) H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/seelie_dust) H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/summon_rat) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm index 5b90e4582c7..33f7026c520 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/cleric.dm @@ -107,14 +107,15 @@ H.change_stat("endurance", 2) H.change_stat("speed", 1) ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_KNEESTINGER_IMMUNITY, TRAIT_GENERIC) H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/diagnose/secular) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_glowshroom) // HEARTHSTONE ADD: cloistered cleric subclass (lighter armored and equipped) if("Temple Devout") - // Devout start without the typical cleric medium/heavy armor shtick and without much in the way of weapons or skills to use them. + // Devout start without the typical cleric heavy armor shtick and without much in the way of weapons or skills to use them. // They're better with miracles and regenerate devotion passively like the Priest does, however. H.set_blindness(0) - to_chat(H, span_warning("You are a cloistered cleric, a devout traveller whom has engressed into distant lands to spread the word of your chosen Patron. Having secluded yourself for many years, your body has suffered... But you have gained great insight as a result!")) + to_chat(H, span_warning("You are a Temple cleric, a devout traveller whom has engressed into distant lands to spread the word of your chosen Patron. Having secluded yourself for many years, your body has suffered... But you have gained great insight as a result!")) H.mind.adjust_skillrank_up_to(/datum/skill/magic/holy, 5, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/cooking, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 4, TRUE) @@ -131,6 +132,7 @@ H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/guidance5e) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/churn) H.mind.AddSpell(new /obj/effect/proc_holder/spell/self/light5e) + ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) // HEARTHSTONE ADDITION END armor = /obj/item/clothing/suit/roguetown/armor/plate/half/iron @@ -152,7 +154,7 @@ cloak = /obj/item/clothing/cloak/raincloak/furcloak shoes = /obj/item/clothing/shoes/roguetown/boots // HEARTHSTONE ADD: cloistered devout custom outfits - else if (classchoice == "Cloistered Devout") + else if (classchoice == "Temple Devout") // do the generic stuff first then replace it w/ patron specific things... if it exists // for reference, cloistered devouts are lightly armored/unarmored but get patron-specific stuff (if applicable) and a devo regen head = /obj/item/clothing/head/roguetown/roguehood/black @@ -174,12 +176,6 @@ armor = /obj/item/clothing/suit/roguetown/shirt/robe/noc pants = /obj/item/clothing/under/roguetown/tights/black belt = /obj/item/storage/belt/rogue/leather/black - if (H.mind) - H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 1, TRUE) - H.mind.adjust_spellpoints(1) - H.verbs += list(/mob/living/carbon/human/proc/magicreport, /mob/living/carbon/human/proc/magiclearn) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/prestidigitation) - if(/datum/patron/divine/necra) head = /obj/item/clothing/head/roguetown/necrahood armor = /obj/item/clothing/suit/roguetown/shirt/robe/necra @@ -197,14 +193,20 @@ armor = /obj/item/clothing/suit/roguetown/shirt/robe/psydonrobe if(/datum/patron/divine/eora) armor = /obj/item/clothing/suit/roguetown/shirt/robe/eora + if(/datum/patron/inhumen/graggar) + if(H.mind) + H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 1, TRUE) + H.mind.adjust_spellpoints(1) // HEARTHSTONE ADDITION END var/datum/devotion/C = new /datum/devotion(H, H.patron) // HEARTHSTONE ADDITION: cloistered devout devo regen & tier buff - if (classchoice == "Cloistered Devout") - if(H.patron?.type == /datum/patron/divine/noc) - C.grant_spells_devout_noc(H) - else - C.grant_spells_devout(H) + if (classchoice == "Temple Devout") + C.grant_spells_devout(H) + H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 1, TRUE) + H.mind.adjust_spellpoints(1) + H.verbs += list(/mob/living/carbon/human/proc/magicreport, /mob/living/carbon/human/proc/magiclearn) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/prestidigitation) + ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC) else C.grant_spells_cleric(H) // HEARTHSTONE ADDITION END diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dbomb.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dbomb.dm index da1c793e5e9..0cd61ed5ec1 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dbomb.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dbomb.dm @@ -31,11 +31,12 @@ H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/crafting, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 2, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/tanning, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/sewing, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 3, TRUE) - H.change_stat("strength", 1) - H.change_stat("endurance", 1) + H.change_stat("strength", 2) + H.change_stat("endurance", 2) + H.change_stat("intelligence", 2) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/dwarfwarrior.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/dwarfwarrior.dm index e9178cd3117..5f8edc4ea80 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/dwarfwarrior.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/dwarfwarrior.dm @@ -34,7 +34,6 @@ else r_hand = /obj/item/rogueweapon/halberd beltl = /obj/item/rogueweapon/huntingknife - H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 3, TRUE) @@ -44,7 +43,15 @@ H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/cooking, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/labor/butchering, 1, TRUE) - H.change_stat("constitution", 3) // Seven points just like Warrior. They already get a debuff racial to speed. Please do not stack it God please. + H.mind.adjust_skillrank_up_to(/datum/skill/labor/mining, 3, TRUE) + + H.change_stat("constitution", 3) // Eight points just like Warrior. They already get a debuff racial to speed. Please do not stack it God please. + H.change_stat("perception", 1) H.change_stat("strength", 2) H.change_stat("endurance", 2) ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) + + H.give_fightingstyle(TRUE) + + H.mind.AddSpell(new /obj/effect/proc_holder/spell/self/secondwind) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/paladin.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/paladin.dm index dca7033a277..8d2551945e3 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/paladin.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/donator/paladin.dm @@ -150,3 +150,6 @@ //Max devotion limit - Paladins are stronger but cannot pray to gain all abilities beyond t2 C.grant_spells_templar(H) H.verbs += list(/mob/living/carbon/human/proc/devotionreport, /mob/living/carbon/human/proc/clericpray) + if(H.mind && H.patron?.type == /datum/patron/inhumen/graggar) + H.mind.adjust_spellpoints(1) + H.verbs += list(/mob/living/carbon/human/proc/magicreport, /mob/living/carbon/human/proc/magiclearn) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dwarfranger.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dwarfranger.dm index 3a70b2d8a53..abaae8ffa91 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dwarfranger.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/dwarfranger.dm @@ -35,7 +35,7 @@ H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, 3, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, 5, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/tanning, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/sewing, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 1, TRUE) @@ -48,3 +48,4 @@ H.change_stat("endurance", 1) H.change_stat("speed", 1) ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/mage.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/mage.dm index affe70f242f..a55b442fe42 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/mage.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/mage.dm @@ -7,6 +7,7 @@ outfit = /datum/outfit/job/roguetown/adventurer/mage category_tags = list(CTAG_ADVENTURER) cmode_music = 'sound/music/combat_bandit_mage.ogg' + traits_applied = list(TRAIT_USEMAGICITEM) /datum/outfit/job/roguetown/adventurer/mage/pre_equip(mob/living/carbon/human/H) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/ranger.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/ranger.dm index 22a408dffb8..06d1d7a001b 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/ranger.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/ranger.dm @@ -69,7 +69,7 @@ backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/steel/special = 1, /obj/item/reagent_containers/glass/bottle/rogue/trekkersdelight = 1) beltl = /obj/item/quiver/arrows H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 2, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE) @@ -90,7 +90,7 @@ H.mind.adjust_skillrank_up_to(/datum/skill/misc/tracking, 2, TRUE) //Hearthstone change. H.change_stat("perception", 2) H.change_stat("endurance", 1) - H.change_stat("speed", 3) + H.change_stat("speed", 2) ADD_TRAIT(H, TRAIT_BLINDFIGHTING, TRAIT_GENERIC) if(!HAS_TRAIT(H, TRAIT_NIGHT_VISION)) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/bladesinger.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/bladesinger.dm index bd1be073fb5..3669bccf746 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/bladesinger.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/bladesinger.dm @@ -7,7 +7,7 @@ /datum/species/elf/wood, ) maximum_possible_slots = 2 - traits_applied = list(TRAIT_MEDIUMARMOR) + traits_applied = list(TRAIT_MEDIUMARMOR, TRAIT_USEMAGICITEM) category_tags = list(CTAG_ADVENTURER) outfit = /datum/outfit/job/roguetown/adventurer/bladesinger diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/treasurehunter.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/treasurehunter.dm index 3129e33deb8..22246850797 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/treasurehunter.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/treasurehunter.dm @@ -48,4 +48,4 @@ H.change_stat("intelligence", 1) H.change_stat("speed", 2) H.change_stat("endurance", -2) - H.change_stat("fortune", 1) + H.change_stat("fortune", 3) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/witchhunter.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/witchhunter.dm index 941b51efa5d..e5a27e96a86 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/witchhunter.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/witchhunter.dm @@ -6,7 +6,7 @@ allowed_races = RACES_ALL_KINDSPLUS outfit = /datum/outfit/job/roguetown/adventurer/puritan maximum_possible_slots = 2 - traits_applied = list(TRAIT_MEDIUMARMOR, TRAIT_PERFECT_TRACKER) + traits_applied = list(TRAIT_MEDIUMARMOR, TRAIT_PERFECT_TRACKER, TRAIT_USEMAGICITEM) category_tags = list(CTAG_ADVENTURER) /datum/outfit/job/roguetown/adventurer/puritan diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm index d98183a8093..ebd405e8a4e 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm @@ -88,9 +88,9 @@ ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_SEEPRICES_SHITTY, TRAIT_GENERIC) - H.change_stat("strength", -1) + ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC) H.change_stat("perception", 2) - H.change_stat("speed", 4) + H.change_stat("speed", 3) H.change_stat("intelligence", 2) //Assassin, nearly same as rogue but not versatile in weapon skills yet specialized in knives. @@ -128,12 +128,13 @@ backl = /obj/item/storage/backpack/rogue/satchel beltl = /obj/item/rogueweapon/huntingknife/idagger/steel backr = /obj/item/gun/ballistic/revolver/grenadelauncher/crossbow - beltr = /obj/item/quiver/Pbolts + beltr = /obj/item/quiver/bolts ADD_TRAIT(H, TRAIT_GOODLOVER, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC) //they are killers ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC) - H.change_stat("perception", 1) - H.change_stat("speed", 4) + ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC) + H.change_stat("perception", 2) + H.change_stat("speed", 3) H.change_stat("intelligence", 2) H.visible_message(span_info("I honed my skills as an assassin through the years. My bracers have a hidden blade, and my boots have a bottle of berry poison.")) backpack_contents = list(/obj/item/lockpickring/mundane, /obj/item/rogueweapon/huntingknife/idagger/steel) @@ -182,8 +183,10 @@ ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) //if they got all the shield and parry stuff, might aswell. ADD_TRAIT(H, TRAIT_NUTCRACKER, TRAIT_GENERIC) //extra damage to groin (dirty fighting) ADD_TRAIT(H, TRAIT_NOSEGRAB, TRAIT_GENERIC) //funny nose grab. + ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC) H.change_stat("strength", 1) - H.change_stat("speed", 2) + H.change_stat("speed", 3) + H.change_stat("perception", 1) H.change_stat("intelligence", 2) H.visible_message(span_info("I trained as a swashbuckler. I have some skills and tricks under my cape.")) @@ -215,18 +218,22 @@ beltr = /obj/item/rogueweapon/huntingknife/idagger/steel beltl = /obj/item/rogueweapon/huntingknife/idagger/steel backpack_contents = list(/obj/item/lockpick) + ADD_TRAIT(H, TRAIT_GOODLOVER, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_NUTCRACKER, TRAIT_GENERIC) //extra damage to groin (dirty fighting) ADD_TRAIT(H, TRAIT_SEEPRICES_SHITTY, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC) H.change_stat("strength", -1) H.change_stat("perception", 2) - H.change_stat("speed", 2) + H.change_stat("speed", 3) H.change_stat("intelligence", 3) H.visible_message(span_info("I’m not just a thief. I'm a master of illusion and deception. One moment, I'm a harmless vagabond. The next, I'm a blur of motion, leaving my pursuers bewildered and outwitted.")) H.verbs += list(/mob/living/carbon/human/proc/magicreport, /mob/living/carbon/human/proc/magiclearn) + /* if(H.mind) H.mind.adjust_spellpoints(3) + */ // Brings them down to arcanist bard levels of spell-points. Lets not have them be better spellcasters than warlocks H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/prestidigitation) H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/projectile/fetch) H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/rogue_knock) @@ -264,9 +271,10 @@ ADD_TRAIT(H, TRAIT_NOSTINK, TRAIT_GENERIC) //never queezy around death ADD_TRAIT(H, TRAIT_SIXTHSENSE, TRAIT_GENERIC) //can hear ghosts ADD_TRAIT(H, TRAIT_SOUL_EXAMINE, TRAIT_GENERIC) //can determine if someone has their soul. + ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC) H.change_stat("perception", 2) H.change_stat("constitution", 1) - H.change_stat("speed", 3) + H.change_stat("speed", 2) H.change_stat("intelligence", 2) H.visible_message(span_info("I am a conduit between the living and the dead, half in, half out, a phantom that hears the whispers of the departed and uses them for my personal gain.")) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm index 0479396e058..e0ae2d874c9 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warlock.dm @@ -6,7 +6,6 @@ allowed_sexes = list(MALE, FEMALE) allowed_races = RACES_ALL_KINDSPLUS outfit = /datum/outfit/job/roguetown/adventurer/warlock - //traits_applied = list(TRAIT_DODGEEXPERT) category_tags = list(CTAG_ADVENTURER) cmode_music = 'sound/music/combat_bandit_mage.ogg' @@ -70,7 +69,8 @@ "love", //ring of soulbinding "friendship", //Pact of the Chain "power", //empowered eldritch blast - "purpose" //Pact of the Star Chain + "purpose", //Pact of the Star Chain + "revenge" //give curse ) var/boonchoice = input("What did you sell your faith for?", "Available boons") as anything in boons @@ -89,6 +89,7 @@ H.change_stat("intelligence", 1) H.mind.adjust_skillrank(/datum/skill/misc/reading, 2, TRUE) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/guidance5e) + ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC) if("power") //empowered eldritch blast H.mind.RemoveSpell(/obj/effect/proc_holder/spell/invoked/projectile/eldritchblast5e) H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/projectile/eldritchblast5e/empowered) @@ -128,6 +129,7 @@ head = /obj/item/clothing/head/roguetown/helmet/foresterhelmet armor = /obj/item/clothing/suit/roguetown/shirt/robe/mage + shoes = /obj/item/clothing/shoes/roguetown/sandals r_hand = /obj/item/rogueweapon/woodstaff beltr = /obj/item/storage/belt/rogue/pouch/coins/poor belt = /obj/item/storage/belt/rogue/leather/rope @@ -149,18 +151,21 @@ H.visible_message(span_info("I made a deal with an archseelie from the wild.")) /datum/outfit/job/roguetown/adventurer/warlock/proc/celestialpatron(mob/living/carbon/human/H, patronchoice) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 2, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE) H.mind.adjust_skillrank(/datum/skill/misc/medicine, 2, TRUE) - armor = /obj/item/clothing/suit/roguetown/armor/chainmail - shirt = /obj/item/clothing/suit/roguetown/armor/gambeson + // armor = /obj/item/clothing/suit/roguetown/armor/chainmail + if(H.gender == MALE) + shirt = /obj/item/clothing/suit/roguetown/armor/gambeson + else + shirt = /obj/item/clothing/suit/roguetown/armor/armordress wrists = /obj/item/clothing/wrists/roguetown/bracers/leather - pants = /obj/item/clothing/under/roguetown/trou/leather - shoes = /obj/item/clothing/shoes/roguetown/boots/leather + pants = /obj/item/clothing/under/roguetown/tights/random + shoes = /obj/item/clothing/shoes/roguetown/simpleshoes beltr = /obj/item/storage/belt/rogue/pouch/coins/poor belt = /obj/item/storage/belt/rogue/leather - beltl = /obj/item/rogueweapon/mace + r_hand = /obj/item/rogueweapon/spear backpack_contents = list(/obj/item/rogueweapon/huntingknife) //caster stats (must be 5 stat point total) @@ -190,7 +195,7 @@ head = /obj/item/clothing/head/roguetown/fisherhat shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/sailor cloak = /obj/item/clothing/cloak/raincloak/yellow - gloves = /obj/item/clothing/gloves/roguetown/plate/zybantinegauntlets + // gloves = /obj/item/clothing/gloves/roguetown/plate/zybantinegauntlets // No plate gloves for you wrists = /obj/item/rope r_hand = /obj/item/rogueweapon/pitchfork beltr = /obj/item/storage/belt/rogue/pouch/coins/poor @@ -314,20 +319,10 @@ gloves = /obj/item/clothing/gloves/roguetown/leather belt = /obj/item/storage/belt/rogue/leather shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/random - if(prob(70)) - armor = /obj/item/clothing/suit/roguetown/armor/chainmail/hauberk - else if(prob(50)) - armor = /obj/item/clothing/suit/roguetown/armor/plate/half/iron - else - armor = /obj/item/clothing/suit/roguetown/armor/plate/scale - if(prob(20)) - mask = /obj/item/clothing/mask/rogue/facemask - else if(prob(60)) - head = /obj/item/clothing/head/roguetown/helmet/leather - else if(prob(20)) - head = /obj/item/clothing/head/roguetown/helmet/skullcap - else - head = /obj/item/clothing/head/roguetown/helmet/kettle + if(H.gender == MALE) + shirt = /obj/item/clothing/suit/roguetown/armor/gambeson + else + shirt = /obj/item/clothing/suit/roguetown/armor/armordress // Armor downgrade from hauberk to gambeson beltl = /obj/item/rogueweapon/huntingknife beltr = /obj/item/storage/belt/rogue/pouch/coins/poor @@ -349,40 +344,27 @@ H.visible_message(span_info("I made a deal with a sentient weapon.")) /datum/outfit/job/roguetown/adventurer/warlock/proc/undeadpatron(mob/living/carbon/human/H, patronchoice) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 2, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/shields, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 2, TRUE) H.mind.adjust_skillrank(/datum/skill/misc/sneaking, 2, TRUE) H.mind.adjust_skillrank(/datum/skill/misc/stealing, 3, TRUE) H.mind.adjust_skillrank(/datum/skill/misc/climbing, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE) - if(prob(20)) - head = /obj/item/clothing/head/roguetown/knitcap - else - head = null - if(prob(10)) - cloak = /obj/item/clothing/cloak/raincloak/brown - else - cloak = null - if(prob(10)) - gloves = /obj/item/clothing/gloves/roguetown/fingerless - else - gloves = /obj/item/clothing/gloves/roguetown/brigandinegauntlets - armor = /obj/item/clothing/suit/roguetown/armor/plate/half/iron - pants = /obj/item/clothing/under/roguetown/tights/vagrant - if(prob(50)) - pants = /obj/item/clothing/under/roguetown/tights/vagrant/l - shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/vagrant - if(prob(50)) - shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/vagrant/l - wrists = /obj/item/clothing/wrists/roguetown/bracers + cloak = /obj/item/clothing/cloak/raincloak/brown + gloves = /obj/item/clothing/gloves/roguetown/angle + armor = /obj/item/clothing/suit/roguetown/armor/plate/half/iron + pants = /obj/item/clothing/under/roguetown/tights/random + shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/random + wrists = /obj/item/clothing/wrists/roguetown/vambraces neck = /obj/item/clothing/neck/roguetown/gorget - shoes = /obj/item/clothing/shoes/roguetown/boots/armor + shoes = /obj/item/clothing/shoes/roguetown/boots/armoriron + head = /obj/item/clothing/head/roguetown/helmet/ironpothelmet beltr = /obj/item/storage/belt/rogue/pouch/coins/poor belt = /obj/item/storage/belt/rogue/leather - beltl = /obj/item/rogueweapon/mace - backl = /obj/item/rogueweapon/sword/iron/short - + beltl = /obj/item/rogueweapon/sword/iron/short + backl = /obj/item/rogueweapon/shield/tower + // They're the tank subclass, so I'm keeping their armor in. If it's a problem, it's pretty easy to comment it out and give them hauberks instead //tank stats (must be 5 stat point total) H.change_stat("strength", 1) H.change_stat("endurance", 2) @@ -392,7 +374,7 @@ H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/infestation5e) H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/chilltouch5e) // decay-themed magic and a skeletal hand to attack people with - ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) + // ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) // Unnecessary with the heavy armor trait ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_NOSTINK, TRAIT_GENERIC) @@ -430,6 +412,7 @@ eldritchhealing.targetnotification = "Maggots eat away my dead flesh!" eldritchhealing.othernotification = "'s wounds are healed by... Maggots?" H.mind.AddSpell(eldritchhealing) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/diagnose/secular) // If you get healing, you get diagnose /////////////////////////////// // Curse @@ -485,7 +468,7 @@ //removed eldritch blast and infestation spell1 = pick(/obj/effect/proc_holder/spell/invoked/projectile/fireball,/obj/effect/proc_holder/spell/invoked/projectile/lightningbolt,/obj/effect/proc_holder/spell/invoked/projectile/fetch,/obj/effect/proc_holder/spell/invoked/projectile/spitfire,/obj/effect/proc_holder/spell/invoked/projectile/firebolt5e,/obj/effect/proc_holder/spell/invoked/projectile/rayoffrost5e,/obj/effect/proc_holder/spell/invoked/projectile/acidsplash5e,/obj/effect/proc_holder/spell/invoked/blade_burst,/obj/effect/proc_holder/spell/invoked/frostbite5e,/obj/effect/proc_holder/spell/invoked/poisonspray5e,/obj/effect/proc_holder/spell/invoked/arcyne_storm,/obj/effect/proc_holder/spell/invoked/chilltouch5e,/obj/effect/proc_holder/spell/invoked/mindsliver5e,/obj/effect/proc_holder/spell/targeted/lightninglure5e,/obj/effect/proc_holder/spell/invoked/greenflameblade5e,) spell2 = pick(/obj/effect/proc_holder/spell/invoked/forcewall_weak,/obj/effect/proc_holder/spell/self/bladeward5e,) - spell3 = pick(/obj/effect/proc_holder/spell/invoked/slowdown_spell_aoe,/obj/effect/proc_holder/spell/invoked/message,/obj/effect/proc_holder/spell/invoked/push_spell,/obj/effect/proc_holder/spell/invoked/longjump,/obj/effect/proc_holder/spell/aoe_turf/conjure/Wolf,/obj/effect/proc_holder/spell/targeted/guidance5e,/obj/effect/proc_holder/spell/targeted/encodethoughts5e,/obj/effect/proc_holder/spell/invoked/magicstone5e,/obj/effect/proc_holder/spell/invoked/mending5e,/obj/effect/proc_holder/spell/self/light5e,/obj/effect/proc_holder/spell/aoe_turf/conjure/createbonfire5e,) + spell3 = pick(/obj/effect/proc_holder/spell/invoked/slowdown_spell_aoe,/obj/effect/proc_holder/spell/invoked/message,/obj/effect/proc_holder/spell/invoked/push_spell,/obj/effect/proc_holder/spell/invoked/longjump,/obj/effect/proc_holder/spell/aoe_turf/conjure/Wolf,/obj/effect/proc_holder/spell/targeted/guidance5e,/obj/effect/proc_holder/spell/targeted/encodethoughts5e,/obj/effect/proc_holder/spell/invoked/magicstone5e,/obj/effect/proc_holder/spell/invoked/mending5e,/obj/effect/proc_holder/spell/self/light5e,/obj/effect/proc_holder/spell/aoe_turf/conjure/createbonfire5e,/obj/effect/proc_holder/spell/targeted/touch/prestidigitation,) /obj/item/book/rogue/eldritch/equipped(mob/living/user) @@ -503,6 +486,7 @@ return /obj/item/book/rogue/eldritch/dropped(mob/living/user) + . = ..() if(active_item) to_chat(user, span_notice("Your intellect shrinks away")) user.change_stat("intelligence", -1) @@ -571,6 +555,7 @@ return /obj/item/clothing/ring/gold/signet/dropped(mob/living/user) + . = ..() if(active_item) to_chat(user, span_notice("You feel like a peasant.")) REMOVE_TRAIT(user, TRAIT_NOBLE, TRAIT_GENERIC) @@ -605,6 +590,7 @@ return /obj/item/clothing/neck/roguetown/psicross/eldritch/dropped(mob/living/user) + . = ..() if(active_item) to_chat(user, span_notice("Your stroke of luck has ended.")) user.change_stat("fortune", -3) @@ -643,6 +629,7 @@ return /obj/item/rope/chain/constellation/dropped(mob/living/user) + . = ..() if(active_item) to_chat(user, span_notice("Your purpose is scattered to the wind")) @@ -683,5 +670,6 @@ soullink(/datum/soullink/oneway/delay, item_owner, user) /obj/item/clothing/ring/diamond/soulbond/dropped(mob/living/user) + . = ..() qdel(user.GetComponent(/datum/soullink/oneway)) REMOVE_TRAIT(src, TRAIT_NODROP, TRAIT_GENERIC) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warrior.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warrior.dm index eadb2b5f8ff..96d46c4b154 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warrior.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/warrior.dm @@ -40,7 +40,8 @@ H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 1, TRUE) H.change_stat("strength", 2) - H.change_stat("endurance", 2) // 7 stat points total as a low-skill martial role without magic. Compared to Pally with 5 points. + H.change_stat("perception", 1) + H.change_stat("endurance", 2) // 8 stat points total as a low-skill martial role without magic. Compared to Pally with 7 points. H.change_stat("constitution", 2) H.change_stat("speed", 1) shoes = /obj/item/clothing/shoes/roguetown/boots @@ -103,7 +104,7 @@ H.change_stat("endurance", 1) // Weaker endurance compared to a traditional warrior/soldier. Smarter due to study of rare magical beasts. H.change_stat("constitution", 2) H.change_stat("intelligence", 1) - H.change_stat("speed", 1) + H.change_stat("perception", 1) shoes = /obj/item/clothing/shoes/roguetown/boots gloves = /obj/item/clothing/gloves/roguetown/leather belt = /obj/item/storage/belt/rogue/leather @@ -162,7 +163,8 @@ ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_DECEIVING_MEEKNESS, TRAIT_GENERIC) - H.change_stat("strength", 2) + H.change_stat("strength", 1) + H.change_stat("perception", 1) H.change_stat("endurance", 1) H.change_stat("speed", 2) H.change_stat("intelligence", 2) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/cheesemaker.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/cheesemaker.dm index 68d0bb613e7..bc2c7e83c80 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/cheesemaker.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/cheesemaker.dm @@ -46,4 +46,4 @@ /datum/advclass/cheesemaker/boost_by_plus_power(plus_factor, mob/living/carbon/human/H) // ha ha yeah, fuck you cheesemaker playin retards! return - \ No newline at end of file + diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/towndoctor.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/towndoctor.dm index f1a98ea1e6b..8543dd3b6ac 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/towndoctor.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/pilgrim/towndoctor.dm @@ -30,7 +30,7 @@ /obj/item/reagent_containers/glass/bottle/rogue/healthpot = 1, /obj/item/clothing/mask/rogue/physician = 1, /obj/item/storage/box/matches = 1, /// for carterizer and ring. - /obj/item/clothing/ring/lantern = 1, //lantern+ + /obj/item/flashlight/flare/torch/lantern/ring = 1, //lantern+ /obj/item/storage/fancy/skit = 1, ) if(H.gender == MALE) diff --git a/code/modules/jobs/job_types/roguetown/apprentices/mage_apprentice.dm b/code/modules/jobs/job_types/roguetown/apprentices/mage_apprentice.dm index 6797cb4d142..5baf4d996ba 100644 --- a/code/modules/jobs/job_types/roguetown/apprentices/mage_apprentice.dm +++ b/code/modules/jobs/job_types/roguetown/apprentices/mage_apprentice.dm @@ -64,5 +64,6 @@ H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/projectile/splash) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/roustame) H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/projectile/animate_object) + ADD_TRAIT(H, TRAIT_USEMAGICITEM, "[type]") H.verbs += list(/mob/living/carbon/human/proc/magicreport, /mob/living/carbon/human/proc/magiclearn) diff --git a/code/modules/jobs/job_types/roguetown/church/druid.dm b/code/modules/jobs/job_types/roguetown/church/druid.dm index 3fabca31929..1eea6c90d8f 100644 --- a/code/modules/jobs/job_types/roguetown/church/druid.dm +++ b/code/modules/jobs/job_types/roguetown/church/druid.dm @@ -12,7 +12,7 @@ allowed_races = RACES_ALL_KINDSPLUS allowed_patrons = ALL_DIVINE_PATRONS //gets set to dendor on the outfit anyways lol outfit = /datum/outfit/job/roguetown/druid - tutorial = "You have always been drawn to the wild, and the wild drawn to you. When your calling came, it was from Sylvarn. Your patron claims dominion over all of nature and promises bounty to those who act in his name to bring balance to His domain. The Wilds are the most comfortable place for you, toiling alongside soilsons and soilbrides although sometimes what lies beyond the gates fills your soul with a feral yearning." + tutorial = "You have always been drawn to the wild, and the wild drawn to you. When your calling came, it was from Nature and it's deities. You act as a medium between the natural and magickal worlds, often caught between it and the changing pace of society. The people still depend on you for wisdom and balance in this city; and it is often up to you and the various orders who survey the woodland realm to maintain any form of law: be it the lands or the peoples." display_order = JDO_DRUID give_bank_account = FALSE diff --git a/code/modules/jobs/job_types/roguetown/church/grandmaster.dm b/code/modules/jobs/job_types/roguetown/church/grandmaster.dm index 243456f14f3..36574378c9f 100644 --- a/code/modules/jobs/job_types/roguetown/church/grandmaster.dm +++ b/code/modules/jobs/job_types/roguetown/church/grandmaster.dm @@ -6,7 +6,7 @@ allowed_sexes = list(MALE, FEMALE) allowed_races = RACES_ALL_KINDSPLUS allowed_patrons = ALL_CLERIC_PATRONS - allowed_ages = list(AGE_MIDDLEAGED, AGE_OLD) + allowed_ages = list(AGE_ADULT, AGE_MIDDLEAGED, AGE_OLD) outfit = /datum/outfit/job/roguetown/grandmaster min_pq = 5 max_pq = null @@ -22,46 +22,46 @@ ..() H.virginity = TRUE head = /obj/item/clothing/head/roguetown/helmet/heavy/bucket - neck = /obj/item/clothing/neck/roguetown/psicross/astrata + wrists = /obj/item/clothing/neck/roguetown/psicross/astrata cloak = /obj/item/clothing/cloak/templar/psydon switch(H.patron.name) - if("Astrata") + if("Elysius") wrists = /obj/item/clothing/neck/roguetown/psicross/astrata head = /obj/item/clothing/head/roguetown/helmet/heavy/astratahelm cloak = /obj/item/clothing/cloak/templar/astrata - if("Dendor") + if("Sylvarn") wrists = /obj/item/clothing/neck/roguetown/psicross/dendor head = /obj/item/clothing/head/roguetown/helmet/heavy/dendorhelm cloak = /obj/item/clothing/cloak/templar/dendor - if("Necra") + if("Yamais") wrists = /obj/item/clothing/neck/roguetown/psicross/necra head = /obj/item/clothing/head/roguetown/helmet/heavy/necrahelm cloak = /obj/item/clothing/cloak/templar/necra - if("Pestra") + if("Hermeir") wrists = /obj/item/clothing/neck/roguetown/psicross/pestra head = /obj/item/clothing/head/roguetown/helmet/heavy/pestrahelm cloak = /obj/item/clothing/cloak/templar/pestra - if("Noc") + if("Lune") wrists = /obj/item/clothing/neck/roguetown/psicross/noc head = /obj/item/clothing/head/roguetown/helmet/heavy/nochelm cloak = /obj/item/clothing/cloak/templar/noc - if("Eora") //Eora content from Stonekeep + if("Viiritri") //Eora content from Stonekeep head = /obj/item/clothing/head/roguetown/helmet/heavy/eorahelm wrists = /obj/item/clothing/neck/roguetown/psicross/eora cloak = /obj/item/clothing/cloak/templar/eora - if("Ravox") + if("Minhur") head = /obj/item/clothing/head/roguetown/helmet/heavy/ravoxhelm wrists = /obj/item/clothing/neck/roguetown/psicross/ravox cloak = /obj/item/clothing/cloak/templar/ravox - if("Xylix") + if("Onder") head = /obj/item/clothing/head/roguetown/helmet/heavy/xylixhelm wrists = /obj/item/clothing/neck/roguetown/psicross/xylix cloak = /obj/item/clothing/cloak/templar/xylix - if("Malum") + if("Svaeryog") head = /obj/item/clothing/head/roguetown/helmet/malumhelmet wrists = /obj/item/clothing/neck/roguetown/psicross/malum cloak = /obj/item/clothing/cloak/templar/malum - if("Abyssor") + if("Abyssia") head = /obj/item/clothing/head/roguetown/helmet/heavy/abyssorhelm wrists = /obj/item/clothing/neck/roguetown/psicross/abyssor cloak = /obj/item/clothing/cloak/templar/abyssor @@ -81,10 +81,10 @@ if(H.mind) H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/whipsflails, 4, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/whipsflails, 5, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 5, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/shields, 4, TRUE) // actual ass, but worse. Good luck. + H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 4, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/shields, 5, TRUE) // Might be utterly disgusting. Good luck. H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 4, TRUE) diff --git a/code/modules/jobs/job_types/roguetown/church/mortician.dm b/code/modules/jobs/job_types/roguetown/church/mortician.dm index 9f61291de1c..60048b363c1 100644 --- a/code/modules/jobs/job_types/roguetown/church/mortician.dm +++ b/code/modules/jobs/job_types/roguetown/church/mortician.dm @@ -9,55 +9,69 @@ allowed_sexes = list(MALE, FEMALE) allowed_races = RACES_ALL_KINDSPLUS allowed_patrons = ALL_DIVINE_PATRONS //gets set to necra on the outfit anyways lol - tutorial = "As an acolyte of a death god, you have been given the honor and rites of putting the dead to rest instead of healing the living. Yamais bestows much wisdom in her reminders of our balance in life. Will you toil for her?" + tutorial = "The purpose of a Gravesinger, working on behalf of both the local temple and of the Adventurers' Guild, is two-fold. As a priest of Yamais, it is to be the shepard of spirits to their preferred destination, whether it be burial and reincarnation, or reanimated in their own body, restored and cured of decomposition. As an expert on the affairs of the dead, it is to assist Adventurers in locating missing or slain comrades and providing the testimony of the dead to the Hedgeknights. Additionally, you have some medical training and the tools to use them, along with the expectation that you should rescue the dying if you can." outfit = /datum/outfit/job/roguetown/undertaker display_order = JDO_GRAVEMAN give_bank_account = TRUE - min_pq = -5 + min_pq = 5 max_pq = null /datum/outfit/job/roguetown/undertaker - allowed_patrons = list(/datum/patron/divine/necra,/datum/patron/divine/pestra) + allowed_patrons = list(/datum/patron/divine/necra) -/datum/outfit/job/roguetown/undertaker/pre_equip(mob/living/carbon/human/H) +/datum/outfit/job/roguetown/undertaker/pre_equip(mob/living/carbon/human/H)//Updated to have medium armor, because they'll be at odds with Necromancers and likely be targeted by antags. ..() - head = /obj/item/clothing/head/roguetown/necrahood + head = /obj/item/clothing/head/roguetown/roguehood/surghood + mask = /obj/item/clothing/mask/rogue/skullmask neck = /obj/item/clothing/neck/roguetown/psicross/necra - cloak = /obj/item/clothing/cloak/raincloak/mortus - armor = /obj/item/clothing/suit/roguetown/shirt/robe/necra - shirt = /obj/item/clothing/suit/roguetown/armor/leather/vest/black - pants = /obj/item/clothing/under/roguetown/trou/leather/mourning - shoes = /obj/item/clothing/shoes/roguetown/boots - belt = /obj/item/storage/belt/rogue/leather/rope + gloves = /obj/item/clothing/gloves/roguetown/plate + cloak = /obj/item/clothing/cloak/templar/necra + wrists = /obj/item/clothing/wrists/roguetown/bracers + shirt = /obj/item/clothing/suit/roguetown/shirt/robe/surgrobe + armor = /obj/item/clothing/suit/roguetown/armor/plate/half + pants = /obj/item/clothing/under/roguetown/platelegs + shoes = /obj/item/clothing/shoes/roguetown/boots/armor + belt = /obj/item/storage/belt/rogue/leather/blackleather backl = /obj/item/storage/backpack/rogue/satchel - backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/silver =1, /obj/item/toy/cards/deck/tarot =1, /obj/item/scrying =1,) + backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/silver =1, /obj/item/toy/cards/deck/tarot =1, /obj/item/scrying =1, /obj/item/storage/fancy/skit =1, /obj/item/reagent_containers/glass/alembic =1) beltr = /obj/item/storage/belt/rogue/pouch/coins/poor - backr = /obj/item/rogueweapon/shovel - backl = /obj/item/rogueweapon/sickle/scythe - backl = /obj/item/storage/backpack/rogue/satchel + beltl = /obj/item/rogueweapon/shovel/small + backr = /obj/item/rogueweapon/sickle/scythe if(H.mind) H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 5, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 3, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 5, TRUE)//So that they can be extra menacing with their scythe. H.mind.adjust_skillrank_up_to(/datum/skill/craft/crafting, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/swimming, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 2, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/magic/holy, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 3, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/magic/holy, 5, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 4, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 3, TRUE) if(H.age == AGE_OLD) - H.mind.adjust_skillrank_up_to(/datum/skill/magic/holy, 1, TRUE) - H.change_stat("strength", 1) + H.mind.adjust_skillrank(/datum/skill/magic/holy, 1, TRUE) + H.mind.adjust_skillrank(/datum/skill/misc/medicine, 2, TRUE) + H.change_stat("strength", 2) H.change_stat("constitution", 2) - H.change_stat("intelligence", -2) - H.change_stat("endurance", 1) - H.change_stat("speed", 1) + H.change_stat("endurance", 2) + H.change_stat("intelligence", 1) H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/diagnose/secular) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/stable)//Spare the dying + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/purge) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/cure_rot) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/seance) + H.grant_language(/datum/language_holder/abyssal) + H.grant_language(/datum/language_holder/celestial) ADD_TRAIT(H, TRAIT_NOSTINK, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_SOUL_EXAMINE, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_SIXTHSENSE, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_SEESPIRITS, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) + H.update_sight() H.cmode_music = 'sound/music/combat_clergy.ogg' var/datum/devotion/C = new /datum/devotion(H, H.patron) C.grant_spells(H) diff --git a/code/modules/jobs/job_types/roguetown/church/priest.dm b/code/modules/jobs/job_types/roguetown/church/priest.dm index d44cbfcdc69..f2468d1a3b5 100644 --- a/code/modules/jobs/job_types/roguetown/church/priest.dm +++ b/code/modules/jobs/job_types/roguetown/church/priest.dm @@ -1,12 +1,13 @@ /datum/job/roguetown/priest - title = "Prophet" + title = "Archpriest" + f_title = "Archpriestess" flag = PRIEST department_flag = CHURCHMEN faction = "Station" total_positions = 5 spawn_positions = 5 selection_color = JCOLOR_CHURCH - f_title = "Prophetess" + f_title = "Archpriestess" allowed_races = RACES_ALL_KINDSPLUS allowed_patrons = ALL_DIVINE_PATRONS allowed_sexes = list(MALE, FEMALE) @@ -72,7 +73,7 @@ /mob/living/carbon/human/proc/coronate_lord() set name = "Coronate" - set category = "Prophet" + set category = "Archpriest" if(!mind) return if(!istype(get_area(src), /area/rogue/indoors/town/church/chapel)) @@ -118,7 +119,7 @@ /mob/living/carbon/human/proc/churchexcommunicate() set name = "Curse" - set category = "Prophet" + set category = "Archpriest" if(stat) return var/inputty = input("Curse someone... (curse them again to remove it)", "Sinner Name") as text|null @@ -150,7 +151,7 @@ /mob/living/carbon/human/proc/churchannouncement() set name = "Announcement" - set category = "Prophet" + set category = "Archpriest" if(!COOLDOWN_FINISHED(src, church_announcement)) to_chat(src, span_warning("I should wait...")) diff --git a/code/modules/jobs/job_types/roguetown/church/puritan.dm b/code/modules/jobs/job_types/roguetown/church/puritan.dm index 439e50df9dd..b0d2950ffa1 100644 --- a/code/modules/jobs/job_types/roguetown/church/puritan.dm +++ b/code/modules/jobs/job_types/roguetown/church/puritan.dm @@ -26,7 +26,7 @@ outfit = /datum/outfit/job/roguetown/puritan display_order = JDO_PURITAN give_bank_account = 36 - min_pq = 0 + min_pq = 10 max_pq = null /datum/outfit/job/roguetown/puritan @@ -78,6 +78,7 @@ ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_BOG_TREKKING, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_USEMAGICITEM, TRAIT_GENERIC) H.cmode_music = 'sound/music/combat_clergy.ogg' /mob/living/carbon/human/proc/torture_victim() diff --git a/code/modules/jobs/job_types/roguetown/church/templar.dm b/code/modules/jobs/job_types/roguetown/church/templar.dm index 9717aaf2e1f..ca8d2ba4938 100644 --- a/code/modules/jobs/job_types/roguetown/church/templar.dm +++ b/code/modules/jobs/job_types/roguetown/church/templar.dm @@ -26,43 +26,43 @@ neck = /obj/item/clothing/neck/roguetown/psicross/silver cloak = /obj/item/clothing/cloak/templar/psydon switch(H.patron.name) - if("Astrata") + if("Elysius") wrists = /obj/item/clothing/neck/roguetown/psicross/astrata head = /obj/item/clothing/head/roguetown/helmet/heavy/astratahelm cloak = /obj/item/clothing/cloak/templar/astrata - if("Dendor") + if("Sylvarn") wrists = /obj/item/clothing/neck/roguetown/psicross/dendor head = /obj/item/clothing/head/roguetown/helmet/heavy/dendorhelm cloak = /obj/item/clothing/cloak/templar/dendor - if("Necra") + if("Yamais") wrists = /obj/item/clothing/neck/roguetown/psicross/necra head = /obj/item/clothing/head/roguetown/helmet/heavy/necrahelm cloak = /obj/item/clothing/cloak/templar/necra - if("Pestra") + if("Hermeir") wrists = /obj/item/clothing/neck/roguetown/psicross/pestra head = /obj/item/clothing/head/roguetown/helmet/heavy/pestrahelm cloak = /obj/item/clothing/cloak/templar/pestra - if("Noc") + if("Lune") wrists = /obj/item/clothing/neck/roguetown/psicross/noc head = /obj/item/clothing/head/roguetown/helmet/heavy/nochelm cloak = /obj/item/clothing/cloak/templar/noc - if("Eora") //Eora content from Stonekeep + if("Viiritri") //Eora content from Stonekeep head = /obj/item/clothing/head/roguetown/helmet/heavy/eorahelm wrists = /obj/item/clothing/neck/roguetown/psicross/eora cloak = /obj/item/clothing/cloak/templar/eora - if("Ravox") + if("Minhur") head = /obj/item/clothing/head/roguetown/helmet/heavy/ravoxhelm wrists = /obj/item/clothing/neck/roguetown/psicross/ravox cloak = /obj/item/clothing/cloak/templar/ravox - if("Xylix") + if("Onder") head = /obj/item/clothing/head/roguetown/helmet/heavy/xylixhelm wrists = /obj/item/clothing/neck/roguetown/psicross/xylix cloak = /obj/item/clothing/cloak/templar/xylix - if("Malum") + if("Svaeryog") head = /obj/item/clothing/head/roguetown/helmet/malumhelmet wrists = /obj/item/clothing/neck/roguetown/psicross/malum cloak = /obj/item/clothing/cloak/templar/malum - if("Abyssor") + if("Abyssia") head = /obj/item/clothing/head/roguetown/helmet/heavy/abyssorhelm wrists = /obj/item/clothing/neck/roguetown/psicross/abyssor cloak = /obj/item/clothing/cloak/templar/abyssor diff --git a/code/modules/jobs/job_types/roguetown/courtier/magician.dm b/code/modules/jobs/job_types/roguetown/courtier/magician.dm index c5b9c726c23..333ad778da5 100644 --- a/code/modules/jobs/job_types/roguetown/courtier/magician.dm +++ b/code/modules/jobs/job_types/roguetown/courtier/magician.dm @@ -9,7 +9,19 @@ allowed_races = RACES_ALL_KINDSPLUS allowed_sexes = list(MALE, FEMALE) - spells = list(/obj/effect/proc_holder/spell/invoked/projectile/fireball/greater, /obj/effect/proc_holder/spell/invoked/arcyne_storm, /obj/effect/proc_holder/spell/invoked/invisibility, /obj/effect/proc_holder/spell/invoked/slowdown_spell_aoe, /obj/effect/proc_holder/spell/targeted/ethereal_jaunt, /obj/effect/proc_holder/spell/aoe_turf/rogue_knock) + spells = list ( + /obj/effect/proc_holder/spell/invoked/projectile/fireball/greater, + /obj/effect/proc_holder/spell/invoked/projectile/spitfire, + /obj/effect/proc_holder/spell/invoked/projectile/lightningbolt, + /obj/effect/proc_holder/spell/invoked/arcyne_storm, + /obj/effect/proc_holder/spell/invoked/slowdown_spell_aoe, + /obj/effect/proc_holder/spell/aoe_turf/conjure/Wolf, + /obj/effect/proc_holder/spell/invoked/invisibility, + /obj/effect/proc_holder/spell/invoked/projectile/fetch, + /obj/effect/proc_holder/spell/targeted/touch/prestidigitation, + /obj/effect/proc_holder/spell/targeted/forcewall, + /obj/effect/proc_holder/spell/targeted/ethereal_jaunt, + /obj/effect/proc_holder/spell/aoe_turf/rogue_knock) display_order = JDO_MAGICIAN tutorial = "Your creed is one dedicated to the conquering of the arcane arts and the constant thrill of knowledge. \ You are one of the Arch-Magicians of Dreamkeeps Magick Academy; Ravenloft. You help teach and manage the students of this Academy.\ @@ -39,6 +51,7 @@ backl = /obj/item/storage/backpack/rogue/satchel backpack_contents = list(/obj/item/slimepotion/lovepotion,/obj/item/reagent_containers/glass/bottle/rogue/poison,/obj/item/reagent_containers/glass/bottle/rogue/healthpot) ADD_TRAIT(H, TRAIT_SEEPRICES, "[type]") + ADD_TRAIT(H, TRAIT_USEMAGICITEM, "[type]") if(H.mind) H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 6, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 5, TRUE) @@ -76,7 +89,7 @@ if(/datum/patron/divine/pestra) if(H.mind) H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 1, TRUE) - else if(/datum/patron/divine/ravox || /datum/patron/inhumen/graggar) //raises the pick(1,2) weapon skills to 2 if they weren't there already + if(/datum/patron/divine/ravox, /datum/patron/inhumen/graggar) //raises the pick(1,2) weapon skills to 2 if they weren't there already if(H.mind) H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, max((2 - H.mind.get_skill_level(/datum/skill/combat/knives)), 0), TRUE) //basically, (2 - current skill) is added to the total skill value. H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, max((2 - H.mind.get_skill_level(/datum/skill/combat/swords)), 0), TRUE) diff --git a/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm b/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm index be21a865a02..4d75b9df673 100644 --- a/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm +++ b/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm @@ -3,18 +3,18 @@ flag = BOGGUARD department_flag = GARRISON faction = "Station" - total_positions = 10 - spawn_positions = 10 + total_positions = 6 + spawn_positions = 6 selection_color = JCOLOR_SOLDIER allowed_sexes = list(MALE, FEMALE) allowed_races = RACES_ALL_KINDSPLUS allowed_ages = list(AGE_ADULT, AGE_MIDDLEAGED, AGE_OLD) - tutorial = " You decided to protect the dream dales oneday, and you joined the hedgecademy within the rangers keep. Learning from the best you can muster, you're a certified monster hunter as much as you are a ranger and guard. Keeping these woodlands safe is your duty." + tutorial = "The origins of your order are as ancient as the land upon which Stonehedge is built. The first Hedge Knights were rangers, once devoted to Sylvarn but finding that the wilderness was often harsh and lacking for justice. Hedge Knights these days are employed by the Adventurers' Guild to protect the town from violators of the Five Laws, whether they be adventurers, bandits, peasants, or night creatures. Do not abandon the town or abuse the powers and trust vested in you, or they will surely be taken away." display_order = JDO_TOWNGUARD whitelist_req = FALSE outfit = /datum/outfit/job/roguetown/bogguardsman give_bank_account = 60 - min_pq = 5 + min_pq = 15 max_pq = null cmode_music = 'sound/music/combat_bog.ogg' @@ -23,57 +23,58 @@ . = ..() if(ishuman(L)) var/mob/living/carbon/human/H = L - if(istype(H.cloak, /obj/item/clothing/cloak/stabard/bog)) + if(istype(H.cloak, /obj/item/clothing/cloak/templar/dendor)) var/obj/item/clothing/S = H.cloak var/index = findtext(H.real_name, " ") if(index) index = copytext(H.real_name, 1,index) if(!index) index = H.real_name - S.name = "bogman tabard ([index])" + S.name = "Hedge Knight tabard ([index])" /datum/outfit/job/roguetown/bogguardsman/pre_equip(mob/living/carbon/human/H) . = ..() - head = /obj/item/clothing/head/roguetown/helmet/leather - armor = /obj/item/clothing/suit/roguetown/armor/gambeson - cloak = /obj/item/clothing/cloak/raincloak/green + head = /obj/item/clothing/head/roguetown/helmet/foresterhelmet + armor = /obj/item/clothing/suit/roguetown/armor/plate/half/foresterarmor + cloak = /obj/item/clothing/cloak/templar/dendor neck = /obj/item/clothing/neck/roguetown/bervor - gloves = /obj/item/clothing/gloves/roguetown/leather - wrists = /obj/item/clothing/wrists/roguetown/bracers/leather - shirt = /obj/item/clothing/suit/roguetown/shirt/shortshirt/bog - pants = /obj/item/clothing/under/roguetown/trou/leather - shoes = /obj/item/clothing/shoes/roguetown/boots/leather - beltl = /obj/item/flashlight/flare/torch/lantern + gloves = /obj/item/clothing/gloves/roguetown/forestergauntlets + wrists = /obj/item/clothing/wrists/roguetown/bracers + shirt = /obj/item/clothing/suit/roguetown/armor/chainmail + pants = /obj/item/clothing/under/roguetown/chainlegs + shoes = /obj/item/clothing/shoes/roguetown/boots/forestershoes + beltl = /obj/item/quiver/arrows belt = /obj/item/storage/belt/rogue/leather - beltr = /obj/item/rogueweapon/sword/silver/sabre/elf + beltr = /obj/item/rogueweapon/mace/stunmace/hedgeknight backr = /obj/item/storage/backpack/rogue/satchel backl = /obj/item/gun/ballistic/revolver/grenadelauncher/bow/longbow - wrists = /obj/item/clothing/wrists/roguetown/bracers/leather id = /obj/item/scomstone - backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/steel = 1, /obj/item/signal_horn = 1) + backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/silver = 1, /obj/item/signal_horn = 1) if(H.mind) assign_skills(H) H.verbs |= /mob/proc/haltyell ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_BOG_TREKKING, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_WILD_EATER, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_SHOCKIMMUNE, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_BLINDFIGHTING, TRAIT_GENERIC) -/*Design philosophy: "Jack of all tades, master of.. few" - Peasent, so bow, axe, and polearm skill. Knows most combat skills, but other than those not great with them. -Also given some non-combat skills that a peasent would have, just to support themselves, but not anything to replace soilsons with.*/ +/*Design philosophy: Protectors of Stonehedge, whose holy maces are the bane of any who violate the Guild's few laws. +While they are not as physically strong as more conventional warriors, they are swift and their endurance is second to none.*/ /datum/outfit/job/roguetown/bogguardsman/proc/assign_skills(mob/living/carbon/human/H) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, 4, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, 5, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 2, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 5, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/cooking, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 6, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/labor/butchering, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/sneaking, 3, TRUE) @@ -84,8 +85,7 @@ Also given some non-combat skills that a peasent would have, just to support the H.mind.adjust_skillrank_up_to(/datum/skill/craft/carpentry, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/masonry, 2, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/tracking, 4, TRUE) //Hearthstone change. - H.change_stat("strength", 3) H.change_stat("perception", 2) - H.change_stat("constitution", 2) - H.change_stat("endurance", 2) - H.change_stat("speed", 1) + H.change_stat("constitution", 4) + H.change_stat("endurance", 4) + H.change_stat("speed", 2) diff --git a/code/modules/jobs/job_types/roguetown/garrison/bogmaster.dm b/code/modules/jobs/job_types/roguetown/garrison/bogmaster.dm index 10b56a16caf..34cc8e882f2 100644 --- a/code/modules/jobs/job_types/roguetown/garrison/bogmaster.dm +++ b/code/modules/jobs/job_types/roguetown/garrison/bogmaster.dm @@ -17,7 +17,7 @@ outfit = /datum/outfit/job/roguetown/bogmaster give_bank_account = 2500 - min_pq = 10 + min_pq = 15 max_pq = null cmode_music = 'sound/music/combat_bog.ogg' @@ -25,20 +25,20 @@ . = ..() if(ishuman(L)) var/mob/living/carbon/human/H = L - if(istype(H.cloak, /obj/item/clothing/cloak/stabard/bog)) + if(istype(H.cloak, /obj/item/clothing/cloak/templar/dendor)) var/obj/item/clothing/S = H.cloak var/index = findtext(H.real_name, " ") if(index) index = copytext(H.real_name, 1,index) if(!index) index = H.real_name - S.name = "bog master tabard ([index])" + S.name = "Hedgemaster tabard ([index])" /datum/outfit/job/roguetown/bogmaster/pre_equip(mob/living/carbon/human/H) . = ..() - head = /obj/item/clothing/head/roguetown/helmet/leather + head = /obj/item/clothing/head/roguetown/helmet/elfbarbutewings pants = /obj/item/clothing/under/roguetown/chainlegs - cloak = /obj/item/clothing/cloak/raincloak/green + cloak = /obj/item/clothing/cloak/templar/dendor shirt = /obj/item/clothing/suit/roguetown/armor/chainmail armor = /obj/item/clothing/suit/roguetown/armor/plate/half neck = /obj/item/clothing/neck/roguetown/bervor @@ -46,7 +46,7 @@ gloves = /obj/item/clothing/gloves/roguetown/chain shoes = /obj/item/clothing/shoes/roguetown/boots/leather beltl = /obj/item/gun/ballistic/revolver/grenadelauncher/bow/longbow - beltr = /obj/item/rogueweapon/sword/silver/sabre/elf + beltr = /obj/item/rogueweapon/mace/stunmace/hedgeknight belt = /obj/item/storage/belt/rogue/leather backr = /obj/item/storage/backpack/rogue/satchel backl = /obj/item/quiver/Parrows @@ -54,7 +54,7 @@ if(H.mind) H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 5, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 3, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 5, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 5, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 5, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 4, TRUE) @@ -64,23 +64,25 @@ H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 4, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/swimming, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 4, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 6, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 1, TRUE) + H.mind.adjust_skillrank_up_to(/datum/skill/misc/medicine, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/riding, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/tracking, 4, TRUE) //Hearthstone change. H.mind.adjust_skillrank_up_to(/datum/skill/combat/shields, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/craft/crafting, 3, TRUE) //Peasent levy, so some skill - H.mind.adjust_skillrank_up_to(/datum/skill/labor/farming, pick(1,2,2), TRUE) //Peasent levy, so some skill - H.change_stat("strength", 3) - H.change_stat("constitution", 2) - H.change_stat("perception", 2) - H.change_stat("endurance", 2) + H.mind.adjust_skillrank_up_to(/datum/skill/labor/farming, 2, TRUE) //Peasent levy, so some skill + H.change_stat("constitution", 4) + H.change_stat("perception", 3) + H.change_stat("endurance", 4) + H.change_stat("speed", 2) H.dna.species.soundpack_m = new /datum/voicepack/male/knight() H.verbs |= /mob/proc/haltyell ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_BOG_TREKKING, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_WILD_EATER, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_SHOCKIMMUNE, TRAIT_GENERIC) + ADD_TRAIT(H, TRAIT_BLINDFIGHTING, TRAIT_GENERIC) /obj/effect/proc_holder/spell/self/convertrole/bog name = "Recruit Hedgeknight" diff --git a/code/modules/jobs/job_types/roguetown/garrison/manorguard.dm b/code/modules/jobs/job_types/roguetown/garrison/manorguard.dm deleted file mode 100644 index 71ce9cff6bf..00000000000 --- a/code/modules/jobs/job_types/roguetown/garrison/manorguard.dm +++ /dev/null @@ -1,77 +0,0 @@ -/datum/job/roguetown/manorguard - title = "Man at Arms" - flag = MANATARMS - department_flag = GARRISON - faction = "Station" - total_positions = 6 - spawn_positions = 6 - - allowed_sexes = list(MALE, FEMALE) - allowed_races = RACES_ALL_KINDSPLUS - allowed_ages = list(AGE_ADULT, AGE_MIDDLEAGED) - tutorial = "Having proven yourself loyal and capable, you are entrusted to defend the Royal Family and their Court, \ - trained regularly in combat and siege warfare you stand a small chance of surviving the King's reign. \ - It's an honor to die as part of His Majesty's retinue, the Marshal reminds you every night." - display_order = JDO_CASTLEGUARD - whitelist_req = FALSE - - outfit = /datum/outfit/job/roguetown/manorguard - give_bank_account = 22 - min_pq = 3 - max_pq = null - - cmode_music = 'sound/music/combat_guard2.ogg' - -/datum/job/roguetown/manorguard/after_spawn(mob/living/L, mob/M, latejoin = TRUE) - ..() - if(ishuman(L)) - var/mob/living/carbon/human/H = L - if(istype(H.cloak, /obj/item/clothing/cloak/stabard/surcoat/guard)) - var/obj/item/clothing/S = H.cloak - var/index = findtext(H.real_name, " ") - if(index) - index = copytext(H.real_name, 1,index) - if(!index) - index = H.real_name - S.name = "man-at-arms jupon ([index])" - -/datum/outfit/job/roguetown/manorguard/pre_equip(mob/living/carbon/human/H) - ..() - head = /obj/item/clothing/head/roguetown/helmet/kettle - pants = /obj/item/clothing/under/roguetown/chainlegs - cloak = /obj/item/clothing/cloak/stabard/surcoat/guard - gloves = /obj/item/clothing/gloves/roguetown/chain - neck = /obj/item/clothing/neck/roguetown/gorget - shirt = /obj/item/clothing/suit/roguetown/armor/chainmail - armor = /obj/item/clothing/suit/roguetown/armor/plate/half - shoes = /obj/item/clothing/shoes/roguetown/boots/leather - beltl = /obj/item/storage/keyring/man_at_arms - belt = /obj/item/storage/belt/rogue/leather/black - backr = /obj/item/storage/backpack/rogue/satchel/black - backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/steel/special = 1, /obj/item/rope/chain = 1, /obj/item/signal_horn = 1) - r_hand = /obj/item/rogueweapon/spear - if(H.mind) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/whipsflails, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, pick(2,3,3), TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, pick(1,2,3,3), TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/swimming, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/sneaking, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/riding, 1, TRUE) - H.change_stat("strength", 2) - H.change_stat("perception", 2) - H.change_stat("constitution", 1) - H.change_stat("endurance", 1) - H.change_stat("speed", 1) - H.verbs |= /mob/proc/haltyell - ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) - diff --git a/code/modules/jobs/job_types/roguetown/garrison/royalguard.dm b/code/modules/jobs/job_types/roguetown/garrison/royalguard.dm deleted file mode 100644 index 451dc669d70..00000000000 --- a/code/modules/jobs/job_types/roguetown/garrison/royalguard.dm +++ /dev/null @@ -1,218 +0,0 @@ -/datum/job/roguetown/royalguard - title = "Pegasian Knight" - flag = ROYALGUARD - department_flag = GARRISON - faction = "Station" - total_positions = 4 - spawn_positions = 4 - allowed_sexes = list(MALE, FEMALE) - allowed_races = RACES_ALL_KINDSPLUS - allowed_ages = list(AGE_ADULT, AGE_MIDDLEAGED) - tutorial = "Having proven yourself loyal and capable, you have been knighted to serve the realm as the monarch's personal guard. You listen to your Lord and the Captain of the Guard, defending your Lord and realm." - display_order = JDO_ROYALGUARD - allowed_patrons = ALL_DIVINE_PATRONS - whitelist_req = FALSE - - outfit = /datum/outfit/job/roguetown/royalguard - advclass_cat_rolls = list(CTAG_ROYALGUARD = 20) - - give_bank_account = 22 - min_pq = 1 - max_pq = null - - cmode_music = 'sound/music/combat_knight.ogg' - -/datum/job/roguetown/royalguard/after_spawn(mob/living/L, mob/M, latejoin = TRUE) - ..() - if(ishuman(L)) - var/mob/living/carbon/human/H = L - H.advsetup = 1 - H.invisibility = INVISIBILITY_MAXIMUM - H.become_blind("advsetup") - if(istype(H.cloak, /obj/item/clothing/cloak/stabard/surcoat/guard)) - var/obj/item/clothing/S = H.cloak - var/index = findtext(H.real_name, " ") - if(index) - index = copytext(H.real_name, 1,index) - if(!index) - index = H.real_name - S.name = "knight's tabard ([index])" - var/prev_real_name = H.real_name - var/prev_name = H.name - var/honorary = "Sir" - if(H.gender == FEMALE) - honorary = "Dame" - H.real_name = "[honorary] [prev_real_name]" - H.name = "[honorary] [prev_name]" - -/datum/outfit/job/roguetown/royalguard //For shared gear by the class. Royal archer gets different-looking armor. - pants = /obj/item/clothing/under/roguetown/chainlegs - neck = /obj/item/clothing/neck/roguetown/gorget - shirt = /obj/item/clothing/suit/roguetown/armor/chainmail - beltl = /obj/item/storage/keyring/guardcastle - belt = /obj/item/storage/belt/rogue/leather/black - backr = /obj/item/storage/backpack/rogue/satchel/black - wrists = /obj/item/clothing/wrists/roguetown/bracers - -/datum/advclass/royalguard/heavy - name = "Heavy Knight" - tutorial = "While other knights may specialize in horse riding and swords, you specialize in two-handed weapons and maces. People may fear the mounted knights, but they should truly fear those who come off their mount.." - outfit = /datum/outfit/job/roguetown/royalguard/heavy - - category_tags = list(CTAG_ROYALGUARD) - -/datum/outfit/job/roguetown/royalguard/heavy/pre_equip(mob/living/carbon/human/H) - ..() - H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/whipsflails, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/shields, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/riding, 1, TRUE) - - //Normal shared skill section. - H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/sneaking, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, pick(1,2,2), TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, pick(2,3,3), TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, pick(2,2,3), TRUE) - ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_NOBLE, TRAIT_GENERIC) //Knights are /technically/ nobles? But they are of the lower-tiers; mainly that a non-blue-blood could become a knight - H.dna.species.soundpack_m = new /datum/voicepack/male/knight() //For knightly voices; even though I despise them. - H.verbs |= /mob/proc/haltyell - - H.change_stat("strength", 4) - H.change_stat("constitution", 3) - H.change_stat("endurance", 3) - H.change_stat("speed", -3) //Lower speed for more strength and con of other knight, and to off-set endurance. (They need the end-stam for 2 handed.) - // Decorative helberd, 2-handed - if(prob(33)) - backl = /obj/item/rogueweapon/halberd/bardiche - // Great-mace, 2-handed (worse than normal steel but better than iron) - else if(prob(33)) - backl = /obj/item/rogueweapon/mace/goden/steel - // Iron mace + tower shield - else - beltr = /obj/item/rogueweapon/mace - backl = /obj/item/rogueweapon/shield/buckler - // Armor section - head = /obj/item/clothing/head/roguetown/helmet/heavy/royalknight - armor = /obj/item/clothing/suit/roguetown/armor/plate/heavyplateroyalguard - pants = /obj/item/clothing/under/roguetown/heavyroyalplatelegs //Gets better pants than chain ones. - cloak = /obj/item/clothing/cloak/cape/guard - gloves = /obj/item/clothing/gloves/roguetown/plate - shoes = /obj/item/clothing/shoes/roguetown/boots/armor - backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/steel/special = 1, /obj/item/rope/chain = 1, /obj/item/signal_horn = 1) - -/datum/advclass/royalguard/knight - name = "Foot Knight" - tutorial = "You are acustomed to traditional knight training, swords, shields, and mounts. You are swifter than some other knights and you know it; it's time to make use of it.." - outfit = /datum/outfit/job/roguetown/royalguard/knight - - category_tags = list(CTAG_ROYALGUARD) - -/datum/outfit/job/roguetown/royalguard/knight/pre_equip(mob/living/carbon/human/H) - ..() - H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/axes, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/whipsflails, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/shields, 3, TRUE) //Mildly better shield skill due to less weapon options. - H.mind.adjust_skillrank_up_to(/datum/skill/misc/riding, 3, TRUE) //Mounted knight due to 1-handed weapons specialty. - - //Normal shared skill section. - H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/sneaking, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, pick(1,2,2), TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, pick(2,3,3), TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, pick(2,2,3), TRUE) - ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_NOBLE, TRAIT_GENERIC) //Knights are /technically/ nobles? But they are of the lower-tiers; mainly that a non-blue-blood could become a knight. - H.dna.species.soundpack_m = new /datum/voicepack/male/knight() //For knightly voices; even though I despise them. - H.verbs |= /mob/proc/haltyell - - H.change_stat("strength", 3) - H.change_stat("intelligence", 1) - H.change_stat("perception", 1) - H.change_stat("constitution", 2) - H.change_stat("endurance", 2) - // Flail + tower shield - if(prob (33)) - beltr = /obj/item/rogueweapon/flail - backl = /obj/item/rogueweapon/shield/buckler - // Regular sword + tower shield - else if(prob (33)) - beltr = /obj/item/rogueweapon/sword - backl = /obj/item/rogueweapon/shield/buckler - // Bastard sword (traditional knight loadout; can be 1-handed but far better 2-handed. Higher stam drain.) - else - backl = /obj/item/rogueweapon/sword/long - - // Armor section - head = /obj/item/clothing/head/roguetown/helmet/heavy/royalknight - armor = /obj/item/clothing/suit/roguetown/armor/plate/halfplateroyalguard - cloak = /obj/item/clothing/cloak/cape/guard - gloves = /obj/item/clothing/gloves/roguetown/chain - shoes = /obj/item/clothing/shoes/roguetown/boots/armoriron - backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/steel/special = 1, /obj/item/rope/chain = 1, /obj/item/signal_horn = 1) - -/datum/advclass/royalguard/archer - name = "Royal Archer" - tutorial = "While you may be knighted, you are not what one expects for a 'knight'. You lack the heavy armor but all those royal hunts have homed your skills in not only archer but swords as well!" - outfit = /datum/outfit/job/roguetown/royalguard/archer - - category_tags = list(CTAG_ROYALGUARD) - -/datum/outfit/job/roguetown/royalguard/archer/pre_equip(mob/living/carbon/human/H) - ..() - //This class doesn't use the normal shared skill section; totally different!! - H.mind.adjust_skillrank_up_to(/datum/skill/combat/bows, 5, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/crossbows, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 4, TRUE) //Good as hell knife skill; makes them standout more compared to other guards. - H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 3, TRUE) //Decent sword skill, mostly for short-swords n' all. - H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 2, TRUE) //Not good training; gave some because non-lethals. - H.mind.adjust_skillrank_up_to(/datum/skill/combat/shields, 1, TRUE) //Some training, not great at all though. Equal to an adventurer, L. - H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/sneaking, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/riding, 1, TRUE) - ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC) //Archer, so dodge expert. Lower speed than Watch crossbowman though, so not as strong. - ADD_TRAIT(H, TRAIT_NOBLE, TRAIT_GENERIC) //Royal Longbowman; kinda rare realistically, though they did exist irl. But hey - royal guard + fantasy. - H.dna.species.soundpack_m = new /datum/voicepack/male/knight() - H.verbs |= /mob/proc/haltyell - - //Stats are just slightly better than Watchman crossbowman basically. Still gets same amount of stats total as base royal guard. - H.change_stat("strength", 2) - H.change_stat("intelligence", 1) - H.change_stat("perception", 2) - H.change_stat("constitution", 1) - H.change_stat("endurance", 2) - H.change_stat("speed", 1) //Gets less speed than Watch crossbowman, but gets some other stat bonuses over them. - - //Weapon section - beltr = /obj/item/quiver/arrows - backl = /obj/item/gun/ballistic/revolver/grenadelauncher/bow/longbow - - //Armor section - We give them kinda meh medium armor to either choose to upgrade to scale, or go for light armors. - head = /obj/item/clothing/head/roguetown/helmet/bascinet/royalguard - armor = /obj/item/clothing/suit/roguetown/armor/plate/half - cloak = /obj/item/clothing/cloak/stabard/guardhood - gloves = /obj/item/clothing/gloves/roguetown/angle - shoes = /obj/item/clothing/shoes/roguetown/nobleboot - backpack_contents = list(/obj/item/rogueweapon/huntingknife/idagger/steel/special = 1, /obj/item/rope/chain = 1, /obj/item/signal_horn = 1) diff --git a/code/modules/jobs/job_types/roguetown/garrison/veteran.dm b/code/modules/jobs/job_types/roguetown/garrison/veteran.dm index 62853a862b6..e868ea23b58 100644 --- a/code/modules/jobs/job_types/roguetown/garrison/veteran.dm +++ b/code/modules/jobs/job_types/roguetown/garrison/veteran.dm @@ -14,7 +14,7 @@ outfit = /datum/outfit/job/roguetown/veteran give_bank_account = 1500 - min_pq = 0 + min_pq = 15 max_pq = null cmode_music = 'sound/music/combat_guard.ogg' @@ -36,5 +36,6 @@ /datum/outfit/job/roguetown/veteran/pre_equip(mob/living/carbon/human/H, visualsOnly) . = ..() cloak = /obj/item/clothing/cloak/half/vet + r_hand = /obj/item/scomstone l_hand = /obj/item/class_selector/veteran //this is where they equip shit. H.verbs |= /mob/proc/haltyell diff --git a/code/modules/jobs/job_types/roguetown/goblin/tribalcook.dm b/code/modules/jobs/job_types/roguetown/goblin/tribalcook.dm index 43bac496a0d..fb03eb76661 100644 --- a/code/modules/jobs/job_types/roguetown/goblin/tribalcook.dm +++ b/code/modules/jobs/job_types/roguetown/goblin/tribalcook.dm @@ -17,7 +17,6 @@ /datum/outfit/job/roguetown/tribalcook/pre_equip(mob/living/carbon/human/H) ..() - armor = /obj/item/clothing/suit/roguetown/armor/leather/hide/goblin shirt = /obj/item/clothing/suit/roguetown/shirt/tribalrag pants = /obj/item/clothing/under/roguetown/loincloth/brown belt = /obj/item/storage/belt/rogue/leather/rope diff --git a/code/modules/jobs/job_types/roguetown/goblin/tribalshaman.dm b/code/modules/jobs/job_types/roguetown/goblin/tribalshaman.dm index 738dd5b1f62..a3d0ccd6eff 100644 --- a/code/modules/jobs/job_types/roguetown/goblin/tribalshaman.dm +++ b/code/modules/jobs/job_types/roguetown/goblin/tribalshaman.dm @@ -7,7 +7,7 @@ spawn_positions = 1 allowed_sexes = list(MALE, FEMALE) allowed_races = RACES_ALL_KINDSPLUS - tutorial = "A tribal druidic shaman that works with shaman magic to heal the wounded and bring the dead back. They also take care of the farming on the side." + tutorial = "A tribal druidic shaman that works with shaman magic to heal the wounded and bring even dead back. Their prowess with druidic magic allows them to grow crops and guide the tribe with their wisdoms." display_order = JDO_TRIBALSHAMAN spells = list(/obj/effect/proc_holder/spell/self/convertrole/tribal, /obj/effect/proc_holder/spell/invoked/cure_rot, /obj/effect/proc_holder/spell/invoked/heal/shaman, /obj/effect/proc_holder/spell/invoked/revive/shaman) outfit = /datum/outfit/job/roguetown/tribalshaman @@ -53,6 +53,9 @@ H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/misc/sewing, 3, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/magic/druidic, 2, TRUE) //This does nothing, but maybe one day it will. + H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/cure_rot) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/heal/shaman) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/revive/shaman) if(H.age == AGE_OLD) H.mind.adjust_skillrank_up_to(/datum/skill/magic/holy, 1, TRUE) H.mind.adjust_skillrank_up_to(/datum/skill/magic/druidic, 1, TRUE) @@ -64,9 +67,6 @@ ADD_TRAIT(H, TRAIT_NASTY_EATER, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_PERFECT_TRACKER, TRAIT_GENERIC) var/datum/devotion/C = new /datum/devotion(H, H.patron) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/cure_rot) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/heal/shaman) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/revive/shaman) C.grant_spells_priest(H) H.verbs += list(/mob/living/carbon/human/proc/devotionreport, /mob/living/carbon/human/proc/clericpray) diff --git a/code/modules/jobs/job_types/roguetown/goblin/tribalsmith.dm b/code/modules/jobs/job_types/roguetown/goblin/tribalsmith.dm index d740523097b..1f8c864f173 100644 --- a/code/modules/jobs/job_types/roguetown/goblin/tribalsmith.dm +++ b/code/modules/jobs/job_types/roguetown/goblin/tribalsmith.dm @@ -16,7 +16,6 @@ /datum/outfit/job/roguetown/tribalsmith/pre_equip(mob/living/carbon/human/H) ..() - armor = /obj/item/clothing/suit/roguetown/armor/leather/hide/goblin shirt = /obj/item/clothing/suit/roguetown/shirt/tribalrag pants = /obj/item/clothing/under/roguetown/loincloth/brown belt = /obj/item/storage/belt/rogue/leather diff --git a/code/modules/jobs/job_types/roguetown/nobility/judge.dm b/code/modules/jobs/job_types/roguetown/nobility/judge.dm index fd003768403..fc4476f219b 100644 --- a/code/modules/jobs/job_types/roguetown/nobility/judge.dm +++ b/code/modules/jobs/job_types/roguetown/nobility/judge.dm @@ -132,32 +132,29 @@ var/choice = alert(lord, "The judge requests a new law!\n[requested_law]", "JUDGE LAW REQUEST", "Yes", "No") if(choice != "Yes" || QDELETED(lord) || lord.stat > CONSCIOUS) if(judge) - to_chat(span_warning("The lord has denied the request for a new law!")) + to_chat(judge, span_warning("The lord has denied the request for a new law!")) return make_law(requested_law) - /proc/lord_law_removal_requested(mob/living/judge, mob/living/carbon/human/lord, requested_law) if(!requested_law || !GLOB.laws_of_the_land[requested_law]) return var/choice = alert(lord, "The judge requests the removal of a law!\n[GLOB.laws_of_the_land[requested_law]]", "JUDGE LAW REQUEST", "Yes", "No") if(choice != "Yes" || QDELETED(lord) || lord.stat > CONSCIOUS) if(judge) - to_chat(span_warning("The lord has denied the request for a law removal!")) + to_chat(judge, span_warning("The lord has denied the request for a law removal!")) return remove_law(requested_law) - /proc/lord_purge_requested(mob/living/judge, mob/living/carbon/human/lord) var/choice = alert(lord, "The judge requests a purge of all laws!", "JUDGE PURGE REQUEST", "Yes", "No") if(choice != "Yes" || QDELETED(lord) || lord.stat > CONSCIOUS) if(judge) - to_chat(span_warning("The lord has denied the request for a purge of all laws!")) + to_chat(judge, span_warning("The lord has denied the request for a purge of all laws!")) return purge_laws() - /proc/lord_outlaw_requested(mob/living/judge, mob/living/carbon/human/lord, requested_outlaw) var/choice = alert(lord, "The judge requests to outlaw someone!\n[requested_outlaw]", "JUDGE OUTLAW REQUEST", "Yes", "No") if(choice != "Yes" || QDELETED(lord) || lord.stat > CONSCIOUS) if(judge) - to_chat(span_warning("The lord has denied the request for declaring an outlaw!")) + to_chat(judge, span_warning("The lord has denied the request for declaring an outlaw!")) return - make_outlaw(requested_outlaw) \ No newline at end of file + make_outlaw(requested_outlaw) diff --git a/code/modules/jobs/job_types/roguetown/peasants/grabber.dm b/code/modules/jobs/job_types/roguetown/peasants/grabber.dm deleted file mode 100644 index d9ed5c36347..00000000000 --- a/code/modules/jobs/job_types/roguetown/peasants/grabber.dm +++ /dev/null @@ -1,66 +0,0 @@ -/datum/job/roguetown/grabber - title = "Grabber" - flag = GRABBER - department_flag = PEASANTS - faction = "Station" - total_positions = 0 - spawn_positions = 0 - - allowed_races = RACES_ALL_KINDSPLUS - - tutorial = "Grabber is the lowest position in the Merchant's Guild, reserved for the strong, loyal newcomers. They can be like family to the merchant in these foreign lands." - - outfit = /datum/outfit/job/roguetown/grabber - display_order = JDO_GRABBER - min_pq = -10 - max_pq = null - -/datum/outfit/job/roguetown/grabber/pre_equip(mob/living/carbon/human/H) - ..() - if(H.mind) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 2, TRUE) - if(H.gender == MALE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/maces, 3, TRUE) - else - H.mind.adjust_skillrank_up_to(/datum/skill/combat/swords, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/wrestling, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/unarmed, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/knives, 1, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/swimming, 4, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 1, TRUE) - if(H.gender == MALE) - shoes = /obj/item/clothing/shoes/roguetown/boots/leather - pants = /obj/item/clothing/under/roguetown/tights/sailor - neck = /obj/item/storage/belt/rogue/pouch/coins/poor - beltr = /obj/item/rogueweapon/mace/woodclub - beltl = /obj/item/roguekey/shop - belt = /obj/item/storage/belt/rogue/leather/rope - shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/sailor - backl = /obj/item/storage/backpack/rogue/satchel - if(prob(30)) - shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/sailor/red - if(prob(23)) - armor = /obj/item/clothing/suit/roguetown/armor/leather/vest/sailor - H.change_stat("strength", 2) - H.change_stat("intelligence", -3) - H.change_stat("endurance", 3) - H.change_stat("constitution", 2) - else - shoes = /obj/item/clothing/shoes/roguetown/gladiator - pants = /obj/item/clothing/under/roguetown/tights/sailor - beltr = /obj/item/rogueweapon/sword/cutlass - neck = /obj/item/storage/belt/rogue/pouch/coins/poor - beltl = /obj/item/roguekey/shop - belt = /obj/item/storage/belt/rogue/leather/rope - shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/sailor - if(prob(23)) - armor = /obj/item/clothing/suit/roguetown/armor/leather/vest/sailor - if(prob(77)) - shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/sailor/red - H.change_stat("strength", 1) - H.change_stat("perception", 2) - H.change_stat("intelligence", -3) - H.change_stat("endurance", 4) - H.change_stat("speed", 3) - H.change_stat("constitution", 1) diff --git a/code/modules/jobs/job_types/roguetown/roguetown.dm b/code/modules/jobs/job_types/roguetown/roguetown.dm index a8adb2dcaa1..1d6c2488ce1 100644 --- a/code/modules/jobs/job_types/roguetown/roguetown.dm +++ b/code/modules/jobs/job_types/roguetown/roguetown.dm @@ -97,7 +97,7 @@ return // For magic class roundstart spell selection -/datum/outfit/job/roguetown/proc/choose_magic(list/category, mob/living/carbon/human/H) +/datum/outfit/job/roguetown/proc/choose_magic(list/obj/effect/proc_holder/spell/category, mob/living/carbon/human/H) var/list/choices = list() for(var/i = 1, i <= category.len, i++) choices["[category[i].name]: [category[i].cost]"] = category[i] diff --git a/code/modules/jobs/job_types/roguetown/yeomen/alchemist.dm b/code/modules/jobs/job_types/roguetown/yeomen/alchemist.dm index edb107dc467..55f4181a505 100644 --- a/code/modules/jobs/job_types/roguetown/yeomen/alchemist.dm +++ b/code/modules/jobs/job_types/roguetown/yeomen/alchemist.dm @@ -41,7 +41,7 @@ backpack_contents = list( /obj/item/reagent_containers/glass/alembic = 1, /obj/item/storage/fancy/ifak = 1, - /obj/item/clothing/ring/lantern = 1, + /obj/item/flashlight/flare/torch/lantern/ring = 1, /obj/item/storage/box/matches = 1, ) H.change_stat("intelligence", 3) @@ -57,7 +57,7 @@ backpack_contents = list( /obj/item/reagent_containers/glass/alembic = 1, /obj/item/storage/fancy/ifak = 1, - /obj/item/clothing/ring/lantern = 1, + /obj/item/flashlight/flare/torch/lantern/ring = 1, /obj/item/storage/box/matches = 1, ) H.change_stat("intelligence", 3) // bob I like your code work but you are a sexist prick and I hate wiping your ass of this lil subtle stab shit. diff --git a/code/modules/jobs/job_types/roguetown/yeomen/apothecary.dm b/code/modules/jobs/job_types/roguetown/yeomen/apothecary.dm deleted file mode 100644 index 10ae2a28f6a..00000000000 --- a/code/modules/jobs/job_types/roguetown/yeomen/apothecary.dm +++ /dev/null @@ -1,30 +0,0 @@ -/datum/job/roguetown/apothecary - title = "Apothecary" - flag = APOTHECARY - department_flag = YEOMEN - faction = "Station" - total_positions = 0 - spawn_positions = 0 - - allowed_races = RACES_ALL_KINDSPLUS - - outfit = /datum/outfit/job/roguetown/apothecary - outfit_female = /datum/outfit/job/roguetown/apothecary/female - display_order = 6 - min_pq = -10 - max_pq = null - -/datum/outfit/job/roguetown/apothecary - name = "Apothecary" - jobtype = /datum/job/roguetown/apothecary - - pants = /obj/item/clothing/under/roguetown/tights - shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt - armor = /obj/item/clothing/suit/roguetown/shirt/rags - shoes = /obj/item/clothing/shoes/roguetown/boots - -/datum/outfit/job/roguetown/apothecary/female - name = "Apothecary" - jobtype = /datum/job/roguetown/apothecary - - pants = null diff --git a/code/modules/jobs/job_types/roguetown/youngfolk/mage_apprentice.dm b/code/modules/jobs/job_types/roguetown/youngfolk/mage_apprentice.dm deleted file mode 100644 index 3318608fcd5..00000000000 --- a/code/modules/jobs/job_types/roguetown/youngfolk/mage_apprentice.dm +++ /dev/null @@ -1,46 +0,0 @@ -/datum/job/roguetown/wapprentice - title = "Magicians Apprentice" - flag = MAGEAPPRENTICE - department_flag = YOUNGFOLK - faction = "Station" - total_positions = 2 - spawn_positions = 2 - - allowed_races = RACES_ALL_KINDSPLUS - allowed_ages = list(AGE_ADULT) - - tutorial = "Your master once saw potential in you, something you are uncertain if they still do with your recent studies. The path to using magic is something treacherous and untamed, and you are still decades away from calling yourself even a journeyman in the field. Listen and serve, and someday you will earn your hat." - - outfit = /datum/outfit/job/roguetown/wapprentice - - display_order = JDO_MAGEAPPRENTICE - give_bank_account = TRUE - - min_pq = 0 - max_pq = null - -/datum/outfit/job/roguetown/wapprentice/pre_equip(mob/living/carbon/human/H) - ..() - shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt - pants = /obj/item/clothing/under/roguetown/tights/random - belt = /obj/item/storage/belt/rogue/leather/rope - beltr = /obj/item/storage/keyring/mage - r_hand = /obj/item/rogueweapon/woodstaff - if(H.gender == MALE) - shoes = /obj/item/clothing/shoes/roguetown/simpleshoes - armor = /obj/item/clothing/suit/roguetown/armor/workervest - backr = /obj/item/storage/backpack/rogue/satchel - else - shoes = /obj/item/clothing/shoes/roguetown/sandals - armor = /obj/item/clothing/suit/roguetown/armor/workervest - backr = /obj/item/storage/backpack/rogue/satchel - if(H.mind) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/reading, 3, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/magic/arcane, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/craft/crafting, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/alchemy, 2, TRUE) - H.mind.adjust_skillrank_up_to(/datum/skill/combat/polearms, 1, TRUE) - H.mind.adjust_spellpoints(5) - H.change_stat("intelligence", 2) - H.change_stat("speed", -1) - H.verbs += list(/mob/living/carbon/human/proc/magicreport, /mob/living/carbon/human/proc/magiclearn) diff --git a/code/modules/jobs/jobs.dm b/code/modules/jobs/jobs.dm index 5e5908d577d..201690428f8 100644 --- a/code/modules/jobs/jobs.dm +++ b/code/modules/jobs/jobs.dm @@ -74,7 +74,7 @@ GLOBAL_LIST_INIT(noble_positions, list( GLOBAL_LIST_INIT(courtier_positions, list( "Magician", "Physician", - "Jester", + "Harlequin", "Head Butler", )) @@ -89,7 +89,7 @@ GLOBAL_LIST_INIT(garrison_positions, list( )) GLOBAL_LIST_INIT(church_positions, list( - "Prophet", + "Archpriest", "Wytcher Captain", "Confessor", "Gravesinger", diff --git a/code/modules/keybindings/bindings_carbon.dm b/code/modules/keybindings/bindings_carbon.dm index 1794604ba7b..60b1e953a6f 100644 --- a/code/modules/keybindings/bindings_carbon.dm +++ b/code/modules/keybindings/bindings_carbon.dm @@ -4,4 +4,4 @@ if("B") client.set_context_menu_enabled(1) return ..() -#endif \ No newline at end of file +#endif diff --git a/code/modules/language/language.dm b/code/modules/language/language.dm index fd322b70627..0b7e493d309 100644 --- a/code/modules/language/language.dm +++ b/code/modules/language/language.dm @@ -11,8 +11,7 @@ var/ask_verb = "asks" // Used when sentence ends in a ? var/exclaim_verb = "exclaims" // Used when sentence ends in a ! var/whisper_verb = "whispers" // Optional. When not specified speech_verb + quietly/softly is used instead. - var/signlang_verb = list("signs", "gestures") // list of emotes that might be displayed if this language has NONVERBAL or SIGNLANG flags - var/signlang = FALSE + var/signlang_verb = list("signs", "gestures") // list of emotes that might be displayed if this language has SIGNLANG flag var/key // Character used to speak in language // If key is null, then the language isn't real or learnable. var/flags // Various language flags. diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm index 6e3f9577d4a..0fea056f545 100644 --- a/code/modules/language/language_holder.dm +++ b/code/modules/language/language_holder.dm @@ -142,3 +142,6 @@ /datum/language_holder/abyssal languages = list(/datum/language/hellspeak) + +/datum/language_holder/celestial + languages = list(/datum/language/celestial) diff --git a/code/modules/language/roguetown/beast.dm b/code/modules/language/roguetown/beast.dm index 5ffb31cfec1..d168a2e092a 100644 --- a/code/modules/language/roguetown/beast.dm +++ b/code/modules/language/roguetown/beast.dm @@ -16,4 +16,4 @@ "GRrr", "Rr", "Rrrr", -"Rrrrr") \ No newline at end of file +"Rrrrr") diff --git a/code/modules/language/roguetown/elf.dm b/code/modules/language/roguetown/elf.dm index 0d816ebb35f..d7cb154fd8f 100644 --- a/code/modules/language/roguetown/elf.dm +++ b/code/modules/language/roguetown/elf.dm @@ -163,4 +163,4 @@ "aid", "aig", "ile", -"tea") \ No newline at end of file +"tea") diff --git a/code/modules/language/roguetown/thievescant.dm b/code/modules/language/roguetown/thievescant.dm index 05caccd6979..2437b7ca2ab 100644 --- a/code/modules/language/roguetown/thievescant.dm +++ b/code/modules/language/roguetown/thievescant.dm @@ -5,11 +5,10 @@ ask_verb = "questioningly gestures" exclaim_verb = "angrily gestures" key = "t" - flags = LANGUAGE_HIDE_ICON_IF_UNDERSTOOD | LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD | SIGNLANG | NO_STUTTER + flags = LANGUAGE_HIDE_ICON_IF_UNDERSTOOD | LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD | SIGNLANG | LANGUAGE_HIDE_NOT_UNDERSTOOD | NO_STUTTER space_chance = 66 default_priority = 80 icon_state = "asse" - signlang = TRUE signlang_verb = list( "scrunches their nose", "smiles", diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm deleted file mode 100644 index e1e98b7cc20..00000000000 --- a/code/modules/library/lib_machines.dm +++ /dev/null @@ -1,597 +0,0 @@ -/* Library Machines - * - * Contains: - * Borrowbook datum - * Library Public Computer - * Cachedbook datum - * Library Computer - * Library Scanner - * Book Binder - */ - - - -/* - * Library Public Computer - */ -/obj/machinery/computer/libraryconsole - name = "library visitor console" - icon_state = "oldcomp" - icon_screen = "library" - icon_keyboard = null - circuit = /obj/item/circuitboard/computer/libraryconsole - desc = "" - var/screenstate = 0 - var/title - var/category = "Any" - var/author - var/SQLquery - -/obj/machinery/computer/libraryconsole/ui_interact(mob/user) - . = ..() - var/dat = "" // - switch(screenstate) - if(0) - dat += "

    Search Settings


    " - dat += "Filter by Title: [title]
    " - dat += "Filter by Category: [category]
    " - dat += "Filter by Author: [author]
    " - dat += "\[Start Search\]
    " - if(1) - if (!SSdbcore.Connect()) - dat += "ERROR: Unable to contact External Archive. Please contact my system administrator for assistance.
    " - else if(QDELETED(user)) - return - else if(!SQLquery) - dat += "ERROR: Malformed search request. Please contact my system administrator for assistance.
    " - else - dat += "" - dat += "" - - var/datum/DBQuery/query_library_list_books = SSdbcore.NewQuery(SQLquery) - if(!query_library_list_books.Execute()) - dat += "ERROR: Unable to retrieve book listings. Please contact my system administrator for assistance.
    " - else - while(query_library_list_books.NextRow()) - var/author = query_library_list_books.item[1] - var/title = query_library_list_books.item[2] - var/category = query_library_list_books.item[3] - var/id = query_library_list_books.item[4] - dat += "" - qdel(query_library_list_books) - if(QDELETED(user)) - return - dat += "
    AUTHORTITLECATEGORYSS13BN
    [author][title][category][id]

    " - dat += "\[Go Back\]
    " - var/datum/browser/popup = new(user, "publiclibrary", name, 600, 400) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - -/obj/machinery/computer/libraryconsole/Topic(href, href_list) - . = ..() - if(..()) - usr << browse(null, "window=publiclibrary") - onclose(usr, "publiclibrary") - return - - if(href_list["settitle"]) - var/newtitle = input("Enter a title to search for:") as text|null - if(newtitle) - title = sanitize(newtitle) - else - title = null - title = sanitizeSQL(title) - if(href_list["setcategory"]) - var/newcategory = input("Choose a category to search for:") in list("Any", "Fiction", "Non-Fiction", "Adult", "Reference", "Religion") - if(newcategory) - category = sanitize(newcategory) - else - category = "Any" - category = sanitizeSQL(category) - if(href_list["setauthor"]) - var/newauthor = input("Enter an author to search for:") as text|null - if(newauthor) - author = sanitize(newauthor) - else - author = null - author = sanitizeSQL(author) - if(href_list["search"]) - SQLquery = "SELECT author, title, category, id FROM [format_table_name("library")] WHERE isnull(deleted) AND " - if(category == "Any") - SQLquery += "author LIKE '%[author]%' AND title LIKE '%[title]%'" - else - SQLquery += "author LIKE '%[author]%' AND title LIKE '%[title]%' AND category='[category]'" - screenstate = 1 - - if(href_list["back"]) - screenstate = 0 - - src.add_fingerprint(usr) - src.updateUsrDialog() - return - -/* - * Borrowbook datum - */ -/datum/borrowbook // Datum used to keep track of who has borrowed what when and for how long. - var/bookname - var/mobname - var/getdate - var/duedate - -/* - * Cachedbook datum - */ -/datum/cachedbook // Datum used to cache the SQL DB books locally in order to achieve a performance gain. - var/id - var/title - var/author - var/category - -GLOBAL_LIST(cachedbooks) // List of our cached book datums - - -/proc/load_library_db_to_cache() - if(GLOB.cachedbooks) - return - if(!SSdbcore.Connect()) - return - GLOB.cachedbooks = list() - var/datum/DBQuery/query_library_cache = SSdbcore.NewQuery("SELECT id, author, title, category FROM [format_table_name("library")] WHERE isnull(deleted)") - if(!query_library_cache.Execute()) - qdel(query_library_cache) - return - while(query_library_cache.NextRow()) - var/datum/cachedbook/newbook = new() - newbook.id = query_library_cache.item[1] - newbook.author = query_library_cache.item[2] - newbook.title = query_library_cache.item[3] - newbook.category = query_library_cache.item[4] - GLOB.cachedbooks += newbook - qdel(query_library_cache) - - - -#define PRINTER_COOLDOWN 60 - -/* - * Library Computer - * After 860 days, it's finally a buildable computer. - */ -// TODO: Make this an actual /obj/machinery/computer that can be crafted from circuit boards and such -// It is August 22nd, 2012... This TODO has already been here for months.. I wonder how long it'll last before someone does something about it. -// It's December 25th, 2014, and this is STILL here, and it's STILL relevant. Kill me -/obj/machinery/computer/libraryconsole/bookmanagement - name = "book inventory management console" - desc = "" - screenstate = 0 // 0 - Main Menu, 1 - Inventory, 2 - Checked Out, 3 - Check Out a Book - verb_say = "beeps" - verb_ask = "beeps" - verb_exclaim = "beeps" - pass_flags = PASSTABLE - var/arcanecheckout = 0 - var/buffer_book - var/buffer_mob - var/upload_category = "Fiction" - var/list/checkouts = list() - var/list/inventory = list() - var/checkoutperiod = 5 // In minutes - var/obj/machinery/libraryscanner/scanner // Book scanner that will be used when uploading books to the Archive - var/list/libcomp_menu - var/page = 1 //current page of the external archives - var/cooldown = 0 - -/obj/machinery/computer/libraryconsole/bookmanagement/proc/build_library_menu() - if(libcomp_menu) - return - load_library_db_to_cache() - if(!GLOB.cachedbooks) - return - libcomp_menu = list("") - - for(var/i in 1 to GLOB.cachedbooks.len) - var/datum/cachedbook/C = GLOB.cachedbooks[i] - var/page = round(i/250)+1 - if (libcomp_menu.len < page) - libcomp_menu.len = page - libcomp_menu[page] = "" - libcomp_menu[page] += "[C.author][C.title][C.category]\[Order\]\n" - -/obj/machinery/computer/libraryconsole/bookmanagement/Initialize() - . = ..() - if(circuit) - circuit.name = "Book Inventory Management Console (Machine Board)" - circuit.build_path = /obj/machinery/computer/libraryconsole/bookmanagement - -/obj/machinery/computer/libraryconsole/bookmanagement/ui_interact(mob/user) - . = ..() - var/dat = "" // - switch(screenstate) - if(0) - // Main Menu - dat += "1. View General Inventory
    " - dat += "2. View Checked Out Inventory
    " - dat += "3. Check out a Book
    " - dat += "4. Connect to External Archive
    " - dat += "5. Upload New Title to Archive
    " - dat += "6. Upload Scanned Title to Newscaster
    " - dat += "7. Print Corporate Materials
    " - if(obj_flags & EMAGGED) - dat += "8. Access the Forbidden Lore Vault
    " - if(src.arcanecheckout) - print_forbidden_lore(user) - src.arcanecheckout = 0 - if(1) - // Inventory - dat += "

    Inventory


    " - for(var/obj/item/book/b in inventory) - dat += "[b.name] (Delete)
    " - dat += "(Return to main menu)
    " - if(2) - // Checked Out - dat += "

    Checked Out Books


    " - for(var/datum/borrowbook/b in checkouts) - var/timetaken = world.time - b.getdate - timetaken /= 600 - timetaken = round(timetaken) - var/timedue = b.duedate - world.time - timedue /= 600 - if(timedue <= 0) - timedue = "(OVERDUE) [timedue]" - else - timedue = round(timedue) - dat += "\"[b.bookname]\", Checked out to: [b.mobname]
    --- Taken: [timetaken] minutes ago, Due: in [timedue] minutes
    " - dat += "(Check In)

    " - dat += "(Return to main menu)
    " - if(3) - // Check Out a Book - dat += "

    Check Out a Book


    " - dat += "Book: [src.buffer_book] " - dat += "\[Edit\]
    " - dat += "Recipient: [src.buffer_mob] " - dat += "\[Edit\]
    " - dat += "Checkout Date : [world.time/600]
    " - dat += "Due Date: [(world.time + checkoutperiod)/600]
    " - dat += "(Checkout Period: [checkoutperiod] minutes) (+/-)" - dat += "(Commit Entry)
    " - dat += "(Return to main menu)
    " - if(4) - dat += "

    External Archive

    " - build_library_menu() - - if(!GLOB.cachedbooks) - dat += "ERROR: Unable to contact External Archive. Please contact my system administrator for assistance." - else - dat += "(Order book by SS13BN)

    " - dat += "" - dat += "" - dat += libcomp_menu[CLAMP(page,1,libcomp_menu.len)] - dat += "" - dat += "
    AUTHORTITLECATEGORY
    <<<< >>>>
    " - dat += "
    (Return to main menu)
    " - if(5) - dat += "

    Upload a New Title

    " - if(!scanner) - scanner = findscanner(9) - if(!scanner) - dat += "No scanner found within wireless network range.
    " - else if(!scanner.cache) - dat += "No data found in scanner memory.
    " - else - dat += "Data marked for upload...
    " - dat += "Title: [scanner.cache.name]
    " - if(!scanner.cache.author) - scanner.cache.author = "Anonymous" - dat += "Author: [scanner.cache.author]
    " - dat += "Category: [upload_category]
    " - dat += "\[Upload\]
    " - dat += "(Return to main menu)
    " - if(6) - dat += "

    Post Title to Newscaster

    " - if(!scanner) - scanner = findscanner(9) - if(!scanner) - dat += "No scanner found within wireless network range.
    " - else if(!scanner.cache) - dat += "No data found in scanner memory.
    " - else - dat += "Post [scanner.cache.name] to station newscasters?" - dat += "\[Post\]
    " - dat += "(Return to main menu)
    " - if(7) - dat += "

    NTGanda(tm) Universal Printing Module

    " - dat += "What would you like to print?
    " - dat += "\[Bible\]
    " - dat += "\[Poster\]
    " - dat += "(Return to main menu)
    " - if(8) - dat += "

    Accessing Forbidden Lore Vault v 1.3

    " - dat += "Are you absolutely sure you want to proceed? EldritchRelics Inc. takes no responsibilities for loss of sanity resulting from this action.

    " - dat += "Yes.
    " - dat += "No.
    " - - var/datum/browser/popup = new(user, "library", name, 600, 400) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - -/obj/machinery/computer/libraryconsole/bookmanagement/proc/findscanner(viewrange) - for(var/obj/machinery/libraryscanner/S in range(viewrange, get_turf(src))) - return S - return null - -/obj/machinery/computer/libraryconsole/bookmanagement/proc/print_forbidden_lore(mob/user) - new /obj/item/melee/cultblade/dagger(get_turf(src)) - to_chat(user, span_warning("My sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a sinister dagger sitting on the desk. You don't even remember where it came from...")) - user.visible_message(span_warning("[user] stares at the blank screen for a few moments, [user.p_their()] expression frozen in fear. When [user.p_they()] finally awaken[user.p_s()] from it, [user.p_they()] look[user.p_s()] a lot older."), 2) - -/obj/machinery/computer/libraryconsole/bookmanagement/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/barcodescanner)) - var/obj/item/barcodescanner/scanner = W - scanner.computer = src - to_chat(user, span_notice("[scanner]'s associated machine has been set to [src].")) - audible_message(span_hear("[src] lets out a low, short blip.")) - else - return ..() - -/obj/machinery/computer/libraryconsole/bookmanagement/emag_act(mob/user) - if(density && !(obj_flags & EMAGGED)) - obj_flags |= EMAGGED - -/obj/machinery/computer/libraryconsole/bookmanagement/Topic(href, href_list) - if(..()) - usr << browse(null, "window=library") - onclose(usr, "library") - return - if(href_list["page"] && screenstate == 4) - page = text2num(href_list["page"]) - if(href_list["switchscreen"]) - switch(href_list["switchscreen"]) - if("0") - screenstate = 0 - if("1") - screenstate = 1 - if("2") - screenstate = 2 - if("3") - screenstate = 3 - if("4") - screenstate = 4 - if("5") - screenstate = 5 - if("6") - screenstate = 6 - if("7") - screenstate = 7 - if("8") - screenstate = 8 - if(href_list["arccheckout"]) - if(obj_flags & EMAGGED) - src.arcanecheckout = 1 - src.screenstate = 0 - if(href_list["increasetime"]) - checkoutperiod += 1 - if(href_list["decreasetime"]) - checkoutperiod -= 1 - if(checkoutperiod < 1) - checkoutperiod = 1 - if(href_list["editbook"]) - buffer_book = copytext(sanitize(input("Enter the book's title:") as text|null),1,MAX_MESSAGE_LEN) - if(href_list["editmob"]) - buffer_mob = copytext(sanitize(input("Enter the recipient's name:") as text|null),1,MAX_NAME_LEN) - if(href_list["checkout"]) - var/datum/borrowbook/b = new /datum/borrowbook - b.bookname = sanitize(buffer_book) - b.mobname = sanitize(buffer_mob) - b.getdate = world.time - b.duedate = world.time + (checkoutperiod * 600) - checkouts.Add(b) - if(href_list["checkin"]) - var/datum/borrowbook/b = locate(href_list["checkin"]) in checkouts - if(b && istype(b)) - checkouts.Remove(b) - if(href_list["delbook"]) - var/obj/item/book/b = locate(href_list["delbook"]) in inventory - if(b && istype(b)) - inventory.Remove(b) - if(href_list["setauthor"]) - var/newauthor = copytext(sanitize(input("Enter the author's name: ") as text|null),1,MAX_MESSAGE_LEN) - if(newauthor) - scanner.cache.author = newauthor - if(href_list["setcategory"]) - var/newcategory = input("Choose a category: ") in list("Fiction", "Non-Fiction", "Adult", "Reference", "Religion","Technical") - if(newcategory) - upload_category = newcategory - if(href_list["upload"]) - if(scanner) - if(scanner.cache) - var/choice = input("Are you certain you wish to upload this title to the Archive?") in list("Confirm", "Abort") - if(choice == "Confirm") - if (!SSdbcore.Connect()) - alert("Connection to Archive has been severed. Aborting.") - else - - var/sqltitle = sanitizeSQL(scanner.cache.name) - var/sqlauthor = sanitizeSQL(scanner.cache.author) - var/sqlcontent = sanitizeSQL(scanner.cache.dat) - var/sqlcategory = sanitizeSQL(upload_category) - var/sqlckey = sanitizeSQL(usr.ckey) - var/msg = "[key_name(usr)] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs" - var/datum/DBQuery/query_library_upload = SSdbcore.NewQuery("INSERT INTO [format_table_name("library")] (author, title, content, category, ckey, datetime, round_id_created) VALUES ('[sqlauthor]', '[sqltitle]', '[sqlcontent]', '[sqlcategory]', '[sqlckey]', Now(), '[GLOB.round_id]')") - if(!query_library_upload.Execute()) - qdel(query_library_upload) - alert("Database error encountered uploading to Archive") - return - else - log_game(msg) - qdel(query_library_upload) - alert("Upload Complete. Uploaded title will be unavailable for printing for a short period") - if(href_list["newspost"]) - if(!GLOB.news_network) - alert("No news network found on station. Aborting.") - var/channelexists = 0 - for(var/datum/newscaster/feed_channel/FC in GLOB.news_network.network_channels) - if(FC.channel_name == "Nanotrasen Book Club") - channelexists = 1 - break - if(!channelexists) - GLOB.news_network.CreateFeedChannel("Nanotrasen Book Club", "Library", null) - GLOB.news_network.SubmitArticle(scanner.cache.dat, "[scanner.cache.name]", "Nanotrasen Book Club", null) - alert("Upload complete. Your uploaded title is now available on station newscasters.") - if(href_list["orderbyid"]) - if(cooldown > world.time) - say("Printer unavailable. Please allow a short time before attempting to print.") - else - var/orderid = input("Enter my order:") as num|null - if(orderid) - if(isnum(orderid) && ISINTEGER(orderid)) - href_list["targetid"] = num2text(orderid) - - if(href_list["targetid"]) - var/sqlid = sanitizeSQL(href_list["targetid"]) - if (!SSdbcore.Connect()) - alert("Connection to Archive has been severed. Aborting.") - if(cooldown > world.time) - say("Printer unavailable. Please allow a short time before attempting to print.") - else - cooldown = world.time + PRINTER_COOLDOWN - var/datum/DBQuery/query_library_print = SSdbcore.NewQuery("SELECT * FROM [format_table_name("library")] WHERE id=[sqlid] AND isnull(deleted)") - if(!query_library_print.Execute()) - qdel(query_library_print) - say("PRINTER ERROR! Failed to print document (0x0000000F)") - return - while(query_library_print.NextRow()) - var/author = query_library_print.item[2] - var/title = query_library_print.item[3] - var/content = query_library_print.item[4] - if(!QDELETED(src)) - var/obj/item/book/B = new(get_turf(src)) - B.name = "Book: [title]" - B.title = title - B.author = author - B.dat = content - B.icon_state = "book[rand(1,8)]" - visible_message(span_notice("[src]'s printer hums as it produces a completely bound book. How did it do that?")) - break - qdel(query_library_print) - if(href_list["printbible"]) - if(cooldown < world.time) - var/obj/item/storage/book/bible/B = new /obj/item/storage/book/bible(src.loc) - if(GLOB.bible_icon_state && GLOB.bible_item_state) - B.icon_state = GLOB.bible_icon_state - B.item_state = GLOB.bible_item_state - B.name = GLOB.bible_name - B.deity_name = GLOB.deity - cooldown = world.time + PRINTER_COOLDOWN - else - say("Printer currently unavailable, please wait a moment.") - if(href_list["printposter"]) - if(cooldown < world.time) - new /obj/item/poster/random_official(src.loc) - cooldown = world.time + PRINTER_COOLDOWN - else - say("Printer currently unavailable, please wait a moment.") - add_fingerprint(usr) - updateUsrDialog() - -/* - * Library Scanner - */ -/obj/machinery/libraryscanner - name = "scanner control interface" - icon = 'icons/obj/library.dmi' - icon_state = "bigscanner" - desc = "" - density = TRUE - var/obj/item/book/cache // Last scanned book - -/obj/machinery/libraryscanner/attackby(obj/O, mob/user, params) - if(istype(O, /obj/item/book)) - if(!user.transferItemToLoc(O, src)) - return - else - return ..() - -/obj/machinery/libraryscanner/attack_hand(mob/user) - . = ..() - if(.) - return - usr.set_machine(src) - var/dat = "" // - if(cache) - dat += "Data stored in memory.
    " - else - dat += "No data stored in memory.
    " - dat += "\[Scan\]" - if(cache) - dat += " \[Clear Memory\]

    \[Remove Book\]" - else - dat += "
    " - var/datum/browser/popup = new(user, "scanner", name, 600, 400) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - -/obj/machinery/libraryscanner/Topic(href, href_list) - if(..()) - usr << browse(null, "window=scanner") - onclose(usr, "scanner") - return - - if(href_list["scan"]) - for(var/obj/item/book/B in contents) - cache = B - break - if(href_list["clear"]) - cache = null - if(href_list["eject"]) - for(var/obj/item/book/B in contents) - B.forceMove(drop_location()) - src.add_fingerprint(usr) - src.updateUsrDialog() - return - - -/* - * Book binder - */ -/obj/machinery/bookbinder - name = "book binder" - icon = 'icons/obj/library.dmi' - icon_state = "binder" - desc = "" - density = TRUE - var/busy = FALSE - -/obj/machinery/bookbinder/attackby(obj/O, mob/user, params) - if(istype(O, /obj/item/paper)) - bind_book(user, O) - else if(default_unfasten_wrench(user, O)) - return 1 - else - return ..() - -/obj/machinery/bookbinder/proc/bind_book(mob/user, obj/item/paper/P) - if(stat) - return - if(busy) - to_chat(user, span_warning("The book binder is busy. Please wait for completion of previous operation.")) - return - if(!user.transferItemToLoc(P, src)) - return - user.visible_message(span_notice("[user] loads some paper into [src]."), span_notice("I load some paper into [src].")) - audible_message(span_hear("[src] begins to hum as it warms up its printing drums.")) - busy = TRUE - sleep(rand(200,400)) - busy = FALSE - if(P) - if(!stat) - visible_message(span_notice("[src] whirs as it prints and binds a new book.")) - var/obj/item/book/B = new(src.loc) - B.dat = P.info - B.name = "Print Job #" + "[rand(100, 999)]" - B.icon_state = "book[rand(1,7)]" - qdel(P) - else - P.forceMove(drop_location()) diff --git a/code/modules/lighting/lighting_emissive_blocker.dm b/code/modules/lighting/lighting_emissive_blocker.dm deleted file mode 100644 index b2102dea8b0..00000000000 --- a/code/modules/lighting/lighting_emissive_blocker.dm +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Internal atom that copies an appearance on to the blocker plane - * - * This means that the atom in question will block any emissive sprites. - * This should only be used internally. If you are directly creating more of these, - * you're almost guaranteed to be doing something wrong. - */ -/atom/movable/emissive_blocker - name = "emissive blocker" - plane = EMISSIVE_PLANE - layer = FLOAT_LAYER - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - appearance_flags = EMISSIVE_APPEARANCE_FLAGS - -/atom/movable/emissive_blocker/Initialize(mapload, source) - . = ..() - verbs.Cut() //Cargo culting from lighting object, this maybe affects memory usage? - - render_source = source - color = EM_BLOCK_COLOR - -/atom/movable/emissive_blocker/ex_act(severity) - return FALSE - -/atom/movable/emissive_blocker/singularity_act() - return - -/atom/movable/emissive_blocker/singularity_pull() - return - -/atom/movable/emissive_blocker/blob_act() - return - -/atom/movable/emissive_blocker/onTransitZ() - return - -//Prevents people from moving these after creation, because they shouldn't be. -/atom/movable/emissive_blocker/forceMove(atom/destination, no_tp = FALSE, harderforce = FALSE) - if(harderforce) - return ..() diff --git a/code/modules/mapping/ruins.dm b/code/modules/mapping/ruins.dm index 02dbd898300..aee778a98af 100644 --- a/code/modules/mapping/ruins.dm +++ b/code/modules/mapping/ruins.dm @@ -111,7 +111,7 @@ for(var/v in current_pick.always_spawn_with) if(current_pick.always_spawn_with[v] == PLACE_BELOW) var/turf/T = locate(1,1,target_z) - if(!SSmapping.get_turf_below(T)) + if(!GET_TURF_BELOW(T)) if(forced_z) continue outer else @@ -161,7 +161,7 @@ if(PLACE_DEFAULT) forced_ruins[linked] = -1 if(PLACE_BELOW) - forced_ruins[linked] = SSmapping.get_turf_below(placed_turf) + forced_ruins[linked] = GET_TURF_BELOW(placed_turf) if(PLACE_ISOLATED) forced_ruins[linked] = SSmapping.get_isolated_ruin_z() diff --git a/code/modules/mapping/space_management/multiz_helpers.dm b/code/modules/mapping/space_management/multiz_helpers.dm index aef3e0ed7d3..2c7a8114618 100644 --- a/code/modules/mapping/space_management/multiz_helpers.dm +++ b/code/modules/mapping/space_management/multiz_helpers.dm @@ -1,33 +1,46 @@ /proc/get_step_multiz(ref, dir) if(dir & UP) dir &= ~UP - return get_step(SSmapping.get_turf_above(get_turf(ref)), dir) + return get_step(GET_TURF_ABOVE(get_turf(ref)), dir) if(dir & DOWN) dir &= ~DOWN - return get_step(SSmapping.get_turf_below(get_turf(ref)), dir) + return get_step(GET_TURF_BELOW(get_turf(ref)), dir) return get_step(ref, dir) +/proc/get_multiz_accessible_levels(center_z) + . = list(center_z) + var/other_z = center_z + var/offset + while((offset = SSmapping.multiz_levels[other_z]["[DOWN]"])) + other_z -= offset + if(other_z in .) + break // no infinite loops + . += other_z + other_z = center_z + while((offset = SSmapping.multiz_levels[other_z]["[UP]"])) + other_z += offset + if(other_z in .) + break // no infinite loops + . += other_z + +/// A cache of stringified z-level zweb checks. +/// GLOB.zweb_cache[num2text(my_z)][num2text(compare_z)] = TRUE/FALSE +GLOBAL_LIST_EMPTY(zweb_cache) /proc/is_in_zweb(my_z, compare_z) if(!my_z || !compare_z) return FALSE if(my_z == compare_z) return TRUE - if(my_z > compare_z) - for(var/i in my_z to compare_z) - if(!i || i<0) - return FALSE - if(i == compare_z) - return TRUE - if(!SSmapping.level_trait(i, ZTRAIT_DOWN)) - return FALSE - if(my_z < compare_z) - for(var/i in my_z to compare_z) - if(!i || i<0) - return FALSE - if(i == compare_z) - return TRUE - if(!SSmapping.level_trait(i, ZTRAIT_UP)) - return FALSE + var/my_text = num2text(my_z) + var/comp_text = num2text(compare_z) + if(isnull(GLOB.zweb_cache[my_text]?[comp_text])) + LAZYINITLIST(GLOB.zweb_cache[my_text]) + for(var/zlevel in get_multiz_accessible_levels(my_z)) + var/ztext = num2text(zlevel) + GLOB.zweb_cache[my_text][ztext] = TRUE + LAZYINITLIST(GLOB.zweb_cache[ztext]) + LAZYADD(GLOB.zweb_cache[ztext], my_text) + return GLOB.zweb_cache[my_text][comp_text] /proc/get_dir_multiz(turf/us, turf/them) us = get_turf(us) @@ -37,24 +50,18 @@ if(us.z == them.z) return get_dir(us, them) else - var/turf/T = us.above() + var/turf/T = GET_TURF_ABOVE(us) var/dir = NONE if(T && (T.z == them.z)) dir = UP else - T = us.below() + T = GET_TURF_BELOW(us) if(T && (T.z == them.z)) dir = DOWN else return get_dir(us, them) return (dir | get_dir(us, them)) -/turf/proc/above() - return get_step_multiz(src, UP) - -/turf/proc/below() - return get_step_multiz(src, DOWN) - /proc/dir_inverse_multiz(dir) var/holder = dir & (UP|DOWN) if((holder == NONE) || (holder == (UP|DOWN))) diff --git a/code/modules/mapping/space_management/traits.dm b/code/modules/mapping/space_management/traits.dm index 9ba8d96d5e1..967a274732a 100644 --- a/code/modules/mapping/space_management/traits.dm +++ b/code/modules/mapping/space_management/traits.dm @@ -51,18 +51,18 @@ // Attempt to get the turf below the provided one according to Z traits /datum/controller/subsystem/mapping/proc/get_turf_below(turf/T) - if (!T) + if (!T || !initialized) return - var/offset = level_trait(T.z, ZTRAIT_DOWN) + var/offset = multiz_levels[T.z]["[DOWN]"] if (!offset) return - return locate(T.x, T.y, T.z + offset) + return locate(T.x, T.y, T.z - offset) // Attempt to get the turf above the provided one according to Z traits /datum/controller/subsystem/mapping/proc/get_turf_above(turf/T) - if (!T) + if (!T || !initialized) return - var/offset = level_trait(T.z, ZTRAIT_UP) + var/offset = multiz_levels[T.z]["[UP]"] if (!offset) return return locate(T.x, T.y, T.z + offset) diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm index ab14a63fb27..0a5fe22edb2 100644 --- a/code/modules/mining/aux_base_camera.dm +++ b/code/modules/mining/aux_base_camera.dm @@ -202,27 +202,27 @@ name = "Select Airlock Type" button_icon_state = "airlock_select" -datum/action/innate/aux_base/airlock_type/Activate() +/datum/action/innate/aux_base/airlock_type/Activate() if(..()) return B.RCD.change_airlock_setting() -datum/action/innate/aux_base/window_type +/datum/action/innate/aux_base/window_type name = "Select Window Type" button_icon_state = "window_select" -datum/action/innate/aux_base/window_type/Activate() +/datum/action/innate/aux_base/window_type/Activate() if(..()) return B.RCD.toggle_window_type() -datum/action/innate/aux_base/place_fan +/datum/action/innate/aux_base/place_fan name = "Place Tiny Fan" button_icon_state = "build_fan" -datum/action/innate/aux_base/place_fan/Activate() +/datum/action/innate/aux_base/place_fan/Activate() if(..()) return @@ -244,11 +244,11 @@ datum/action/innate/aux_base/place_fan/Activate() to_chat(owner, span_notice("Tiny fan placed. [B.fans_remaining] remaining.")) playsound(fan_turf, 'sound/blank.ogg', 50, TRUE) -datum/action/innate/aux_base/install_turret +/datum/action/innate/aux_base/install_turret name = "Install Plasma Anti-Wildlife Turret" button_icon_state = "build_turret" -datum/action/innate/aux_base/install_turret/Activate() +/datum/action/innate/aux_base/install_turret/Activate() if(..()) return diff --git a/code/modules/mining/equipment/vendor_items.dm b/code/modules/mining/equipment/vendor_items.dm deleted file mode 100644 index f4e57ab5b9d..00000000000 --- a/code/modules/mining/equipment/vendor_items.dm +++ /dev/null @@ -1,14 +0,0 @@ -/**********************Mining Equipment Vendor Items**************************/ -//misc stuff you can buy from the vendor that has special code but doesn't really need its own file - -/**********************Facehugger toy**********************/ -/obj/item/clothing/mask/facehugger/toy - item_state = "facehugger_inactive" - desc = "" - throwforce = 0 - real = 0 - sterile = 1 - tint = 3 //Makes it feel more authentic when it latches on - -/obj/item/clothing/mask/facehugger/toy/Die() - return diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 25dc8388a97..3b17193169f 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -756,7 +756,6 @@ // var/loot = rand(1,7) var/list/loot = list(/obj/item/book/granter/trait/defense/heavyarmor=35, /obj/item/book/granter/trait/defense/mediumarmor=12, - /obj/item/book/granter/trait/war/undying=8, /obj/item/riddleofsteel = 45) if(prob(50)) var/I = pickweight(loot) @@ -1561,13 +1560,11 @@ /obj/structure/closet/crate/necropolis/sif/PopulateContents() var/list/loot = list(/obj/item/rogueweapon/sword/sword_of_the_forsaken=40, /obj/item/clothing/neck/roguetown/necklace_of_the_forsaken=40, - /obj/item/book/granter/trait/war/relentless=10, /obj/item/book/granter/spell/spells5e/frostbite5e = 40, /obj/item/book/granter/spell/spells5e/createbonfire5e = 30, /obj/item/book/granter/spell/spells5e/acidsplash5e = 40,) var/list/loot2 = list(/obj/item/rogueweapon/sword/sword_of_the_forsaken=20, /obj/item/clothing/neck/roguetown/necklace_of_the_forsaken=20, - /obj/item/book/granter/trait/war/relentless=5, /obj/item/book/granter/spell/spells5e/frostbite5e = 20, /obj/item/book/granter/spell/spells5e/createbonfire5e = 15, /obj/item/book/granter/spell/spells5e/acidsplash5e = 20, diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index 603bb64ea52..f894f794816 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -18,7 +18,6 @@ new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150), new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200), new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300), - new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300), new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/hivelordstabilizer, 400), new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400), new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400), diff --git a/code/modules/mob/camera/camera.dm b/code/modules/mob/camera/camera.dm index 39954ee1d69..215617952ba 100644 --- a/code/modules/mob/camera/camera.dm +++ b/code/modules/mob/camera/camera.dm @@ -23,5 +23,5 @@ /mob/camera/canUseStorage() return FALSE -/mob/camera/emote(act, m_type = null, message = null, intentional = FALSE, forced = FALSE, targetted = FALSE) +/mob/camera/emote(act, m_type = null, message = null, intentional = FALSE, forced = FALSE, targetted = FALSE, custom_me = FALSE) return diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 1950304f9ba..5c307021fae 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -8,6 +8,7 @@ INITIALIZE_IMMEDIATE(/mob/dead) throwforce = 0 /mob/dead/Initialize() + SHOULD_CALL_PARENT(FALSE) if(flags_1 & INITIALIZED_1) stack_trace("Warning: [src]([type]) initialized multiple times!") flags_1 |= INITIALIZED_1 diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 8f010813500..a36a0d604ef 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -559,7 +559,7 @@ GLOBAL_LIST_INIT(roleplay_readme, world.file2list("strings/rt/rp_prompt.txt")) SSquirks.AssignQuirks(humanc, humanc.client, TRUE) if(humanc) var/fakekey = character.ckey - if(ckey in GLOB.anonymize) + if(character.ckey in GLOB.anonymize) fakekey = get_fake_key(character.ckey) GLOB.character_list[character.mobid] = "[fakekey] was [character.real_name] ([rank])
    " GLOB.character_ckey_list[character.real_name] = character.ckey diff --git a/code/modules/mob/dead/new_player/sprite_accessory/_sprite_accessory.dm b/code/modules/mob/dead/new_player/sprite_accessory/_sprite_accessory.dm index 39c56bf0ce7..4c09bb3eaf8 100644 --- a/code/modules/mob/dead/new_player/sprite_accessory/_sprite_accessory.dm +++ b/code/modules/mob/dead/new_player/sprite_accessory/_sprite_accessory.dm @@ -193,7 +193,7 @@ /datum/sprite_accessory/proc/get_icon_state(obj/item/organ/organ, obj/item/bodypart/bodypart, mob/living/carbon/owner) return icon_state -/datum/sprite_accessory/proc/get_default_colors(var/key_source_list) +/datum/sprite_accessory/proc/get_default_colors(key_source_list) var/list/color_list = list() for(var/i in 1 to color_keys) var/color diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index 3edd8e3427e..5eb20b8dfa8 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -11,4 +11,4 @@ /mob/proc/death(gibbed) SEND_SIGNAL(src, COMSIG_MOB_DEATH, gibbed) - SEND_GLOBAL_SIGNAL(COMSIG_GLOB_MOB_DEATH, src , gibbed) \ No newline at end of file + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_MOB_DEATH, src , gibbed) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index e75f767d6d5..94f85c6d92d 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -287,8 +287,8 @@ /mob/proc/dropItemToGround(obj/item/I, force = FALSE, silent = TRUE) . = doUnEquip(I, force, drop_location(), FALSE, silent = silent) if(. && I) //ensure the item exists and that it was dropped properly. - I.pixel_x = initial(I.pixel_x) += rand(-6,6) - I.pixel_y = initial(I.pixel_x) += rand(-6,6) + I.pixel_x = initial(I.pixel_x) + rand(-6,6) + I.pixel_y = initial(I.pixel_x) + rand(-6,6) //for when the item will be immediately placed in a loc other than the ground /mob/proc/transferItemToLoc(obj/item/I, newloc = null, force = FALSE, silent = TRUE) diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm index 914a2e22720..ab2a10bc3bf 100644 --- a/code/modules/mob/living/bloodcrawl.dm +++ b/code/modules/mob/living/bloodcrawl.dm @@ -93,12 +93,7 @@ /mob/living/proc/bloodcrawl_consume(mob/living/victim) to_chat(src, span_danger("I begin to feast on [victim]... You can not move while you are doing this.")) - var/sound - if(istype(src, /mob/living/simple_animal/slaughter)) - var/mob/living/simple_animal/slaughter/SD = src - sound = SD.feast_sound - else - sound = 'sound/blank.ogg' + var/sound = 'sound/blank.ogg' for(var/i in 1 to 3) playsound(get_turf(src),sound, 50, TRUE) diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index ffbc50e9560..7d131d122b0 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -43,7 +43,7 @@ to_chat(user, span_warning("There's already a brain in the MMI!")) return if(!newbrain.brainmob) - to_chat(user, span_warning("I aren't sure where this brain came from, but you're pretty sure it's a useless brain!")) + to_chat(user, span_warning("I'm not sure where this brain came from, but you're pretty sure it's a useless brain!")) return if(!user.transferItemToLoc(O, src)) diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm deleted file mode 100644 index a519b575e68..00000000000 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ /dev/null @@ -1,150 +0,0 @@ -/mob/living/carbon/alien - name = "alien" - icon = 'icons/mob/alien.dmi' - gender = FEMALE //All xenos are girls!! - dna = null - faction = list(ROLE_ALIEN) - ventcrawler = VENTCRAWLER_ALWAYS - sight = SEE_MOBS - see_in_dark = 4 - verb_say = "hisses" - initial_language_holder = /datum/language_holder/alien - bubble_icon = "alien" - type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno - - var/obj/item/card/id/wear_ring = null // Fix for station bounced radios -- Skie - var/has_fine_manipulation = 0 - var/move_delay_add = 0 // movement delay to add - - status_flags = CANUNCONSCIOUS|CANPUSH - - var/heat_protection = 0.5 - var/leaping = 0 - gib_type = /obj/effect/decal/cleanable/xenoblood/xgibs - unique_name = 1 - - var/static/regex/alien_name_regex = new("alien (larva|sentinel|drone|hunter|praetorian|queen)( \\(\\d+\\))?") - -/mob/living/carbon/alien/Initialize() - verbs += /mob/living/proc/mob_sleep - verbs += /mob/living/proc/lay_down - - create_bodyparts() //initialize bodyparts - - create_internal_organs() - - . = ..() - -/mob/living/carbon/alien/create_internal_organs() - internal_organs += new /obj/item/organ/brain/alien - internal_organs += new /obj/item/organ/alien/hivenode - internal_organs += new /obj/item/organ/tongue/alien - internal_organs += new /obj/item/organ/eyes/night_vision/alien - internal_organs += new /obj/item/organ/liver/alien - internal_organs += new /obj/item/organ/ears - ..() - -/mob/living/carbon/alien/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) // beepsky won't hunt aliums - return -10 - -/mob/living/carbon/alien/handle_environment(datum/gas_mixture/environment) - if(!environment) - return - - var/loc_temp = get_temperature(environment) - - // Aliens are now weak to fire. - - //After then, it reacts to the surrounding atmosphere based on your thermal protection - if(!on_fire) // If you're on fire, ignore local air temperature - if(loc_temp > bodytemperature) - //Place is hotter than we are - var/thermal_protection = heat_protection //This returns a 0 - 1 value, which corresponds to the percentage of heat protection. - if(thermal_protection < 1) - adjust_bodytemperature((1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR)) - else - adjust_bodytemperature(1 * ((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR)) - - if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT) - //Body temperature is too hot. - throw_alert("alien_fire", /atom/movable/screen/alert/alien_fire) - switch(bodytemperature) - if(360 to 400) - apply_damage(HEAT_DAMAGE_LEVEL_1, BURN) - if(400 to 460) - apply_damage(HEAT_DAMAGE_LEVEL_2, BURN) - if(460 to INFINITY) - if(on_fire) - apply_damage(HEAT_DAMAGE_LEVEL_3, BURN) - else - apply_damage(HEAT_DAMAGE_LEVEL_2, BURN) - else - clear_alert("alien_fire") - -/mob/living/carbon/alien/reagent_check(datum/reagent/R) //can metabolize all reagents - return 0 - -/mob/living/carbon/alien/IsAdvancedToolUser() - return has_fine_manipulation - -/mob/living/carbon/alien/Stat() - ..() - - if(statpanel("Status")) - stat(null, "Intent: [a_intent]") - -/mob/living/carbon/alien/getTrail() - if(getBruteLoss() < 200) - return pick (list("xltrails_1", "xltrails2")) - else - return pick (list("xttrails_1", "xttrails2")) -/*---------------------------------------- -Proc: AddInfectionImages() -Des: Gives the client of the alien an image on each infected mob. -----------------------------------------*/ -/mob/living/carbon/alien/proc/AddInfectionImages() - if (client) - for (var/i in GLOB.mob_living_list) - var/mob/living/L = i - if(HAS_TRAIT(L, TRAIT_XENO_HOST)) - var/obj/item/organ/body_egg/alien_embryo/A = L.getorgan(/obj/item/organ/body_egg/alien_embryo) - if(A) - var/I = image('icons/mob/alien.dmi', loc = L, icon_state = "infected[A.stage]") - client.images += I - return - - -/*---------------------------------------- -Proc: RemoveInfectionImages() -Des: Removes all infected images from the alien. -----------------------------------------*/ -/mob/living/carbon/alien/proc/RemoveInfectionImages() - if (client) - for(var/image/I in client.images) - if(dd_hasprefix_case(I.icon_state, "infected")) - qdel(I) - return - -/mob/living/carbon/alien/canBeHandcuffed() - return 1 - -/mob/living/carbon/alien/get_standard_pixel_y_offset(lying = 0) - return initial(pixel_y) - -/mob/living/carbon/alien/proc/alien_evolve(mob/living/carbon/alien/new_xeno) - to_chat(src, span_noticealien("I begin to evolve!")) - visible_message(span_alertalien("[src] begins to twist and contort!")) - new_xeno.setDir(dir) - if(!alien_name_regex.Find(name)) - new_xeno.name = name - new_xeno.real_name = real_name - if(mind) - mind.transfer_to(new_xeno) - var/datum/component/nanites/nanites = GetComponent(/datum/component/nanites) - if(nanites) - new_xeno.AddComponent(/datum/component/nanites, nanites.nanite_volume) - SEND_SIGNAL(new_xeno, COMSIG_NANITE_SYNC, nanites) - qdel(src) - -/mob/living/carbon/alien/can_hold_items() - return has_fine_manipulation diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm deleted file mode 100644 index c1efb53f33e..00000000000 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ /dev/null @@ -1,129 +0,0 @@ - -/mob/living/carbon/alien/get_eye_protection() - return ..() + 2 //potential cyber implants + natural eye protection - -/mob/living/carbon/alien/get_ear_protection() - return 2 //no ears - -/mob/living/carbon/alien/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum, d_type = "blunt") - ..(AM, skipcatch = TRUE, hitpush = FALSE) - - -/*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other. -As such, they can either help or harm other aliens. Help works like the human help command while harm is a simple nibble. -In all, this is a lot like the monkey code. /N -*/ -/mob/living/carbon/alien/attack_alien(mob/living/carbon/alien/M) - if(isturf(loc) && istype(loc.loc, /area/start)) - to_chat(M, "No attacking people at spawn, you jackass.") - return - - switch(M.used_intent.type) - - if (INTENT_HELP) - set_resting(FALSE) - AdjustStun(-60) - AdjustKnockdown(-60) - AdjustImmobilized(-60) - AdjustParalyzed(-60) - AdjustUnconscious(-60) - AdjustSleeping(-100) - visible_message(span_notice("[M.name] nuzzles [src] trying to wake [p_them()] up!")) - - if (INTENT_GRAB) - grabbedby(M) - - else - if(health > 0) - M.do_attack_animation(src, ATTACK_EFFECT_BITE) - playsound(loc, 'sound/blank.ogg', 50, TRUE, -1) - visible_message(span_danger("[M.name] bites [src]!"), \ - span_danger("[M.name] bites you!"), span_hear("I hear a chomp!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I bite [src]!")) - adjustBruteLoss(1) - log_combat(M, src, "attacked") - updatehealth() - else - to_chat(M, span_warning("[name] is too injured for that.")) - - -/mob/living/carbon/alien/attack_larva(mob/living/carbon/alien/larva/L) - return attack_alien(L) - - -/mob/living/carbon/alien/attack_hand(mob/living/carbon/human/M) - if(..()) //to allow surgery to return properly. - return 0 - - switch(M.used_intent.type) - if(INTENT_HELP) - help_shake_act(M) - if(INTENT_GRAB) - grabbedby(M) - if (INTENT_HARM) - M.do_attack_animation(src, ATTACK_EFFECT_PUNCH) - return 1 - if(INTENT_DISARM) - M.do_attack_animation(src, ATTACK_EFFECT_DISARM) - return 1 - return 0 - - -/mob/living/carbon/alien/attack_paw(mob/living/carbon/monkey/M) - if(..()) - if (stat != DEAD) - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) - apply_damage(rand(1, 3), BRUTE, affecting) - - -/mob/living/carbon/alien/attack_animal(mob/living/simple_animal/M) - . = ..() - if(.) - var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - switch(M.melee_damage_type) - if(BRUTE) - adjustBruteLoss(damage) - if(BURN) - adjustFireLoss(damage) - if(TOX) - adjustToxLoss(damage) - if(OXY) - adjustOxyLoss(damage) - if(CLONE) - adjustCloneLoss(damage) - if(STAMINA) - adjustStaminaLoss(damage) - -/mob/living/carbon/alien/attack_slime(mob/living/simple_animal/slime/M) - if(..()) //successful slime attack - var/damage = rand(5, 35) - if(M.is_adult) - damage = rand(10, 40) - adjustBruteLoss(damage) - log_combat(M, src, "attacked") - updatehealth() - -/mob/living/carbon/alien/ex_act(severity, target, origin) - if(origin && istype(origin, /datum/spacevine_mutation) && isvineimmune(src)) - return - ..() - switch (severity) - if (EXPLODE_DEVASTATE) - gib() - return - - if (EXPLODE_HEAVY) - take_overall_damage(60, 60) - adjustEarDamage(30,120) - - if(EXPLODE_LIGHT) - take_overall_damage(30,0) - if(prob(50)) - Unconscious(20) - adjustEarDamage(15,60) - -/mob/living/carbon/alien/soundbang_act(intensity = 1, stun_pwr = 20, damage_pwr = 5, deafen_pwr = 15) - return 0 - -/mob/living/carbon/alien/acid_act(acidpwr, acid_volume) - return 0//aliens are immune to acid. diff --git a/code/modules/mob/living/carbon/alien/damage_procs.dm b/code/modules/mob/living/carbon/alien/damage_procs.dm deleted file mode 100644 index 452b162da21..00000000000 --- a/code/modules/mob/living/carbon/alien/damage_procs.dm +++ /dev/null @@ -1,13 +0,0 @@ - -/mob/living/carbon/alien/getToxLoss() - return 0 - -/mob/living/carbon/alien/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE) //alien immune to tox damage - return FALSE - -//aliens are immune to stamina damage. -/mob/living/carbon/alien/adjustStaminaLoss(amount, updating_health = 1, forced = FALSE) - return - -/mob/living/carbon/alien/setStaminaLoss(amount, updating_health = 1) - return diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm deleted file mode 100644 index 718186c9078..00000000000 --- a/code/modules/mob/living/carbon/alien/death.dm +++ /dev/null @@ -1,14 +0,0 @@ -/mob/living/carbon/alien/spawn_gibs(with_bodyparts) - if(with_bodyparts) - new /obj/effect/gibspawner/xeno(drop_location(), src) - else - new /obj/effect/gibspawner/xeno/bodypartless(drop_location(), src) - -/mob/living/carbon/alien/gib_animation() - new /obj/effect/temp_visual/gib_animation(loc, "gibbed-a") - -/mob/living/carbon/alien/spawn_dust() - new /obj/effect/decal/remains/xeno(loc) - -/mob/living/carbon/alien/dust_animation() - new /obj/effect/temp_visual/dust_animation(loc, "dust-a") diff --git a/code/modules/mob/living/carbon/alien/emote.dm b/code/modules/mob/living/carbon/alien/emote.dm deleted file mode 100644 index 95bb95b04d7..00000000000 --- a/code/modules/mob/living/carbon/alien/emote.dm +++ /dev/null @@ -1,29 +0,0 @@ -/datum/emote/living/alien - mob_type_allowed_typecache = list(/mob/living/carbon/alien) - -/datum/emote/living/alien/gnarl - key = "gnarl" - key_third_person = "gnarls" - message = "gnarls and shows its teeth..." - -/datum/emote/living/alien/hiss - key = "hiss" - key_third_person = "hisses" - message_alien = "hisses." - message_larva = "hisses softly." - -/datum/emote/living/alien/hiss/get_sound(mob/living/user) - if(isalienadult(user)) - return "hiss" - -/datum/emote/living/alien/roar - key = "roar" - key_third_person = "roars" - message_alien = "roars." - message_larva = "softly roars." - emote_type = EMOTE_AUDIBLE - vary = TRUE - -/datum/emote/living/alien/roar/get_sound(mob/living/user) - if(isalienadult(user)) - return 'sound/blank.ogg' diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm deleted file mode 100644 index e3f428cd91c..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ /dev/null @@ -1,336 +0,0 @@ -/*NOTES: -These are general powers. Specific powers are stored under the appropriate alien creature type. -*/ - -/*Alien spit now works like a taser shot. It won't home in on the target but will act the same once it does hit. -Doesn't work on other aliens/AI.*/ - - -/obj/effect/proc_holder/alien - name = "Alien Power" - panel = "Alien" - var/plasma_cost = 0 - var/check_turf = FALSE - has_action = TRUE - base_action = /datum/action/spell_action/alien - action_icon = 'icons/mob/actions/actions_xeno.dmi' - action_icon_state = "spell_default" - action_background_icon_state = "bg_alien" - -/obj/effect/proc_holder/alien/Initialize() - . = ..() - action = new(src) - -/obj/effect/proc_holder/alien/Click() - if(!iscarbon(usr)) - return 1 - var/mob/living/carbon/user = usr - if(cost_check(check_turf,user)) - if(fire(user) && user) // Second check to prevent runtimes when evolving - user.adjustPlasma(-plasma_cost) - return 1 - -/obj/effect/proc_holder/alien/on_gain(mob/living/carbon/user) - return - -/obj/effect/proc_holder/alien/on_lose(mob/living/carbon/user) - return - -/obj/effect/proc_holder/alien/fire(mob/living/carbon/user) - return 1 - -/obj/effect/proc_holder/alien/get_panel_text() - . = ..() - if(plasma_cost > 0) - return "[plasma_cost]" - -/obj/effect/proc_holder/alien/proc/cost_check(check_turf = FALSE, mob/living/carbon/user, silent = FALSE) - if(user.stat) - if(!silent) - to_chat(user, span_noticealien("I must be conscious to do this.")) - return FALSE - if(user.getPlasma() < plasma_cost) - if(!silent) - to_chat(user, span_noticealien("Not enough plasma stored.")) - return FALSE - if(check_turf && (!isturf(user.loc) || isspaceturf(user.loc))) - if(!silent) - to_chat(user, span_noticealien("Bad place for a garden!")) - return FALSE - return TRUE - -/obj/effect/proc_holder/alien/proc/check_vent_block(mob/living/user) - var/obj/machinery/atmospherics/components/unary/atmos_thing = locate() in user.loc - if(atmos_thing) - var/rusure = alert(user, "Laying eggs and shaping resin here would block access to [atmos_thing]. Do you want to continue?", "Blocking Atmospheric Component", "Yes", "No") - if(rusure != "Yes") - return FALSE - return TRUE - -/obj/effect/proc_holder/alien/plant - name = "Plant Weeds" - desc = "" - plasma_cost = 50 - check_turf = TRUE - action_icon_state = "alien_plant" - -/obj/effect/proc_holder/alien/plant/fire(mob/living/carbon/user) - if(locate(/obj/structure/alien/weeds/node) in get_turf(user)) - to_chat(user, span_warning("There's already a weed node here!")) - return 0 - user.visible_message(span_alertalien("[user] has planted some alien weeds!")) - new/obj/structure/alien/weeds/node(user.loc) - return 1 - -/obj/effect/proc_holder/alien/whisper - name = "Whisper" - desc = "" - plasma_cost = 10 - action_icon_state = "alien_whisper" - -/obj/effect/proc_holder/alien/whisper/fire(mob/living/carbon/user) - var/list/options = list() - for(var/mob/living/Ms in oview(user)) - options += Ms - var/mob/living/M = input("Select who to whisper to:","Whisper to?",null) as null|mob in sortNames(options) - if(!M) - return 0 - if(M.anti_magic_check(FALSE, FALSE, TRUE, 0)) - to_chat(user, span_noticealien("As you try to communicate with [M], you're suddenly stopped by a vision of a massive tinfoil wall that streches beyond visible range. It seems you've been foiled.")) - return FALSE - var/msg = sanitize(input("Message:", "Alien Whisper") as text|null) - if(msg) - if(M.anti_magic_check(FALSE, FALSE, TRUE, 0)) - to_chat(user, span_notice("As you try to communicate with [M], you're suddenly stopped by a vision of a massive tinfoil wall that streches beyond visible range. It seems you've been foiled.")) - return - log_directed_talk(user, M, msg, LOG_SAY, tag="alien whisper") - to_chat(M, "I hear a strange, alien voice in your head...[msg]") - to_chat(user, span_noticealien("I said: \"[msg]\" to [M]")) - for(var/ded in GLOB.dead_mob_list) - if(!isobserver(ded)) - continue - var/follow_link_user = FOLLOW_LINK(ded, user) - var/follow_link_whispee = FOLLOW_LINK(ded, M) - to_chat(ded, "[follow_link_user] [user] Alien Whisper --> [follow_link_whispee] [M] [msg]") - else - return 0 - return 1 - -/obj/effect/proc_holder/alien/transfer - name = "Transfer Plasma" - desc = "" - plasma_cost = 0 - action_icon_state = "alien_transfer" - -/obj/effect/proc_holder/alien/transfer/fire(mob/living/carbon/user) - var/list/mob/living/carbon/aliens_around = list() - for(var/mob/living/carbon/A in oview(user)) - if(A.getorgan(/obj/item/organ/alien/plasmavessel)) - aliens_around.Add(A) - var/mob/living/carbon/M = input("Select who to transfer to:","Transfer plasma to?",null) as mob in sortNames(aliens_around) - if(!M) - return 0 - var/amount = input("Amount:", "Transfer Plasma to [M]") as num|null - if (amount) - amount = min(abs(round(amount)), user.getPlasma()) - if (get_dist(user,M) <= 1) - M.adjustPlasma(amount) - user.adjustPlasma(-amount) - to_chat(M, span_noticealien("[user] has transferred [amount] plasma to you.")) - to_chat(user, span_noticealien("I transfer [amount] plasma to [M].")) - else - to_chat(user, span_noticealien("I need to be closer!")) - return - -/obj/effect/proc_holder/alien/acid - name = "Corrosive Acid" - desc = "" - plasma_cost = 200 - action_icon_state = "alien_acid" - -/obj/effect/proc_holder/alien/acid/on_gain(mob/living/carbon/user) - user.verbs.Add(/mob/living/carbon/proc/corrosive_acid) - -/obj/effect/proc_holder/alien/acid/on_lose(mob/living/carbon/user) - user.verbs.Remove(/mob/living/carbon/proc/corrosive_acid) - -/obj/effect/proc_holder/alien/acid/proc/corrode(atom/target,mob/living/carbon/user = usr) - if(target in oview(1,user)) - if(target.acid_act(200, 100)) - user.visible_message(span_alertalien("[user] vomits globs of vile stuff all over [target]. It begins to sizzle and melt under the bubbling mess of acid!")) - return 1 - else - to_chat(user, span_noticealien("I cannot dissolve this object.")) - - - return 0 - else - to_chat(src, span_noticealien("[target] is too far away.")) - return 0 - - -/obj/effect/proc_holder/alien/acid/fire(mob/living/carbon/alien/user) - var/O = input("Select what to dissolve:","Dissolve",null) as obj|turf in oview(1,user) - if(!O || user.incapacitated()) - return 0 - else - return corrode(O,user) - -/mob/living/carbon/proc/corrosive_acid(O as obj|turf in oview(1)) // right click menu verb ugh - set name = "Corrosive Acid" - - if(!iscarbon(usr)) - return - var/mob/living/carbon/user = usr - var/obj/effect/proc_holder/alien/acid/A = locate() in user.abilities - if(!A) - return - if(user.getPlasma() > A.plasma_cost && A.corrode(O)) - user.adjustPlasma(-A.plasma_cost) - -/obj/effect/proc_holder/alien/neurotoxin - name = "Spit Neurotoxin" - desc = "" - action_icon_state = "alien_neurotoxin_0" - active = FALSE - -/obj/effect/proc_holder/alien/neurotoxin/fire(mob/living/carbon/user) - var/message - if(active) - message = span_notice("I empty your neurotoxin gland.") - remove_ranged_ability(message) - else - message = span_notice("I prepare your neurotoxin gland. Left-click to fire at a target!") - add_ranged_ability(user, message, TRUE) - -/obj/effect/proc_holder/alien/neurotoxin/update_icon() - action.button_icon_state = "alien_neurotoxin_[active]" - action.UpdateButtonIcon() - -/obj/effect/proc_holder/alien/neurotoxin/InterceptClickOn(mob/living/caller, params, atom/target) - if(..()) - return - var/p_cost = 50 - if(!iscarbon(ranged_ability_user) || ranged_ability_user.stat) - remove_ranged_ability() - return - - var/mob/living/carbon/user = ranged_ability_user - - if(user.getPlasma() < p_cost) - to_chat(user, span_warning("I need at least [p_cost] plasma to spit.")) - remove_ranged_ability() - return - - var/turf/T = user.loc - var/turf/U = get_step(user, user.dir) // Get the tile infront of the move, based on their direction - if(!isturf(U) || !isturf(T)) - return FALSE - - user.visible_message(span_danger("[user] spits neurotoxin!"), span_alertalien("I spit neurotoxin.")) - var/obj/projectile/bullet/neurotoxin/A = new /obj/projectile/bullet/neurotoxin(user.loc) - A.preparePixelProjectile(target, user, params) - A.fire() - user.newtonian_move(get_dir(U, T)) - user.adjustPlasma(-p_cost) - - return TRUE - -/obj/effect/proc_holder/alien/neurotoxin/on_lose(mob/living/carbon/user) - remove_ranged_ability() - -/obj/effect/proc_holder/alien/neurotoxin/add_ranged_ability(mob/living/user,msg,forced) - ..() - if(isalienadult(user)) - var/mob/living/carbon/alien/humanoid/A = user - A.drooling = 1 - A.update_icons() - -/obj/effect/proc_holder/alien/neurotoxin/remove_ranged_ability(msg) - if(isalienadult(ranged_ability_user)) - var/mob/living/carbon/alien/humanoid/A = ranged_ability_user - A.drooling = 0 - A.update_icons() - ..() - -/obj/effect/proc_holder/alien/resin - name = "Secrete Resin" - desc = "" - plasma_cost = 55 - check_turf = TRUE - var/list/structures = list( - "resin wall" = /obj/structure/alien/resin/wall, - "resin membrane" = /obj/structure/alien/resin/membrane, - "resin nest" = /obj/structure/bed/nest) - - action_icon_state = "alien_resin" - -/obj/effect/proc_holder/alien/resin/fire(mob/living/carbon/user) - if(locate(/obj/structure/alien/resin) in user.loc) - to_chat(user, span_warning("There is already a resin structure there!")) - return FALSE - - if(!check_vent_block(user)) - return FALSE - - var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in structures - if(!choice) - return FALSE - if (!cost_check(check_turf,user)) - return FALSE - to_chat(user, span_notice("I shape a [choice].")) - user.visible_message(span_notice("[user] vomits up a thick purple substance and begins to shape it.")) - - choice = structures[choice] - new choice(user.loc) - return TRUE - -/obj/effect/proc_holder/alien/sneak - name = "Sneak" - desc = "" - active = 0 - - action_icon_state = "alien_sneak" - -/obj/effect/proc_holder/alien/sneak/fire(mob/living/carbon/alien/humanoid/user) - if(!active) - user.alpha = 75 //Still easy to see in lit areas with bright tiles, almost invisible on resin. - user.sneaking = 1 - active = 1 - to_chat(user, span_noticealien("I blend into the shadows...")) - else - user.alpha = initial(user.alpha) - user.sneaking = 0 - active = 0 - to_chat(user, span_noticealien("I reveal yourself!")) - - -/mob/living/carbon/proc/getPlasma() - var/obj/item/organ/alien/plasmavessel/vessel = getorgan(/obj/item/organ/alien/plasmavessel) - if(!vessel) - return 0 - return vessel.storedPlasma - - -/mob/living/carbon/proc/adjustPlasma(amount) - var/obj/item/organ/alien/plasmavessel/vessel = getorgan(/obj/item/organ/alien/plasmavessel) - if(!vessel) - return 0 - vessel.storedPlasma = max(vessel.storedPlasma + amount,0) - vessel.storedPlasma = min(vessel.storedPlasma, vessel.max_plasma) //upper limit of max_plasma, lower limit of 0 - for(var/X in abilities) - var/obj/effect/proc_holder/alien/APH = X - if(APH.has_action) - APH.action.UpdateButtonIcon() - return 1 - -/mob/living/carbon/alien/adjustPlasma(amount) - . = ..() - updatePlasmaDisplay() - -/mob/living/carbon/proc/usePlasma(amount) - if(getPlasma() >= amount) - adjustPlasma(-amount) - return 1 - - return 0 diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm deleted file mode 100644 index 65d4ff1c881..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm +++ /dev/null @@ -1,43 +0,0 @@ -/mob/living/carbon/alien/humanoid/drone - name = "alien drone" - caste = "d" - maxHealth = 125 - health = 125 - icon_state = "aliend" - -/mob/living/carbon/alien/humanoid/drone/Initialize() - AddAbility(new/obj/effect/proc_holder/alien/evolve(null)) - . = ..() - -/mob/living/carbon/alien/humanoid/drone/create_internal_organs() - internal_organs += new /obj/item/organ/alien/plasmavessel/large - internal_organs += new /obj/item/organ/alien/resinspinner - internal_organs += new /obj/item/organ/alien/acid - ..() - -/obj/effect/proc_holder/alien/evolve - name = "Evolve to Praetorian" - desc = "" - plasma_cost = 500 - - action_icon_state = "alien_evolve_drone" - -/obj/effect/proc_holder/alien/evolve/fire(mob/living/carbon/alien/humanoid/user) - var/obj/item/organ/alien/hivenode/node = user.getorgan(/obj/item/organ/alien/hivenode) - if(!node) //Players are Murphy's Law. We may not expect there to ever be a living xeno with no hivenode, but they _WILL_ make it happen. - to_chat(user, span_danger("Without the hivemind, you can't possibly hold the responsibility of leadership!")) - return 0 - if(node.recent_queen_death) - to_chat(user, span_danger("My thoughts are still too scattered to take up the position of leadership.")) - return 0 - - if(!isturf(user.loc)) - to_chat(user, span_warning("I can't evolve here!")) - return 0 - if(!get_alien_type(/mob/living/carbon/alien/humanoid/royal)) - var/mob/living/carbon/alien/humanoid/royal/praetorian/new_xeno = new (user.loc) - user.alien_evolve(new_xeno) - return 1 - else - to_chat(user, span_warning("We already have a living royal!")) - return 0 diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm deleted file mode 100644 index 7d857e83eee..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ /dev/null @@ -1,95 +0,0 @@ -/mob/living/carbon/alien/humanoid/hunter - name = "alien hunter" - caste = "h" - maxHealth = 125 - health = 125 - icon_state = "alienh" - var/atom/movable/screen/leap_icon = null - -/mob/living/carbon/alien/humanoid/hunter/create_internal_organs() - internal_organs += new /obj/item/organ/alien/plasmavessel/small - ..() - -//Hunter verbs - -/mob/living/carbon/alien/humanoid/hunter/proc/toggle_leap(message = 1) - leap_on_click = !leap_on_click - leap_icon.icon_state = "leap_[leap_on_click ? "on":"off"]" - update_icons() - if(message) - to_chat(src, span_noticealien("I will now [leap_on_click ? "leap at":"slash at"] enemies!")) - else - return - -/mob/living/carbon/alien/humanoid/hunter/ClickOn(atom/A, params) - face_atom(A) - if(leap_on_click) - leap_at(A) - else - ..() - -#define MAX_ALIEN_LEAP_DIST 7 - -/mob/living/carbon/alien/humanoid/hunter/proc/leap_at(atom/A) - if((mobility_flags & (MOBILITY_MOVE | MOBILITY_STAND)) != (MOBILITY_MOVE | MOBILITY_STAND) || leaping) - return - - if(pounce_cooldown > world.time) - to_chat(src, span_alertalien("I are too fatigued to pounce right now!")) - return - - if(!has_gravity() || !A.has_gravity()) - to_chat(src, span_alertalien("It is unsafe to leap without gravity!")) - //It's also extremely buggy visually, so it's balance+bugfix - return - - else //Maybe uses plasma in the future, although that wouldn't make any sense... - leaping = 1 - weather_immunities += "lava" - update_icons() - throw_at(A, MAX_ALIEN_LEAP_DIST, 1, src, FALSE, TRUE, callback = CALLBACK(src, PROC_REF(leap_end))) - -/mob/living/carbon/alien/humanoid/hunter/proc/leap_end() - leaping = 0 - weather_immunities -= "lava" - update_icons() - -/mob/living/carbon/alien/humanoid/hunter/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - - if(!leaping) - return ..() - - pounce_cooldown = world.time + pounce_cooldown_time - if(hit_atom) - if(isliving(hit_atom)) - var/mob/living/L = hit_atom - var/blocked = FALSE - if(ishuman(hit_atom)) - var/mob/living/carbon/human/H = hit_atom - if(H.check_shields(src, 0, "the [name]", attack_type = LEAP_ATTACK)) - blocked = TRUE - if(!blocked) - L.visible_message(span_danger("[src] pounces on [L]!"), span_danger("[src] pounces on you!")) - L.Paralyze(100) - sleep(2)//Runtime prevention (infinite bump() calls on hulks) - step_towards(src,L) - else - Paralyze(40, 1, 1) - - toggle_leap(0) - else if(hit_atom.density && !hit_atom.CanPass(src)) - visible_message(span_danger("[src] smashes into [hit_atom]!"), span_alertalien("[src] smashes into [hit_atom]!")) - Paralyze(40, 1, 1) - - if(leaping) - leaping = FALSE - update_icons() - update_mobility() - - -/mob/living/carbon/alien/humanoid/float(on) - if(leaping) - return - ..() - - diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm deleted file mode 100644 index eedcbc6b3f0..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm +++ /dev/null @@ -1,42 +0,0 @@ -/mob/living/carbon/alien/humanoid/royal/praetorian - name = "alien praetorian" - caste = "p" - maxHealth = 250 - health = 250 - icon_state = "alienp" - -/mob/living/carbon/alien/humanoid/royal/praetorian/Initialize() - real_name = name - AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/repulse/xeno(src)) - AddAbility(new /obj/effect/proc_holder/alien/royal/praetorian/evolve()) - . = ..() - -/mob/living/carbon/alien/humanoid/royal/praetorian/create_internal_organs() - internal_organs += new /obj/item/organ/alien/plasmavessel/large - internal_organs += new /obj/item/organ/alien/resinspinner - internal_organs += new /obj/item/organ/alien/acid - internal_organs += new /obj/item/organ/alien/neurotoxin - ..() - -/obj/effect/proc_holder/alien/royal/praetorian/evolve - name = "Evolve" - desc = "" - plasma_cost = 500 - - action_icon_state = "alien_evolve_praetorian" - -/obj/effect/proc_holder/alien/royal/praetorian/evolve/fire(mob/living/carbon/alien/humanoid/user) - var/obj/item/organ/alien/hivenode/node = user.getorgan(/obj/item/organ/alien/hivenode) - if(!node) //Just in case this particular Praetorian gets violated and kept by the RD as a replacement for Lamarr. - to_chat(user, span_warning("Without the hivemind, you would be unfit to rule as queen!")) - return 0 - if(node.recent_queen_death) - to_chat(user, span_warning("I are still too burdened with guilt to evolve into a queen.")) - return 0 - if(!get_alien_type(/mob/living/carbon/alien/humanoid/royal/queen)) - var/mob/living/carbon/alien/humanoid/royal/queen/new_xeno = new (user.loc) - user.alien_evolve(new_xeno) - return 1 - else - to_chat(user, span_warning("We already have an alive queen!")) - return 0 diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm deleted file mode 100644 index 7c6443cfae7..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm +++ /dev/null @@ -1,16 +0,0 @@ -/mob/living/carbon/alien/humanoid/sentinel - name = "alien sentinel" - caste = "s" - maxHealth = 150 - health = 150 - icon_state = "aliens" - -/mob/living/carbon/alien/humanoid/sentinel/Initialize() - AddAbility(new /obj/effect/proc_holder/alien/sneak) - . = ..() - -/mob/living/carbon/alien/humanoid/sentinel/create_internal_organs() - internal_organs += new /obj/item/organ/alien/plasmavessel - internal_organs += new /obj/item/organ/alien/acid - internal_organs += new /obj/item/organ/alien/neurotoxin - ..() diff --git a/code/modules/mob/living/carbon/alien/humanoid/death.dm b/code/modules/mob/living/carbon/alien/humanoid/death.dm deleted file mode 100644 index a70600b81ef..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/death.dm +++ /dev/null @@ -1,22 +0,0 @@ -/mob/living/carbon/alien/humanoid/death(gibbed) - if(stat == DEAD) - return - - . = ..() - - update_icons() - status_flags |= CANPUSH - -//When the alien queen dies, all others must pay the price for letting her die. -/mob/living/carbon/alien/humanoid/royal/queen/death(gibbed) - if(stat == DEAD) - return - - for(var/mob/living/carbon/C in GLOB.alive_mob_list) - if(C == src) //Make sure not to proc it on ourselves. - continue - var/obj/item/organ/alien/hivenode/node = C.getorgan(/obj/item/organ/alien/hivenode) - if(istype(node)) // just in case someone would ever add a diffirent node to hivenode slot - node.queen_death() - - return ..() diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm deleted file mode 100644 index 5ad9fcaac7d..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ /dev/null @@ -1,116 +0,0 @@ -/mob/living/carbon/alien/humanoid - name = "alien" - icon_state = "alien" - pass_flags = PASSTABLE - butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno = 5, /obj/item/stack/sheet/animalhide/xeno = 1) - base_intents = list(INTENT_HELP, INTENT_DISARM, INTENT_GRAB, INTENT_HARM) - limb_destroyer = 1 - hud_type = /datum/hud/human - var/obj/item/r_store = null - var/obj/item/l_store = null - var/caste = "" - var/alt_icon = 'icons/mob/alienleap.dmi' //used to switch between the two alien icon files. - var/leap_on_click = 0 - var/pounce_cooldown = 0 - var/pounce_cooldown_time = 30 - var/custom_pixel_x_offset = 0 //for admin fuckery. - var/custom_pixel_y_offset = 0 - var/sneaking = 0 //For sneaky-sneaky mode and appropriate slowdown - var/drooling = 0 //For Neruotoxic spit overlays - deathsound = 'sound/blank.ogg' - bodyparts = list(/obj/item/bodypart/chest/alien, /obj/item/bodypart/head/alien, /obj/item/bodypart/l_arm/alien, - /obj/item/bodypart/r_arm/alien, /obj/item/bodypart/r_leg/alien, /obj/item/bodypart/l_leg/alien) - -/mob/living/carbon/alien/humanoid/Initialize() - . = ..() - AddComponent(/datum/component/footstep, FOOTSTEP_MOB_CLAW, 0.5, -3) - -/mob/living/carbon/alien/humanoid/restrained(ignore_grab) - return handcuffed - -/mob/living/carbon/alien/humanoid/show_inv(mob/user) - user.set_machine(src) - var/list/dat = list() - dat += {" -


    - [name] -
    "} - for(var/i in 1 to held_items.len) - var/obj/item/I = get_item_for_held_index(i) - dat += "
    [get_held_index_name(i)]:[(I && !(I.item_flags & ABSTRACT)) ? I : "Empty"]" - dat += "
    Empty Pouches" - - if(handcuffed) - dat += "
    Handcuffed" - if(legcuffed) - dat += "
    Legcuffed" - - dat += {" -
    -
    Close - "} - user << browse(dat.Join(), "window=mob[REF(src)];size=325x500") - onclose(user, "mob[REF(src)]") - - -/mob/living/carbon/alien/humanoid/Topic(href, href_list) - //strip panel - if(href_list["pouches"] && usr.canUseTopic(src, BE_CLOSE, NO_DEXTERITY)) - visible_message(span_danger("[usr] tries to empty [src]'s pouches."), \ - span_danger("[usr] tries to empty your pouches.")) - if(do_mob(usr, src, POCKET_STRIP_DELAY * 0.5)) - dropItemToGround(r_store) - dropItemToGround(l_store) - - ..() - - -/mob/living/carbon/alien/humanoid/cuff_resist(obj/item/I) - playsound(src, 'sound/blank.ogg', 40, TRUE, TRUE) //Alien roars when starting to break free - ..(I, cuff_break = INSTANT_CUFFBREAK) - -/mob/living/carbon/alien/humanoid/resist_grab(moving_resist) - if(pulledby.grab_state) - visible_message(span_danger("[src] breaks free of [pulledby]'s grip!"), \ - span_danger("I break free of [pulledby]'s grip!")) - pulledby.stop_pulling() - . = 0 - -/mob/living/carbon/alien/humanoid/get_standard_pixel_y_offset(lying = 0) - if(leaping) - return -32 - else if(custom_pixel_y_offset) - return custom_pixel_y_offset - else - return initial(pixel_y) - -/mob/living/carbon/alien/humanoid/get_standard_pixel_x_offset(lying = 0) - if(leaping) - return -32 - else if(custom_pixel_x_offset) - return custom_pixel_x_offset - else - return initial(pixel_x) - -/mob/living/carbon/alien/humanoid/get_permeability_protection(list/target_zones) - return 0.8 - -/mob/living/carbon/alien/humanoid/alien_evolve(mob/living/carbon/alien/humanoid/new_xeno) - drop_all_held_items() - ..() - -//For alien evolution/promotion/queen finder procs. Checks for an active alien of that type -/proc/get_alien_type(alienpath) - for(var/mob/living/carbon/alien/humanoid/A in GLOB.alive_mob_list) - if(!istype(A, alienpath)) - continue - if(!A.key || A.stat == DEAD) //Only living aliens with a ckey are valid. - continue - return A - return FALSE - - -/mob/living/carbon/alien/humanoid/check_breath(datum/gas_mixture/breath) - if(breath && breath.total_moles() > 0 && !sneaking) - playsound(get_turf(src), pick('sound/blank.ogg'), 50, FALSE, -5) - ..() diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm deleted file mode 100644 index b3f345e7985..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm +++ /dev/null @@ -1,68 +0,0 @@ - - -/mob/living/carbon/alien/humanoid/attack_hulk(mob/living/carbon/human/user) - . = ..() - if(!.) - return - adjustBruteLoss(15) - var/hitverb = "hit" - if(mob_size < MOB_SIZE_LARGE) - safe_throw_at(get_edge_target_turf(src, get_dir(user, src)), 2, 1, user) - hitverb = "slam" - playsound(loc, "punch", 25, TRUE, -1) - visible_message(span_danger("[user] [hitverb]s [src]!"), \ - span_danger("[user] [hitverb]s you!"), span_hear("I hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, user) - to_chat(user, span_danger("I [hitverb] [src]!")) - -/mob/living/carbon/alien/humanoid/attack_hand(mob/living/carbon/human/M) - if(..()) - switch(M.used_intent.type) - if (INTENT_HARM) - var/damage = rand(1, 9) - if (prob(90)) - playsound(loc, "punch", 25, TRUE, -1) - visible_message(span_danger("[M] punches [src]!"), \ - span_danger("[M] punches you!"), span_hear("I hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I punch [src]!")) - if ((stat != DEAD) && (damage > 9 || prob(5)))//Regular humans have a very small chance of knocking an alien down. - Unconscious(40) - visible_message(span_danger("[M] knocks [src] down!"), \ - span_danger("[M] knocks you down!"), span_hear("I hear a sickening sound of flesh hitting flesh!"), null, M) - to_chat(M, span_danger("I knock [src] down!")) - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) - apply_damage(damage, BRUTE, affecting) - log_combat(M, src, "attacked") - else - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - visible_message(span_danger("[M]'s punch misses [src]!"), \ - span_danger("I avoid [M]'s punch!"), span_hear("I hear a swoosh!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_warning("My punch misses [src]!")) - - if (INTENT_DISARM) - if (!(mobility_flags & MOBILITY_STAND)) - if (prob(5)) - Unconscious(40) - playsound(loc, 'sound/blank.ogg', 50, TRUE, -1) - log_combat(M, src, "pushed") - visible_message(span_danger("[M] pushes [src] down!"), \ - span_danger("[M] pushes you down!"), span_hear("I hear aggressive shuffling followed by a loud thud!"), null, M) - to_chat(M, span_danger("I push [src] down!")) - else - if (prob(50)) - dropItemToGround(get_active_held_item(), silent = FALSE) - playsound(loc, 'sound/blank.ogg', 50, TRUE, -1) - visible_message(span_danger("[M] disarms [src]!"), \ - span_danger("[M] disarms you!"), span_hear("I hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I disarm [src]!")) - else - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - visible_message(span_danger("[M] fails to disarm [src]!"),\ - span_danger("[M] fails to disarm you!"), span_hear("I hear a swoosh!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_warning("I fail to disarm [src]!")) - - - -/mob/living/carbon/alien/humanoid/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect) - if(!no_effect && !visual_effect_icon) - visual_effect_icon = ATTACK_EFFECT_CLAW - ..() diff --git a/code/modules/mob/living/carbon/alien/humanoid/inventory.dm b/code/modules/mob/living/carbon/alien/humanoid/inventory.dm deleted file mode 100644 index 9628545b3cc..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/inventory.dm +++ /dev/null @@ -1,5 +0,0 @@ -/mob/living/carbon/alien/humanoid/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE) - . = ..() - if(!. || !I) - return - diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm deleted file mode 100644 index fd6a73ae7bf..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ /dev/null @@ -1,18 +0,0 @@ - - -/mob/living/carbon/alien/humanoid/proc/adjust_body_temperature(current, loc_temp, boost) - var/temperature = current - var/difference = abs(current-loc_temp) //get difference - var/increments// = difference/10 //find how many increments apart they are - if(difference > 50) - increments = difference/5 - else - increments = difference/10 - var/change = increments*boost // Get the amount to change by (x per increment) - var/temp_change - if(current < loc_temp) - temperature = min(loc_temp, temperature+change) - else if(current > loc_temp) - temperature = max(loc_temp, temperature-change) - temp_change = (temperature - current) - return temp_change diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm deleted file mode 100644 index d4bcc8febaa..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ /dev/null @@ -1,139 +0,0 @@ -/mob/living/carbon/alien/humanoid/royal - //Common stuffs for Praetorian and Queen - icon = 'icons/mob/alienqueen.dmi' - status_flags = 0 - ventcrawler = VENTCRAWLER_NONE //pull over that ass too fat - unique_name = 0 - pixel_x = -16 - bubble_icon = "alienroyal" - mob_size = MOB_SIZE_LARGE - layer = LARGE_MOB_LAYER //above most mobs, but below speechbubbles - pressure_resistance = 200 //Because big, stompy xenos should not be blown around like paper. - butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno = 20, /obj/item/stack/sheet/animalhide/xeno = 3) - - var/alt_inhands_file = 'icons/mob/alienqueen.dmi' - -/mob/living/carbon/alien/humanoid/royal/can_inject() - return 0 - -/mob/living/carbon/alien/humanoid/royal/queen - name = "alien queen" - caste = "q" - maxHealth = 400 - health = 400 - icon_state = "alienq" - var/datum/action/small_sprite/smallsprite = new/datum/action/small_sprite/queen() - -/mob/living/carbon/alien/humanoid/royal/queen/Initialize() - //there should only be one queen - for(var/mob/living/carbon/alien/humanoid/royal/queen/Q in GLOB.carbon_list) - if(Q == src) - continue - if(Q.stat == DEAD) - continue - if(Q.client) - name = "alien princess ([rand(1, 999)])" //if this is too cutesy feel free to change it/remove it. - break - - real_name = src.name - - AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/repulse/xeno(src)) - AddAbility(new/obj/effect/proc_holder/alien/royal/queen/promote()) - smallsprite.Grant(src) - return ..() - -/mob/living/carbon/alien/humanoid/royal/queen/create_internal_organs() - internal_organs += new /obj/item/organ/alien/plasmavessel/large/queen - internal_organs += new /obj/item/organ/alien/resinspinner - internal_organs += new /obj/item/organ/alien/acid - internal_organs += new /obj/item/organ/alien/neurotoxin - internal_organs += new /obj/item/organ/alien/eggsac - ..() - -//Queen verbs -/obj/effect/proc_holder/alien/lay_egg - name = "Lay Egg" - desc = "" - plasma_cost = 75 - check_turf = TRUE - action_icon_state = "alien_egg" - -/obj/effect/proc_holder/alien/lay_egg/fire(mob/living/carbon/user) - if(!check_vent_block(user)) - return FALSE - - if(locate(/obj/structure/alien/egg) in get_turf(user)) - to_chat(user, span_alertalien("There's already an egg here.")) - return FALSE - - user.visible_message(span_alertalien("[user] has laid an egg!")) - new /obj/structure/alien/egg(user.loc) - return TRUE - -//Button to let queen choose her praetorian. -/obj/effect/proc_holder/alien/royal/queen/promote - name = "Create Royal Parasite" - desc = "" - plasma_cost = 500 //Plasma cost used on promotion, not spawning the parasite. - - action_icon_state = "alien_queen_promote" - - - -/obj/effect/proc_holder/alien/royal/queen/promote/fire(mob/living/carbon/alien/user) - var/obj/item/queenpromote/prom - if(get_alien_type(/mob/living/carbon/alien/humanoid/royal/praetorian/)) - to_chat(user, span_noticealien("I already have a Praetorian!")) - return 0 - else - for(prom in user) - to_chat(user, span_noticealien("I discard [prom].")) - qdel(prom) - return 0 - - prom = new (user.loc) - if(!user.put_in_active_hand(prom, 1)) - to_chat(user, span_warning("I must empty your hands before preparing the parasite.")) - return 0 - else //Just in case telling the player only once is not enough! - to_chat(user, span_noticealien("Use the royal parasite on one of your children to promote her to Praetorian!")) - return 0 - -/obj/item/queenpromote - name = "\improper royal parasite" - desc = "" - icon_state = "alien_medal" - item_flags = ABSTRACT | DROPDEL - icon = 'icons/mob/alien.dmi' - -/obj/item/queenpromote/Initialize() - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) - -/obj/item/queenpromote/attack(mob/living/M, mob/living/carbon/alien/humanoid/user) - if(!isalienadult(M) || isalienroyal(M)) - to_chat(user, span_noticealien("I may only use this with your adult, non-royal children!")) - return - if(get_alien_type(/mob/living/carbon/alien/humanoid/royal/praetorian/)) - to_chat(user, span_noticealien("I already have a Praetorian!")) - return - - var/mob/living/carbon/alien/humanoid/A = M - if(A.stat == CONSCIOUS && A.mind && A.key) - if(!user.usePlasma(500)) - to_chat(user, span_noticealien("I must have 500 plasma stored to use this!")) - return - - to_chat(A, span_noticealien("The queen has granted you a promotion to Praetorian!")) - user.visible_message(span_alertalien("[A] begins to expand, twist and contort!")) - var/mob/living/carbon/alien/humanoid/royal/praetorian/new_prae = new (A.loc) - A.mind.transfer_to(new_prae) - qdel(A) - qdel(src) - return - else - to_chat(user, span_warning("This child must be alert and responsive to become a Praetorian!")) - -/obj/item/queenpromote/attack_self(mob/user) - to_chat(user, span_noticealien("I discard [src].")) - qdel(src) diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm deleted file mode 100644 index 0297f593579..00000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm +++ /dev/null @@ -1,94 +0,0 @@ - -/mob/living/carbon/alien/humanoid/update_icons() - cut_overlays() - for(var/I in overlays_standing) - add_overlay(I) - - var/asleep = IsSleeping() - if(stat == DEAD) - //If we mostly took damage from fire - if(getFireLoss() > 125) - icon_state = "alien[caste]_husked" - else - icon_state = "alien[caste]_dead" - - else if((stat == UNCONSCIOUS && !asleep) || stat == SOFT_CRIT || IsParalyzed()) - icon_state = "alien[caste]_unconscious" - else if(leap_on_click) - icon_state = "alien[caste]_pounce" - - else if(!(mobility_flags & MOBILITY_STAND)) - icon_state = "alien[caste]_sleep" - else if(mob_size == MOB_SIZE_LARGE) - icon_state = "alien[caste]" - if(drooling) - add_overlay("alienspit_[caste]") - else - icon_state = "alien[caste]" - if(drooling) - add_overlay("alienspit") - - if(leaping) - if(alt_icon == initial(alt_icon)) - var/old_icon = icon - icon = alt_icon - alt_icon = old_icon - icon_state = "alien[caste]_leap" - pixel_x = -32 - pixel_y = -32 - else - if(alt_icon != initial(alt_icon)) - var/old_icon = icon - icon = alt_icon - alt_icon = old_icon - pixel_x = get_standard_pixel_x_offset(mobility_flags & MOBILITY_STAND) - pixel_y = get_standard_pixel_y_offset(mobility_flags & MOBILITY_STAND) - update_inv_hands() - update_inv_handcuffed() - -/mob/living/carbon/alien/humanoid/regenerate_icons() - if(!..()) - // update_icons() //Handled in update_transform(), leaving this here as a reminder - update_transform() - -/mob/living/carbon/alien/humanoid/update_transform() //The old method of updating lying/standing was update_icons(). Aliens still expect that. - if(lying) - lying = 90 //Anything else looks retarded - ..() - update_icons() - -/mob/living/carbon/alien/humanoid/update_inv_handcuffed() - remove_overlay(HANDCUFF_LAYER) - var/cuff_icon = "aliencuff" - var/dmi_file = 'icons/mob/alien.dmi' - - if(mob_size == MOB_SIZE_LARGE) - cuff_icon = "aliencuff_[caste]" - dmi_file = 'icons/mob/alienqueen.dmi' - - if(handcuffed) - overlays_standing[HANDCUFF_LAYER] = mutable_appearance(dmi_file, cuff_icon, -HANDCUFF_LAYER) - apply_overlay(HANDCUFF_LAYER) - -//Royals have bigger sprites, so inhand things must be handled differently. -/mob/living/carbon/alien/humanoid/royal/update_inv_hands() - ..() - remove_overlay(HANDS_LAYER) - var/list/hands = list() - - var/obj/item/l_hand = get_item_for_held_index(1) - if(l_hand) - var/itm_state = l_hand.item_state - if(!itm_state) - itm_state = l_hand.icon_state - hands += mutable_appearance(alt_inhands_file, "[itm_state][caste]_l", -HANDS_LAYER) - - var/obj/item/r_hand = get_item_for_held_index(2) - if(r_hand) - var/itm_state = r_hand.item_state - if(!itm_state) - itm_state = r_hand.icon_state - hands += mutable_appearance(alt_inhands_file, "[itm_state][caste]_r", -HANDS_LAYER) - - overlays_standing[HANDS_LAYER] = hands - apply_overlay(HANDS_LAYER) diff --git a/code/modules/mob/living/carbon/alien/larva/death.dm b/code/modules/mob/living/carbon/alien/larva/death.dm deleted file mode 100644 index 8fd6329a0c1..00000000000 --- a/code/modules/mob/living/carbon/alien/larva/death.dm +++ /dev/null @@ -1,22 +0,0 @@ -/mob/living/carbon/alien/larva/death(gibbed) - if(stat == DEAD) - return - - . = ..() - - update_icons() - -/mob/living/carbon/alien/larva/spawn_gibs(with_bodyparts) - if(with_bodyparts) - new /obj/effect/gibspawner/larva(drop_location(), src) - else - new /obj/effect/gibspawner/larva/bodypartless(drop_location(), src) - -/mob/living/carbon/alien/larva/gib_animation() - new /obj/effect/temp_visual/gib_animation(loc, "gibbed-l") - -/mob/living/carbon/alien/larva/spawn_dust() - new /obj/effect/decal/remains/xeno(loc) - -/mob/living/carbon/alien/larva/dust_animation() - new /obj/effect/temp_visual/dust_animation(loc, "dust-l") diff --git a/code/modules/mob/living/carbon/alien/larva/inventory.dm b/code/modules/mob/living/carbon/alien/larva/inventory.dm deleted file mode 100644 index 23c461aa83c..00000000000 --- a/code/modules/mob/living/carbon/alien/larva/inventory.dm +++ /dev/null @@ -1,3 +0,0 @@ -//can't unequip since it can't equip anything -/mob/living/carbon/alien/larva/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE) - return diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm deleted file mode 100644 index 84b9b4aefd1..00000000000 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ /dev/null @@ -1,69 +0,0 @@ -/mob/living/carbon/alien/larva - name = "alien larva" - real_name = "alien larva" - icon_state = "larva0" - pass_flags = PASSTABLE | PASSMOB - mob_size = MOB_SIZE_SMALL - density = FALSE - hud_type = /datum/hud/larva - - maxHealth = 25 - health = 25 - - var/amount_grown = 0 - var/max_grown = 100 - var/time_of_birth - - rotate_on_lying = 0 - bodyparts = list(/obj/item/bodypart/chest/larva, /obj/item/bodypart/head/larva) - - -//This is fine right now, if we're adding organ specific damage this needs to be updated -/mob/living/carbon/alien/larva/Initialize() - - AddAbility(new/obj/effect/proc_holder/alien/hide(null)) - AddAbility(new/obj/effect/proc_holder/alien/larva_evolve(null)) - . = ..() - -/mob/living/carbon/alien/larva/create_internal_organs() - internal_organs += new /obj/item/organ/alien/plasmavessel/small/tiny - ..() - -//This needs to be fixed -/mob/living/carbon/alien/larva/Stat() - ..() - if(statpanel("Status")) - stat(null, "Progress: [amount_grown]/[max_grown]") - -/mob/living/carbon/alien/larva/adjustPlasma(amount) - if(stat != DEAD && amount > 0) - amount_grown = min(amount_grown + 1, max_grown) - ..(amount) - -//can't equip anything -/mob/living/carbon/alien/larva/attack_ui(slot_id) - return - -/mob/living/carbon/alien/larva/restrained(ignore_grab) - . = 0 - -// new damage icon system -// now constructs damage icon for each organ from mask * damage field - - -/mob/living/carbon/alien/larva/show_inv(mob/user) - return - -/mob/living/carbon/alien/larva/toggle_throw_mode() - return - -/mob/living/carbon/alien/larva/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE) - return - -/mob/living/carbon/alien/larva/stripPanelUnequip(obj/item/what, mob/who) - to_chat(src, span_warning("I don't have the dexterity to do this!")) - return - -/mob/living/carbon/alien/larva/stripPanelEquip(obj/item/what, mob/who) - to_chat(src, span_warning("I don't have the dexterity to do this!")) - return diff --git a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm deleted file mode 100644 index 19ce8a4ac9d..00000000000 --- a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm +++ /dev/null @@ -1,33 +0,0 @@ - - -/mob/living/carbon/alien/larva/attack_hand(mob/living/carbon/human/M) - if(..()) - var/damage = rand(1, 9) - if (prob(90)) - playsound(loc, "punch", 25, TRUE, -1) - log_combat(M, src, "attacked") - visible_message(span_danger("[M] kicks [src]!"), \ - span_danger("[M] kicks you!"), span_hear("I hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I kick [src]!")) - if ((stat != DEAD) && (damage > 4.9)) - Unconscious(rand(100,200)) - - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) - apply_damage(damage, BRUTE, affecting) - else - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - visible_message(span_danger("[M]'s kick misses [src]!"), \ - span_danger("I avoid [M]'s kick!"), span_hear("I hear a swoosh!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_warning("My kick misses [src]!")) - -/mob/living/carbon/alien/larva/attack_hulk(mob/living/carbon/human/user) - . = ..() - if(!.) - return - adjustBruteLoss(5 + rand(1,9)) - new /datum/forced_movement(src, get_step_away(user,src, 30), 1) - -/mob/living/carbon/alien/larva/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect) - if(!no_effect && !visual_effect_icon) - visual_effect_icon = ATTACK_EFFECT_BITE - ..() diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm deleted file mode 100644 index 57ede2038e3..00000000000 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ /dev/null @@ -1,32 +0,0 @@ - - -/mob/living/carbon/alien/larva/Life() - set invisibility = 0 - if (notransform) - return - if(..() && !IS_IN_STASIS(src)) //not dead and not in stasis - // GROW! - if(amount_grown < max_grown) - amount_grown++ - update_icons() - - -/mob/living/carbon/alien/larva/update_stat() - if(status_flags & GODMODE) - return - if(stat != DEAD) - if(health<= -maxHealth || !getorgan(/obj/item/organ/brain)) - death() - return - if(IsUnconscious() || IsSleeping() || getOxyLoss() > 50 || (HAS_TRAIT(src, TRAIT_DEATHCOMA)) || health <= crit_threshold) - if(stat == CONSCIOUS) - stat = UNCONSCIOUS - become_blind(UNCONSCIOUS_BLIND) - update_mobility() - else - if(stat == UNCONSCIOUS) - stat = CONSCIOUS - cure_blind(UNCONSCIOUS_BLIND) - set_resting(FALSE) - update_damage_hud() - update_health_hud() diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm deleted file mode 100644 index 0bf22c25dc2..00000000000 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ /dev/null @@ -1,63 +0,0 @@ -/obj/effect/proc_holder/alien/hide - name = "Hide" - desc = "" - plasma_cost = 0 - - action_icon_state = "alien_hide" - -/obj/effect/proc_holder/alien/hide/fire(mob/living/carbon/alien/user) - if(user.stat != CONSCIOUS) - return - - if (user.layer != ABOVE_NORMAL_TURF_LAYER) - user.layer = ABOVE_NORMAL_TURF_LAYER - user.visible_message(span_name("[user] scurries to the ground!"), \ - span_noticealien("I are now hiding.")) - else - user.layer = MOB_LAYER - user.visible_message(span_notice("[user] slowly peeks up from the ground..."), \ - span_noticealien("I stop hiding.")) - return 1 - - -/obj/effect/proc_holder/alien/larva_evolve - name = "Evolve" - desc = "" - plasma_cost = 0 - - action_icon_state = "alien_evolve_larva" - -/obj/effect/proc_holder/alien/larva_evolve/fire(mob/living/carbon/alien/user) - if(!islarva(user)) - return - var/mob/living/carbon/alien/larva/L = user - - if(L.handcuffed || L.legcuffed) // Cuffing larvas ? Eh ? - to_chat(user, span_warning("I cannot evolve when you are cuffed!")) - return - - if(L.amount_grown >= L.max_grown) //TODO ~Carn - to_chat(L, span_name("I are growing into a beautiful alien! It is time to choose a caste.")) - to_chat(L, span_info("There are three to choose from:")) - to_chat(L, span_name("Hunters
    are the most agile caste, tasked with hunting for hosts. They are faster than a human and can even pounce, but are not much tougher than a drone.")) - to_chat(L, span_name("Sentinels are tasked with protecting the hive. With their ranged spit, invisibility, and high health, they make formidable guardians and acceptable secondhand hunters.")) - to_chat(L, span_name("Drones are the weakest and slowest of the castes, but can grow into a praetorian and then queen if no queen exists, and are vital to maintaining a hive with their resin secretion abilities.")) - var/alien_caste = alert(L, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone") - - if(user.incapacitated()) //something happened to us while we were choosing. - return - - var/mob/living/carbon/alien/humanoid/new_xeno - switch(alien_caste) - if("Hunter") - new_xeno = new /mob/living/carbon/alien/humanoid/hunter(L.loc) - if("Sentinel") - new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(L.loc) - if("Drone") - new_xeno = new /mob/living/carbon/alien/humanoid/drone(L.loc) - - L.alien_evolve(new_xeno) - return 0 - else - to_chat(user, span_warning("I are not fully grown!")) - return 0 diff --git a/code/modules/mob/living/carbon/alien/larva/update_icons.dm b/code/modules/mob/living/carbon/alien/larva/update_icons.dm deleted file mode 100644 index 983544e8c72..00000000000 --- a/code/modules/mob/living/carbon/alien/larva/update_icons.dm +++ /dev/null @@ -1,31 +0,0 @@ - -/mob/living/carbon/alien/larva/regenerate_icons() - cut_overlays() - update_icons() - -/mob/living/carbon/alien/larva/update_icons() - var/state = 0 - if(amount_grown > 80) - state = 2 - else if(amount_grown > 50) - state = 1 - - if(stat == DEAD) - icon_state = "larva[state]_dead" - else if(handcuffed || legcuffed) //This should be an overlay. Who made this an icon_state? - icon_state = "larva[state]_cuff" - else if(!(mobility_flags & MOBILITY_STAND)) - icon_state = "larva[state]_sleep" - else if(IsStun()) - icon_state = "larva[state]_stun" - else - icon_state = "larva[state]" - -/mob/living/carbon/alien/larva/update_transform() //All this is handled in update_icons() - ..() - return update_icons() - -/mob/living/carbon/alien/larva/update_inv_handcuffed() - update_icons() //larva icon_state changes if cuffed/uncuffed. - - diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm deleted file mode 100644 index 0dc31d8b5e1..00000000000 --- a/code/modules/mob/living/carbon/alien/life.dm +++ /dev/null @@ -1,54 +0,0 @@ -/mob/living/carbon/alien/Life() - findQueen() - return..() - -/mob/living/carbon/alien/check_breath(datum/gas_mixture/breath) - if(status_flags & GODMODE) - return - - if(!breath || (breath.total_moles() == 0)) - //Aliens breathe in vaccuum - return 0 - - var/toxins_used = 0 - var/tox_detect_threshold = 0.02 - var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME - var/list/breath_gases = breath.gases - - breath.assert_gases(/datum/gas/plasma, /datum/gas/oxygen) - - //Partial pressure of the toxins in our breath - var/Toxins_pp = (breath_gases[/datum/gas/plasma][MOLES]/breath.total_moles())*breath_pressure - - if(Toxins_pp > tox_detect_threshold) // Detect toxins in air - adjustPlasma(breath_gases[/datum/gas/plasma][MOLES]*250) - throw_alert("alien_tox", /atom/movable/screen/alert/alien_tox) - - toxins_used = breath_gases[/datum/gas/plasma][MOLES] - - else - clear_alert("alien_tox") - - //Breathe in toxins and out oxygen - breath_gases[/datum/gas/plasma][MOLES] -= toxins_used - breath_gases[/datum/gas/oxygen][MOLES] += toxins_used - - breath.garbage_collect() - - //BREATH TEMPERATURE - handle_breath_temperature(breath) - -/mob/living/carbon/alien/handle_status_effects() - ..() - //natural reduction of movement delay due to stun. - if(move_delay_add > 0) - move_delay_add = max(0, move_delay_add - rand(1, 2)) - -/mob/living/carbon/alien/handle_changeling() - return - -/mob/living/carbon/alien/handle_fire()//Aliens on fire code - . = ..() - if(.) //if the mob isn't on fire anymore - return - adjust_bodytemperature(BODYTEMP_HEATING_MAX) //If you're on fire, you heat up! diff --git a/code/modules/mob/living/carbon/alien/login.dm b/code/modules/mob/living/carbon/alien/login.dm deleted file mode 100644 index 5c177fbb622..00000000000 --- a/code/modules/mob/living/carbon/alien/login.dm +++ /dev/null @@ -1,4 +0,0 @@ -/mob/living/carbon/alien/Login() - ..() - AddInfectionImages() - return diff --git a/code/modules/mob/living/carbon/alien/logout.dm b/code/modules/mob/living/carbon/alien/logout.dm deleted file mode 100644 index f25b21f0cca..00000000000 --- a/code/modules/mob/living/carbon/alien/logout.dm +++ /dev/null @@ -1,4 +0,0 @@ -/mob/living/carbon/alien/Logout() - ..() - RemoveInfectionImages() - return diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm deleted file mode 100644 index 6ebe7a5a011..00000000000 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ /dev/null @@ -1,192 +0,0 @@ -/obj/item/organ/alien - icon_state = "xgibmid2" - var/list/alien_powers = list() - -/obj/item/organ/alien/Initialize() - . = ..() - for(var/A in alien_powers) - if(ispath(A)) - alien_powers -= A - alien_powers += new A(src) - -/obj/item/organ/alien/Destroy() - QDEL_LIST(alien_powers) - return ..() - -/obj/item/organ/alien/Insert(mob/living/carbon/M, special = 0) - ..() - for(var/obj/effect/proc_holder/alien/P in alien_powers) - M.AddAbility(P) - - -/obj/item/organ/alien/Remove(mob/living/carbon/M, special = 0) - for(var/obj/effect/proc_holder/alien/P in alien_powers) - M.RemoveAbility(P) - ..() - -/obj/item/organ/alien/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent(/datum/reagent/toxin/acid, 10) - return S - - -/obj/item/organ/alien/plasmavessel - name = "plasma vessel" - icon_state = "plasma" - w_class = WEIGHT_CLASS_NORMAL - zone = BODY_ZONE_CHEST - slot = "plasmavessel" - alien_powers = list(/obj/effect/proc_holder/alien/plant, /obj/effect/proc_holder/alien/transfer) - - var/storedPlasma = 100 - var/max_plasma = 250 - var/heal_rate = 5 - var/plasma_rate = 10 - -/obj/item/organ/alien/plasmavessel/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent(/datum/reagent/toxin/plasma, storedPlasma/10) - return S - -/obj/item/organ/alien/plasmavessel/large - name = "large plasma vessel" - icon_state = "plasma_large" - w_class = WEIGHT_CLASS_BULKY - storedPlasma = 200 - max_plasma = 500 - plasma_rate = 15 - -/obj/item/organ/alien/plasmavessel/large/queen - plasma_rate = 20 - -/obj/item/organ/alien/plasmavessel/small - name = "small plasma vessel" - icon_state = "plasma_small" - w_class = WEIGHT_CLASS_SMALL - storedPlasma = 100 - max_plasma = 150 - plasma_rate = 5 - -/obj/item/organ/alien/plasmavessel/small/tiny - name = "tiny plasma vessel" - icon_state = "plasma_tiny" - w_class = WEIGHT_CLASS_TINY - max_plasma = 100 - alien_powers = list(/obj/effect/proc_holder/alien/transfer) - -/obj/item/organ/alien/plasmavessel/on_life() - //If there are alien weeds on the ground then heal if needed or give some plasma - if(locate(/obj/structure/alien/weeds) in owner.loc) - if(owner.health >= owner.maxHealth) - owner.adjustPlasma(plasma_rate) - else - var/heal_amt = heal_rate - if(!isalien(owner)) - heal_amt *= 0.2 - owner.adjustPlasma(plasma_rate*0.5) - owner.adjustBruteLoss(-heal_amt) - owner.adjustFireLoss(-heal_amt) - owner.adjustOxyLoss(-heal_amt) - owner.adjustCloneLoss(-heal_amt) - else - owner.adjustPlasma(plasma_rate * 0.1) - -/obj/item/organ/alien/plasmavessel/Insert(mob/living/carbon/M, special = 0) - ..() - if(isalien(M)) - var/mob/living/carbon/alien/A = M - A.updatePlasmaDisplay() - -/obj/item/organ/alien/plasmavessel/Remove(mob/living/carbon/M, special = 0) - ..() - if(isalien(M)) - var/mob/living/carbon/alien/A = M - A.updatePlasmaDisplay() - -#define QUEEN_DEATH_DEBUFF_DURATION 2400 - -/obj/item/organ/alien/hivenode - name = "hive node" - icon_state = "hivenode" - zone = BODY_ZONE_HEAD - slot = "hivenode" - w_class = WEIGHT_CLASS_TINY - var/recent_queen_death = 0 //Indicates if the queen died recently, aliens are heavily weakened while this is active. - alien_powers = list(/obj/effect/proc_holder/alien/whisper) - -/obj/item/organ/alien/hivenode/Insert(mob/living/carbon/M, special = 0) - ..() - M.faction |= ROLE_ALIEN - ADD_TRAIT(M, TRAIT_XENO_IMMUNE, "xeno immune") - -/obj/item/organ/alien/hivenode/Remove(mob/living/carbon/M, special = 0) - M.faction -= ROLE_ALIEN - REMOVE_TRAIT(M, TRAIT_XENO_IMMUNE, "xeno immune") - ..() - -//When the alien queen dies, all aliens suffer a penalty as punishment for failing to protect her. -/obj/item/organ/alien/hivenode/proc/queen_death() - if(!owner|| owner.stat == DEAD) - return - if(isalien(owner)) //Different effects for aliens than humans - to_chat(owner, span_danger("My Queen has been struck down!")) - to_chat(owner, span_danger("I are struck with overwhelming agony! You feel confused, and my connection to the hivemind is severed.")) - owner.emote("roar") - owner.Stun(200) //Actually just slows them down a bit. - - else if(ishuman(owner)) //Humans, being more fragile, are more overwhelmed by the mental backlash. - to_chat(owner, span_danger("I feel a splitting pain in my head, and are struck with a wave of nausea. You cannot hear the hivemind anymore!")) - owner.emote("scream") - owner.Paralyze(100) - - owner.jitteriness += 30 - owner.confused += 30 - owner.stuttering += 30 - - recent_queen_death = 1 - owner.throw_alert("alien_noqueen", /atom/movable/screen/alert/alien_vulnerable) - addtimer(CALLBACK(src, PROC_REF(clear_queen_death)), QUEEN_DEATH_DEBUFF_DURATION) - - -/obj/item/organ/alien/hivenode/proc/clear_queen_death() - if(QDELETED(src)) //In case the node is deleted - return - recent_queen_death = 0 - if(!owner) //In case the xeno is butchered or subjected to surgery after death. - return - to_chat(owner, span_noticealien("The pain of the queen's death is easing. You begin to hear the hivemind again.")) - owner.clear_alert("alien_noqueen") - -#undef QUEEN_DEATH_DEBUFF_DURATION - -/obj/item/organ/alien/resinspinner - name = "resin spinner" - icon_state = "stomach-x" - zone = BODY_ZONE_PRECISE_MOUTH - slot = "resinspinner" - alien_powers = list(/obj/effect/proc_holder/alien/resin) - - -/obj/item/organ/alien/acid - name = "acid gland" - icon_state = "acid" - zone = BODY_ZONE_PRECISE_MOUTH - slot = "acidgland" - alien_powers = list(/obj/effect/proc_holder/alien/acid) - - -/obj/item/organ/alien/neurotoxin - name = "neurotoxin gland" - icon_state = "neurotox" - zone = BODY_ZONE_PRECISE_MOUTH - slot = "neurotoxingland" - alien_powers = list(/obj/effect/proc_holder/alien/neurotoxin) - - -/obj/item/organ/alien/eggsac - name = "egg sac" - icon_state = "eggsac" - zone = BODY_ZONE_PRECISE_GROIN - slot = "eggsac" - w_class = WEIGHT_CLASS_BULKY - alien_powers = list(/obj/effect/proc_holder/alien/lay_egg) diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm deleted file mode 100644 index 1ad0a1e7ffd..00000000000 --- a/code/modules/mob/living/carbon/alien/say.dm +++ /dev/null @@ -1,23 +0,0 @@ -/mob/living/proc/alien_talk(message, shown_name = real_name) - src.log_talk(message, LOG_SAY) - message = trim(message) - if(!message) - return - - var/message_a = say_quote(message) - var/rendered = "Hivemind, [shown_name] [message_a]" - for(var/mob/S in GLOB.player_list) - if(!S.stat && S.hivecheck()) - to_chat(S, rendered) - if(S in GLOB.dead_mob_list) - var/link = FOLLOW_LINK(S, src) - to_chat(S, "[link] [rendered]") - -/mob/living/carbon/alien/humanoid/royal/queen/alien_talk(message, shown_name = name) - shown_name = "[shown_name]" - ..(message, shown_name) - -/mob/living/carbon/hivecheck() - var/obj/item/organ/alien/hivenode/N = getorgan(/obj/item/organ/alien/hivenode) - if(N && !N.recent_queen_death) //Mob has alien hive node and is not under the dead queen special effect. - return N diff --git a/code/modules/mob/living/carbon/alien/screen.dm b/code/modules/mob/living/carbon/alien/screen.dm deleted file mode 100644 index 4d90fd4b325..00000000000 --- a/code/modules/mob/living/carbon/alien/screen.dm +++ /dev/null @@ -1,33 +0,0 @@ - -/mob/living/carbon/alien/proc/updatePlasmaDisplay() - if(hud_used) //clientless aliens - hud_used.alien_plasma_display.maptext = "
    [round(getPlasma())]
    " - -/mob/living/carbon/alien/larva/updatePlasmaDisplay() - return - -/mob/living/carbon/alien/proc/findQueen() - if(hud_used) - hud_used.alien_queen_finder.cut_overlays() - var/mob/queen = get_alien_type(/mob/living/carbon/alien/humanoid/royal/queen) - if(!queen) - return - var/turf/Q = get_turf(queen) - var/turf/A = get_turf(src) - if(Q.z != A.z) //The queen is on a different Z level, we cannot sense that far. - return - var/Qdir = get_dir(src, Q) - var/Qdist = get_dist(src, Q) - var/finder_icon = "finder_center" //Overlay showed when adjacent to or on top of the queen! - switch(Qdist) - if(2 to 7) - finder_icon = "finder_near" - if(8 to 20) - finder_icon = "finder_med" - if(21 to INFINITY) - finder_icon = "finder_far" - var/image/finder_eye = image('icons/mob/screen_alien.dmi', finder_icon, dir = Qdir) - hud_used.alien_queen_finder.add_overlay(finder_eye) - -/mob/living/carbon/alien/humanoid/royal/queen/findQueen() - return //Queen already knows where she is. Hopefully. diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm deleted file mode 100644 index be63194f159..00000000000 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ /dev/null @@ -1,129 +0,0 @@ -// This is to replace the previous datum/disease/alien_embryo for slightly improved handling and maintainability -// It functions almost identically (see code/datums/diseases/alien_embryo.dm) -/obj/item/organ/body_egg/alien_embryo - name = "alien embryo" - icon = 'icons/mob/alien.dmi' - icon_state = "larva0_dead" - var/stage = 0 - var/bursting = FALSE - -/obj/item/organ/body_egg/alien_embryo/on_find(mob/living/finder) - ..() - if(stage < 4) - to_chat(finder, span_notice("It's small and weak, barely the size of a foetus.")) - else - to_chat(finder, span_notice("It's grown quite large, and writhes slightly as you look at it.")) - if(prob(10)) - AttemptGrow(0) - -/obj/item/organ/body_egg/alien_embryo/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent(/datum/reagent/toxin/acid, 10) - return S - -/obj/item/organ/body_egg/alien_embryo/on_life() - . = ..() - switch(stage) - if(2, 3) - if(prob(2)) - owner.emote("sneeze") - if(prob(2)) - owner.emote("cough") - if(prob(2)) - to_chat(owner, span_danger("My throat feels sore.")) - if(prob(2)) - to_chat(owner, span_danger("Mucous runs down the back of my throat.")) - if(4) - if(prob(2)) - owner.emote("sneeze") - if(prob(2)) - owner.emote("cough") - if(prob(4)) - to_chat(owner, span_danger("My muscles ache.")) - if(prob(20)) - owner.take_bodypart_damage(1) - if(prob(4)) - to_chat(owner, span_danger("My stomach hurts.")) - if(prob(20)) - owner.adjustToxLoss(1) - if(5) - to_chat(owner, span_danger("I feel something tearing its way out of my stomach...")) - owner.adjustToxLoss(10) - -/obj/item/organ/body_egg/alien_embryo/egg_process() - if(stage < 5 && prob(3)) - stage++ - INVOKE_ASYNC(src, PROC_REF(RefreshInfectionImage)) - - if(stage == 5 && prob(50)) - AttemptGrow() - - - -/obj/item/organ/body_egg/alien_embryo/proc/AttemptGrow(gib_on_success=TRUE) - if(!owner || bursting) - return - - bursting = TRUE - - var/list/candidates = pollGhostCandidates("Do you want to play as an alien larva that will burst out of [owner]?", ROLE_ALIEN, null, ROLE_ALIEN, 100, POLL_IGNORE_ALIEN_LARVA) - - if(QDELETED(src) || QDELETED(owner)) - return - - if(!candidates.len || !owner) - bursting = FALSE - stage = 4 - return - - var/mob/dead/observer/ghost = pick(candidates) - - var/mutable_appearance/overlay = mutable_appearance('icons/mob/alien.dmi', "burst_lie") - owner.add_overlay(overlay) - - var/atom/xeno_loc = get_turf(owner) - var/mob/living/carbon/alien/larva/new_xeno = new(xeno_loc) - new_xeno.key = ghost.key - SEND_SOUND(new_xeno, sound('sound/blank.ogg',0,0,0,100)) //To get the player's attention - new_xeno.mobility_flags = NONE //so we don't move during the bursting animation - new_xeno.notransform = 1 - new_xeno.invisibility = INVISIBILITY_MAXIMUM - - sleep(6) - - if(QDELETED(src) || QDELETED(owner)) - return - - if(new_xeno) - new_xeno.mobility_flags = MOBILITY_FLAGS_DEFAULT - new_xeno.notransform = 0 - new_xeno.invisibility = 0 - - if(gib_on_success) - new_xeno.visible_message(span_danger("[new_xeno] bursts out of [owner] in a shower of gore!"), span_danger("I exit [owner], my previous host."), span_hear("I hear organic matter ripping and tearing!")) - owner.gib(TRUE) - else - new_xeno.visible_message(span_danger("[new_xeno] wriggles out of [owner]!"), span_danger("I exit [owner], my previous host.")) - owner.adjustBruteLoss(40) - owner.cut_overlay(overlay) - qdel(src) - - -/*---------------------------------------- -Proc: AddInfectionImages(C) -Des: Adds the infection image to all aliens for this embryo -----------------------------------------*/ -/obj/item/organ/body_egg/alien_embryo/AddInfectionImages() - for(var/mob/living/carbon/alien/alien in GLOB.player_list) - var/I = image('icons/mob/alien.dmi', loc = owner, icon_state = "infected[stage]") - alien.client.images += I - -/*---------------------------------------- -Proc: RemoveInfectionImage(C) -Des: Removes all images from the mob infected by this embryo -----------------------------------------*/ -/obj/item/organ/body_egg/alien_embryo/RemoveInfectionImages() - for(var/mob/living/carbon/alien/alien in GLOB.player_list) - for(var/image/I in alien.client.images) - if(dd_hasprefix_case(I.icon_state, "infected") && I.loc == owner) - qdel(I) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm deleted file mode 100644 index 44a00bd3c5f..00000000000 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ /dev/null @@ -1,271 +0,0 @@ - - -//TODO: Make these simple_animals - -#define MIN_IMPREGNATION_TIME 100 //time it takes to impregnate someone -#define MAX_IMPREGNATION_TIME 150 - -#define MIN_ACTIVE_TIME 200 //time between being dropped and going idle -#define MAX_ACTIVE_TIME 400 - -/obj/item/clothing/mask/facehugger - name = "alien" - desc = "" - icon = 'icons/mob/alien.dmi' - icon_state = "facehugger" - item_state = "facehugger" - w_class = WEIGHT_CLASS_TINY //note: can be picked up by aliens unlike most other items of w_class below 4 - clothing_flags = MASKINTERNALS - throw_range = 5 - tint = 3 - flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH - layer = MOB_LAYER - max_integrity = 100 - - var/stat = CONSCIOUS //UNCONSCIOUS is the idle state in this case - - var/sterile = FALSE - var/real = TRUE //0 for the toy, 1 for real. Sure I could istype, but fuck that. - var/strength = 5 - - var/attached = 0 - -/obj/item/clothing/mask/facehugger/lamarr - name = "Lamarr" - sterile = 1 - -/obj/item/clothing/mask/facehugger/dead - icon_state = "facehugger_dead" - item_state = "facehugger_inactive" - stat = DEAD - -/obj/item/clothing/mask/facehugger/impregnated - icon_state = "facehugger_impregnated" - item_state = "facehugger_impregnated" - stat = DEAD - -/obj/item/clothing/mask/facehugger/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) - ..() - if(obj_integrity < 90) - Die() - -/obj/item/clothing/mask/facehugger/attackby(obj/item/O, mob/user, params) - return O.attack_obj(src, user) - -/obj/item/clothing/mask/facehugger/attack_alien(mob/user) //can be picked up by aliens - return attack_hand(user) - -//ATTACK HAND IGNORING PARENT RETURN VALUE -/obj/item/clothing/mask/facehugger/attack_hand(mob/user) - if((stat == CONSCIOUS && !sterile) && !isalien(user)) - if(Leap(user)) - return - . = ..() - -/obj/item/clothing/mask/facehugger/attack(mob/living/M, mob/user) - ..() - if(user.transferItemToLoc(src, get_turf(M))) - Leap(M) - -/obj/item/clothing/mask/facehugger/examine(mob/user) - . = ..() - if(!real)//So that giant red text about probisci doesn't show up. - return - switch(stat) - if(DEAD,UNCONSCIOUS) - . += span_boldannounce("[src] is not moving.") - if(CONSCIOUS) - . += span_boldannounce("[src] seems to be active!") - if (sterile) - . += span_boldannounce("It looks like the proboscis has been removed.") - - -/obj/item/clothing/mask/facehugger/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) - Die() - -/obj/item/clothing/mask/facehugger/equipped(mob/M) - . = ..() - Attach(M) - -/obj/item/clothing/mask/facehugger/Crossed(atom/target) - HasProximity(target) - return - -/obj/item/clothing/mask/facehugger/on_found(mob/finder) - if(stat == CONSCIOUS) - return HasProximity(finder) - return 0 - -/obj/item/clothing/mask/facehugger/HasProximity(atom/movable/AM as mob|obj) - if(CanHug(AM) && Adjacent(AM)) - return Leap(AM) - return 0 - -/obj/item/clothing/mask/facehugger/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) - if(!..()) - return - if(stat == CONSCIOUS) - icon_state = "[initial(icon_state)]_thrown" - addtimer(CALLBACK(src, PROC_REF(clear_throw_icon_state)), 15) - -/obj/item/clothing/mask/facehugger/proc/clear_throw_icon_state() - if(icon_state == "[initial(icon_state)]_thrown") - icon_state = "[initial(icon_state)]" - -/obj/item/clothing/mask/facehugger/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - ..() - if(stat == CONSCIOUS) - icon_state = "[initial(icon_state)]" - Leap(hit_atom) - -/obj/item/clothing/mask/facehugger/proc/valid_to_attach(mob/living/M) - // valid targets: carbons except aliens and devils - // facehugger state early exit checks - if(stat != CONSCIOUS) - return FALSE - if(attached) - return FALSE - if(iscarbon(M)) - // disallowed carbons - if(isalien(M) || istruedevil(M)) - return FALSE - var/mob/living/carbon/target = M - // gotta have a head to be implanted (no changelings or sentient plants) - if(!target.get_bodypart(BODY_ZONE_HEAD)) - return FALSE - // gotta be able to have the xeno implanted - if(HAS_TRAIT(M, TRAIT_XENO_IMMUNE)) - return FALSE - // carbon, has head, not alien or devil, has no hivenode or embryo: valid - return TRUE - - return FALSE - -/obj/item/clothing/mask/facehugger/proc/Leap(mob/living/M) - if(!valid_to_attach(M)) - return FALSE - if(iscarbon(M)) - var/mob/living/carbon/target = M - if(target.wear_mask && istype(target.wear_mask, /obj/item/clothing/mask/facehugger)) - return FALSE - // passed initial checks - time to leap! - M.visible_message(span_danger("[src] leaps at [M]'s face!"), \ - span_danger("[src] leaps at your face!")) - - // probiscis-blocker handling - if(iscarbon(M)) - var/mob/living/carbon/target = M - - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.is_mouth_covered(head_only = 1)) - H.visible_message(span_danger("[src] smashes against [H]'s [H.head]!"), \ - span_danger("[src] smashes against your [H.head]!")) - Die() - return FALSE - - if(target.wear_mask) - var/obj/item/clothing/W = target.wear_mask - if(target.dropItemToGround(W)) - target.visible_message(span_danger("[src] tears [W] off of [target]'s face!"), \ - span_danger("[src] tears [W] off of your face!")) - target.equip_to_slot_if_possible(src, SLOT_WEAR_MASK, 0, 1, 1) - return TRUE // time for a smoke - -/obj/item/clothing/mask/facehugger/proc/Attach(mob/living/M) - if(!valid_to_attach(M)) - return - // early returns and validity checks done: attach. - attached++ - //ensure we detach once we no longer need to be attached - addtimer(CALLBACK(src, PROC_REF(detach)), MAX_IMPREGNATION_TIME) - - - if(!sterile) - M.take_bodypart_damage(strength,0) //done here so that humans in helmets take damage - M.Unconscious(MAX_IMPREGNATION_TIME/0.3) //something like 25 ticks = 20 seconds with the default settings - - GoIdle() //so it doesn't jump the people that tear it off - - addtimer(CALLBACK(src, PROC_REF(Impregnate), M), rand(MIN_IMPREGNATION_TIME, MAX_IMPREGNATION_TIME)) - -/obj/item/clothing/mask/facehugger/proc/detach() - attached = 0 - -/obj/item/clothing/mask/facehugger/proc/Impregnate(mob/living/target) - if(!target || target.stat == DEAD) //was taken off or something - return - - if(iscarbon(target)) - var/mob/living/carbon/C = target - if(C.wear_mask != src) - return - - if(!sterile) - target.visible_message(span_danger("[src] falls limp after violating [target]'s face!"), \ - span_danger("[src] falls limp after violating your face!")) - - Die() - icon_state = "[initial(icon_state)]_impregnated" - - var/obj/item/bodypart/chest/LC = target.get_bodypart(BODY_ZONE_CHEST) - if((!LC || LC.status != BODYPART_ROBOTIC) && !target.getorgan(/obj/item/organ/body_egg/alien_embryo)) - new /obj/item/organ/body_egg/alien_embryo(target) - var/turf/T = get_turf(target) - log_game("[key_name(target)] was impregnated by a facehugger at [loc_name(T)]") - - else - target.visible_message(span_danger("[src] violates [target]'s face!"), \ - span_danger("[src] violates your face!")) - -/obj/item/clothing/mask/facehugger/proc/GoActive() - if(stat == DEAD || stat == CONSCIOUS) - return - - stat = CONSCIOUS - icon_state = "[initial(icon_state)]" - -/obj/item/clothing/mask/facehugger/proc/GoIdle() - if(stat == DEAD || stat == UNCONSCIOUS) - return - - stat = UNCONSCIOUS - icon_state = "[initial(icon_state)]_inactive" - - addtimer(CALLBACK(src, PROC_REF(GoActive)), rand(MIN_ACTIVE_TIME, MAX_ACTIVE_TIME)) - -/obj/item/clothing/mask/facehugger/proc/Die() - if(stat == DEAD) - return - - icon_state = "[initial(icon_state)]_dead" - item_state = "facehugger_inactive" - stat = DEAD - - visible_message(span_danger("[src] curls up into a ball!")) - -/proc/CanHug(mob/living/M) - if(!istype(M)) - return 0 - if(M.stat == DEAD) - return 0 - if(M.getorgan(/obj/item/organ/alien/hivenode)) - return 0 - - if(ismonkey(M)) - return 1 - - var/mob/living/carbon/C = M - if(ishuman(C) && !(SLOT_WEAR_MASK in C.dna.species.no_equip)) - var/mob/living/carbon/human/H = C - if(H.is_mouth_covered(head_only = 1)) - return 0 - return 1 - return 0 - -#undef MIN_ACTIVE_TIME -#undef MAX_ACTIVE_TIME - -#undef MIN_IMPREGNATION_TIME -#undef MAX_IMPREGNATION_TIME diff --git a/code/modules/mob/living/carbon/alien/status_procs.dm b/code/modules/mob/living/carbon/alien/status_procs.dm deleted file mode 100644 index 7fd1d318723..00000000000 --- a/code/modules/mob/living/carbon/alien/status_procs.dm +++ /dev/null @@ -1,20 +0,0 @@ -//Here are the procs used to modify status effects of a mob. -//The effects include: stun, knockdown, unconscious, sleeping, resting, jitteriness, dizziness, ear damage, -// eye damage, eye_blind, eye_blurry, druggy, TRAIT_BLIND trait, and TRAIT_NEARSIGHT trait. - -/////////////////////////////////// STUN //////////////////////////////////// - -/mob/living/carbon/alien/Stun(amount, updating = 1, ignore_canstun = 0) - . = ..() - if(!.) - move_delay_add = min(move_delay_add + round(amount / 2), 10) //a maximum delay of 10 - -/mob/living/carbon/alien/SetStun(amount, updating = 1, ignore_canstun = 0) - . = ..() - if(!.) - move_delay_add = min(move_delay_add + round(amount / 2), 10) - -/mob/living/carbon/alien/AdjustStun(amount, updating = 1, ignore_canstun = 0) - . = ..() - if(!.) - move_delay_add = CLAMP(move_delay_add + round(amount/2), 0, 10) diff --git a/code/modules/mob/living/carbon/alien/update_icons.dm b/code/modules/mob/living/carbon/alien/update_icons.dm deleted file mode 100644 index 468dca35400..00000000000 --- a/code/modules/mob/living/carbon/alien/update_icons.dm +++ /dev/null @@ -1,11 +0,0 @@ - - - -/mob/living/carbon/alien/update_damage_overlays() //aliens don't have damage overlays. - return - -/mob/living/carbon/alien/update_body() // we don't use the bodyparts or body layers for aliens. - return - -/mob/living/carbon/alien/update_body_parts()//we don't use the bodyparts layer for aliens. - return diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 64f54350a6d..f49410b29b6 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -112,7 +112,7 @@ if(possible_len) var/datum/surgery_step/done_step if(possible_len > 1) - var/input = input(user, "Which surgery step do you want to perform?", "PESTRA", ) as null|anything in possible_steps + var/input = input(user, "Which surgery step do you want to perform?", "HERMEIR", ) as null|anything in possible_steps if(input) done_step = possible_steps[input] else @@ -546,9 +546,6 @@ /mob/living/carbon/Stat() ..() if(statpanel("Status")) - var/obj/item/organ/alien/plasmavessel/vessel = getorgan(/obj/item/organ/alien/plasmavessel) - if(vessel) - stat(null, "Plasma Stored: [vessel.storedPlasma]/[vessel.max_plasma]") if(locate(/obj/item/assembly/health) in src) stat(null, "Health: [health]") add_abilities_to_panel() @@ -730,6 +727,8 @@ /mob/living/carbon/update_sight() if(!client) return + if(HAS_TRAIT(src, TRAIT_SEESPIRITS))//DK Change + see_invisible = SEE_INVISIBLE_OBSERVER // if(stat == DEAD) // sight = (SEE_TURFS|SEE_MOBS|SEE_OBJS) // see_in_dark = 8 diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 3174629525b..696edc5370b 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -133,7 +133,7 @@ return parse_zone(zone) return affecting.name -/mob/living/carbon/proc/find_used_grab_limb(mob/living/user, var/override_zone = null) //for finding the exact limb or inhand to grab +/mob/living/carbon/proc/find_used_grab_limb(mob/living/user, override_zone = null) //for finding the exact limb or inhand to grab var/used_limb = BODY_ZONE_CHEST var/missing_nose = HAS_TRAIT(src, TRAIT_MISSING_NOSE) var/obj/item/bodypart/affecting @@ -225,6 +225,7 @@ else user.used_intent.penfactor = initial(user.used_intent.penfactor)//Sanity check to make sure intent penfactor gets reset when the attack isn't a sneak attack. apply_damage(statforce, I.damtype, affecting) + SEND_SIGNAL(I, COMSIG_APPLY_REAGENTS, user, affecting.owner) if(I.damtype == BRUTE && affecting.status == BODYPART_ORGANIC) if(prob(statforce)) I.add_mob_blood(src) @@ -292,7 +293,7 @@ if(possible_len) var/datum/surgery_step/done_step if(possible_len > 1) - var/input = input(user, "Which surgery step do you want to perform?", "PESTRA", ) as null|anything in possible_steps + var/input = input(user, "Which surgery step do you want to perform?", "HERMEIR", ) as null|anything in possible_steps if(input) done_step = possible_steps[input] else diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 87769b97753..6ee4fb826c6 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -112,11 +112,11 @@ for(var/mob/living/carbon/human/HU in GLOB.player_list) if(!HU.stat && is_in_roguetown(HU)) HU.playsound_local(get_turf(HU), 'sound/music/lorddeath.ogg', 80, FALSE, pressure_affected = FALSE) - if("Prophet") + if("Archpriest") addomen(OMEN_NOPRIEST) // if(yeae) // if(mind) -// if((mind.assigned_role == "Lord") || (mind.assigned_role == "Prophet") || (mind.assigned_role == "Watchmen Captain") || (mind.assigned_role == "Merchant")) +// if((mind.assigned_role == "Lord") || (mind.assigned_role == "Archpriest") || (mind.assigned_role == "Watchmen Captain") || (mind.assigned_role == "Merchant")) // addomen(OMEN_NOBLEDEATH) if(!gibbed && yeae) @@ -158,7 +158,7 @@ switch(job) if("Monarch") removeomen(OMEN_NOLORD) - if("Prophet") + if("Archpriest") removeomen(OMEN_NOPRIEST) /mob/living/carbon/human/gib(no_brain, no_organs, no_bodyparts, safe_gib = FALSE) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 8658bd3e57a..f48089c8d0c 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -19,6 +19,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak()) message = "makes a noise. Tears stream down their face." + else + message = initial(message) /datum/emote/living/carbon/human/sexmoanlight @@ -33,6 +35,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak()) message = "makes a noise." + else + message = initial(message) /datum/emote/living/carbon/human/sexmoanhvy key = "sexmoanhvy" @@ -46,6 +50,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak()) message = "makes a noise." + else + message = initial(message) /datum/emote/living/carbon/human/eyebrow key = "eyebrow" @@ -88,6 +94,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak()) message = "makes a muffled grumbling noise." + else + message = initial(message) /datum/emote/living/carbon/human/handshake key = "handshake" diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 9afcf8b1333..fd621c1ae47 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -11,7 +11,7 @@ event.desc = self_species.stress_desc */ if(user.has_flaw(/datum/charflaw/paranoid) && (STASTR - user.STASTR) > 1) user.add_stress(/datum/stressevent/parastr) - if(HAS_TRAIT(user, TRAIT_JESTERPHOBIA) && job == "Jester") + if(HAS_TRAIT(user, TRAIT_JESTERPHOBIA) && job == "Harlequin") user.add_stress(/datum/stressevent/jesterphobia) if(HAS_TRAIT(src, TRAIT_BEAUTIFUL)) user.add_stress(/datum/stressevent/beautiful) @@ -143,7 +143,7 @@ commie_text = span_notice("Free man!") else commie_text = span_userdanger("BANDIT!") - if(mind.special_role == "Vampire Lord" && !mind.has_antag_datum(/datum/antagonist/vampirelord/).disguised) + if(mind.special_role == "Vampire Lord" && !mind.has_antag_datum(/datum/antagonist/vampirelord)?.disguised) . += span_userdanger("A MONSTER!") if(HAS_TRAIT(src, TRAIT_PUNISHMENT_CURSE)) . += span_userdanger("CURSED!") diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 1abb44fe6c2..b05644c40f7 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -137,7 +137,7 @@ add_to_all_human_data_huds() /mob/living/carbon/human/Stat() - ..() + . = ..() if(mind) var/datum/antagonist/vampirelord/VD = mind.has_antag_datum(/datum/antagonist/vampirelord) if(VD) @@ -147,55 +147,6 @@ if(statpanel("Status")) stat("Confessions sent: [GLOB.confessors.len]") - return //RTchange - - if(statpanel("Status")) -// stat(null, "Intent: [used_intent]") -// stat(null, "Move Mode: [m_intent]") - if (internal) - if (!internal.air_contents) - qdel(internal) - else - stat("Internal Atmosphere Info", internal.name) - stat("Tank Pressure", internal.air_contents.return_pressure()) - stat("Distribution Pressure", internal.distribute_pressure) - - if(mind) - var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling) - if(changeling) - stat("Chemical Storage", "[changeling.chem_charges]/[changeling.chem_storage]") - stat("Absorbed DNA", changeling.absorbedcount) - - //NINJACODE - if(istype(wear_armor, /obj/item/clothing/suit/space/space_ninja)) //Only display if actually a ninja. - var/obj/item/clothing/suit/space/space_ninja/SN = wear_armor - if(statpanel("SpiderOS")) - stat("SpiderOS Status:","[SN.s_initialized ? "Initialized" : "Disabled"]") - stat("Current Time:", "[station_time_timestamp()]") - if(SN.s_initialized) - //Suit gear - stat("Energy Charge:", "[round(SN.cell.charge/100)]%") - stat("Smoke Bombs:", "\Roman [SN.s_bombs]") - //Ninja status - stat("Fingerprints:", "[md5(dna.uni_identity)]") - stat("Unique Identity:", "[dna.unique_enzymes]") - stat("Overall Status:", "[stat > 1 ? "dead" : "[health]% healthy"]") - stat("Nutrition Status:", "[nutrition]") - stat("Oxygen Loss:", "[getOxyLoss()]") - stat("Toxin Levels:", "[getToxLoss()]") - stat("Burn Severity:", "[getFireLoss()]") - stat("Brute Trauma:", "[getBruteLoss()]") - stat("Radiation Levels:","[radiation] rad") - stat("Body Temperature:","[bodytemperature-T0C] degrees C ([bodytemperature*1.8-459.67] degrees F)") - - //Diseases - if(diseases.len) - stat("Viruses:", null) - for(var/thing in diseases) - var/datum/disease/D = thing - stat("*", "[D.name], Type: [D.spread_text], Stage: [D.stage]/[D.max_stages], Possible Cure: [D.cure_text]") - - /mob/living/carbon/human/show_inv(mob/user) user.set_machine(src) var/list/obscured = check_obscured_slots() @@ -763,7 +714,6 @@ VV_DROPDOWN_OPTION(VV_HK_MAKE_MONKEY, "Make Monkey") VV_DROPDOWN_OPTION(VV_HK_MAKE_CYBORG, "Make Cyborg") VV_DROPDOWN_OPTION(VV_HK_MAKE_SLIME, "Make Slime") - VV_DROPDOWN_OPTION(VV_HK_MAKE_ALIEN, "Make Alien") VV_DROPDOWN_OPTION(VV_HK_SET_SPECIES, "Set Species") VV_DROPDOWN_OPTION(VV_HK_PURRBATION, "Toggle Purrbation") @@ -858,12 +808,6 @@ if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return usr.client.holder.Topic("vv_override", list("makerobot"=href_list[VV_HK_TARGET])) - if(href_list[VV_HK_MAKE_ALIEN]) - if(!check_rights(R_SPAWN)) - return - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") - return - usr.client.holder.Topic("vv_override", list("makealien"=href_list[VV_HK_TARGET])) if(href_list[VV_HK_MAKE_SLIME]) if(!check_rights(R_SPAWN)) return @@ -1235,25 +1179,25 @@ //Vrell - Moving this here to fix load order bugs /mob/living/carbon/human/has_penis() + RETURN_TYPE(/obj/item/organ/penis) return getorganslot(ORGAN_SLOT_PENIS) /mob/living/carbon/human/has_testicles() + RETURN_TYPE(/obj/item/organ/filling_organ/testicles) return getorganslot(ORGAN_SLOT_TESTICLES) /mob/living/carbon/human/has_vagina() + RETURN_TYPE(/obj/item/organ/filling_organ/vagina) return getorganslot(ORGAN_SLOT_VAGINA) /mob/living/carbon/human/has_breasts() + RETURN_TYPE(/obj/item/organ/filling_organ/breasts) return getorganslot(ORGAN_SLOT_BREASTS) /mob/living/carbon/human/proc/has_belly() + RETURN_TYPE(/obj/item/organ/belly) return getorganslot(ORGAN_SLOT_BELLY) /mob/living/carbon/human/proc/has_butt() + RETURN_TYPE(/obj/item/organ/butt) return getorganslot(ORGAN_SLOT_BUTT) - -/mob/living/carbon/human/proc/is_fertile() - return getorganslot(ORGAN_SLOT_VAGINA).fertility - -/mob/living/carbon/human/proc/is_virile() - return getorganslot(ORGAN_SLOT_TESTICLES).virility diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index ce3bc301135..c2717b911bb 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -203,6 +203,7 @@ L.add_embedded_object(I, silent = FALSE, crit_message = TRUE) emote("embed") L.receive_damage(I.w_class*I.embedding.embedded_impact_pain_multiplier) + SEND_SIGNAL(I, COMSIG_APPLY_REAGENTS, I.thrownby, L) // visible_message(span_danger("[I] embeds itself in [src]'s [L.name]!"),span_danger("[I] embeds itself in my [L.name]!")) SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded) hitpush = FALSE @@ -313,68 +314,6 @@ apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, "slash", damage = damage)) return 1 -/mob/living/carbon/human/attack_alien(mob/living/carbon/alien/humanoid/M) - if(check_shields(M, 0, "the M.name")) - visible_message(span_danger("[M] attempts to touch [src]!"), \ - span_danger("[M] attempts to touch you!"), span_hear("I hear a swoosh!"), null, M) - to_chat(M, span_warning("I attempt to touch [src]!")) - return 0 - - if(..()) - if(M.used_intent.type == INTENT_HARM) - if (wear_pants) - wear_pants.add_fingerprint(M) - var/damage = prob(90) ? 20 : 0 - if(!damage) - playsound(loc, 'sound/blank.ogg', 50, TRUE, -1) - visible_message(span_danger("[M] lunges at [src]!"), \ - span_danger("[M] lunges at you!"), span_hear("I hear a swoosh!"), null, M) - to_chat(M, span_danger("I lunge at [src]!")) - return 0 - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) - if(!affecting) - affecting = get_bodypart(BODY_ZONE_CHEST) - var/armor_block = run_armor_check(affecting, "slash","","",10) - - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - visible_message(span_danger("[M] slashes at [src]!"), \ - span_danger("[M] slashes at you!"), span_hear("I hear a sickening sound of a slice!"), null, M) - to_chat(M, span_danger("I slash at [src]!")) - log_combat(M, src, "attacked") - if(!dismembering_strike(M, M.zone_selected)) //Dismemberment successful - return 1 - apply_damage(damage, BRUTE, affecting, armor_block) - - if(M.used_intent.type == INTENT_DISARM) //Always drop item in hand, if no item, get stun instead. - var/obj/item/I = get_active_held_item() - if(I && dropItemToGround(I)) - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - visible_message(span_danger("[M] disarms [src]!"), \ - span_danger("[M] disarms you!"), span_hear("I hear aggressive shuffling!"), null, M) - to_chat(M, span_danger("I disarm [src]!")) - else - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - Paralyze(100) - log_combat(M, src, "tackled") - visible_message(span_danger("[M] tackles [src] down!"), \ - span_danger("[M] tackles you down!"), span_hear("I hear aggressive shuffling followed by a loud thud!"), null, M) - to_chat(M, span_danger("I tackle [src] down!")) - - -/mob/living/carbon/human/attack_larva(mob/living/carbon/alien/larva/L) - - if(..()) //successful larva bite. - var/damage = rand(1, 3) - if(check_shields(L, damage, "the [L.name]")) - return 0 - if(stat != DEAD) - L.amount_grown = min(L.amount_grown + damage, L.max_grown) - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(L.zone_selected)) - if(!affecting) - affecting = get_bodypart(BODY_ZONE_CHEST) - var/armor_block = run_armor_check(affecting, "stab") - apply_damage(damage, BRUTE, affecting, armor_block) - /mob/living/carbon/human/attack_animal(mob/living/simple_animal/M) . = ..() diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 17e8f38ba54..0c36bea12c8 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -8,12 +8,10 @@ /mob/living/carbon/human/check_language_hear(language) if(!language) return - if(wear_neck) - if(istype(wear_neck, /obj/item/clothing/neck/roguetown/talkstone)) - return TRUE - if(!has_language(language)) - if(has_flaw(/datum/charflaw/paranoid)) - add_stress(/datum/stressevent/paratalk) + if(istype(wear_neck, /obj/item/clothing/neck/roguetown/talkstone)) + return TRUE + if(!has_language(language) && has_flaw(/datum/charflaw/paranoid)) + add_stress(/datum/stressevent/paratalk) /mob/living/carbon/human/canBeHandcuffed() diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 767f57f39a7..9ede715f204 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -298,7 +298,8 @@ dropItemToGround(beltr, TRUE, silent = FALSE) dropItemToGround(beltl, TRUE, silent = FALSE) var/obj/item/storage/S = I - S.emptyStorage() + if(istype(S)) + S.emptyStorage() belt = null if(!QDELETED(src)) update_inv_belt() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 01984d428a4..2a5a50734e3 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -47,54 +47,47 @@ for(var/datum/mutation/human/HM in dna.mutations) // Handle active genes HM.on_life() - if(mode == AI_OFF) - handle_vamp_dreams() - if(IsSleeping()) - if(health > 0) - if(has_status_effect(/datum/status_effect/debuff/sleepytime)) - tiredness = 0 - remove_status_effect(/datum/status_effect/debuff/sleepytime) - if(mind) - mind.sleep_adv.advance_cycle() - var/datum/game_mode/chaosmode/C = SSticker.mode - if(istype(C)) - if(mind) - if(!mind.antag_datums || !mind.antag_datums.len) - allmig_reward++ - to_chat(src, span_danger("Nights Survived: \Roman[allmig_reward]")) - if(C.allmig) - if(allmig_reward > 3) - adjust_triumphs(1) - if(has_status_effect(/datum/status_effect/debuff/trainsleep)) - remove_status_effect(/datum/status_effect/debuff/trainsleep) - if(HAS_TRAIT(src, TRAIT_LEPROSY)) - if(!mob_timers["leper_bleed"] || mob_timers["leper_bleed"] + 6 MINUTES < world.time) - if(prob(10)) - to_chat(src, span_warning("My skin opens up and bleeds...")) - mob_timers["leper_bleed"] = world.time - var/obj/item/bodypart/part = pick(bodyparts) - if(part) - part.add_wound(/datum/wound/slash) - adjustToxLoss(0.3) - //heart attack stuff - handle_curses() - handle_heart() - handle_liver() - update_rogfat() - update_rogstam() - if(charflaw && !charflaw.ephemeral) - charflaw.flaw_on_life(src) - if(health <= 0) - adjustOxyLoss(0.3) - if(!client && !HAS_TRAIT(src, TRAIT_NOSLEEP)) - if(mob_timers["slo"]) - if(world.time > mob_timers["slo"] + 90 SECONDS) - Sleeping(100) - else - mob_timers["slo"] = world.time + handle_vamp_dreams() + if(IsSleeping() && health > 0) + if(has_status_effect(/datum/status_effect/debuff/sleepytime)) + tiredness = 0 + remove_status_effect(/datum/status_effect/debuff/sleepytime) + if(mind) + mind.sleep_adv.advance_cycle() + var/datum/game_mode/chaosmode/C = SSticker.mode + if(istype(C) && mind && !length(mind.antag_datums)) + allmig_reward++ + to_chat(src, span_danger("Nights Survived: \Roman[allmig_reward]")) + if(C.allmig && allmig_reward > 3) + adjust_triumphs(1) + if(has_status_effect(/datum/status_effect/debuff/trainsleep)) + remove_status_effect(/datum/status_effect/debuff/trainsleep) + if(HAS_TRAIT(src, TRAIT_LEPROSY)) + if(!mob_timers["leper_bleed"] || mob_timers["leper_bleed"] + 6 MINUTES < world.time && prob(10)) + to_chat(src, span_warning("My skin opens up and bleeds...")) + mob_timers["leper_bleed"] = world.time + var/obj/item/bodypart/part = pick(bodyparts) + if(part) + part.add_wound(/datum/wound/slash) + adjustToxLoss(0.3) + //heart attack stuff + handle_curses() + handle_heart() + handle_liver() + update_rogfat() + update_rogstam() + if(charflaw && !charflaw.ephemeral) + charflaw.flaw_on_life(src) + if(health <= 0) + adjustOxyLoss(0.3) + if(mode == AI_OFF && !sexcon.current_action && !client && !HAS_TRAIT(src, TRAIT_NOSLEEP)) + if(mob_timers["slo"]) + if(world.time > mob_timers["slo"] + 90 SECONDS) + Sleeping(100) else - if(mob_timers["slo"]) - mob_timers["slo"] = null + mob_timers["slo"] = world.time + else if(mob_timers["slo"]) + mob_timers["slo"] = null if(dna?.species) dna.species.spec_life(src) // for mutantraces diff --git a/code/modules/mob/living/carbon/human/npc/_npc.dm b/code/modules/mob/living/carbon/human/npc/_npc.dm index 0bae2b419fd..c4d7e1c16c5 100644 --- a/code/modules/mob/living/carbon/human/npc/_npc.dm +++ b/code/modules/mob/living/carbon/human/npc/_npc.dm @@ -227,20 +227,20 @@ last_special = world.time + CLICK_CD_BREAKOUT cuff_resist(I) -/mob/living/carbon/human/proc/should_target(mob/living/L) +/mob/living/carbon/human/proc/should_target(mob/living/L, attack_lying = FALSE) if(!L) return FALSE //those are here for proc dependancy. - if(L.lying && !L.get_active_held_item()) //laying with no items in hand, no threat. + if(!attack_lying && L.lying && !L.get_active_held_item()) //laying with no items in hand, no threat. if(prob(4) && L.has_quirk(/datum/quirk/monsterhunter) && erpable) //tiny chance to trigger abuss. fuckcd = 0 return FALSE - var/mob/living/carbon/lcarbon = L - if(istype(lcarbon, /mob/living/carbon)) //leave alone if handcuffed. - if(lcarbon.handcuffed) - if(prob(8) && lcarbon.has_quirk(/datum/quirk/monsterhunter) && erpable) //small chance to trigger abuss. + if(ishuman(L)) //leave alone if handcuffed. + var/mob/living/carbon/human/lhuman = L + if(lhuman.handcuffed) + if(prob(8) && lhuman.has_quirk(/datum/quirk/monsterhunter) && erpable) //small chance to trigger abuss. fuckcd = 0 return FALSE diff --git a/code/modules/mob/living/carbon/human/npc/bum.dm b/code/modules/mob/living/carbon/human/npc/bum.dm index 2aaeaa6cb48..9f9ea89bcd5 100644 --- a/code/modules/mob/living/carbon/human/npc/bum.dm +++ b/code/modules/mob/living/carbon/human/npc/bum.dm @@ -36,9 +36,7 @@ GLOBAL_LIST_INIT(bum_aggro, world.file2list("strings/rt/bumaggrolines.txt")) /mob/living/carbon/human/species/human/northern/bum/Initialize() . = ..() set_species(/datum/species/human/northern) - spawn(10) - after_creation() - //addtimer(CALLBACK(src, PROC_REF(after_creation)), 10) + addtimer(CALLBACK(src, PROC_REF(after_creation)), 1 SECONDS) /mob/living/carbon/human/species/human/northern/bum/after_creation() ..() diff --git a/code/modules/mob/living/carbon/human/npc/goblin.dm b/code/modules/mob/living/carbon/human/npc/goblin.dm index 5faad00cf98..9f572b7bc5e 100644 --- a/code/modules/mob/living/carbon/human/npc/goblin.dm +++ b/code/modules/mob/living/carbon/human/npc/goblin.dm @@ -200,6 +200,7 @@ OFFSET_NECK_F = list(0,-5), OFFSET_MOUTH_F = list(0,-5), OFFSET_BUTT = list(0,-4), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES = list(0,0), OFFSET_UNDIES_F = list(0,0), \ ) + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT var/raceicon = "goblin" fixed_mut_color = "e8b59b" custom_clothes = TRUE @@ -262,6 +263,10 @@ body_overlay = mutable_appearance(icon, "[wear_armor.item_state]", -ARMOR_LAYER) if(body_overlay) standing += body_overlay + if(wear_pants) + body_overlay = mutable_appearance(icon, "[wear_pants.item_state]", -ARMOR_LAYER) + if(body_overlay) + standing += body_overlay if(head) body_overlay = mutable_appearance(icon, "[head.item_state]", -ARMOR_LAYER) if(body_overlay) @@ -273,6 +278,8 @@ /mob/living/carbon/human/species/goblin/update_inv_head() update_wearable() +/mob/living/carbon/human/species/goblin/update_inv_pants() + update_wearable() /mob/living/carbon/human/species/goblin/update_inv_armor() update_wearable() @@ -283,9 +290,7 @@ if(prob(50)) gender = FEMALE . = ..() - spawn(10) - after_creation() - //addtimer(CALLBACK(src, PROC_REF(after_creation)), 10) + addtimer(CALLBACK(src, PROC_REF(after_creation)), 1 SECONDS) /mob/living/carbon/human/species/goblin/handle_combat() if(mode == AI_HUNT) @@ -319,6 +324,8 @@ ADD_TRAIT(src, TRAIT_NOMOOD, TRAIT_GENERIC) ADD_TRAIT(src, TRAIT_NOHUNGER, TRAIT_GENERIC) ADD_TRAIT(src, TRAIT_NOROGSTAM, TRAIT_GENERIC) + ADD_TRAIT(src, TRAIT_HEAVYARMOR, TRAIT_GENERIC) + ADD_TRAIT(src, TRAIT_MEDIUMARMOR, TRAIT_GENERIC) // ADD_TRAIT(src, TRAIT_NOBREATH, TRAIT_GENERIC) // blue breathes underwater, need a new specific one for this maybe organ cheque // ADD_TRAIT(src, TRAIT_TOXIMMUNE, TRAIT_GENERIC) @@ -390,13 +397,13 @@ switch(loadout) if(1) //tribal spear r_hand = /obj/item/rogueweapon/spear/stone - armor = /obj/item/clothing/suit/roguetown/armor/leather/hide/goblin + pants = /obj/item/clothing/under/roguetown/loincloth/goblinloin if(2) //tribal axe r_hand = /obj/item/rogueweapon/stoneaxe - armor = /obj/item/clothing/suit/roguetown/armor/leather/hide/goblin + pants = /obj/item/clothing/under/roguetown/loincloth/goblinloin if(3) //tribal club r_hand = /obj/item/rogueweapon/mace/woodclub - armor = /obj/item/clothing/suit/roguetown/armor/leather/hide/goblin + pants = /obj/item/clothing/under/roguetown/loincloth/goblinloin if(prob(10)) head = /obj/item/clothing/head/roguetown/helmet/leather/goblin if(4) //lightly armored sword/flail/daggers @@ -410,6 +417,7 @@ r_hand = /obj/item/rogueweapon/huntingknife/stoneknife l_hand = /obj/item/rogueweapon/huntingknife/stoneknife armor = /obj/item/clothing/suit/roguetown/armor/leather/goblin + pants = /obj/item/clothing/under/roguetown/loincloth/goblinloin if(prob(80)) head = /obj/item/clothing/head/roguetown/helmet/leather/goblin if(5) //heavy armored sword/flail/shields @@ -428,10 +436,11 @@ if(prob(20)) r_hand = /obj/item/rogueweapon/flail l_hand = /obj/item/rogueweapon/shield/wood + pants = /obj/item/clothing/under/roguetown/loincloth/goblinloin if(6) //tribal club with rope for lewd r_hand = /obj/item/rogueweapon/mace/woodclub l_hand = /obj/item/rope - armor = /obj/item/clothing/suit/roguetown/armor/leather/hide/goblin + //pants = /obj/item/clothing/under/roguetown/loincloth/goblinloin //lewd goblins don't need lioncloths i guess H.seeksfuck = TRUE @@ -506,9 +515,7 @@ return spawning = TRUE update_icon() - spawn(2 SECONDS) - creategob() - //addtimer(CALLBACK(src, PROC_REF(creategob)), 4 SECONDS) + addtimer(CALLBACK(src, PROC_REF(creategob)), 2 SECONDS) /obj/structure/gob_portal/Destroy() soundloop.stop() diff --git a/code/modules/mob/living/carbon/human/npc/orc_raider.dm b/code/modules/mob/living/carbon/human/npc/orc_raider.dm index 8a6d7068f7c..7e4c4db7683 100644 --- a/code/modules/mob/living/carbon/human/npc/orc_raider.dm +++ b/code/modules/mob/living/carbon/human/npc/orc_raider.dm @@ -47,9 +47,7 @@ GLOBAL_LIST_INIT(orcraider_aggro, world.file2list("strings/rt/orcraideraggroline . = ..() set_species(/datum/species/halforc) skin_tone = SKIN_COLOR_GROONN - spawn(10) - after_creation() - //addtimer(CALLBACK(src, PROC_REF(after_creation)), 10) + addtimer(CALLBACK(src, PROC_REF(after_creation)), 10) /mob/living/carbon/human/species/halforc/orc_raider/after_creation() diff --git a/code/modules/mob/living/carbon/human/npc/searaider.dm b/code/modules/mob/living/carbon/human/npc/searaider.dm index e8b429c28f7..873226c1f73 100644 --- a/code/modules/mob/living/carbon/human/npc/searaider.dm +++ b/code/modules/mob/living/carbon/human/npc/searaider.dm @@ -40,9 +40,7 @@ GLOBAL_LIST_INIT(searaider_aggro, world.file2list("strings/rt/searaideraggroline /mob/living/carbon/human/species/human/northern/searaider/Initialize() . = ..() set_species(/datum/species/human/northern) - spawn(10) - after_creation() - //addtimer(CALLBACK(src, PROC_REF(after_creation)), 10) + addtimer(CALLBACK(src, PROC_REF(after_creation)), 10) /mob/living/carbon/human/species/human/northern/searaider/after_creation() diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 7585032ca15..30c916d82d0 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1651,6 +1651,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) I.take_damage(1, BRUTE, I.d_type) if(!nodmg) var/datum/wound/crit_wound = affecting.bodypart_attacked_by(user.used_intent.blade_class, (Iforce * weakness) * ((100-(armor_block+armor))/100), user, selzone, crit_message = TRUE) + SEND_SIGNAL(I, COMSIG_APPLY_REAGENTS, affecting.owner, user) if(should_embed_weapon(crit_wound, I)) var/can_impale = TRUE if(!affecting) diff --git a/code/modules/mob/living/carbon/human/species_types/furry/akula.dm b/code/modules/mob/living/carbon/human/species_types/furry/akula.dm index ad42b12ea6a..715c9638132 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/akula.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/akula.dm @@ -30,15 +30,7 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list( - "strength" = 1, - "perception" = 0, - "intelligence" = -1, - "constitution" = 1, - "endurance" = 1, - "speed" = 1, - "fortune" = 1 - ) + race_bonus = list(STAT_ENDURANCE = 1) enflamed_icon = "widefire" attack_verb = "slash" attack_sound = 'sound/blank.ogg' diff --git a/code/modules/mob/living/carbon/human/species_types/furry/anthromorph.dm b/code/modules/mob/living/carbon/human/species_types/furry/anthromorph.dm index 03171d4a44b..f25b0b053be 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/anthromorph.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/anthromorph.dm @@ -47,8 +47,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 0, "perception" = 1, "intelligence" = -1, "constitution" = 0, "endurance" = 1, "speed" = -1, "fortune" = 0) - specstats_f = list("strength" = -1, "perception" = 0, "intelligence" = 2, "constitution" = -1, "endurance" = 0, "speed" = 1, "fortune" = 0) race_bonus = list(STAT_PERCEPTION = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/furry/anthromorphbig.dm b/code/modules/mob/living/carbon/human/species_types/furry/anthromorphbig.dm index c66b5feabca..cb6141c0332 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/anthromorphbig.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/anthromorphbig.dm @@ -43,8 +43,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = 0, "endurance" = 1, "speed" = 1, "fortune" = 0) - specstats_f = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = 0, "endurance" = 1, "speed" = 1, "fortune" = 0) race_bonus = list(STAT_CONSTITUTION = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm b/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm index d726d7e24df..d8f625a734e 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm @@ -43,9 +43,7 @@ OFFSET_NECK_F = list(0,-5), OFFSET_MOUTH_F = list(0,-5), OFFSET_BUTT = list(0,-4), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES = list(0,-4), OFFSET_UNDIES_F = list(0,-4), \ ) - specstats = list("strength" = -3, "perception" = 2, "intelligence" = 2, "constitution" = -1, "endurance" = 0, "speed" = 2, "fortune" = 1) - specstats_f = list("strength" = -3, "perception" = 2, "intelligence" = 2, "constitution" = -1, "endurance" = 0, "speed" = 2, "fortune" = 1) - race_bonus = list(STAT_ENDURANCE = 1) + race_bonus = list(STAT_FORTUNE = 1) enflamed_icon = "widefire" organs = list( ORGAN_SLOT_BRAIN = /obj/item/organ/brain, diff --git a/code/modules/mob/living/carbon/human/species_types/furry/demihuman.dm b/code/modules/mob/living/carbon/human/species_types/furry/demihuman.dm index 55c8ce3b601..64a7e4c36c2 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/demihuman.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/demihuman.dm @@ -44,8 +44,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = 0, "endurance" = 1, "speed" = 1, "fortune" = 0) - specstats_f = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = 0, "endurance" = 1, "speed" = 1, "fortune" = 0) race_bonus = list(STAT_PERCEPTION = 1) enflamed_icon = "widefire" bodypart_features = list( diff --git a/code/modules/mob/living/carbon/human/species_types/furry/dracon.dm b/code/modules/mob/living/carbon/human/species_types/furry/dracon.dm index aa6a412c28d..92ef77bd75f 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/dracon.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/dracon.dm @@ -30,8 +30,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 2, "perception" = -2, "intelligence" = 1, "constitution" = 2, "endurance" = 1, "speed" = 1, "fortune" = 1) - specstats_f = list("strength" = 2, "perception" = -2, "intelligence" = 1, "constitution" = 2, "endurance" = 1, "speed" = 1, "fortune" = 1) race_bonus = list(STAT_CONSTITUTION = 1) enflamed_icon = "widefire" attack_verb = "slash" diff --git a/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm b/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm index b76b83ed91f..9567f527ac0 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm @@ -36,9 +36,7 @@ OFFSET_NECK_F = list(0,-5), OFFSET_MOUTH_F = list(0,-5), OFFSET_BUTT = list(0,-4), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES = list(0,-4), OFFSET_UNDIES_F = list(0,-4), \ ) - specstats = list("strength" = -1, "perception" = 1, "intelligence" = -2, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) - specstats_f = list("strength" = -2, "perception" = 0, "intelligence" = 1, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) - race_bonus = list(STAT_INTELLIGENCE = 1) + race_bonus = list(STAT_FORTUNE = 1) enflamed_icon = "widefire" attack_verb = "slash" attack_sound = 'sound/blank.ogg' @@ -47,7 +45,7 @@ ORGAN_SLOT_BRAIN = /obj/item/organ/brain, ORGAN_SLOT_HEART = /obj/item/organ/heart, ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, - ORGAN_SLOT_EYES = /obj/item/organ/eyes, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/half_darksight, // The eyes get replaced by the customizer, so this is here for a backup or in case of admin shenanigans ORGAN_SLOT_EARS = /obj/item/organ/ears, ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/lizard, ORGAN_SLOT_LIVER = /obj/item/organ/liver, @@ -60,7 +58,7 @@ ORGAN_SLOT_HORNS = /obj/item/organ/horns, ) customizers = list( - /datum/customizer/organ/eyes/humanoid, + /datum/customizer/organ/eyes/half_darksight, /datum/customizer/bodypart_feature/hair/head/humanoid/bald_default, /datum/customizer/bodypart_feature/hair/facial/humanoid/shaved_default, /datum/customizer/bodypart_feature/accessory, diff --git a/code/modules/mob/living/carbon/human/species_types/furry/lizardfolk.dm b/code/modules/mob/living/carbon/human/species_types/furry/lizardfolk.dm index 390fe99edd5..eff22121a5c 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/lizardfolk.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/lizardfolk.dm @@ -32,8 +32,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 2, "perception" = 0, "intelligence" = -1, "constitution" = 1, "endurance" = 1, "speed" = 1, "fortune" = 0) - specstats_f = list("strength" = 2, "perception" = 0, "intelligence" = -1, "constitution" = 1, "endurance" = 1, "speed" = 1, "fortune" = 0) race_bonus = list(STAT_CONSTITUTION = 1) enflamed_icon = "widefire" attack_verb = "slash" diff --git a/code/modules/mob/living/carbon/human/species_types/furry/lupian.dm b/code/modules/mob/living/carbon/human/species_types/furry/lupian.dm index 939f0d58129..08572c79c8b 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/lupian.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/lupian.dm @@ -42,15 +42,13 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 2, "perception" = -2, "intelligence" = 0, "constitution" = 1, "endurance" = 1, "speed" = 0, "fortune" = 0) //0 total - specstats_f = list("strength" = 2, "perception" = -2, "intelligence" = 0, "constitution" = 1, "endurance" = 1, "speed" = 0, "fortune" = 0) //0 total race_bonus = list(STAT_INTELLIGENCE = 1) enflamed_icon = "widefire" organs = list( ORGAN_SLOT_BRAIN = /obj/item/organ/brain, ORGAN_SLOT_HEART = /obj/item/organ/heart, ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, - ORGAN_SLOT_EYES = /obj/item/organ/eyes, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/half_darksight, // The eyes get replaced by the customizer, so this is here for a backup or in case of admin shenanigans. ORGAN_SLOT_EARS = /obj/item/organ/ears/lupian, ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, ORGAN_SLOT_LIVER = /obj/item/organ/liver, @@ -65,7 +63,7 @@ /datum/bodypart_feature/hair/facial, ) customizers = list( - /datum/customizer/organ/eyes/humanoid, + /datum/customizer/organ/eyes/half_darksight, /datum/customizer/bodypart_feature/hair/head/humanoid, /datum/customizer/bodypart_feature/hair/facial/humanoid, /datum/customizer/bodypart_feature/accessory, diff --git a/code/modules/mob/living/carbon/human/species_types/furry/moth.dm b/code/modules/mob/living/carbon/human/species_types/furry/moth.dm index fd9b25a3a51..14a02c5081a 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/moth.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/moth.dm @@ -29,8 +29,6 @@ OFFSET_NECK_F = list(0,0), OFFSET_MOUTH_F = list(0,0), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1) ) - specstats = list("strength" = -1, "perception" = 1, "intelligence" = 2, "constitution" = -2, "endurance" = 1, "speed" = 1, "fortune" = 1) - specstats_f = list("strength" = -1, "perception" = 1, "intelligence" = 2, "constitution" = -2, "endurance" = 1, "speed" = 1, "fortune" = 1) race_bonus = list(STAT_INTELLIGENCE = 1) enflamed_icon = "widefire" attack_verb = "slash" diff --git a/code/modules/mob/living/carbon/human/species_types/furry/tabaxi.dm b/code/modules/mob/living/carbon/human/species_types/furry/tabaxi.dm index 8fb1ee66c1b..ce9c0163c4d 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/tabaxi.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/tabaxi.dm @@ -36,15 +36,13 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1) ) - specstats = list("strength" = -1, "perception" = 1, "intelligence" = 1, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) - specstats_f = list("strength" = -1, "perception" = 1, "intelligence" = 1, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) race_bonus = list(STAT_CONSTITUTION = 1) enflamed_icon = "widefire" organs = list( ORGAN_SLOT_BRAIN = /obj/item/organ/brain, ORGAN_SLOT_HEART = /obj/item/organ/heart, ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, - ORGAN_SLOT_EYES = /obj/item/organ/eyes, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/half_darksight, // The eyes get replaced by the customizer, so this is here for a backup or in case of admin shenanigans ORGAN_SLOT_EARS = /obj/item/organ/ears/tabaxi, ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, ORGAN_SLOT_LIVER = /obj/item/organ/liver, @@ -59,7 +57,7 @@ /datum/bodypart_feature/hair/facial, ) customizers = list( - /datum/customizer/organ/eyes/humanoid, + /datum/customizer/organ/eyes/half_darksight, /datum/customizer/bodypart_feature/hair/head/humanoid, /datum/customizer/bodypart_feature/hair/facial/humanoid, /datum/customizer/bodypart_feature/accessory, diff --git a/code/modules/mob/living/carbon/human/species_types/furry/vulpkanin.dm b/code/modules/mob/living/carbon/human/species_types/furry/vulpkanin.dm index bfe166fc1dc..f950991c865 100644 --- a/code/modules/mob/living/carbon/human/species_types/furry/vulpkanin.dm +++ b/code/modules/mob/living/carbon/human/species_types/furry/vulpkanin.dm @@ -34,15 +34,13 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = -1, "perception" = 2, "intelligence" = 2, "constitution" = -1, "endurance" = 0, "speed" = 1, "fortune" = 2) - specstats_f = list("strength" = -1, "perception" = 2, "intelligence" = 2, "constitution" = -1, "endurance" = 0, "speed" = 1, "fortune" = 2) race_bonus = list(STAT_INTELLIGENCE = 1) enflamed_icon = "widefire" organs = list( ORGAN_SLOT_BRAIN = /obj/item/organ/brain, ORGAN_SLOT_HEART = /obj/item/organ/heart, ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, - ORGAN_SLOT_EYES = /obj/item/organ/eyes, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/half_darksight, // The eyes get replaced by the customizer, so this is here for a backup or in case of admin shenanigans. ORGAN_SLOT_EARS = /obj/item/organ/ears/vulpkanin, ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, ORGAN_SLOT_LIVER = /obj/item/organ/liver, @@ -57,7 +55,7 @@ /datum/bodypart_feature/hair/facial, ) customizers = list( - /datum/customizer/organ/eyes/humanoid, + /datum/customizer/organ/eyes/half_darksight, /datum/customizer/bodypart_feature/hair/head/humanoid/vulpkian, /datum/customizer/bodypart_feature/hair/facial/humanoid, /datum/customizer/bodypart_feature/accessory, diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 6a8a12b302d..6ad932ac39e 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -273,17 +273,6 @@ C.weather_immunities -= "ash" C.weather_immunities -= "lava" -//Fast and regenerates... but can only speak like an abductor -/datum/species/golem/alloy - name = "Alien Alloy Golem" - id = "alloy golem" - fixed_mut_color = "333" - meat = /obj/item/stack/sheet/mineral/abductor - speedmod = 1 //faster - info_text = "As an Alloy Golem, you are made of advanced alien materials: you are faster and regenerate over time. You are, however, only able to be heard by other alloy golems." - prefix = "Alien" - special_names = list("Outsider", "Technology", "Watcher", "Stranger") //ominous and unknown - //Regenerates because self-repairing super-advanced alien tech /datum/species/golem/alloy/spec_life(mob/living/carbon/human/H) if(H.stat == DEAD) @@ -971,7 +960,7 @@ /datum/action/innate/bonechill/Activate() if(world.time < last_use + cooldown) - to_chat(span_warning("I aren't ready yet to rattle my bones again!")) + to_chat(owner, span_warning("I'm not ready yet to rattle my bones again!")) return owner.visible_message(span_warning("[owner] rattles [owner.p_their()] bones harrowingly."), span_notice("I rattle my bones")) last_use = world.time diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/_dwarf.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/_dwarf.dm index 6b2dc3d7312..19542a531f9 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/_dwarf.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/_dwarf.dm @@ -9,6 +9,7 @@ /datum/language/common, /datum/language/dwarvish ) + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT /datum/species/dwarf/on_species_gain(mob/living/carbon/C, datum/species/old_species) ..() diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/dwarfm.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/dwarfm.dm index 6c8b23e095e..eeaab60e9e2 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/dwarfm.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/dwarfm.dm @@ -45,12 +45,10 @@ OFFSET_NECK_F = list(0,-5), OFFSET_MOUTH_F = list(0,-5), OFFSET_BUTT = list(0,-4), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES = list(0,-4), OFFSET_UNDIES_F = list(0,-4), \ ) - specstats = list("strength" = 1, "perception" = -2, "intelligence" = 0, "constitution" = 2, "endurance" = 2, "speed" = -3, "fortune" = 0) - specstats_f = list("strength" = 1, "perception" = -2, "intelligence" = 0, "constitution" = 2, "endurance" = 1, "speed" = -2, "fortune" = 0) race_bonus = list(STAT_CONSTITUTION = 1) enflamed_icon = "widefire" customizers = list( - /datum/customizer/organ/eyes/humanoid, + /datum/customizer/organ/eyes/full_darksight, /datum/customizer/bodypart_feature/hair/head/humanoid, /datum/customizer/bodypart_feature/hair/facial/humanoid, /datum/customizer/bodypart_feature/accessory, diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/elf/_elf.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/elf/_elf.dm index b0fa2f18723..3acb778c4ca 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/elf/_elf.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/elf/_elf.dm @@ -9,7 +9,7 @@ ORGAN_SLOT_BRAIN = /obj/item/organ/brain, ORGAN_SLOT_HEART = /obj/item/organ/heart, ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, - ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision/elf, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision/full_darksight, ORGAN_SLOT_EARS = /obj/item/organ/ears, ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, ORGAN_SLOT_LIVER = /obj/item/organ/liver, @@ -21,6 +21,7 @@ /datum/language/common, /datum/language/elvish ) + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT /datum/species/elf/on_species_gain(mob/living/carbon/C, datum/species/old_species) ..() diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfd.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfd.dm index 9f089d70a03..b86461adb91 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfd.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfd.dm @@ -58,15 +58,13 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 0, "perception" = -1, "intelligence" = 2, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) - specstats_f = list("strength" = 0, "perception" = -1, "intelligence" = 2, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) race_bonus = list(STAT_PERCEPTION = 1) enflamed_icon = "widefire" organs = list( ORGAN_SLOT_BRAIN = /obj/item/organ/brain, ORGAN_SLOT_HEART = /obj/item/organ/heart, ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, - ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision/elf, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision/full_darksight, ORGAN_SLOT_EARS = /obj/item/organ/ears/elf, ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, ORGAN_SLOT_LIVER = /obj/item/organ/liver, @@ -79,7 +77,7 @@ /datum/bodypart_feature/hair/facial, ) customizers = list( - /datum/customizer/organ/eyes/elf, + /datum/customizer/organ/eyes/full_darksight, /datum/customizer/bodypart_feature/hair/head/humanoid, /datum/customizer/bodypart_feature/hair/facial/humanoid, /datum/customizer/bodypart_feature/accessory, diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfs.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfs.dm index fd31a4952a9..b38e9e2fd7e 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfs.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/elf/elfs.dm @@ -45,15 +45,13 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = -2, "perception" = 2, "intelligence" = 2, "constitution" = -2, "endurance" = 1, "speed" = 3, "fortune" = 0) - specstats_f = list("strength" = -2, "perception" = 2, "intelligence" = 2, "constitution" = -2, "endurance" = 1, "speed" = 3, "fortune" = 0) race_bonus = list(STAT_ENDURANCE = 1) enflamed_icon = "widefire" organs = list( ORGAN_SLOT_BRAIN = /obj/item/organ/brain, ORGAN_SLOT_HEART = /obj/item/organ/heart, ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, - ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision/elf, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision/full_darksight, // The eyes get replaced by the customizer, so this is here for a backup or in case of admin shenanigans ORGAN_SLOT_EARS = /obj/item/organ/ears/elfw, ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, ORGAN_SLOT_LIVER = /obj/item/organ/liver, @@ -66,7 +64,7 @@ /datum/bodypart_feature/hair/facial, ) customizers = list( - /datum/customizer/organ/eyes/elf, + /datum/customizer/organ/eyes/full_darksight, /datum/customizer/bodypart_feature/hair/head/humanoid, /datum/customizer/bodypart_feature/hair/facial/humanoid, /datum/customizer/bodypart_feature/accessory, diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/goblin/goblinp.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/goblin/goblinp.dm index 6c966709f54..6d0caeeabbc 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/goblin/goblinp.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/goblin/goblinp.dm @@ -45,8 +45,6 @@ OFFSET_NECK_F = list(0,-5), OFFSET_MOUTH_F = list(0,-5), OFFSET_BUTT = list(0,-4), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES = list(0,0), OFFSET_UNDIES_F = list(0,0), \ ) - specstats = list("strength" = -1, "perception" = 1, "intelligence" = -2, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) - specstats_f = list("strength" = -2, "perception" = 0, "intelligence" = 1, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = 0) race_bonus = list(STAT_ENDURANCE = 1) enflamed_icon = "widefire" attack_verb = "slash" diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/human/_human.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/human/_human.dm index 843abdda5c5..e598571a96a 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/human/_human.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/human/_human.dm @@ -1,6 +1,7 @@ /datum/species/human name = "Humanb" id = "human" + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT /datum/species/human/on_species_gain(mob/living/carbon/C, datum/species/old_species) . = ..() diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/human/humen.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/human/humen.dm index 4e5e65afd6d..98386fd0dfb 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/human/humen.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/human/humen.dm @@ -41,8 +41,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 1, "perception" = 1, "intelligence" = 2, "constitution" = 1, "endurance" = 1, "speed" = 0, "fortune" = 0) - specstats_f = list("strength" = 1, "perception" = 1, "intelligence" = 2, "constitution" = 1, "endurance" = 1, "speed" = 0, "fortune" = 0) race_bonus = list(STAT_INTELLIGENCE = 1) enflamed_icon = "widefire" customizers = list( diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/aasimar.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/aasimar.dm index f98bce0f654..71afffb2853 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/aasimar.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/aasimar.dm @@ -43,8 +43,6 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 1, "perception" = 1, "intelligence" = 2, "constitution" = -1, "endurance" = -1, "speed" = 1, "fortune" = 1) - specstats_f = list("strength" = 1, "perception" = 1, "intelligence" = 2, "constitution" = -1, "endurance" = -1, "speed" = 1, "fortune" = 1) race_bonus = list(STAT_ENDURANCE = 1) enflamed_icon = "widefire" customizers = list( diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/brazillian.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/brazillian.dm deleted file mode 100644 index 97335315017..00000000000 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/brazillian.dm +++ /dev/null @@ -1,94 +0,0 @@ -/mob/living/carbon/human/species/brazillian - race = /datum/species/lizard/brazil - -/datum/species/lizard/brazil - name = "Argonian" - id = "argonian" - desc = "Argonian
    \ - A mysterious species of reptilian humanoids hailing from bogs all over Enigma. \ - They speak a strange tongue and are said to be a creation of Dendor himself." - - skin_tone_wording = "Bog" - - species_traits = list(EYECOLOR,LIPS) - inherent_traits = list(TRAIT_NOMOBSWAP,TRAIT_RETARD_ANATOMY,TRAIT_NASTY_EATER) - use_skintones = TRUE - disliked_food = NONE - liked_food = NONE - possible_ages = ALL_AGES_LIST - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT - limbs_icon_m = 'icons/roguetown/mob/bodies/m/ma.dmi' - limbs_icon_f = 'icons/roguetown/mob/bodies/f/fa.dmi' - dam_icon = 'icons/roguetown/mob/bodies/dam/dam_male.dmi' - dam_icon_f = 'icons/roguetown/mob/bodies/dam/dam_male.dmi' - soundpack_m = /datum/voicepack/male/elf - soundpack_f = /datum/voicepack/female/elf - exotic_bloodtype = null - default_features = list("tail_lizard" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None") - mutant_bodyparts = list("tail_lizard", "snout", "frills", "spines", "body_markings") - mutanttongue = /obj/item/organ/tongue/lizard - mutanteyes = /obj/item/organ/eyes/night_vision/argonian - specstats = list( - "strength" = 0, - "perception" = 3, - "intelligence" = -3, - "constitution" = 0, - "endurance" = 1, - "speed" = 3, - "fortune" = -3, - ) - specstats_f = list( - "strength" = 0, - "perception" = 3, - "intelligence" = -3, - "constitution" = 0, - "endurance" = 1, - "speed" = 3, - "fortune" = -3, - ) - enflamed_icon = "widefire" - -/datum/species/lizard/brazil/on_species_gain(mob/living/carbon/C, datum/species/old_species) - ..() - RegisterSignal(C, COMSIG_MOB_SAY, PROC_REF(handle_speech)) - -/datum/species/lizard/brazil/on_species_loss(mob/living/carbon/C) - . = ..() - UnregisterSignal(C, COMSIG_MOB_SAY) - -/datum/species/lizard/brazil/qualifies_for_rank(rank, list/features) - return TRUE - -/datum/species/lizard/brazil/get_skin_list() - return list( - "Amazonia" = SKIN_COLOR_AMAZONIA, - "Serra" = SKIN_COLOR_SERRA, - "Aquarela" = SKIN_COLOR_AQUARELA, - "Amor" = SKIN_COLOR_AMOR, - "Sangue" = SKIN_COLOR_SANGUE, - "Lama" = SKIN_COLOR_LAMA, - ) - -/datum/species/lizard/brazil/random_name(gender,unique,lastname) - - var/randname - if(unique) - if(gender == MALE) - for(var/i in 1 to 10) - randname = pick( world.file2list("strings/rt/names/other/argm.txt") ) - if(!findname(randname)) - break - if(gender == FEMALE) - for(var/i in 1 to 10) - randname = pick( world.file2list("strings/rt/names/other/argf.txt") ) - if(!findname(randname)) - break - else - if(gender == MALE) - randname = pick( world.file2list("strings/rt/names/other/argm.txt") ) - if(gender == FEMALE) - randname = pick( world.file2list("strings/rt/names/other/argf.txt") ) - return randname - -/datum/species/lizard/brazil/random_surname() - return " [pick(world.file2list("strings/rt/names/other/arglast.txt"))]" diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/halfelf.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/halfelf.dm index 8c78c3ae890..e8f589df256 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/halfelf.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/halfelf.dm @@ -44,15 +44,13 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = -1) - specstats_f = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = -1, "endurance" = 1, "speed" = 2, "fortune" = -1) race_bonus = list(STAT_PERCEPTION = 1) enflamed_icon = "widefire" organs = list( ORGAN_SLOT_BRAIN = /obj/item/organ/brain, ORGAN_SLOT_HEART = /obj/item/organ/heart, ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, - ORGAN_SLOT_EYES = /obj/item/organ/eyes/halfelf, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/half_darksight, // The eyes get replaced by the customizer, so this is here for a backup or in case of admin shenanigans ORGAN_SLOT_EARS = /obj/item/organ/ears/elfw, ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, ORGAN_SLOT_LIVER = /obj/item/organ/liver, @@ -61,7 +59,7 @@ ORGAN_SLOT_ANUS = /obj/item/organ/filling_organ/anus, ) customizers = list( - /datum/customizer/organ/eyes/humanoid, + /datum/customizer/organ/eyes/half_darksight, /datum/customizer/bodypart_feature/hair/head/humanoid, /datum/customizer/bodypart_feature/hair/facial/humanoid, /datum/customizer/bodypart_feature/accessory, diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/halforc.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/halforc.dm index a5c4244c657..2e7e4eef57a 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/halforc.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/halforc.dm @@ -42,8 +42,6 @@ OFFSET_FACE_F = list(0,1), OFFSET_BELT_F = list(0,1), OFFSET_BACK_F = list(0,1), \ OFFSET_NECK_F = list(0,1), OFFSET_MOUTH_F = list(0,1), OFFSET_PANTS_F = list(0,1), \ OFFSET_SHIRT_F = list(0,1), OFFSET_ARMOR_F = list(0,1), OFFSET_UNDIES_F = list(0,1)) - specstats = list("strength" = 2, "perception" = 1, "intelligence" = -1, "constitution" = 2, "endurance" = 2, "speed" = 0, "fortune" = -2) - specstats_f = list("strength" = 2, "perception" = 1, "intelligence" = -1, "constitution" = 2, "endurance" = 2, "speed" = 0, "fortune" = -2) race_bonus = list(STAT_CONSTITUTION = 1) enflamed_icon = "widefire" organs = list( diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/seelie.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/seelie.dm index 1fd7797c5cf..2f0bf9713fa 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/seelie.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/seelie.dm @@ -17,7 +17,7 @@ //gender = FEMALE species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,STUBBLE,OLDGREY) //Default shit that ever race gets - inherent_traits = list(TRAIT_NOMOBSWAP) //Use this to add custom Fae traits + inherent_traits = list(TRAIT_NOMOBSWAP, TRAIT_EASYDISMEMBER, TRAIT_CRITICAL_WEAKNESS, TRAIT_KNEESTINGER_IMMUNITY, TRAIT_ZJUMP, TRAIT_DODGEEXPERT) //Use this to add custom Fae traits default_features = MANDATORY_FEATURE_LIST use_skintones = 1 skinned_type = /obj/item/stack/sheet/animalhide/human @@ -43,14 +43,8 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,0), \ ) - specstats = list( - "perception" = 4, - "intelligence" = 2, - "constitution" = -1, - "endurance" = 0, - "speed" = 7, - "fortune" = 2 - ) + race_bonus = list(STAT_SPEED = 1) + enflamed_icon = "widefire" organs = list( ORGAN_SLOT_BRAIN = /obj/item/organ/brain, @@ -104,7 +98,7 @@ C.transform = C.transform.Scale(0.5, 0.5) C.update_transform() C.pass_flags = PASSTABLE | PASSMOB - //C.movement_type = FLYING + C.movement_type = FLYING C.set_mob_offsets("pixie_hover", _x = 0, _y = 10) C.set_light(3, 1, "#d4fcac") @@ -123,7 +117,7 @@ C.update_transform() C.pass_flags = 0 C.reset_offsets("pixie_hover") - //C.movement_type = (C.movement_type | ~FLYING) + C.movement_type = (C.movement_type | ~FLYING) //C.Jitter(0) C.set_light(0, 0, null) diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/tiefling.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/tiefling.dm index c1549fd894e..f1b5438d871 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/tiefling.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/tiefling.dm @@ -45,15 +45,13 @@ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \ ) - specstats = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = -1, "endurance" = 1, "speed" = 1, "fortune" = 1) - specstats_f = list("strength" = 0, "perception" = 1, "intelligence" = 2, "constitution" = -1, "endurance" = 1, "speed" = 1, "fortune" = 1) race_bonus = list(STAT_INTELLIGENCE = 1) enflamed_icon = "widefire" organs = list( ORGAN_SLOT_BRAIN = /obj/item/organ/brain, ORGAN_SLOT_HEART = /obj/item/organ/heart, ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, - ORGAN_SLOT_EYES = /obj/item/organ/eyes, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision/full_darksight, // The eyes get replaced by the customizer, so this is here for a backup or in case of admin shenanigans ORGAN_SLOT_EARS = /obj/item/organ/ears/tiefling, ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, ORGAN_SLOT_LIVER = /obj/item/organ/liver, @@ -66,13 +64,15 @@ /datum/bodypart_feature/hair/facial, ) customizers = list( - /datum/customizer/organ/eyes/humanoid, + /datum/customizer/organ/eyes/full_darksight, /datum/customizer/bodypart_feature/hair/head/humanoid, /datum/customizer/bodypart_feature/hair/facial/humanoid, /datum/customizer/bodypart_feature/accessory, /datum/customizer/bodypart_feature/face_detail, + /* /datum/customizer/organ/horns/humanoid/tiefling, /datum/customizer/organ/tail/tiefling, + */ // Duplicates /datum/customizer/bodypart_feature/underwear, /datum/customizer/organ/horns/humanoid/tiefling, /datum/customizer/organ/tail/tiefling, diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/werewolf.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/werewolf.dm index b1cee320592..0ff33121081 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/werewolf.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/werewolf.dm @@ -44,8 +44,6 @@ offset_features = list(OFFSET_HANDS = list(0,2), OFFSET_HANDS_F = list(0,2)) soundpack_m = /datum/voicepack/werewolf soundpack_f = /datum/voicepack/werewolf - specstats = list("strength" = 8, "perception" = 7, "intelligence" = -6, "constitution" = 8, "endurance" = 8, "speed" = 3, "fortune" = 0) - specstats_f = list("strength" = 8, "perception" = 7, "intelligence" = -6, "constitution" = 8, "endurance" = 8, "speed" = 3, "fortune" = 0) race_bonus = list(STAT_STRENGTH = 8, STAT_PERCEPTION = 7, STAT_INTELLIGENCE = -6, STAT_CONSTITUTION = 8, STAT_ENDURANCE = 8, STAT_SPEED = 3) enflamed_icon = "widefire" organs = list( @@ -64,6 +62,7 @@ /datum/language/beast, /datum/language/common, ) + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT /datum/species/werewolf/send_voice(mob/living/carbon/human/H) playsound(get_turf(H), pick('sound/vo/mobs/wwolf/wolftalk1.ogg','sound/vo/mobs/wwolf/wolftalk2.ogg'), 100, TRUE, -1) diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/roguetown_species.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/roguetown_species.dm index ac1759fbc80..b15e389fd57 100644 --- a/code/modules/mob/living/carbon/human/species_types/roguetown/roguetown_species.dm +++ b/code/modules/mob/living/carbon/human/species_types/roguetown/roguetown_species.dm @@ -51,7 +51,7 @@ #define REGEX_ENDWORD 3 #define REGEX_ANY 4 -/datum/species/proc/handle_speech(datum/source, mob/speech_args) +/datum/species/proc/handle_speech(datum/source, list/speech_args) var/message = speech_args[SPEECH_MESSAGE] message = treat_message_accent(message, strings("accent_universal.json", "universal"), REGEX_FULLWORD) diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index 64335a2516f..1e1dbff829e 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -117,17 +117,6 @@ #undef VAMP_DRAIN_AMOUNT - -/mob/living/carbon/Stat() - ..() - return - if(statpanel("Status")) //RTCHANGE - var/obj/item/organ/heart/vampire/darkheart = getorgan(/obj/item/organ/heart/vampire) - if(darkheart) - stat(null, span_notice("Current blood level: [blood_volume]/[BLOOD_VOLUME_MAXIMUM].")) - return 1 - - /obj/item/organ/heart/vampire name = "vampire heart" color = "#1C1C1C" diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index ef4cdd123d9..752a56bfa18 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -724,10 +724,10 @@ There are several things that need to be remembered: if(beltr.experimental_onhip) var/list/prop if(beltr.force_reupdate_inhand) - prop = beltr.onprop["onbelt"] + prop = beltr?.onprop?["onbelt"] if(!prop) - beltr.onprop["onbelt"] = beltr.getonmobprop("onbelt") - prop = beltr.onprop["onbelt"] + prop = beltr.getonmobprop("onbelt") + LAZYSET(beltr.onprop, "onbelt", prop) else prop = beltr.getonmobprop("onbelt") if(prop) @@ -776,10 +776,10 @@ There are several things that need to be remembered: if(beltl.experimental_onhip) var/list/prop if(beltl.force_reupdate_inhand) - prop = beltl.onprop["onbelt"] + prop = beltl.onprop?["onbelt"] if(!prop) - beltl.onprop["onbelt"] = beltl.getonmobprop("onbelt") - prop = beltl.onprop["onbelt"] + prop = beltl.getonmobprop("onbelt") + LAZYSET(beltl.onprop, "onbelt", prop) else prop = beltl.getonmobprop("onbelt") if(prop) @@ -943,10 +943,10 @@ There are several things that need to be remembered: if(backr.experimental_onback) var/list/prop if(backr.force_reupdate_inhand) - prop = backr.onprop["onback"] + prop = backr.onprop?["onback"] if(!prop) - backr.onprop["onback"] = backr.getonmobprop("onback") - prop = backr.onprop["onback"] + prop = backr.getonmobprop("onback") + LAZYSET(backr.onprop, "onback", prop) else prop = backr.getonmobprop("onback") if(prop) @@ -996,10 +996,10 @@ There are several things that need to be remembered: if(backl.experimental_onback) var/list/prop if(backl.force_reupdate_inhand) - prop = backl.onprop["onback"] + prop = backl.onprop?["onback"] if(!prop) - backl.onprop["onback"] = backl.getonmobprop("onback") - prop = backl.onprop["onback"] + prop = backl.getonmobprop("onback") + LAZYSET(backl.onprop, "onback", backl.getonmobprop("onback")) else prop = backl.getonmobprop("onback") if(prop) diff --git a/code/modules/mob/living/carbon/human/voicepacks/genfemale.dm b/code/modules/mob/living/carbon/human/voicepacks/genfemale.dm index 75ec6d61b95..2e711830a71 100644 --- a/code/modules/mob/living/carbon/human/voicepacks/genfemale.dm +++ b/code/modules/mob/living/carbon/human/voicepacks/genfemale.dm @@ -7,6 +7,11 @@ used = getfsilenced(soundin) if(!used) switch(soundin) + if("fart") + if(prob(5)) + used = 'sound/vo/vart (4).ogg' + else + used = 'sound/vo/vart (2).ogg' if("deathgurgle") used = pick('sound/vo/female/gen/deathgurgle (1).ogg','sound/vo/female/gen/deathgurgle (2).ogg','sound/vo/female/gen/deathgurgle (3).ogg') if("agony") diff --git a/code/modules/mob/living/carbon/human/voicepacks/genmale.dm b/code/modules/mob/living/carbon/human/voicepacks/genmale.dm index 2401bcee6ef..ca7035b0dd5 100644 --- a/code/modules/mob/living/carbon/human/voicepacks/genmale.dm +++ b/code/modules/mob/living/carbon/human/voicepacks/genmale.dm @@ -7,6 +7,11 @@ used = getmsilenced(soundin) if(!used) switch(soundin) + if("fart") + if(prob(5)) + used = 'sound/vo/vart (4).ogg' + else + used = 'sound/vo/vart (2).ogg' if("deathgurgle") used = pick('sound/vo/male/gen/deathgurgle (1).ogg','sound/vo/male/gen/deathgurgle (2).ogg','sound/vo/male/gen/deathgurgle (3).ogg') if("agony") diff --git a/code/modules/mob/living/carbon/human/voicepacks/male/evil.dm b/code/modules/mob/living/carbon/human/voicepacks/male/evil.dm index 057a4d1cf89..4cf0bba4f27 100644 --- a/code/modules/mob/living/carbon/human/voicepacks/male/evil.dm +++ b/code/modules/mob/living/carbon/human/voicepacks/male/evil.dm @@ -34,4 +34,4 @@ used = ..(soundin, modifiers) return used -//tyrants, bandits \ No newline at end of file +//tyrants, bandits diff --git a/code/modules/mob/living/carbon/human/voicepacks/male/jester.dm b/code/modules/mob/living/carbon/human/voicepacks/male/jester.dm index 4e6bd1eb740..40506ce2501 100644 --- a/code/modules/mob/living/carbon/human/voicepacks/male/jester.dm +++ b/code/modules/mob/living/carbon/human/voicepacks/male/jester.dm @@ -23,4 +23,4 @@ used = list('sound/vo/male/jester/laugh (1).ogg','sound/vo/male/jester/laugh (2).ogg','sound/vo/male/jester/laugh (3).ogg') if(!used) used = ..(soundin, modifiers) - return used \ No newline at end of file + return used diff --git a/code/modules/mob/living/carbon/human/voicepacks/male/knight.dm b/code/modules/mob/living/carbon/human/voicepacks/male/knight.dm index 51d50edc2de..dd20fda24ec 100644 --- a/code/modules/mob/living/carbon/human/voicepacks/male/knight.dm +++ b/code/modules/mob/living/carbon/human/voicepacks/male/knight.dm @@ -21,4 +21,4 @@ used = ..(soundin, modifiers) return used -//chivalrous warriors \ No newline at end of file +//chivalrous warriors diff --git a/code/modules/mob/living/carbon/human/voicepacks/other/skeleton.dm b/code/modules/mob/living/carbon/human/voicepacks/other/skeleton.dm index 64692001d85..9dfa90b98c8 100644 --- a/code/modules/mob/living/carbon/human/voicepacks/other/skeleton.dm +++ b/code/modules/mob/living/carbon/human/voicepacks/other/skeleton.dm @@ -19,4 +19,4 @@ used = pick('sound/vo/mobs/skel/skeleton_scream (1).ogg','sound/vo/mobs/skel/skeleton_scream (2).ogg','sound/vo/mobs/skel/skeleton_scream (3).ogg','sound/vo/mobs/skel/skeleton_scream (4).ogg','sound/vo/mobs/skel/skeleton_scream (5).ogg') - return used \ No newline at end of file + return used diff --git a/code/modules/mob/living/carbon/human/voicepacks/other/werewolf.dm b/code/modules/mob/living/carbon/human/voicepacks/other/werewolf.dm index fca8a2c5835..b1282f41857 100644 --- a/code/modules/mob/living/carbon/human/voicepacks/other/werewolf.dm +++ b/code/modules/mob/living/carbon/human/voicepacks/other/werewolf.dm @@ -27,4 +27,4 @@ used = pick('sound/vo/mobs/wwolf/idle (1).ogg','sound/vo/mobs/wwolf/idle (2).ogg','sound/vo/mobs/wwolf/sniff.ogg') - return used \ No newline at end of file + return used diff --git a/code/modules/mob/living/carbon/human/voicepacks/other/zombie.dm b/code/modules/mob/living/carbon/human/voicepacks/other/zombie.dm index c81ee2ebb99..b1dd3babe1e 100644 --- a/code/modules/mob/living/carbon/human/voicepacks/other/zombie.dm +++ b/code/modules/mob/living/carbon/human/voicepacks/other/zombie.dm @@ -34,4 +34,4 @@ used = pick('sound/vo/mobs/zombie/f/firescream (1).ogg','sound/vo/mobs/zombie/f/firescream (2).ogg','sound/vo/mobs/zombie/f/firescream (3).ogg') if("rage") used = pick('sound/vo/mobs/zombie/firescream (1).ogg','sound/vo/mobs/zombie/firescream (2).ogg','sound/vo/mobs/zombie/firescream (3).ogg') - return used \ No newline at end of file + return used diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 8bd4e0ada16..22bbc6e1069 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -259,26 +259,6 @@ //Start of a breath chain, calls breathe() /mob/living/carbon/handle_breathing(times_fired) return - var/next_breath = 4 - var/obj/item/organ/lungs/L = getorganslot(ORGAN_SLOT_LUNGS) - var/obj/item/organ/heart/H = getorganslot(ORGAN_SLOT_HEART) - if(L) - if(L.damage > L.high_threshold) - next_breath-- - if(H) - if(H.damage > H.high_threshold) - next_breath-- - - if((times_fired % next_breath) == 0 || failed_last_breath) - breathe() //Breathe per 4 ticks if healthy, down to 2 if our lungs or heart are damaged, unless suffocating - if(failed_last_breath) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "suffocation", /datum/mood_event/suffocation) - else - SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "suffocation") - else - if(istype(loc, /obj/)) - var/obj/location_as_object = loc - location_as_object.handle_internal_lifeform(src,0) //Second link in a breath chain, calls check_breath() /mob/living/carbon/proc/breathe() diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index 3cdf16381f4..38cbb4f0c52 100644 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ b/code/modules/mob/living/carbon/monkey/combat.dm @@ -422,7 +422,7 @@ dropItemToGround(A, TRUE) update_icons() -/mob/living/carbon/monkey/grabbedby(mob/living/carbon/user) +/mob/living/carbon/monkey/grabbedby(mob/living/carbon/user, supress_message = FALSE, item_override) . = ..() if(!IsDeadOrIncap() && pulledby && (mode != MONKEY_IDLE || prob(MONKEY_PULL_AGGRO_PROB))) // nuh uh you don't pull me! if(Adjacent(pulledby)) diff --git a/code/modules/mob/living/carbon/monkey/monkey_defense.dm b/code/modules/mob/living/carbon/monkey/monkey_defense.dm index 2e42e703056..04bc58eaa4e 100644 --- a/code/modules/mob/living/carbon/monkey/monkey_defense.dm +++ b/code/modules/mob/living/carbon/monkey/monkey_defense.dm @@ -17,16 +17,6 @@ var/dmg = rand(1, 5) apply_damage(dmg, BRUTE, affecting) -/mob/living/carbon/monkey/attack_larva(mob/living/carbon/alien/larva/L) - if(..()) //successful larva bite. - var/damage = rand(1, 3) - if(stat != DEAD) - L.amount_grown = min(L.amount_grown + damage, L.max_grown) - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(L.zone_selected)) - if(!affecting) - affecting = get_bodypart(BODY_ZONE_CHEST) - apply_damage(damage, BRUTE, affecting) - /mob/living/carbon/monkey/attack_hand(mob/living/carbon/human/M) if(..()) //To allow surgery to return properly. return @@ -79,57 +69,6 @@ span_danger("[M] disarms you!"), span_hear("I hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, M) to_chat(M, span_danger("I disarm [src]!")) -/mob/living/carbon/monkey/attack_alien(mob/living/carbon/alien/humanoid/M) - if(..()) //if harm or disarm intent. - if (M.used_intent.type == INTENT_HARM) - if ((prob(95) && health > 0)) - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - var/damage = rand(15, 30) - if (damage >= 25) - damage = rand(20, 40) - if(AmountUnconscious() < 300) - Unconscious(rand(200, 300)) - visible_message(span_danger("[M] wounds [name]!"), \ - span_danger("[M] wounds you!"), span_hear("I hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I wound [name]!")) - else - visible_message(span_danger("[M] slashes [name]!"), \ - span_danger("[M] slashes you!"), span_hear("I hear a sickening sound of a slice!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I slash [name]!")) - - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) - log_combat(M, src, "attacked") - if(!affecting) - affecting = get_bodypart(BODY_ZONE_CHEST) - if(!dismembering_strike(M, affecting.body_zone)) //Dismemberment successful - return 1 - apply_damage(damage, BRUTE, affecting) - - else - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - visible_message(span_danger("[M]'s lunge misses [name]!"), \ - span_danger("I avoid [M]'s lunge!"), span_hear("I hear a swoosh!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_warning("My lunge misses [name]!")) - - if (M.used_intent.type == INTENT_DISARM) - var/obj/item/I = null - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - if(prob(95)) - Paralyze(20) - visible_message(span_danger("[M] tackles [name] down!"), \ - span_danger("[M] tackles you down!"), span_hear("I hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I tackle [name] down!")) - else - I = get_active_held_item() - if(dropItemToGround(I)) - visible_message(span_danger("[M] disarms [name]!"), \ - span_danger("[M] disarms you!"), span_hear("I hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I disarm [name]!")) - else - I = null - log_combat(M, src, "disarmed", "[I ? " removing \the [I]" : ""]") - updatehealth() - /mob/living/carbon/monkey/attack_animal(mob/living/simple_animal/M) . = ..() diff --git a/code/modules/mob/living/carbon/rogfatstam.dm b/code/modules/mob/living/carbon/rogfatstam.dm index c8c9650f5cd..504b0077ca1 100644 --- a/code/modules/mob/living/carbon/rogfatstam.dm +++ b/code/modules/mob/living/carbon/rogfatstam.dm @@ -109,7 +109,7 @@ heart_attacking = TRUE shake_camera(src, 1, 3) blur_eyes(10) - var/stuffy = list("ZIZO GRABS MY WEARY HEART!","ARGH! MY HEART BEATS NO MORE!","NO... MY HEART HAS BEAT IT'S LAST!","MY HEART HAS GIVEN UP!","MY HEART BETRAYS ME!","THE METRONOME OF MY LIFE STILLS!") + var/stuffy = list("LEVISHTH GRABS MY WEARY HEART!","ARGH! MY HEART BEATS NO MORE!","NO... MY HEART HAS BEAT IT'S LAST!","MY HEART HAS GIVEN UP!","MY HEART BETRAYS ME!","THE METRONOME OF MY LIFE STILLS!") to_chat(src, span_userdanger("[pick(stuffy)]")) emote("breathgasp", forced = TRUE) addtimer(CALLBACK(src, PROC_REF(adjustOxyLoss), 110), 30) diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm index a4ff5e949fe..2734200d832 100644 --- a/code/modules/mob/living/carbon/say.dm +++ b/code/modules/mob/living/carbon/say.dm @@ -17,4 +17,5 @@ if(T) . = T.could_speak_in_language(dt) else - . = initial(dt.flags) & TONGUELESS_SPEECH + var/datum/language/language_datum = GLOB.language_datum_instances[dt] + . = language_datum.flags & (TONGUELESS_SPEECH | SIGNLANG) diff --git a/code/modules/mob/living/carbon/spirit/spirit_defense.dm b/code/modules/mob/living/carbon/spirit/spirit_defense.dm index faa69499d07..4a5e7457221 100644 --- a/code/modules/mob/living/carbon/spirit/spirit_defense.dm +++ b/code/modules/mob/living/carbon/spirit/spirit_defense.dm @@ -17,16 +17,6 @@ var/dmg = rand(1, 5) apply_damage(dmg, BRUTE, affecting) -/mob/living/carbon/spirit/attack_larva(mob/living/carbon/alien/larva/L) - if(..()) //successful larva bite. - var/damage = rand(1, 3) - if(stat != DEAD) - L.amount_grown = min(L.amount_grown + damage, L.max_grown) - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(L.zone_selected)) - if(!affecting) - affecting = get_bodypart(BODY_ZONE_CHEST) - apply_damage(damage, BRUTE, affecting) - /mob/living/carbon/spirit/attack_hand(mob/living/carbon/human/M) if(..()) //To allow surgery to return properly. return @@ -92,58 +82,6 @@ span_danger("[M] disarms you!"), span_hear("I hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, M) to_chat(M, span_danger("I disarm [src]!")) -/mob/living/carbon/spirit/attack_alien(mob/living/carbon/alien/humanoid/M) - if(..()) //if harm or disarm intent. - if (M.used_intent.type == INTENT_HARM) - if ((prob(95) && health > 0)) - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - var/damage = rand(15, 30) - if (damage >= 25) - damage = rand(20, 40) - if(AmountUnconscious() < 300) - Unconscious(rand(200, 300)) - visible_message(span_danger("[M] wounds [name]!"), \ - span_danger("[M] wounds you!"), span_hear("I hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I wound [name]!")) - else - visible_message(span_danger("[M] slashes [name]!"), \ - span_danger("[M] slashes you!"), span_hear("I hear a sickening sound of a slice!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I slash [name]!")) - - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) - log_combat(M, src, "attacked") - if(!affecting) - affecting = get_bodypart(BODY_ZONE_CHEST) - if(!dismembering_strike(M, affecting.body_zone)) //Dismemberment successful - return 1 - apply_damage(damage, BRUTE, affecting) - - else - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - visible_message(span_danger("[M]'s lunge misses [name]!"), \ - span_danger("I avoid [M]'s lunge!"), span_hear("I hear a swoosh!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_warning("My lunge misses [name]!")) - - if (M.used_intent.type == INTENT_DISARM) - var/obj/item/I = null - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - if(prob(95)) - Paralyze(20) - visible_message(span_danger("[M] tackles [name] down!"), \ - span_danger("[M] tackles you down!"), span_hear("I hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I tackle [name] down!")) - else - I = get_active_held_item() - if(dropItemToGround(I)) - visible_message(span_danger("[M] disarms [name]!"), \ - span_danger("[M] disarms you!"), span_hear("I hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I disarm [name]!")) - else - I = null - log_combat(M, src, "disarmed", "[I ? " removing \the [I]" : ""]") - updatehealth() - - /mob/living/carbon/spirit/attack_animal(mob/living/simple_animal/M) . = ..() if(.) diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index d33a0aeafe0..05a875cd88b 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -144,10 +144,10 @@ used_prop = "gen" prop = I.getonmobprop(used_prop) if(I.force_reupdate_inhand) - if(I.onprop[used_prop]) + if(I.onprop?[used_prop]) prop = I.onprop[used_prop] else - I.onprop[used_prop] = prop + LAZYSET(I.onprop, used_prop, prop) if(!prop) continue var/flipsprite = FALSE diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 3bdbcc05581..57962fc609d 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -256,8 +256,6 @@ message = "gasps out their last breath." message_robot = "shudders violently for a moment before falling still, its eyes slowly darkening." message_AI = "screeches, its screen flickering as its systems slowly halt." - message_alien = "lets out a waning guttural screech, and collapses onto the floor..." - message_larva = "lets out a sickly hiss of air and falls limply to the floor..." message_monkey = "lets out a faint chimper as it collapses and stops moving..." message_simple = "falls limp." stat_allowed = UNCONSCIOUS @@ -949,6 +947,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak_vocal()) message = "makes a muffled noise." + else + message = initial(message) /datum/emote/living/clap @@ -1224,6 +1224,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak_vocal()) message = "makes a muffled yawn." + else + message = initial(message) /datum/emote/living/warcry key = "warcry" @@ -1243,6 +1245,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak_vocal()) message = "makes a muffled shout!" + else + message = initial(message) /datum/emote/living/custom key = "me" @@ -1409,6 +1413,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak_vocal()) message = "makes a muffled yip." + else + message = initial(message) /datum/emote/living/yap key = "yap" @@ -1428,6 +1434,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak_vocal()) message = "makes a muffled yap." + else + message = initial(message) /datum/emote/living/coyhowl @@ -1448,6 +1456,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak_vocal()) message = "makes a muffled howl." + else + message = initial(message) /datum/emote/living/snap @@ -1494,6 +1504,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak_vocal()) message = "makes a muffled bark." + else + message = initial(message) /datum/emote/living/whine key = "whine" @@ -1513,6 +1525,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak_vocal()) message = "makes a muffled whine." + else + message = initial(message) /datum/emote/living/cackle key = "cackle" key_third_person = "cackles" @@ -1531,6 +1545,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak_vocal()) message = "makes a muffled cackle." + else + message = initial(message) /datum/emote/living/blink key = "blink" @@ -1563,6 +1579,8 @@ var/mob/living/carbon/C = user if(C.silent || !C.can_speak_vocal()) message = "makes a muffled meow." + else + message = initial(message) /datum/emote/living/hiss key = "hiss" @@ -1575,3 +1593,26 @@ set category = "Noises" emote("hiss", intentional = TRUE) + +/datum/emote/living/fart + key = "fart" + key_third_person = "farts" + message = "lets rip a grand fart, holding a pose as if awaiting applause." + emote_type = EMOTE_AUDIBLE + +/mob/living/carbon/human/verb/emote_fart() + set name = "fart" + set category = "Noises" + + // Define the location based on user's turf + var/location = get_turf(src) + + // 5% chance to shit yourself + if(prob(5)) + emote("fart", intentional = TRUE) + new /obj/item/natural/poo(location) // Spawning the poo item + to_chat(src, "Wow. Did I really just shit myself? I'm a loser just like mom said. This isn't funny anymore....") + apply_status_effect(/datum/status_effect/debuff/bleeding) + else + emote("fart", intentional = TRUE) + diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index a6e37fdccb3..4d9e0af7452 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -53,7 +53,7 @@ //Random events (vomiting etc) handle_random_events() //Handle temperature/pressure differences between body and environment - var/datum/gas_mixture/environment = loc.return_air() + var/datum/gas_mixture/environment = loc?.return_air() if(environment) handle_environment(environment) @@ -76,11 +76,9 @@ if(stat != DEAD) return 1 -/mob/living - var/last_deadlife - /mob/living/proc/DeadLife() set invisibility = 0 + set waitfor = FALSE if (notransform) return if(!loc) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index ae62f6a473a..794cbfcc23b 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -180,23 +180,42 @@ if(!move_failed) return TRUE - if(m_intent == MOVE_INTENT_RUN && dir == get_dir(src, M)) + if(m_intent == MOVE_INTENT_RUN && dir == get_dir(src, M)) // Rebalance of charge code. Taken almost directly from Ratwood. if(isliving(M)) + var/sprint_distance = sprinted_tiles + toggle_rogmove_intent(MOVE_INTENT_WALK, TRUE) + var/mob/living/L = M - var/charge_add = 0 + + var/self_points = FLOOR((STACON + STASTR + mind.get_skill_level(/datum/skill/misc/athletics))/2, 1) + var/target_points = FLOOR((L.STAEND + L.STASTR + L.mind.get_skill_level(/datum/skill/misc/athletics))/2, 1) + + switch(sprint_distance) + // Point blank + if(0 to 1) + self_points -= 4 + // One to two tiles between people - this is the main combat case. + if(2 to 3) + self_points -= 2 + // Five or above tiles between people - 3-4, a viable combat ram with good planning, results in a modifier of 0. + if(6 to INFINITY) + self_points += 3 // This is basically impossible to use in combat unless the other guy's asleep, and I think accidentally knocking over someone is funny, so big bonus. + + // If charging into the BACK of the enemy (facing away) + if(L.dir == get_dir(src, L)) + self_points += 2 + + // Ratwood does not have artificer, but we do. Numbers are basically the same so I'm keeping the old bonus. if(HAS_TRAIT(src, TRAIT_CHARGER)) - charge_add = 3 - if(STACON + charge_add > L.STACON) - if(STASTR + charge_add > L.STASTR) - L.Knockdown(1) - Immobilize(30) - else - Knockdown(1) - Immobilize(30) - if(STACON + charge_add < L.STACON) + self_points += 3 + + // Ratwood has RNG here. No thanks. + + if(self_points > target_points) + L.Knockdown(1) + if(self_points < target_points) Knockdown(30) - Immobilize(30) - if(STACON + charge_add == L.STACON) + if(self_points == target_points) // Exact match will be rare with athletics being fractional. L.Knockdown(1) Knockdown(30) Immobilize(30) @@ -482,40 +501,6 @@ /mob/living/proc/set_pull_offsets(mob/living/M, grab_state = GRAB_PASSIVE) return //rtd fix not updating because no dirchange - if(M == src) - return - if(M.wallpressed) - return - if(M.buckled) - return //don't make them change direction or offset them if they're buckled into something. - var/offset = 0 - switch(grab_state) - if(GRAB_PASSIVE) - offset = GRAB_PIXEL_SHIFT_PASSIVE - if(GRAB_AGGRESSIVE) - offset = GRAB_PIXEL_SHIFT_AGGRESSIVE - if(GRAB_NECK) - offset = GRAB_PIXEL_SHIFT_NECK - if(GRAB_KILL) - offset = GRAB_PIXEL_SHIFT_NECK - M.setDir(get_dir(M, src)) - switch(M.dir) - if(NORTH) - M.set_mob_offsets("pulledby", _x = 0, _y = offset) - if(SOUTH) - M.set_mob_offsets("pulledby", _x = 0, _y = -offset) - if(EAST) - if(M.lying == 270) //update the dragged dude's direction if we've turned - M.lying = 90 - M.update_transform() //force a transformation update, otherwise it'll take a few ticks for update_mobility() to do so - M.lying_prev = M.lying - M.set_mob_offsets("pulledby", _x = offset, _y = 0) - if(WEST) - if(M.lying == 90) - M.lying = 270 - M.update_transform() - M.lying_prev = M.lying - M.set_mob_offsets("pulledby", _x = offset, _y = 0) /mob/living var/list/mob_offsets = list() @@ -602,7 +587,7 @@ return if(!reaper) return - if (InCritical() || health <= 0 || blood_volume in -INFINITY to BLOOD_VOLUME_SURVIVE) + if (InCritical() || health <= 0 || (blood_volume < BLOOD_VOLUME_SURVIVE)) log_message("Has [whispered ? "whispered his final words" : "succumbed to death"] while in [InFullCritical() ? "hard":"soft"] critical with [round(health, 0.1)] points of health!", LOG_ATTACK) adjustOxyLoss(201) updatehealth() @@ -914,6 +899,9 @@ var/old_direction = dir var/turf/T = loc + if(m_intent == MOVE_INTENT_RUN) + sprinted_tiles++ + if(wallpressed) GetComponent(/datum/component/leaning).wallhug_check(T, newloc, direct) @@ -1077,7 +1065,7 @@ else if(last_special <= world.time) resist_restraints() //trying to remove cuffs. -/mob/living/proc/submit(var/instant = FALSE) +/mob/living/proc/submit(instant = FALSE) set name = "Yield" set category = "IC" set hidden = 1 @@ -2030,7 +2018,7 @@ if(!istype(T)) return changeNext_move(CLICK_CD_MELEE) - + var/_x = T.x-loc.x var/_y = T.y-loc.y var/dist = get_dist(src, T) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index fa480c02380..8c6bedcb8e0 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -1,7 +1,9 @@ /mob/living/proc/run_armor_check(def_zone = null, attack_flag = "blunt", absorb_text = null, soften_text = null, armor_penetration, penetrated_text, damage, blade_dulling) var/armor = getarmor(def_zone, attack_flag, damage, armor_penetration, blade_dulling) - src.mob_timers[MT_SNEAKATTACK] = world.time //Stops you from sneaking after being hit. (Should work!) + if(alpha <= 100 || rogue_sneaking) + apply_status_effect(/datum/status_effect/debuff/stealthcd) + mob_timers[MT_SNEAKATTACK] = world.time //Stops you from sneaking after being hit. (Should work!) //the if "armor" check is because this is used for everything on /living, including humans if(armor > 0 && armor_penetration) armor = max(0, armor - armor_penetration) @@ -424,54 +426,6 @@ span_danger("I avoid [M.name]'s bite!"), span_hear("I hear the sound of jaws snapping shut!"), COMBAT_MESSAGE_RANGE, M) to_chat(M, span_warning("My bite misses [src]!")) return FALSE - -/mob/living/attack_larva(mob/living/carbon/alien/larva/L) - switch(L.used_intent.type) - if(INTENT_HELP) - visible_message(span_notice("[L.name] rubs its head against [src]."), \ - span_notice("[L.name] rubs its head against you."), null, null, L) - to_chat(L, span_notice("I rub my head against [src].")) - return FALSE - - else - if(HAS_TRAIT(L, TRAIT_PACIFISM)) - to_chat(L, span_warning("I don't want to hurt anyone!")) - return - - L.do_attack_animation(src) - if(prob(90)) - log_combat(L, src, "attacked") - visible_message(span_danger("[L.name] bites [src]!"), \ - span_danger("[L.name] bites you!"), span_hear("I hear a chomp!"), COMBAT_MESSAGE_RANGE, L) - to_chat(L, span_danger("I bite [src]!")) - playsound(loc, 'sound/blank.ogg', 50, TRUE, -1) - return TRUE - else - visible_message(span_danger("[L.name]'s bite misses [src]!"), \ - span_danger("I avoid [L.name]'s bite!"), span_hear("I hear the sound of jaws snapping shut!"), COMBAT_MESSAGE_RANGE, L) - to_chat(L, span_warning("My bite misses [src]!")) - return FALSE - -/mob/living/attack_alien(mob/living/carbon/alien/humanoid/M) - switch(M.used_intent.type) - if (INTENT_HELP) - visible_message(span_notice("[M] caresses [src] with its scythe-like arm."), \ - span_notice("[M] caresses you with its scythe-like arm."), null, null, M) - to_chat(M, span_notice("I caress [src] with my scythe-like arm.")) - return FALSE - if (INTENT_GRAB) - grabbedby(M) - return FALSE - if(INTENT_HARM) - if(HAS_TRAIT(M, TRAIT_PACIFISM)) - to_chat(M, span_warning("I don't want to hurt anyone!")) - return FALSE - M.do_attack_animation(src) - return TRUE - if(INTENT_DISARM) - M.do_attack_animation(src, ATTACK_EFFECT_DISARM) - return TRUE - /mob/living/attack_hulk(mob/living/carbon/human/user) ..() if(HAS_TRAIT(user, TRAIT_PACIFISM)) @@ -523,7 +477,7 @@ shock_damage *= siemens_coeff if((flags & SHOCK_TESLA) && (flags_1 & TESLA_IGNORE_1)) return FALSE - if(HAS_TRAIT(src, TRAIT_SHOCKIMMUNE)) + if(HAS_TRAIT(src, TRAIT_SHOCKIMMUNE) && !HAS_TRAIT(src, TRAIT_RAVOX_CURSE))//Minhur's ire will make even a Hedgeknight vulnerable to the justice of their fellows return FALSE if(shock_damage < 1) return FALSE diff --git a/code/modules/mob/living/roguetownprocs.dm b/code/modules/mob/living/roguetownprocs.dm index 35dea6664e6..64d6b66c398 100644 --- a/code/modules/mob/living/roguetownprocs.dm +++ b/code/modules/mob/living/roguetownprocs.dm @@ -404,9 +404,9 @@ if(!H?.check_armor_skill()) H.Knockdown(1) return FALSE -//Dreamkeep Change -- Re-enabled alongside the addition of skill-based reduction of parry costs. - if(H?.check_dodge_skill()) - drained = drained - 5 + //Dreamkeep Change -- Re-enabled alongside the addition of skill-based reduction of parry costs. + if(H?.check_dodge_skill()) + drained = drained - 5 if(I) //the enemy attacked us with a weapon if(!I.associated_skill) //the enemy weapon doesn't have a skill because its improvised, so penalty to attack diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index a0200580c00..557db347e62 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -168,11 +168,6 @@ GLOBAL_LIST_INIT(department_radio_keys, list( if(!language) language = get_default_language() - if(language.signlang) - var/mob/M = src - var/emote = pick(language.signlang_verb) - M.emote(emote) - //Detection of language needs to be before inherent channels, because //AIs use inherent channels for the holopad. Most inherent channels //ignore the language argument however. @@ -180,7 +175,10 @@ GLOBAL_LIST_INIT(department_radio_keys, list( if(saymode && !saymode.handle_message(src, message, language)) return - if(!can_speak_vocal(message)) + var/datum/language/language_datum = GLOB.language_datum_instances[language] + if(language_datum.flags & SIGNLANG) + emote(pick(language_datum.signlang_verb), intentional = TRUE) + else if(!can_speak_vocal(message)) // don't block sign languages // visible_message("[src] makes a muffled noise.") to_chat(src, span_warning("I can't talk.")) return @@ -278,11 +276,16 @@ GLOBAL_LIST_INIT(department_radio_keys, list( var/deaf_type if(speaker != src) if(!radio_freq) //These checks have to be seperate, else people talking on the radio will make "You can't hear yourself!" appear when hearing people over the radio while deaf. - deaf_message = "[speaker] [speaker.verb_say] something but you cannot hear [speaker.p_them()]." + deaf_message = "[speaker] [speaker.verb_say] something but I cannot hear [speaker.p_them()]." deaf_type = 1 else - deaf_message = span_notice("I can't hear yourself!") - deaf_type = 2 // Since you should be able to hear myself without looking + deaf_message = span_notice("I can't hear myself!") + deaf_type = 2 // Since you should be able to hear yourself without looking + + if(message_language) + var/datum/language/heard_lang = GLOB.language_datum_instances[message_language] + if(heard_lang?.flags & LANGUAGE_HIDE_NOT_UNDERSTOOD && !has_language(message_language) && !check_language_hear(message_language)) + return // you don't notice a thing... // Create map text prior to modifying message for goonchat if(can_see_runechat(speaker) && can_hear()) @@ -294,41 +297,41 @@ GLOBAL_LIST_INIT(department_radio_keys, list( /mob/living/send_speech(message, message_range = 6, obj/source = src, bubble_type = bubble_icon, list/spans, datum/language/message_language=null, message_mode, original_message) var/static/list/eavesdropping_modes = list(MODE_WHISPER = TRUE, MODE_WHISPER_CRIT = TRUE) + var/is_eavesdroppable = eavesdropping_modes[message_mode] var/eavesdrop_range = 0 var/Zs_too = FALSE - if(eavesdropping_modes[message_mode]) + if(is_eavesdroppable) eavesdrop_range = EAVESDROP_EXTRA_RANGE - if(message_mode != MODE_WHISPER) - if(say_test(message) == "2") //CIT CHANGE - ditto + if(say_test(message) == "2") // shouting + if(!is_eavesdroppable) message_range += 10 Zs_too = TRUE + else // keep your damn voice down! + message_range += 1 + eavesdrop_range += 1 var/list/listening = get_hearers_in_view(message_range+eavesdrop_range, source) var/list/the_dead = list() -// var/list/yellareas //CIT CHANGE - adds the ability for yelling to penetrate walls and echo throughout areas - for(var/_M in GLOB.player_list) - var/mob/M = _M -// if(M.stat != DEAD) //not dead, not important -// if(yellareas) //CIT CHANGE - see above. makes yelling penetrate walls -// var/area/A = get_area(M) //CIT CHANGE - ditto -// if(istype(A) && A.ambientsounds != SPACE && (A in yellareas)) //CIT CHANGE - ditto -// listening |= M //CIT CHANGE - ditto -// continue - if(!client) //client is so that ghosts don't have to listen to mice - continue - if(!M) - continue - if(!M.client) - continue - if(get_dist(M, src) > message_range) //they're out of range of normal hearing - if(M.client.prefs) - if(eavesdropping_modes[message_mode] && !(M.client.prefs.chat_toggles & CHAT_GHOSTWHISPER)) //they're whispering and we have hearing whispers at any range off - continue - if(!(M.client.prefs.chat_toggles & CHAT_GHOSTEARS)) //they're talking normally and we have hearing at any range off - continue - if(!is_in_zweb(src.z, M.z)) - continue - listening |= M - the_dead[M] = TRUE + // fun fact: roguetown broke this which broke eavesdropping on whispers lmao + if(client) //client is so that ghosts don't have to listen to mice + // check this beforehand to make it so simplemobs don't lag us at highpop + for(var/_M in GLOB.player_list) + var/mob/M = _M + if(M.stat != DEAD) //not dead, not important + continue + if(!M?.client) + continue + if(!M.client) + continue + if(get_dist(M, src) > message_range) //they're out of range of normal hearing + if(M.client.prefs) + if(is_eavesdroppable && !(M.client.prefs.chat_toggles & CHAT_GHOSTWHISPER)) //they're whispering and we have hearing whispers at any range off + continue + if(!(M.client.prefs.chat_toggles & CHAT_GHOSTEARS)) //they're talking normally and we have hearing at any range off + continue + if(!is_in_zweb(src.z, M.z)) + continue + listening |= M + the_dead[M] = TRUE log_seen(src, null, listening, original_message, SEEN_LOG_SAY) @@ -336,7 +339,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( var/eavesrendered if(eavesdrop_range) eavesdropping = stars(message) - eavesrendered = compose_message(src, message_language, eavesdropping, , spans, message_mode) + eavesrendered = compose_message(src, message_language, eavesdropping, null, spans, message_mode) var/rendered = compose_message(src, message_language, message, , spans, message_mode) var/turf/self_turf = get_turf(src) @@ -348,9 +351,9 @@ GLOBAL_LIST_INIT(department_radio_keys, list( if(movable_turf.z != self_z) continue if(eavesdrop_range && get_dist(source, AM) > message_range && !(the_dead[AM])) - AM.Hear(eavesrendered, src, message_language, eavesdropping, , spans, message_mode, original_message) + AM.Hear(eavesrendered, src, message_language, eavesdropping, null, spans, message_mode, original_message) else - AM.Hear(rendered, src, message_language, message, , spans, message_mode, original_message) + AM.Hear(rendered, src, message_language, message, null, spans, message_mode, original_message) SEND_GLOBAL_SIGNAL(COMSIG_GLOB_LIVING_SAY_SPECIAL, src, message) //speech bubble @@ -438,7 +441,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( if(message_mode == MODE_HEADSET) imp.radio.talk_into(src, message, , spans, language) return ITALICS | REDUCE_RANGE - if(message_mode == MODE_DEPARTMENT || message_mode in imp.radio.channels) + if(message_mode == MODE_DEPARTMENT || (message_mode in imp.radio.channels)) imp.radio.talk_into(src, message, message_mode, spans, language) return ITALICS | REDUCE_RANGE @@ -482,6 +485,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( say("#[message]", bubble_type, spans, sanitize, language, ignore_spam, forced) /mob/living/get_language_holder(shadow=TRUE) + RETURN_TYPE(/datum/language_holder) if(mind && shadow) // Mind language holders shadow mob holders. . = mind.get_language_holder() diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index dcfe5b25411..7bfb0a86ccd 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -104,7 +104,7 @@ new/obj/structure/AIcore/deactivated(loc) //New empty terminal. return INITIALIZE_HINT_QDEL //Delete AI. - ADD_TRAIT(src, TRAIT_NO_TELEPORT, src) + ADD_TRAIT(src, TRAIT_NO_TELEPORT, INNATE_TRAIT) if(L && istype(L, /datum/ai_laws)) laws = L laws.associate(src) @@ -343,11 +343,11 @@ var/is_anchored = FALSE if(move_resist == MOVE_FORCE_OVERPOWERING) move_resist = MOVE_FORCE_NORMAL - REMOVE_TRAIT(src, TRAIT_NO_TELEPORT, src) + REMOVE_TRAIT(src, TRAIT_NO_TELEPORT, INNATE_TRAIT) else is_anchored = TRUE move_resist = MOVE_FORCE_OVERPOWERING - ADD_TRAIT(src, TRAIT_NO_TELEPORT, src) + ADD_TRAIT(src, TRAIT_NO_TELEPORT, INNATE_TRAIT) to_chat(src, "I are now [is_anchored ? "" : "un"]anchored.") // the message in the [] will change depending whether or not the AI is anchored @@ -454,7 +454,7 @@ to_chat(src, span_warning("Exosuit is no longer near active cameras.")) return if(!isturf(loc)) - to_chat(src, span_warning("I aren't in my core!")) + to_chat(src, span_warning("I'm not in my core!")) return if(M) M.transfer_ai(AI_MECH_HACK, src, usr) //Called om the mech itself. diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm index 326f5136299..a6bbe96aee6 100644 --- a/code/modules/mob/living/silicon/ai/ai_defense.dm +++ b/code/modules/mob/living/silicon/ai/ai_defense.dm @@ -4,13 +4,6 @@ spark_system.start() return ..() - -/mob/living/silicon/ai/attack_alien(mob/living/carbon/alien/humanoid/M) - if(!SSticker.HasRoundStarted()) - to_chat(M, "You cannot attack people before the game has started.") - return - ..() - /mob/living/silicon/ai/attack_slime(mob/living/simple_animal/slime/user) return //immune to slimes diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 2c1d6c1826e..2319d78306c 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -17,27 +17,6 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real spark_system.start() return ..() -/mob/living/silicon/robot/attack_alien(mob/living/carbon/alien/humanoid/M) - if (M.used_intent.type == INTENT_DISARM) - if(mobility_flags & MOBILITY_STAND) - M.do_attack_animation(src, ATTACK_EFFECT_DISARM) - var/obj/item/I = get_active_held_item() - if(I) - uneq_active() - visible_message(span_danger("[M] disarmed [src]!"), \ - span_danger("[M] has disabled [src]'s active module!"), null, COMBAT_MESSAGE_RANGE) - log_combat(M, src, "disarmed", "[I ? " removing \the [I]" : ""]") - else - Stun(40) - step(src,get_dir(M,src)) - log_combat(M, src, "pushed") - visible_message(span_danger("[M] has forced back [src]!"), \ - span_danger("[M] has forced back [src]!"), null, COMBAT_MESSAGE_RANGE) - playsound(loc, 'sound/blank.ogg', 50, TRUE, -1) - else - ..() - return - /mob/living/silicon/robot/attack_slime(mob/living/simple_animal/slime/M) if(..()) //successful slime shock flash_act() diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index 7ff4dcd7aef..2ebd06a9e45 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -5,26 +5,6 @@ /mob/living/silicon/get_ear_protection()//no ears return 2 -/mob/living/silicon/attack_alien(mob/living/carbon/alien/humanoid/M) - if(..()) //if harm or disarm intent - var/damage = 20 - if (prob(90)) - log_combat(M, src, "attacked") - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - visible_message(span_danger("[M] slashes at [src]!"), \ - span_danger("[M] slashes at you!"), null, null, M) - to_chat(M, span_danger("I slash at [src]!")) - if(prob(8)) - flash_act(affect_silicon = 1) - log_combat(M, src, "attacked") - adjustBruteLoss(damage) - updatehealth() - else - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - visible_message(span_danger("[M]'s swipe misses [src]!"), \ - span_danger("I avoid [M]'s swipe!"), null, null, M) - to_chat(M, span_warning("My swipe misses [src]!")) - /mob/living/silicon/attack_animal(mob/living/simple_animal/M) . = ..() if(.) @@ -53,10 +33,6 @@ /mob/living/silicon/attack_paw(mob/living/user) return attack_hand(user) -/mob/living/silicon/attack_larva(mob/living/carbon/alien/larva/L) - if(L.used_intent.type == INTENT_HELP) - visible_message(span_notice("[L.name] rubs its head against [src].")) - /mob/living/silicon/attack_hulk(mob/living/carbon/human/user) . = ..() if(!.) diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index 4588c891399..21a61db7e92 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -150,32 +150,6 @@ playsound(loc, 'sound/blank.ogg', 50, TRUE, -1) -/mob/living/simple_animal/attack_alien(mob/living/carbon/alien/humanoid/M) - if(..()) //if harm or disarm intent. - if(M.used_intent.type == INTENT_DISARM) - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - visible_message(span_danger("[M] [response_disarm_continuous] [name]!"), \ - span_danger("[M] [response_disarm_continuous] you!"), null, COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I [response_disarm_simple] [name]!")) - log_combat(M, src, "disarmed") - else - var/damage = rand(15, 30) - visible_message(span_danger("[M] slashes at [src]!"), \ - span_danger("You're slashed at by [M]!"), null, COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("I slash at [src]!")) - playsound(loc, 'sound/blank.ogg', 25, TRUE, -1) - attack_threshold_check(damage) - log_combat(M, src, "attacked") - return 1 - -/mob/living/simple_animal/attack_larva(mob/living/carbon/alien/larva/L) - . = ..() - if(. && stat != DEAD) //successful larva bite - var/damage = rand(5, 10) - . = attack_threshold_check(damage) - if(.) - L.amount_grown = min(L.amount_grown + damage, L.max_grown) - /mob/living/simple_animal/attack_animal(mob/living/simple_animal/M) . = ..() if(.) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 95690bfb27a..109657a2a76 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -445,9 +445,7 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r var/scan_result = process_scan(scan) //Some bots may require additional processing when a result is selected. if(scan_result) return scan_result - else - return FALSE //The current element failed assessment, move on to the next. - return + return FALSE //The current element failed assessment, move on to the next. /mob/living/simple_animal/bot/proc/check_bot(targ) var/turf/T = get_turf(targ) diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index 84cbfeb01bb..742a7ae448c 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -338,12 +338,6 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, new /obj/effect/decal/cleanable/oil(loc) ..() -/mob/living/simple_animal/bot/honkbot/attack_alien(mob/living/carbon/alien/user as mob) - ..() - if(!isalien(target)) - target = user - mode = BOT_HUNT - /mob/living/simple_animal/bot/honkbot/Crossed(atom/movable/AM) if(ismob(AM) && (on)) //only if its online if(prob(30)) //you're far more likely to trip on a honkbot diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 00d1941337a..ec5b0df06f5 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -477,12 +477,6 @@ Auto Patrol: []"}, new /obj/effect/decal/cleanable/oil(loc) ..() -/mob/living/simple_animal/bot/secbot/attack_alien(mob/living/carbon/alien/user as mob) - ..() - if(!isalien(target)) - target = user - mode = BOT_HUNT - /mob/living/simple_animal/bot/secbot/Crossed(atom/movable/AM) if(has_gravity() && ismob(AM) && target) var/mob/living/carbon/C = AM diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index 4b239f73d84..e26dc02c910 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -203,18 +203,3 @@ back = /obj/item/storage/backpack/satchel/med id = /obj/item/card/id glasses = /obj/item/clothing/glasses/hud/health - -/obj/effect/mob_spawn/human/corpse/bee_terrorist - name = "BLF Operative" - outfit = /datum/outfit/bee_terrorist - -/datum/outfit/bee_terrorist - name = "BLF Operative" - uniform = /obj/item/clothing/under/color/yellow - suit = /obj/item/clothing/suit/hooded/bee_costume - shoes = /obj/item/clothing/shoes/sneakers/yellow - gloves = /obj/item/clothing/gloves/color/yellow - ears = /obj/item/radio/headset - id = /obj/item/card/id - mask = /obj/item/clothing/mask/rat/bee - diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm index 084a64801bf..2a008544410 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm @@ -116,7 +116,7 @@ if(hack) if(hacked) return - Stun(40) + Stun(40) visible_message(span_warning("[src]'s display glows a vicious red!"), \ span_danger("ERROR: LAW OVERRIDE DETECTED")) to_chat(src, span_boldannounce("From now on, these are my laws:")) diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm deleted file mode 100644 index 58f7b034230..00000000000 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ /dev/null @@ -1,183 +0,0 @@ -/mob/living/simple_animal/hostile/alien - name = "alien hunter" - desc = "" - icon = 'icons/mob/alien.dmi' - icon_state = "alienh" - icon_living = "alienh" - icon_dead = "alienh_dead" - icon_gib = "syndicate_gib" - gender = FEMALE - speed = 0 - butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno = 4, - /obj/item/stack/sheet/animalhide/xeno = 1) - maxHealth = 125 - health = 125 - harm_intent_damage = 5 - obj_damage = 60 - melee_damage_lower = 25 - melee_damage_upper = 25 - attack_verb_continuous = "slashes" - attack_verb_simple = "slash" - speak_emote = list("hisses") - bubble_icon = "alien" - a_intent = INTENT_HARM - attack_sound = 'sound/blank.ogg' - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - unsuitable_atmos_damage = 15 - faction = list(ROLE_ALIEN) - status_flags = CANPUSH - minbodytemp = 0 - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - unique_name = 1 - gold_core_spawnable = NO_SPAWN - deathsound = 'sound/blank.ogg' - deathmessage = "lets out a waning guttural screech, green blood bubbling from its maw..." - -/mob/living/simple_animal/hostile/alien/Initialize() - . = ..() - AddComponent(/datum/component/footstep, FOOTSTEP_MOB_CLAW) - -/mob/living/simple_animal/hostile/alien/drone - name = "alien drone" - icon_state = "aliend" - icon_living = "aliend" - icon_dead = "aliend_dead" - melee_damage_lower = 15 - melee_damage_upper = 15 - var/plant_cooldown = 30 - var/plants_off = 0 - -/mob/living/simple_animal/hostile/alien/drone/handle_automated_action() - if(!..()) //AIStatus is off - return - plant_cooldown-- - if(AIStatus == AI_IDLE) - if(!plants_off && prob(10) && plant_cooldown<=0) - plant_cooldown = initial(plant_cooldown) - SpreadPlants() - -/mob/living/simple_animal/hostile/alien/sentinel - name = "alien sentinel" - icon_state = "aliens" - icon_living = "aliens" - icon_dead = "aliens_dead" - health = 150 - maxHealth = 150 - melee_damage_lower = 15 - melee_damage_upper = 15 - ranged = 1 - retreat_distance = 5 - minimum_distance = 5 - projectiletype = /obj/projectile/neurotox - projectilesound = 'sound/blank.ogg' - - -/mob/living/simple_animal/hostile/alien/queen - name = "alien queen" - icon_state = "alienq" - icon_living = "alienq" - icon_dead = "alienq_dead" - health = 250 - maxHealth = 250 - melee_damage_lower = 15 - melee_damage_upper = 15 - ranged = 1 - retreat_distance = 5 - minimum_distance = 5 - move_to_delay = 4 - butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno = 4, - /obj/item/stack/sheet/animalhide/xeno = 1) - projectiletype = /obj/projectile/neurotox - projectilesound = 'sound/blank.ogg' - status_flags = 0 - unique_name = 0 - var/sterile = 1 - var/plants_off = 0 - var/egg_cooldown = 30 - var/plant_cooldown = 30 - -/mob/living/simple_animal/hostile/alien/queen/handle_automated_action() - if(!..()) //AIStatus is off - return - egg_cooldown-- - plant_cooldown-- - if(AIStatus == AI_IDLE) - if(!plants_off && prob(10) && plant_cooldown<=0) - plant_cooldown = initial(plant_cooldown) - SpreadPlants() - if(!sterile && prob(10) && egg_cooldown<=0) - egg_cooldown = initial(egg_cooldown) - LayEggs() - -/mob/living/simple_animal/hostile/alien/proc/SpreadPlants() - if(!isturf(loc) || isspaceturf(loc)) - return - if(locate(/obj/structure/alien/weeds/node) in get_turf(src)) - return - visible_message(span_alertalien("[src] has planted some alien weeds!")) - new /obj/structure/alien/weeds/node(loc) - -/mob/living/simple_animal/hostile/alien/proc/LayEggs() - if(!isturf(loc) || isspaceturf(loc)) - return - if(locate(/obj/structure/alien/egg) in get_turf(src)) - return - visible_message(span_alertalien("[src] has laid an egg!")) - new /obj/structure/alien/egg(loc) - -/mob/living/simple_animal/hostile/alien/queen/large - name = "alien empress" - icon = 'icons/mob/alienqueen.dmi' - icon_state = "alienq" - icon_living = "alienq" - icon_dead = "alienq_dead" - bubble_icon = "alienroyal" - move_to_delay = 4 - maxHealth = 400 - health = 400 - butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno = 10, - /obj/item/stack/sheet/animalhide/xeno = 2) - mob_size = MOB_SIZE_LARGE - gold_core_spawnable = NO_SPAWN - -/obj/projectile/neurotox - name = "neurotoxin" - damage = 30 - icon_state = "toxin" - -/mob/living/simple_animal/hostile/alien/handle_temperature_damage() - if(bodytemperature < minbodytemp) - adjustBruteLoss(2) - else if(bodytemperature > maxbodytemp) - adjustBruteLoss(20) - - -/mob/living/simple_animal/hostile/alien/maid - name = "lusty xenomorph maid" - melee_damage_lower = 0 - melee_damage_upper = 0 - a_intent = INTENT_HELP - friendly_verb_continuous = "caresses" - friendly_verb_simple = "caress" - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - gold_core_spawnable = HOSTILE_SPAWN - icon_state = "maid" - icon_living = "maid" - icon_dead = "maid_dead" - -/mob/living/simple_animal/hostile/alien/maid/Initialize(mapload) - . = ..() - AddElement(/datum/element/cleaning) - -/mob/living/simple_animal/hostile/alien/maid/AttackingTarget() - if(ismovableatom(target)) - if(istype(target, /obj/effect/decal/cleanable)) - visible_message(span_notice("[src] cleans up \the [target].")) - qdel(target) - return TRUE - var/atom/movable/M = target - SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - visible_message(span_notice("[src] polishes \the [target].")) - return TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index 1ec3aaa9e44..83c0e91e359 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -102,7 +102,7 @@ to_chat(user, span_info("I strap the armor plating to [A] and sharpen [A.p_their()] claws with the nail filer. This was a great idea.")) qdel(src) -mob/living/simple_animal/hostile/bear/butter //The mighty companion to Cak. Several functions used from it. +/mob/living/simple_animal/hostile/bear/butter //The mighty companion to Cak. Several functions used from it. name = "Terrygold" icon_state = "butterbear" icon_living = "butterbear" @@ -147,7 +147,7 @@ mob/living/simple_animal/hostile/bear/butter //The mighty companion to Cak. Seve to_chat(src, span_notice("My name is now \"new_name\"!")) name = new_name -mob/living/simple_animal/hostile/bear/butter/AttackingTarget() //Makes some attacks by the butter bear slip those who dare cross its path. +/mob/living/simple_animal/hostile/bear/butter/AttackingTarget() //Makes some attacks by the butter bear slip those who dare cross its path. if(isliving(target)) var/mob/living/L = target if((L.mobility_flags & MOBILITY_STAND)) diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 088f1d8a5e3..0d97f516da6 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -422,7 +422,7 @@ name = "Wrap" panel = "Spider" active = FALSE - datum/action/spell_action/action = null + action = null desc = "" ranged_mousepointer = 'icons/effects/wrap_target.dmi' action_icon = 'icons/mob/actions/actions_animal.dmi' diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm deleted file mode 100644 index 46479b3ccb7..00000000000 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ /dev/null @@ -1,87 +0,0 @@ -#define EGG_INCUBATION_TIME 120 - -/mob/living/simple_animal/hostile/headcrab - name = "headslug" - desc = "" - icon_state = "headcrab" - icon_living = "headcrab" - icon_dead = "headcrab_dead" - gender = NEUTER - health = 50 - maxHealth = 50 - melee_damage_lower = 5 - melee_damage_upper = 5 - attack_verb_continuous = "chomps" - attack_verb_simple = "chomp" - attack_sound = 'sound/blank.ogg' - faction = list("creature") - robust_searching = 1 - stat_attack = DEAD - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - speak_emote = list("squeaks") - ventcrawler = VENTCRAWLER_ALWAYS - var/datum/mind/origin - var/egg_lain = 0 - -/mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim) - var/obj/item/organ/body_egg/changeling_egg/egg = new(victim) - egg.Insert(victim) - if(origin) - egg.origin = origin - else if(mind) // Let's make this a feature - egg.origin = mind - for(var/obj/item/organ/I in src) - I.forceMove(egg) - visible_message(span_warning("[src] plants something in [victim]'s flesh!"), \ - span_danger("We inject our egg into [victim]'s body!")) - egg_lain = 1 - -/mob/living/simple_animal/hostile/headcrab/AttackingTarget() - . = ..() - if(. && !egg_lain && iscarbon(target) && !ismonkey(target)) - // Changeling egg can survive in aliens! - var/mob/living/carbon/C = target - if(C.stat == DEAD) - if(HAS_TRAIT(C, TRAIT_XENO_HOST)) - to_chat(src, span_danger("A foreign presence repels us from this body. Perhaps we should try to infest another?")) - return - Infect(target) - to_chat(src, span_danger("With our egg laid, our death approaches rapidly...")) - addtimer(CALLBACK(src, PROC_REF(death)), 100) - -/obj/item/organ/body_egg/changeling_egg - name = "changeling egg" - desc = "" - var/datum/mind/origin - var/time - -/obj/item/organ/body_egg/changeling_egg/egg_process() - // Changeling eggs grow in dead people - time++ - if(time >= EGG_INCUBATION_TIME) - Pop() - Remove(owner) - qdel(src) - -/obj/item/organ/body_egg/changeling_egg/proc/Pop() - var/mob/living/carbon/monkey/M = new(owner) - - for(var/obj/item/organ/I in src) - I.Insert(M, 1) - - if(origin && (origin.current ? (origin.current.stat == DEAD) : origin.get_ghost())) - origin.transfer_to(M) - var/datum/antagonist/changeling/C = origin.has_antag_datum(/datum/antagonist/changeling) - if(!C) - C = origin.add_antag_datum(/datum/antagonist/changeling/xenobio) - if(C.can_absorb_dna(owner)) - C.add_new_profile(owner) - - var/datum/action/changeling/humanform/hf = new - C.purchasedpowers += hf - C.regain_powers() - M.key = origin.key - owner.gib() - -#undef EGG_INCUBATION_TIME diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 5f1f02d3739..0955a404538 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -228,7 +228,7 @@ return chosen_target // Please do not add one-off mob AIs here, but override this function for your mob -/mob/living/simple_animal/hostile/CanAttack(atom/the_target, ignore_lying = TRUE)//Can we actually attack a possible target? +/mob/living/simple_animal/hostile/CanAttack(atom/the_target, attack_lying = FALSE)//Can we actually attack a possible target? if(isturf(the_target) || !the_target || the_target.type == /atom/movable/lighting_object) // bail out on invalids return FALSE @@ -239,9 +239,12 @@ if(M.name in friends) return FALSE + if(attack_laying) //used for bosses etc. + attack_lying = TRUE + if(ishuman(the_target)) var/mob/living/carbon/human/th = the_target - if(ignore_lying && th.lying && !th.get_active_held_item()) //if is laying and holding nothing, and not in cmode. Ignore. + if(!attack_lying && th.lying && !th.get_active_held_item()) //if is laying and holding nothing, and not in cmode. Ignore. if(prob(4) && th.has_quirk(/datum/quirk/monsterhunter) && erpable) //tiny chance to trigger abuss. fuckcd = 0 return FALSE @@ -343,6 +346,7 @@ MeleeAction(FALSE) in_melee = FALSE //If we're just preparing to strike do not enter sidestep mode return 1 + LoseTarget() // Somehow we don't have a target now! Maybe OpenFire() or MeleeAction destroyed them? return 0 else if(ranged_ignores_vision && ranged_cooldown <= world.time) //we can't see our target... but we can fire at them! @@ -350,19 +354,6 @@ Goto(target,move_to_delay,minimum_distance) FindHidden() return 1 -// if(environment_smash) -// if(target.loc != null && get_dist(targets_from, target.loc) <= vision_range) //We can't see our target, but he's in our vision range still -// if(ranged_ignores_vision && ranged_cooldown <= world.time) //we can't see our target... but we can fire at them! -// OpenFire(target) -// if((environment_smash & ENVIRONMENT_SMASH_WALLS) || (environment_smash & ENVIRONMENT_SMASH_RWALLS)) //If we're capable of smashing through walls, forget about vision completely after finding our target -// Goto(target,move_to_delay,minimum_distance) -// FindHidden() -// return 1 -// else -// if(FindHidden()) -// return 1 - LoseTarget() - return 0 /mob/living/simple_animal/hostile/proc/Goto(target, delay, minimum_distance) if(target == src.target) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 63bba77d16d..a522c7ef16c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -549,7 +549,7 @@ Difficulty: Hard true_spawn = FALSE /mob/living/simple_animal/hostile/retaliate/rogue/megafauna/bubblegum/hallucination/Initialize() - ..() + . = ..() toggle_ai(AI_OFF) /mob/living/simple_animal/hostile/retaliate/rogue/megafauna/bubblegum/hallucination/charge(atom/chargeat = target, delay = 3, chargepast = 2) 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 2ba5017c88d..028b0100e9c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -541,8 +541,6 @@ Difficulty: Very Hard florachance = 20 if("ayy lmao") //Beneficial, turns stuff into alien alloy which is useful to cargo and research. Also repairs atmos. NewTerrainFloors = /turf/open/floor/plating/abductor - NewTerrainWalls = /turf/closed/wall/mineral/abductor - NewTerrainChairs = /obj/structure/bed/abductor //ayys apparently don't have chairs. An entire species of people who only recline. NewTerrainTables = /obj/structure/table/abductor /obj/machinery/anomalous_crystal/theme_warp/ActivationReaction(mob/user, method) @@ -716,7 +714,7 @@ Difficulty: Very Hard L.heal_overall_damage(heal_power, heal_power) new /obj/effect/temp_visual/heal(get_turf(target), "#80F5FF") -/mob/living/simple_animal/hostile/lightgeist/ghostize(can_reenter_corpse = 1, force_respawn = FALSE, drawskip = FALSE) +/mob/living/simple_animal/hostile/lightgeist/ghostize(can_reenter_corpse = TRUE, force_respawn = FALSE, drawskip = FALSE, admin = FALSE) . = ..() if(.) death() 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 cb08fced661..22e0ae577f3 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -308,7 +308,7 @@ Difficulty: Medium new /obj/effect/hotspot(T) T.hotspot_expose(700,50,1) for(var/mob/living/L in T.contents) - if(L in hit_list || L == source) + if((L in hit_list) || L == source) continue hit_list += L L.adjustFireLoss(1) @@ -425,7 +425,7 @@ Difficulty: Medium return FALSE return ..() -/mob/living/simple_animal/hostile/retaliate/rogue/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs) +/mob/living/simple_animal/hostile/retaliate/rogue/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, runechat_message = null, log_seen = NONE, log_seen_msg = null, target = null, target_message = null) if(swooping & SWOOP_INVULNERABLE) //to suppress attack messages without overriding every single proc that could send a message saying we got hit return return ..() @@ -553,7 +553,7 @@ Difficulty: Medium else animate(src, pixel_x = -16, pixel_z = 0, time = 5) -obj/effect/temp_visual/fireball +/obj/effect/temp_visual/fireball icon = 'icons/obj/wizard.dmi' icon_state = "fireball" name = "fireball" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index 14b4aca7c63..c7553b09d97 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -29,6 +29,7 @@ layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise mouse_opacity = MOUSE_OPACITY_OPAQUE // Easier to click on in melee, they're giant targets anyway flags_1 = PREVENT_CONTENTS_EXPLOSION_1 + attack_laying = TRUE // rip them apart. var/list/crusher_loot var/achievement_type var/crusher_achievement_type diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/sif.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/sif.dm index bd40aa3c366..b3f51987f64 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/sif.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/sif.dm @@ -125,10 +125,10 @@ Difficulty: Medium /mob/living/simple_animal/hostile/retaliate/rogue/megafauna/sif/ComponentInitialize() . = ..() AddComponent(/datum/component/glory_kill, \ - messages_unarmed = list("climbs atop the wolf's head as it dangles weakly near the ground, ripping its left eye off and jumping down before punching through it's cranium!", "goes around the wolf and rips off their tail, using it as whip on the fiend"), \ - messages_crusher = list("chops off the wolf's head by it's neck!"), \ - messages_pka = list("shoots at the wolf's eyes with their PKA, exploding them into giblets!"), \ - messages_pka_bayonet = list("slides down below Sif, using their bayonet to rip it's stomach open!")) + list("climbs atop the wolf's head as it dangles weakly near the ground, ripping its left eye off and jumping down before punching through its cranium!", "goes around the wolf and rips off their tail, using it as whip on the fiend"), \ + list("shoots at the wolf's eyes with their PKA, exploding them into giblets!"), \ + list("slides down below Sif, using their bayonet to rip it's stomach open!"), \ + list("chops off the wolf's head by it's neck!")) /*/obj/item/gps/internal/sif icon_state = null @@ -268,7 +268,7 @@ Difficulty: Medium spin(5,2)// Spin me boi //Chance to dodge projectiles when angered or enraged -/mob/living/simple_animal/hostile/retaliate/rogue/megafauna/sif/bullet_act(obj/item/projectile/P) +/mob/living/simple_animal/hostile/retaliate/rogue/megafauna/sif/bullet_act(obj/projectile/P) var/passed = 0 if(angered) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm deleted file mode 100644 index 4f84a5082e5..00000000000 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm +++ /dev/null @@ -1,288 +0,0 @@ -/* - -Swarmer Beacon - -A strange machine appears anywhere a normal lavaland mob can it produces a swarmer at a rate of -1/15 seconds, until there are GetTotalAISwarmerCap()/2 swarmers, after this it is up to the swarmers themselves to -increase their population (it will repopulate them should they fall under GetTotalAISwarmerCap()/2 again) - -tl;dr A million of the little hellraisers spawn (controlled by AI) and try to eat mining - -Loot: Not much, besides a shit load of artificial bluespace crystals, Oh and mining doesn't get eaten -that's a plus I suppose. - -Difficulty: Special - -*/ - -GLOBAL_LIST_EMPTY(AISwarmers) -GLOBAL_LIST_EMPTY(AISwarmersByType)//AISwarmersByType[.../resource] = list(1st, 2nd, nth), AISwarmersByType[../ranged] = list(1st, 2nd, nth) etc. -GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swarmer/ai/resource = 30, /mob/living/simple_animal/hostile/swarmer/ai/ranged_combat = 20, /mob/living/simple_animal/hostile/swarmer/ai/melee_combat = 10)) - - -//returns a type of AI swarmer that is NOT at max cap -//type order is shuffled, to prevent bias -/proc/GetUncappedAISwarmerType() - var/static/list/swarmerTypes = subtypesof(/mob/living/simple_animal/hostile/swarmer/ai) - LAZYINITLIST(GLOB.AISwarmersByType) - for(var/t in shuffle(swarmerTypes)) - var/list/amount = GLOB.AISwarmersByType[t] - if(!amount || amount.len < GLOB.AISwarmerCapsByType[t]) - return t - - -//Total of all subtype caps -/proc/GetTotalAISwarmerCap() - var/static/list/swarmerTypes = subtypesof(/mob/living/simple_animal/hostile/swarmer/ai) - . = 0 - LAZYINITLIST(GLOB.AISwarmersByType) - for(var/t in swarmerTypes) - . += GLOB.AISwarmerCapsByType[t] - - -/mob/living/simple_animal/hostile/retaliate/rogue/megafauna/swarmer_swarm_beacon - name = "swarmer beacon" - desc = "" - icon = 'icons/mob/swarmer.dmi' - icon_state = "swarmer_console" - health = 750 - maxHealth = 750 //""""low-ish"""" HP because it's a passive boss, and the swarm itself is the real foe - mob_biotypes = MOB_ROBOTIC - gps_name = "Hungry Signal" - achievement_type = /datum/award/achievement/boss/swarmer_beacon_kill - crusher_achievement_type = /datum/award/achievement/boss/swarmer_beacon_crusher - score_achievement_type = /datum/award/score/swarmer_beacon_score - faction = list("mining", "boss", "swarmer") - weather_immunities = list("lava","ash") - stop_automated_movement = TRUE - wander = FALSE - layer = BELOW_MOB_LAYER - AIStatus = AI_OFF - del_on_death = TRUE - var/swarmer_spawn_cooldown = 0 - var/swarmer_spawn_cooldown_amt = 150 //Deciseconds between the swarmers we spawn - var/call_help_cooldown = 0 - var/call_help_cooldown_amt = 150 //Deciseconds between calling swarmers to help us when attacked - var/static/list/swarmer_caps - - -/mob/living/simple_animal/hostile/retaliate/rogue/megafauna/swarmer_swarm_beacon/Initialize() - . = ..() - swarmer_caps = GLOB.AISwarmerCapsByType //for admin-edits - for(var/ddir in GLOB.cardinals) - new /obj/structure/swarmer/blockade (get_step(src, ddir)) - var/mob/living/simple_animal/hostile/swarmer/ai/resource/R = new(loc) - step(R, ddir) //Step the swarmers, instead of spawning them there, incase the turf is solid - - -/mob/living/simple_animal/hostile/retaliate/rogue/megafauna/swarmer_swarm_beacon/Life() - . = ..() - if(.) - var/createtype = GetUncappedAISwarmerType() - if(createtype && world.time > swarmer_spawn_cooldown && GLOB.AISwarmers.len < (GetTotalAISwarmerCap()*0.5)) - swarmer_spawn_cooldown = world.time + swarmer_spawn_cooldown_amt - new createtype(loc) - - -/mob/living/simple_animal/hostile/retaliate/rogue/megafauna/swarmer_swarm_beacon/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - . = ..() - if(. > 0 && world.time > call_help_cooldown) - call_help_cooldown = world.time + call_help_cooldown_amt - summon_backup(25) //long range, only called max once per 15 seconds, so it's not deathlag - - -//SWARMER AI -//AI versions of the swarmer mini-antag -//This is an Abstract Base, it re-enables AI, but does not give the swarmer any goals/targets -/mob/living/simple_animal/hostile/swarmer/ai - wander = 1 - faction = list("swarmer", "mining") - weather_immunities = list("ash") //wouldn't be fun otherwise - AIStatus = AI_ON - -/mob/living/simple_animal/hostile/swarmer/ai/Initialize() - . = ..() - ToggleLight() //so you can see them eating you out of house and home/shooting you/stunlocking you for eternity - LAZYINITLIST(GLOB.AISwarmersByType[type]) - GLOB.AISwarmers += src - GLOB.AISwarmersByType[type] += src - - -/mob/living/simple_animal/hostile/swarmer/ai/Destroy() - GLOB.AISwarmers -= src - GLOB.AISwarmersByType[type] -= src - return ..() - - -/mob/living/simple_animal/hostile/swarmer/ai/SwarmerTypeToCreate() - return GetUncappedAISwarmerType() - - -/mob/living/simple_animal/hostile/swarmer/ai/resource/handle_automated_action() - . = ..() - if(.) - if(!stop_automated_movement) - if(health < maxHealth*0.25) - StartAction(100) - RepairSelf() - return - - -/mob/living/simple_animal/hostile/swarmer/ai/Move(atom/newloc) - if(newloc) - if(newloc.z == z) //so these actions are Z-specific - if(islava(newloc)) - var/turf/open/lava/L = newloc - if(!L.is_safe()) - StartAction(20) - new /obj/structure/lattice/catwalk/swarmer_catwalk(newloc) - return FALSE - - if(ischasm(newloc) && !throwing) - throw_at(get_edge_target_turf(src, get_dir(src, newloc)), 7 , 3, src, FALSE) //my planet needs me - return FALSE - - return ..() - - -/mob/living/simple_animal/hostile/swarmer/ai/proc/StartAction(deci = 0) - stop_automated_movement = TRUE - AIStatus = AI_OFF - addtimer(CALLBACK(src, PROC_REF(EndAction)), deci) - - -/mob/living/simple_animal/hostile/swarmer/ai/proc/EndAction() - stop_automated_movement = FALSE - AIStatus = AI_ON - - - - -//RESOURCE SWARMER: -//Similar to the original Player-Swarmers, these dismantle things to obtain the metal inside -//They then use this medal to produce more swarmers or traps/barricades - -/mob/living/simple_animal/hostile/swarmer/ai/resource - search_objects = 1 - attack_all_objects = TRUE //attempt to nibble everything - lose_patience_timeout = 150 - var/static/list/sharedWanted = typecacheof(list(/turf/closed/mineral, /turf/closed/wall)) //eat rocks and walls - var/static/list/sharedIgnore = list() - -//This handles viable things to eat/attack -//Place specific cases of AI derpiness here -//Most can be left to the automatic Gain/LosePatience() system -/mob/living/simple_animal/hostile/swarmer/ai/resource/CanAttack(atom/the_target) - - //SPECIFIC CASES: - //Smash fulltile windows before grilles - if(istype(the_target, /obj/structure/grille)) - for(var/obj/structure/window/rogueWindow in get_turf(the_target)) - if(rogueWindow.fulltile) //done this way because the subtypes are weird. - the_target = rogueWindow - break - - //GENERAL CASES: - if(is_type_in_typecache(the_target, sharedIgnore)) //always ignore - return FALSE - if(is_type_in_typecache(the_target, sharedWanted)) //always eat - return TRUE - - return ..() //else, have a nibble, see if it's food - - -/mob/living/simple_animal/hostile/swarmer/ai/resource/OpenFire(atom/A) - if(isliving(A)) //don't shoot rocks, sillies. - ..() - - -/mob/living/simple_animal/hostile/swarmer/ai/resource/AttackingTarget() - if(target.swarmer_act(src)) - add_type_to_wanted(target.type) - return TRUE - else - add_type_to_ignore(target.type) - return FALSE - - -/mob/living/simple_animal/hostile/swarmer/ai/resource/handle_automated_action() - . = ..() - if(.) - if(!stop_automated_movement) - if(GLOB.AISwarmers.len < GetTotalAISwarmerCap() && resources >= 50) - StartAction(100) //so they'll actually sit still and use the verbs - CreateSwarmer() - return - - if(resources > 5) - if(prob(5)) //lower odds, as to prioritise reproduction - StartAction(10) //not a typo - CreateBarricade() - return - if(prob(5)) - CreateTrap() - return - - -//So swarmers can learn what is and isn't food -/mob/living/simple_animal/hostile/swarmer/ai/resource/proc/add_type_to_wanted(typepath) - if(!sharedWanted[typepath])// this and += is faster than |= - sharedWanted += typecacheof(typepath) - - -/mob/living/simple_animal/hostile/swarmer/ai/resource/proc/add_type_to_ignore(typepath) - if(!sharedIgnore[typepath]) - sharedIgnore += typecacheof(typepath) - - -//RANGED SWARMER -/mob/living/simple_animal/hostile/swarmer/ai/ranged_combat - icon_state = "swarmer_ranged" - icon_living = "swarmer_ranged" - projectiletype = /obj/projectile/beam/laser - projectilesound = 'sound/blank.ogg' - check_friendly_fire = TRUE //you're supposed to protect the resource swarmers, you poop - retreat_distance = 3 - minimum_distance = 3 - -/mob/living/simple_animal/hostile/swarmer/ai/ranged_combat/Aggro() - ..() - summon_backup(15, TRUE) //Exact matching, so that goliaths don't come to aid the swarmers, that'd be silly - - -//MELEE SWARMER -/mob/living/simple_animal/hostile/swarmer/ai/melee_combat - icon_state = "swarmer_melee" - icon_living = "swarmer_melee" - health = 60 - maxHealth = 60 - ranged = FALSE - -/mob/living/simple_animal/hostile/swarmer/ai/melee_combat/Aggro() - ..() - summon_backup(15, TRUE) - - -/mob/living/simple_animal/hostile/swarmer/ai/melee_combat/AttackingTarget() - if(isliving(target)) - if(prob(35)) - StartAction(30) - DisperseTarget(target) - else - var/mob/living/L = target - L.attack_animal(src) - L.electrocute_act(10, src, flags = SHOCK_NOGLOVES) - return TRUE - else - return ..() - - - - -//SWARMER CATWALKS -//Used so they can survive lavaland better -/obj/structure/lattice/catwalk/swarmer_catwalk - name = "swarmer catwalk" - desc = "" - icon = 'icons/obj/smooth_structures/swarmer_catwalk.dmi' - icon_state = "swarmer_catwalk" diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm index e032996cc7e..48b36645108 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm @@ -118,10 +118,6 @@ IGNORE_PROC_IF_NOT_TARGET(attack_hulk) IGNORE_PROC_IF_NOT_TARGET(attack_paw) -IGNORE_PROC_IF_NOT_TARGET(attack_alien) - -IGNORE_PROC_IF_NOT_TARGET(attack_larva) - IGNORE_PROC_IF_NOT_TARGET(attack_animal) IGNORE_PROC_IF_NOT_TARGET(attack_slime) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index cc8ecaac542..6bbc4d4fa77 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -174,7 +174,7 @@ While using this makes the system rely on OnFire, it still gives options for tim activator = null -obj/structure/elite_tumor/proc/spawn_elite(var/mob/dead/observer/elitemind) +/obj/structure/elite_tumor/proc/spawn_elite(mob/dead/observer/elitemind) var/selectedspawn = pick(potentialspawns) mychild = new selectedspawn(loc) visible_message(span_boldwarning("[mychild] emerges from [src]!")) @@ -185,7 +185,7 @@ obj/structure/elite_tumor/proc/spawn_elite(var/mob/dead/observer/elitemind) icon_state = "tumor_popped" INVOKE_ASYNC(src, PROC_REF(arena_checks)) -obj/structure/elite_tumor/proc/return_elite() +/obj/structure/elite_tumor/proc/return_elite() mychild.forceMove(loc) visible_message(span_boldwarning("[mychild] emerges from [src]!")) playsound(loc,'sound/blank.ogg', 200, 0, 50, TRUE, TRUE) @@ -262,7 +262,7 @@ obj/structure/elite_tumor/proc/return_elite() visible_message(span_boldwarning("[mychild] suddenly reappears above [src]!")) playsound(loc,'sound/blank.ogg', 200, 0, 50, TRUE, TRUE) -obj/structure/elite_tumor/proc/onEliteLoss() +/obj/structure/elite_tumor/proc/onEliteLoss() playsound(loc,'sound/blank.ogg', 200, 0, 50, TRUE, TRUE) visible_message(span_boldwarning("[src] begins to convulse violently before beginning to dissipate.")) visible_message(span_boldwarning("As [src] closes, something is forced up from down below.")) @@ -281,7 +281,7 @@ obj/structure/elite_tumor/proc/onEliteLoss() activator = null qdel(src) -obj/structure/elite_tumor/proc/onEliteWon() +/obj/structure/elite_tumor/proc/onEliteWon() activity = TUMOR_PASSIVE activator = null mychild.revive(full_heal = TRUE, admin_revive = TRUE) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm index aaf03fb1212..264e83bdd40 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm @@ -233,7 +233,7 @@ var/mob/living/simple_animal/hostile/retaliate/rogue/asteroid/elite/herald/my_master = null /mob/living/simple_animal/hostile/retaliate/rogue/asteroid/elite/herald/mirror/Initialize() - ..() + . = ..() toggle_ai(AI_OFF) /mob/living/simple_animal/hostile/retaliate/rogue/asteroid/elite/herald/mirror/Destroy() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm index d18196efad3..422d644f23c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm @@ -185,7 +185,7 @@ L.setDir(dir) L.Stun(20, ignore_canstun = TRUE) visible_message(span_notice("[src] grows up into [L].")) - Destroy() + qdel(src) //Gutlunch udder /obj/item/udder/gutlunch diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/imp.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/imp.dm index 4ac5451848c..a8ab2127045 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/imp.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/imp.dm @@ -8,7 +8,7 @@ icon_aggro = "imp" icon_dead = "imp_dead" icon_gib = "syndicate_gib" - projectiletype = /obj/projectile/magic/aoe/fireball/rogue2 //obj/item/projectile/magic/impfireball + projectiletype = /obj/projectile/magic/aoe/fireball/rogue2 //obj/projectile/magic/impfireball projectilesound = 'modular_hearthstone/sound/misc/impranged.wav' ranged = 1 ranged_message = "shoots a fireball" @@ -69,19 +69,19 @@ /mob/living/simple_animal/hostile/asteroid/imp/ComponentInitialize() . = ..() AddComponent(/datum/component/glory_kill, \ - messages_unarmed = list("grabs the imp's eyes and rips them out, shoving the bloody imp aside!", "grabs and crushes the imp's skull apart with their bare hands!", "rips the imp's head clean off with their bare hands!"), \ - messages_pka = list("sticks their PKA into the imp's mouth and shoots it, showering everything in gore!", "bashes the imp's head into their chest with their PKA!", "shoots off both legs of the imp with their PKA!"), \ - messages_pka_bayonet = list("slices the imp's head off by the neck with the PKA's bayonet!", "repeatedly stabs the imp in their gut with the PKA's bayonet!"), \ - messages_crusher = list("chops the imp horizontally in half with their crusher in one swift move!", "chops off the imp's legs with their crusher and kicks their face hard, exploding it while they're in the air!", "slashes each of the imp's arms off by the shoulder with their crusher!"), \ - health_given = 7.5, \ - threshold = (maxHealth/10 * 1.5), \ - crusher_drop_mod = 2) + list("grabs the imp's eyes and rips them out, shoving the bloody imp aside!", "grabs and crushes the imp's skull apart with their bare hands!", "rips the imp's head clean off with their bare hands!"), \ + list("sticks their PKA into the imp's mouth and shoots it, showering everything in gore!", "bashes the imp's head into their chest with their PKA!", "shoots off both legs of the imp with their PKA!"), \ + list("slices the imp's head off by the neck with the PKA's bayonet!", "repeatedly stabs the imp in their gut with the PKA's bayonet!"), \ + list("chops the imp horizontally in half with their crusher in one swift move!", "chops off the imp's legs with their crusher and kicks their face hard, exploding it while they're in the air!", "slashes each of the imp's arms off by the shoulder with their crusher!"), \ + 7.5, \ + (maxHealth/10 * 1.5), \ + 2) /mob/living/simple_animal/hostile/asteroid/imp/attacked_by(obj/item/I, mob/living/user) . = ..() playsound(src, 'modular_hearthstone/sound/misc/impinjured.wav', rand(25,100), -1) //HURT ME PLENTY -/mob/living/simple_animal/hostile/asteroid/imp/bullet_act(obj/item/projectile/P) +/mob/living/simple_animal/hostile/asteroid/imp/bullet_act(obj/projectile/P) . = ..() playsound(src, 'modular_hearthstone/sound/misc/impinjured.wav', rand(25,100), -1) @@ -98,7 +98,7 @@ -/*/obj/item/projectile/magic/impfireball //bobyot y u no use child of fireball +/*/obj/projectile/magic/impfireball //bobyot y u no use child of fireball name = "demonic fireball" //because it fucking explodes and deals brute damage even when values are set to -1 icon_state = "fireball" damage = 10 @@ -107,7 +107,7 @@ armor_penetration = 20 var/firestacks = 5 -/obj/item/projectile/magic/impfireball/on_hit(target) +/obj/projectile/magic/impfireball/on_hit(target) . = ..() if(iscarbon(target)) var/mob/living/carbon/C = target @@ -223,9 +223,7 @@ return spawning = TRUE update_icon() - spawn(2 SECONDS) - createimp() - //addtimer(CALLBACK(src, PROC_REF(createimp)), 4 SECONDS) + addtimer(CALLBACK(src, PROC_REF(createimp)), 2 SECONDS) /obj/structure/imp_portal/Destroy() soundloop.stop() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm index 57af3603a36..61617dccc3d 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -233,7 +233,7 @@ attack_verb_continuous = "ferociously mauls" attack_verb_simple = "ferociously maul" environment_smash = ENVIRONMENT_SMASH_NONE - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/effect/particle_effect/foam, /obj/item/soap) + loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/particle_effect/foam, /obj/item/soap) attack_reagent = /datum/reagent/peaceborg/confuse /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/destroyer @@ -283,7 +283,7 @@ melee_damage_upper = 20 attack_verb_continuous = "awkwardly flails at" attack_verb_simple = "awkwardly flail at" - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/item/soap, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic/animal, /obj/effect/gibspawner/human/bodypartless, /obj/effect/gibspawner/human) + loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/item/soap, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic/animal, /obj/effect/gibspawner/human/bodypartless, /obj/effect/gibspawner/human) /mob/living/simple_animal/hostile/retaliate/clown/mutant/blob name = "Something that was once a clown" @@ -297,5 +297,5 @@ speed = 20 attack_verb_continuous = "bounces off of" attack_verb_simple = "bounce off of" - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/effect/particle_effect/foam, /obj/item/soap, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic/animal, /obj/effect/gibspawner/human/bodypartless, /obj/effect/gibspawner/human) + loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/particle_effect/foam, /obj/item/soap, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic/animal, /obj/effect/gibspawner/human/bodypartless, /obj/effect/gibspawner/human) attack_reagent = /datum/reagent/toxin/mindbreaker diff --git a/code/modules/mob/living/simple_animal/hostile/roguetown/crow.dm b/code/modules/mob/living/simple_animal/hostile/roguetown/crow.dm index 0f3476714db..28a374bd298 100644 --- a/code/modules/mob/living/simple_animal/hostile/roguetown/crow.dm +++ b/code/modules/mob/living/simple_animal/hostile/roguetown/crow.dm @@ -107,4 +107,4 @@ playsound(src, 'sound/vo/mobs/bird/birdfly.ogg', 100, TRUE, -1) qdel(src) return - ..() \ No newline at end of file + ..() diff --git a/code/modules/mob/living/simple_animal/hostile/roguetown/werewolf/update_icons.dm b/code/modules/mob/living/simple_animal/hostile/roguetown/werewolf/update_icons.dm index 5d61ba85383..8cf104505b7 100644 --- a/code/modules/mob/living/simple_animal/hostile/roguetown/werewolf/update_icons.dm +++ b/code/modules/mob/living/simple_animal/hostile/roguetown/werewolf/update_icons.dm @@ -173,4 +173,4 @@ hands += inhand_overlay overlays_standing[DAMAGE_LAYER] = hands - apply_overlay(DAMAGE_LAYER) \ No newline at end of file + apply_overlay(DAMAGE_LAYER) diff --git a/code/modules/mob/living/simple_animal/hostile/roguetown/werewolf/werewolf.dm b/code/modules/mob/living/simple_animal/hostile/roguetown/werewolf/werewolf.dm index 6f43b9792e9..bd4d1851305 100644 --- a/code/modules/mob/living/simple_animal/hostile/roguetown/werewolf/werewolf.dm +++ b/code/modules/mob/living/simple_animal/hostile/roguetown/werewolf/werewolf.dm @@ -28,7 +28,7 @@ footstep_type = FOOTSTEP_MOB_HEAVY /mob/living/simple_animal/hostile/rogue/werewolf/Initialize() - ..() + . = ..() regenerate_icons() ADD_TRAIT(src, TRAIT_SIMPLE_WOUNDS, TRAIT_GENERIC) */ diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 68ca242bffa..1c262c7ebcd 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -193,7 +193,7 @@ /obj/effect/proc_holder/spell/aoe_turf/blindness/cast(list/targets,mob/user = usr) for(var/mob/living/L in GLOB.alive_mob_list) var/turf/T = get_turf(L.loc) - if(T && T in targets) + if(T && (T in targets)) L.blind_eyes(4) return diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm index 3e8836b7236..09340044da2 100644 --- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm +++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm @@ -102,7 +102,7 @@ if(length(grasping) < max_grasps) grasping: for(var/mob/living/L in view(grasp_range, src)) - if(L == src || faction_check_mob(L) || L in grasping || L == target) + if(L == src || faction_check_mob(L) || (L in grasping) || L == target) continue for(var/turf/T in getline(src,L)) if (T.density) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 9e1cb037b88..af8a03f779a 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -297,9 +297,6 @@ /mob/living/simple_animal/parrot/attack_paw(mob/living/carbon/monkey/M) return attack_hand(M) -/mob/living/simple_animal/parrot/attack_alien(mob/living/carbon/alien/M) - return attack_hand(M) - //Simple animals /mob/living/simple_animal/parrot/attack_animal(mob/living/simple_animal/M) . = ..() //goodbye immortal parrots @@ -470,11 +467,11 @@ return return - if(parrot_interest && parrot_interest in view(src)) + if(parrot_interest && (parrot_interest in view(src))) parrot_state = PARROT_SWOOP | PARROT_STEAL return - if(parrot_perch && parrot_perch in view(src)) + if(parrot_perch && (parrot_perch in view(src))) parrot_state = PARROT_SWOOP | PARROT_RETURN return diff --git a/code/modules/mob/living/simple_animal/rogue/creacher/bigrat.dm b/code/modules/mob/living/simple_animal/rogue/creacher/bigrat.dm index d333616da21..d5757e0f2f3 100644 --- a/code/modules/mob/living/simple_animal/rogue/creacher/bigrat.dm +++ b/code/modules/mob/living/simple_animal/rogue/creacher/bigrat.dm @@ -55,7 +55,7 @@ pixel_y = -8 /mob/living/simple_animal/hostile/retaliate/rogue/bigrat/Initialize() - ..() + . = ..() gender = MALE if(prob(50)) gender = FEMALE @@ -182,6 +182,7 @@ return ..() /mob/living/simple_animal/hostile/retaliate/rogue/bigrat/shapeshift + faction = list("rats", "Station") health = 200 maxHealth = 200 erpable = TRUE diff --git a/code/modules/mob/living/simple_animal/rogue/creacher/cavetroll.dm b/code/modules/mob/living/simple_animal/rogue/creacher/cavetroll.dm index 1f416da6609..480e41b5907 100644 --- a/code/modules/mob/living/simple_animal/rogue/creacher/cavetroll.dm +++ b/code/modules/mob/living/simple_animal/rogue/creacher/cavetroll.dm @@ -122,4 +122,4 @@ w_class = WEIGHT_CLASS_BULKY resistance_flags = FLAMMABLE drop_sound = 'sound/foley/dropsound/gen_drop.ogg' - sellprice = 80 \ No newline at end of file + sellprice = 80 diff --git a/code/modules/mob/living/simple_animal/rogue/creacher/honeyspider.dm b/code/modules/mob/living/simple_animal/rogue/creacher/honeyspider.dm index 7a8bb7a19d1..e44d4f4077c 100644 --- a/code/modules/mob/living/simple_animal/rogue/creacher/honeyspider.dm +++ b/code/modules/mob/living/simple_animal/rogue/creacher/honeyspider.dm @@ -58,7 +58,7 @@ maxHealth = 130 /mob/living/simple_animal/hostile/retaliate/rogue/spider/Initialize() - ..() + . = ..() gender = MALE if(prob(33)) gender = FEMALE @@ -169,6 +169,8 @@ deaggroprob = 30 /mob/living/simple_animal/hostile/retaliate/rogue/spider/shapeshift + + faction = list("spiders", "Station") health = 150 maxHealth = 150 erpable = TRUE diff --git a/code/modules/mob/living/simple_animal/rogue/creacher/minotaur.dm b/code/modules/mob/living/simple_animal/rogue/creacher/minotaur.dm index 1b7aa266725..8571dc6b0be 100644 --- a/code/modules/mob/living/simple_animal/rogue/creacher/minotaur.dm +++ b/code/modules/mob/living/simple_animal/rogue/creacher/minotaur.dm @@ -64,22 +64,25 @@ icon_living = "ascend" icon = 'icons/mob/32x64.dmi' base_intents = list(/datum/intent/unarmed/ascendedclaw) - melee_damage_lower = 250 - melee_damage_upper = 550 - health = 666666 - maxHealth = 666666 - STACON = 66 - STASTR = 66 - STASPD = 66 - STAEND = 66 + health = 750 + maxHealth = 750 + melee_damage_lower = 55 + melee_damage_upper = 80 + STACON = 20 + STASTR = 20 + STASPD = 20 + STAEND = 20 /mob/living/simple_animal/hostile/retaliate/rogue/troll/blood/ascended/examine(mob/user) . = ..() - . += "It is impossible to comprehend such a thing." + . += "MY MIND CAN NOT COMPREHEND!!!" + if(ishuman(user) && !iscultist(user)) + var/mob/living/carbon/human/userhuman = user + userhuman.freak_out(3) //may give you a heart attack if the initial mass stress is still on you. /mob/living/simple_animal/hostile/retaliate/rogue/troll/blood/ascended/Initialize() . = ..() - set_light(5,5, LIGHT_COLOR_RED) + set_light(5,5, LIGHT_COLOR_PURPLE) /mob/living/simple_animal/hostile/retaliate/rogue/troll/blood/ascended/get_sound(input) switch(input) @@ -96,6 +99,15 @@ /mob/living/simple_animal/hostile/retaliate/rogue/troll/blood/death(gibbed) . = ..() + var/datum/game_mode/chaosmode/CM = SSticker.mode + for(var/mob/living/carbon/V in GLOB.human_list) + if(V.mind in CM.cultists) + to_chat(V, span_danger("WE FAILED, THE NEW GOD HAS FALLEN!!! I CANT.. OH NO!!! THE DIVINE LIGHT RETURNS TO THIS AREA!!! ")) + V.gib() + else + to_chat(V, span_greenannounce("THE DIVINE LIGHT RETURNS TO US!!!")) + V.remove_stress(/datum/stressevent/hatezizo) + V.add_stress(/datum/stressevent/zizodefeated) gib() qdel(src) diff --git a/code/modules/mob/living/simple_animal/rogue/creacher/mole.dm b/code/modules/mob/living/simple_animal/rogue/creacher/mole.dm index fc508233887..2a2b8e2227f 100644 --- a/code/modules/mob/living/simple_animal/rogue/creacher/mole.dm +++ b/code/modules/mob/living/simple_animal/rogue/creacher/mole.dm @@ -131,4 +131,5 @@ return ..() /mob/living/simple_animal/hostile/retaliate/rogue/mole/shapeshift + faction = list("wolfs", "Station") erpable = TRUE diff --git a/code/modules/mob/living/simple_animal/rogue/creacher/mudcrab.dm b/code/modules/mob/living/simple_animal/rogue/creacher/mudcrab.dm index 9e04c52634e..d4a64df5733 100644 --- a/code/modules/mob/living/simple_animal/rogue/creacher/mudcrab.dm +++ b/code/modules/mob/living/simple_animal/rogue/creacher/mudcrab.dm @@ -11,7 +11,6 @@ speak_chance = 1 turns_per_move = 5 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/rawcrab = 4, /obj/item/natural/carapace = 2) - faction = list("crabs") food_type = list(/obj/item/reagent_containers/food/snacks) response_help_continuous = "pets" response_help_simple = "pet" @@ -81,9 +80,7 @@ return spawning = TRUE update_icon() - spawn(2 SECONDS) - createcrab() - //addtimer(CALLBACK(src, PROC_REF(creategob)), 4 SECONDS) + addtimer(CALLBACK(src, PROC_REF(createcrab)), 2 SECONDS) diff --git a/code/modules/mob/living/simple_animal/rogue/creacher/rabbit.dm b/code/modules/mob/living/simple_animal/rogue/creacher/rabbit.dm index aa4da39ac97..4a1dc040799 100644 --- a/code/modules/mob/living/simple_animal/rogue/creacher/rabbit.dm +++ b/code/modules/mob/living/simple_animal/rogue/creacher/rabbit.dm @@ -87,6 +87,4 @@ return spawning = TRUE update_icon() - spawn(2 SECONDS) - createrabbit() - //addtimer(CALLBACK(src, PROC_REF(creategob)), 4 SECONDS) + addtimer(CALLBACK(src, PROC_REF(createrabbit)), 2 SECONDS) diff --git a/code/modules/mob/living/simple_animal/rogue/creacher/turtle.dm b/code/modules/mob/living/simple_animal/rogue/creacher/turtle.dm index 731aaa8a2ee..29bf61c80b3 100644 --- a/code/modules/mob/living/simple_animal/rogue/creacher/turtle.dm +++ b/code/modules/mob/living/simple_animal/rogue/creacher/turtle.dm @@ -81,9 +81,7 @@ return spawning = TRUE update_icon() - spawn(2 SECONDS) - createturtle() - //addtimer(CALLBACK(src, PROC_REF(creategob)), 4 SECONDS) + addtimer(CALLBACK(src, PROC_REF(createturtle)), 2 SECONDS) diff --git a/code/modules/mob/living/simple_animal/rogue/creacher/volf.dm b/code/modules/mob/living/simple_animal/rogue/creacher/volf.dm index 181bbc2154d..c63f6edf6a5 100644 --- a/code/modules/mob/living/simple_animal/rogue/creacher/volf.dm +++ b/code/modules/mob/living/simple_animal/rogue/creacher/volf.dm @@ -141,6 +141,7 @@ return ..() /mob/living/simple_animal/hostile/retaliate/rogue/wolf/shapeshift + faction = list("wolfs", "Station") health = 200 maxHealth = 200 erpable = TRUE diff --git a/code/modules/mob/living/simple_animal/rogue/farm/goat.dm b/code/modules/mob/living/simple_animal/rogue/farm/goat.dm index 9ac0c3ab2ed..e9652a840ee 100644 --- a/code/modules/mob/living/simple_animal/rogue/farm/goat.dm +++ b/code/modules/mob/living/simple_animal/rogue/farm/goat.dm @@ -1,5 +1,5 @@ /mob/living/simple_animal/hostile/retaliate/rogue/goat/Initialize() - ..() + . = ..() GLOB.farm_animals++ /mob/living/simple_animal/hostile/retaliate/rogue/goat/Destroy() @@ -244,7 +244,7 @@ D.set_vehicle_dir_layer(WEST, OBJ_LAYER) /mob/living/simple_animal/hostile/retaliate/rogue/goatmale/Initialize() - ..() + . = ..() GLOB.farm_animals++ /mob/living/simple_animal/hostile/retaliate/rogue/goatmale/Destroy() diff --git a/code/modules/mob/living/simple_animal/rogue/game/saiga.dm b/code/modules/mob/living/simple_animal/rogue/game/saiga.dm index ed4765f5eb9..d9886bc7c66 100644 --- a/code/modules/mob/living/simple_animal/rogue/game/saiga.dm +++ b/code/modules/mob/living/simple_animal/rogue/game/saiga.dm @@ -356,6 +356,7 @@ update_icon() /mob/living/simple_animal/hostile/retaliate/rogue/saiga/shapeshift + faction = list("saiga", "Station") health = 200 maxHealth = 200 erpable = TRUE diff --git a/code/modules/mob/living/simple_animal/rogue/rogueanimals.dm b/code/modules/mob/living/simple_animal/rogue/rogueanimals.dm index 3acfba1f384..b037e57d104 100644 --- a/code/modules/mob/living/simple_animal/rogue/rogueanimals.dm +++ b/code/modules/mob/living/simple_animal/rogue/rogueanimals.dm @@ -154,7 +154,7 @@ return FALSE /mob/living/simple_animal/hostile/retaliate/rogue/Initialize() - ..() + . = ..() if(milkies) udder = new() if(tame) @@ -179,9 +179,8 @@ ..() /mob/living/simple_animal/hostile/retaliate/rogue/Destroy() - qdel(udder) - udder = null - ..() + QDEL_NULL(udder) + return ..() /mob/living/simple_animal/hostile/retaliate/rogue/Life() . = ..() diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index e4057c33859..ce82fdbb22d 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -250,6 +250,7 @@ GLOBAL_VAR_INIT(farm_animals, FALSE) /mob/living/simple_animal/hostile var/retreating + var/attack_laying = FALSE /mob/living/simple_animal/hostile/updatehealth() ..() @@ -485,13 +486,6 @@ GLOBAL_VAR_INIT(farm_animals, FALSE) remove_movespeed_modifier(MOVESPEED_ID_SIMPLEMOB_VARSPEED, TRUE) add_movespeed_modifier(MOVESPEED_ID_SIMPLEMOB_VARSPEED, TRUE, 100, multiplicative_slowdown = speed, override = TRUE) -/mob/living/simple_animal/Stat() - ..() - return //RTCHANGE - if(statpanel("Status")) - stat(null, "Health: [round((health / maxHealth) * 100)]%") - return 1 - /mob/living/simple_animal/proc/drop_loot() if(loot.len) for(var/i in loot) @@ -541,7 +535,7 @@ GLOBAL_VAR_INIT(farm_animals, FALSE) return FALSE return TRUE -mob/living/simple_animal/handle_fire() +/mob/living/simple_animal/handle_fire() . = ..() if(fire_stacks > 0) apply_damage(5, BURN) @@ -601,10 +595,8 @@ mob/living/simple_animal/handle_fire() var/childspawn = pickweight(childtype) var/turf/target = get_turf(loc) if(target) - return new childspawn(target) -// visible_message(span_warning("[src] finally gives birth.")) playsound(src, 'sound/foley/gross.ogg', 100, FALSE) - breedchildren-- + return new childspawn(target) /mob/living/simple_animal/canUseTopic(atom/movable/M, be_close=FALSE, no_dexterity=FALSE, no_tk=FALSE) if(incapacitated()) diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index b9556fe9a6f..655ea47ebac 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -361,11 +361,11 @@ else for(var/mob/living/carbon/C in targets) if(!Discipline && prob(5)) - if(ishuman(C) || isalienadult(C)) + if(ishuman(C)) Target = C break - if(islarva(C) || ismonkey(C)) + if(ismonkey(C)) Target = C break diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 08655d1e2ec..fbbf3f64e69 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -313,10 +313,6 @@ if(..()) //successful monkey bite. attacked += 10 -/mob/living/simple_animal/slime/attack_larva(mob/living/carbon/alien/larva/L) - if(..()) //successful larva bite. - attacked += 10 - /mob/living/simple_animal/slime/attack_hulk(mob/living/carbon/human/user) . = ..() if(!.) @@ -364,7 +360,7 @@ if(possible_len) var/datum/surgery_step/done_step if(possible_len > 1) - var/input = input(M, "Which surgery step do you want to perform?", "PESTRA", ) as null|anything in possible_steps + var/input = input(M, "Which surgery step do you want to perform?", "HERMEIR", ) as null|anything in possible_steps if(input) done_step = possible_steps[input] else @@ -374,12 +370,6 @@ if(..()) //successful attack attacked += 10 -/mob/living/simple_animal/slime/attack_alien(mob/living/carbon/alien/humanoid/M) - if(..()) //if harm or disarm intent. - attacked += 10 - discipline_slime(M) - - /mob/living/simple_animal/slime/attackby(obj/item/W, mob/living/user, params) if(stat == DEAD && !user.cmode) var/list/possible_steps = list() @@ -392,7 +382,7 @@ if(possible_len) var/datum/surgery_step/done_step if(length(possible_steps) > 1) - var/input = input(user, "Which surgery step do you want to perform?", "PESTRA", ) as null|anything in possible_steps + var/input = input(user, "Which surgery step do you want to perform?", "HERMEIR", ) as null|anything in possible_steps if(input) done_step = possible_steps[input] else diff --git a/code/modules/mob/living/update_icons.dm b/code/modules/mob/living/update_icons.dm index 74de606d82b..ae99053cfed 100644 --- a/code/modules/mob/living/update_icons.dm +++ b/code/modules/mob/living/update_icons.dm @@ -13,17 +13,3 @@ overlays_standing[FIRE_LAYER] = new_fire_overlay apply_overlay(FIRE_LAYER) - -/mob/living/proc/update_turflayer(input) - return - -/mob/living/update_turflayer(input) - return - remove_overlay(TURF_LAYER) - - if(input) - var/mutable_appearance/new_fire_overlay = mutable_appearance('icons/turf/mob_overlay.dmi', input, -TURF_LAYER) - new_fire_overlay.appearance_flags = RESET_COLOR - overlays_standing[TURF_LAYER] = new_fire_overlay - - apply_overlay(TURF_LAYER) \ No newline at end of file diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 3e89b032356..567a77892ca 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -192,7 +192,7 @@ GLOBAL_VAR_INIT(mobids, 1) * * vision_distance (optional) define how many tiles away the message can be seen. * * ignored_mob (optional) doesn't show any message to a given mob if TRUE. */ -/atom/proc/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, runechat_message = null, log_seen = NONE, log_seen_msg = null) +/atom/proc/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, runechat_message = null, log_seen = NONE, log_seen_msg = null, mob/target = null, target_message = null) var/turf/T = get_turf(src) if(!T) return @@ -202,6 +202,9 @@ GLOBAL_VAR_INIT(mobids, 1) hearers -= ignored_mobs if(self_message) hearers -= src + if(target && target_message) + hearers -= target + target.show_message(target_message, MSG_VISUAL, blind_message, MSG_AUDIBLE) for(var/mob/M in hearers) if(!M.client) continue @@ -220,7 +223,7 @@ GLOBAL_VAR_INIT(mobids, 1) log_seen(src, null, hearers, (log_seen_msg ? log_seen_msg : message), log_seen) ///Adds the functionality to self_message. -/mob/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, runechat_message = null, log_seen = NONE, log_seen_msg = null) +/mob/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, runechat_message = null, log_seen = NONE, log_seen_msg = null, target = null, target_message = null) . = ..() if(self_message) show_message(self_message, MSG_VISUAL, blind_message, MSG_AUDIBLE) @@ -1378,3 +1381,17 @@ GLOBAL_VAR_INIT(mobids, 1) return FALSE else return TRUE + +/proc/find_match_in_list(list/list_A, list/list_B, exact_match) + var/list/match_list + if(!list_A || !list_B) + return + if(exact_match) + match_list = list_A&list_B //only items in both lists + var/length = LAZYLEN(match_list) + if(length) + return (length == LAZYLEN(list_A)) //if they're not the same len(gth) or we don't have a len, then this isn't an exact match. + else + match_list = list_A&list_B + return LAZYLEN(match_list) + return FALSE diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index fab7cb91b57..d81a8ce96c2 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -90,7 +90,7 @@ if ((copytext_char(te, p, p + 1) == " " || prob(pr))) t = text("[][]", t, copytext_char(te, p, p + 1)) else - t = text("[]*", t) + t = text("[]*", t) // stopgap until the custom say verb character is changed if(n > MAX_BROADCAST_LEN) t += "..." //signals missing text return t @@ -128,6 +128,8 @@ newletter+="[newletter]" if(20) newletter+="[newletter][newletter]" + else + ;; newphrase+="[newletter]";counter-=1 return newphrase @@ -140,7 +142,7 @@ var/newletter="" while(counter>=1) newletter=copytext_char(phrase,(leng-counter)+1,(leng-counter)+2) - if(rand(1,2)==2) + if(prob(50)) if(lowertext(newletter)=="o") newletter="u" if(lowertext(newletter)=="t") @@ -153,7 +155,7 @@ newletter=" NAR " if(lowertext(newletter)=="s") newletter=" SIE " - if(rand(1,4)==4) + if(prob(25)) if(newletter==" ") newletter=" no hope... " if(newletter=="H") @@ -170,6 +172,8 @@ newletter="nglu" if(5) newletter="glor" + else + ;; newphrase+="[newletter]";counter-=1 return newphrase @@ -591,7 +595,7 @@ if(hud_used.cmode_button) hud_used.cmode_button.update_icon() -/mob/proc/set_cmode(var/new_cmode) +/mob/proc/set_cmode(new_cmode) if(cmode == new_cmode) return cmode = new_cmode @@ -798,7 +802,7 @@ for(var/mob/dead/observer/O in GLOB.player_list) if(!notify_suiciders && (O in GLOB.suicided_mob_list)) continue - if (ignore_key && O.ckey in GLOB.poll_ignore[ignore_key]) + if (ignore_key && (O.ckey in GLOB.poll_ignore[ignore_key])) continue var/orbit_link if (source && action == NOTIFY_ORBIT) diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 2948c9649cd..6739ea5efe2 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -29,7 +29,7 @@ whisper(message) ///whisper a message -/mob/proc/whisper(message, datum/language/language=null) +/mob/proc/whisper(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) say(message, language) //only living mobs actually whisper, everything else just talks ///The me emote verb @@ -70,12 +70,9 @@ ///Speak as a dead person (ghost etc) /mob/proc/say_dead(message) - var/name = real_name - var/alt_name = "" - return - if(GLOB.say_disabled) //This is here to try to identify lag problems +/* if(GLOB.say_disabled) //This is here to try to identify lag problems to_chat(usr, span_danger("Speech is currently admin-disabled.")) return @@ -114,7 +111,7 @@ log_talk(message, LOG_SAY, tag="DEAD") if(SEND_SIGNAL(src, COMSIG_MOB_DEADSAY, message) & MOB_DEADSAY_SIGNAL_INTERCEPT) return - deadchat_broadcast(rendered, source, follow_target = src, speaker_key = key) + deadchat_broadcast(rendered, source, follow_target = src, speaker_key = key) */ ///Check if this message is an emote /mob/proc/check_emote(message, forced) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index e8f6d6b6956..eb88a681684 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -432,37 +432,6 @@ . = R qdel(src) -//human -> alien -/mob/living/carbon/human/proc/Alienize() - if (notransform) - return - notransform = TRUE - mobility_flags = NONE - for(var/obj/item/W in src) - dropItemToGround(W) - regenerate_icons() - icon = null - invisibility = INVISIBILITY_MAXIMUM - for(var/t in bodyparts) - qdel(t) - - var/alien_caste = pick("Hunter","Sentinel","Drone") - var/mob/living/carbon/alien/humanoid/new_xeno - switch(alien_caste) - if("Hunter") - new_xeno = new /mob/living/carbon/alien/humanoid/hunter(loc) - if("Sentinel") - new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(loc) - if("Drone") - new_xeno = new /mob/living/carbon/alien/humanoid/drone(loc) - - new_xeno.a_intent = INTENT_HARM - new_xeno.key = key - - to_chat(new_xeno, "I are now an alien.") - . = new_xeno - qdel(src) - /mob/living/carbon/human/proc/slimeize(reproduce as num) if (notransform) return diff --git a/code/modules/mob/update_icons.dm b/code/modules/mob/update_icons.dm index bd1dc3bce42..dec5450caa4 100644 --- a/code/modules/mob/update_icons.dm +++ b/code/modules/mob/update_icons.dm @@ -89,4 +89,4 @@ return /mob/proc/update_inv_mouth() - return \ No newline at end of file + return diff --git a/code/modules/mob/vision_cone.dm b/code/modules/mob/vision_cone.dm index 9f7ce570cb0..1eb031203c0 100644 --- a/code/modules/mob/vision_cone.dm +++ b/code/modules/mob/vision_cone.dm @@ -1,5 +1,5 @@ -client/ +/client var/list/hidden_atoms = list() var/list/hidden_mobs = list() var/list/hidden_images = list() @@ -39,7 +39,7 @@ client/ list -= A return list -/proc/get_cone_turfs(turf/starter_turf, var/dir_to_use, cone_levels = 3) +/proc/get_cone_turfs(turf/starter_turf, dir_to_use, cone_levels = 3) var/list/turfs_to_return = list() var/turf/turf_to_use = starter_turf var/turf/left_turf diff --git a/code/modules/modular_computers/computers/item/processor.dm b/code/modules/modular_computers/computers/item/processor.dm index 5139d71361d..85c1bd74ad5 100644 --- a/code/modules/modular_computers/computers/item/processor.dm +++ b/code/modules/modular_computers/computers/item/processor.dm @@ -23,7 +23,6 @@ if(!comp || !istype(comp, /obj/machinery/modular_computer)) CRASH("Inapropriate type passed to obj/item/modular_computer/processor/New()! Aborting.") - return // Obtain reference to machinery computer all_components = list() idle_threads = list() diff --git a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm index f091fca2e98..a968975ee17 100644 --- a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm @@ -126,7 +126,6 @@ if(!computer) // This program shouldn't even be runnable without computer. CRASH("Var computer is null!") - return 1 if(!hard_drive) computer.visible_message(span_warning("\The [computer] shows an \"I/O Error - Hard drive connection error\" warning.")) else // In 99.9% cases this will mean our HDD is full diff --git a/code/modules/modular_computers/hardware/battery_module.dm b/code/modules/modular_computers/hardware/battery_module.dm index 6f58f5f3fa4..914e53a1e97 100644 --- a/code/modules/modular_computers/hardware/battery_module.dm +++ b/code/modules/modular_computers/hardware/battery_module.dm @@ -49,20 +49,18 @@ if(!battery) to_chat(user, span_warning("There is no power cell connected to \the [src].")) return FALSE + if(user) + user.put_in_hands(battery) else - if(user) - user.put_in_hands(battery) - else - battery.forceMove(drop_location()) - to_chat(user, span_notice("I detach \the [battery] from \the [src].")) - battery = null - - if(holder) - if(holder.enabled && !holder.use_power()) - holder.shutdown_computer() - - return TRUE - return FALSE + battery.forceMove(drop_location()) + to_chat(user, span_notice("I detach \the [battery] from \the [src].")) + battery = null + + if(holder) + if(holder.enabled && !holder.use_power()) + holder.shutdown_computer() + + return TRUE diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 89751b1c32b..d20407f4574 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -424,14 +424,12 @@ if(length(info) > maxlen) to_chat(user, span_warning("[src] is full of verba.")) return - if(user.can_read(src)) - format_browse(info_links, user) - update_icon_state() - return - else + if(!user.can_read(src)) to_chat(user, span_warning("I can't write.")) return - return + format_browse(info_links, user) + update_icon_state() + return TRUE if(istype(P, /obj/item/paper)) var/obj/item/paper/p = P diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index c5ed328bcab..2197c152612 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -115,9 +115,7 @@ to_chat(usr, span_notice("I feel kind of silly, copying [ass == usr ? "your" : ass][ass == usr ? "" : "\'s"] ass with [ass == usr ? "your" : "[ass.p_their()]"] clothes on.") ) break else if(toner >= 5 && !busy && check_ass()) //You have to be sitting on the copier and either be a xeno or a human without clothes on. - if(isalienadult(ass) || istype(ass, /mob/living/simple_animal/hostile/alien)) //Xenos have their own asses, thanks to Pybro. - temp_img = icon('icons/ass/assalien.png') - else if(ishuman(ass)) //Suit checks are in check_ass + if(ishuman(ass)) //Suit checks are in check_ass temp_img = icon(ass.gender == FEMALE ? 'icons/ass/assfemale.png' : 'icons/ass/assmale.png') else if(isdrone(ass)) //Drones are hot temp_img = icon('icons/ass/assdrone.png') diff --git a/code/modules/photography/photos/album.dm b/code/modules/photography/photos/album.dm index 10a2c33aa04..08670c49d8a 100644 --- a/code/modules/photography/photos/album.dm +++ b/code/modules/photography/photos/album.dm @@ -96,10 +96,10 @@ name = "photo album (Library)" persistence_id = "library" -obj/item/storage/photo_album/chapel +/obj/item/storage/photo_album/chapel name = "photo album (Chapel)" persistence_id = "chapel" -obj/item/storage/photo_album/prison +/obj/item/storage/photo_album/prison name = "photo album (Prison)" persistence_id = "prison" diff --git a/code/modules/plumbing/ducts.dm b/code/modules/plumbing/ducts.dm index 49af02ecd39..a67fc02cc99 100644 --- a/code/modules/plumbing/ducts.dm +++ b/code/modules/plumbing/ducts.dm @@ -42,8 +42,8 @@ All the important duct code: active = FALSE anchored = FALSE else if(!can_anchor()) + . = INITIALIZE_HINT_QDEL CRASH("Overlapping ducts detected") - qdel(src) if(force_connects) connects = force_connects //skip change_connects() because we're still initializing and we need to set our connects at one point if(!lock_layers) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 2cc3cb43c67..435124cf74b 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -559,7 +559,6 @@ var/turf/host_turf = get_turf(src) if(!host_turf) CRASH("attackby on APC when it's not on a turf") - return if (host_turf.intact) to_chat(user, span_warning("I must remove the floor plating in front of the APC first!")) return @@ -1360,8 +1359,6 @@ if(!prob(prb)) return 0 do_sparks(5, TRUE, src) - if(isalien(user)) - return 0 if(electrocute_mob(user, src, src, 1, TRUE)) return 1 else diff --git a/code/modules/power/multiz.dm b/code/modules/power/multiz.dm index 88f45e5258b..3f044f2f574 100644 --- a/code/modules/power/multiz.dm +++ b/code/modules/power/multiz.dm @@ -73,8 +73,8 @@ if(C && C.powernet) C.powernet.add_machine(src) //Nice we're in. powernet = C.powernet - below = locate(/obj/machinery/power/deck_relay) in(SSmapping.get_turf_below(T)) - above = locate(/obj/machinery/power/deck_relay) in(SSmapping.get_turf_above(T)) + below = locate(/obj/machinery/power/deck_relay) in(GET_TURF_BELOW(T)) + above = locate(/obj/machinery/power/deck_relay) in(GET_TURF_ABOVE(T)) if(below || above) icon_state = "cablerelay-on" return TRUE diff --git a/code/modules/power/roguelighting.dm b/code/modules/power/roguelighting.dm index 9cc86db797d..0d0372f0b98 100644 --- a/code/modules/power/roguelighting.dm +++ b/code/modules/power/roguelighting.dm @@ -32,8 +32,8 @@ GLOB.sunlights -= src . = ..() -/obj/effect/sunlight/New() - ..() +/obj/effect/sunlight/Initialize(mapload) + . = ..() #ifdef TESTING icon_state = "electricity2" #else @@ -66,9 +66,9 @@ startTurfX = 1 startTurfY = 1 -/obj/effect/landmark/mapGenerator/sunlights/New() +/obj/effect/landmark/mapGenerator/sunlights/Initialize(mapload) GLOB.sky_z |= z - . = ..() + return ..() /datum/mapGenerator/sunlights modules = list(/datum/mapGeneratorModule/sunlights) @@ -223,7 +223,7 @@ GLOB.fires_list -= src /obj/machinery/light/rogue/Destroy() - QDEL_NULL(soundloop) + QDEL_NULL(soundloop) GLOB.fires_list -= src . = ..() @@ -331,7 +331,7 @@ /obj/machinery/light/rogue/break_light_tube(skip_sound_and_sparks = 0) if(status == LIGHT_EMPTY || status == LIGHT_BROKEN) - return + return if(!skip_sound_and_sparks) if(status == LIGHT_OK || status == LIGHT_BURNED) playsound(src.loc, 'sound/blank.ogg', 75, TRUE) @@ -474,7 +474,7 @@ if(WEST) pixel_x = -32 . = ..() - + /obj/machinery/light/rogue/wallfire/candle/attack_hand(mob/user) if(isliving(user) && on) user.visible_message(span_warning("[user] snuffs [src].")) @@ -681,7 +681,7 @@ to_chat(user, "Remove the pot from the hearth first.") return if(istype(attachment, /obj/item/cooking/pan)) - if(W.type in subtypesof(/obj/item/reagent_containers/food/snacks)) + if(istype(W, /obj/item/reagent_containers/food/snacks)) var/obj/item/reagent_containers/food/snacks/S = W if(istype(W, /obj/item/reagent_containers/food/snacks/egg)) // added playsound(get_turf(user), 'modular/Neu_Food/sound/eggbreak.ogg', 100, TRUE, -1) @@ -715,7 +715,7 @@ pot.reagents.remove_reagent(/datum/reagent/water, 1) return - if(W.type in subtypesof(/obj/item/reagent_containers/food/snacks/rogue/veg)) + if(istype(W, /obj/item/reagent_containers/food/snacks/rogue/veg)) if(!pot.reagents.has_reagent(/datum/reagent/water, 33)) to_chat(user, "Not enough water.") return TRUE @@ -746,7 +746,7 @@ pot.reagents.remove_reagent(/datum/reagent/water, 1) return - if(W.type in subtypesof(/obj/item/reagent_containers/food/snacks/rogue/meat)) + if(istype(W, /obj/item/reagent_containers/food/snacks/rogue/meat)) if(!pot.reagents.has_reagent(/datum/reagent/water, 33)) to_chat(user, "Not enough water.") return TRUE @@ -790,14 +790,14 @@ /* This is the blackstone version, not compatible but retained so it can be injected into say stews if the new system ends up too shallow. - if(W.type in subtypesof(/obj/item/reagent_containers/food/snacks) || W.type == /obj/item/reagent_containers/powder/flour) + if(istype(W, /obj/item/reagent_containers/food/snacks) || W.type == /obj/item/reagent_containers/powder/flour) if(pot.reagents.chem_temp < 374) to_chat(user, span_warning("[pot] isn't boiling!")) return var/nutrimentamount = W.reagents.get_reagent_amount(/datum/reagent/consumable/nutriment) - if(W.type in subtypesof(/obj/item/reagent_containers/food/snacks)) + if(istype(W, /obj/item/reagent_containers/food/snacks)) var/obj/item/reagent_containers/food/snacks/snack = W - if(snack.type in subtypesof(/obj/item/reagent_containers/food/snacks/grown) || snack.eat_effect == /datum/status_effect/debuff/uncookedfood) + if(istype(snack, /obj/item/reagent_containers/food/snacks/grown) || snack.eat_effect == /datum/status_effect/debuff/uncookedfood) nutrimentamount += 5 //fuck it extra yield so soups are worth a shit. nutrimentamount *= 1.25 //Boiling food makes more nutrients digestable. if(istype(W, /obj/item/reagent_containers/food/snacks/grown/wheat) || istype(W, /obj/item/reagent_containers/food/snacks/grown/oat) || istype(W, /obj/item/reagent_containers/powder/flour)) @@ -898,7 +898,7 @@ burn_out() /obj/machinery/light/rogue/hearth/Destroy() - QDEL_NULL(boilloop) + QDEL_NULL(boilloop) . = ..() /obj/machinery/light/rogue/campfire diff --git a/code/modules/power/singularity/boh_tear.dmplasmamen.dm b/code/modules/power/singularity/boh_tear.dmplasmamen.dm deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 90f3c2e6864..950f5d3cec4 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -22,8 +22,10 @@ air_update_turf(TRUE) /obj/machinery/field/containment/Destroy() - FG1.fields -= src - FG2.fields -= src + if(length(FG1?.fields)) + FG1.fields -= src + if(length(FG2?.fields)) + FG2.fields -= src CanAtmosPass = ATMOS_PASS_YES air_update_turf(TRUE) return ..() diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index adb29485848..ededc35dd53 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -67,9 +67,6 @@ /obj/singularity/attack_paw(mob/user) consume(user) -/obj/singularity/attack_alien(mob/user) - consume(user) - /obj/singularity/attack_animal(mob/user) consume(user) @@ -351,12 +348,12 @@ var/dir2 = 0 var/dir3 = 0 switch(direction) - if(NORTH||SOUTH) - dir2 = 4 - dir3 = 8 - if(EAST||WEST) - dir2 = 1 - dir3 = 2 + if(NORTH, SOUTH) + dir2 = EAST + dir3 = WEST + if(EAST, WEST) + dir2 = NORTH + dir3 = SOUTH var/turf/T2 = T for(var/j = 1 to steps-1) T2 = get_step(T2,dir2) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index e1bd94e09fd..69efed87566 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -574,9 +574,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal/attack_paw(mob/user) dust_mob(user, cause = "monkey attack") -/obj/machinery/power/supermatter_crystal/attack_alien(mob/user) - dust_mob(user, cause = "alien attack") - /obj/machinery/power/supermatter_crystal/attack_animal(mob/living/simple_animal/S) var/murder if(!S.melee_damage_upper && !S.melee_damage_lower) diff --git a/code/modules/procedural_mapping/mapGeneratorModule.dm b/code/modules/procedural_mapping/mapGeneratorModule.dm index d7399909a94..01328f0d757 100644 --- a/code/modules/procedural_mapping/mapGeneratorModule.dm +++ b/code/modules/procedural_mapping/mapGeneratorModule.dm @@ -24,9 +24,13 @@ /datum/mapGeneratorModule/proc/generate() if(!mother) return + excluded_turfs = typecacheof(excluded_turfs) + allowed_turfs = typecacheof(allowed_turfs) + allowed_areas = typecacheof(allowed_areas, only_root_path = !include_subtypes) var/list/map = mother.map for(var/turf/T in map) place(T) + CHECK_TICK //Place a spawnable atom or turf on this turf @@ -36,27 +40,16 @@ var/clustering = 0 var/skipLoopIteration = FALSE - if(T.type in excluded_turfs) + if(excluded_turfs[T.type]) return - if(allowed_turfs.len) - if(!(T.type in allowed_turfs)) - return + if(length(allowed_turfs) && !allowed_turfs[T.type]) + return - if(allowed_areas.len) + if(length(allowed_areas)) var/area/A = get_area(T) - if(A) - if(include_subtypes) - var/found - for(var/AT in allowed_areas) - if(istype(A, AT)) - found = TRUE - break - if(!found) - return - else - if(!(A.type in allowed_areas)) - return + if(!allowed_areas[A.type]) + return //Turfs don't care whether atoms can be placed here for(var/turfPath in spawnableTurfs) diff --git a/code/modules/projectiles/boxes_magazines/internal/pew.dm b/code/modules/projectiles/boxes_magazines/internal/pew.dm deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index c0879a83043..3bff1f6bf4e 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -15,11 +15,11 @@ bolt_drop_sound = 'sound/blank.ogg' tac_reloads = FALSE -obj/item/gun/ballistic/rifle/update_icon() +/obj/item/gun/ballistic/rifle/update_icon() ..() add_overlay("[icon_state]_bolt[bolt_locked ? "_locked" : ""]") -obj/item/gun/ballistic/rifle/rack(mob/user = null) +/obj/item/gun/ballistic/rifle/rack(mob/user = null) if (bolt_locked == FALSE) to_chat(user, span_notice("I open the bolt of \the [src].")) playsound(src, rack_sound, rack_sound_volume, rack_sound_vary) @@ -29,12 +29,12 @@ obj/item/gun/ballistic/rifle/rack(mob/user = null) return drop_bolt(user) -obj/item/gun/ballistic/rifle/can_shoot() +/obj/item/gun/ballistic/rifle/can_shoot() if (bolt_locked) return FALSE return ..() -obj/item/gun/ballistic/rifle/attackby(obj/item/A, mob/user, params) +/obj/item/gun/ballistic/rifle/attackby(obj/item/A, mob/user, params) if (!bolt_locked) to_chat(user, span_notice("The bolt is closed!")) return diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index fc4a506397f..d46293a7a73 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -189,10 +189,7 @@ var/splatter_dir = dir if(starting) splatter_dir = get_dir(starting, target_loca) - if(isalien(L)) - new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target_loca, splatter_dir) - else - new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir) + new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir) if(prob(33)) L.add_splatter_floor(target_loca) @@ -575,7 +572,7 @@ if(!direct_target) //If they're able to 1. stand or 2. use items or 3. move, AND they are not softcrit, they are not stunned enough to dodge projectiles passing over. //If they're dead they shouldn't be getting hit by indirect fire - if((CHECK_BITFIELD(L.mobility_flags, MOBILITY_USE | MOBILITY_STAND | MOBILITY_MOVE) && L.stat == CONSCIOUS) || L.stat == DEAD) + if((CHECK_BITFIELD(L.mobility_flags, MOBILITY_USE | MOBILITY_STAND | MOBILITY_MOVE) && L.stat == CONSCIOUS) || L.stat == DEAD) return FALSE return TRUE diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 8c5169cf1ea..8488acf969f 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -184,7 +184,7 @@ var/mob/living/new_mob - var/randomize = pick("monkey","robot","slime","xeno","humanoid","animal") + var/randomize = pick("monkey","robot","slime","humanoid","animal") switch(randomize) if("monkey") new_mob = new /mob/living/carbon/monkey(M.loc) @@ -210,14 +210,6 @@ if("slime") new_mob = new /mob/living/simple_animal/slime/random(M.loc) - if("xeno") - var/Xe - if(M.ckey) - Xe = pick(/mob/living/carbon/alien/humanoid/hunter,/mob/living/carbon/alien/humanoid/sentinel) - else - Xe = pick(/mob/living/carbon/alien/humanoid/hunter,/mob/living/simple_animal/hostile/alien/sentinel) - new_mob = new Xe(M.loc) - if("animal") var/path = pick(/mob/living/simple_animal/hostile/carp, /mob/living/simple_animal/hostile/bear, @@ -233,8 +225,6 @@ /mob/living/simple_animal/hostile/carp/ranged/chaos, /mob/living/simple_animal/hostile/retaliate/rogue/asteroid/basilisk/watcher, /mob/living/simple_animal/hostile/retaliate/rogue/asteroid/goliath/beast, - /mob/living/simple_animal/hostile/headcrab, - /mob/living/simple_animal/hostile/morph, /mob/living/simple_animal/hostile/stickman, /mob/living/simple_animal/hostile/stickman/dog, /mob/living/simple_animal/hostile/retaliate/rogue/megafauna/dragon/lesser, diff --git a/code/modules/projectiles/projectile/special/hallucination.dmlizardpeople.dm b/code/modules/projectiles/projectile/special/hallucination.dmlizardpeople.dm deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/code/modules/projectiles/projectile/special/neurotoxin.dm b/code/modules/projectiles/projectile/special/neurotoxin.dm index d7e50b595db..e4ee605aee1 100644 --- a/code/modules/projectiles/projectile/special/neurotoxin.dm +++ b/code/modules/projectiles/projectile/special/neurotoxin.dm @@ -4,9 +4,3 @@ damage = 5 damage_type = TOX paralyze = 100 - -/obj/projectile/bullet/neurotoxin/on_hit(atom/target, blocked = FALSE) - if(isalien(target)) - paralyze = 0 - nodamage = TRUE - return ..() diff --git a/code/modules/projectiles/projectile/special/plasma.dm b/code/modules/projectiles/projectile/special/plasma.dm index b398731cfd6..290d07c6f08 100644 --- a/code/modules/projectiles/projectile/special/plasma.dm +++ b/code/modules/projectiles/projectile/special/plasma.dm @@ -15,7 +15,7 @@ . = ..() if(ismineralturf(target)) var/turf/closed/mineral/M = target - M.gets_drilled(firer, FALSE) + M.gets_drilled(firer) if(mine_range) mine_range-- range++ diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index e9a8f34fc20..67ae5b0e80a 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -726,7 +726,6 @@ if(isnull(amount)) amount = 0 CRASH("null amount passed to reagent code") - return FALSE if(!isnum(amount)) return FALSE diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index b513ccce019..f48928ed3f2 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -250,7 +250,7 @@ if(!is_operational() || recording_recipe) return var/amount = text2num(params["amount"]) - if(beaker && amount in beaker.possible_transfer_amounts) + if(beaker && (amount in beaker.possible_transfer_amounts)) beaker.reagents.remove_all(amount) work_animation() . = TRUE diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index b1290b1ec5f..84867b17ac4 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -538,7 +538,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "" /datum/reagent/consumable/ethanol/screwdrivercocktail/on_mob_life(mob/living/carbon/M) - if(M.mind && M.mind.assigned_role in list("Station Engineer", "Atmospheric Technician", "Chief Engineer")) //Engineers lose radiation poisoning at a massive rate. + if(M.mind && (M.mind.assigned_role in list("Station Engineer", "Atmospheric Technician", "Chief Engineer"))) //Engineers lose radiation poisoning at a massive rate. M.radiation = max(M.radiation - 25, 0) return ..() diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 160301305cb..242321e75d7 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -894,3 +894,80 @@ glass_icon_state = "glass_yellow" glass_name = "glass of bungo juice" glass_desc = "" +//////////////////////////////////////////////////////////////////-------------------------------DREAM-------------------------------//////////////////////////////////// + +/datum/reagent/consumable/acorn_powder + name = "Acorn Powder" + description = "A bitter fine powder" + color = "#dcb137" + quality = DRINK_VERYGOOD + taste_description = "bitter earthy-ness" + +/datum/reagent/consumable/acorn_powder/on_mob_life(mob/living/carbon/M) + M.rogstam_add(8) + ..() + +/datum/reagent/consumable/Acoffee + name = "Acorn Coffee" + description = "A nice bitter stimulating brew" + color = "#800000" + quality = DRINK_VERYGOOD + taste_description = "robust earthy-ness" + metabolization_rate = 0.2 * REAGENTS_METABOLISM + overdose_threshold = null + var/hydration = 8 + +// Add variables to track initial and consumed amounts +/mob/living/carbon/var/initial_acoffee_amount = 0 // Tracks the initial amount of Acorn Coffee when consumed +/mob/living/carbon/var/metabolized_acoffee = 0 // Tracks the total amount of Acorn Coffee metabolized + +/datum/reagent/consumable/Acoffee/on_mob_life(mob/living/carbon/M) + // Initialize the initial amount when first consumed + if(M.initial_acoffee_amount == 0) + M.initial_acoffee_amount = M.reagents.get_reagent_amount(src) + + // Calculate the current amount and the amount metabolized in this cycle + var current_amount = M.reagents.get_reagent_amount(src) + var metabolized_now = (M.initial_acoffee_amount - current_amount) * metabolization_rate + + // Update the total metabolized amount + M.metabolized_acoffee += metabolized_now + // Update the initial amount for the next cycle + M.initial_acoffee_amount = current_amount + + // Apply the effects of Acorn Coffee + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(!HAS_TRAIT(H, TRAIT_NOHUNGER)) + H.adjust_hydration(hydration) + if(M.blood_volume < BLOOD_VOLUME_NORMAL) + M.blood_volume = min(M.blood_volume+10, BLOOD_VOLUME_NORMAL) + M.rogstam_add(8) + M.dizziness = max(0, M.dizziness - 5) + M.drowsyness = max(0, M.drowsyness - 3) + M.SetSleeping(0, FALSE) + + // Remove the sleepytime status effect after 12u of Acorn Coffee has metabolized + if(M.metabolized_acoffee >= 12) + if(M.has_status_effect(/datum/status_effect/debuff/sleepytime)) + M.remove_status_effect(/datum/status_effect/debuff/sleepytime) + M.remove_stress(/datum/stressevent/sleepytime) + M.mind.sleep_adv.advance_cycle() + + ..() + +/datum/chemical_reaction/alch/acoffee + name = "coffee-acorn" + mix_sound = 'sound/items/fillbottle.ogg' + id = /datum/reagent/consumable/Acoffee + required_temp = 374 + results = list(/datum/reagent/consumable/Acoffee = 6) + required_reagents = list(/datum/reagent/consumable/acorn_powder = 1, /datum/reagent/water = 5) + +/datum/chemical_reaction/alch/acoffee/on_reaction(mob/user, obj/item/reagent_containers/container, total_volume) + . = ..() + if(container) + // Remove all leftover water + container.reagents.del_reagent(/datum/reagent/water) + + diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 70b73ff5af4..3d213acc160 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -55,7 +55,7 @@ show_when_dead = FALSE /atom/movable/screen/fullscreen/weedsm/Initialize() - ..() + . = ..() // if(L.has_status_effect(/datum/status_effect/buff/weed)) filters += filter(type="angular_blur",x=5,y=5,size=1) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index b6be1f260f1..e31e7fa2675 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -134,6 +134,10 @@ var/hydration = 12 alpha = 100 +/datum/reagent/water/pussjuice + name = "pussy juice" + description = "A strange slightly gooey substance." + /datum/chemical_reaction/grosswaterify name = "grosswater" id = /datum/reagent/water/gross @@ -302,16 +306,15 @@ var/mob/living/carbon/human/H = M if(!HAS_TRAIT(H, TRAIT_NOHUNGER)) H.adjust_hydration(hydration) - if(!data) - data = 1 - data++ + var/count = LAZYACCESS(data, "misc") + 1 + LAZYSET(data, "misc", count) M.jitteriness = min(M.jitteriness+4,10) if(iscultist(M)) for(var/datum/action/innate/cult/blood_magic/BM in M.actions) to_chat(M, span_cultlarge("My blood rites falter as holy water scours my body!")) for(var/datum/action/innate/cult/blood_spell/BS in BM.spells) qdel(BS) - if(data >= 25) // 10 units, 45 seconds @ metabolism 0.4 units & tick rate 1.8 sec + if(count >= 25) // 10 units, 45 seconds @ metabolism 0.4 units & tick rate 1.8 sec if(!M.stuttering) M.stuttering = 1 M.stuttering = min(M.stuttering+4, 10) @@ -323,7 +326,7 @@ M.Unconscious(120) to_chat(M, "[pick("Your blood is my bond - you are nothing without it", "Do not forget my place", \ "All that power, and you still fail?", "If you cannot scour this poison, I shall scour my meager life!")].") - if(data >= 60) // 30 units, 135 seconds + if(count >= 60) // 30 units, 135 seconds if(iscultist(M)) SSticker.mode.remove_cultist(M.mind, FALSE, TRUE) M.jitteriness = 0 @@ -732,16 +735,6 @@ if(method != TOUCH) L.ForceContractDisease(new /datum/disease/transformation/slime(), FALSE, TRUE) -/datum/reagent/gluttonytoxin - name = "Gluttony's Blessing" - description = "An advanced corruptive toxin produced by something terrible." - color = "#5EFF3B" //RGB: 94, 255, 59 - can_synth = FALSE - taste_description = "decay" - -/datum/reagent/gluttonytoxin/reaction_mob(mob/living/L, method=TOUCH, reac_volume) - L.ForceContractDisease(new /datum/disease/transformation/morph(), FALSE, TRUE) - /datum/reagent/serotrotium name = "Serotrotium" description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans." @@ -1165,17 +1158,6 @@ if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection)))) L.ForceContractDisease(new /datum/disease/transformation/robot(), FALSE, TRUE) -/datum/reagent/xenomicrobes - name = "Xenomicrobes" - description = "Microbes with an entirely alien cellular structure." - color = "#535E66" // rgb: 83, 94, 102 - can_synth = FALSE - taste_description = "sludge" - -/datum/reagent/xenomicrobes/reaction_mob(mob/living/L, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0) - if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection)))) - L.ForceContractDisease(new /datum/disease/transformation/xeno(), FALSE, TRUE) - /datum/reagent/fungalspores name = "Tubercle bacillus Cosmosis microbes" description = "Active fungal spores." @@ -1489,10 +1471,6 @@ taste_description = "bitterness" taste_mult = 1.5 -/datum/reagent/stable_plasma/on_mob_life(mob/living/carbon/C) - C.adjustPlasma(10) - ..() - /datum/reagent/iodine name = "Iodine" description = "Commonly added to table salt as a nutrient. On its own it tastes far less pleasing." diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index d8d36ac3d9f..f95c6b67534 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -6,6 +6,7 @@ description = "A toxic chemical." color = "#CF3600" // rgb: 207, 54, 0 taste_description = "bitterness" + metabolization_rate = REAGENTS_METABOLISM * 0.5 taste_mult = 1.2 harmful = TRUE var/toxpwr = 1.5 @@ -14,6 +15,7 @@ /datum/reagent/toxin/on_mob_life(mob/living/carbon/M) if(toxpwr) M.adjustToxLoss(toxpwr*REM, 0) + M.add_nausea(toxpwr) return ..() /datum/reagent/toxin/amatoxin @@ -64,7 +66,6 @@ /datum/reagent/toxin/plasma/on_mob_life(mob/living/carbon/C) if(holder.has_reagent(/datum/reagent/medicine/epinephrine)) holder.remove_reagent(/datum/reagent/medicine/epinephrine, 2*REM) - C.adjustPlasma(20) return ..() /datum/reagent/toxin/plasma/on_temp_change() diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index a7134ea2d7e..98f70d34ec7 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -38,12 +38,6 @@ results = list(/datum/reagent/medicine/synaptizine = 3) required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/lithium = 1, /datum/reagent/water = 1) -/datum/chemical_reaction/salglu_solution - name = "Saline-Glucose Solution" - id = /datum/reagent/medicine/salglu_solution - results = list(/datum/reagent/medicine/salglu_solution = 3) - required_reagents = list(/datum/reagent/consumable/sodiumchloride = 1, /datum/reagent/water = 1, /datum/reagent/consumable/sugar = 1) - /datum/chemical_reaction/mine_salve name = "Miner's Salve" id = /datum/reagent/medicine/mine_salve diff --git a/code/modules/reagents/reagent_containers/chem_pack.dm b/code/modules/reagents/reagent_containers/chem_pack.dm index d1f5fa4a0e9..6aa7b04975b 100644 --- a/code/modules/reagents/reagent_containers/chem_pack.dm +++ b/code/modules/reagents/reagent_containers/chem_pack.dm @@ -33,7 +33,7 @@ . += span_notice("Alt-click to seal it.") -obj/item/reagent_containers/chem_pack/attack_self(mob/user) +/obj/item/reagent_containers/chem_pack/attack_self(mob/user) if(sealed) return ..() diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 9bef2d049bc..e1dd2bd169f 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -45,9 +45,6 @@ to_chat(user, span_notice("I transfer [trans] unit\s of the solution.")) update_icon() return - else if(isalien(target)) //hiss-hiss has no eyes! - to_chat(target, span_danger("[target] does not seem to have any eyes!")) - return target.visible_message(span_danger("[user] squirts something into [target]'s eyes!"), \ span_danger("[user] squirts something into your eyes!")) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 8af7436b756..19a4d6c2aea 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -37,119 +37,92 @@ /obj/item/reagent_containers/glass/attack(mob/M, mob/user, obj/target) testing("a1") - if(istype(M)) - if(user.used_intent.type == INTENT_GENERIC) - return ..() - else - if(!spillable) - return + if(!istype(M)) + return + if(user.used_intent.type == INTENT_GENERIC) + return ..() + if(!spillable) + return - if(user.used_intent.type == INTENT_FILL) - if(ishuman(M)) - var/mob/living/carbon/human/humanized = M - var/obj/item/organ/filling_organ/breasts/tiddies = humanized.getorganslot(ORGAN_SLOT_BREASTS) // tiddy hehe - if(user.zone_selected == BODY_ZONE_CHEST) //chest - if(!humanized.wear_shirt || (!humanized.wear_shirt.flags_inv & HIDEBOOB || humanized.wear_shirt.genitalaccess)) - if(tiddies) - if(tiddies.reagents.total_volume > 0) - if(reagents.total_volume < volume) - var/milk_to_take = CLAMP((tiddies.reagents.maximum_volume/6), 1, min(tiddies.reagents.total_volume, volume - reagents.total_volume)) - if(do_after(user, 20, target = humanized)) - tiddies.reagents.trans_to(src, milk_to_take, transfered_by = user) - user.visible_message(span_notice("[user] milks [humanized] into \the [src]."), span_notice("I milk [humanized] into \the [src].")) - else - to_chat(user, span_warning("[src] is full.")) - else - to_chat(user, span_warning("[humanized] is out of milk!")) - else - to_chat(user, span_warning("[humanized] cannot be milked!")) - else - to_chat(user, span_warning("[humanized]'s chest must be exposed before I can milk them!")) - if(user.zone_selected == BODY_ZONE_PRECISE_GROIN) //groin - if(!humanized.wear_pants || (humanized.wear_pants.flags_inv & HIDECROTCH || humanized.wear_pants.genitalaccess)) - var/obj/item/organ/filling_organ/testicles/testes = humanized.getorganslot(ORGAN_SLOT_TESTICLES) - if(testes) - if(testes.reagents.total_volume > 0) - if(reagents.total_volume < volume) - if(do_after(user, 40, target = humanized)) - var/cum_to_take = CLAMP((testes.reagents.maximum_volume/2), 1, min(testes.reagents.total_volume, volume - reagents.total_volume)) - testes.reagents.trans_to(src, cum_to_take, transfered_by = user) - user.visible_message(span_notice("[user] milks [humanized]'s cock into \the [src]."), span_notice("I milk [humanized]'s cock into \the [src].")) - else - to_chat(user, span_warning("[src] is full.")) - else - to_chat(user, span_warning("[humanized] is out of cum!")) - else - to_chat(user, span_warning("[humanized] cannot be milked!")) - else - to_chat(user, span_warning("[humanized]'s groin must be exposed before I can milk them!")) - return 1 - - if(!reagents || !reagents.total_volume) - to_chat(user, span_warning("[src] is empty!")) - return + if(ishuman(M) && user.used_intent.type == INTENT_FILL) + var/mob/living/carbon/human/humanized = M + var/obj/item/organ/filling_organ/breasts/tiddies = humanized.getorganslot(ORGAN_SLOT_BREASTS) // tiddy hehe + switch(user.zone_selected) + if(BODY_ZONE_CHEST) //chest + if(humanized.wear_shirt && (humanized.wear_shirt.flags_inv & HIDEBOOB || !humanized.wear_shirt.genitalaccess)) + to_chat(user, span_warning("[humanized]'s chest must be exposed before I can milk [humanized.p_them()]!")) + return TRUE + if(!tiddies) + to_chat(user, span_warning("[humanized] cannot be milked!")) + return TRUE + if(tiddies.reagents.total_volume <= 0) + to_chat(user, span_warning("[humanized] is out of milk!")) + return TRUE + if(reagents.total_volume >= volume) + to_chat(user, span_warning("[src] is full.")) + return TRUE + var/milk_to_take = CLAMP((tiddies.reagents.maximum_volume/6), 1, min(tiddies.reagents.total_volume, volume - reagents.total_volume)) + if(do_after(user, 20, target = humanized)) + tiddies.reagents.trans_to(src, milk_to_take, transfered_by = user) + user.visible_message(span_notice("[user] milks [humanized] into \the [src]."), span_notice("I milk [humanized] into \the [src].")) + if(BODY_ZONE_PRECISE_GROIN) //groin + if(humanized.wear_pants && (humanized.wear_pants.flags_inv & HIDECROTCH || !humanized.wear_pants.genitalaccess)) + to_chat(user, span_warning("[humanized]'s groin must be exposed before I can milk [humanized.p_them()]!")) + return TRUE + var/obj/item/organ/filling_organ/testicles/testes = humanized.getorganslot(ORGAN_SLOT_TESTICLES) + if(!testes) + to_chat(user, span_warning("[humanized] cannot be milked!")) + return TRUE + if(testes.reagents.total_volume <= 0) + to_chat(user, span_warning("[humanized] is out of cum!")) + return TRUE + if(reagents.total_volume >= volume) + to_chat(user, span_warning("[src] is full.")) + return TRUE + if(do_after(user, 40, target = humanized)) + var/cum_to_take = CLAMP((testes.reagents.maximum_volume/2), 1, min(testes.reagents.total_volume, volume - reagents.total_volume)) + testes.reagents.trans_to(src, cum_to_take, transfered_by = user) + user.visible_message(span_notice("[user] milks [humanized]'s cock into \the [src]."), span_notice("I milk [humanized]'s cock into \the [src].")) + return TRUE - if(user.used_intent.type == INTENT_SPLASH) - var/R - M.visible_message(span_danger("[user] splashes the contents of [src] onto [M]!"), \ - span_danger("[user] splashes the contents of [src] onto you!")) - if(reagents) - for(var/datum/reagent/A in reagents.reagent_list) - R += "[A] ([num2text(A.volume)])," - - if(isturf(target) && reagents.reagent_list.len && thrownby) - log_combat(thrownby, target, "splashed (thrown) [english_list(reagents.reagent_list)]") - reagents.reaction(M, TOUCH) - log_combat(user, M, "splashed", R) - reagents.clear_reagents() - return - else if(user.used_intent.type == INTENT_POUR) - if(!canconsume(M, user)) - return - if(M != user) - M.visible_message(span_danger("[user] attempts to feed [M] something."), \ - span_danger("[user] attempts to feed you something.")) - if(!do_mob(user, M)) - return - if(!reagents || !reagents.total_volume) - return // The drink might be empty after the delay, such as by spam-feeding - M.visible_message(span_danger("[user] feeds [M] something."), \ - span_danger("[user] feeds you something.")) - log_combat(user, M, "fed", reagents.log_list()) - - if(user.used_intent.type == INTENT_SPLASH) - var/R - M.visible_message(span_danger("[user] splashes the contents of [src] onto [M]!"), \ - span_danger("[user] splashes the contents of [src] onto you!")) - if(reagents) - for(var/datum/reagent/A in reagents.reagent_list) - R += "[A] ([num2text(A.volume)])," - - if(isturf(target) && reagents.reagent_list.len && thrownby) - log_combat(thrownby, target, "splashed (thrown) [english_list(reagents.reagent_list)]") - message_admins("[ADMIN_LOOKUPFLW(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] at [ADMIN_VERBOSEJMP(target)].") - reagents.reaction(M, TOUCH) - log_combat(user, M, "splashed", R) - reagents.clear_reagents() + if(!reagents || !reagents.total_volume) + to_chat(user, span_warning("[src] is empty!")) + return + + if(user.used_intent.type == INTENT_SPLASH) + var/R + M.visible_message(span_danger("[user] splashes the contents of [src] onto [M]!"), \ + span_danger("[user] splashes the contents of [src] onto you!")) + if(reagents) + for(var/datum/reagent/A in reagents.reagent_list) + R += "[A] ([num2text(A.volume)])," + + if(isturf(target) && reagents.reagent_list.len && thrownby) + log_combat(thrownby, target, "splashed (thrown) [english_list(reagents.reagent_list)]") + message_admins("[ADMIN_LOOKUPFLW(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] at [ADMIN_VERBOSEJMP(target)].") + reagents.reaction(M, TOUCH) + log_combat(user, M, "splashed", R) + reagents.clear_reagents() + return + else if(user.used_intent.type == INTENT_POUR) + if(!canconsume(M, user)) return - else if(user.used_intent.type == INTENT_POUR) - if(!canconsume(M, user)) + if(M != user) + M.visible_message(span_danger("[user] attempts to feed [M] something."), \ + span_danger("[user] attempts to feed you something.")) + if(!do_mob(user, M)) return - if(M != user) - M.visible_message(span_danger("[user] attempts to feed [M] something."), \ - span_danger("[user] attempts to feed you something.")) - if(!do_mob(user, M)) - return - if(!reagents || !reagents.total_volume) - return // The drink might be empty after the delay, such as by spam-feeding - M.visible_message(span_danger("[user] feeds [M] something."), \ - span_danger("[user] feeds you something.")) - log_combat(user, M, "fed", reagents.log_list()) - else - to_chat(user, span_notice("I swallow a gulp of [src].")) - addtimer(CALLBACK(reagents, TYPE_PROC_REF(/datum/reagents, trans_to), M, min(amount_per_transfer_from_this,5), TRUE, TRUE, FALSE, user, FALSE, INGEST), 5) - playsound(M.loc,pick(drinksounds), 100, TRUE) - return + if(!reagents || !reagents.total_volume) + return // The drink might be empty after the delay, such as by spam-feeding + M.visible_message(span_danger("[user] feeds [M] something."), \ + span_danger("[user] feeds you something.")) + log_combat(user, M, "fed", reagents.log_list()) + else + to_chat(user, span_notice("I swallow a gulp of [src].")) + addtimer(CALLBACK(reagents, TYPE_PROC_REF(/datum/reagents, trans_to), M, min(amount_per_transfer_from_this,5), TRUE, TRUE, FALSE, user, FALSE, INGEST), 5) + playsound(M.loc,pick(drinksounds), 100, TRUE) + return + /obj/item/reagent_containers/glass/attack_obj(obj/target, mob/living/user) if(user.used_intent.type == INTENT_GENERIC) return ..() @@ -608,7 +581,7 @@ /obj/item/reagent_containers/glass/waterbottle/relic/Initialize() var/datum/reagent/random_reagent = get_random_reagent_id() - list_reagents = list(random_reagent = 50) + list_reagents = list((random_reagent) = 50) // without parentheses, it's "random_reagent" the string . = ..() desc += span_notice("The writing reads '[random_reagent.name]'.") diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index dee15f58d4b..e3b5216606a 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -1,5 +1,5 @@ -/obj/item/reagent_containers/hypospray ////// I absolutely hate this stupid retarded shit why the fuck is TG garbage even in this stupid fucking indian built codebase. fuck you seth. fuck you. +/obj/item/reagent_containers/hypospray name = "hypospray" desc = "" icon = 'icons/roguetown/items/surgery.dmi' @@ -19,9 +19,9 @@ /obj/item/reagent_containers/hypospray/attack(mob/living/M, mob/user) if(has_cap) - to_chat(user, span_warning("[src] has a cap on! You need to remove it first.")) + to_chat(user, span_warning("[src] has a cap on! I need to remove it first.")) + playsound(src, 'modular_stonehedge/licensed-death-rattler/Death-Rattler/sound/inject.ogg') return FALSE - playsound(src, 'modular/Smoker/sound/inject.ogg') inject(M, user) ///Handles all injection checks, injection and logging. @@ -143,7 +143,7 @@ has_cap = FALSE icon_state = "sty_nocap" // Update icon state to_chat(user, span_notice("You remove the cap from [src].")) - playsound(user, 'modular/Smoker/sound/capoff.ogg') + playsound(user, 'modular_stonehedge/licensed-death-rattler/Death-Rattler/sound/capoff.ogg') else to_chat(user, span_warning("[src] doesn't have a cap.")) return FALSE diff --git a/code/modules/reagents/reagent_containers/powderspice.dm b/code/modules/reagents/reagent_containers/powderspice.dm index 47e9c8ffbfa..442a398a6ff 100644 --- a/code/modules/reagents/reagent_containers/powderspice.dm +++ b/code/modules/reagents/reagent_containers/powderspice.dm @@ -235,7 +235,7 @@ /obj/item/reagent_containers/powder/gunpowder name = "firepowder" desc = "Not so useful in this state." - icon = 'modular_stonehedge/icons/roguetown/items/produce.dmi' + icon = 'modular_stonehedge/licensed-eaglephntm/icons/roguetown/items/produce.dmi' icon_state = "gunpowder" possible_transfer_amounts = list() volume = 15 diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 5cddf0d4c4b..37140665964 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -25,7 +25,7 @@ /obj/item/reagent_containers/spray/afterattack(atom/A, mob/user) . = ..() - if(istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/machinery/hydroponics)) + if(istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart)) return if((A.is_drainable() && !A.is_refillable()) && get_dist(src,A) <= 1 && can_fill_from_container) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 006146411da..c6211e8186b 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -232,13 +232,6 @@ volume = 1 list_reagents = list(/datum/reagent/mulligan = 1) -/obj/item/reagent_containers/syringe/gluttony - name = "Gluttony's Blessing" - desc = "" - amount_per_transfer_from_this = 1 - volume = 1 - list_reagents = list(/datum/reagent/gluttonytoxin = 1) - /obj/item/reagent_containers/syringe/bluespace name = "bluespace syringe" desc = "" diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 2daf62c4b54..59a467f6af7 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -130,13 +130,22 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) if(!operating) return use_power(6) - affecting = loc.contents - src // moved items will be all in loc - addtimer(CALLBACK(src, PROC_REF(convey), affecting), 1) - -/obj/machinery/conveyor/proc/convey(list/affecting) - for(var/atom/movable/A in affecting) - if((A.loc == loc) && A.has_gravity()) - A.ConveyorMove(movedir) + if(!isturf(loc)) // We're nowhere! + return + var/turf/turf_loc = loc + var/list/cached_contents = loc.contents - src - turf_loc.lighting_object + if(!length(cached_contents)) // nothing to convey, don't waste time creating a timer! + return + // This is on a one-decisecond delay to prevent conveyors from chaining movement into each other. + addtimer(CALLBACK(src, PROC_REF(convey), cached_contents), 0.1 SECONDS) + +/obj/machinery/conveyor/proc/convey(list/atom/movable/cached_contents) + for(var/atom/movable/A as anything in cached_contents) + if(A == src) + continue + if(A.anchored) + continue + A.ConveyorMove(movedir) // attack with item, place item on conveyor /obj/machinery/conveyor/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index eba0a64523e..77a6c763853 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -249,7 +249,7 @@ . = ..() if(.) return - for(var/obj/item/I in src_object) + for(var/obj/item/I in src_object.contents()) if(user.active_storage != src_object) if(I.on_found(user)) return diff --git a/code/modules/recycling/disposal/multiz.dm b/code/modules/recycling/disposal/multiz.dm index fe94926b967..5e26cabc8ce 100644 --- a/code/modules/recycling/disposal/multiz.dm +++ b/code/modules/recycling/disposal/multiz.dm @@ -19,9 +19,9 @@ if(multiz_dir) //Are we a trunk that goes up? Or down? var/turf/T = null if(multiz_dir == MULTIZ_PIPE_UP) - T = SSmapping.get_turf_above(get_turf(src)) //Get the turf above us + T = GET_TURF_ABOVE(get_turf(src)) //Get the turf above us if(multiz_dir == MULTIZ_PIPE_DOWN) - T = SSmapping.get_turf_below(get_turf(src)) + T = GET_TURF_BELOW(get_turf(src)) if(!T) expel(H) return //Nothing located. diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index f15c88b42ba..12839899186 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -208,30 +208,6 @@ category = list("Computer Boards") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE -/datum/design/board/cargo - name = "Computer Design (Supply Console)" - desc = "" - id = "cargo" - build_path = /obj/item/circuitboard/computer/cargo - category = list("Computer Boards") - departmental_flags = DEPARTMENTAL_FLAG_CARGO - -/datum/design/board/cargorequest - name = "Computer Design (Supply Request Console)" - desc = "" - id = "cargorequest" - build_path = /obj/item/circuitboard/computer/cargo/request - category = list("Computer Boards") - departmental_flags = DEPARTMENTAL_FLAG_CARGO - -/datum/design/board/bounty - name = "Computer Design (Bounty Console)" - desc = "" - id = "bounty" - build_path = /obj/item/circuitboard/computer/bounty - category = list("Computer Boards") - departmental_flags = DEPARTMENTAL_FLAG_CARGO - /datum/design/board/mining name = "Computer Design (Outpost Status Display)" desc = "" diff --git a/code/modules/research/designs/mining_designs.dm b/code/modules/research/designs/mining_designs.dm index b77f6c9bd37..3f5489d7e6f 100644 --- a/code/modules/research/designs/mining_designs.dm +++ b/code/modules/research/designs/mining_designs.dm @@ -2,15 +2,6 @@ ///////////////////////////////////////// /////////////////Mining////////////////// ///////////////////////////////////////// -/datum/design/cargo_express - name = "Computer Design (Express Supply Console)"//shes beautiful - desc = ""//who? - id = "cargoexpress"//the coder reading this - build_type = IMPRINTER - materials = list(/datum/material/glass = 1000) - build_path = /obj/item/circuitboard/computer/cargo/express - category = list("Mining Designs") - departmental_flags = DEPARTMENTAL_FLAG_CARGO /datum/design/bluespace_pod name = "Supply Drop Pod Upgrade Disk" diff --git a/code/modules/research/designs/smelting_designs.dm b/code/modules/research/designs/smelting_designs.dm index 617ef4b1ae1..fec12d2c9f8 100644 --- a/code/modules/research/designs/smelting_designs.dm +++ b/code/modules/research/designs/smelting_designs.dm @@ -60,13 +60,3 @@ category = list("initial", "Stock Parts") departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING maxstack = 50 - -/datum/design/alienalloy - name = "Alien Alloy" - desc = "" - id = "alienalloy" - build_type = PROTOLATHE | SMELTER - materials = list(/datum/material/iron = 4000, /datum/material/plasma = 4000) - build_path = /obj/item/stack/sheet/mineral/abductor - category = list("Stock Parts") - departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING diff --git a/code/modules/research/designs/tool_designs.dm b/code/modules/research/designs/tool_designs.dm index f03cedaaa86..4a3579ecd75 100644 --- a/code/modules/research/designs/tool_designs.dm +++ b/code/modules/research/designs/tool_designs.dm @@ -138,67 +138,3 @@ materials = list(/datum/material/iron = 5000, /datum/material/silver = 2500, /datum/material/plasma = 5000, /datum/material/titanium = 2000, /datum/material/diamond = 2000) category = list("Tool Designs") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -///////////////////////////////////////// -/////////Alien Surgical Tools//////////// -///////////////////////////////////////// - -/datum/design/alienscalpel - name = "Alien Scalpel" - desc = "" - id = "alien_scalpel" - build_path = /obj/item/scalpel/alien - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2000, /datum/material/silver = 1500, /datum/material/plasma = 500, /datum/material/titanium = 1500) - category = list("Tool Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -/datum/design/alienhemostat - name = "Alien Hemostat" - desc = "" - id = "alien_hemostat" - build_path = /obj/item/hemostat/alien - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2000, /datum/material/silver = 1500, /datum/material/plasma = 500, /datum/material/titanium = 1500) - category = list("Tool Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -/datum/design/alienretractor - name = "Alien Retractor" - desc = "" - id = "alien_retractor" - build_path = /obj/item/retractor/alien - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2000, /datum/material/silver = 1500, /datum/material/plasma = 500, /datum/material/titanium = 1500) - category = list("Tool Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -/datum/design/aliensaw - name = "Alien Circular Saw" - desc = "" - id = "alien_saw" - build_path = /obj/item/circular_saw/alien - build_type = PROTOLATHE - materials = list(/datum/material/iron = 10000, /datum/material/silver = 2500, /datum/material/plasma = 1000, /datum/material/titanium = 1500) - category = list("Tool Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -/datum/design/aliendrill - name = "Alien Drill" - desc = "" - id = "alien_drill" - build_path = /obj/item/surgicaldrill/alien - build_type = PROTOLATHE - materials = list(/datum/material/iron = 10000, /datum/material/silver = 2500, /datum/material/plasma = 1000, /datum/material/titanium = 1500) - category = list("Tool Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -/datum/design/aliencautery - name = "Alien Cautery" - desc = "" - id = "alien_cautery" - build_path = /obj/item/cautery/alien - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2000, /datum/material/silver = 1500, /datum/material/plasma = 500, /datum/material/titanium = 1500) - category = list("Tool Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 2bb36d17199..4b1f3e1966c 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -589,7 +589,7 @@ call(src,realProc)(user) addtimer(CALLBACK(src, PROC_REF(cd)), cooldownMax) else - to_chat(user, span_notice("I aren't quite sure what to do with this yet.")) + to_chat(user, span_notice("I'm not quite sure what to do with this yet.")) /obj/item/relic/proc/cd() cooldown = FALSE diff --git a/code/modules/research/nanites/nanite_programs.dm b/code/modules/research/nanites/nanite_programs.dm index 46134b03786..f4b621c2d0d 100644 --- a/code/modules/research/nanites/nanite_programs.dm +++ b/code/modules/research/nanites/nanite_programs.dm @@ -200,14 +200,14 @@ software_error() /datum/nanite_program/proc/on_shock(shock_damage) - if(!program_flags & NANITE_SHOCK_IMMUNE) + if(!(program_flags & NANITE_SHOCK_IMMUNE)) if(prob(10)) software_error() else if(prob(33)) qdel(src) /datum/nanite_program/proc/on_minor_shock() - if(!program_flags & NANITE_SHOCK_IMMUNE) + if(!(program_flags & NANITE_SHOCK_IMMUNE)) if(prob(10)) software_error() diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 3990b0c2287..88150749da6 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -1000,49 +1000,6 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000, TECHWEB_POINT_TYPE_NANITES = 4000) export_price = 15000 -////////////////////////Alien technology//////////////////////// -/datum/techweb_node/alientech //AYYYYYYYYLMAOO tech - id = "alientech" - display_name = "Alien Technology" - description = "Things used by the greys." - prereq_ids = list("biotech","engineering") - boost_item_paths = list(/obj/item/gun/energy/alien, /obj/item/scalpel/alien, /obj/item/hemostat/alien, /obj/item/retractor/alien, /obj/item/circular_saw/alien, - /obj/item/cautery/alien, /obj/item/surgicaldrill/alien, /obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor, - /obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, /obj/item/abductor/baton, /obj/item/abductor, /obj/item/gun/energy/shrink_ray) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) - export_price = 20000 - hidden = TRUE - design_ids = list("alienalloy") - -/datum/techweb_node/alientech/on_research() //Unlocks the Zeta shuttle for purchase - SSshuttle.shuttle_purchase_requirements_met |= SHUTTLE_UNLOCK_ALIENTECH - -/datum/techweb_node/alien_bio - id = "alien_bio" - display_name = "Alien Biological Tools" - description = "Advanced biological tools." - prereq_ids = list("alientech", "adv_biotech") - design_ids = list("alien_scalpel", "alien_hemostat", "alien_retractor", "alien_saw", "alien_drill", "alien_cautery") - boost_item_paths = list(/obj/item/gun/energy/alien, /obj/item/scalpel/alien, /obj/item/hemostat/alien, /obj/item/retractor/alien, /obj/item/circular_saw/alien, - /obj/item/cautery/alien, /obj/item/surgicaldrill/alien, /obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor, - /obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, /obj/item/abductor/baton, /obj/item/abductor, /obj/item/gun/energy/shrink_ray) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - export_price = 20000 - hidden = TRUE - -/datum/techweb_node/alien_engi - id = "alien_engi" - display_name = "Alien Engineering" - description = "Alien engineering tools" - prereq_ids = list("alientech", "adv_engi") - design_ids = list("alien_wrench", "alien_wirecutters", "alien_screwdriver", "alien_crowbar", "alien_welder", "alien_multitool") - boost_item_paths = list(/obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor, - /obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, /obj/item/abductor/baton, /obj/item/abductor, - /obj/item/gun/energy/shrink_ray) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - export_price = 20000 - hidden = TRUE - /datum/techweb_node/syndicate_basic id = "syndicate_basic" display_name = "Illegal Technology" diff --git a/code/modules/research/xenobiology/crossbreeding/_clothing.dm b/code/modules/research/xenobiology/crossbreeding/_clothing.dm index 86f49565d3b..1bc33c25c0c 100644 --- a/code/modules/research/xenobiology/crossbreeding/_clothing.dm +++ b/code/modules/research/xenobiology/crossbreeding/_clothing.dm @@ -140,7 +140,6 @@ Slimecrossing Armor var/hit_reflect_chance = 40 /obj/item/clothing/suit/armor/heavy/adamantine/IsReflect(def_zone) - if(def_zone in list(BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) && prob(hit_reflect_chance)) - return TRUE - else + if(!prob(hit_reflect_chance)) return FALSE + return def_zone in list(BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) diff --git a/code/modules/research/xenobiology/crossbreeding/_potions.dm b/code/modules/research/xenobiology/crossbreeding/_potions.dm index 746ae084f63..c04ba81e7aa 100644 --- a/code/modules/research/xenobiology/crossbreeding/_potions.dm +++ b/code/modules/research/xenobiology/crossbreeding/_potions.dm @@ -113,7 +113,7 @@ Slimecrossing Potions /obj/item/slimepotion/endowpotion/attack(mob/living/M, mob/user) if(!isliving(M) || M.stat == DEAD) - to_chat(user, span_warning("The love potion only works on living things, sicko!")) + to_chat(user, span_warning("The endowment potion only works on living things, sicko!")) return ..() if(M.has_status_effect(STATUS_EFFECT_ENDOWED)) @@ -127,7 +127,7 @@ Slimecrossing Potions if(uses <= 0) to_chat(M, span_notice("The potion is useless now.")) qdel(src) - to_chat(user, span_notice("I feed [M] the love potion!")) + to_chat(user, span_notice("I feed [M] the endowment potion!")) if(M.has_status_effect(STATUS_EFFECT_ENDOWED)) M.remove_status_effect(STATUS_EFFECT_ENDOWED) M.apply_status_effect(STATUS_EFFECT_ENDOWED) diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index 49c5d2e0f31..5c0b92d0bbc 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -223,7 +223,7 @@ duration = -1 alert_type = null -datum/status_effect/rebreathing/tick() +/datum/status_effect/rebreathing/tick() owner.adjustOxyLoss(-6, 0) //Just a bit more than normal breathing. /////////////////////////////////////////////////////// @@ -505,7 +505,7 @@ datum/status_effect/rebreathing/tick() ADD_TRAIT(owner, TRAIT_NOSLIPWATER, "slimestatus") return ..() -datum/status_effect/stabilized/blue/on_remove() +/datum/status_effect/stabilized/blue/on_remove() REMOVE_TRAIT(owner, TRAIT_NOSLIPWATER, "slimestatus") /datum/status_effect/stabilized/metal diff --git a/code/modules/research/xenobiology/crossbreeding/inventory.dm b/code/modules/research/xenobiology/crossbreeding/inventory.dm deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/code/modules/roguetown/mapgen/ambushmarkers.dm b/code/modules/roguetown/mapgen/ambushmarkers.dm index 80e136fce93..ae6b4b7f1ca 100644 --- a/code/modules/roguetown/mapgen/ambushmarkers.dm +++ b/code/modules/roguetown/mapgen/ambushmarkers.dm @@ -19,4 +19,4 @@ if(isliving(AM)) var/mob/living/MM = AM if(MM.m_intent != MOVE_INTENT_SNEAK) - MM.consider_ambush() \ No newline at end of file + MM.consider_ambush() diff --git a/code/modules/roguetown/mapgen/beach.dm b/code/modules/roguetown/mapgen/beach.dm index 6179eb5dd09..61acadfc00f 100644 --- a/code/modules/roguetown/mapgen/beach.dm +++ b/code/modules/roguetown/mapgen/beach.dm @@ -13,4 +13,4 @@ clusterCheckFlags = CLUSTER_CHECK_SAME_ATOMS|CLUSTER_CHECK_DIFFERENT_ATOMS allowed_turfs = list(/turf/open/floor/rogue/dirt/road) spawnableAtoms = list( /obj/item/natural/stone = 11, - /obj/item/grown/log/tree/stick = 1) \ No newline at end of file + /obj/item/grown/log/tree/stick = 1) diff --git a/code/modules/roguetown/mapgen/forest.dm b/code/modules/roguetown/mapgen/forest.dm index 51b9102c0c7..180951fcb60 100644 --- a/code/modules/roguetown/mapgen/forest.dm +++ b/code/modules/roguetown/mapgen/forest.dm @@ -56,4 +56,4 @@ /obj/item/natural/stone = 6, /obj/item/natural/rock = 1, /obj/item/grown/log/tree/stick = 3, - /obj/structure/flora/roguetree/stump/log = 3) \ No newline at end of file + /obj/structure/flora/roguetree/stump/log = 3) diff --git a/code/modules/roguetown/mapgen/rogueoutdoors.dm b/code/modules/roguetown/mapgen/rogueoutdoors.dm index 1cffbaf83c0..568c3a41750 100644 --- a/code/modules/roguetown/mapgen/rogueoutdoors.dm +++ b/code/modules/roguetown/mapgen/rogueoutdoors.dm @@ -49,4 +49,4 @@ /obj/structure/flora/roguegrass/maneater = 7, /obj/item/natural/stone = 18, /obj/item/grown/log/tree/stick = 3) - allowed_areas = list(/area/rogue/outdoors/town,/area/rogue/outdoors/rtfield) \ No newline at end of file + allowed_areas = list(/area/rogue/outdoors/town,/area/rogue/outdoors/rtfield) diff --git a/code/modules/roguetown/roguecrafting/alchemy.dm b/code/modules/roguetown/roguecrafting/alchemy.dm index a453da1fa06..f79e6b70178 100644 --- a/code/modules/roguetown/roguecrafting/alchemy.dm +++ b/code/modules/roguetown/roguecrafting/alchemy.dm @@ -28,13 +28,13 @@ /datum/crafting_recipe/roguetown/alchemy/puremoon name = "Purest Moondust" result = list(/obj/item/reagent_containers/powder/moondust/purest) - reqs = list(/obj/item/reagent_containers/powder/moondust, /obj/item/reagent_containers/food/snacks/grown/rogue/pipeweeddry = 1, /datum/reagent/berrypoison = 5) + reqs = list(/obj/item/reagent_containers/powder/moondust, /obj/item/reagent_containers/food/snacks/grown/rogue/pipeweeddry = 1, /datum/reagent/toxin/berrypoison = 5) craftdiff = 3 /datum/crafting_recipe/roguetown/alchemy/spice name = "Spice Melange" result = list(/obj/item/reagent_containers/powder/spice) - reqs = list(/obj/item/ash = 1, /obj/item/reagent_containers/food/snacks/grown/rogue/sweetleafdry = 1, /datum/reagent/berrypoison = 5) + reqs = list(/obj/item/ash = 1, /obj/item/reagent_containers/food/snacks/grown/rogue/sweetleafdry = 1, /datum/reagent/toxin/berrypoison = 5) craftdiff = 3 /datum/crafting_recipe/roguetown/alchemy/salt @@ -207,6 +207,20 @@ craftdiff = 1 verbage_simple = "forge" +/datum/crafting_recipe/roguetown/alchemy/glassbottles2 + name = "3x glass bottles (Glass sheet)" + result = list(/obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/bottle) + reqs = list(/obj/item/ingot/glass) + craftdiff = 1 + verbage_simple = "forge" + +/datum/crafting_recipe/roguetown/alchemy/glasssyringe + name = "Glass syringe (x3)" + result = list(/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/syringe) + reqs = list(/obj/item/ingot/glass) + craftdiff = 1 + verbage_simple = "forge" + /// transmutation /datum/crafting_recipe/roguetown/alchemy/distill @@ -528,7 +542,7 @@ has_cap = FALSE icon_state = "[icon_state]_nocap" // Update icon state for no cap to_chat(user, span_notice("You thumb off the cork from [src].")) - playsound(src, 'modular/Smoker/sound/corkpop.ogg', 100, TRUE) + playsound(src, 'modular_stonehedge/licensed-death-rattler/Death-Rattler/sound/corkpop.ogg', 100, TRUE) else to_chat(user, span_warning("[src] doesn't have a cork.")) @@ -551,7 +565,7 @@ reagents.maximum_volume = 0 // Makes them useless afterwards reagents.flags = NONE // Ensure reagents are deactivated update_icon() - playsound(src, 'modular/Smoker/sound/chug.ogg', 100, TRUE) + playsound(src, 'modular_stonehedge/licensed-death-rattler/Death-Rattler/sound/chug.ogg', 100, TRUE) return TRUE /obj/item/reagent_containers/hypospray/medipen/sealbottle/attack(mob/user) @@ -579,7 +593,7 @@ has_cap = FALSE icon_state = "[icon_state]_nocap" // Update icon state for no cap to_chat(user, span_notice("You bite the cap off [src] and spit it out.")) - playsound(src, 'modular/Smoker/sound/capoff.ogg', 100, TRUE) + playsound(src, 'modular_stonehedge/licensed-death-rattler/Death-Rattler/sound/capoff.ogg', 100, TRUE) else to_chat(user, span_warning("[src] doesn't have a cap.")) @@ -602,7 +616,7 @@ reagents.maximum_volume = 0 // Makes them useless afterwards reagents.flags = NONE // Ensure reagents are deactivated update_icon() - playsound(src, 'modular/Smoker/sound/inject.ogg', 100, TRUE) + playsound(src, 'modular_stonehedge/licensed-death-rattler/Death-Rattler/sound/inject.ogg', 100, TRUE) return TRUE /obj/item/reagent_containers/hypospray/medipen/sty/attack(mob/user) @@ -687,11 +701,11 @@ var/mob/living/carbon/human/H = M var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected)) if (!affecting) return - if (affecting.bandage) + if (affecting.bandage) to_chat(user, "There is already a bandage.") return var/used_time = 100 - if (H.mind) + if (H.mind) used_time -= (H.mind.get_skill_level(/datum/skill/misc/medicine) * 10) playsound(loc, 'sound/foley/bandage.ogg', 100, FALSE) if (!do_mob(user, M, used_time)) return @@ -699,7 +713,7 @@ user.dropItemToGround(src) affecting.try_bandage(src) H.update_damage_overlays() - + // Heal the specific body part every second while bandaged and manage wound pain and disabling effects addtimer(CALLBACK(src, /proc/heal_and_manage_pain_disabling, H, affecting), 10, 1, TRUE) if (M == user) @@ -707,7 +721,7 @@ else user.visible_message("You bandage [M]'s [affecting].") -/proc/heal_and_manage_pain_disabling(var/mob/living/carbon/human/H, var/obj/item/bodypart/affecting) +/proc/heal_and_manage_pain_disabling(mob/living/carbon/human/H, obj/item/bodypart/affecting) if (!affecting) return affecting.heal_wounds(0.5) for (var/datum/wound/W in affecting.wounds) diff --git a/code/modules/roguetown/roguecrafting/items.dm b/code/modules/roguetown/roguecrafting/items.dm index 137f6b569f8..5033d2549ba 100644 --- a/code/modules/roguetown/roguecrafting/items.dm +++ b/code/modules/roguetown/roguecrafting/items.dm @@ -313,7 +313,7 @@ result = /obj/item/ammo_casing/caseless/rogue/arrow/poison reqs = list( /obj/item/ammo_casing/caseless/rogue/arrow = 1, - /datum/reagent/berrypoison = 5 + /datum/reagent/toxin/berrypoison = 5 ) req_table = FALSE @@ -331,7 +331,7 @@ result = /obj/item/ammo_casing/caseless/rogue/arrow/stone/poison reqs = list( /obj/item/ammo_casing/caseless/rogue/arrow/stone = 1, - /datum/reagent/berrypoison = 5 + /datum/reagent/toxin/berrypoison = 5 ) req_table = FALSE @@ -349,7 +349,7 @@ name = "poisoned bolt" result = /obj/item/ammo_casing/caseless/rogue/bolt/poison reqs = list(/obj/item/ammo_casing/caseless/rogue/bolt = 1, - /datum/reagent/berrypoison = 5) + /datum/reagent/toxin/berrypoison = 5) req_table = TRUE @@ -364,7 +364,7 @@ ) reqs = list( /obj/item/ammo_casing/caseless/rogue/arrow = 5, - /datum/reagent/berrypoison = 25 + /datum/reagent/toxin/berrypoison = 25 ) req_table = FALSE @@ -415,7 +415,7 @@ name = "poisoned bolts (x5)" result = list(/obj/item/ammo_casing/caseless/rogue/bolt/poison = 5) reqs = list(/obj/item/ammo_casing/caseless/rogue/bolt = 5, - /datum/reagent/berrypoison = 25) + /datum/reagent/toxin/berrypoison = 25) req_table = TRUE @@ -430,7 +430,7 @@ ) reqs = list( /obj/item/ammo_casing/caseless/rogue/arrow/stone = 5, - /datum/reagent/berrypoison = 25 + /datum/reagent/toxin/berrypoison = 25 ) req_table = FALSE @@ -817,26 +817,6 @@ skillcraft = /datum/skill/magic/druidic craftdiff = 2 // druids & dendor clerics can craft -// --------- GLASS ----------- - -/datum/crafting_recipe/roguetown/glassbottle - name = "Glass bottle (x2)" - reqs = list(/obj/item/ingot/glass) - result = list(/obj/item/reagent_containers/glass/bottle/rogue,/obj/item/reagent_containers/glass/bottle/rogue) - skillcraft = /datum/skill/craft/smelting - structurecraft = /obj/machinery/light/rogue/smelter - always_availible = FALSE - craftdiff = 1 - -/datum/crafting_recipe/roguetown/glasssyringe - name = "Glass syringe (x3)" - reqs = list(/obj/item/ingot/glass) - result = list(/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/syringe) - skillcraft = /datum/skill/craft/smelting - structurecraft = /obj/machinery/light/rogue/smelter - always_availible = FALSE - craftdiff = 2 //small and more detailed in workings i guess. - //gunmaking slop /datum/crafting_recipe/roguetown/firingpim name = "Firing pin" diff --git a/code/modules/roguetown/roguecrafting/sewing.dm b/code/modules/roguetown/roguecrafting/sewing.dm index be27866069f..faff539a692 100644 --- a/code/modules/roguetown/roguecrafting/sewing.dm +++ b/code/modules/roguetown/roguecrafting/sewing.dm @@ -570,6 +570,7 @@ craftdiff = 3 sellprice = 12 +/* // These are plate-level gloves and boots, and have their own smithing recipe. /datum/crafting_recipe/roguetown/sewing/zybantinegauntlets name = "zybantine gauntlets" result = list(/obj/item/clothing/gloves/roguetown/plate/zybantinegauntlets) @@ -583,6 +584,7 @@ reqs = list(/obj/item/natural/cloth = 3, /obj/item/natural/fibers = 1) craftdiff = 4 +*/ /datum/crafting_recipe/roguetown/sewing/stockdress name = "dress" diff --git a/code/modules/roguetown/roguejobs/alchemist/container.dm b/code/modules/roguetown/roguejobs/alchemist/container.dm index ad59f841b48..9f6fbbc2514 100644 --- a/code/modules/roguetown/roguejobs/alchemist/container.dm +++ b/code/modules/roguetown/roguejobs/alchemist/container.dm @@ -23,7 +23,7 @@ list_reagents = list(/datum/reagent/medicine/antipregnancy = 45) /obj/item/reagent_containers/glass/bottle/rogue/berrypoison - list_reagents = list(/datum/reagent/berrypoison = 45) + list_reagents = list(/datum/reagent/toxin/berrypoison = 45) /obj/item/reagent_containers/glass/bottle/rogue/poison list_reagents = list(/datum/reagent/toxin/killersice = 1) diff --git a/code/modules/roguetown/roguejobs/alchemist/reagents.dm b/code/modules/roguetown/roguejobs/alchemist/reagents.dm index 73f6ebb498a..1e97eb68080 100644 --- a/code/modules/roguetown/roguejobs/alchemist/reagents.dm +++ b/code/modules/roguetown/roguejobs/alchemist/reagents.dm @@ -9,19 +9,32 @@ alpha = 173 /datum/reagent/medicine/minorhealthpot/on_mob_life(mob/living/carbon/M) // Heals half as much as health potion, but not wounds. - M.adjustBruteLoss(-0.5*REM, 0) // 20u = 25 points of healing - M.adjustFireLoss(-0.5*REM, 0) - M.adjustOxyLoss(-1, 0) - M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -1*REM) - M.adjustOrganLoss(ORGAN_SLOT_HEART, -1*REM) - M.adjustOrganLoss(ORGAN_SLOT_TONGUE, -1*REM) - M.adjustOrganLoss(ORGAN_SLOT_EARS, -1*REM) - M.adjustOrganLoss(ORGAN_SLOT_EYES, -1*REM) - M.adjustOrganLoss(ORGAN_SLOT_LIVER, -1*REM) - M.adjustOrganLoss(ORGAN_SLOT_APPENDIX, -1*REM) - M.adjustOrganLoss(ORGAN_SLOT_STOMACH, -1*REM) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1*REM) - M.adjustCloneLoss(-1*REM, 0) + var/list/wCount = M.get_wounds() + for(var/obj/item/organ/filling_organ/forgan in M.internal_organs) //auto detected heal of filling organs + M.adjustOrganLoss(forgan.slot, -1) + if(M.blood_volume < BLOOD_VOLUME_NORMAL) //can not overfill + M.blood_volume = min(M.blood_volume+20, BLOOD_VOLUME_MAXIMUM) + if(wCount.len > 0 && prob(50)) //half as effective as a normal health pot but still heals wounds. + M.heal_wounds(1) + M.update_damage_overlays() + to_chat(M, span_nicegreen("I feel one of my wounds mend.")) + for(var/datum/reagent/toxin/R in M.reagents.reagent_list) + if(R != src) + M.reagents.remove_reagent(R.type,1) + M.adjustBruteLoss(-0.5, 0) // 20u = 25 points of healing + M.adjustFireLoss(-0.5, 0) + M.adjustToxLoss(-0.5, 0) + M.adjustOxyLoss(-1.5, 0) + M.adjustCloneLoss(-1, 0) + M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -1) + M.adjustOrganLoss(ORGAN_SLOT_HEART, -1) + M.adjustOrganLoss(ORGAN_SLOT_TONGUE, -1) + M.adjustOrganLoss(ORGAN_SLOT_EARS, -1) + M.adjustOrganLoss(ORGAN_SLOT_EYES, -1) + M.adjustOrganLoss(ORGAN_SLOT_LIVER, -1) + M.adjustOrganLoss(ORGAN_SLOT_APPENDIX, -1) + M.adjustOrganLoss(ORGAN_SLOT_STOMACH, -1) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1) ..() . = 1 @@ -47,21 +60,25 @@ M.heal_wounds(1) M.update_damage_overlays() to_chat(M, span_nicegreen("I feel one of my wounds mend.")) - M.adjustBruteLoss(-0.5*REM, 0) // 20u = 50 points of healing - M.adjustFireLoss(-0.5*REM, 0) - M.adjustOxyLoss(-1*REM, 0) - M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -1*REM) - M.adjustOrganLoss(ORGAN_SLOT_HEART, -1*REM) - M.adjustOrganLoss(ORGAN_SLOT_TONGUE, -1*REM) - M.adjustOrganLoss(ORGAN_SLOT_EARS, -1*REM) - M.adjustOrganLoss(ORGAN_SLOT_EYES, -1*REM) - M.adjustOrganLoss(ORGAN_SLOT_LIVER, -1*REM) - M.adjustOrganLoss(ORGAN_SLOT_APPENDIX, -1*REM) - M.adjustOrganLoss(ORGAN_SLOT_STOMACH, -1*REM) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1*REM) for(var/obj/item/organ/filling_organ/forgan in M.internal_organs) //auto detected heal of filling organs - M.adjustOrganLoss(forgan.slot, -1*REM) - M.adjustCloneLoss(-1*REM, 0) + M.adjustOrganLoss(forgan.slot, -2) + for(var/datum/reagent/toxin/R in M.reagents.reagent_list) + if(R != src) + M.reagents.remove_reagent(R.type,2) + M.adjustBruteLoss(-1, 0) // 20u = 50 points of healing + M.adjustFireLoss(-1, 0) + M.adjustToxLoss(-1, 0) + M.adjustOxyLoss(-3, 0) + M.adjustCloneLoss(-2, 0) + M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -2) + M.adjustOrganLoss(ORGAN_SLOT_HEART, -2) + M.adjustOrganLoss(ORGAN_SLOT_TONGUE, -2) + M.adjustOrganLoss(ORGAN_SLOT_EARS, -2) + M.adjustOrganLoss(ORGAN_SLOT_EYES, -2) + M.adjustOrganLoss(ORGAN_SLOT_LIVER, -2) + M.adjustOrganLoss(ORGAN_SLOT_APPENDIX, -2) + M.adjustOrganLoss(ORGAN_SLOT_STOMACH, -2) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -2) ..() . = 1 @@ -84,27 +101,31 @@ if(wCount.len > 0) M.heal_wounds(4) M.update_damage_overlays() - M.adjustBruteLoss(-1.5*REM, 0) // 20u = 150 points of healing. - M.adjustFireLoss(-1.5*REM, 0) - M.adjustOxyLoss(-3, 0) - M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -3*REM) - M.adjustOrganLoss(ORGAN_SLOT_HEART, -3*REM) - M.adjustOrganLoss(ORGAN_SLOT_TONGUE, -3*REM) - M.adjustOrganLoss(ORGAN_SLOT_EARS, -3*REM) - M.adjustOrganLoss(ORGAN_SLOT_EYES, -3*REM) - M.adjustOrganLoss(ORGAN_SLOT_LIVER, -3*REM) - M.adjustOrganLoss(ORGAN_SLOT_APPENDIX, -3*REM) - M.adjustOrganLoss(ORGAN_SLOT_STOMACH, -3*REM) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -3*REM) for(var/obj/item/organ/filling_organ/forgan in M.internal_organs) //auto detected heal of filling organs - M.adjustOrganLoss(forgan.slot, -1*REM) - M.adjustCloneLoss(-3*REM, 0) + M.adjustOrganLoss(forgan.slot, -3) + for(var/datum/reagent/toxin/R in M.reagents.reagent_list) + if(R != src) + M.reagents.remove_reagent(R.type,3) + M.adjustBruteLoss(-1.5, 0) // 20u = 150 points of healing. + M.adjustFireLoss(-1.5, 0) + M.adjustToxLoss(-1.5, 0) + M.adjustOxyLoss(-5, 0) + M.adjustCloneLoss(-3, 0) + M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -3) + M.adjustOrganLoss(ORGAN_SLOT_HEART, -3) + M.adjustOrganLoss(ORGAN_SLOT_TONGUE, -3) + M.adjustOrganLoss(ORGAN_SLOT_EARS, -3) + M.adjustOrganLoss(ORGAN_SLOT_EYES, -3) + M.adjustOrganLoss(ORGAN_SLOT_LIVER, -3) + M.adjustOrganLoss(ORGAN_SLOT_APPENDIX, -3) + M.adjustOrganLoss(ORGAN_SLOT_STOMACH, -3) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -3) ..() . = 1 /datum/reagent/medicine/majorhealthpot/overdose_process(mob/living/carbon/M) // Savor your supreme healing, or else. M.add_nausea(15) - M.adjustBruteLoss(1*REM, 0) + M.adjustBruteLoss(1, 0) M.adjustToxLoss(3, 0) M.blood_volume = min(M.blood_volume+100, BLOOD_VOLUME_MAXIMUM) // Full to bursting. @@ -127,20 +148,23 @@ if(wCount.len > 0) M.heal_wounds(6) M.update_damage_overlays() - M.adjustBruteLoss(-4.5*REM, 0) - M.adjustFireLoss(-4.5*REM, 0) - M.adjustToxLoss(-4.5*REM, 0) + for(var/datum/reagent/toxin/R in M.reagents.reagent_list) + if(R != src) + M.reagents.remove_reagent(R.type,4) + M.adjustBruteLoss(-4.5, 0) + M.adjustFireLoss(-4.5, 0) + M.adjustToxLoss(-4.5, 0) M.adjustOxyLoss(-9, 0) - M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -9*REM) - M.adjustOrganLoss(ORGAN_SLOT_HEART, -9*REM) - M.adjustOrganLoss(ORGAN_SLOT_TONGUE, -9*REM) - M.adjustOrganLoss(ORGAN_SLOT_EARS, -9*REM) - M.adjustOrganLoss(ORGAN_SLOT_EYES, -9*REM) - M.adjustOrganLoss(ORGAN_SLOT_LIVER, -9*REM) - M.adjustOrganLoss(ORGAN_SLOT_APPENDIX, -9*REM) - M.adjustOrganLoss(ORGAN_SLOT_STOMACH, -9*REM) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -9*REM) - M.adjustCloneLoss(-9*REM, 0) + M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -9) + M.adjustOrganLoss(ORGAN_SLOT_HEART, -9) + M.adjustOrganLoss(ORGAN_SLOT_TONGUE, -9) + M.adjustOrganLoss(ORGAN_SLOT_EARS, -9) + M.adjustOrganLoss(ORGAN_SLOT_EYES, -9) + M.adjustOrganLoss(ORGAN_SLOT_LIVER, -9) + M.adjustOrganLoss(ORGAN_SLOT_APPENDIX, -9) + M.adjustOrganLoss(ORGAN_SLOT_STOMACH, -9) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -9) + M.adjustCloneLoss(-9, 0) ..() . = 1 @@ -170,7 +194,7 @@ /datum/reagent/medicine/sublimeambrosia/overdose_process(mob/living/carbon/M) // This is meant for the dead, or near dead. Imbibe at own risk. M.add_nausea(25) - M.adjustBruteLoss(3*REM, 0) + M.adjustBruteLoss(3, 0) M.dizziness += 2 M.confused += 2 M.adjustToxLoss(15, 0) @@ -178,7 +202,7 @@ /datum/reagent/medicine/shroomt name = "Shroom Tea" - description = "Extremely slowly regenerates all types of damage. long lasting." + description = "Extremely slowly regenerates all types of damage. long lasting, and purges toxins slowly." reagent_state = LIQUID color = "#476e4d" taste_description = "dirt" @@ -195,9 +219,15 @@ if(wCount.len > 0) M.heal_wounds(1) M.update_damage_overlays() - M.adjustBruteLoss(-0.2*REM, 0) - M.adjustToxLoss(-0.2*REM, 0) - M.adjustFireLoss(-0.2*REM, 0) + for(var/datum/reagent/toxin/R in M.reagents.reagent_list) + if(R != src) + M.reagents.remove_reagent(R.type,1) + M.adjustToxLoss(-0.8, 0) + M.adjustBruteLoss(-0.4, 0) + M.adjustToxLoss(-0.4, 0) + M.adjustFireLoss(-0.4, 0) + M.adjustOxyLoss(-0.4, 0) + M.rogstam_add(25) M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -0.5) M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -5) M.adjustOrganLoss(ORGAN_SLOT_HEART, -0.5) @@ -207,10 +237,8 @@ M.adjustOrganLoss(ORGAN_SLOT_LIVER, -0.5) M.adjustOrganLoss(ORGAN_SLOT_APPENDIX, -0.5) M.adjustOrganLoss(ORGAN_SLOT_STOMACH, -0.5) - M.adjustOxyLoss(-1, 0) - M.rogstam_add(25) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1*REM) - M.adjustCloneLoss(-1*REM, 0) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1) + M.adjustCloneLoss(-1, 0) ..() . = 1 @@ -243,9 +271,9 @@ alpha = 200 /datum/reagent/medicine/antipregnancy/on_mob_life(mob/living/carbon/M) - if(istype(holder, /obj/item/organ/filling_organ)) - var/obj/item/organ/filling_organ/forgan = holder + for(var/obj/item/organ/filling_organ/forgan in M) if(forgan.pregnant) + to_chat(M, "I feel like I lost a part of me. The pregnancy is no more.") forgan.undo_preggoness() M.add_nausea(0.2) ..() @@ -268,10 +296,8 @@ /datum/reagent/medicine/antipoisonpot/on_mob_life(mob/living/carbon/M) for(var/datum/reagent/toxin/R in M.reagents.reagent_list) if(R != src) - M.reagents.remove_reagent(R.type,0.5) - M.adjustToxLoss(-0.5*REM, 0) - if(M.has_status_effect(STATUS_EFFECT_ENDOWED)) - M.remove_status_effect(STATUS_EFFECT_ENDOWED) + M.reagents.remove_reagent(R.type,5) + M.adjustToxLoss(-5, 0) ..() . = 1 @@ -279,103 +305,6 @@ M.add_nausea(9) M.adjustToxLoss(3, 0) -/datum/reagent/berrypoison - name = "Berry Poison" - description = "Contains a poisonous thick, dark purple liquid." - reagent_state = LIQUID - color = "#00B4FF" - metabolization_rate = 0.1 - -/datum/reagent/berrypoison/on_mob_life(mob/living/carbon/M) - if(!HAS_TRAIT(M, TRAIT_NASTY_EATER || TRAIT_WILD_EATER)) - M.add_nausea(9) - M.adjustToxLoss(3, 0) - return ..() - -/datum/reagent/organpoison - name = "Organ Poison" - description = "A viscous black liquid clings to the glass." - reagent_state = LIQUID - color = "#ff2f00" - metabolization_rate = 0.1 - -/datum/reagent/organpoison/on_mob_life(mob/living/carbon/M) - if(!HAS_TRAIT(M, TRAIT_NASTY_EATER) && !HAS_TRAIT(M, TRAIT_ORGAN_EATER)) - M.add_nausea(9) - M.adjustToxLoss(3, 0) - return ..() - - -/datum/reagent/infection - name = "excess choleric humour" - description = "Red-yellow pustulence - the carrier of disease, the enemy of all Pestrans." - reagent_state = LIQUID - color = "#dfe36f" - metabolization_rate = 0.1 - var/damage_tick = 0.3 - var/lethal_fever = FALSE - var/fever_multiplier = 1 - -/datum/reagent/infection/on_mob_life(mob/living/carbon/M) - var/heat = (BODYTEMP_AUTORECOVERY_MINIMUM + clamp(volume, 3, 15)) * fever_multiplier - if(HAS_TRAIT(M, TRAIT_SNEK)) - M.apply_status_effect(/datum/status_effect/buff/healing) - if(holder.has_reagent(/datum/reagent/infection)) - holder.remove_reagent(/datum/reagent/infection, 9999) - return - M.adjustToxLoss(damage_tick, 0) - if (lethal_fever) - M.adjust_bodytemperature(heat, 0) - if (prob(5)) - to_chat(M, span_warning("A wicked heat settles within me... I feel ill. Very ill.")) - else - M.adjust_bodytemperature(heat, 0, BODYTEMP_HEAT_DAMAGE_LIMIT - 1) - if (prob(5)) - to_chat(M, span_warning("I feel a horrible chill despite the sweat rolling from my brow...")) - return ..() - -/datum/reagent/infection/minor - name = "disrupted choleric humor" - description = "Symptomatic of disrupted humours." - damage_tick = 0.1 - lethal_fever = FALSE - -/datum/reagent/infection/minor/on_mob_life(mob/living/carbon/M) - var/heat = (BODYTEMP_AUTORECOVERY_MINIMUM + clamp(volume, 3, 15)) * fever_multiplier - if(HAS_TRAIT(M, TRAIT_SNEK)) - M.apply_status_effect(/datum/status_effect/buff/healing) - if(holder.has_reagent(/datum/reagent/infection/minor)) - holder.remove_reagent(/datum/reagent/infection/minor, 9999) - return - M.adjustToxLoss(damage_tick, 0) - if (lethal_fever) - M.adjust_bodytemperature(heat, 0) - if (prob(5)) - to_chat(M, span_warning("A wicked heat settles within me... I feel ill. Very ill.")) - else - M.adjust_bodytemperature(heat, 0, BODYTEMP_HEAT_DAMAGE_LIMIT - 1) - if (prob(5)) - to_chat(M, span_warning("I feel a horrible chill despite the sweat rolling from my brow...")) - return ..() - -/datum/reagent/infection/major - name = "excess melancholic humour" - description = "Kingsfield's Bane. Excess melancholic has killed thousands, and even Pestra's greatest struggle against its insidious advance." - damage_tick = 1 - lethal_fever = TRUE - fever_multiplier = 3 - -/datum/reagent/infection/major/on_mob_life(mob/living/carbon/M) - if(HAS_TRAIT(M, TRAIT_SNEK)) - M.apply_status_effect(/datum/status_effect/buff/healing) - if(holder.has_reagent(/datum/reagent/infection/major)) - holder.remove_reagent(/datum/reagent/infection/major, 9999) - return - if (M.badluck(1)) - M.reagents.add_reagent(src, rand(1,3)) - to_chat(M, span_small("I feel even worse...")) - return ..() - /datum/reagent/medicine/caffeine name = "caffeine" description = "No Sleep" @@ -416,10 +345,10 @@ M.heal_wounds(2) //same as health pot only heal wounds while bleeding. technically. M.blood_volume = min(M.blood_volume+15, BLOOD_VOLUME_NORMAL) if(M.health <= M.crit_threshold) - M.adjustToxLoss(-0.5*REM, 0) - M.adjustBruteLoss(-0.5*REM, 0) - M.adjustFireLoss(-0.5*REM, 0) - M.adjustOxyLoss(-0.5*REM, 0) + M.adjustToxLoss(-0.5, 0) + M.adjustBruteLoss(-0.5, 0) + M.adjustFireLoss(-0.5, 0) + M.adjustOxyLoss(-0.5, 0) if(M.losebreath >= 4) M.losebreath -= 2 if(M.losebreath < 0) @@ -435,9 +364,9 @@ description = "A powerful drug that purifies the blood and seals wounds painfully on the body." /datum/reagent/medicine/purify/on_mob_life(mob/living/carbon/human/M) - M.adjustFireLoss(0.5*REM, 0) + M.adjustFireLoss(0.5, 0) M.heal_wounds(3) - M.reagents.remove_reagent(/datum/reagent/infection, 9999) + M.reagents.remove_reagent(/datum/reagent/toxin/infection, 9999) // Iterate through all body parts for (var/obj/item/bodypart/B in M.bodyparts) // Iterate through wounds on each body part @@ -454,7 +383,7 @@ to_chat(M, "You feel the drugs burning intensely in [B.name].") // Handle destruction of the wound - W.Destroy(0) + qdel(W) M.update_damage_overlays() @@ -472,14 +401,14 @@ M.blood_volume = min(M.blood_volume+200, BLOOD_VOLUME_MAXIMUM) else M.blood_volume = min(M.blood_volume+20, BLOOD_VOLUME_MAXIMUM) - if(wCount.len > 0) + if(wCount.len > 0) M.heal_wounds(6) M.update_damage_overlays() - M.adjustBruteLoss(-4.5*REM, 0) - M.adjustFireLoss(-4.5*REM, 0) + M.adjustBruteLoss(-4.5, 0) + M.adjustFireLoss(-4.5, 0) M.adjustOxyLoss(-9, 0) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -9*REM) - M.adjustCloneLoss(-9*REM, 0) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -9) + M.adjustCloneLoss(-9, 0) ..() . = 1 @@ -513,10 +442,10 @@ M.dizziness += 2 M.confused += 2 M.adjustToxLoss(15, 0) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5*REM) - M.adjustOrganLoss(ORGAN_SLOT_HEART, 5*REM) - M.adjustOrganLoss(ORGAN_SLOT_LIVER, 5*REM) - M.adjustOrganLoss(ORGAN_SLOT_EYES, 5*REM) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) + M.adjustOrganLoss(ORGAN_SLOT_HEART, 5) + M.adjustOrganLoss(ORGAN_SLOT_LIVER, 5) + M.adjustOrganLoss(ORGAN_SLOT_EYES, 5) ///////////////////////// alch BS @@ -578,8 +507,8 @@ brew_reagent = /datum/reagent/alch/syrump brew_amt = 24 can_brew = TRUE - list_reagents = list(/datum/reagent/berrypoison = 10) - grind_results = list(/datum/reagent/berrypoison = 10) + list_reagents = list(/datum/reagent/toxin/berrypoison = 10) + grind_results = list(/datum/reagent/toxin/berrypoison = 10) volume = 10 /obj/item/reagent_containers/powder/alch/mincem @@ -647,8 +576,8 @@ overdose_threshold = null /datum/reagent/alch/syruma/on_mob_metabolize(mob/living/carbon/M) - M.adjustToxLoss(-1*REM, 0) - M.adjustFireLoss(0.25*REM, 0) + M.adjustToxLoss(-1, 0) + M.adjustFireLoss(0.25, 0) M.reagents.remove_all_type(/datum/reagent, 1) M.emote(pick("gag")) @@ -721,8 +650,8 @@ overdose_threshold = null /datum/reagent/alch/syruma/on_mob_metabolize(mob/living/carbon/M) - M.adjustToxLoss(-1*REM, 0) - M.adjustFireLoss(0.25*REM, 0) + M.adjustToxLoss(-1, 0) + M.adjustFireLoss(0.25, 0) M.reagents.remove_all_type(/datum/reagent, 1) M.emote(pick("gag")) diff --git a/code/modules/roguetown/roguejobs/alchemist/wildherbs.dm b/code/modules/roguetown/roguejobs/alchemist/wildherbs.dm index 0d8d5ba73ad..b0f74fd0822 100644 --- a/code/modules/roguetown/roguejobs/alchemist/wildherbs.dm +++ b/code/modules/roguetown/roguejobs/alchemist/wildherbs.dm @@ -22,7 +22,7 @@ has_plod = FALSE update_icon() //Won't update due to proc otherwise timer = initial(timer) - addtimer(CALLBACK(src, .proc/regrow),timer) //Set up the timer properly + addtimer(CALLBACK(src, PROC_REF(regrow)),timer) //Set up the timer properly update_icon() /obj/structure/flora/wildherb/proc/regrow() diff --git a/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm b/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm index c1c470e8fec..87bf383a928 100644 --- a/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm +++ b/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm @@ -323,3 +323,17 @@ req_bar = /obj/item/ingot/iron created_item = /obj/item/reagent_containers/glass/alembic i_type = "Tools" + +/datum/anvil_recipe/tools/glassbottles + name = "5x glass bottles" //more efficent cuz u smith em ig + created_item = list(/obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/bottle) + req_bar = /obj/item/ingot/glass + craftdiff = 1 + i_type = "General" + +/datum/anvil_recipe/tools/glasssyringes + name = "5x glass syringes" //more efficent cuz u smith em ig + created_item = list(/obj/item/reagent_containers/syringe, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/syringe) + req_bar = /obj/item/ingot/glass + craftdiff = 2 + i_type = "General" diff --git a/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/valuables.dm b/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/valuables.dm index 67679e2197a..ae3e4b6e223 100644 --- a/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/valuables.dm +++ b/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/valuables.dm @@ -1,14 +1,14 @@ /datum/anvil_recipe/valuables/special/ringf/obj/item/clothing/neck/roguetown/psicross name = "flame ring (+1 Fat, +1 Ftone, +1 Fiber)" req_bar = /obj/item/ingot/iron - created_item = /obj/item/clothing/ring/lantern + created_item = /obj/item/flashlight/flare/torch/lantern/ring additional_items = list(/obj/item/reagent_containers/food/snacks/fat, /obj/item/natural/stone, /obj/item/natural/fibers) i_type = "Valuables" /datum/anvil_recipe/valuables/special/ringp name = "blessed ring (+1 Psicross)" req_bar = /obj/item/ingot/iron - created_item = /obj/item/clothing/ringP + created_item = /obj/item/clothing/neck/roguetown/psicross/ringP additional_items = list(/obj/item/clothing/neck/roguetown/psicross) i_type = "Valuables" @@ -18,7 +18,7 @@ created_item = list(/obj/item/clothing/ring/silver, /obj/item/clothing/ring/silver, /obj/item/clothing/ring/silver) i_type = "Valuables" - + /datum/anvil_recipe/valuables @@ -46,14 +46,14 @@ /datum/anvil_recipe/valuables/special/ringf/obj/item/clothing/neck/roguetown/psicross name = "flame ring (+1 Fat, +1 stone, +1 Fiber)" req_bar = /obj/item/ingot/iron - created_item = /obj/item/clothing/ring/lantern + created_item = /obj/item/flashlight/flare/torch/lantern/ring additional_items = list(/obj/item/reagent_containers/food/snacks/fat, /obj/item/natural/stone, /obj/item/natural/fibers) i_type = "Valuables" /datum/anvil_recipe/valuables/special/ringp name = "blessed ring (+1 Psicross)" req_bar = /obj/item/ingot/iron - created_item = /obj/item/clothing/ringP + created_item = /obj/item/clothing/neck/roguetown/psicross/ringP additional_items = list(/obj/item/clothing/neck/roguetown/psicross) i_type = "Valuables" @@ -217,4 +217,4 @@ name = "Golden Skull Necklace" req_bar = /obj/item/ingot/gold created_item = /obj/item/clothing/neck/roguetown/psicross/gskull - i_type = "Valuables" + i_type = "Valuables" diff --git a/code/modules/roguetown/roguejobs/blacksmith/forge.dm b/code/modules/roguetown/roguejobs/blacksmith/forge.dm index 583fe76a7c6..cd76cb1ba39 100644 --- a/code/modules/roguetown/roguejobs/blacksmith/forge.dm +++ b/code/modules/roguetown/roguejobs/blacksmith/forge.dm @@ -46,7 +46,7 @@ return else if(istype(attachment, /obj/item/cooking/pan)) - if(W.type in subtypesof(/obj/item/reagent_containers/food/snacks)) + if(istype(W, /obj/item/reagent_containers/food/snacks)) var/obj/item/reagent_containers/food/snacks/S = W if(!food) S.forceMove(src) @@ -56,14 +56,14 @@ return else if(istype(attachment, /obj/item/reagent_containers/glass/bucket/pot)) var/obj/item/reagent_containers/glass/bucket/pot = attachment - if(W.type in subtypesof(/obj/item/reagent_containers/food/snacks) || W.type == /obj/item/reagent_containers/powder/flour) + if(istype(W, /obj/item/reagent_containers/food/snacks) || W.type == /obj/item/reagent_containers/powder/flour) if(pot.reagents.chem_temp < 374) to_chat(user, span_warning("[pot] isn't boiling!")) return var/nutrimentamount = W.reagents.get_reagent_amount(/datum/reagent/consumable/nutriment) - if(W.type in subtypesof(/obj/item/reagent_containers/food/snacks)) + if(istype(W, /obj/item/reagent_containers/food/snacks)) var/obj/item/reagent_containers/food/snacks/snack = W - if(snack.type in subtypesof(/obj/item/reagent_containers/food/snacks/grown) || snack.eat_effect == /datum/status_effect/debuff/uncookedfood) + if(istype(snack, /obj/item/reagent_containers/food/snacks/grown) || snack.eat_effect == /datum/status_effect/debuff/uncookedfood) nutrimentamount *= 1.25 //Boiling food makes more nutrients digestable. if(istype(W, /obj/item/reagent_containers/food/snacks/grown/wheat) || istype(W, /obj/item/reagent_containers/food/snacks/grown/oat) || istype(W, /obj/item/reagent_containers/powder/flour)) nutrimentamount += 2 //Boiling is a way of cooking grain without baking @@ -92,7 +92,7 @@ I.pixel_x = 0 I.pixel_y = 0 add_overlay(new /mutable_appearance(I)) - + /obj/machinery/light/rogue/forge/attack_hand(mob/user) . = ..() if(.) @@ -156,5 +156,5 @@ update_icon() /obj/machinery/light/rogue/forge/Destroy() - QDEL_NULL(boilloop) + QDEL_NULL(boilloop) . = ..() diff --git a/code/modules/roguetown/roguejobs/blacksmith/items.dm b/code/modules/roguetown/roguejobs/blacksmith/items.dm index 339229aec80..ba631ece287 100644 --- a/code/modules/roguetown/roguejobs/blacksmith/items.dm +++ b/code/modules/roguetown/roguejobs/blacksmith/items.dm @@ -88,21 +88,19 @@ if(!istype(O, /obj/structure)) return ..() var/obj/structure/S = O - if(linking) - if(linking == O) - to_chat(user, span_warning("You cannot link me to myself.")) - return - if(linking in S.redstone_attached) - to_chat(user, span_warning("Already linked.")) - linking = null - return - S.redstone_attached |= linking - linking.redstone_attached |= S - linking = null - to_chat(user, span_notice("Link complete.")) - return - else + if(!linking) linking = S to_chat(user, span_info("Link beginning...")) return - ..() + if(linking == O) + to_chat(user, span_warning("You cannot link me to myself.")) + return + if(linking in S.redstone_attached) + to_chat(user, span_warning("Already linked.")) + linking = null + return + S.redstone_attached |= linking + linking.redstone_attached |= S + linking = null + to_chat(user, span_notice("Link complete.")) + return diff --git a/code/modules/roguetown/roguejobs/cook/ingredients/fat.dm b/code/modules/roguetown/roguejobs/cook/ingredients/fat.dm deleted file mode 100644 index 57599ed1569..00000000000 --- a/code/modules/roguetown/roguejobs/cook/ingredients/fat.dm +++ /dev/null @@ -1,96 +0,0 @@ -// /obj/item/reagent_containers/food/snacks/butter -// icon = 'icons/roguetown/items/food.dmi' -// name = "butter" -// desc = "A small crock of butter, with a creamy surface." -// icon_state = "butter6" -// list_reagents = list(/datum/reagent/consumable/nutriment = 8) -// foodtype = DAIRY -// slice_path = /obj/item/reagent_containers/food/snacks/butterslice -// slices_num = 6 -// slice_batch = FALSE -// bitesize = 6 - -// /obj/item/reagent_containers/food/snacks/butter/update_icon() -// if(slices_num) -// icon_state = "butter[slices_num]" -// else -// icon_state = "butter_slice" - -// /obj/item/reagent_containers/food/snacks/butter/On_Consume(mob/living/eater) -// ..() -// if(slices_num) -// if(bitecount == 1) -// slices_num = 5 -// if(bitecount == 2) -// slices_num = 4 -// if(bitecount == 3) -// slices_num = 3 -// if(bitecount == 4) -// slices_num = 2 -// if(bitecount == 5) -// changefood(slice_path, eater) - -// /obj/item/reagent_containers/food/snacks/proc/changefood(path, mob/living/eater) -// if(!path || !eater) -// return -// var/turf/T = get_turf(eater) -// if(eater.dropItemToGround(src)) -// qdel(src) -// var/obj/item/I = new path(T) -// eater.put_in_active_hand(I) - -/obj/item/reagent_containers/food/snacks/butterslice - icon = 'icons/roguetown/items/food.dmi' - icon_state = "butter_slice" - name = "butter" - desc = "A small slice of creamy butter!" - foodtype = DAIRY - list_reagents = list(/datum/reagent/consumable/nutriment = 2) - slices_num = 0 - -/obj/item/reagent_containers/food/snacks/fat - icon = 'icons/roguetown/items/food.dmi' - name = "fat" - desc = "A chunk of rendered animal fat, sustenance and fuel to the living beings." - icon_state = "fat" - list_reagents = list(/datum/reagent/consumable/nutriment = 8) - eat_effect = /datum/status_effect/debuff/uncookedfood - -// /obj/item/reagent_containers/food/snacks/fat/salo -// name = "salo" -// desc = "A salty piece of fatty salo. Delicious!" -// icon_state = "suet4" -// eat_effect = null -// list_reagents = list(/datum/reagent/consumable/nutriment = 12) -// bitesize = 4 -// slice_path = /obj/item/reagent_containers/food/snacks/fat/salo/slice -// slices_num = 4 -// slice_batch = FALSE -// rotprocess = null - -// /obj/item/reagent_containers/food/snacks/fat/salo/update_icon() -// if(slices_num) -// icon_state = "suet[slices_num]" -// else -// icon_state = "suetslice" - -// /obj/item/reagent_containers/food/snacks/fat/salo/On_Consume(mob/living/eater) -// ..() -// if(slices_num) -// if(bitecount == 1) -// slices_num = 3 -// if(bitecount == 2) -// slices_num = 2 -// if(bitecount == 3) -// changefood(slice_path, eater) - - -// /obj/item/reagent_containers/food/snacks/fat/salo/slice -// name = "salo" -// desc = "A fatty, salty slice of salo!" -// icon_state = "suetslice" -// eat_effect = null -// slices_num = 0 -// bitesize = 2 -// slice_path = /obj/item/reagent_containers/food/snacks/fat/salo/slice -// list_reagents = list(/datum/reagent/consumable/nutriment = 3) diff --git a/code/modules/roguetown/roguejobs/cook/ingredients/meat.dm b/code/modules/roguetown/roguejobs/cook/ingredients/meat.dm deleted file mode 100644 index 1c4a055cc29..00000000000 --- a/code/modules/roguetown/roguejobs/cook/ingredients/meat.dm +++ /dev/null @@ -1,63 +0,0 @@ - -/obj/item/reagent_containers/food/snacks/rogue/saltfish/CheckParts(list/parts_list, datum/crafting_recipe/R) - for(var/obj/item/reagent_containers/food/snacks/M in parts_list) - icon_state = "[initial(M.icon_state)]dried" - qdel(M) - -/obj/item/reagent_containers/food/snacks/rogue/meat/drakianwing - name = "descaled drakian wing" - icon_state = "chickencutlet" - fried_type = /obj/item/reagent_containers/food/snacks/rogue/meat/drakianwing/cooked - cooked_type = /obj/item/reagent_containers/food/snacks/rogue/meat/drakianwing/cooked - -/obj/item/reagent_containers/food/snacks/rogue/meat/drakianwing/cooked - eat_effect = /datum/status_effect/buff/foodbuff - slices_num = 0 - name = "fried drakian wing" - desc = "A spicy wing from a dragon... Too small to come from a wyvern, though..?" - icon_state = "drakianwing" - list_reagents = list(/datum/reagent/consumable/nutriment = 15, /datum/reagent/consumable/capsaicin = 10) - bitesize = 5 - -/obj/item/reagent_containers/food/snacks/rogue/meat/sisseantail - name = "descaled sissean tail" - icon = 'icons/obj/surgery.dmi' - icon_state = "lizardtail" - color = "#fbb0b0" - fried_type = /obj/item/reagent_containers/food/snacks/rogue/meat/sisseantail/cooked - cooked_type = /obj/item/reagent_containers/food/snacks/rogue/meat/sisseantail/cooked - -/obj/item/reagent_containers/food/snacks/rogue/meat/sisseantail/cooked - eat_effect = /datum/status_effect/buff/foodbuff - slices_num = 0 - name = "fried sissean tail" - desc = "A delectable sissean tail. Tastes like chicken." - color = "#946114" - list_reagents = list(/datum/reagent/consumable/nutriment = 15) - bitesize = 3 - -/obj/item/reagent_containers/food/snacks/rogue/meat/koboldtail - name = "descaled kobold tail" - icon = 'icons/obj/surgery.dmi' - icon_state = "koboldtail" - color = "#fbb0b0" - fried_type = /obj/item/reagent_containers/food/snacks/rogue/meat/koboldtail/cooked - cooked_type = /obj/item/reagent_containers/food/snacks/rogue/meat/koboldtail/cooked - -/obj/item/reagent_containers/food/snacks/rogue/meat/koboldtail/cooked - eat_effect = /datum/status_effect/buff/foodbuff - slices_num = 0 - name = "fried kobold tail" - desc = "A delectable kobold tail. Tastes like chicken." - color = "#946114" - list_reagents = list(/datum/reagent/consumable/nutriment = 15) - bitesize = 3 - -/obj/item/reagent_containers/food/snacks/rogue/meat/pate - eat_effect = /datum/status_effect/buff/foodbuff - slices_num = 0 - name = "pate" - icon_state = "pate" - desc = "A forcemeat with a prominent flavor of liver." - list_reagents = list(/datum/reagent/consumable/nutriment = 15) - bitesize = 3 diff --git a/code/modules/roguetown/roguejobs/cook/recipes/breads.dm b/code/modules/roguetown/roguejobs/cook/recipes/breads.dm deleted file mode 100644 index bea78c5b0f7..00000000000 --- a/code/modules/roguetown/roguejobs/cook/recipes/breads.dm +++ /dev/null @@ -1,570 +0,0 @@ -/datum/crafting_recipe/roguetown/cooking/dough - name = "dough" - reqs = list( - /datum/reagent/water = 10, - /obj/item/reagent_containers/powder/flour= 2) - result = /obj/item/reagent_containers/food/snacks/rogue/dough - subtype_reqs = FALSE - craftdiff = 0 - -/datum/crafting_recipe/roguetown/cooking/doughslice - name = "smalldough" - reqs = list( - /datum/reagent/water = 5, - /obj/item/reagent_containers/powder/flour= 1) - result = /obj/item/reagent_containers/food/snacks/rogue/doughslice - subtype_reqs = FALSE - craftdiff = 0 - -/datum/crafting_recipe/roguetown/cooking/flatdough - name = "flatdough" - reqs = list( - /datum/reagent/water = 10, - /obj/item/reagent_containers/powder/flour= 1) - result = /obj/item/reagent_containers/food/snacks/rogue/flatdough - subtype_reqs = FALSE - craftdiff = 0 - -/datum/crafting_recipe/roguetown/cooking/comdough - name = "combine dough" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/doughslice=2) - result = /obj/item/reagent_containers/food/snacks/rogue/dough - subtype_reqs = FALSE - skillcraft = null - -/datum/crafting_recipe/roguetown/cooking/spldough - name = "split dough" - reqs = list(/obj/item/reagent_containers/food/snacks/rogue/dough=1) - result = list(/obj/item/reagent_containers/food/snacks/rogue/doughslice=2) - subtype_reqs = FALSE - craftdiff = 0 - skillcraft = null - -/datum/crafting_recipe/roguetown/cooking/crackers - name = "crackers" - reqs = list( - /obj/item/reagent_containers/powder/salt = 1, - /obj/item/reagent_containers/food/snacks/rogue/doughslice= 1) - result = /obj/item/reagent_containers/food/snacks/rogue/crackers - subtype_reqs = FALSE - -/obj/item/reagent_containers/food/snacks/rogue/dough - name = "dough" - desc = "" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "dough" - slices_num = 2 - slice_batch = TRUE - slice_path = /obj/item/reagent_containers/food/snacks/rogue/doughslice - cooked_type = /obj/item/reagent_containers/food/snacks/rogue/bread - list_reagents = list(/datum/reagent/consumable/nutriment = 1) - w_class = WEIGHT_CLASS_NORMAL - tastes = list("dough" = 1) - foodtype = GRAIN - eat_effect = /datum/status_effect/debuff/uncookedfood - rotprocess = 30 MINUTES - -/obj/item/reagent_containers/food/snacks/rogue/flatdough - name = "flat dough" - desc = "" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "flatdough" - cooked_type = /obj/item/reagent_containers/food/snacks/rogue/flatbread - list_reagents = list(/datum/reagent/consumable/nutriment = 1) - w_class = WEIGHT_CLASS_NORMAL - tastes = list("dough" = 1) - foodtype = GRAIN - eat_effect = /datum/status_effect/debuff/uncookedfood - rotprocess = 30 MINUTES - -/obj/item/reagent_containers/food/snacks/rogue/doughslice - name = "smalldough" - desc = "" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "doughslice" - slices_num = 0 - cooked_type = /obj/item/reagent_containers/food/snacks/rogue/bun - list_reagents = list(/datum/reagent/consumable/nutriment = 1) - w_class = WEIGHT_CLASS_NORMAL - tastes = list("dough" = 1) - foodtype = GRAIN - eat_effect = /datum/status_effect/debuff/uncookedfood - rotprocess = 30 MINUTES - -/obj/item/reagent_containers/food/snacks/rogue/crackers - name = "crackers" - desc = "" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "crackercook" - slices_num = 0 - cooked_type = /obj/item/reagent_containers/food/snacks/rogue/crackerscooked - list_reagents = list(/datum/reagent/consumable/nutriment = 1) - w_class = WEIGHT_CLASS_NORMAL - tastes = list("dough" = 1) - foodtype = GRAIN - eat_effect = /datum/status_effect/debuff/uncookedfood - rotprocess = 30 MINUTES - -/obj/item/reagent_containers/food/snacks/rogue/crackerscooked - name = "crackers" - desc = "" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "cracker6" - slices_num = 0 - list_reagents = list(/datum/reagent/consumable/nutriment = 12) - w_class = WEIGHT_CLASS_NORMAL - tastes = list("spelt" = 1) - foodtype = GRAIN - bitesize = 6 - rotprocess = null - -/obj/item/reagent_containers/food/snacks/rogue/crackerscooked/On_Consume(mob/living/eater) - ..() - if(bitecount == 1) - icon_state = "cracker5" - if(bitecount == 2) - icon_state = "cracker4" - if(bitecount == 3) - icon_state = "cracker3" - if(bitecount == 4) - icon_state = "cracker2" - if(bitecount == 5) - icon_state = "cracker1" - - -/datum/crafting_recipe/roguetown/cooking/cheeseegg - name = "cheeseegg" - reqs = list( - /obj/item/reagent_containers/food/snacks/egg = 1, - /obj/item/reagent_containers/food/snacks/rogue/cheddarslice = 3, - /obj/item/reagent_containers/food/snacks/rogue/doughslice = 1) - result = /obj/item/reagent_containers/food/snacks/rogue/cheeseegg - craftdiff = 1 - subtype_reqs = TRUE - -/obj/item/reagent_containers/food/snacks/rogue/cheeseegg - name = "cheeseegg" - desc = "" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "cheeseegg" - slices_num = 0 - cooked_type = /obj/item/reagent_containers/food/snacks/rogue/cheeseeggcooked - list_reagents = list(/datum/reagent/consumable/nutriment = 5) - w_class = WEIGHT_CLASS_NORMAL - tastes = list("dough" = 1) - foodtype = GRAIN - eat_effect = /datum/status_effect/debuff/uncookedfood - rotprocess = 30 MINUTES - -/obj/item/reagent_containers/food/snacks/rogue/cheeseeggcooked - name = "cheeseegg" - desc = "" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "cheeseeggfinish" - bitesize = 4 - cooked_type = /obj/item/reagent_containers/food/snacks/rogue/cheeseeggcooked - list_reagents = list(/datum/reagent/consumable/nutriment = 10) - w_class = WEIGHT_CLASS_NORMAL - tastes = list("eggs" = 1,"cheese" = 1,"butter" = 1) - foodtype = GRAIN - eat_effect = null - rotprocess = 30 MINUTES - - -/obj/item/reagent_containers/food/snacks/rogue/bread - name = "bread" - desc = "" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "loaf6" - slices_num = 6 - slice_path = /obj/item/reagent_containers/food/snacks/rogue/breadslice - list_reagents = list(/datum/reagent/consumable/nutriment = 24) - w_class = WEIGHT_CLASS_NORMAL - tastes = list("spelt" = 1) - foodtype = GRAIN - slice_batch = FALSE - rotprocess = 30 MINUTES - - -/obj/item/reagent_containers/food/snacks/rogue/flatbread - name = "flat bread" - desc = "" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "flatbread" - list_reagents = list(/datum/reagent/consumable/nutriment = 10) - w_class = WEIGHT_CLASS_NORMAL - tastes = list("airy dough" = 1) - foodtype = GRAIN - slice_batch = FALSE - rotprocess = 30 MINUTES - dropshrink = 0.75 - -/obj/item/reagent_containers/food/snacks/rogue/bread/update_icon() - if(slices_num) - icon_state = "loaf[slices_num]" - else - icon_state = "loaf_slice" - -/obj/item/reagent_containers/food/snacks/rogue/bread/On_Consume(mob/living/eater) - ..() - if(slices_num) - if(bitecount == 1) - slices_num = 5 - if(bitecount == 2) - slices_num = 4 - if(bitecount == 3) - slices_num = 3 - if(bitecount == 4) - slices_num = 2 - if(bitecount == 5) - changefood(slice_path, eater) - - -/obj/item/reagent_containers/food/snacks/rogue/breadslice - name = "sliced bread" - desc = "" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "loaf_slice" - slices_num = 0 - list_reagents = list(/datum/reagent/consumable/nutriment = 4) - w_class = WEIGHT_CLASS_NORMAL - cooked_type = /obj/item/reagent_containers/food/snacks/rogue/breadslice/toast - tastes = list("spelt" = 1) - foodtype = GRAIN - bitesize = 1 -//this is a child so we can be used in sammies -/obj/item/reagent_containers/food/snacks/rogue/breadslice/toast - name = "toast" - desc = "" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "toast" - slices_num = 0 - list_reagents = list(/datum/reagent/consumable/nutriment = 8) - w_class = WEIGHT_CLASS_NORMAL - tastes = list("spelt" = 1) - cooked_type = null - foodtype = GRAIN - bitesize = 1 - rotprocess = 30 MINUTES - -/obj/item/reagent_containers/food/snacks/rogue/bun - name = "bun" - desc = "" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "bun" - slices_num = 0 - list_reagents = list(/datum/reagent/consumable/nutriment = 6) - w_class = WEIGHT_CLASS_NORMAL - tastes = list("spelt" = 1) - foodtype = GRAIN - bitesize = 2 - rotprocess = 30 MINUTES - -/datum/crafting_recipe/roguetown/cooking/butterbiscuit - name = "butter bun" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/biscuitcooked = 1, - /obj/item/reagent_containers/food/snacks/butterslice= 1 - ) - result = /obj/item/reagent_containers/food/snacks/rogue/bun - subtype_reqs = FALSE - craftdiff = 0 - -/obj/item/reagent_containers/food/snacks/rogue/biscuitcooked/butter - name = "biscuit of butter" - desc = "" - icon = 'icons/obj/food/food.dmi' - icon_state = "butterbiscuit" - filling_color = "#F0E68C" - list_reagents = list(/datum/reagent/consumable/nutriment = 8) - tastes = list("butter" = 1, "biscuit" = 1) - foodtype = GRAIN - bitesize = 3 - rotprocess = 60 MINUTES - -/datum/crafting_recipe/roguetown/cooking/sweetroll - name = "sweetroll" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/bun = 1, - /datum/reagent/consumable/sugar = 5) - result = /obj/item/reagent_containers/food/snacks/rogue/sweetroll - subtype_reqs = FALSE - craftdiff = 0 - -/obj/item/reagent_containers/food/snacks/rogue/sweetroll - name = "sweetroll" - desc = "Stealing it is punishable by death." - icon = 'icons/roguetown/items/food.dmi' - icon_state = "sweetroll" - slices_num = 0 - list_reagents = list(/datum/reagent/consumable/nutriment = 13) - w_class = WEIGHT_CLASS_SMALL - tastes = list("sweetness and sugar" = 1) - foodtype = GRAIN | SUGAR - bitesize = 2 - rotprocess = 30 MINUTES - -/datum/crafting_recipe/roguetown/cooking/honeybun - name = "honey bun" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/bun = 1, - /datum/reagent/consumable/honey = 5) - result = /obj/item/reagent_containers/food/snacks/rogue/honeybun - subtype_reqs = FALSE - craftdiff = 1 - -/obj/item/reagent_containers/food/snacks/rogue/honeybun - name = "honey bun" - desc = "Delectable, fluffy and sweet." - icon = 'icons/roguetown/items/food.dmi' - icon_state = "honeybun" - slices_num = 0 - list_reagents = list(/datum/reagent/consumable/nutriment = 13, /datum/reagent/consumable/honey = 5) - w_class = WEIGHT_CLASS_SMALL - tastes = list("sweetness and light" = 1) - foodtype = GRAIN | SUGAR - bitesize = 2 - rotprocess = 30 MINUTES - -/datum/crafting_recipe/roguetown/cooking/btoast - name = "buttered toast" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/breadslice/toast = 1, - /obj/item/reagent_containers/food/snacks/butterslice = 1) - result = /obj/item/reagent_containers/food/snacks/rogue/breadslice/toastbuttered - craftdiff = 0 - skillcraft = null - subtype_reqs = FALSE - -/obj/item/reagent_containers/food/snacks/rogue/breadslice/toastbuttered - name = "toast that is buttered" - desc = "" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "toastb" - slices_num = 0 - list_reagents = list(/datum/reagent/consumable/nutriment = 8) - w_class = WEIGHT_CLASS_NORMAL - tastes = list("spelt" = 1) - foodtype = GRAIN - bitesize = 2 - - -/datum/crafting_recipe/roguetown/cooking/raisinloaf - name = "raisin loaf" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/dough = 1, - /obj/item/reagent_containers/food/snacks/rogue/raisins = 2) - craftdiff = 1 - result = /obj/item/reagent_containers/food/snacks/rogue/rbreaduncooked - - subtype_reqs = FALSE - -/obj/item/reagent_containers/food/snacks/rogue/rbreaduncooked - name = "loaf of raisins" - desc = "" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "raisinbreaduncooked" - slices_num = 0 - cooked_type = /obj/item/reagent_containers/food/snacks/rogue/raisinbread - list_reagents = list(/datum/reagent/consumable/nutriment = 1) - w_class = WEIGHT_CLASS_NORMAL - tastes = list("dough" = 1) - foodtype = GRAIN - eat_effect = /datum/status_effect/debuff/uncookedfood - rotprocess = 30 MINUTES - -/obj/item/reagent_containers/food/snacks/rogue/raisinbread - name = "raisin loaf" - desc = "" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "raisinbread6" - slices_num = 6 - slice_path = /obj/item/reagent_containers/food/snacks/rogue/raisinbreadslice - list_reagents = list(/datum/reagent/consumable/nutriment = 30) - w_class = WEIGHT_CLASS_NORMAL - tastes = list("bread" = 1,"dried fruit" = 1) - foodtype = GRAIN - slice_batch = FALSE - rotprocess = 30 MINUTES - eat_effect = /datum/status_effect/buff/foodbuff - -/obj/item/reagent_containers/food/snacks/rogue/raisinbread/update_icon() - if(slices_num) - icon_state = "raisinbread[slices_num]" - else - icon_state = "raisinbread_slice" - -/obj/item/reagent_containers/food/snacks/rogue/raisinbread/On_Consume(mob/living/eater) - ..() - if(slices_num) - if(bitecount == 1) - slices_num = 5 - if(bitecount == 2) - slices_num = 4 - if(bitecount == 3) - slices_num = 3 - if(bitecount == 4) - slices_num = 2 - if(bitecount == 5) - changefood(slice_path, eater) - -/obj/item/reagent_containers/food/snacks/rogue/raisinbreadslice - name = "raisin loaf slice" - desc = "" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "raisinbread_slice" - slices_num = 0 - list_reagents = list(/datum/reagent/consumable/nutriment = 4) - w_class = WEIGHT_CLASS_NORMAL - cooked_type = null - tastes = list("spelt" = 1,"dried fruit" = 1) - foodtype = GRAIN - bitesize = 2 - eat_effect = /datum/status_effect/buff/foodbuff - - -/datum/crafting_recipe/roguetown/cooking/biscuit - name = "biscuit" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/doughslice = 1, - /obj/item/reagent_containers/food/snacks/butterslice = 1) - result = /obj/item/reagent_containers/food/snacks/rogue/biscuituncooked - craftdiff = 0 - - subtype_reqs = FALSE - -/obj/item/reagent_containers/food/snacks/rogue/biscuituncooked - name = "biscuit" - desc = "" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "uncookbiscuit" - slices_num = 0 - cooked_type = /obj/item/reagent_containers/food/snacks/rogue/biscuitcooked - list_reagents = list(/datum/reagent/consumable/nutriment = 1) - w_class = WEIGHT_CLASS_NORMAL - tastes = list("dough" = 1) - foodtype = GRAIN - eat_effect = /datum/status_effect/debuff/uncookedfood - rotprocess = 30 MINUTES - -/obj/item/reagent_containers/food/snacks/rogue/biscuitcooked - name = "biscuit" - desc = "" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "biscuit" - slices_num = 0 - list_reagents = list(/datum/reagent/consumable/nutriment = 6) - w_class = WEIGHT_CLASS_NORMAL - tastes = list("spelt" = 1) - foodtype = GRAIN - bitesize = 3 - rotprocess = 60 MINUTES - -//=-================================================================= - -/datum/crafting_recipe/roguetown/cooking/cheesecake - name = "cheesecake" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/dough = 1, - /obj/item/reagent_containers/food/snacks/egg = 1, - /obj/item/reagent_containers/food/snacks/rogue/cheese = 2) - result = /obj/item/reagent_containers/food/snacks/rogue/ccakeuncooked - craftdiff = 1 - subtype_reqs = FALSE - -/obj/item/reagent_containers/food/snacks/rogue/ccakeuncooked - name = "cake of cheese" - desc = "" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "cheesecakeuncook" - slices_num = 0 - cooked_type = /obj/item/reagent_containers/food/snacks/rogue/ccake - list_reagents = list(/datum/reagent/consumable/nutriment = 1) - w_class = WEIGHT_CLASS_NORMAL - tastes = list("dough" = 1) - foodtype = GRAIN - eat_effect = /datum/status_effect/debuff/uncookedfood - rotprocess = 30 MINUTES - -/obj/item/reagent_containers/food/snacks/rogue/ccake - name = "cheesecake" - desc = "" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "cheesecake" - slices_num = 8 - slice_path = /obj/item/reagent_containers/food/snacks/rogue/ccakeslice - list_reagents = list(/datum/reagent/consumable/nutriment = 48) - w_class = WEIGHT_CLASS_NORMAL - tastes = list("sweet cheese"=1) - foodtype = GRAIN - slice_batch = TRUE - rotprocess = 30 MINUTES - eat_effect = /datum/status_effect/buff/foodbuff - bitesize = 16 - -/obj/item/reagent_containers/food/snacks/rogue/ccakeslice - name = "cheesecake slice" - desc = "" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "cheesecake_slice" - slices_num = 0 - list_reagents = list(/datum/reagent/consumable/nutriment = 6) - w_class = WEIGHT_CLASS_NORMAL - cooked_type = null - tastes = list("sweet cheese"=1) - foodtype = GRAIN - bitesize = 2 - eat_effect = /datum/status_effect/buff/foodbuff - rotprocess = 20 MINUTES - - -/datum/crafting_recipe/roguetown/cooking/sweetroll - name = "sweetroll" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/bun = 1, - /obj/item/reagent_containers/powder/sugar = 1) - result = /obj/item/reagent_containers/food/snacks/rogue/sweetroll - craftdiff = 1 - subtype_reqs = FALSE - -/* /obj/item/reagent_containers/food/snacks/rogue/sweetroll - name = "sweetroll" - desc = "" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "sweetroll" - dropshrink = 0.75 - list_reagents = list(/datum/reagent/consumable/nutriment = 10) - w_class = WEIGHT_CLASS_NORMAL - tastes = list("sugar and crispy dough" = 1) - foodtype = SUGAR - eat_effect = /datum/status_effect/buff/foodbuff */ - -/datum/crafting_recipe/roguetown/cooking/garlictoastslice - name = "garlic toast" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/breadslice/toast = 1, - /obj/item/reagent_containers/food/snacks/grown/garlic = 1, - /obj/item/reagent_containers/food/snacks/butterslice = 1) - result = /obj/item/reagent_containers/food/snacks/rogue/garlictoast - craftdiff = 1 - subtype_reqs = FALSE - -/datum/crafting_recipe/roguetown/cooking/garlictoastslice - name = "garlic toast" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/breadslice/toastbuttered = 1, - /obj/item/reagent_containers/food/snacks/grown/garlic = 1) - result = /obj/item/reagent_containers/food/snacks/rogue/garlictoast - craftdiff = 1 - subtype_reqs = FALSE - -/obj/item/reagent_containers/food/snacks/rogue/garlictoast - name = "garlic toast" - desc = "" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "garlictoastslice" - list_reagents = list(/datum/reagent/consumable/nutriment = 8) - w_class = WEIGHT_CLASS_NORMAL - tastes = list("spelt" = 1,"garlic" = 1) - foodtype = GRAIN diff --git a/code/modules/roguetown/roguejobs/cook/recipes/meat.dm b/code/modules/roguetown/roguejobs/cook/recipes/meat.dm deleted file mode 100644 index 85e2a22e973..00000000000 --- a/code/modules/roguetown/roguejobs/cook/recipes/meat.dm +++ /dev/null @@ -1,137 +0,0 @@ -/* -/datum/crafting_recipe/roguetown/cooking/sausage - name = "sausage (mm)" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/meat/mince = 2) - result = /obj/item/reagent_containers/food/snacks/rogue/meat/sausage - req_table = TRUE - subtype_reqs = TRUE - -/datum/crafting_recipe/roguetown/cooking/sausage/mf - name = "sausage (mf)" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/meat/mince = 1, - /obj/item/reagent_containers/food/snacks/fat = 1) - result = /obj/item/reagent_containers/food/snacks/rogue/meat/sausage - - -/datum/crafting_recipe/roguetown/cooking/sausage/bb - name = "sausage (bb)" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/meat/bacon = 2) - result = /obj/item/reagent_containers/food/snacks/rogue/meat/sausage - - -/datum/crafting_recipe/roguetown/cooking/sausage/fb - name = "sausage (fb)" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/meat/bacon = 1, - /obj/item/reagent_containers/food/snacks/fat = 1) - result = /obj/item/reagent_containers/food/snacks/rogue/meat/sausage - - -/datum/crafting_recipe/roguetown/cooking/salami - name = "salumoi" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/meat/sausage = 1, - /obj/item/reagent_containers/powder/salt = 1) - result = /obj/item/reagent_containers/food/snacks/rogue/meat/salami - req_table = FALSE - structurecraft = /obj/structure/fluff/dryingrack - craftdiff = 0 - -/datum/crafting_recipe/roguetown/cooking/coppiette - name = "coppiette" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/meat/steak = 1, - /obj/item/reagent_containers/powder/salt = 1) - result = /obj/item/reagent_containers/food/snacks/rogue/meat/coppiette - req_table = FALSE - craftdiff = 0 - structurecraft = /obj/structure/fluff/dryingrack - - -/datum/crafting_recipe/roguetown/cooking/salo - name = "salo" - reqs = list( - /obj/item/reagent_containers/food/snacks/fat = 1, - /obj/item/reagent_containers/powder/salt = 1) - result = /obj/item/reagent_containers/food/snacks/fat/salo - craftdiff = 0 - structurecraft = /obj/structure/fluff/dryingrack - req_table = FALSE - -/datum/crafting_recipe/roguetown/cooking/saltfish - name = "saltfish" - reqs = list( - /obj/item/reagent_containers/food/snacks/fish = 1, - /obj/item/reagent_containers/powder/salt = 1) - parts = list( - /obj/item/reagent_containers/food/snacks/fish = 1) - result = /obj/item/reagent_containers/food/snacks/rogue/saltfish - req_table = FALSE - craftdiff = 0 - subtype_reqs = TRUE - structurecraft = /obj/structure/fluff/dryingrack - -/datum/crafting_recipe/roguetown/cooking/meatloaf - name = "meatloaf" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/meat/mince = 3, - /obj/item/reagent_containers/food/snacks/rogue/onionslice = 3, - /obj/item/reagent_containers/food/snacks/grown/garlic = 1) - result = /obj/item/reagent_containers/food/snacks/rogue/meat/meatloaf - craftdiff = 3 - subtype_reqs = TRUE - req_table = TRUE - -/datum/crafting_recipe/roguetown/cooking/wellington - name = "beef à la Kron" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/meat/steak = 3, - /obj/item/reagent_containers/food/snacks/grown/plumphelmet = 2, - /obj/item/reagent_containers/food/snacks/rogue/onionslice = 5, - /obj/item/reagent_containers/food/snacks/rogue/piedough = 1) - result = /obj/item/reagent_containers/food/snacks/rogue/meat/wellington - craftdiff = 5 - subtype_reqs = TRUE - req_table = TRUE - -/datum/crafting_recipe/roguetown/cooking/descaledrakian - name = "descale drakian wing" - reqs = list(/obj/item/organ/wings/dracon = 1) - tools = list(/obj/item/rogueweapon/huntingknife) - result = /obj/item/reagent_containers/food/snacks/rogue/meat/drakianwing - craftdiff = 2 - subtype_reqs = TRUE - req_table = TRUE - -/datum/crafting_recipe/roguetown/cooking/descalesissean - name = "descale sissean tail" - reqs = list(/obj/item/organ/tail/lizard = 1) - tools = list(/obj/item/rogueweapon/huntingknife) - result = /obj/item/reagent_containers/food/snacks/rogue/meat/sisseantail - craftdiff = 2 - subtype_reqs = TRUE - req_table = TRUE - -/datum/crafting_recipe/roguetown/cooking/descalekobold - name = "descale kobold tail" - reqs = list(/obj/item/organ/tail/kobold = 1) - tools = list(/obj/item/rogueweapon/huntingknife) - result = /obj/item/reagent_containers/food/snacks/rogue/meat/koboldtail - craftdiff = 2 - subtype_reqs = TRUE - req_table = TRUE - -/datum/crafting_recipe/roguetown/cooking/pate - name = "pate" - reqs = list( - /obj/item/organ/liver = 1, - /obj/item/reagent_containers/food/snacks/rogue/onionslice = 2, - /obj/item/reagent_containers/food/snacks/rogue/meat/mince = 1 - ) - result = /obj/item/reagent_containers/food/snacks/rogue/meat/pate - craftdiff = 2 - subtype_reqs = TRUE - req_table = TRUE diff --git a/code/modules/roguetown/roguejobs/cook/recipes/misc.dm b/code/modules/roguetown/roguejobs/cook/recipes/misc.dm deleted file mode 100644 index 2f4983ee38b..00000000000 --- a/code/modules/roguetown/roguejobs/cook/recipes/misc.dm +++ /dev/null @@ -1,18 +0,0 @@ -/datum/crafting_recipe/roguetown/cooking/soap - name = "soap" - reqs = list( - /obj/item/ash = 1, - /datum/reagent/water = 10, - /obj/item/reagent_containers/food/snacks/fat = 1) - result = /obj/item/soap - craftdiff = 5 - -/datum/crafting_recipe/roguetown/cooking/cucumberjar - name = "jar cucumbers" - reqs = list( - /obj/item/reagent_containers/powder/salt = 1, - /datum/reagent/water = 10, - /obj/item/reagent_containers/food/snacks/grown/cucumber = 4, - /obj/item/reagent_containers/glass/bottle = 1) - result = /obj/item/reagent_containers/food/snacks/grown/cucumberjar - craftdiff = 1 diff --git a/code/modules/roguetown/roguejobs/cook/recipes/pastries.dm b/code/modules/roguetown/roguejobs/cook/recipes/pastries.dm deleted file mode 100644 index 3d347121d10..00000000000 --- a/code/modules/roguetown/roguejobs/cook/recipes/pastries.dm +++ /dev/null @@ -1,623 +0,0 @@ -// /datum/crafting_recipe/roguetown/cooking/sweetdough -// name = "sweet dough" -// reqs = list( -// /datum/reagent/water = 10, -// /obj/item/reagent_containers/food/snacks/egg = 1, -// /obj/item/reagent_containers/powder/salt = 1, -// /obj/item/reagent_containers/powder/flour = 1, -// /obj/item/reagent_containers/powder/sugar = 1) -// result = /obj/item/reagent_containers/food/snacks/rogue/sweetdough -// craftdiff = 2 -// subtype_reqs = FALSE - - -// /obj/item/reagent_containers/food/snacks/rogue/sweetdough -// name = "sweet dough" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "sweetdough" -// slices_num = 4 -// slice_path = /obj/item/reagent_containers/food/snacks/rogue/uncookedfinecake -// cooked_type = /obj/item/reagent_containers/food/snacks/rogue/plaincake -// list_reagents = list(/datum/reagent/consumable/nutriment = 1) -// w_class = WEIGHT_CLASS_NORMAL -// tastes = list("sweetened dough" = 1) -// foodtype = SUGAR -// eat_effect = /datum/status_effect/debuff/uncookedfood -// rotprocess = 30 MINUTES - -// /obj/item/reagent_containers/food/snacks/rogue/uncookedfinecake -// name = "uncooked fine cake" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "finecake" -// list_reagents = list(/datum/reagent/consumable/nutriment = 1) -// cooked_type = /obj/item/reagent_containers/food/snacks/rogue/finecake -// w_class = WEIGHT_CLASS_NORMAL -// tastes = list("dough" = 1,"sugar" = 1) -// foodtype = GRAIN -// slice_batch = FALSE -// rotprocess = 30 MINUTES -// eat_effect = /datum/status_effect/debuff/uncookedfood - -// /obj/item/reagent_containers/food/snacks/rogue/finecake -// name = "finecake" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "finecake3" -// list_reagents = list(/datum/reagent/consumable/nutriment = 10) -// w_class = WEIGHT_CLASS_NORMAL -// tastes = list("delicate, melt in your mouth sweetness" = 1) -// foodtype = GRAIN -// bitesize = 3 -// rotprocess = null - -// /obj/item/reagent_containers/food/snacks/rogue/finecake/On_Consume(mob/living/eater) -// ..() -// if(bitecount == 1) -// icon_state = "finecake2" -// if(bitecount == 2) -// icon_state = "finecake1" - -// /obj/item/reagent_containers/food/snacks/rogue/plaincake -// name = "plain cake" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "plaincake" -// slices_num = 6 -// slice_path = /obj/item/reagent_containers/food/snacks/rogue/plaincakeslice -// list_reagents = list(/datum/reagent/consumable/nutriment = 40) -// w_class = WEIGHT_CLASS_BULKY -// tastes = list("crispy sweetened dough with a sugar glaze and hints of rosewater" = 1) -// foodtype = SUGAR -// eat_effect = /datum/status_effect/buff/foodbuff -// bitesize = 6 -// rotprocess = null -// dropshrink = 0.80 - -// /obj/item/reagent_containers/food/snacks/rogue/plaincakeslice -// name = "plain cake slice" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "plaincakeslice" -// list_reagents = list(/datum/reagent/consumable/nutriment = 7) -// w_class = WEIGHT_CLASS_NORMAL -// tastes = list("crispy sweetened dough with a sugar glaze and hints of rosewater" = 1) -// foodtype = SUGAR -// eat_effect = /datum/status_effect/buff/foodbuff -// bitesize = 3 -// rotprocess = null -// dropshrink = 0.60 - -// /datum/crafting_recipe/roguetown/cooking/uncookedapplejam -// name = "uncooked apple jam" -// reqs = list( -// /obj/item/reagent_containers/glass/beaker/jar = 1, -// /obj/item/reagent_containers/food/snacks/grown/apple = 2, -// /obj/item/reagent_containers/powder/sugar = 1) -// result = /obj/item/reagent_containers/food/snacks/rogue/uncookedapplejam -// craftdiff = 2 -// subtype_reqs = FALSE - -// /obj/item/reagent_containers/food/snacks/rogue/uncookedapplejam -// name = "uncooked apple jam" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "uncookedapplejam" -// w_class = WEIGHT_CLASS_NORMAL -// foodtype = SUGAR -// eat_effect = /datum/status_effect/debuff/uncookedfood -// bitesize = 3 -// rotprocess = null -// dropshrink = 0.60 - -// /datum/crafting_recipe/roguetown/cooking/applejam -// name = "apple jam" -// reqs = list( -// /datum/reagent/water = 10, -// /obj/item/reagent_containers/food/snacks/rogue/uncookedapplejam = 1) -// result = /obj/item/reagent_containers/food/snacks/rogue/applejam -// craftdiff = 2 -// subtype_reqs = FALSE -// tools = list(/obj/item/reagent_containers/glass/bucket/pot) - -// /obj/item/reagent_containers/food/snacks/rogue/applejam -// name = "apple jam" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "applejam" -// list_reagents = list(/datum/reagent/consumable/nutriment = 10) -// w_class = WEIGHT_CLASS_NORMAL -// tastes = list("oversweet apple" = 1) -// foodtype = SUGAR -// bitesize = 3 -// rotprocess = null -// dropshrink = 0.60 -// trash = /obj/item/reagent_containers/glass/beaker/jar - -// /datum/crafting_recipe/roguetown/cooking/uncookedappletart -// name = "uncooked apple tart" -// reqs = list( -// /obj/item/reagent_containers/food/snacks/rogue/sweetdough= 1, -// /obj/item/reagent_containers/food/snacks/rogue/applejam= 1) -// result = list( /obj/item/reagent_containers/food/snacks/rogue/uncookedappletart = 1, -// /obj/item/reagent_containers/glass/beaker/jar = 1) -// craftdiff = 2 -// subtype_reqs = FALSE - -// /obj/item/reagent_containers/food/snacks/rogue/uncookedappletart -// name = "uncooked apple tart" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "uncookedappletart" -// list_reagents = list(/datum/reagent/consumable/nutriment = 10) -// cooked_type = /obj/item/reagent_containers/food/snacks/rogue/appletart -// w_class = WEIGHT_CLASS_BULKY -// tastes = list("crispy sweetened dough with a sugar glaze and hints of rosewater" = 1) -// foodtype = SUGAR -// eat_effect = /datum/status_effect/debuff/uncookedfood -// bitesize = 6 -// rotprocess = 30 MINUTES -// dropshrink = 0.80 - -// /obj/item/reagent_containers/food/snacks/rogue/appletart -// name = "apple tart" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "appletart" -// slices_num = 6 -// slice_path = /obj/item/reagent_containers/food/snacks/rogue/appletartslice -// list_reagents = list(/datum/reagent/consumable/nutriment = 48) -// w_class = WEIGHT_CLASS_BULKY -// tastes = list("A crispy dough with delicate, sweet apple filling" = 1) -// foodtype = SUGAR -// eat_effect = /datum/status_effect/buff/foodbuff -// bitesize = 6 -// dropshrink = 0.80 - -// /obj/item/reagent_containers/food/snacks/rogue/appletartslice -// name = "apple tart slice" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "appletartslice" -// list_reagents = list(/datum/reagent/consumable/nutriment = 8) -// w_class = WEIGHT_CLASS_NORMAL -// tastes = list("Soft, sweet filling, with a flaky dough" = 1) -// foodtype = SUGAR -// eat_effect = /datum/status_effect/buff/foodbuff -// bitesize = 3 -// rotprocess = null -// dropshrink = 0.60 - -// /datum/crafting_recipe/roguetown/cooking/appletoast -// name = "apple toast" -// reqs = list( -// /obj/item/reagent_containers/food/snacks/rogue/applejam = 1, -// /obj/item/reagent_containers/food/snacks/rogue/breadslice/toast = 6) -// result = list( /obj/item/reagent_containers/food/snacks/rogue/appletoast, -// /obj/item/reagent_containers/food/snacks/rogue/appletoast, -// /obj/item/reagent_containers/food/snacks/rogue/appletoast, -// /obj/item/reagent_containers/food/snacks/rogue/appletoast, -// /obj/item/reagent_containers/food/snacks/rogue/appletoast, -// /obj/item/reagent_containers/food/snacks/rogue/appletoast, -// /obj/item/reagent_containers/glass/beaker/jar) -// craftdiff = 2 -// subtype_reqs = FALSE - -// /obj/item/reagent_containers/food/snacks/rogue/appletoast -// name = "apple toast" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "appletoast" -// list_reagents = list(/datum/reagent/consumable/nutriment = 10) -// w_class = WEIGHT_CLASS_NORMAL -// tastes = list("crispy toast with a sweet apple topping" = 1) -// foodtype = SUGAR -// eat_effect = /datum/status_effect/buff/foodbuff -// bitesize = 3 -// rotprocess = null - -// /datum/crafting_recipe/roguetown/cooking/uncookedberryjam -// name = "uncooked berry jam" -// reqs = list( -// /obj/item/reagent_containers/glass/beaker/jar = 1, -// /obj/item/reagent_containers/food/snacks/grown/berries/rogue = 3, -// /obj/item/reagent_containers/powder/sugar = 1) -// result = /obj/item/reagent_containers/food/snacks/rogue/uncookedberryjam -// craftdiff = 2 -// subtype_reqs = FALSE - -// /obj/item/reagent_containers/food/snacks/rogue/uncookedberryjam -// name = "uncooked berry jam" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "uncookedberryjam" -// w_class = WEIGHT_CLASS_NORMAL -// foodtype = SUGAR -// eat_effect = /datum/status_effect/debuff/uncookedfood -// bitesize = 3 -// rotprocess = null -// dropshrink = 0.60 - -// /datum/crafting_recipe/roguetown/cooking/berryjam -// name = "berry jam" -// reqs = list( -// /datum/reagent/water = 10, -// /obj/item/reagent_containers/food/snacks/rogue/uncookedberryjam = 1) -// result = /obj/item/reagent_containers/food/snacks/rogue/berryjam -// craftdiff = 2 -// subtype_reqs = FALSE -// tools = list(/obj/item/reagent_containers/glass/bucket/pot) - -// /obj/item/reagent_containers/food/snacks/rogue/berryjam -// name = "berry jam" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "berryjam" -// list_reagents = list(/datum/reagent/consumable/nutriment = 10) -// w_class = WEIGHT_CLASS_NORMAL -// tastes = list("sweetened berry" = 1) -// foodtype = SUGAR -// bitesize = 3 -// rotprocess = null -// dropshrink = 0.60 -// trash = /obj/item/reagent_containers/glass/beaker/jar - -// /datum/crafting_recipe/roguetown/cooking/uncookedberrytart -// name = "uncooked berry tart" -// reqs = list( -// /obj/item/reagent_containers/food/snacks/rogue/sweetdough= 1, -// /obj/item/reagent_containers/food/snacks/rogue/berryjam= 1) -// result = list( /obj/item/reagent_containers/food/snacks/rogue/uncookedberrytart = 1, -// /obj/item/reagent_containers/glass/beaker/jar = 1) -// craftdiff = 2 -// subtype_reqs = FALSE - -// /obj/item/reagent_containers/food/snacks/rogue/uncookedberrytart -// name = "uncooked berry tart" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "uncookedberrytart" -// list_reagents = list(/datum/reagent/consumable/nutriment = 10) -// cooked_type = /obj/item/reagent_containers/food/snacks/rogue/berrytart -// w_class = WEIGHT_CLASS_BULKY -// tastes = list("crispy sweetened dough with a sugar glaze and hints of rosewater" = 1) -// foodtype = SUGAR -// eat_effect = /datum/status_effect/debuff/uncookedfood -// bitesize = 6 -// rotprocess = 30 MINUTES -// dropshrink = 0.80 - -// /obj/item/reagent_containers/food/snacks/rogue/berrytart -// name = "berry tart" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "berrytart" -// slices_num = 6 -// slice_path = /obj/item/reagent_containers/food/snacks/rogue/berrytartslice -// list_reagents = list(/datum/reagent/consumable/nutriment = 48) -// w_class = WEIGHT_CLASS_BULKY -// tastes = list("A crispy dough with sweet berry filling" = 1) -// foodtype = SUGAR -// eat_effect = /datum/status_effect/buff/foodbuff -// bitesize = 6 -// dropshrink = 0.80 - -// /obj/item/reagent_containers/food/snacks/rogue/berrytartslice -// name = "berry tart slice" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "berrytartslice" -// list_reagents = list(/datum/reagent/consumable/nutriment = 8) -// w_class = WEIGHT_CLASS_NORMAL -// tastes = list("Soft, sweet filling, with a flaky dough" = 1) -// foodtype = SUGAR -// eat_effect = /datum/status_effect/buff/foodbuff -// bitesize = 3 -// rotprocess = null -// dropshrink = 0.60 - -// /datum/crafting_recipe/roguetown/cooking/berrytoast -// name = "berry toast" -// reqs = list( -// /obj/item/reagent_containers/food/snacks/rogue/berryjam = 1, -// /obj/item/reagent_containers/food/snacks/rogue/breadslice/toast = 6) -// result = list( /obj/item/reagent_containers/food/snacks/rogue/berrytoast, -// /obj/item/reagent_containers/food/snacks/rogue/berrytoast, -// /obj/item/reagent_containers/food/snacks/rogue/berrytoast, -// /obj/item/reagent_containers/food/snacks/rogue/berrytoast, -// /obj/item/reagent_containers/food/snacks/rogue/berrytoast, -// /obj/item/reagent_containers/food/snacks/rogue/berrytoast, -// /obj/item/reagent_containers/glass/beaker/jar) -// craftdiff = 2 -// subtype_reqs = FALSE - -// /obj/item/reagent_containers/food/snacks/rogue/berrytoast -// name = "berry toast" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "berrytoast" -// list_reagents = list(/datum/reagent/consumable/nutriment = 10) -// w_class = WEIGHT_CLASS_NORMAL -// tastes = list("crispy toast with a sweet berry topping" = 1) -// foodtype = SUGAR -// eat_effect = /datum/status_effect/buff/foodbuff -// bitesize = 3 -// rotprocess = null - -// /datum/crafting_recipe/roguetown/cooking/pumpkindough -// name = "pumpkin dough" -// reqs = list( -// /obj/item/reagent_containers/food/snacks/rogue/sweetdough= 1, -// /obj/item/reagent_containers/food/snacks/rogue/pumpkinspice= 1) -// result = list( /obj/item/reagent_containers/food/snacks/rogue/pumpkindough = 1) -// craftdiff = 1 -// subtype_reqs = FALSE - -// /obj/item/reagent_containers/food/snacks/rogue/pumpkindough -// name = "pumpkin dough" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "pumpkindough" -// cooked_type = /obj/item/reagent_containers/food/snacks/rogue/pumpkinbread -// list_reagents = list(/datum/reagent/consumable/nutriment = 1) -// w_class = WEIGHT_CLASS_NORMAL -// tastes = list("gummy, sweet, herbed dough" = 1) -// foodtype = SUGAR -// eat_effect = /datum/status_effect/debuff/uncookedfood -// rotprocess = 30 MINUTES - -// /obj/item/reagent_containers/food/snacks/rogue/pumpkinbread -// name = "pumpkin bread" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "pumpkinbread" -// list_reagents = list(/datum/reagent/consumable/nutriment = 48) -// slices_num = 6 -// slice_path = /obj/item/reagent_containers/food/snacks/rogue/pumpkinbreadslice -// dropshrink = 0.80 -// w_class = WEIGHT_CLASS_NORMAL -// tastes = list("sweet, spiced bread" = 1) -// foodtype = SUGAR -// bitesize = 3 -// rotprocess = null - -// /obj/item/reagent_containers/food/snacks/rogue/pumpkinbreadslice -// name = "pumpkin bread slice" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "pumpkinbreadslice" -// list_reagents = list(/datum/reagent/consumable/nutriment = 8) -// w_class = WEIGHT_CLASS_NORMAL -// tastes = list("sweet, spiced bread" = 1) -// foodtype = SUGAR -// bitesize = 3 -// rotprocess = null -// dropshrink = 0.60 - -// /datum/crafting_recipe/roguetown/cooking/rawpumpkinpie -// name = "raw pumpkin pie" -// reqs = list( -// /obj/item/reagent_containers/food/snacks/rogue/sweetdough= 1, -// /obj/item/reagent_containers/food/snacks/grown/pumpkin = 1, -// /obj/item/reagent_containers/food/snacks/rogue/pumpkinspice= 1) -// result = list( /obj/item/reagent_containers/food/snacks/rogue/rawpumpkinpie = 1) -// craftdiff = 1 -// subtype_reqs = FALSE - -// /obj/item/reagent_containers/food/snacks/rogue/rawpumpkinpie -// name = "raw pumpkin pie" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "rawpumpkinpie" -// list_reagents = list(/datum/reagent/consumable/nutriment = 10) -// cooked_type = /obj/item/reagent_containers/food/snacks/rogue/pumpkinpie -// w_class = WEIGHT_CLASS_NORMAL -// tastes = list("sweet, spiced pumpkin filling in a doughy crust" = 1) -// foodtype = SUGAR -// eat_effect = /datum/status_effect/debuff/uncookedfood -// rotprocess = 30 MINUTES - -// /obj/item/reagent_containers/food/snacks/rogue/pumpkinpie -// name = "pumpkin pie" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "pumpkinpie" -// list_reagents = list(/datum/reagent/consumable/nutriment = 48) -// slices_num = 6 -// slice_path = /obj/item/reagent_containers/food/snacks/rogue/pumpkinpieslice -// dropshrink = 0.80 -// w_class = WEIGHT_CLASS_NORMAL -// tastes = list("sweet, spiced pumpkin filling in a flaky crust" = 1) -// foodtype = SUGAR -// bitesize = 3 -// rotprocess = null - -// /obj/item/reagent_containers/food/snacks/rogue/pumpkinpieslice -// name = "pumpkin pie slice" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "pumpkinpieslice" -// list_reagents = list(/datum/reagent/consumable/nutriment = 8) -// w_class = WEIGHT_CLASS_NORMAL -// tastes = list("sweet, spiced pumpkin filling in a flaky crust" = 1) -// foodtype = SUGAR -// bitesize = 3 -// rotprocess = null -// dropshrink = 0.60 - -// /datum/crafting_recipe/roguetown/cooking/candybase -// name = "candy base" -// reqs = list( -// /datum/reagent/water = 10, -// /obj/item/reagent_containers/powder/sugar = 1) -// result = /obj/item/reagent_containers/food/snacks/rogue/candybase -// craftdiff = 1 -// subtype_reqs = FALSE -// tools = list(/obj/item/reagent_containers/glass/bucket/pot) - -// /obj/item/reagent_containers/food/snacks/rogue/candybase -// name = "candy base" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "candybase" -// list_reagents = list(/datum/reagent/consumable/nutriment = 1) -// w_class = WEIGHT_CLASS_NORMAL -// tastes = list("sweet, sticky, and malleable" = 1) -// foodtype = SUGAR -// eat_effect = /datum/status_effect/debuff/uncookedfood - -// /datum/crafting_recipe/roguetown/cooking/pumpkincandy -// name = "pumpkin candy" -// reqs = list( -// /obj/item/reagent_containers/food/snacks/rogue/candybase = 1, -// /obj/item/reagent_containers/food/snacks/rogue/pumpkinspice = 1) -// result = /obj/item/reagent_containers/food/snacks/rogue/pumpkincandy -// craftdiff = 1 -// subtype_reqs = FALSE -// tools = list(/obj/item/reagent_containers/glass/bucket/pot) - -// /obj/item/reagent_containers/food/snacks/rogue/pumpkincandy -// name = "pumpkin candy" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "pumpkincandy6" -// list_reagents = list(/datum/reagent/consumable/nutriment = 12) -// w_class = WEIGHT_CLASS_NORMAL -// tastes = list("sweet, spiced pumpkin candy" = 1) -// foodtype = SUGAR -// bitesize = 6 -// rotprocess = null - -// /obj/item/reagent_containers/food/snacks/rogue/pumpkincandy/On_Consume(mob/living/eater) -// ..() -// if(bitecount == 1) -// icon_state = "pumpkincandy5" -// if(bitecount == 2) -// icon_state = "pumpkincandy4" -// if(bitecount == 3) -// icon_state = "pumpkincandy3" -// if(bitecount == 4) -// icon_state = "pumpkincandy2" -// if(bitecount == 5) -// icon_state = "pumpkincandy1" - -// /datum/crafting_recipe/roguetown/cooking/applecandy -// name = "apple candy" -// reqs = list( -// /obj/item/reagent_containers/food/snacks/rogue/candybase = 1, -// /obj/item/reagent_containers/food/snacks/grown/apple = 1) -// result = /obj/item/reagent_containers/food/snacks/rogue/applecandy -// craftdiff = 1 -// subtype_reqs = FALSE -// tools = list(/obj/item/reagent_containers/glass/bucket/pot) - -// /obj/item/reagent_containers/food/snacks/rogue/applecandy -// name = "apple candy" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "applecandy6" -// list_reagents = list(/datum/reagent/consumable/nutriment = 12) -// w_class = WEIGHT_CLASS_NORMAL -// tastes = list("sweet, tart apple candy" = 1) -// foodtype = SUGAR -// bitesize = 6 -// rotprocess = null - -// /obj/item/reagent_containers/food/snacks/rogue/applecandy/On_Consume(mob/living/eater) -// ..() -// if(bitecount == 1) -// icon_state = "applecandy5" -// if(bitecount == 2) -// icon_state = "applecandy4" -// if(bitecount == 3) -// icon_state = "applecandy3" -// if(bitecount == 4) -// icon_state = "applecandy2" -// if(bitecount == 5) -// icon_state = "applecandy1" - -// /datum/crafting_recipe/roguetown/cooking/berrycandy -// name = "berry candy" -// reqs = list( -// /obj/item/reagent_containers/food/snacks/rogue/candybase = 1, -// /obj/item/reagent_containers/food/snacks/grown/berries/rogue = 1) -// result = /obj/item/reagent_containers/food/snacks/rogue/berrycandy -// craftdiff = 1 -// subtype_reqs = FALSE -// tools = list(/obj/item/reagent_containers/glass/bucket/pot) - -// /obj/item/reagent_containers/food/snacks/rogue/berrycandy -// name = "berry candy" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "berrycandy6" -// list_reagents = list(/datum/reagent/consumable/nutriment = 12) -// w_class = WEIGHT_CLASS_NORMAL -// tastes = list("sweet, tart berry candy" = 1) -// foodtype = SUGAR -// bitesize = 6 -// rotprocess = null - -// /obj/item/reagent_containers/food/snacks/rogue/berrycandy/On_Consume(mob/living/eater) -// ..() -// if(bitecount == 1) -// icon_state = "berrycandy5" -// if(bitecount == 2) -// icon_state = "berrycandy4" -// if(bitecount == 3) -// icon_state = "berrycandy3" -// if(bitecount == 4) -// icon_state = "berrycandy2" -// if(bitecount == 5) -// icon_state = "berrycandy1" - -// /datum/crafting_recipe/roguetown/cooking/rawcarrotcake -// name = "raw carrot cake" -// reqs = list( -// /obj/item/reagent_containers/food/snacks/rogue/sweetdough= 1, -// /obj/item/reagent_containers/food/snacks/grown/carrot = 3) -// result = list( /obj/item/reagent_containers/food/snacks/rogue/rawcarrotcake = 1) -// craftdiff = 1 -// subtype_reqs = FALSE - -// /obj/item/reagent_containers/food/snacks/rogue/rawcarrotcake -// name = "raw carrot cake" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "rawcarrotcake" -// list_reagents = list(/datum/reagent/consumable/nutriment = 10) -// cooked_type = /obj/item/reagent_containers/food/snacks/rogue/carrotcake -// w_class = WEIGHT_CLASS_NORMAL -// tastes = list("sweet, spiced carrot cake" = 1) -// foodtype = SUGAR -// eat_effect = /datum/status_effect/debuff/uncookedfood -// rotprocess = 30 MINUTES - -// /obj/item/reagent_containers/food/snacks/rogue/carrotcake -// name = "carrot cake" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "carrotcake" -// list_reagents = list(/datum/reagent/consumable/nutriment = 48) -// slices_num = 6 -// slice_path = /obj/item/reagent_containers/food/snacks/rogue/carrotcakeslice -// dropshrink = 0.80 -// w_class = WEIGHT_CLASS_NORMAL -// tastes = list("sweet, spiced carrot cake" = 1) -// foodtype = SUGAR -// bitesize = 3 -// rotprocess = null - -// /obj/item/reagent_containers/food/snacks/rogue/carrotcakeslice -// name = "carrot cake slice" -// desc = "" -// icon = 'icons/roguetown/items/food.dmi' -// icon_state = "carrotcakeslice" -// list_reagents = list(/datum/reagent/consumable/nutriment = 8) -// w_class = WEIGHT_CLASS_NORMAL -// tastes = list("sweet, spiced carrot cake" = 1) -// foodtype = SUGAR -// bitesize = 3 -// rotprocess = null -// dropshrink = 0.60 diff --git a/code/modules/roguetown/roguejobs/cook/recipes/pies.dm b/code/modules/roguetown/roguejobs/cook/recipes/pies.dm deleted file mode 100644 index d220e63ec55..00000000000 --- a/code/modules/roguetown/roguejobs/cook/recipes/pies.dm +++ /dev/null @@ -1,193 +0,0 @@ -/obj/item/reagent_containers/food/snacks/rogue/pie/cooked/meat/poultry - name = "pot pie" - tastes = list("chicken" = 1) - -/datum/crafting_recipe/roguetown/cooking/eggpie - name = "egg pie" - reqs = list( - /obj/item/reagent_containers/food/snacks/egg = 3, - /obj/item/reagent_containers/food/snacks/rogue/piedough = 1) - parts = list( - /obj/item/reagent_containers/food/snacks/egg = 3) - result = /obj/item/reagent_containers/food/snacks/rogue/pie/egg - - -/obj/item/reagent_containers/food/snacks/rogue/pie/egg - name = "egg pie" - cooked_type = /obj/item/reagent_containers/food/snacks/rogue/pie/cooked/egg - eat_effect = /datum/status_effect/debuff/uncookedfood - -/obj/item/reagent_containers/food/snacks/rogue/pie/cooked/egg - name = "egg pie" - desc = "" - list_reagents = list(/datum/reagent/consumable/nutriment = 30) - eat_effect = /datum/status_effect/buff/foodbuff - tastes = list("eggs" = 1) - -/datum/crafting_recipe/roguetown/cooking/pearpie - name = "pear pie" - reqs = list( - /obj/item/reagent_containers/food/snacks/grown/pear = 3, - /obj/item/reagent_containers/food/snacks/rogue/piedough = 1) - parts = list( - /obj/item/reagent_containers/food/snacks/grown/pear = 3) - result = /obj/item/reagent_containers/food/snacks/rogue/pie/pear - -/obj/item/reagent_containers/food/snacks/rogue/pie/cooked/pear - name = "pear pie" - desc = "" - list_reagents = list(/datum/reagent/consumable/nutriment = 30) - eat_effect = /datum/status_effect/buff/foodbuff - tastes = list("pears" = 1) - -/obj/item/reagent_containers/food/snacks/rogue/pie/pear - name = "pear pie" - cooked_type = /obj/item/reagent_containers/food/snacks/rogue/pie/cooked/pear - eat_effect = /datum/status_effect/debuff/uncookedfood - -/datum/crafting_recipe/roguetown/cooking/cherrypie - name = "cherry pie" - reqs = list( - /obj/item/reagent_containers/food/snacks/grown/cherry = 3, - /obj/item/reagent_containers/food/snacks/rogue/piedough = 1) - parts = list( - /obj/item/reagent_containers/food/snacks/grown/cherry = 3) - result = /obj/item/reagent_containers/food/snacks/rogue/pie/cherry - -/obj/item/reagent_containers/food/snacks/rogue/pie/cooked/cherry - name = "cherry pie" - desc = "" - list_reagents = list(/datum/reagent/consumable/nutriment = 30) - eat_effect = /datum/status_effect/buff/foodbuff - tastes = list("cherries" = 1) - -/obj/item/reagent_containers/food/snacks/rogue/pie/cherry - name = "cherry pie" - cooked_type = /obj/item/reagent_containers/food/snacks/rogue/pie/cooked/cherry - eat_effect = /datum/status_effect/debuff/uncookedfood - -/datum/crafting_recipe/roguetown/cooking/cabbagepie - name = "cabbage pie" - reqs = list( - /obj/item/reagent_containers/food/snacks/grown/cabbage = 3, - /obj/item/reagent_containers/food/snacks/rogue/piedough = 1) - parts = list( - /obj/item/reagent_containers/food/snacks/grown/cabbage = 3) - result = /obj/item/reagent_containers/food/snacks/rogue/pie/cabbage - -/obj/item/reagent_containers/food/snacks/rogue/pie/cooked/cabbage - name = "cabbage pie" - desc = "" - list_reagents = list(/datum/reagent/consumable/nutriment = 30) - eat_effect = /datum/status_effect/buff/foodbuff - tastes = list("cabbages" = 1) - -/obj/item/reagent_containers/food/snacks/rogue/pie/cabbage - name = "cabbage pie" - cooked_type = /obj/item/reagent_containers/food/snacks/rogue/pie/cooked/cabbage - eat_effect = /datum/status_effect/debuff/uncookedfood - -/datum/crafting_recipe/roguetown/cooking/onionpie - name = "onion pie" - reqs = list( - /obj/item/reagent_containers/food/snacks/grown/onion = 3, - /obj/item/reagent_containers/food/snacks/rogue/piedough = 1) - parts = list( - /obj/item/reagent_containers/food/snacks/grown/onion = 3) - result = /obj/item/reagent_containers/food/snacks/rogue/pie/onion - -/obj/item/reagent_containers/food/snacks/rogue/pie/cooked/onion - name = "onion pie" - desc = "" - list_reagents = list(/datum/reagent/consumable/nutriment = 30) - eat_effect = /datum/status_effect/buff/foodbuff - tastes = list("onions" = 1) - -/obj/item/reagent_containers/food/snacks/rogue/pie/onion - name = "onion pie" - cooked_type = /obj/item/reagent_containers/food/snacks/rogue/pie/cooked/onion - eat_effect = /datum/status_effect/debuff/uncookedfood - -/datum/crafting_recipe/roguetown/cooking/carrotpie - name = "carrot pie" - reqs = list( - /obj/item/reagent_containers/food/snacks/grown/carrot = 3, - /obj/item/reagent_containers/food/snacks/rogue/piedough = 1) - parts = list( - /obj/item/reagent_containers/food/snacks/grown/carrot = 3) - result = /obj/item/reagent_containers/food/snacks/rogue/pie/carrot - -/obj/item/reagent_containers/food/snacks/rogue/pie/cooked/carrot - name = "carrot pie" - desc = "" - list_reagents = list(/datum/reagent/consumable/nutriment = 30) - eat_effect = /datum/status_effect/buff/foodbuff - tastes = list("carrots" = 1) - -/obj/item/reagent_containers/food/snacks/rogue/pie/carrot - name = "carrot pie" - cooked_type = /obj/item/reagent_containers/food/snacks/rogue/pie/cooked/carrot - eat_effect = /datum/status_effect/debuff/uncookedfood - -/datum/crafting_recipe/roguetown/cooking/radishpie - name = "radish pie" - reqs = list( - /obj/item/reagent_containers/food/snacks/grown/radish = 3, - /obj/item/reagent_containers/food/snacks/rogue/piedough = 1) - parts = list( - /obj/item/reagent_containers/food/snacks/grown/radish = 3) - result = /obj/item/reagent_containers/food/snacks/rogue/pie/radish - -/obj/item/reagent_containers/food/snacks/rogue/pie/cooked/radish - name = "radish pie" - desc = "" - list_reagents = list(/datum/reagent/consumable/nutriment = 30) - eat_effect = /datum/status_effect/buff/foodbuff - tastes = list("radishes" = 1) - -/obj/item/reagent_containers/food/snacks/rogue/pie/radish - name = "radish pie" - cooked_type = /obj/item/reagent_containers/food/snacks/rogue/pie/cooked/radish - eat_effect = /datum/status_effect/debuff/uncookedfood - -/datum/crafting_recipe/roguetown/cooking/rocknutpie - name = "rocknut pie" - reqs = list( - /obj/item/reagent_containers/food/snacks/grown/nut = 3, - /obj/item/reagent_containers/food/snacks/rogue/piedough = 1) - parts = list( - /obj/item/reagent_containers/food/snacks/grown/nut = 3) - result = /obj/item/reagent_containers/food/snacks/rogue/pie/rocknut - -/obj/item/reagent_containers/food/snacks/rogue/pie/cooked/rocknut - name = "rocknut pie" - desc = "" - list_reagents = list(/datum/reagent/consumable/nutriment = 30) - eat_effect = /datum/status_effect/buff/foodbuff - tastes = list("nutty" = 1) - -/obj/item/reagent_containers/food/snacks/rogue/pie/rocknut - name = "rocknut pie" - cooked_type = /obj/item/reagent_containers/food/snacks/rogue/pie/cooked/rocknut - eat_effect = /datum/status_effect/debuff/uncookedfood - -/datum/crafting_recipe/roguetown/cooking/plumphelmetpie - name = "plump helmet pie" - reqs = list( - /obj/item/reagent_containers/food/snacks/grown/plumphelmet = 3, - /obj/item/reagent_containers/food/snacks/rogue/piedough = 1) - parts = list( - /obj/item/reagent_containers/food/snacks/grown/plumphelmet = 3) - result = /obj/item/reagent_containers/food/snacks/rogue/pie/plumphelmet - -/obj/item/reagent_containers/food/snacks/rogue/pie/cooked/plumphelmet - name = "plump helmet pie" - desc = "" - list_reagents = list(/datum/reagent/consumable/nutriment = 30) - eat_effect = /datum/status_effect/buff/foodbuff - tastes = list("the mountainhome" = 1) - -/obj/item/reagent_containers/food/snacks/rogue/pie/plumphelmet - name = "plump helmet pie" - cooked_type = /obj/item/reagent_containers/food/snacks/rogue/pie/cooked/plumphelmet - eat_effect = /datum/status_effect/debuff/uncookedfood diff --git a/code/modules/roguetown/roguejobs/cook/recipes/plates.dm b/code/modules/roguetown/roguejobs/cook/recipes/plates.dm deleted file mode 100644 index 4ba355eab39..00000000000 --- a/code/modules/roguetown/roguejobs/cook/recipes/plates.dm +++ /dev/null @@ -1,278 +0,0 @@ - -/obj/item/reagent_containers/food/snacks/rogue/grenzeldog - icon = 'icons/roguetown/items/food.dmi' - list_reagents = list(/datum/reagent/consumable/nutriment = 20) - tastes = list("sausage" = 1, "bun" = 1, "sauerkraut" = 1) - name = "grenzel dogroll" - desc = "" - icon_state = "kraut_dog" - foodtype = MEAT - warming = 5 MINUTES - rotprocess = 30 MINUTES - eat_effect = /datum/status_effect/buff/foodbuff - -/datum/crafting_recipe/roguetown/cooking/grenzeldog - name = "grenzeldog" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/dogroll = 1, - /obj/item/reagent_containers/food/snacks/grown/sauerkraut = 1 - ) - result = /obj/item/reagent_containers/food/snacks/rogue/grenzeldog - skillcraft = null - subtype_reqs = FALSE - -/obj/item/reagent_containers/food/snacks/rogue/sandwich - icon = 'icons/roguetown/items/food.dmi' - list_reagents = list(/datum/reagent/consumable/nutriment = 15) - tastes = list("salami" = 1,"cheese" = 1, "bread" = 1) - name = "sandwich" - desc = "" - icon_state = "sandwich" - foodtype = MEAT - warming = 5 MINUTES - rotprocess = 30 MINUTES - eat_effect = /datum/status_effect/buff/foodbuff - -/datum/crafting_recipe/roguetown/cooking/sandwich - name = "sandwich" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/breadslice = 2, - /obj/item/reagent_containers/food/snacks/rogue/cheddarslice = 1, - /obj/item/reagent_containers/food/snacks/rogue/meat/salami/slice = 2 - ) - result = /obj/item/reagent_containers/food/snacks/rogue/sandwich - craftdiff = 0 - subtype_reqs = TRUE - -/obj/item/reagent_containers/food/snacks/rogue/fullroast - name = "full roast" - desc = "A whole roasted chicken accompanied by flavorfully seasoned mashed potatoes, mushy peas, cabbage, and radishes." - icon = 'icons/roguetown/items/food.dmi' - icon_state = "fullroast" - bitesize = 6 - list_reagents = list(/datum/reagent/consumable/nutriment = 120) - w_class = WEIGHT_CLASS_GIGANTIC - tastes = list("chicken" = 1, "potatoes" = 1, "peas" = 1, "cabbage" = 1, "pepper" = 1, "radish" = 1, "oregano" = 1) - warming = 5 MINUTES - rotprocess = 25 MINUTES - slices_num = 6 - slice_batch = TRUE - slice_path = /obj/item/reagent_containers/food/snacks/rogue/roastportion - eat_effect = /datum/status_effect/buff/foodbuff - -/obj/item/reagent_containers/food/snacks/rogue/roastportion - name = "portion of roast dinner" - desc = "A portion of roasted chicken accompanied by flavorfully seasoned mashed potatoes, mushy peas, cabbage, and radishes." - icon = 'icons/roguetown/items/food.dmi' - icon_state = "roast_slice" - tastes = list("chicken" = 1, "potatoes" = 1, "peas" = 1, "cabbage" = 1, "pepper" = 1, "radish" = 1, "oregano" = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 20) - warming = 5 MINUTES - rotprocess = 25 MINUTES - w_class = WEIGHT_CLASS_NORMAL - eat_effect = /datum/status_effect/buff/foodbuff - -/datum/crafting_recipe/roguetown/cooking/roastdinner - name = "full roast chicken dinner" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/meat/poultry = 1, - /obj/item/reagent_containers/food/snacks/grown/radish = 2, - /obj/item/reagent_containers/food/snacks/grown/peas = 2, - /obj/item/reagent_containers/food/snacks/grown/potato = 2, - /obj/item/reagent_containers/food/snacks/grown/cabbage = 1, - /obj/item/reagent_containers/food/snacks/grown/westspice = 1, - /datum/reagent/consumable/blackpepper = 5, - /obj/item/reagent_containers/powder/salt = 1 - ) - result = /obj/item/reagent_containers/food/snacks/rogue/fullroast - craftdiff = 4 - subtype_reqs = TRUE - -/obj/item/reagent_containers/food/snacks/rogue/eggplantparm - name = "eggplant parmigiana" - desc = "Breaded eggplant smothered in aged cheese." - icon = 'icons/roguetown/items/food.dmi' - icon_state = "eggplantparm" - tastes = list("eggplant" = 1, "cheese" = 1, "breadcrumbs" = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 15) - warming = 5 MINUTES - rotprocess = 15 MINUTES - w_class = WEIGHT_CLASS_NORMAL - eat_effect = /datum/status_effect/buff/foodbuff - -/datum/crafting_recipe/roguetown/cooking/eggplantparm - name = "eggplant parmigiana" - reqs = list( - /obj/item/reagent_containers/food/snacks/grown/eggplant = 1, - /obj/item/reagent_containers/food/snacks/rogue/cheddarwedge/aged = 1, - /obj/item/reagent_containers/powder/flour = 1 - ) - result = /obj/item/reagent_containers/food/snacks/rogue/eggplantparm - craftdiff = 3 - subtype_reqs = TRUE - -/obj/item/reagent_containers/food/snacks/rogue/sauteedeggplant - name = "sauteed eggplant" - desc = "Eggplant sauteed with garlic and oil." - icon = 'icons/roguetown/items/food.dmi' - icon_state = "sauteedeggplant" - tastes = list("eggplant" = 1, "garlic" = 1, "oil" = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/garlic = 3) - warming = 5 MINUTES - rotprocess = 15 MINUTES - w_class = WEIGHT_CLASS_NORMAL - eat_effect = /datum/status_effect/buff/foodbuff - -/datum/crafting_recipe/roguetown/cooking/sauteedeggplant - name = "sauteed eggplant" - reqs = list( - /obj/item/reagent_containers/food/snacks/grown/eggplant = 1, - /obj/item/reagent_containers/food/snacks/grown/garlic = 1, - /datum/reagent/consumable/cooking_oil = 3 - ) - result = /obj/item/reagent_containers/food/snacks/rogue/sauteedeggplant - craftdiff = 2 - subtype_reqs = TRUE - -/obj/item/reagent_containers/food/snacks/rogue/etruscansalad - name = "etruscan salad" - desc = "Fine tomatos and fresh cheese, layered with oil and herbs." - icon = 'icons/roguetown/items/food.dmi' - icon_state = "etruscan_salad" - tastes = list("cheese" = 1, "tomato" = 1, "olive oil" = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 10) - rotprocess = 15 MINUTES - w_class = WEIGHT_CLASS_NORMAL - eat_effect = /datum/status_effect/buff/foodbuff - -/datum/crafting_recipe/roguetown/cooking/etruscansalad - name = "etruscan salad" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/tomatoslice = 3, - /obj/item/reagent_containers/food/snacks/rogue/cheese = 1, - /obj/item/reagent_containers/food/snacks/grown/westspice = 1, - /datum/reagent/consumable/cooking_oil = 3 - ) - result = /obj/item/reagent_containers/food/snacks/rogue/etruscansalad - craftdiff = 3 - subtype_reqs = TRUE - -/obj/item/reagent_containers/food/snacks/rogue/moussaka - name = "moussaka" - desc = "A layered casserole made of eggplants, veggies, and meat. Native to Shalvestine." - icon = 'icons/roguetown/items/food.dmi' - icon_state = "moussaka" - tastes = list("eggplant" = 1, "onion" = 1, "garlic" = 1, "meat" = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 40, /datum/reagent/consumable/garlic = 8) - warming = 5 MINUTES - rotprocess = 25 MINUTES - w_class = WEIGHT_CLASS_BULKY - slices_num = 4 - slice_batch = TRUE - slice_path = /obj/item/reagent_containers/food/snacks/rogue/moussakaportion - eat_effect = /datum/status_effect/buff/foodbuff - -/obj/item/reagent_containers/food/snacks/rogue/moussakaportion - name = "portion of moussaka" - desc = "A slice of layered casserole made of eggplants, veggies, and meat. Native to Shalvestine." - icon = 'icons/roguetown/items/food.dmi' - icon_state = "moussaka_slice" - tastes = list("eggplant" = 1, "onion" = 1, "garlic" = 1, "meat" = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/garlic = 2) - warming = 5 MINUTES - rotprocess = 25 MINUTES - w_class = WEIGHT_CLASS_SMALL - eat_effect = /datum/status_effect/buff/foodbuff - -/datum/crafting_recipe/roguetown/cooking/moussaka - name = "moussaka" - reqs = list( - /obj/item/reagent_containers/food/snacks/grown/eggplant = 2, - /obj/item/reagent_containers/food/snacks/rogue/onionslice = 5, - /obj/item/reagent_containers/food/snacks/grown/garlic = 1, - /obj/item/reagent_containers/food/snacks/butterslice = 3 - ) - result = /obj/item/reagent_containers/food/snacks/rogue/moussaka - craftdiff = 3 - subtype_reqs = TRUE - -/obj/item/reagent_containers/food/snacks/rogue/stuffedtiefling - eat_effect = /datum/status_effect/debuff/uncookedfood - name = "hatched tiefling egg" - desc = "A tiefling egg fruit with the top cut off and stuffing sticking out! It's raw." - icon_state = "rawstuffedpepper" - fried_type = null - cooked_type = /obj/item/reagent_containers/food/snacks/rogue/stuffedtiefling/cooked - list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/capsaicin = 10) - -/obj/item/reagent_containers/food/snacks/rogue/stuffedtiefling/cooked - eat_effect = /datum/status_effect/buff/foodbuff - slices_num = 0 - name = "hatched tiefling egg" - desc = "A tiefling egg fruit with the top cut off and stuffing sticking out! It burns your nostrils." - icon_state = "stuffedpepper" - warming = 10 MINUTES - rotprocess = 25 MINUTES - w_class = WEIGHT_CLASS_SMALL - list_reagents = list(/datum/reagent/consumable/nutriment = 15, /datum/reagent/consumable/capsaicin = 10) - -/datum/crafting_recipe/roguetown/cooking/stuffedtiefling - name = "hatched tiefling egg" - reqs = list( - /obj/item/reagent_containers/food/snacks/grown/bellpepper = 1, - /obj/item/reagent_containers/food/snacks/rogue/cheese = 1, - /obj/item/reagent_containers/food/snacks/grown/westspice = 1, - /obj/item/reagent_containers/food/snacks/rogue/onionslice = 1, - /datum/reagent/consumable/blackpepper = 3 - ) - result = /obj/item/reagent_containers/food/snacks/rogue/stuffedtiefling - craftdiff = 4 - subtype_reqs = TRUE - -/obj/item/reagent_containers/food/snacks/rogue/jadepheasant - eat_effect = /datum/status_effect/buff/foodbuff - slices_num = 0 - name = "Glorious Jade Emperor's Golden Heaven Pheasant" - desc = "A truly exotic and wondrous dish consisting of whole-roasted bird, pancakes from the mother country and a golden spiced sauce." - icon_state = "ducknpancakes" - bitesize = 5 - warming = 10 MINUTES - rotprocess = 25 MINUTES - w_class = WEIGHT_CLASS_BULKY - list_reagents = list(/datum/reagent/consumable/nutriment = 40, /datum/reagent/drug/happiness = 3) - -/datum/crafting_recipe/roguetown/cooking/jadeduck - name = "golden pheasant" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/friedcrow = 1, - /obj/item/reagent_containers/food/snacks/grown/eastspice = 1, - /obj/item/reagent_containers/food/snacks/rogue/piedough = 1, - /obj/item/reagent_containers/food/snacks/grown/cucumber = 1, - /obj/item/reagent_containers/food/snacks/grown/onion = 1 - ) - result = /obj/item/reagent_containers/food/snacks/rogue/jadepheasant - craftdiff = 5 - subtype_reqs = TRUE - -/obj/item/reagent_containers/food/snacks/rogue/cornedbeef - eat_effect = /datum/status_effect/buff/foodbuff - slices_num = 0 - name = "corned beef and grenzelkraut" - desc = "A slice of salt-cured brisket served with grenzelkraut." - icon_state = "cornedbeef" - bitesize = 3 - warming = 5 MINUTES - rotprocess = 20 MINUTES - w_class = WEIGHT_CLASS_SMALL - list_reagents = list(/datum/reagent/consumable/nutriment = 18) - -/datum/crafting_recipe/roguetown/cooking/cornedbeef - name = "corned beef and grenzelkraut" - reqs = list( - /obj/item/reagent_containers/food/snacks/rogue/meat/steak/fried = 1, - /obj/item/reagent_containers/powder/salt = 1, - /obj/item/reagent_containers/food/snacks/grown/sauerkraut = 1 - ) - result = /obj/item/reagent_containers/food/snacks/rogue/cornedbeef - craftdiff = 2 - subtype_reqs = TRUE diff --git a/code/modules/roguetown/roguejobs/cook/recipes/soups.dm b/code/modules/roguetown/roguejobs/cook/recipes/soups.dm deleted file mode 100644 index a6a4c3492fe..00000000000 --- a/code/modules/roguetown/roguejobs/cook/recipes/soups.dm +++ /dev/null @@ -1,131 +0,0 @@ -/obj/item/reagent_containers/food/snacks/rogue/beanstew - name = "bean stew" - desc = "A hearty stew, with beans at the forefront." - icon = 'icons/roguetown/items/food.dmi' - icon_state = "bean_stew" - tastes = list("bean" = 1, "carrot" = 1, "potato" = 1, "radish" = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 15) - eat_effect = null - warming = 5 MINUTES - rotprocess = 15 MINUTES - w_class = WEIGHT_CLASS_SMALL - trash = /obj/item/reagent_containers/glass/bowl - -/datum/crafting_recipe/roguetown/cooking/beanstew - name = "bean stew" - reqs = list( - /obj/item/reagent_containers/food/snacks/grown/bean = 1, - /obj/item/reagent_containers/food/snacks/grown/radish = 1, - /obj/item/reagent_containers/food/snacks/grown/carrot = 1, - /obj/item/reagent_containers/food/snacks/grown/potato = 1, - /obj/item/reagent_containers/glass/bowl = 1, - /datum/reagent/water = 15 - ) - result = /obj/item/reagent_containers/food/snacks/rogue/beanstew - craftdiff = 1 - subtype_reqs = TRUE - -/obj/item/reagent_containers/food/snacks/rogue/oatstew - name = "oat stew" - desc = "A hearty stew, with oats at the forefront." - icon = 'icons/roguetown/items/food.dmi' - icon_state = "oat_stew" - tastes = list("oat" = 1, "carrot" = 1, "potato" = 1, "radish" = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 15) - eat_effect = null - warming = 5 MINUTES - rotprocess = 15 MINUTES - w_class = WEIGHT_CLASS_SMALL - trash = /obj/item/reagent_containers/glass/bowl - -/datum/crafting_recipe/roguetown/cooking/oatstew - name = "oat stew" - reqs = list( - /obj/item/reagent_containers/food/snacks/grown/oat = 1, - /obj/item/reagent_containers/food/snacks/grown/radish = 1, - /obj/item/reagent_containers/food/snacks/grown/carrot = 1, - /obj/item/reagent_containers/food/snacks/grown/potato = 1, - /obj/item/reagent_containers/glass/bowl = 1, - /datum/reagent/water = 15 - ) - result = /obj/item/reagent_containers/food/snacks/rogue/oatstew - craftdiff = 1 - subtype_reqs = TRUE - -/obj/item/reagent_containers/food/snacks/rogue/riceporridge - name = "rice porridge" - desc = "A bland white mush." - icon = 'icons/roguetown/items/food.dmi' - icon_state = "rice_porridge" - tastes = list("mush" = 1, "bland" = 1, "rice" = 1, "salt" = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 10) - eat_effect = null - warming = 5 MINUTES - rotprocess = 15 MINUTES - w_class = WEIGHT_CLASS_SMALL - trash = /obj/item/reagent_containers/glass/bowl - -/datum/crafting_recipe/roguetown/cooking/riceporridge - name = "rice porridge" - reqs = list( - /obj/item/reagent_containers/food/snacks/grown/rice = 1, - /obj/item/reagent_containers/powder/salt = 1, - /obj/item/reagent_containers/glass/bowl = 1, - /datum/reagent/water = 15 - ) - result = /obj/item/reagent_containers/food/snacks/rogue/riceporridge - craftdiff = 0 - subtype_reqs = TRUE - -/obj/item/reagent_containers/food/snacks/rogue/cheesyporridge - name = "cheesy rice porridge" - desc = "Adding cheese saved this dish." - icon = 'icons/roguetown/items/food.dmi' - icon_state = "rice_porridge" - tastes = list("cheese" = 1, "rice" = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 15) - eat_effect = /datum/status_effect/buff/foodbuff - warming = 5 MINUTES - rotprocess = 15 MINUTES - w_class = WEIGHT_CLASS_SMALL - trash = /obj/item/reagent_containers/glass/bowl - -/datum/crafting_recipe/roguetown/cooking/cheesyporridge - name = "cheesy rice porridge" - reqs = list( - /obj/item/reagent_containers/food/snacks/grown/rice = 1, - /obj/item/reagent_containers/powder/salt = 1, - /obj/item/reagent_containers/food/snacks/rogue/cheddarwedge = 1, - /obj/item/reagent_containers/glass/bowl = 1, - /datum/reagent/water = 15 - ) - result = /obj/item/reagent_containers/food/snacks/rogue/cheesyporridge - craftdiff = 0 - subtype_reqs = TRUE - -/obj/item/reagent_containers/food/snacks/rogue/tieflingrice - name = "tiefling rice" - desc = "A spicy dish hailing from tiefling lineages!" - icon = 'icons/roguetown/items/food.dmi' - icon_state = "tieflingrice" - tastes = list("heat" = 1, "rice" = 1) - list_reagents = list(/datum/reagent/consumable/nutriment = 15, /datum/reagent/consumable/capsaicin = 5) - eat_effect = /datum/status_effect/buff/foodbuff - warming = 10 MINUTES - rotprocess = 15 MINUTES - w_class = WEIGHT_CLASS_SMALL - trash = /obj/item/reagent_containers/glass/bowl - -/datum/crafting_recipe/roguetown/cooking/tieflingrice - name = "tiefling rice" - reqs = list( - /obj/item/reagent_containers/food/snacks/grown/bellpepper = 1, - /obj/item/reagent_containers/powder/salt = 1, - /obj/item/reagent_containers/food/snacks/rogue/tomatoslice = 1, - /obj/item/reagent_containers/food/snacks/grown/rice = 1, - /obj/item/reagent_containers/glass/bowl = 1, - /datum/reagent/water = 15 - ) - result = /obj/item/reagent_containers/food/snacks/rogue/tieflingrice - craftdiff = 2 - subtype_reqs = TRUE diff --git a/code/modules/roguetown/roguejobs/cook/tools/cooktools.dm b/code/modules/roguetown/roguejobs/cook/tools/cooktools.dm index da3a07de4aa..e4b0db2a361 100644 --- a/code/modules/roguetown/roguejobs/cook/tools/cooktools.dm +++ b/code/modules/roguetown/roguejobs/cook/tools/cooktools.dm @@ -1,3 +1,3 @@ /obj/item/cooking var/list/soliding = list() - var/ingsize = 0 \ No newline at end of file + var/ingsize = 0 diff --git a/code/modules/roguetown/roguejobs/fisher/fish.dm b/code/modules/roguetown/roguejobs/fisher/fish.dm index 3a18e14d16d..544ef3ad26a 100644 --- a/code/modules/roguetown/roguejobs/fisher/fish.dm +++ b/code/modules/roguetown/roguejobs/fisher/fish.dm @@ -327,12 +327,12 @@ name = "cooked sludgefish" icon_state = "sludgefish_purple" color = "#b6791e" - list_reagents = list(/datum/reagent/berrypoison = 5) + list_reagents = list(/datum/reagent/toxin/berrypoison = 5) /obj/item/reagent_containers/food/snacks/rogue/fryfishfresh/ratfish name = "cooked ratfish" icon_state = "ratfish" color = "#b6791e" - list_reagents = list(/datum/reagent/berrypoison = 5) + list_reagents = list(/datum/reagent/toxin/berrypoison = 5) /obj/item/reagent_containers/food/snacks/rogue/fryfishfresh/pufferfish name = "cooked pufferfish" icon_state = "pufferfish" diff --git a/code/modules/roguetown/roguejobs/fisher/leeches.dm b/code/modules/roguetown/roguejobs/fisher/leeches.dm index c1f0c9f4b4b..37bb12c7f84 100644 --- a/code/modules/roguetown/roguejobs/fisher/leeches.dm +++ b/code/modules/roguetown/roguejobs/fisher/leeches.dm @@ -246,7 +246,7 @@ if(iscarbon(user)) var/mob/living/carbon/V = user if(prob(5)) - V.say(pick("PRAISE ZIZO!", "DEATH TO THE TEN...")) + V.say(pick("PRAISE LEVISHTH!", "DEATH TO THE TEN...")) V.add_stress(/datum/stressevent/leechcult) #undef MAX_LEECH_EVILNESS diff --git a/code/modules/roguetown/roguejobs/gravedigger/hole.dm b/code/modules/roguetown/roguejobs/gravedigger/hole.dm index c0cca587ee3..26af97a6c45 100644 --- a/code/modules/roguetown/roguejobs/gravedigger/hole.dm +++ b/code/modules/roguetown/roguejobs/gravedigger/hole.dm @@ -287,6 +287,8 @@ if(!(locate(/obj/item/natural/stone) in T)) if(prob(23)) new /obj/item/natural/stone(T) + if(prob(23)) + new /obj/item/rogueore/sand(T) return ..() /obj/structure/closet/dirthole/Destroy() diff --git a/code/modules/roguetown/roguejobs/miner/rogueores.dm b/code/modules/roguetown/roguejobs/miner/rogueores.dm index ac3ec1cab0b..7ba4a869381 100644 --- a/code/modules/roguetown/roguejobs/miner/rogueores.dm +++ b/code/modules/roguetown/roguejobs/miner/rogueores.dm @@ -74,6 +74,25 @@ icon_state = "oresand" smeltresult = /obj/item/ingot/glass sellprice = 4 + +// pocket sand!! +// copied from /obj/item/stack/ore/glass/throw_impact +/obj/item/rogueore/sand/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + if(..() || !ishuman(hit_atom)) + return + // 20% chance if thrown by an explosion or something, otherwise thrower must have targeted head + if((isnull(throwingdatum?.target_zone) && prob(80)) || ran_zone(throwingdatum?.target_zone) != BODY_ZONE_HEAD) + return + var/mob/living/carbon/human/humie = hit_atom + if(humie.is_eyes_covered()) + humie.visible_message(span_danger("[humie]'s eye protection blocks the sand!"), span_warning("My eye protection blocks the sand!")) + return + humie.adjust_blurriness(6) + humie.adjustStaminaLoss(15)//the pain from my eyes burning does stamina damage + humie.confused += 5 + to_chat(humie, span_danger("\The [src] gets into my eyes! The pain, it burns!")) + qdel(src) + /obj/item/rogueore/cinnabar name = "cinnabar" desc = "Red gems that contain the essence of quicksilver." diff --git a/code/modules/roguetown/roguejobs/tailor/dyer.dm b/code/modules/roguetown/roguejobs/tailor/dyer.dm index 48f58ac64f7..25096487484 100644 --- a/code/modules/roguetown/roguejobs/tailor/dyer.dm +++ b/code/modules/roguetown/roguejobs/tailor/dyer.dm @@ -52,7 +52,7 @@ "Russet" = "#7f461b" ) /obj/machinery/gear_painter/Destroy() - inserted.forceMove(drop_location()) + inserted?.forceMove(drop_location()) return ..() /obj/machinery/gear_painter/dye_bin diff --git a/code/modules/roguetown/roguemachine/bounty.dm b/code/modules/roguetown/roguemachine/bounty.dm index c0f22448217..c0012843622 100644 --- a/code/modules/roguetown/roguemachine/bounty.dm +++ b/code/modules/roguetown/roguemachine/bounty.dm @@ -27,6 +27,8 @@ // Main Menu var/list/choices = list("Consult bounties", "Set bounty") + if(user.job in list("Hedgemaster", "Hedge Knight")) + choices += "Remove bounty" var/selection = input(user, "The Excidium listens", src) as null|anything in choices switch(selection) @@ -37,6 +39,9 @@ if("Set bounty") set_bounty(H) + if("Remove bounty") + remove_bounty(H) + /obj/structure/roguemachine/bounty/attackby(obj/item/P, mob/user, params) if(!(ishuman(user))) return @@ -164,6 +169,34 @@ message_admins("[ADMIN_LOOKUPFLW(user)] has set a bounty on [ADMIN_LOOKUPFLW(target)] with the reason of: '[reason]'") +/obj/structure/roguemachine/bounty/proc/remove_bounty(mob/living/carbon/human/user) + var/list/eligible_players = list() + + if(user.mind.known_people.len) + for(var/datum/bounty/b in GLOB.head_bounties) + eligible_players += b.target + else + to_chat(user, span_warning("I don't know anyone.")) + return + var/mob/living/carbon/target = input(user, "Whose name shall be removed from the wanted list?", src) as null|anything in eligible_players + if(isnull(target)) + say("No target selected.") + return + + var/confirm = input(user, "Do you dare release this one?", src) as null|anything in list("Yes", "No") + if(isnull(confirm) || confirm == "No") return + for(var/datum/bounty/b in GLOB.head_bounties) + if(b.target == target.real_name) + GLOB.head_bounties -= b + + //Announce it locally and on scomm + playsound(src, 'sound/misc/machinetalk.ogg', 100, FALSE, -1) + var/bounty_announcement = "[target] is no longer wanted." + say(bounty_announcement) + scom_announce(bounty_announcement) + + message_admins("[ADMIN_LOOKUPFLW(user)] has removed a bounty on [ADMIN_LOOKUPFLW(target)]'") + /proc/add_bounty(target_realname, amount, bandit_status, reason, employer_name) var/datum/bounty/new_bounty = new /datum/bounty new_bounty.amount = amount diff --git a/code/modules/roguetown/roguemachine/camera.dm b/code/modules/roguetown/roguemachine/camera.dm index c02f7a10249..020a0707401 100644 --- a/code/modules/roguetown/roguemachine/camera.dm +++ b/code/modules/roguetown/roguemachine/camera.dm @@ -36,4 +36,4 @@ /obj/structure/roguemachine/camera/Destroy() set_light(0) SSroguemachine.cameras -= src - . = ..() \ No newline at end of file + . = ..() diff --git a/code/modules/roguetown/roguemachine/drugmachine.dm b/code/modules/roguetown/roguemachine/drugmachine.dm index 5b8a3ba1674..48384400114 100644 --- a/code/modules/roguetown/roguemachine/drugmachine.dm +++ b/code/modules/roguetown/roguemachine/drugmachine.dm @@ -229,16 +229,16 @@ held_items[/obj/item/reagent_containers/powder/ozium] = list("PRICE" = rand(6,15),"NAME" = "ozium") held_items[/obj/item/reagent_containers/powder/moondust] = list("PRICE" = rand(35,55),"NAME" = "moondust") held_items[/obj/item/clothing/mask/cigarette/rollie/cannabis] = list("PRICE" = rand(12,18),"NAME" = "swampweed zig") - held_items[/obj/item/storage/fancy/shhig] = list("PRICE" = rand(15,25),"NAME" = "box of ssssigs") + held_items[/obj/item/storage/fancy/shhig] = list("PRICE" = rand(15,25),"NAME" = "box of Shhig Brand Zigs") held_items[/obj/item/storage/box/matches] = list("PRICE" = rand(10,15),"NAME" = "tinderbox") held_items[/obj/item/reagent_containers/hypospray/medipen/sty/detox] = list("PRICE" = rand(15,20),"NAME" = "DETOX") - held_items[/obj/item/reagent_containers/hypospray/medipen/sty/snekbt] = list("PRICE" = rand(35),"NAME" = "SNAKEBITE") - held_items[/obj/item/reagent_containers/hypospray/medipen/sty/nourish] = list("PRICE" = rand(20),"NAME" = "NOURISH") + held_items[/obj/item/reagent_containers/hypospray/medipen/sty/snekbt] = list("PRICE" = rand(20,35),"NAME" = "SNAKEBITE") + held_items[/obj/item/reagent_containers/hypospray/medipen/sty/nourish] = list("PRICE" = rand(10,20),"NAME" = "NOURISH") held_items[/obj/item/storage/fancy/pilltinwake] = list("PRICE" = rand(25,30),"NAME" = "pep pills tin") held_items[/obj/item/reagent_containers/hypospray/medipen/sealbottle/purify] = list("PRICE" = rand(25,30),"NAME" = "PURIFY") held_items[/obj/item/storage/fancy/pilltinpink] = list("PRICE" = rand(25,35),"NAME" = "pink pill tin") held_items[/obj/item/natural/bundle/cloth/bandage/full] = list("PRICE" = rand(10,15),"NAME" = "roll of bandages") - held_items[/obj/item/survivalcapsule/tent] = list("PRICE" = rand(15,20),"NAME" = "Tent crystal") + held_items[/obj/item/survivalcapsule/tent] = list("PRICE" = rand(15,20),"NAME" = "tent crystal") held_items[/obj/item/survivalcapsule/smith] = list("PRICE" = rand(90,100),"NAME" = "Modest home crystal") held_items[/obj/item/survivalcapsule/wiz] = list("PRICE" = rand(600,800),"NAME" = "Luxury home crystal") held_items[/obj/item/reagent_containers/glass/alembic] = list("PRICE" = rand(30,40),"NAME" = "alembic") diff --git a/code/modules/roguetown/roguemachine/mail.dm b/code/modules/roguetown/roguemachine/mail.dm index a1eb092df8a..9ada1512600 100644 --- a/code/modules/roguetown/roguemachine/mail.dm +++ b/code/modules/roguetown/roguemachine/mail.dm @@ -117,7 +117,7 @@ GLOB.confessors += "[C.signed]" qdel(C) visible_message(span_warning("[user] sends something.")) - send_ooc_note("Confessions: [GLOB.confessors.len]/5", job = list("confessor", "Witcher", "Prophet")) + send_ooc_note("Confessions: [GLOB.confessors.len]/5", job = list("confessor", "Witcher", "Archpriest")) playsound(loc, 'sound/magic/hallelujah.ogg', 100, FALSE, -1) playsound(loc, 'sound/misc/disposalflush.ogg', 100, FALSE, -1) return @@ -196,6 +196,7 @@ /obj/structure/roguemachine/mail/Destroy() set_light(0) SSroguemachine.hermailers -= src + return ..() /obj/structure/roguemachine/mail/r pixel_y = 0 diff --git a/code/modules/roguetown/roguemachine/money.dm b/code/modules/roguetown/roguemachine/money.dm index 8f00ed20712..33fdd1e3bf0 100644 --- a/code/modules/roguetown/roguemachine/money.dm +++ b/code/modules/roguetown/roguemachine/money.dm @@ -169,7 +169,8 @@ GLOBAL_VAR(moneymaster) if(!type_to_put || zenars_to_put < 1) return var/obj/item/roguecoin/G = new type_to_put(T, floor(zenars_to_put)) - user.put_in_hands(G) + if(user) + user.put_in_hands(G) playsound(T, 'sound/misc/coindispense.ogg', 100, FALSE, -1) /* /obj/structure/roguemachine/money/attack_right(mob/user) diff --git a/code/modules/roguetown/roguemachine/scomm.dm b/code/modules/roguetown/roguemachine/scomm.dm index ebab509af5f..b6499bb1f4c 100644 --- a/code/modules/roguetown/roguemachine/scomm.dm +++ b/code/modules/roguetown/roguemachine/scomm.dm @@ -173,8 +173,8 @@ w_class = WEIGHT_CLASS_SMALL flags_1 = HEAR_1 muteinmouth = TRUE - var/listening = TRUE - var/speaking = FALSE //Start muted its weird. + var/listening = FALSE //Start muted its weird. + var/speaking = TRUE sellprice = 50 //wip /obj/item/scomstone/attack_right(mob/user) @@ -195,7 +195,7 @@ playsound(loc, 'sound/misc/beep.ogg', 100, FALSE, -1) listening = !listening speaking = !speaking - to_chat(user, span_info("I [speaking ? "unmute" : "mute"] the scomstone.")) + to_chat(user, span_info("I turn the scomstone to [speaking ? "listening" : "broadcasting"] mode.")) update_icon() /obj/item/scomstone/Destroy() diff --git a/code/modules/roguetown/roguemachine/streetvendor.dm b/code/modules/roguetown/roguemachine/streetvendor.dm deleted file mode 100644 index 8154cfc26f1..00000000000 --- a/code/modules/roguetown/roguemachine/streetvendor.dm +++ /dev/null @@ -1,246 +0,0 @@ -#define DRUGRADE_MONEYA (1<<0) -#define DRUGRADE_MONEYB (1<<1) -#define DRUGRADE_NOTAX (1<<5) - -/obj/structure/roguemachine/streetvendor - name = "WANDERER" - desc = "You want to buy nice things." - icon = 'icons/roguetown/misc/machines.dmi' - icon_state = "streetvendor1" - density = TRUE - blade_dulling = DULLING_BASH - max_integrity = 0 - anchored = TRUE - layer = BELOW_OBJ_LAYER - var/list/held_items = list() - var/locked = FALSE - var/budget = 0 - var/secret_budget = 0 - var/recent_payments = 0 - var/last_payout = 0 - var/drugrade_flags - -/obj/structure/roguemachine/streetvendor/attackby(obj/item/P, mob/user, params) - if(istype(P, /obj/item/roguekey)) - var/obj/item/roguekey/K = P - if(K.lockid == "merchant") - locked = !locked - playsound(loc, 'sound/misc/beep.ogg', 100, FALSE, -1) - update_icon() - return attack_hand(user) - else - to_chat(user, span_warning("Wrong key.")) - return - if(istype(P, /obj/item/storage/keyring)) - var/obj/item/storage/keyring/K = P - for(var/obj/item/roguekey/KE in K.keys) - if(KE.lockid == "merchant") - locked = !locked - playsound(loc, 'sound/misc/beep.ogg', 100, FALSE, -1) - update_icon() - return attack_hand(user) - if(istype(P, /obj/item/roguecoin)) - budget += P.get_real_price() - qdel(P) - update_icon() - playsound(loc, 'sound/misc/machinevomit.ogg', 100, TRUE, -1) - return attack_hand(user) - ..() - -/obj/structure/roguemachine/streetvendor/process() - if(recent_payments) - if(world.time > last_payout + rand(6 MINUTES,8 MINUTES)) - var/amt = recent_payments * 0.25 - if(drugrade_flags & DRUGRADE_MONEYA) - amt = recent_payments * 0.50 - if(drugrade_flags & DRUGRADE_MONEYB) - amt = recent_payments * 0.75 - recent_payments = 0 - send_ooc_note("Income from HAGGLER: [amt]", job = "Merchant") - secret_budget += amt - -/obj/structure/roguemachine/streetvendor/Topic(href, href_list) - . = ..() - if(!ishuman(usr)) - return - if(href_list["buy"]) - if(!usr.canUseTopic(src, BE_CLOSE) || locked) - return - var/mob/M = usr - var/O = text2path(href_list["buy"]) - if(held_items[O]["PRICE"]) - var/tax_amt = round(SStreasury.tax_value * held_items[O]["PRICE"]) - var/full_price = held_items[O]["PRICE"] + tax_amt - if(drugrade_flags & DRUGRADE_NOTAX) - full_price = held_items[O]["PRICE"] - if(budget >= full_price) - budget -= full_price - recent_payments += held_items[O]["PRICE"] - if(!(drugrade_flags & DRUGRADE_NOTAX)) - SStreasury.give_money_treasury(tax_amt, "HAGGLER import tax") - else - say("Not enough!") - return - var/obj/item/I = new O(get_turf(src)) - M.put_in_hands(I) - if(href_list["change"]) - if(!usr.canUseTopic(src, BE_CLOSE) || locked) - return - if(budget > 0) - budget2change(budget, usr) - budget = 0 - if(href_list["secrets"]) - if(!usr.canUseTopic(src, BE_CLOSE) || locked) - return - var/list/options = list() - options += "Withdraw Cut" - if(drugrade_flags & DRUGRADE_NOTAX) - options += "Enable Paying Taxes" - else - options += "Stop Paying Taxes" - if(!(drugrade_flags & DRUGRADE_MONEYA)) - options += "Unlock 50% Cut (30)" - else - if(!(drugrade_flags & DRUGRADE_MONEYB)) - options += "Unlock 75% Cut (55)" - var/select = input(usr, "Please select an option.", "", null) as null|anything in options - if(!select) - return - if(!usr.canUseTopic(src, BE_CLOSE) || locked) - return - switch(select) - if("Withdraw Cut") - options = list("To Bank", "Direct") - select = input(usr, "Please select an option.", "", null) as null|anything in options - if(!select) - return - if(!usr.canUseTopic(src, BE_CLOSE) || locked) - return - switch(select) - if("To Bank") - var/mob/living/carbon/human/H = usr - SStreasury.generate_money_account(secret_budget, H) - secret_budget = 0 - if("Direct") - if(secret_budget > 0) - budget2change(secret_budget, usr) - secret_budget = 0 - if("Enable Paying Taxes") - drugrade_flags &= ~DRUGRADE_NOTAX - playsound(loc, 'sound/misc/beep.ogg', 100, FALSE, -1) - if("Stop Paying Taxes") - drugrade_flags |= DRUGRADE_NOTAX - playsound(loc, 'sound/misc/beep.ogg', 100, FALSE, -1) - if("Unlock 50% Cut (30)") - if(drugrade_flags & DRUGRADE_MONEYA) - return - if(budget < 30) - say("Ask again when you're serious.") - playsound(src, 'sound/misc/machinetalk.ogg', 100, FALSE, -1) - return - budget -= 30 - drugrade_flags |= DRUGRADE_MONEYA - playsound(loc, 'sound/misc/beep.ogg', 100, FALSE, -1) - if("Unlock 75% Cut (55)") - if(drugrade_flags & DRUGRADE_MONEYB) - return - if(budget < 55) - say("Ask again when you're serious.") - playsound(src, 'sound/misc/machinetalk.ogg', 100, FALSE, -1) - return - budget -= 55 - drugrade_flags |= DRUGRADE_MONEYB - playsound(loc, 'sound/misc/beep.ogg', 100, FALSE, -1) - return attack_hand(usr) - -/obj/structure/roguemachine/streetvendor/attack_hand(mob/living/user) - . = ..() - if(.) - return - if(!ishuman(user)) - return - if(locked) - return - user.changeNext_move(CLICK_CD_MELEE) - playsound(loc, 'sound/misc/beep.ogg', 100, FALSE, -1) - var/canread = user.can_read(src, TRUE) - var/contents - if(canread) - contents = "
    HAGGLER - In the name of pleasure.
    " - contents += "MAMMON LOADED: [budget]
    " - else - contents = "
    [stars("HAGGLER - In the name of pleasure.")]
    " - contents += "[stars("MAMMON LOADED:")] [budget]
    " - - - var/mob/living/carbon/human/H = user - if(H.job == "Merchant") - if(canread) - contents += "Secrets" - else - contents += "[stars("Secrets")]" - - contents += "

    " - - for(var/I in held_items) - var/price = held_items[I]["PRICE"] + (SStreasury.tax_value * held_items[I]["PRICE"]) - var/namer = held_items[I]["NAME"] - if(!price) - price = "0" - if(!namer) - held_items[I]["NAME"] = "thing" - namer = "thing" - if(canread) - contents += "[icon2html(I, user)] [namer] - [price] BUY" - else - contents += "[icon2html(I, user)] [stars(namer)] - [stars(price)] [stars("BUY")]" - contents += "
    " - - var/datum/browser/popup = new(user, "VENDORTHING", "", 370, 400) - popup.set_content(contents) - popup.open() - -/obj/structure/roguemachine/streetvendor/obj_break(damage_flag) - ..() - budget2change(budget) - set_light(0) - update_icon() - icon_state = "streetvendor0" - -/obj/structure/roguemachine/streetvendor/update_icon() - cut_overlays() - if(obj_broken) - set_light(0) - return - set_light(1, 1, "#1b7bf1") - add_overlay(mutable_appearance(icon, "vendor-drug")) - - -/obj/structure/roguemachine/streetvendor/Destroy() - set_light(0) - STOP_PROCESSING(SSroguemachine, src) - return ..() - -/obj/structure/roguemachine/streetvendor/Initialize() - . = ..() - START_PROCESSING(SSroguemachine, src) - update_icon() - held_items[/obj/item/storage/box/matches] = list("PRICE" = 8,"NAME" = "matches") - held_items[/obj/item/storage/keyring ] = list("PRICE" = 5,"NAME" = "keyring") - held_items[/obj/item/needle ] = list("PRICE" = 10,"NAME" = "needle") - held_items[/obj/item/flint ] = list("PRICE" = 10,"NAME" = "flint") - held_items[/obj/item/paper/scroll ] = list("PRICE" = 3,"NAME" = "scroll") - held_items[/obj/item/storage/roguebag ] = list("PRICE" = 5,"NAME" = "sack") - held_items[/obj/item/rope ] = list("PRICE" = 5,"NAME" = "rope") - held_items[/obj/item/scomstone ] = list("PRICE" = 50,"NAME" = "scom ring") - held_items[/obj/item/rogueweapon/huntingknife/idagger] = list("PRICE" = 20,"NAME" = "knife") - held_items[/obj/item/reagent_containers/glass/bottle/rogue/healthpot] = list("PRICE" = 15,"NAME" = "red") - held_items[/obj/item/reagent_containers/glass/bottle/rogue/manapot] = list("PRICE" = 13,"NAME" = "manna") - held_items[/obj/item/reagent_containers/glass/bottle/rogue/antipregnancy] = list("PRICE" = 10,"NAME" = "pregnancy remover") - held_items[/obj/item/reagent_containers/food/snacks/rogue/meat/coppiette] = list("PRICE" = 10,"NAME" = "coppiette") - held_items[/obj/item/reagent_containers/food/snacks/rogue/honey] = list("PRICE" = 15,"NAME" = "honey") - held_items[/obj/item/reagent_containers/food/snacks/butter] = list("PRICE" = 5,"NAME" = "butter") - -#undef DRUGRADE_MONEYA -#undef DRUGRADE_MONEYB -#undef DRUGRADE_NOTAX diff --git a/code/modules/roguetown/roguemachine/submission.dm b/code/modules/roguetown/roguemachine/submission.dm index 06c2ad9600e..260ad95113e 100644 --- a/code/modules/roguetown/roguemachine/submission.dm +++ b/code/modules/roguetown/roguemachine/submission.dm @@ -1,6 +1,6 @@ /* //Var for keeping track of timer -var/global/feeding_hole_wheat_count = 0 -var/global/feeding_hole_reset_timer +GLOBAL_VAR_INIT(feeding_hole_wheat_count, 0) +GLOBAL_VAR(feeding_hole_reset_timer) */ //WIP for now it does really nothing, but people will be gaslighted into thinking it does. /obj/structure/feedinghole diff --git a/code/modules/roguetown/roguemachine/throne.dm b/code/modules/roguetown/roguemachine/throne.dm index a13a21457c8..81f72ebed59 100644 --- a/code/modules/roguetown/roguemachine/throne.dm +++ b/code/modules/roguetown/roguemachine/throne.dm @@ -25,7 +25,7 @@ GLOBAL_VAR(king_throne) M.reset_offsets("bed_buckle") /obj/structure/roguethrone/Initialize() - ..() + . = ..() if(GLOB.king_throne == null) GLOB.king_throne = src if(GLOB.lordprimary) diff --git a/code/modules/roguetown/roguemachine/wizard.dm b/code/modules/roguetown/roguemachine/wizard.dm index 2ea733b1e5e..c5a7d8e7d18 100644 --- a/code/modules/roguetown/roguemachine/wizard.dm +++ b/code/modules/roguetown/roguemachine/wizard.dm @@ -233,7 +233,7 @@ . = ..() update_icon() -proc/wizard_vend_negative() +/proc/wizard_vend_negative() var/list/wizard_vend_negative = list( //normal "A shortage of inky sustenance has hindered my arcyne endeavors.", @@ -257,7 +257,7 @@ proc/wizard_vend_negative() "My inkwell is as parched as a desert wanderer. Fill me up.") return pick(wizard_vend_negative) -proc/wizard_vend_positive() +/proc/wizard_vend_positive() var/list/wizard_vend_positive = list( //normal "A spell born from the cosmic tapestry, woven with the threads of arcyne energy.", diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index 84378de8f27..8df5f4b1c09 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -58,7 +58,6 @@ /obj/item/stack/sheet/mineral/bananium = /datum/species/golem/bananium, /obj/item/stack/sheet/mineral/titanium = /datum/species/golem/titanium, /obj/item/stack/sheet/mineral/plastitanium = /datum/species/golem/plastitanium, - /obj/item/stack/sheet/mineral/abductor = /datum/species/golem/alloy, /obj/item/stack/sheet/mineral/wood = /datum/species/golem/wood, /obj/item/stack/sheet/bluespace_crystal = /datum/species/golem/bluespace, /obj/item/stack/sheet/runed_metal = /datum/species/golem/runic, diff --git a/code/modules/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/ruins/objects_and_mobs/sin_ruins.dm index a09ccea3ee9..77efbd61e37 100644 --- a/code/modules/ruins/objects_and_mobs/sin_ruins.dm +++ b/code/modules/ruins/objects_and_mobs/sin_ruins.dm @@ -88,10 +88,7 @@ return TRUE else to_chat(H, span_warning("You're repulsed by even looking at [src]. Only a pig could force themselves to go through it.")) - if(istype(mover, /mob/living/simple_animal/hostile/morph)) - return TRUE - else - return FALSE + return FALSE /obj/structure/mirror/magic/pride //Pride's mirror: Used in the Pride ruin. name = "pride's mirror" diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm deleted file mode 100644 index b2a5e30fea5..00000000000 --- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm +++ /dev/null @@ -1,530 +0,0 @@ -GLOBAL_VAR_INIT(hhStorageTurf, null) -GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) - -/obj/item/hilbertshotel - name = "Hilbert's Hotel" - desc = "" - icon_state = "hilbertshotel" - w_class = WEIGHT_CLASS_SMALL - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - var/datum/map_template/hilbertshotel/hotelRoomTemp - var/datum/map_template/hilbertshotel/empty/hotelRoomTempEmpty - var/datum/map_template/hilbertshotel/lore/hotelRoomTempLore - var/list/activeRooms = list() - var/list/storedRooms = list() - var/storageTurf - //Lore Stuff - var/ruinSpawned = FALSE - var/mysteryRoom - -/obj/item/hilbertshotel/Initialize() - . = ..() - //Load templates - hotelRoomTemp = new() - hotelRoomTempEmpty = new() - hotelRoomTempLore = new() - var/area/currentArea = get_area(src) - if(currentArea.type == /area/ruin/space/has_grav/hilbertresearchfacility) - ruinSpawned = TRUE - -/obj/item/hilbertshotel/Destroy() - ejectRooms() - return ..() - -/obj/item/hilbertshotel/attack(mob/living/M, mob/living/user) - if(M.mind) - to_chat(user, span_notice("I invite [M] to the hotel.")) - promptAndCheckIn(M) - else - to_chat(user, span_warning("[M] is not intelligent enough to understand how to use this device!")) - -/obj/item/hilbertshotel/attack_self(mob/user) - . = ..() - promptAndCheckIn(user) - -/obj/item/hilbertshotel/proc/promptAndCheckIn(mob/user) - var/chosenRoomNumber = input(user, "What number room will you be checking into?", "Room Number") as null|num - if(!chosenRoomNumber) - return - if(chosenRoomNumber > SHORT_REAL_LIMIT) - to_chat(user, span_warning("I have to check out the first [SHORT_REAL_LIMIT] rooms before you can go to a higher numbered one!")) - return - if((chosenRoomNumber < 1) || (chosenRoomNumber != round(chosenRoomNumber))) - to_chat(user, span_warning("That is not a valid room number!")) - return - if(ismob(loc)) - if(user == loc) //Not always the same as user - forceMove(get_turf(user)) - if(!storageTurf) //Blame subsystems for not allowing this to be in Initialize - if(!GLOB.hhStorageTurf) - var/datum/map_template/hilbertshotelstorage/storageTemp = new() - var/datum/turf_reservation/storageReservation = SSmapping.RequestBlockReservation(3, 3) - storageTemp.load(locate(storageReservation.bottom_left_coords[1], storageReservation.bottom_left_coords[2], storageReservation.bottom_left_coords[3])) - GLOB.hhStorageTurf = locate(storageReservation.bottom_left_coords[1]+1, storageReservation.bottom_left_coords[2]+1, storageReservation.bottom_left_coords[3]) - else - storageTurf = GLOB.hhStorageTurf - if(tryActiveRoom(chosenRoomNumber, user)) - return - if(tryStoredRoom(chosenRoomNumber, user)) - return - sendToNewRoom(chosenRoomNumber, user) - - -/obj/item/hilbertshotel/proc/tryActiveRoom(roomNumber, mob/user) - if(activeRooms["[roomNumber]"]) - var/datum/turf_reservation/roomReservation = activeRooms["[roomNumber]"] - do_sparks(3, FALSE, get_turf(user)) - user.forceMove(locate(roomReservation.bottom_left_coords[1] + hotelRoomTemp.landingZoneRelativeX, roomReservation.bottom_left_coords[2] + hotelRoomTemp.landingZoneRelativeY, roomReservation.bottom_left_coords[3])) - return TRUE - else - return FALSE - -/obj/item/hilbertshotel/proc/tryStoredRoom(roomNumber, mob/user) - if(storedRooms["[roomNumber]"]) - var/datum/turf_reservation/roomReservation = SSmapping.RequestBlockReservation(hotelRoomTemp.width, hotelRoomTemp.height) - hotelRoomTempEmpty.load(locate(roomReservation.bottom_left_coords[1], roomReservation.bottom_left_coords[2], roomReservation.bottom_left_coords[3])) - var/turfNumber = 1 - for(var/i=0, i 1)) //no teleporting around if they're dead or moved away during the prompt. - return - user.forceMove(get_turf(parentSphere)) - do_sparks(3, FALSE, get_turf(user)) - -/turf/closed/indestructible/hoteldoor/attack_ghost(mob/dead/observer/user) - if(!isobserver(user) || !parentSphere) - return ..() - user.forceMove(get_turf(parentSphere)) - -//If only this could be simplified... -/turf/closed/indestructible/hoteldoor/attack_tk(mob/user) - return //need to be close. - -/turf/closed/indestructible/hoteldoor/attack_hand(mob/user) - promptExit(user) - -/turf/closed/indestructible/hoteldoor/attack_animal(mob/user) - promptExit(user) - -/turf/closed/indestructible/hoteldoor/attack_paw(mob/user) - promptExit(user) - -/turf/closed/indestructible/hoteldoor/attack_hulk(mob/living/carbon/human/user) - promptExit(user) - -/turf/closed/indestructible/hoteldoor/attack_larva(mob/user) - promptExit(user) - -/turf/closed/indestructible/hoteldoor/attack_slime(mob/user) - promptExit(user) - -/turf/closed/indestructible/hoteldoor/attack_robot(mob/user) - if(get_dist(get_turf(src), get_turf(user)) <= 1) - promptExit(user) - -/turf/closed/indestructible/hoteldoor/AltClick(mob/user) - . = ..() - if(get_dist(get_turf(src), get_turf(user)) <= 1) - to_chat(user, span_notice("I peak through the door's bluespace peephole...")) - user.reset_perspective(parentSphere) - user.set_machine(src) - var/datum/action/peepholeCancel/PHC = new - user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 1) - PHC.Grant(user) - -/turf/closed/indestructible/hoteldoor/check_eye(mob/user) - if(get_dist(get_turf(src), get_turf(user)) >= 2) - user.unset_machine() - for(var/datum/action/peepholeCancel/PHC in user.actions) - PHC.Trigger() - -/datum/action/peepholeCancel - name = "Cancel View" - desc = "" - button_icon_state = "cancel_peephole" - -/datum/action/peepholeCancel/Trigger() - . = ..() - to_chat(owner, span_warning("I move away from the peephole.")) - owner.reset_perspective() - owner.clear_fullscreen("remote_view", 0) - qdel(src) - -/area/hilbertshotel - name = "Hilbert's Hotel Room" - icon_state = "hilbertshotel" - requires_power = FALSE - has_gravity = TRUE - noteleport = TRUE - hidden = TRUE - unique = FALSE - dynamic_lighting = DYNAMIC_LIGHTING_FORCED - ambientsounds = list('sound/blank.ogg') - var/roomnumber = 0 - var/obj/item/hilbertshotel/parentSphere - var/datum/turf_reservation/reservation - var/turf/storageTurf - -/area/hilbertshotel/Entered(atom/movable/AM) - . = ..() - if(istype(AM, /obj/item/hilbertshotel)) - relocate(AM) - var/list/obj/item/hilbertshotel/hotels = AM.GetAllContents(/obj/item/hilbertshotel) - for(var/obj/item/hilbertshotel/H in hotels) - if(parentSphere == H) - relocate(H) - -/area/hilbertshotel/proc/relocate(obj/item/hilbertshotel/H) - if(prob(0.135685)) //Because screw you - qdel(H) - return - var/turf/targetturf = find_safe_turf() - if(!targetturf) - if(GLOB.blobstart.len > 0) - targetturf = get_turf(pick(GLOB.blobstart)) - else - CRASH("Unable to find a blobstart landmark") - var/turf/T = get_turf(H) - var/area/A = T.loc - log_game("[H] entered itself. Moving it to [loc_name(targetturf)].") - message_admins("[H] entered itself. Moving it to [ADMIN_VERBOSEJMP(targetturf)].") - for(var/mob/M in A) - to_chat(M, span_danger("[H] almost implodes in upon itself, but quickly rebounds, shooting off into a random point in space!")) - H.forceMove(targetturf) - -/area/hilbertshotel/Exited(atom/movable/AM) - . = ..() - if(ismob(AM)) - var/mob/M = AM - if(M.mind) - var/stillPopulated = FALSE - var/list/currentLivingMobs = GetAllContents(/mob/living) //Got to catch anyone hiding in anything - for(var/mob/living/L in currentLivingMobs) //Check to see if theres any sentient mobs left. - if(L.mind) - stillPopulated = TRUE - break - if(!stillPopulated) - storeRoom() - -/area/hilbertshotel/proc/storeRoom() - var/roomSize = (reservation.top_right_coords[1]-reservation.bottom_left_coords[1]+1)*(reservation.top_right_coords[2]-reservation.bottom_left_coords[2]+1) - var/storage[roomSize] - var/turfNumber = 1 - var/obj/item/abstracthotelstorage/storageObj = new(storageTurf) - storageObj.roomNumber = roomnumber - storageObj.parentSphere = parentSphere - storageObj.name = "Room [roomnumber] Storage" - for(var/i=0, i