diff --git a/.dockerignore b/.dockerignore index 2e6259d23d6..9c6ac6b4aa6 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,6 +1,5 @@ .dockerignore .editorconfig -.travis.yml GPLv3.txt LICENSE README.md @@ -26,5 +25,4 @@ tgstation.dyn.rsc libmariadb.dll rust_g.dll BSQL.dll -appveyor.yml Dockerfile diff --git a/.github/AUTODOC_GUIDE.md b/.github/AUTODOC_GUIDE.md index 63d6b81c0bd..3433c1cc53e 100644 --- a/.github/AUTODOC_GUIDE.md +++ b/.github/AUTODOC_GUIDE.md @@ -43,14 +43,14 @@ namespace), then a longer paragraph which will be shown when the user clicks on the proc to jump to it's definition ``` /** - * Short description of the proc - * - * Longer detailed paragraph about the proc - * including any relevant detail - * Arguments: - * * arg1 - Relevance of this argument - * * arg2 - Relevance of this argument - */ + * Short description of the proc + * + * Longer detailed paragraph about the proc + * including any relevant detail + * Arguments: + * * arg1 - Relevance of this argument + * * arg2 - Relevance of this argument + */ ``` ### Documenting a class @@ -62,15 +62,15 @@ Then we give a short oneline description of the class Finally we give a longer multi paragraph description of the class and it's details ``` /** - * # Classname (Can be omitted if it's just going to be the typepath) - * - * The short overview - * - * A longer - * paragraph of functionality about the class - * including any assumptions/special cases - * - */ + * # Classname (Can be omitted if it's just going to be the typepath) + * + * The short overview + * + * A longer + * paragraph of functionality about the class + * including any assumptions/special cases + * + */ ``` ### Documenting a variable/define diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 4df7c137c20..9c22d60f128 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -66,7 +66,6 @@ # ShizCalev -/_maps/ @ShizCalev /sound/ @ShizCalev # stylemistake @@ -84,6 +83,7 @@ /icons/ @Twaticus @ShizCalev /code/controllers/subsystem/air.dm @LemonInTheDark @MrStonedOne +/_maps/ @EOBGames @ShizCalev #SIC SEMPER TYRANNIS /code/modules/hydroponics/grown/citrus.dm @optimumtact diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 5b11989abd3..8f3df274381 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -329,6 +329,27 @@ This is good: * [tgui/README.md](../tgui/README.md) * [tgui/tutorial-and-examples.md](../tgui/docs/tutorial-and-examples.md) +### Signal Handlers +All procs that are registered to listen for signals using `RegisterSignal()` must contain at the start of the proc `SIGNAL_HANDLER` eg; +``` +/type/path/proc/signal_callback() + SIGNAL_HANDLER + // rest of the code +``` +This is to ensure that it is clear the proc handles signals and turns on a lint to ensure it does not sleep. + +There exists `SIGNAL_HANDLER_DOES_SLEEP`, but this is only for legacy signal handlers that still sleep, new/changed code may not use this. + +### Enforcing parent calling +When adding new signals to root level procs, eg; +``` +/atom/proc/setDir(newdir) + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, newdir) + dir = newdir +``` +The `SHOULD_CALL_PARENT(TRUE)` lint should be added to ensure that overrides/child procs call the parent chain and ensure the signal is sent. + ### Other Notes * Code should be modular where possible; if you are working on a new addition, then strongly consider putting it in its own file unless it makes sense to put it with similar ones (i.e. a new tool would go in the "tools.dm" file) diff --git a/.github/workflows/generate_documentation.yml b/.github/workflows/generate_documentation.yml new file mode 100644 index 00000000000..9407693d4fe --- /dev/null +++ b/.github/workflows/generate_documentation.yml @@ -0,0 +1,30 @@ +name: Generate documentation +on: + push: + branches: + - master +jobs: + generate_documentation: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Setup cache + uses: actions/cache@v2 + with: + path: $HOME/SpacemanDMM + key: ${{ runner.os }}-spacemandmm + - name: Install SpacemanDMM + run: bash tools/ci/install_spaceman_dmm.sh dmdoc + - name: Generate documentation + run: | + ~/dmdoc + touch dmdoc/.nojekyll + echo codedocs.tgstation13.org > dmdoc/CNAME + - name: Deploy + uses: JamesIves/github-pages-deploy-action@3.7.1 + with: + BRANCH: gh-pages + CLEAN: true + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SINGLE_COMMIT: true + FOLDER: dmdoc diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000000..5c9a5583d28 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,100 @@ +name: Run tests +on: + push: + branches: + - master + pull_request: + branches: + - master +jobs: + run_linters: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Setup cache + uses: actions/cache@v2 + with: + path: $HOME/SpacemanDMM + key: ${{ runner.os }}-spacemandmm + - name: Install Tools + run: | + pip3 install setuptools + bash tools/ci/install_build_tools.sh + bash tools/ci/install_spaceman_dmm.sh dreamchecker + pip3 install -r tools/mapmerge2/requirements.txt + - name: Run Linters + run: | + bash tools/ci/check_filedirs.sh tgstation.dme + bash tools/ci/check_changelogs.sh + find . -name "*.php" -print0 | xargs -0 -n1 php -l + find . -name "*.json" -not -path "*/node_modules/*" -print0 | xargs -0 python3 ./tools/json_verifier.py + bash tools/ci/build_tgui.sh + bash tools/ci/check_grep.sh + python3 tools/mapmerge2/dmi.py --test + ~/dreamchecker + compile_all_maps: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Setup cache + uses: actions/cache@v2 + with: + path: $HOME/BYOND + key: ${{ runner.os }}-byond + - name: Compile All Maps + run: | + bash tools/ci/install_byond.sh + source $HOME/BYOND/byond/bin/byondsetup + python3 tools/ci/template_dm_generator.py + bash tools/ci/dm.sh -DCIBUILDING -DCITESTING -DALL_MAPS tgstation.dme + run_all_tests: + runs-on: ubuntu-latest + 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: + - uses: actions/checkout@v2 + - name: Setup cache + uses: actions/cache@v2 + with: + path: $HOME/BYOND + key: ${{ runner.os }}-byond + - 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 + sudo apt install libssl1.1:i386 + bash tools/ci/install_rust_g.sh + - name: Compile and run tests + run: | + bash tools/ci/install_byond.sh + source $HOME/BYOND/byond/bin/byondsetup + bash tools/ci/dm.sh -DCIBUILDING tgstation.dme + bash tools/ci/run_server.sh + test_windows: + runs-on: windows-latest + steps: + - uses: actions/checkout@v2 + - name: Compile + run: pwsh tools/ci/build.ps1 + - name: Create artifact + run: | + md deploy + bash tools/deploy.sh ./deploy + - name: Deploy artifact + uses: actions/upload-artifact@v2 + with: + name: deploy + path: deploy diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index e30b35b067a..00000000000 --- a/.travis.yml +++ /dev/null @@ -1,103 +0,0 @@ -language: generic -os: linux -dist: bionic - -branches: - except: - - ___TGS3TempBranch - - ___TGSTempBranch - -jobs: - include: - - name: "Run Linters" - addons: - apt: - packages: - - python3 - - python3-pip - - python3-setuptools - - pcregrep - - rustc - - cargo - cache: - directories: - - $HOME/SpacemanDMM - install: - - tools/travis/install_build_tools.sh - - tools/travis/install_spaceman_dmm.sh dreamchecker - - python3 -m pip install -r tools/mapmerge2/requirements.txt - script: - - tools/travis/check_filedirs.sh tgstation.dme - - tools/travis/check_changelogs.sh - - find . -name "*.php" -print0 | xargs -0 -n1 php -l - - find . -name "*.json" -not -path "*/node_modules/*" -print0 | xargs -0 python3 ./tools/json_verifier.py - - tools/travis/build_tgui.sh - - tools/travis/check_grep.sh - - python3 tools/mapmerge2/dmi.py --test - - ~/dreamchecker - - - name: "Compile All Maps" - addons: - apt: - packages: - - libstdc++6:i386 - cache: - directories: - - $HOME/BYOND - install: - - tools/travis/install_byond.sh - - source $HOME/BYOND/byond/bin/byondsetup - before_script: - - tools/travis/template_dm_generator.py - script: - - tools/travis/dm.sh -DTRAVISBUILDING -DTRAVISTESTING -DALL_MAPS tgstation.dme - - - name: "Compile and Run Tests" - addons: - mariadb: '10.2' - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - libstdc++6:i386 - - gcc-multilib - - g++-7 - - g++-7-multilib - - libssl1.1:i386 - - zlib1g:i386 - cache: - directories: - - $HOME/BYOND - install: - - tools/travis/install_byond.sh - - source $HOME/BYOND/byond/bin/byondsetup - - tools/travis/install_rust_g.sh - before_script: - - mysql -u root -e 'CREATE DATABASE tg_travis;' - - mysql -u root tg_travis < SQL/tgstation_schema.sql - - mysql -u root -e 'CREATE DATABASE tg_travis_prefixed;' - - mysql -u root tg_travis_prefixed < SQL/tgstation_schema_prefixed.sql - script: - - tools/travis/dm.sh -DTRAVISBUILDING tgstation.dme || travis_terminate 1 - - tools/travis/run_server.sh - - - name: "Generate Documentation" - # Only run for non-PR commits to the real master branch. - if: branch = master AND head_branch IS blank - cache: - directories: - - $HOME/SpacemanDMM - install: - - tools/travis/install_spaceman_dmm.sh dmdoc - before_script: - # Travis checks out a hash, try to get back on a branch. - - git checkout $TRAVIS_BRANCH || true - script: - - ~/dmdoc - - touch dmdoc/.nojekyll - deploy: - provider: pages - skip_cleanup: true - local_dir: dmdoc - token: $DMDOC_GITHUB_TOKEN - fqdn: codedocs.tgstation13.org diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index c15ba40826f..14fd56e2430 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -12,7 +12,7 @@ #include "map_files\PubbyStation\PubbyStation.dmm" #include "map_files\IceBoxStation\IceBoxStation.dmm" - #ifdef TRAVISBUILDING + #ifdef CIBUILDING #include "templates.dm" #endif #endif diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index fc9a8d49a23..5707eb70af9 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -2386,6 +2386,17 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"ahC" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, +/obj/item/radio/intercom{ + pixel_x = -26 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "ahD" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/newscaster{ @@ -6184,9 +6195,8 @@ /turf/open/floor/plating, /area/maintenance/disposal) "apF" = ( -/obj/machinery/mass_driver{ - dir = 4; - id = "trash" +/obj/machinery/mass_driver/trash{ + dir = 4 }, /obj/machinery/light/small{ dir = 1 @@ -6198,10 +6208,7 @@ /turf/open/floor/plating, /area/maintenance/disposal) "apG" = ( -/obj/machinery/door/poddoor{ - id = "trash"; - name = "Disposals Launch Seal" - }, +/obj/machinery/door/poddoor/massdriver_trash, /obj/structure/fans/tiny, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -6687,8 +6694,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, -/obj/machinery/computer/pod/old/mass_driver_controller{ - id = "trash"; +/obj/machinery/computer/pod/old/mass_driver_controller/trash{ pixel_x = -24; pixel_y = -7 }, @@ -15912,10 +15918,7 @@ "aIe" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/turf/open/floor/plating{ - initial_gas_mix = "o2=0.01;n2=0.01"; - luminosity = 2 - }, +/turf/open/floor/plating, /area/security/prison) "aIf" = ( /obj/structure/table, @@ -64997,6 +65000,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/item/radio/intercom{ + pixel_x = 26 + }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "cuE" = ( @@ -67344,6 +67350,9 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, +/obj/item/radio/intercom{ + pixel_x = -26 + }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "czj" = ( @@ -67664,7 +67673,7 @@ dir = 4; name = "Magboot Storage"; pixel_x = -1; - req_access_txt = "19" + req_access_txt = "18" }, /obj/structure/window/reinforced{ dir = 1; @@ -69235,7 +69244,7 @@ dir = 4; name = "Jetpack Storage"; pixel_x = -1; - req_access_txt = "19" + req_access_txt = "18" }, /obj/structure/window/reinforced, /obj/structure/rack, @@ -77362,7 +77371,6 @@ /turf/open/floor/plasteel, /area/security/checkpoint/medical) "cSP" = ( -/obj/structure/table, /obj/item/storage/box/bodybags{ pixel_x = 3; pixel_y = 3 @@ -77385,7 +77393,6 @@ /turf/open/floor/plasteel/white, /area/medical/sleeper) "cSQ" = ( -/obj/structure/table, /obj/item/storage/box/gloves{ pixel_x = 3; pixel_y = 3 @@ -97683,8 +97690,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/loading_area, -/obj/machinery/computer/pod/old/mass_driver_controller{ - id = "toxinsdriver"; +/obj/machinery/computer/pod/old/mass_driver_controller/toxinsdriver{ pixel_x = 28 }, /turf/open/floor/plasteel, @@ -98229,10 +98235,7 @@ /turf/open/floor/plating/airless, /area/science/misc_lab) "dLK" = ( -/obj/machinery/door/poddoor{ - id = "toxinsdriver"; - name = "Toxins Launcher Bay Door" - }, +/obj/machinery/door/poddoor/massdriver_toxins, /obj/structure/fans/tiny, /turf/open/floor/plating, /area/science/misc_lab) @@ -98258,9 +98261,8 @@ /turf/open/floor/plasteel, /area/science/misc_lab) "dLO" = ( -/obj/machinery/mass_driver{ - dir = 8; - id = "toxinsdriver" +/obj/machinery/mass_driver/toxins{ + dir = 8 }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/end{ @@ -168652,7 +168654,7 @@ cRw cTd cVc cWC -cYr +ahC dab dbF ddv diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 2c211f69703..2b32a861725 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -13527,10 +13527,8 @@ name = "Mass Driver"; req_access_txt = "22" }, -/obj/machinery/mass_driver{ - dir = 4; - id = "chapelgun"; - name = "Holy Driver" +/obj/machinery/mass_driver/chapelgun{ + dir = 4 }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -13538,10 +13536,7 @@ /turf/open/floor/plating, /area/chapel/main) "aEn" = ( -/obj/machinery/door/poddoor{ - id = "chapelgun"; - name = "Chapel Launcher Door" - }, +/obj/machinery/door/poddoor/massdriver_chapel, /obj/structure/fans/tiny, /turf/open/floor/plating, /area/chapel/main) @@ -14090,8 +14085,7 @@ /turf/open/floor/plasteel/dark, /area/chapel/main) "aFA" = ( -/obj/machinery/computer/pod/old/mass_driver_controller{ - id = "chapelgun"; +/obj/machinery/computer/pod/old/mass_driver_controller/chapelgun{ pixel_x = 24 }, /turf/open/floor/plasteel/dark, @@ -26660,9 +26654,7 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/machinery/mass_driver{ - id = "trash" - }, +/obj/machinery/mass_driver/trash, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -26917,8 +26909,7 @@ req_access_txt = "12" }, /obj/structure/chair/stool, -/obj/machinery/computer/pod/old/mass_driver_controller{ - id = "trash"; +/obj/machinery/computer/pod/old/mass_driver_controller/trash{ pixel_x = -24; pixel_y = -6 }, @@ -27491,10 +27482,7 @@ /turf/open/floor/plating, /area/maintenance/starboard) "blS" = ( -/obj/machinery/door/poddoor{ - id = "trash"; - name = "disposal bay door" - }, +/obj/machinery/door/poddoor/massdriver_trash, /obj/structure/fans/tiny, /turf/open/floor/plating, /area/maintenance/disposal) @@ -36682,8 +36670,7 @@ req_access_txt = "8" }, /obj/effect/turf_decal/loading_area, -/obj/machinery/computer/pod/old/mass_driver_controller{ - id = "toxinsdriver"; +/obj/machinery/computer/pod/old/mass_driver_controller/toxinsdriver{ pixel_x = -24 }, /turf/open/floor/plasteel, @@ -36954,17 +36941,13 @@ /turf/open/floor/plating, /area/science/mixing) "bLk" = ( -/obj/machinery/mass_driver{ - dir = 4; - id = "toxinsdriver" +/obj/machinery/mass_driver/toxins{ + dir = 4 }, /turf/open/floor/plating, /area/science/mixing) "bLl" = ( -/obj/machinery/door/poddoor{ - id = "toxinsdriver"; - name = "toxins launcher bay door" - }, +/obj/machinery/door/poddoor/massdriver_toxins, /obj/structure/fans/tiny, /turf/open/floor/plating, /area/science/mixing) diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 45282eef7fb..b4a151d2905 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -3538,17 +3538,13 @@ /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "aif" = ( -/obj/machinery/door/poddoor{ - id = "trash"; - name = "disposal bay door" - }, +/obj/machinery/door/poddoor/massdriver_trash, /obj/structure/fans/tiny, /turf/open/floor/plating, /area/maintenance/disposal) "aig" = ( -/obj/machinery/mass_driver{ - dir = 8; - id = "trash" +/obj/machinery/mass_driver/trash{ + dir = 8 }, /obj/machinery/light/small{ dir = 1 @@ -3946,8 +3942,7 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/machinery/computer/pod/old/mass_driver_controller{ - id = "trash"; +/obj/machinery/computer/pod/old/mass_driver_controller/trash{ pixel_x = -24 }, /turf/open/floor/plating, @@ -32586,7 +32581,6 @@ pixel_x = -3; pixel_y = 3 }, -/obj/structure/table, /turf/open/floor/plasteel/checker, /area/engine/atmos) "bAH" = ( @@ -36459,7 +36453,7 @@ dir = 8; name = "Magboot Storage"; pixel_x = -1; - req_access_txt = "19" + req_access_txt = "18" }, /obj/structure/window/reinforced{ dir = 1; @@ -37728,7 +37722,7 @@ dir = 8; name = "Jetpack Storage"; pixel_x = -1; - req_access_txt = "19" + req_access_txt = "18" }, /obj/structure/window/reinforced, /obj/structure/rack, @@ -47619,12 +47613,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/pharmacy) -"cmA" = ( -/obj/machinery/holopad, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/medical/pharmacy) "cmB" = ( /turf/open/floor/plasteel/white, /area/medical/chemistry) @@ -50205,7 +50193,7 @@ /obj/machinery/light, /obj/structure/bed/pod{ desc = "An old medical bed, just waiting for replacement with something up to date."; - name = "Medical Bed" + name = "medical bed" }, /turf/open/floor/plasteel/white, /area/medical/sleeper) @@ -53180,9 +53168,7 @@ "cBK" = ( /obj/machinery/light/small, /obj/effect/turf_decal/stripes/line, -/obj/machinery/computer/pod/old/mass_driver_controller{ - id = "toxinsdriver"; - pixel_x = 0; +/obj/machinery/computer/pod/old/mass_driver_controller/toxinsdriver{ pixel_y = -24 }, /turf/open/floor/plasteel, @@ -53745,9 +53731,8 @@ /turf/open/floor/plasteel, /area/science/mixing) "cDq" = ( -/obj/machinery/mass_driver{ - dir = 4; - id = "toxinsdriver" +/obj/machinery/mass_driver/toxins{ + dir = 4 }, /turf/open/floor/plating, /area/science/mixing) @@ -53765,10 +53750,7 @@ /turf/open/floor/plating, /area/science/mixing) "cDt" = ( -/obj/machinery/door/poddoor{ - id = "toxinsdriver"; - name = "Toxins Launcher Bay Door" - }, +/obj/machinery/door/poddoor/massdriver_toxins, /obj/structure/fans/tiny, /turf/open/floor/plating, /area/science/mixing) @@ -58900,9 +58882,7 @@ /turf/open/floor/plasteel/dark, /area/chapel/main) "cRm" = ( -/obj/machinery/mass_driver{ - id = "chapelgun" - }, +/obj/machinery/mass_driver/chapelgun, /obj/structure/sign/warning/vacuum/external{ pixel_y = 32 }, @@ -59218,10 +59198,7 @@ /turf/open/space, /area/solar/starboard/aft) "cRP" = ( -/obj/machinery/door/poddoor{ - id = "chapelgun"; - name = "Chapel Launcher Door" - }, +/obj/machinery/door/poddoor/massdriver_chapel, /obj/structure/fans/tiny, /turf/open/floor/plating, /area/chapel/main) @@ -63179,8 +63156,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, -/obj/machinery/computer/pod/old/mass_driver_controller{ - id = "chapelgun"; +/obj/machinery/computer/pod/old/mass_driver_controller/chapelgun{ pixel_x = 24 }, /turf/open/floor/plasteel/dark, @@ -105727,7 +105703,7 @@ chc cix cjT cjT -cmA +cjT cnI coU cqs diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index b0b557e81fa..69dbece23b4 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -30957,8 +30957,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/machinery/computer/pod/old/mass_driver_controller{ - id = "toxinsdriver"; +/obj/machinery/computer/pod/old/mass_driver_controller/toxinsdriver/longrange{ pixel_x = 24 }, /turf/open/floor/plasteel, @@ -32528,9 +32527,7 @@ /turf/open/floor/plating, /area/science/mixing) "bJV" = ( -/obj/machinery/mass_driver{ - id = "toxinsdriver" - }, +/obj/machinery/mass_driver/toxins, /obj/structure/window/reinforced{ dir = 4 }, @@ -33348,10 +33345,7 @@ /turf/open/floor/plating, /area/science/mixing) "bMq" = ( -/obj/machinery/door/poddoor{ - id = "toxinsdriver"; - name = "toxins launcher bay door" - }, +/obj/machinery/door/poddoor/massdriver_toxins, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -41012,9 +41006,7 @@ /turf/open/floor/carpet, /area/chapel/main/monastery) "ckv" = ( -/obj/machinery/mass_driver{ - id = "chapelgun" - }, +/obj/machinery/mass_driver/chapelgun, /obj/machinery/door/window/eastleft{ dir = 8; name = "Mass Driver" @@ -41023,9 +41015,7 @@ /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) "ckw" = ( -/obj/machinery/mass_driver{ - id = "chapelgun" - }, +/obj/machinery/mass_driver/chapelgun, /obj/structure/window/reinforced{ dir = 4; layer = 2.9 @@ -41174,10 +41164,7 @@ /turf/open/floor/plasteel/dark, /area/library/lounge) "clb" = ( -/obj/machinery/door/poddoor{ - id = "chapelgun"; - name = "mass driver door" - }, +/obj/machinery/door/poddoor/massdriver_chapel, /turf/open/floor/plating, /area/chapel/main/monastery) "cld" = ( @@ -42950,20 +42937,6 @@ }, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) -"crL" = ( -/obj/structure/chair/wood, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel/chapel{ - dir = 4 - }, -/area/chapel/main/monastery) -"crM" = ( -/obj/structure/chair/wood, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel/chapel{ - dir = 1 - }, -/area/chapel/main/monastery) "crN" = ( /obj/machinery/light/small{ dir = 4 @@ -44154,8 +44127,7 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/machinery/computer/pod/old/mass_driver_controller{ - id = "chapelgun"; +/obj/machinery/computer/pod/old/mass_driver_controller/chapelgun{ pixel_x = 24 }, /turf/open/floor/plasteel/dark, @@ -46545,8 +46517,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, -/obj/machinery/computer/pod/old/mass_driver_controller{ - id = "trash"; +/obj/machinery/computer/pod/old/mass_driver_controller/trash{ pixel_x = -24; pixel_y = -5 }, @@ -47935,10 +47906,7 @@ /turf/open/floor/plasteel, /area/maintenance/disposal) "gDQ" = ( -/obj/machinery/door/poddoor{ - id = "trash"; - name = "Disposals Launch Seal" - }, +/obj/machinery/door/poddoor/massdriver_trash, /obj/structure/fans/tiny, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -53922,9 +53890,8 @@ /turf/open/floor/plasteel/dark, /area/maintenance/department/crew_quarters/dorms) "pmw" = ( -/obj/machinery/mass_driver{ - dir = 4; - id = "trash" +/obj/machinery/mass_driver/trash{ + dir = 4 }, /obj/machinery/light/small{ dir = 1 @@ -74865,7 +74832,7 @@ bXJ bXJ bZm bYB -crL +bZm caV cbM ccH @@ -75636,7 +75603,7 @@ bXJ bXJ bZl bYA -crM +bZl caW cbP cdu diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index df9500ea65c..00000000000 --- a/appveyor.yml +++ /dev/null @@ -1,15 +0,0 @@ -version: '{build}' -skip_branch_with_pr: true -shallow_clone: true -branches: - except: - - ___TGS3TempBranch - - ___TGSTempBranch -cache: - - C:\byond\ -> dependencies.sh, Dockerfile -build_script: - - ps: tools/appveyor/build.ps1 - - ps: "$deployPath = $env:APPVEYOR_BUILD_FOLDER + '/deploy'; bash tools/deploy.sh $deployPath" - - ps: "[System.IO.Compression.ZipFile]::CreateFromDirectory($env:APPVEYOR_BUILD_FOLDER + '/deploy', $env:APPVEYOR_BUILD_FOLDER + '/deploy.zip')" -artifacts: - - path: deploy.zip diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 520dbf87a2c..88fbb5cf48c 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -115,7 +115,7 @@ ///from obj/machinery/bsa/full/proc/fire(): () #define COMSIG_ATOM_BSA_BEAM "atom_bsa_beam_pass" #define COMSIG_ATOM_BLOCKS_BSA_BEAM (1<<0) -///from base of atom/set_light(): (l_range, l_power, l_color) +///from base of atom/set_light(): (l_range, l_power, l_color, l_on) #define COMSIG_ATOM_SET_LIGHT "atom_set_light" ///from base of atom/setDir(): (old_dir, new_dir). Called before the direction changes. #define COMSIG_ATOM_DIR_CHANGE "atom_dir_change" @@ -153,9 +153,9 @@ #define COMSIG_ATOM_SET_OPACITY "atom_set_opacity" //from base of atom/movable/on_enter_storage(): (datum/component/storage/concrete/master_storage) -#define COMISG_STORAGE_ENTERED "storage_entered" +#define COMSIG_STORAGE_ENTERED "storage_entered" //from base of atom/movable/on_exit_storage(): (datum/component/storage/concrete/master_storage) -#define CONSIG_STORAGE_EXITED "storage_exited" +#define COMSIG_STORAGE_EXITED "storage_exited" ///from base of atom/expose_reagents(): (/list, /datum/reagents, methods, volume_modifier, show_message) #define COMSIG_ATOM_EXPOSE_REAGENTS "atom_expose_reagents" @@ -211,6 +211,8 @@ #define COMPONENT_NO_MOUSEDROP (1<<0) ///from base of atom/MouseDrop_T: (/atom/from, /mob/user) #define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto" +///from base of mob/MouseWheelOn(): (/atom, delta_x, delta_y, params) +#define COMSIG_MOUSE_SCROLL_ON "mousescroll_on" // /area signals @@ -805,7 +807,11 @@ #define COMSIG_CONTAINER_TRY_ATTACH "container_try_attach" /* Attack signals. They should share the returned flags, to standardize the attack chain. */ +/// tool_act -> pre_attack -> target.attackby (item.attack) -> afterattack + ///Ends the attack chain. If sent early might cause posterior attacks not to happen. #define COMPONENT_CANCEL_ATTACK_CHAIN (1<<0) + ///Skips the specific attack step, continuing for the next one to happen. + #define COMPONENT_SKIP_ATTACK (1<<1) ///from base of atom/attack_ghost(): (mob/dead/observer/ghost) #define COMSIG_ATOM_ATTACK_GHOST "atom_attack_ghost" ///from base of atom/attack_hand(): (mob/user) diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm index 993be0c6192..60ac94e3a5f 100644 --- a/code/__DEFINES/icon_smoothing.dm +++ b/code/__DEFINES/icon_smoothing.dm @@ -61,6 +61,9 @@ DEFINE_BITFIELD(smoothing_flags, list( #define SMOOTH_GROUP_CARPET_RED S_TURF(17) ///turf/open/floor/carpet/red #define SMOOTH_GROUP_CARPET_ROYAL_BLACK S_TURF(18) ///turf/open/floor/carpet/royalblack #define SMOOTH_GROUP_CARPET_ROYAL_BLUE S_TURF(19) ///turf/open/floor/carpet/royalblue +#define SMOOTH_GROUP_CARPET_EXECUTIVE S_TURF(20) ///turf/open/floor/carpet/executive +#define SMOOTH_GROUP_CARPET_STELLAR S_TURF(21) ///turf/open/floor/carpet/stellar +#define SMOOTH_GROUP_CARPET_DONK S_TURF(22) ///turf/open/floor/carpet/donk #define SMOOTH_GROUP_CLOSED_TURFS S_TURF(24) ///turf/closed #define SMOOTH_GROUP_MATERIAL_WALLS S_TURF(25) ///turf/closed/wall/material diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 6a51b057434..c41fffdbed8 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -158,6 +158,8 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define isitem(A) (istype(A, /obj/item)) +#define isstack(A) (istype(A, /obj/item/stack)) + #define isgrenade(A) (istype(A, /obj/item/grenade)) #define islandmine(A) (istype(A, /obj/effect/mine)) diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index 0e20b6c38ca..bd7489935aa 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -4,6 +4,8 @@ #define STATIC_LIGHT 1 ///Light made by masking the lighting darkness plane. #define MOVABLE_LIGHT 2 +///Light made by masking the lighting darkness plane, and is directional. +#define MOVABLE_LIGHT_DIRECTIONAL 3 ///Is a movable light source attached to another movable (its loc), meaning that the lighting component should go one level deeper. #define LIGHT_ATTACHED (1<<0) diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index 59e431111bf..f5566c33a83 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -128,3 +128,8 @@ //these flags are used to tell the DNA modifier if a plant gene cannot be extracted or modified. #define PLANT_GENE_REMOVABLE (1<<0) #define PLANT_GENE_EXTRACTABLE (1<<1) + +//mass drivers and related machinery +#define MASSDRIVER_TOXINS "toxinsdriver" +#define MASSDRIVER_CHAPEL "chapelgun" +#define MASSDRIVER_DISPOSALS "trash" diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index 933580a03d4..36f2147fa7d 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -42,10 +42,6 @@ #define MODE_ALIEN "alientalk" #define MODE_HOLOPAD "holopad" -#define MODE_CHANGELING "changeling" -#define MODE_KEY_CHANGELING "g" -#define MODE_TOKEN_CHANGELING ":g" - #define MODE_VOCALCORDS "cords" #define MODE_KEY_VOCALCORDS "x" @@ -80,11 +76,6 @@ #define TURF_LINK(alice, turfy) "(T)" #define FOLLOW_OR_TURF_LINK(alice, bob, turfy) "(F)" -#define LINGHIVE_NONE 0 -#define LINGHIVE_OUTSIDER 1 -#define LINGHIVE_LING 2 -#define LINGHIVE_LINK 3 - //Don't set this very much higher then 1024 unless you like inviting people in to dos your server with message spam #define MAX_MESSAGE_LEN 1024 #define MAX_NAME_LEN 42 diff --git a/code/__DEFINES/vehicles.dm b/code/__DEFINES/vehicles.dm index a15c211d877..db1400abeef 100644 --- a/code/__DEFINES/vehicles.dm +++ b/code/__DEFINES/vehicles.dm @@ -4,5 +4,11 @@ #define VEHICLE_CONTROL_DRIVE 2 #define VEHICLE_CONTROL_KIDNAPPED 4 //Can't leave vehicle voluntarily, has to resist. +//Ridden vehicle flags + +#define REQUIRES_ARMS (1<<0) //Does our vehicle require hands to drive? +#define REQUIRES_LEGS (1<<1) //Does our vehicle require legs to drive? +#define UNBUCKLE_DISABLED_RIDER (1<<2) //If our rider is disabled, does he fall off? + //Car trait flags #define CAN_KIDNAP 1 diff --git a/code/__HELPERS/sanitize_values.dm b/code/__HELPERS/sanitize_values.dm index 00f6ddc5cd8..233a511e2e0 100644 --- a/code/__HELPERS/sanitize_values.dm +++ b/code/__HELPERS/sanitize_values.dm @@ -6,6 +6,13 @@ return number return default +/proc/sanitize_float(number, min=0, max=1, accuracy=1, default=0) + if(isnum(number)) + number = round(number, accuracy) + if(min <= number && number <= max) + return number + return default + /proc/sanitize_text(text, default="") if(istext(text)) return text diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index b29ea1d55fc..a32b8326298 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -894,6 +894,8 @@ GLOBAL_LIST_INIT(binary, list("0","1")) * * value - The number to convert to text. Can be positive or negative. * * unit - The base unit of the number, such as "Pa" or "W". * * maxdecimals - Maximum amount of decimals to display for the final number. Defaults to 1. + * * + * * For pressure conversion, use proc/siunit_pressure() below */ /proc/siunit(value, unit, maxdecimals=1) var/static/list/prefixes = list("f","p","n","μ","m","","k","M","G","T","P") @@ -918,6 +920,17 @@ GLOBAL_LIST_INIT(binary, list("0","1")) var/prefix = prefixes[prefix_index] return "[coefficient] [prefix][unit]" + +/** The game code never uses Pa, but kPa, since 1 Pa is too small to reasonably handle + * Thus, to ensure correct conversion from any kPa in game code, this value needs to be multiplied by 10e3 to get Pa, which the siunit() proc expects + * Args: + * * value_in_kpa - Value that should be converted to readable text in kPa + * * maxdecimals - maximum number of decimals that are displayed, defaults to 1 in proc/siunit() + */ +/proc/siunit_pressure(value_in_kpa, maxdecimals) + var/pressure_adj = value_in_kpa * 1000 //to adjust for using kPa instead of Pa + return siunit(pressure_adj, "Pa", maxdecimals) + /// Slightly expensive proc to scramble a message using equal probabilities of character replacement from a list. DOES NOT SUPPORT HTML! /proc/scramble_message_replace_chars(original, replaceprob = 25, list/replacementchars = list("$", "@", "!", "#", "%", "^", "&", "*"), replace_letters_only = FALSE, replace_whitespace = FALSE) var/list/out = list() diff --git a/code/_compile_options.dm b/code/_compile_options.dm index c782c7605bf..d50022e7d5a 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -59,11 +59,11 @@ #warn compiling in TESTING mode. testing() debug messages will be visible. #endif -#ifdef TRAVISBUILDING +#ifdef CIBUILDING #define UNIT_TESTS #endif -#ifdef TRAVISTESTING +#ifdef CITESTING #define TESTING #endif diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index d7777036821..ca3a11441f2 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -448,7 +448,7 @@ /// MouseWheelOn /mob/proc/MouseWheelOn(atom/A, delta_x, delta_y, params) - return + SEND_SIGNAL(src, COMSIG_MOUSE_SCROLL_ON, A, delta_x, delta_y, params) /mob/dead/observer/MouseWheelOn(atom/A, delta_x, delta_y, params) var/list/modifier = params2list(params) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 39d90e0e62d..df89c5b89cc 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -9,20 +9,20 @@ */ /obj/item/proc/melee_attack_chain(mob/user, atom/target, params) if(tool_behaviour && target.tool_act(user, src, tool_behaviour)) - return + return TRUE if(pre_attack(target, user, params)) - return + return TRUE if(target.attackby(src,user, params)) - return + return TRUE if(QDELETED(src) || QDELETED(target)) attack_qdeleted(target, user, TRUE, params) - return - afterattack(target, user, TRUE, params) + return TRUE + return afterattack(target, user, TRUE, params) /// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown. /obj/item/proc/attack_self(mob/user) if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SELF, user) & COMPONENT_CANCEL_ATTACK_CHAIN) - return + return TRUE interact(user) /** @@ -72,21 +72,26 @@ * * mob/living/user - The mob hitting with this item */ /obj/item/proc/attack(mob/living/M, mob/living/user) - if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, M, user) & COMPONENT_CANCEL_ATTACK_CHAIN) + var/signal_return = SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, M, user) + if(signal_return & COMPONENT_CANCEL_ATTACK_CHAIN) return TRUE + if(signal_return & COMPONENT_SKIP_ATTACK) + return + SEND_SIGNAL(user, COMSIG_MOB_ITEM_ATTACK, M, user) + if(item_flags & NOBLUDGEON) return if(force && HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, "You don't want to harm other living beings!") - return TRUE + return if(item_flags & EYE_STAB && user.zone_selected == BODY_ZONE_PRECISE_EYES) if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) M = user if(eyestab(M,user)) - return TRUE + return if(!force) playsound(loc, 'sound/weapons/tap.ogg', get_clamped_volume(), TRUE, -1) else if(hitsound) @@ -103,7 +108,6 @@ log_combat(user, M, "attacked", src.name, "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])") add_fingerprint(user) - return TRUE /// The equivalent of the standard version of [/obj/item/proc/attack] but for object targets. diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index 40841f30f04..4e4543388c8 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -14,17 +14,22 @@ SUBSYSTEM_DEF(atoms) var/list/BadInitializeCalls = list() + initialized = INITIALIZATION_INSSATOMS + /datum/controller/subsystem/atoms/Initialize(timeofday) GLOB.fire_overlay.appearance_flags = RESET_COLOR setupGenetics() //to set the mutations' sequence + initialized = INITIALIZATION_INNEW_MAPLOAD InitializeAtoms() + initialized = INITIALIZATION_INNEW_REGULAR return ..() /datum/controller/subsystem/atoms/proc/InitializeAtoms(list/atoms) if(initialized == INITIALIZATION_INSSATOMS) return + old_initialized = initialized initialized = INITIALIZATION_INNEW_MAPLOAD var/count @@ -47,7 +52,7 @@ SUBSYSTEM_DEF(atoms) testing("Initialized [count] atoms") pass(count) - initialized = INITIALIZATION_INNEW_REGULAR + initialized = old_initialized if(late_loaders.len) for(var/I in late_loaders) diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm index 730ca24e6e6..eaa960981c1 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -71,7 +71,7 @@ current_backseat = owner_backseat free_backseat = stranger_backseat - if(!free_backseat.client) //Make sure we never switch to a logged off mob. + if(!current_backseat.client) //Make sure we never switch to a logged off mob. return log_game("[key_name(current_backseat)] assumed control of [key_name(owner)] due to [src]. (Original owner: [current_controller == OWNER ? owner.key : current_backseat.key])") diff --git a/code/datums/components/empprotection.dm b/code/datums/components/empprotection.dm deleted file mode 100644 index 513370f3d5f..00000000000 --- a/code/datums/components/empprotection.dm +++ /dev/null @@ -1,13 +0,0 @@ -/datum/component/empprotection - var/flags = NONE - -/datum/component/empprotection/Initialize(_flags) - if(!istype(parent, /atom)) - return COMPONENT_INCOMPATIBLE - flags = _flags - RegisterSignal(parent, list(COMSIG_ATOM_EMP_ACT), .proc/getEmpFlags) - -/datum/component/empprotection/proc/getEmpFlags(datum/source, severity) - SIGNAL_HANDLER - - return flags diff --git a/code/datums/components/gunpoint.dm b/code/datums/components/gunpoint.dm index ac36ff1762d..5661a5b668c 100644 --- a/code/datums/components/gunpoint.dm +++ b/code/datums/components/gunpoint.dm @@ -38,7 +38,7 @@ RegisterSignal(weapon, list(COMSIG_ITEM_DROPPED, COMSIG_ITEM_EQUIPPED), .proc/cancel) shooter.visible_message("[shooter] aims [weapon] point blank at [target]!", \ - "You aim [weapon] point blank at [target]!", target) + "You aim [weapon] point blank at [target]!", ignored_mobs = target) to_chat(target, "[shooter] aims [weapon] point blank at you!") shooter.apply_status_effect(STATUS_EFFECT_HOLDUP) @@ -80,7 +80,7 @@ return var/mob/living/shooter = parent shooter.visible_message("[shooter] bumps into [target] and fumbles [shooter.p_their()] aim!", \ - "You bump into [target] and fumble your aim!", target) + "You bump into [target] and fumble your aim!", ignored_mobs = target) to_chat(target, "[shooter] bumps into you and fumbles [shooter.p_their()] aim!") qdel(src) @@ -91,7 +91,7 @@ if(T != target || shooter.a_intent == INTENT_DISARM || shooter.a_intent == INTENT_GRAB) return shooter.visible_message("[shooter] bumps into [target] and fumbles [shooter.p_their()] aim!", \ - "You bump into [target] and fumble your aim!", target) + "You bump into [target] and fumble your aim!", ignored_mobs = target) to_chat(target, "[shooter] bumps into you and fumbles [shooter.p_their()] aim!") qdel(src) @@ -130,7 +130,7 @@ if(!weapon.can_shoot() || !weapon.can_trigger_gun(shooter) || (weapon.weapon_weight == WEAPON_HEAVY && shooter.get_inactive_held_item())) shooter.visible_message("[shooter] fumbles [weapon]!", \ - "You fumble [weapon] and fail to fire at [target]!", target) + "You fumble [weapon] and fail to fire at [target]!", ignored_mobs = target) to_chat(target, "[shooter] fumbles [weapon] and fails to fire at you!") qdel(src) return @@ -159,7 +159,7 @@ var/mob/living/shooter = parent shooter.visible_message("[shooter] breaks [shooter.p_their()] aim on [target]!", \ - "You are no longer aiming [weapon] at [target].", target) + "You are no longer aiming [weapon] at [target].", ignored_mobs = target) to_chat(target, "[shooter] breaks [shooter.p_their()] aim on you!") SEND_SIGNAL(target, COMSIG_CLEAR_MOOD_EVENT, "gunpoint") qdel(src) diff --git a/code/datums/components/overlay_lighting.dm b/code/datums/components/overlay_lighting.dm index 377c4f8c9e4..bdc855a2aa3 100644 --- a/code/datums/components/overlay_lighting.dm +++ b/code/datums/components/overlay_lighting.dm @@ -5,6 +5,10 @@ #define GET_PARENT (parent_attached_to || parent) +#define GET_LIGHT_SOURCE (directional_atom || current_holder) + +#define SHORT_CAST 2 + /** * Movable atom overlay-based lighting component. * @@ -56,20 +60,35 @@ var/atom/movable/current_holder ///Movable atom the parent is attached to. For example, a flashlight into a helmet or gun. We'll need to track the thing the parent is attached to as if it were the parent itself. var/atom/movable/parent_attached_to + ///Whether we're a directional light + var/directional + ///Abstractional atom for directional light, we move this around to make the directional effect + var/obj/effect/abstract/directional_lighting/directional_atom + ///A cone overlay for directional light, it's alpha and color are dependant on the light + var/obj/effect/overlay/light_cone/cone + ///Current tracked direction for the directional cast behaviour + var/current_direction + ///Cast range for the directional cast (how far away the atom is moved) + var/cast_range = 2 - -/datum/component/overlay_lighting/Initialize(_range, _power, _color, starts_on) +/datum/component/overlay_lighting/Initialize(_range, _power, _color, starts_on, is_directional) if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE var/atom/movable/movable_parent = parent - if(movable_parent.light_system != MOVABLE_LIGHT) - stack_trace("[type] added to [parent], with [movable_parent.light_system] value for the light_system var. Use [MOVABLE_LIGHT] instead.") + if(movable_parent.light_system != MOVABLE_LIGHT && movable_parent.light_system != MOVABLE_LIGHT_DIRECTIONAL) + stack_trace("[type] added to [parent], with [movable_parent.light_system] value for the light_system var. Use [MOVABLE_LIGHT] or [MOVABLE_LIGHT_DIRECTIONAL] instead.") return COMPONENT_INCOMPATIBLE . = ..() visible_mask = new() + if(is_directional) + directional = TRUE + directional_atom = new() + cone = new() + cone.transform = cone.transform.Translate(-32, -32) + set_direction(movable_parent.dir) if(!isnull(_range)) movable_parent.set_light_range(_range) set_range(parent, movable_parent.light_range) @@ -85,6 +104,8 @@ /datum/component/overlay_lighting/RegisterWithParent() . = ..() + if(directional) + RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, .proc/on_parent_dir_change) RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/on_parent_moved) RegisterSignal(parent, COMSIG_ATOM_SET_LIGHT_RANGE, .proc/set_range) RegisterSignal(parent, COMSIG_ATOM_SET_LIGHT_POWER, .proc/set_power) @@ -113,6 +134,8 @@ COMSIG_ATOM_SET_LIGHT_ON, COMSIG_ATOM_SET_LIGHT_FLAGS, )) + if(directional) + UnregisterSignal(parent, COMSIG_ATOM_DIR_CHANGE) if(overlay_lighting_flags & LIGHTING_ON) turn_off() return ..() @@ -123,6 +146,9 @@ set_holder(null) clean_old_turfs() QDEL_NULL(visible_mask) + if(directional) + QDEL_NULL(directional_atom) + QDEL_NULL(cone) return ..() @@ -138,7 +164,8 @@ /datum/component/overlay_lighting/proc/get_new_turfs() if(!current_holder) return - for(var/turf/lit_turf in view(lumcount_range, get_turf(current_holder))) + var/atom/movable/light_source = GET_LIGHT_SOURCE + for(var/turf/lit_turf in view(lumcount_range, get_turf(light_source))) lit_turf.dynamic_lumcount += lum_power LAZYADD(affected_turfs, lit_turf) @@ -148,22 +175,29 @@ clean_old_turfs() if(!isturf(current_holder?.loc)) return + if(directional) + cast_directional_light() get_new_turfs() ///Adds the luminosity and source for the afected movable atoms to keep track of their visibility. -/datum/component/overlay_lighting/proc/add_dynamic_lumi(atom/movable/affected_movable) - LAZYSET(affected_movable.affected_dynamic_lights, src, lumcount_range + 1) - affected_movable.vis_contents += visible_mask - affected_movable.update_dynamic_luminosity() - +/datum/component/overlay_lighting/proc/add_dynamic_lumi() + var/atom/movable/light_source = GET_LIGHT_SOURCE + LAZYSET(light_source.affected_dynamic_lights, src, lumcount_range + 1) + light_source.vis_contents += visible_mask + light_source.update_dynamic_luminosity() + if(directional) + current_holder.vis_contents += cone ///Removes the luminosity and source for the afected movable atoms to keep track of their visibility. -/datum/component/overlay_lighting/proc/remove_dynamic_lumi(atom/movable/affected_movable) - LAZYREMOVE(affected_movable.affected_dynamic_lights, src) - affected_movable.vis_contents -= visible_mask - affected_movable.update_dynamic_luminosity() - +/datum/component/overlay_lighting/proc/remove_dynamic_lumi() + var/atom/movable/light_source = GET_LIGHT_SOURCE + LAZYREMOVE(light_source.affected_dynamic_lights, src) + light_source.vis_contents -= visible_mask + light_source.update_dynamic_luminosity() + if(directional) + current_holder.vis_contents -= cone + directional_atom.moveToNullspace() ///Called to change the value of parent_attached_to. /datum/component/overlay_lighting/proc/set_parent_attached_to(atom/movable/new_parent_attached_to) @@ -192,17 +226,22 @@ if(current_holder) if(current_holder != parent && current_holder != parent_attached_to) UnregisterSignal(current_holder, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_MOVED)) + if(directional) + UnregisterSignal(current_holder, COMSIG_ATOM_DIR_CHANGE) if(overlay_lighting_flags & LIGHTING_ON) - remove_dynamic_lumi(current_holder) + remove_dynamic_lumi() current_holder = new_holder if(new_holder == null) clean_old_turfs() return - if(overlay_lighting_flags & LIGHTING_ON) - add_dynamic_lumi(new_holder) if(new_holder != parent && new_holder != parent_attached_to) RegisterSignal(new_holder, COMSIG_PARENT_QDELETING, .proc/on_holder_qdel) RegisterSignal(new_holder, COMSIG_MOVABLE_MOVED, .proc/on_holder_moved) + if(directional) + RegisterSignal(new_holder, COMSIG_ATOM_DIR_CHANGE, .proc/on_holder_dir_change) + if(overlay_lighting_flags & LIGHTING_ON) + make_luminosity_update() + add_dynamic_lumi() ///Used to determine the new valid current_holder from the parent's loc. @@ -225,6 +264,8 @@ /datum/component/overlay_lighting/proc/on_holder_qdel(atom/movable/source, force) SIGNAL_HANDLER UnregisterSignal(current_holder, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_MOVED)) + if(directional) + UnregisterSignal(current_holder, COMSIG_ATOM_DIR_CHANGE) set_holder(null) @@ -252,6 +293,8 @@ /datum/component/overlay_lighting/proc/on_parent_attached_to_qdel(atom/movable/source, force) SIGNAL_HANDLER UnregisterSignal(parent_attached_to, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_MOVED)) + if(directional) + UnregisterSignal(parent_attached_to, COMSIG_ATOM_DIR_CHANGE) if(parent_attached_to == current_holder) set_holder(null) set_parent_attached_to(null) @@ -284,6 +327,8 @@ var/matrix/transform = new transform.Translate(-offset, -offset) visible_mask.transform = transform + if(directional) + cast_range = clamp(round(new_range * 0.5), 1, 3) if(overlay_lighting_flags & LIGHTING_ON) make_luminosity_update() @@ -294,12 +339,16 @@ set_lum_power(new_power >= 0 ? 0.5 : -0.5) set_alpha = min(230, (abs(new_power) * 120) + 30) visible_mask.alpha = set_alpha + if(directional) + cone.alpha = min(200, (abs(new_power) * 90)+20) ///Changes the light's color, pretty straightforward. /datum/component/overlay_lighting/proc/set_color(atom/source, new_color) SIGNAL_HANDLER visible_mask.color = new_color + if(directional) + cone.color = new_color ///Toggles the light on and off. @@ -330,7 +379,9 @@ if(overlay_lighting_flags & LIGHTING_ON) return if(current_holder) - add_dynamic_lumi(current_holder) + if(directional) + cast_directional_light() + add_dynamic_lumi() overlay_lighting_flags |= LIGHTING_ON get_new_turfs() @@ -340,7 +391,7 @@ if(!(overlay_lighting_flags & LIGHTING_ON)) return if(current_holder) - remove_dynamic_lumi(current_holder) + remove_dynamic_lumi() overlay_lighting_flags &= ~LIGHTING_ON clean_old_turfs() @@ -356,7 +407,43 @@ var/turf/lit_turf = t lit_turf.dynamic_lumcount -= difference +///Here we append the behavior associated to changing lum_power. +/datum/component/overlay_lighting/proc/cast_directional_light() + var/final_distance = cast_range + //Lower the distance by 1 if we're not looking at a cardinal direction, and we're not a short cast + if(final_distance > SHORT_CAST && !(ALL_CARDINALS & current_direction)) + final_distance -= 1 + var/turf/scanning = get_turf(current_holder) + for(var/i in 1 to final_distance) + var/turf/next_turf = get_step(scanning, current_direction) + if(isnull(next_turf) || IS_OPAQUE_TURF(next_turf)) + break + scanning = next_turf + directional_atom.forceMove(scanning) + +///Called when current_holder changes loc. +/datum/component/overlay_lighting/proc/on_holder_dir_change(atom/movable/source, olddir, newdir) + SIGNAL_HANDLER + set_direction(newdir) + +///Called when parent changes loc. +/datum/component/overlay_lighting/proc/on_parent_dir_change(atom/movable/source, olddir, newdir) + SIGNAL_HANDLER + set_direction(newdir) + +///Sets a new direction for the directional cast, then updates luminosity +/datum/component/overlay_lighting/proc/set_direction(newdir) + if(!newdir) + return + if(current_direction == newdir) + return + current_direction = newdir + cone.setDir(newdir) + if(overlay_lighting_flags & LIGHTING_ON) + make_luminosity_update() #undef LIGHTING_ON #undef LIGHTING_ATTACHED #undef GET_PARENT +#undef GET_LIGHT_SOURCE +#undef SHORT_CAST diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm index e8944d1b89b..b81dacb290a 100644 --- a/code/datums/components/riding.dm +++ b/code/datums/components/riding.dm @@ -198,8 +198,8 @@ //BUCKLE HOOKS /datum/component/riding/proc/restore_position(mob/living/buckled_mob) if(buckled_mob) - buckled_mob.pixel_x = 0 - buckled_mob.pixel_y = 0 + buckled_mob.pixel_x = buckled_mob.base_pixel_x + buckled_mob.pixel_y = buckled_mob.base_pixel_y if(buckled_mob.client) buckled_mob.client.view_size.resetToDefault() diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index a48568975c3..7fa10a52a52 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -163,7 +163,7 @@ switch(roll) if(-INFINITY to -5) - user.visible_message("[user] botches [user.p_their()] [tackle_word] and slams [user.p_their()] head into [target], knocking [user.p_them()]self silly!", "You botch your [tackle_word] and slam your head into [target], knocking yourself silly!", target) + user.visible_message("[user] botches [user.p_their()] [tackle_word] and slams [user.p_their()] head into [target], knocking [user.p_them()]self silly!", "You botch your [tackle_word] and slam your head into [target], knocking yourself silly!", ignored_mobs = target) to_chat(target, "[user] botches [user.p_their()] [tackle_word] and slams [user.p_their()] head into you, knocking [user.p_them()]self silly!") user.Paralyze(30) @@ -173,7 +173,7 @@ user.gain_trauma(/datum/brain_trauma/mild/concussion) if(-4 to -2) // glancing blow at best - user.visible_message("[user] lands a weak [tackle_word] on [target], briefly knocking [target.p_them()] off-balance!", "You land a weak [tackle_word] on [target], briefly knocking [target.p_them()] off-balance!", target) + user.visible_message("[user] lands a weak [tackle_word] on [target], briefly knocking [target.p_them()] off-balance!", "You land a weak [tackle_word] on [target], briefly knocking [target.p_them()] off-balance!", ignored_mobs = target) to_chat(target, "[user] lands a weak [tackle_word] on you, briefly knocking you off-balance!") user.Knockdown(30) @@ -182,7 +182,7 @@ addtimer(CALLBACK(T, /mob/living/carbon/proc/clear_shove_slowdown), SHOVE_SLOWDOWN_LENGTH * 2) if(-1 to 0) // decent hit, both parties are about equally inconvenienced - user.visible_message("[user] lands a passable [tackle_word] on [target], sending them both tumbling!", "You land a passable [tackle_word] on [target], sending you both tumbling!", target) + user.visible_message("[user] lands a passable [tackle_word] on [target], sending them both tumbling!", "You land a passable [tackle_word] on [target], sending you both tumbling!", ignored_mobs = target) to_chat(target, "[user] lands a passable [tackle_word] on you, sending you both tumbling!") target.adjustStaminaLoss(stamina_cost) @@ -191,7 +191,7 @@ target.Knockdown(25) if(1 to 2) // solid hit, tackler has a slight advantage - user.visible_message("[user] lands a solid [tackle_word] on [target], knocking them both down hard!", "You land a solid [tackle_word] on [target], knocking you both down hard!", target) + user.visible_message("[user] lands a solid [tackle_word] on [target], knocking them both down hard!", "You land a solid [tackle_word] on [target], knocking you both down hard!", ignored_mobs = target) to_chat(target, "[user] lands a solid [tackle_word] on you, knocking you both down hard!") target.adjustStaminaLoss(30) @@ -200,7 +200,7 @@ target.Knockdown(20) if(3 to 4) // really good hit, the target is definitely worse off here. Without positive modifiers, this is as good a tackle as you can land - user.visible_message("[user] lands an expert [tackle_word] on [target], knocking [target.p_them()] down hard while landing on [user.p_their()] feet with a passive grip!", "You land an expert [tackle_word] on [target], knocking [target.p_them()] down hard while landing on your feet with a passive grip!", target) + user.visible_message("[user] lands an expert [tackle_word] on [target], knocking [target.p_them()] down hard while landing on [user.p_their()] feet with a passive grip!", "You land an expert [tackle_word] on [target], knocking [target.p_them()] down hard while landing on your feet with a passive grip!", ignored_mobs = target) to_chat(target, "[user] lands an expert [tackle_word] on you, knocking you down hard and maintaining a passive grab!") user.SetKnockdown(0) @@ -214,7 +214,7 @@ S.setGrabState(GRAB_PASSIVE) if(5 to INFINITY) // absolutely BODIED - user.visible_message("[user] lands a monster [tackle_word] on [target], knocking [target.p_them()] senseless and applying an aggressive pin!", "You land a monster [tackle_word] on [target], knocking [target.p_them()] senseless and applying an aggressive pin!", target) + user.visible_message("[user] lands a monster [tackle_word] on [target], knocking [target.p_them()] senseless and applying an aggressive pin!", "You land a monster [tackle_word] on [target], knocking [target.p_them()] senseless and applying an aggressive pin!", ignored_mobs = target) to_chat(target, "[user] lands a monster [tackle_word] on you, knocking you senseless and aggressively pinning you!") user.SetKnockdown(0) diff --git a/code/datums/elements/empprotection.dm b/code/datums/elements/empprotection.dm new file mode 100644 index 00000000000..5a924057658 --- /dev/null +++ b/code/datums/elements/empprotection.dm @@ -0,0 +1,20 @@ +/datum/element/empprotection + element_flags = ELEMENT_DETACH | ELEMENT_BESPOKE + id_arg_index = 2 + var/flags = NONE + +/datum/element/empprotection/Attach(datum/target, _flags) + . = ..() + if(. == ELEMENT_INCOMPATIBLE || !isatom(target)) + return ELEMENT_INCOMPATIBLE + flags = _flags + RegisterSignal(target, COMSIG_ATOM_EMP_ACT, .proc/getEmpFlags) + +/datum/element/empprotection/Detach(atom/target) + UnregisterSignal(target, COMSIG_ATOM_EMP_ACT) + return ..() + +/datum/element/empprotection/proc/getEmpFlags(datum/source, severity) + SIGNAL_HANDLER + + return flags diff --git a/code/datums/components/rad_insulation.dm b/code/datums/elements/rad_insulation.dm similarity index 50% rename from code/datums/components/rad_insulation.dm rename to code/datums/elements/rad_insulation.dm index e46173a2815..e1dd57a9c18 100644 --- a/code/datums/components/rad_insulation.dm +++ b/code/datums/elements/rad_insulation.dm @@ -1,30 +1,33 @@ -/datum/component/rad_insulation +/datum/element/rad_insulation + element_flags = ELEMENT_DETACH | ELEMENT_BESPOKE + id_arg_index = 2 var/amount // Multiplier for radiation strength passing through -/datum/component/rad_insulation/Initialize(_amount=RAD_MEDIUM_INSULATION, protects=TRUE, contamination_proof=TRUE) - if(!isatom(parent)) +/datum/element/rad_insulation/Attach(datum/target, _amount=RAD_MEDIUM_INSULATION, protects=TRUE, contamination_proof=TRUE) + . = ..() + if(!isatom(target)) return COMPONENT_INCOMPATIBLE if(protects) // Does this protect things in its contents from being affected? - RegisterSignal(parent, COMSIG_ATOM_RAD_PROBE, .proc/rad_probe_react) + RegisterSignal(target, COMSIG_ATOM_RAD_PROBE, .proc/rad_probe_react) if(contamination_proof) // Can this object be contaminated? - RegisterSignal(parent, COMSIG_ATOM_RAD_CONTAMINATING, .proc/rad_contaminating) + RegisterSignal(target, COMSIG_ATOM_RAD_CONTAMINATING, .proc/rad_contaminating) if(_amount != 1) // If it's 1 it won't have any impact on radiation passing through anyway - RegisterSignal(parent, COMSIG_ATOM_RAD_WAVE_PASSING, .proc/rad_pass) + RegisterSignal(target, COMSIG_ATOM_RAD_WAVE_PASSING, .proc/rad_pass) amount = _amount -/datum/component/rad_insulation/proc/rad_probe_react(datum/source) +/datum/element/rad_insulation/proc/rad_probe_react(datum/source) SIGNAL_HANDLER return COMPONENT_BLOCK_RADIATION -/datum/component/rad_insulation/proc/rad_contaminating(datum/source, strength) +/datum/element/rad_insulation/proc/rad_contaminating(datum/source, strength) SIGNAL_HANDLER return COMPONENT_BLOCK_CONTAMINATION -/datum/component/rad_insulation/proc/rad_pass(datum/source, datum/radiation_wave/wave, width) +/datum/element/rad_insulation/proc/rad_pass(datum/source, datum/radiation_wave/wave, width) SIGNAL_HANDLER wave.intensity = wave.intensity*(1-((1-amount)/width)) // The further out the rad wave goes the less it's affected by insulation (larger width) diff --git a/code/datums/map_config.dm b/code/datums/map_config.dm index c0df89b1576..6fab47eed12 100644 --- a/code/datums/map_config.dm +++ b/code/datums/map_config.dm @@ -139,8 +139,8 @@ allow_custom_shuttles = json["allow_custom_shuttles"] != FALSE - if ("jobs_changes" in json) - if(!islist(json["jobs_changes"])) + if ("job_changes" in json) + if(!islist(json["job_changes"])) log_world("map_config \"job_changes\" field is missing or invalid!") return job_changes = json["job_changes"] diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm index 04c7bc91aed..8f7b341282d 100644 --- a/code/datums/martial/wrestling.dm +++ b/code/datums/martial/wrestling.dm @@ -243,35 +243,35 @@ if (get_dist(A, D) > 1) to_chat(A, "[D] is too far away!") - A.pixel_x = 0 - A.pixel_y = 0 - D.pixel_x = 0 - D.pixel_y = 0 + A.pixel_x = A.base_pixel_x + A.pixel_y = A.base_pixel_y + D.pixel_x = D.base_pixel_x + D.pixel_y = D.base_pixel_y return if (!isturf(A.loc) || !isturf(D.loc)) to_chat(A, "You can't slam [D] here!") - A.pixel_x = 0 - A.pixel_y = 0 - D.pixel_x = 0 - D.pixel_y = 0 + A.pixel_x = A.base_pixel_x + A.pixel_y = A.base_pixel_y + D.pixel_x = D.base_pixel_x + D.pixel_y = D.base_pixel_y return else if (A) - A.pixel_x = 0 - A.pixel_y = 0 + A.pixel_x = A.base_pixel_x + A.pixel_y = A.base_pixel_y if (D) - D.pixel_x = 0 - D.pixel_y = 0 + D.pixel_x = D.base_pixel_x + D.pixel_y = D.base_pixel_y return sleep(1) if (A && D) - A.pixel_x = 0 - A.pixel_y = 0 - D.pixel_x = 0 - D.pixel_y = 0 + A.pixel_x = A.base_pixel_x + A.pixel_y = A.base_pixel_y + D.pixel_x = D.base_pixel_x + D.pixel_y = D.base_pixel_y if (get_dist(A, D) > 1) to_chat(A, "[D] is too far away!") @@ -310,11 +310,11 @@ else if (A) - A.pixel_x = 0 - A.pixel_y = 0 + A.pixel_x = A.base_pixel_x + A.pixel_y = A.base_pixel_y if (D) - D.pixel_x = 0 - D.pixel_y = 0 + D.pixel_x = D.base_pixel_x + D.pixel_y = D.base_pixel_y log_combat(A, D, "body-slammed") @@ -386,7 +386,7 @@ A.forceMove(ST) A.visible_message("[A] climbs onto [surface]!", \ "You climb onto [surface]!") - A.pixel_y = 10 + A.pixel_y = A.base_pixel_y + 10 falling = 1 sleep(10) @@ -394,7 +394,7 @@ // These are necessary because of the sleep call. if ((falling == 0 && get_dist(A, D) > 1) || (falling == 1 && get_dist(A, D) > 2)) // We climbed onto stuff. - A.pixel_y = 0 + A.pixel_y = A.base_pixel_y if (falling == 1) A.visible_message("...and dives head-first into the ground, ouch!", \ "...and dive head-first into the ground, ouch!") @@ -404,7 +404,7 @@ return if (!isturf(A.loc) || !isturf(D.loc)) - A.pixel_y = 0 + A.pixel_y = A.base_pixel_y to_chat(A, "You can't drop onto [D] from here!") return @@ -432,11 +432,11 @@ D.Paralyze(40) - A.pixel_y = 0 + A.pixel_y = A.base_pixel_y else if (A) - A.pixel_y = 0 + A.pixel_y = A.base_pixel_y log_combat(A, D, "leg-dropped") return diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 76385e63ea5..3796b6a5435 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -44,7 +44,6 @@ var/list/spell_list = list() // Wizard mode & "Give Spell" badmin button. - var/linglink var/datum/martial_art/martial_art var/static/default_martial_art = new/datum/martial_art var/miming = FALSE // Mime's vow of silence diff --git a/code/datums/saymode.dm b/code/datums/saymode.dm index 3e7c6dc9018..46d978c2826 100644 --- a/code/datums/saymode.dm +++ b/code/datums/saymode.dm @@ -9,59 +9,6 @@ /datum/saymode/proc/handle_message(mob/living/user, message, datum/language/language) return TRUE - -/datum/saymode/changeling - key = MODE_KEY_CHANGELING - mode = MODE_CHANGELING - -/datum/saymode/changeling/handle_message(mob/living/user, message, datum/language/language) - switch(user.lingcheck()) - if(LINGHIVE_LINK) - var/msg = "[user.mind]: [message]" - for(var/_M in GLOB.player_list) - var/mob/M = _M - if(M in GLOB.dead_mob_list) - var/link = FOLLOW_LINK(M, user) - to_chat(M, "[link] [msg]") - else - switch(M.lingcheck()) - if (LINGHIVE_LING) - var/mob/living/L = M - if (!HAS_TRAIT(L, CHANGELING_HIVEMIND_MUTE)) - to_chat(M, msg) - if(LINGHIVE_LINK) - to_chat(M, msg) - if(LINGHIVE_OUTSIDER) - if(prob(40)) - to_chat(M, "We can faintly sense an outsider trying to communicate through the hivemind...") - if(LINGHIVE_LING) - if (HAS_TRAIT(user, CHANGELING_HIVEMIND_MUTE)) - to_chat(user, "The poison in the air hinders our ability to interact with the hivemind.") - return FALSE - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) - var/msg = "[changeling.changelingID]: [message]" - user.log_talk(message, LOG_SAY, tag="changeling [changeling.changelingID]") - for(var/_M in GLOB.player_list) - var/mob/M = _M - if(M in GLOB.dead_mob_list) - var/link = FOLLOW_LINK(M, user) - to_chat(M, "[link] [msg]") - else - switch(M.lingcheck()) - if(LINGHIVE_LINK) - to_chat(M, msg) - if(LINGHIVE_LING) - var/mob/living/L = M - if (!HAS_TRAIT(L, CHANGELING_HIVEMIND_MUTE)) - to_chat(M, msg) - if(LINGHIVE_OUTSIDER) - if(prob(40)) - to_chat(M, "We can faintly sense another of our kind trying to communicate through the hivemind...") - if(LINGHIVE_OUTSIDER) - to_chat(user, "Our senses have not evolved enough to be able to communicate this way...") - return FALSE - - /datum/saymode/xeno key = "a" mode = MODE_ALIEN diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index cbf7f369160..34f0a5a55c9 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -228,6 +228,10 @@ return ADD_TRAIT(owner, TRAIT_IMMOBILIZED, TRAIT_STATUS_EFFECT(id)) ADD_TRAIT(owner, TRAIT_HANDS_BLOCKED, TRAIT_STATUS_EFFECT(id)) + owner.add_filter("stasis_status_ripple", 2, list("type" = "ripple", "flags" = WAVE_BOUNDED, "radius" = 0, "size" = 2)) + var/filter = owner.get_filter("stasis_status_ripple") + animate(filter, radius = 32, time = 15, size = 0, loop = -1) + /datum/status_effect/grouped/stasis/tick() update_time_of_death() @@ -235,6 +239,7 @@ /datum/status_effect/grouped/stasis/on_remove() REMOVE_TRAIT(owner, TRAIT_IMMOBILIZED, TRAIT_STATUS_EFFECT(id)) REMOVE_TRAIT(owner, TRAIT_HANDS_BLOCKED, TRAIT_STATUS_EFFECT(id)) + owner.remove_filter("stasis_status_ripple") update_time_of_death() return ..() diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index 94da7b045d9..c34b9b8949f 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -179,37 +179,6 @@ return eyes.Insert(H) //refresh their eyesight and vision -/datum/quirk/photographer - name = "Photographer" - desc = "You carry your camera and personal photo album everywhere you go and can snap photos faster." - value = 1 - mob_trait = TRAIT_PHOTOGRAPHER - gain_text = "You know everything about photography." - lose_text = "You forget how photo cameras work." - medical_record_text = "Patient mentions photography as a stress-relieving hobby." - -/datum/quirk/photographer/on_spawn() - var/mob/living/carbon/human/H = quirk_holder - var/obj/item/storage/photo_album/photo_album = new(get_turf(H)) - var/list/album_slots = list ( - "backpack" = ITEM_SLOT_BACKPACK, - "hands" = ITEM_SLOT_HANDS - ) - H.equip_in_one_of_slots(photo_album, album_slots , qdel_on_fail = TRUE) - photo_album.persistence_id = "personal_[H.mind.key]" // this is a persistent album, the ID is tied to the account's key to avoid tampering - photo_album.persistence_load() - photo_album.name = "[H.real_name]'s photo album" - var/obj/item/camera/camera = new(get_turf(H)) - var/list/camera_slots = list ( - "neck" = ITEM_SLOT_NECK, - "left pocket" = ITEM_SLOT_LPOCKET, - "right pocket" = ITEM_SLOT_RPOCKET, - "backpack" = ITEM_SLOT_BACKPACK, - "hands" = ITEM_SLOT_HANDS - ) - H.equip_in_one_of_slots(camera, camera_slots , qdel_on_fail = TRUE) - H.regenerate_icons() - /datum/quirk/selfaware name = "Self-Aware" desc = "You know your body well, and can accurately assess the extent of your wounds." diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index b3f3eef2d94..579c78b0de1 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -159,7 +159,7 @@ if("Chaplain") heirloom_type = pick(/obj/item/toy/windup_toolbox, /obj/item/reagent_containers/food/drinks/bottle/holywater) if("Assistant") - heirloom_type = /obj/item/storage/toolbox/mechanical/old/heirloom + heirloom_type = pick(/obj/item/storage/toolbox/mechanical/old/heirloom, /obj/item/clothing/gloves/cut/heirloom) //Security/Command if("Captain") heirloom_type = /obj/item/reagent_containers/food/drinks/flask/gold diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index 94db88f2bcf..ab311bd36ff 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -268,3 +268,33 @@ /datum/quirk/tongue_tied/post_add() to_chat(quirk_holder, "Because you speak with your hands, having them full hinders your ability to communicate!") +/datum/quirk/photographer + name = "Photographer" + desc = "You carry your camera and personal photo album everywhere you go, and your scrapbooks are legendary among your coworkers." + value = 0 + mob_trait = TRAIT_PHOTOGRAPHER + gain_text = "You know everything about photography." + lose_text = "You forget how photo cameras work." + medical_record_text = "Patient mentions photography as a stress-relieving hobby." + +/datum/quirk/photographer/on_spawn() + var/mob/living/carbon/human/H = quirk_holder + var/obj/item/storage/photo_album/photo_album = new(get_turf(H)) + var/list/album_slots = list ( + "backpack" = ITEM_SLOT_BACKPACK, + "hands" = ITEM_SLOT_HANDS + ) + H.equip_in_one_of_slots(photo_album, album_slots , qdel_on_fail = TRUE) + photo_album.persistence_id = "personal_[H.mind.key]" // this is a persistent album, the ID is tied to the account's key to avoid tampering + photo_album.persistence_load() + photo_album.name = "[H.real_name]'s photo album" + var/obj/item/camera/camera = new(get_turf(H)) + var/list/camera_slots = list ( + "neck" = ITEM_SLOT_NECK, + "left pocket" = ITEM_SLOT_LPOCKET, + "right pocket" = ITEM_SLOT_RPOCKET, + "backpack" = ITEM_SLOT_BACKPACK, + "hands" = ITEM_SLOT_HANDS + ) + H.equip_in_one_of_slots(camera, camera_slots , qdel_on_fail = TRUE) + H.regenerate_icons() diff --git a/code/datums/wounds/scars/_scars.dm b/code/datums/wounds/scars/_scars.dm index d51554339c3..692a7aa7f40 100644 --- a/code/datums/wounds/scars/_scars.dm +++ b/code/datums/wounds/scars/_scars.dm @@ -158,5 +158,5 @@ /// Used to format a scar to save in preferences for persistent scars /datum/scar/proc/format_amputated(body_zone) - description = pick_list(FLESH_SCAR_FILE, "dismemberment") + description = pick_list(FLESH_SCAR_FILE, "dismember") return "[SCAR_CURRENT_VERSION]|[body_zone]|[description]|amputated|[WOUND_SEVERITY_LOSS]|[BIO_FLESH_BONE]|[persistent_character_slot]" diff --git a/code/game/atoms.dm b/code/game/atoms.dm index aa2fdfe08c1..b216005beb4 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -120,6 +120,10 @@ /// A luminescence-shifted value of the last color calculated for chatmessage overlays var/chat_color_darkened + ///Default pixel x shifting for the atom's icon. + var/base_pixel_x = 0 + ///Default pixel y shifting for the atom's icon. + var/base_pixel_y = 0 ///Used for changing icon states for different base sprites. var/base_icon_state @@ -1051,6 +1055,12 @@ if(NAMEOF(src, opacity)) set_opacity(var_value) . = TRUE + if(NAMEOF(src, base_pixel_x)) + set_base_pixel_x(var_value) + . = TRUE + if(NAMEOF(src, base_pixel_y)) + set_base_pixel_y(var_value) + . = TRUE if(!isnull(.)) datum_flags |= DF_VAR_EDITED @@ -1258,14 +1268,14 @@ /atom/proc/StartProcessingAtom(mob/living/user, obj/item/I, list/chosen_option) - to_chat(user, "You start working on [src]") + to_chat(user, "You start working on [src].") if(I.use_tool(src, user, chosen_option[TOOL_PROCESSING_TIME], volume=50)) var/atom/atom_to_create = chosen_option[TOOL_PROCESSING_RESULT] for(var/i = 1 to chosen_option[TOOL_PROCESSING_AMOUNT]) - var/atom/created_atom = new atom_to_create(loc) + var/atom/created_atom = new atom_to_create(drop_location()) SEND_SIGNAL(created_atom, COMSIG_ATOM_CREATEDBY_PROCESSING, src, chosen_option) created_atom.OnCreatedFromProcessing(user, I, chosen_option, src) - to_chat(user, "You manage to create [chosen_option[TOOL_PROCESSING_AMOUNT]] [initial(atom_to_create.name)] from [src]") + to_chat(user, "You manage to create [chosen_option[TOOL_PROCESSING_AMOUNT]] [initial(atom_to_create.name)]\s from [src].") qdel(src) return @@ -1500,6 +1510,27 @@ custom_materials = SSmaterials.FindOrCreateMaterialCombo(materials, multiplier) + +///Setter for the `base_pixel_x` variable to append behavior related to its changing. +/atom/proc/set_base_pixel_x(new_value) + if(base_pixel_x == new_value) + return + . = base_pixel_x + base_pixel_x = new_value + + pixel_x = pixel_x + base_pixel_x - . + + +///Setter for the `base_pixel_y` variable to append behavior related to its changing. +/atom/proc/set_base_pixel_y(new_value) + if(base_pixel_y == new_value) + return + . = base_pixel_y + base_pixel_y = new_value + + pixel_y = pixel_y + base_pixel_y - . + + /**Returns the material composition of the atom. * * Used when recycling items, specifically to turn alloys back into their component mats. diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 6a9f17fb13e..ff14734ffb3 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -72,8 +72,11 @@ vis_contents += em_block if(opacity) AddElement(/datum/element/light_blocking) - if(light_system == MOVABLE_LIGHT) - AddComponent(/datum/component/overlay_lighting) + switch(light_system) + if(MOVABLE_LIGHT) + AddComponent(/datum/component/overlay_lighting) + if(MOVABLE_LIGHT_DIRECTIONAL) + AddComponent(/datum/component/overlay_lighting, is_directional = TRUE) /atom/movable/Destroy(force) @@ -788,11 +791,11 @@ /// called when this atom is removed from a storage item, which is passed on as S. The loc variable is already set to the new destination before this is called. /atom/movable/proc/on_exit_storage(datum/component/storage/concrete/master_storage) - SEND_SIGNAL(src, CONSIG_STORAGE_EXITED, master_storage) + SEND_SIGNAL(src, COMSIG_STORAGE_EXITED, master_storage) /// called when this atom is added into a storage item, which is passed on as S. The loc variable is already set to the storage item. /atom/movable/proc/on_enter_storage(datum/component/storage/concrete/master_storage) - SEND_SIGNAL(src, COMISG_STORAGE_ENTERED, master_storage) + SEND_SIGNAL(src, COMSIG_STORAGE_ENTERED, master_storage) /atom/movable/proc/get_spacemove_backup() var/atom/movable/dense_object_backup @@ -909,7 +912,7 @@ animate(src, pixel_y = pixel_y - 2, time = 10, loop = -1) setMovetype(movement_type | FLOATING) else if (!on && (movement_type & FLOATING)) - animate(src, pixel_y = initial(pixel_y), time = 10) + animate(src, pixel_y = base_pixel_y, time = 10) setMovetype(movement_type & ~FLOATING) @@ -1051,21 +1054,21 @@ I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA var/turf/T = get_turf(src) var/direction - var/to_x = 0 - var/to_y = 0 + var/to_x = target.base_pixel_x + var/to_y = target.base_pixel_y if(!QDELETED(T) && !QDELETED(target)) direction = get_dir(T, target) if(direction & NORTH) - to_y = 32 + to_y += 32 else if(direction & SOUTH) - to_y = -32 + to_y -= 32 if(direction & EAST) - to_x = 32 + to_x += 32 else if(direction & WEST) - to_x = -32 + to_x -= 32 if(!direction) - to_y = 16 + to_y += 16 flick_overlay(I, GLOB.clients, 6) var/matrix/M = new M.Turn(pick(-30, 30)) diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 91898b500b0..3bb353b4a52 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -1,8 +1,6 @@ -GLOBAL_LIST_INIT(possible_changeling_IDs, list("Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega")) GLOBAL_LIST_INIT(slots, list("head", "wear_mask", "back", "wear_suit", "w_uniform", "shoes", "belt", "gloves", "glasses", "ears", "wear_id", "s_store")) GLOBAL_LIST_INIT(slot2slot, list("head" = ITEM_SLOT_HEAD, "wear_mask" = ITEM_SLOT_MASK, "neck" = ITEM_SLOT_NECK, "back" = ITEM_SLOT_BACK, "wear_suit" = ITEM_SLOT_OCLOTHING, "w_uniform" = ITEM_SLOT_ICLOTHING, "shoes" = ITEM_SLOT_FEET, "belt" = ITEM_SLOT_BELT, "gloves" = ITEM_SLOT_GLOVES, "glasses" = ITEM_SLOT_EYES, "ears" = ITEM_SLOT_EARS, "wear_id" = ITEM_SLOT_ID, "s_store" = ITEM_SLOT_SUITSTORE)) GLOBAL_LIST_INIT(slot2type, list("head" = /obj/item/clothing/head/changeling, "wear_mask" = /obj/item/clothing/mask/changeling, "back" = /obj/item/changeling, "wear_suit" = /obj/item/clothing/suit/changeling, "w_uniform" = /obj/item/clothing/under/changeling, "shoes" = /obj/item/clothing/shoes/changeling, "belt" = /obj/item/changeling, "gloves" = /obj/item/clothing/gloves/changeling, "glasses" = /obj/item/clothing/glasses/changeling, "ears" = /obj/item/changeling, "wear_id" = /obj/item/changeling, "s_store" = /obj/item/changeling)) -GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our this objective to all lings /datum/game_mode/changeling @@ -15,7 +13,7 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th protected_jobs = list("Prisoner", "Security Officer", "Warden", "Detective", "Head of Security", "Captain") required_players = 15 required_enemies = 1 - recommended_enemies = 4 + recommended_enemies = 3 reroll_friendly = 1 announce_span = "green" @@ -58,23 +56,9 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th return FALSE /datum/game_mode/changeling/post_setup() - //Decide if it's ok for the lings to have a team objective - //And then set it up to be handed out in forge_changeling_objectives - var/list/team_objectives = subtypesof(/datum/objective/changeling_team_objective) - var/list/possible_team_objectives = list() - for(var/T in team_objectives) - var/datum/objective/changeling_team_objective/CTO = T - - if(changelings.len >= initial(CTO.min_lings)) - possible_team_objectives += T - - if(possible_team_objectives.len && prob(20*changelings.len)) - GLOB.changeling_team_objective_type = pick(possible_team_objectives) - for(var/datum/mind/changeling in changelings) log_game("[key_name(changeling)] has been selected as a changeling") var/datum/antagonist/changeling/new_antag = new() - new_antag.team_mode = TRUE changeling.add_antag_datum(new_antag) GLOB.pre_setup_antags -= changeling ..() diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index 0acce67823b..82d741ce903 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -109,7 +109,6 @@ scaling_cost = 15 requirements = list(70,70,60,50,40,20,20,10,10,10) antag_cap = list(1,1,1,1,1,2,2,2,2,3) - var/team_mode_probability = 30 /datum/dynamic_ruleset/roundstart/changeling/pre_execute() . = ..() @@ -123,21 +122,8 @@ return TRUE /datum/dynamic_ruleset/roundstart/changeling/execute() - var/team_mode = FALSE - if(prob(team_mode_probability)) - team_mode = TRUE - var/list/team_objectives = subtypesof(/datum/objective/changeling_team_objective) - var/list/possible_team_objectives = list() - for(var/T in team_objectives) - var/datum/objective/changeling_team_objective/CTO = T - if(assigned.len >= initial(CTO.min_lings)) - possible_team_objectives += T - - if(possible_team_objectives.len && prob(20*assigned.len)) - GLOB.changeling_team_objective_type = pick(possible_team_objectives) for(var/datum/mind/changeling in assigned) var/datum/antagonist/changeling/new_antag = new antag_datum() - new_antag.team_mode = team_mode changeling.add_antag_datum(new_antag) GLOB.pre_setup_antags -= changeling return TRUE diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index fdfbbcdbde7..dd4a043dd1e 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -919,176 +919,6 @@ GLOBAL_LIST_EMPTY(possible_items_special) if(expl) explanation_text = expl -//////////////////////////////// -// Changeling team objectives // -//////////////////////////////// - -/datum/objective/changeling_team_objective //Abstract type - martyr_compatible = FALSE //Suicide is not teamwork! - explanation_text = "Changeling Friendship!" - var/min_lings = 3 //Minimum amount of lings for this team objective to be possible - var/escape_objective_compatible = FALSE - -/datum/objective/changeling_team_objective/proc/prepare() - return FALSE - -//Impersonate department -//Picks as many people as it can from a department (Security,Engineer,Medical,Science) -//and tasks the lings with killing and replacing them -/datum/objective/changeling_team_objective/impersonate_department - explanation_text = "Ensure X department are killed, impersonated, and replaced by Changelings" - var/command_staff_only = FALSE //if this is true, it picks command staff instead - var/list/department_minds = list() - var/list/department_real_names = list() - var/department_string = "" - - -/datum/objective/changeling_team_objective/impersonate_department/prepare() - var/result = FALSE - if(command_staff_only) - result = get_heads() - else - result = get_department_staff() - if(result) - update_explanation_text() - return TRUE - else - return FALSE - - -/datum/objective/changeling_team_objective/impersonate_department/proc/get_department_staff() - department_minds = list() - department_real_names = list() - - var/list/departments = list("Head of Security","Research Director","Chief Engineer","Chief Medical Officer") - var/department_head = pick(departments) - switch(department_head) - if("Head of Security") - department_string = "security" - if("Research Director") - department_string = "science" - if("Chief Engineer") - department_string = "engineering" - if("Chief Medical Officer") - department_string = "medical" - - var/list/lings = get_antag_minds(/datum/antagonist/changeling,TRUE) - var/ling_count = lings.len - - for(var/datum/mind/M in SSticker.minds) - if(M in lings) - continue - if(department_head in get_department_heads(M.assigned_role)) - if(ling_count) - ling_count-- - department_minds += M - department_real_names += M.current.real_name - else - break - - if(!department_minds.len) - log_game("[type] has failed to find department staff, and has removed itself. the round will continue normally") - return FALSE - return TRUE - - -/datum/objective/changeling_team_objective/impersonate_department/proc/get_heads() - department_minds = list() - department_real_names = list() - - //Needed heads is between min_lings and the maximum possible amount of command roles - //So at the time of writing, rand(3,6), it's also capped by the amount of lings there are - //Because you can't fill 6 head roles with 3 lings - var/list/lings = get_antag_minds(/datum/antagonist/changeling,TRUE) - var/needed_heads = rand(min_lings,GLOB.command_positions.len) - needed_heads = min(lings.len,needed_heads) - - var/list/heads = SSjob.get_living_heads() - for(var/datum/mind/head in heads) - if(head in lings) //Looking at you HoP. - continue - if(needed_heads) - department_minds += head - department_real_names += head.current.real_name - needed_heads-- - else - break - - if(!department_minds.len) - log_game("[type] has failed to find department heads, and has removed itself. the round will continue normally") - return FALSE - return TRUE - - -/datum/objective/changeling_team_objective/impersonate_department/update_explanation_text() - ..() - if(!department_real_names.len || !department_minds.len) - explanation_text = "Free Objective" - return //Something fucked up, give them a win - - if(command_staff_only) - explanation_text = "Ensure changelings impersonate and escape as the following heads of staff: " - else - explanation_text = "Ensure changelings impersonate and escape as the following members of \the [department_string] department: " - - var/first = 1 - for(var/datum/mind/M in department_minds) - var/string = "[M.name] the [M.assigned_role]" - if(!first) - string = ", [M.name] the [M.assigned_role]" - else - first-- - explanation_text += string - - if(command_staff_only) - explanation_text += ", while the real heads are dead. This is a team objective." - else - explanation_text += ", while the real members are dead. This is a team objective." - - -/datum/objective/changeling_team_objective/impersonate_department/check_completion() - if(!department_real_names.len || !department_minds.len) - return TRUE //Something fucked up, give them a win - - var/list/check_names = department_real_names.Copy() - - //Check each department member's mind to see if any of them made it to centcom alive, if they did it's an automatic fail - for(var/datum/mind/M in department_minds) - if(M.has_antag_datum(/datum/antagonist/changeling)) //Lings aren't picked for this, but let's be safe - continue - - if(M.current) - var/turf/mloc = get_turf(M.current) - if(mloc.onCentCom() && (M.current.stat != DEAD)) - return FALSE //A Non-ling living target got to centcom, fail - - //Check each staff member has been replaced, by cross referencing changeling minds, changeling current dna, the staff minds and their original DNA names - var/success = 0 - changelings: - for(var/datum/mind/changeling in get_antag_minds(/datum/antagonist/changeling,TRUE)) - if(success >= department_minds.len) //We did it, stop here! - return TRUE - if(ishuman(changeling.current)) - var/mob/living/carbon/human/H = changeling.current - var/turf/cloc = get_turf(changeling.current) - if(cloc?.onCentCom() && (changeling.current.stat != DEAD)) //Living changeling on centcom.... - for(var/name in check_names) //Is he (disguised as) one of the staff? - if(H.dna.real_name == name) - check_names -= name //This staff member is accounted for, remove them, so the team don't succeed by escape as 7 of the same engineer - success++ //A living changeling staff member made it to centcom - continue changelings - - if(success >= department_minds.len) - return TRUE - return FALSE - -//A subtype of impersonate_department -//This subtype always picks as many command staff as it can (HoS,HoP,Cap,CE,CMO,RD) -//and tasks the lings with killing and replacing them -/datum/objective/changeling_team_objective/impersonate_department/impersonate_heads - explanation_text = "Have X or more heads of staff escape on the shuttle disguised as heads, while the real heads are dead" - command_staff_only = TRUE - //Ideally this would be all of them but laziness and unusual subtypes /proc/generate_admin_objective_list() GLOB.admin_objective_list = list() diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index cb5a9d49c85..5f4784ac819 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -38,7 +38,6 @@ // Upgrades bitflag var/upgrades = 0 - var/datum/component/empprotection/emp_component var/internal_light = TRUE //Whether it can light up when an AI views it diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index 50bc2eac90c..a830950b026 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -77,7 +77,7 @@ /obj/machinery/camera/proc/upgradeEmpProof(malf_upgrade, ignore_malf_upgrades) if(isEmpProof(ignore_malf_upgrades)) //pass a malf upgrade to ignore_malf_upgrades so we can replace the malf module with the normal one return //that way if someone tries to upgrade an already malf-upgraded camera, it'll just upgrade it to a normal version. - emp_component = AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES | EMP_PROTECT_CONTENTS) + AddElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES | EMP_PROTECT_CONTENTS) if(malf_upgrade) assembly.malf_emp_firmware_active = TRUE //don't add parts to drop, update icon, ect. reconstructing it will also retain the upgrade. assembly.malf_emp_firmware_present = TRUE //so the upgrade is retained after incompatible parts are removed. @@ -92,7 +92,7 @@ /obj/machinery/camera/proc/removeEmpProof(ignore_malf_upgrades) if(ignore_malf_upgrades) //don't downgrade it if malf software is forced onto it. return - QDEL_NULL(emp_component) + RemoveElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES | EMP_PROTECT_CONTENTS) upgrades &= ~CAMERA_UPGRADE_EMP_PROOF diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index a7d1cc586a2..7d1302ef8f2 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -194,7 +194,7 @@ SSshuttle.shuttle_purchased = SHUTTLEPURCHASE_PURCHASED SSshuttle.unload_preview() SSshuttle.existing_shuttle = SSshuttle.emergency - SSshuttle.action_load(shuttle) + SSshuttle.action_load(shuttle, replace = TRUE) bank_account.adjust_money(-shuttle.credit_cost) minor_announce("[usr.real_name] has purchased [shuttle.name] for [shuttle.credit_cost] credits.[shuttle.extra_desc ? " [shuttle.extra_desc]" : ""]" , "Shuttle Purchase") message_admins("[ADMIN_LOOKUPFLW(usr)] purchased [shuttle.name].") diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index ff9fd3fd491..40c4cbf079e 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -143,6 +143,19 @@ icon_keyboard = "no_keyboard" density = FALSE +/obj/machinery/computer/pod/old/mass_driver_controller/toxinsdriver + id = MASSDRIVER_TOXINS + +//for maps where pod doors are outside of the standard 4 tile controller detection range (ie Pubbystation) +/obj/machinery/computer/pod/old/mass_driver_controller/toxinsdriver/longrange + range = 6 + +/obj/machinery/computer/pod/old/mass_driver_controller/chapelgun + id = MASSDRIVER_CHAPEL + +/obj/machinery/computer/pod/old/mass_driver_controller/trash + id = MASSDRIVER_DISPOSALS + /obj/machinery/computer/pod/old/syndicate name = "\improper ProComp Executive IIc" desc = "The Syndicate operate on a tight budget. Operates external airlocks." diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index f652b38e279..3e63a2b4a02 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -995,6 +995,7 @@ welded = !welded user.visible_message("[user] [welded? "welds shut":"unwelds"] [src].", \ "You [welded ? "weld the airlock shut":"unweld the airlock"].") + log_game("[key_name(user)] [welded ? "welded":"unwelded"] airlock [src] with [W] at [AREACOORD(src)]") update_icon() else if(obj_integrity < max_integrity) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 960e6a1a904..f03c60724c6 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -125,6 +125,7 @@ if(W.use_tool(src, user, DEFAULT_STEP_TIME, volume=50)) welded = !welded to_chat(user, "[user] [welded?"welds":"unwelds"] [src].", "You [welded ? "weld" : "unweld"] [src].") + log_game("[key_name(user)] [welded ? "welded":"unwelded"] firedoor [src] with [W] at [AREACOORD(src)]") update_icon() /obj/machinery/door/firedoor/try_to_crowbar(obj/item/I, mob/user) diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index 0aa381c1993..d4e208285fb 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -61,6 +61,18 @@ name = "combustion chamber vent" id = INCINERATOR_SYNDICATELAVA_AUXVENT +/obj/machinery/door/poddoor/massdriver_toxins + name = "Toxins Launcher Bay Door" + id = MASSDRIVER_TOXINS + +/obj/machinery/door/poddoor/massdriver_chapel + name = "Chapel Launcher Bay Door" + id = MASSDRIVER_CHAPEL + +/obj/machinery/door/poddoor/massdriver_trash + name = "Disposals Launcher Bay Door" + id = MASSDRIVER_DISPOSALS + /obj/machinery/door/poddoor/Bumped(atom/movable/AM) if(density) return 0 diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm index 6576198ba48..3278a4bd422 100644 --- a/code/game/machinery/mass_driver.dm +++ b/code/game/machinery/mass_driver.dm @@ -11,6 +11,16 @@ var/id = 1 var/drive_range = 50 //this is mostly irrelevant since current mass drivers throw into space, but you could make a lower-range mass driver for interstation transport or something I guess. +/obj/machinery/mass_driver/chapelgun + name = "holy driver" + id = MASSDRIVER_CHAPEL + +/obj/machinery/mass_driver/toxins + id = MASSDRIVER_TOXINS + +/obj/machinery/mass_driver/trash + id = MASSDRIVER_DISPOSALS + /obj/machinery/mass_driver/Destroy() for(var/obj/machinery/computer/pod/control in GLOB.machines) if(control.id == id) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 365fd155f8f..af9954376d0 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -708,7 +708,7 @@ DEFINE_BITFIELD(turret_flags, list( /obj/machinery/porta_turret/syndicate/ComponentInitialize() . = ..() - AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) + AddElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) /obj/machinery/porta_turret/syndicate/setup() return @@ -814,7 +814,7 @@ DEFINE_BITFIELD(turret_flags, list( /obj/machinery/porta_turret/centcom_shuttle/ComponentInitialize() . = ..() - AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) + AddElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) /obj/machinery/porta_turret/centcom_shuttle/assess_perp(mob/living/carbon/human/perp) return 0 diff --git a/code/game/machinery/stasis.dm b/code/game/machinery/stasis.dm index 55dc4e531d5..189744e3da2 100644 --- a/code/game/machinery/stasis.dm +++ b/code/game/machinery/stasis.dm @@ -1,6 +1,6 @@ #define STASIS_TOGGLE_COOLDOWN 50 /obj/machinery/stasis - name = "Lifeform Stasis Unit" + name = "lifeform stasis unit" desc = "A not so comfortable looking bed with some nozzles at the top and bottom. It will keep someone in stasis." icon = 'icons/obj/machines/stasis.dmi' icon_state = "stasis" diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index 6cdbf09145e..4d225656d09 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -16,8 +16,8 @@ /obj/effect/decal/cleanable/ash/Initialize() . = ..() reagents.add_reagent(/datum/reagent/ash, 30) - pixel_x = rand(-5, 5) - pixel_y = rand(-5, 5) + pixel_x = base_pixel_x + rand(-5, 5) + pixel_y = base_pixel_y + rand(-5, 5) /obj/effect/decal/cleanable/ash/crematorium //crematoriums need their own ash cause default ash deletes itself if created in an obj diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index ca00f6a9be0..fd69858a98c 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -94,3 +94,6 @@ . = ..() if(!ismob(loc)) return INITIALIZE_HINT_QDEL + +/obj/effect/abstract/directional_lighting + mouse_opacity = MOUSE_OPACITY_TRANSPARENT diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 78a9328a438..27772da01a2 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -77,3 +77,14 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT alpha = 0 vis_flags = NONE + +/obj/effect/overlay/light_cone + name = "" + icon = 'icons/effects/light_overlays/light_cone.dmi' + icon_state = "light" + layer = O_LIGHTING_VISUAL_LAYER + plane = O_LIGHTING_VISUAL_PLANE + appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + vis_flags = NONE + alpha = 110 diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index eb85a666319..9552b52b200 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -674,3 +674,39 @@ /obj/item/storage/fancy/cigarettes/cigpack_carp = 3, /obj/item/storage/fancy/cigarettes/cigpack_midori = 1 ) + +/obj/effect/spawner/lootdrop/decorative_material + lootcount = 1 + loot = list( + /obj/item/stack/sheet/sandblock{amount = 30} = 25, + /obj/item/stack/sheet/mineral/wood{amount = 30} = 25, + /obj/item/stack/tile/bronze/thirty = 20, + /obj/item/stack/tile/noslip{amount = 20} = 10, + /obj/item/stack/sheet/plastic{amount = 30} = 10, + /obj/item/stack/tile/pod{amount = 20} = 4, + /obj/item/stack/tile/pod/light{amount = 20} = 3, + /obj/item/stack/tile/pod/dark{amount = 20} = 3, + ) + +/obj/effect/spawner/lootdrop/maintenance_carpet + lootcount = 1 + loot = list( + /obj/item/stack/tile/carpet{amount = 30} = 35, + /obj/item/stack/tile/carpet/black{amount = 30} = 20, + /obj/item/stack/tile/carpet/donk/thirty = 15, + /obj/item/stack/tile/carpet/stellar/thirty = 15, + /obj/item/stack/tile/carpet/executive/thirty = 15, + ) + +/obj/effect/spawner/lootdrop/decorations_spawner + lootcount = 1 + loot = list( + /obj/effect/spawner/lootdrop/maintenance_carpet = 25, + /obj/effect/spawner/lootdrop/decorative_material = 25, + /obj/item/sign = 10, + /obj/item/flashlight/lamp/green = 10, + /obj/item/plaque = 5, + /obj/item/flashlight/lantern/jade = 5, + /obj/item/phone = 5, + /obj/item/flashlight/lamp/bananalamp = 3 + ) diff --git a/code/game/objects/effects/spawners/lootsite.dm b/code/game/objects/effects/spawners/lootsite.dm index f4c33bafbe7..e1668e60565 100644 --- a/code/game/objects/effects/spawners/lootsite.dm +++ b/code/game/objects/effects/spawners/lootsite.dm @@ -4,11 +4,12 @@ icon_state = "loot_site" ///This is the loot table for the spawner. Try to make sure the weights add up to 1000, so it is easy to understand. var/list/loot_table = list(/obj/structure/closet/crate/maint = 765, - /obj/structure/closet/crate/trashcart/filled = 80, + /obj/structure/closet/crate/trashcart/filled = 75, /obj/effect/spawner/bundle/moisture_trap = 50, - /obj/effect/spawner/bundle/hobo_squat = 35, - /obj/structure/closet/mini_fridge = 40, - /obj/effect/spawner/lootdrop/gross_decal_spawner = 30) + /obj/effect/spawner/bundle/hobo_squat = 30, + /obj/structure/closet/mini_fridge = 35, + /obj/effect/spawner/lootdrop/gross_decal_spawner = 30, + /obj/structure/closet/crate/decorations = 15) /obj/effect/loot_site_spawner/Initialize() diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 1bc1a8eeae5..709b9aa6c58 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -84,8 +84,8 @@ var/list/faction = list("spiders") /obj/structure/spider/eggcluster/Initialize() - pixel_x = rand(3,-3) - pixel_y = rand(3,-3) + pixel_x = base_pixel_x + rand(3,-3) + pixel_y = base_pixel_y + rand(3,-3) START_PROCESSING(SSobj, src) . = ..() diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index 97eb7fca55f..dfcf7b66a31 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -237,6 +237,18 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( spark_system = null return ..() +/obj/item/pipe_dispenser/examine(mob/user) + . = ..() + . += "You can scroll your mouse wheel to change the piping layer." + +/obj/item/pipe_dispenser/equipped(mob/user, slot, initial) + . = ..() + RegisterSignal(user, COMSIG_MOUSE_SCROLL_ON, .proc/mouse_wheeled) + +/obj/item/pipe_dispenser/dropped(mob/user, silent) + UnregisterSignal(user, COMSIG_MOUSE_SCROLL_ON) + return ..() + /obj/item/pipe_dispenser/attack_self(mob/user) ui_interact(user) @@ -507,6 +519,19 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( /obj/item/pipe_dispenser/proc/activate() playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, TRUE) +/obj/item/pipe_dispenser/proc/mouse_wheeled(mob/source, atom/A, delta_x, delta_y, params) + SIGNAL_HANDLER + if(source.incapacitated(ignore_restraints = TRUE, ignore_stasis = TRUE)) + return + + if(delta_y > 0) + piping_layer = min(PIPING_LAYER_MAX, piping_layer + 1) + else if(delta_y < 0) + piping_layer = max(PIPING_LAYER_MIN, piping_layer - 1) + else + return + to_chat(source, "You set the layer to [piping_layer].") + #undef ATMOS_CATEGORY #undef DISPOSALS_CATEGORY #undef TRANSIT_CATEGORY diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 8c4ec8c3a67..066dbed0d65 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -733,7 +733,7 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/stasis - name = "Lifeform Stasis Unit (Machine Board)" + name = "\improper Lifeform Stasis Unit (Machine Board)" icon_state = "medical" build_path = /obj/machinery/stasis req_components = list( diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 5521c8ca83a..5b89284021e 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -26,7 +26,7 @@ GLOBAL_LIST_EMPTY(PDAs) actions_types = list(/datum/action/item_action/toggle_light) armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) resistance_flags = FIRE_PROOF | ACID_PROOF - light_system = MOVABLE_LIGHT + light_system = MOVABLE_LIGHT_DIRECTIONAL light_range = 2.3 light_power = 0.6 light_color = "#FFCC66" diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 6391163f231..cfa6549003d 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -13,7 +13,7 @@ slot_flags = ITEM_SLOT_BELT custom_materials = list(/datum/material/iron=50, /datum/material/glass=20) actions_types = list(/datum/action/item_action/toggle_light) - light_system = MOVABLE_LIGHT + light_system = MOVABLE_LIGHT_DIRECTIONAL light_range = 4 light_power = 1 light_on = FALSE @@ -32,6 +32,8 @@ else icon_state = initial(icon_state) set_light_on(on) + if(light_system == STATIC_LIGHT) + update_light() /obj/item/flashlight/attack_self(mob/user) @@ -231,6 +233,7 @@ righthand_file = 'icons/mob/inhands/items_righthand.dmi' force = 10 light_range = 5 + light_system = STATIC_LIGHT w_class = WEIGHT_CLASS_BULKY flags_1 = CONDUCT_1 custom_materials = null @@ -277,6 +280,7 @@ var/produce_heat = 1500 heat = 1000 light_color = LIGHT_COLOR_FLARE + light_system = MOVABLE_LIGHT grind_results = list(/datum/reagent/sulfur = 15) /obj/item/flashlight/flare/Initialize() @@ -354,6 +358,7 @@ righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi' desc = "A mining lantern." light_range = 6 // luminosity when on + light_system = MOVABLE_LIGHT /obj/item/flashlight/lantern/heirloom_moth name = "old lantern" @@ -447,6 +452,7 @@ custom_price = 50 w_class = WEIGHT_CLASS_SMALL light_range = 4 + light_system = MOVABLE_LIGHT color = LIGHT_COLOR_GREEN icon_state = "glowstick" inhand_icon_state = "glowstick" @@ -557,6 +563,7 @@ name = "disco light" desc = "Groovy..." icon_state = null + light_system = MOVABLE_LIGHT light_range = 4 light_power = 10 alpha = 0 @@ -605,6 +612,7 @@ /obj/item/flashlight/eyelight name = "eyelight" desc = "This shouldn't exist outside of someone's head, how are you seeing this?" + light_system = MOVABLE_LIGHT light_range = 15 light_power = 1 flags_1 = CONDUCT_1 diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 6e3925ed810..8f7f66a2c5f 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -104,7 +104,7 @@ /obj/item/radio/ComponentInitialize() . = ..() - AddComponent(/datum/component/empprotection, EMP_PROTECT_WIRES) + AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES) /obj/item/radio/interact(mob/user) if(unscrewed && !isAI(user)) diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm index 7714cf3fea2..479d2a72e82 100644 --- a/code/game/objects/items/dna_injector.dm +++ b/code/game/objects/items/dna_injector.dm @@ -3,6 +3,7 @@ desc = "This injects the person with DNA." icon = 'icons/obj/items_and_weapons.dmi' icon_state = "dnainjector" + worn_icon_state = "pen" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' throw_speed = 3 diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index a55f2fa290b..0181e72cfdd 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -18,7 +18,7 @@ /obj/item/grenade/chem_grenade/ComponentInitialize() . = ..() - AddComponent(/datum/component/empprotection, EMP_PROTECT_WIRES) + AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES) /obj/item/grenade/chem_grenade/Initialize() . = ..() diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index 58fb19c513e..b7e1b291a9a 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -26,7 +26,7 @@ /obj/item/grenade/c4/ComponentInitialize() . = ..() - AddComponent(/datum/component/empprotection, EMP_PROTECT_WIRES) + AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES) /obj/item/grenade/c4/Destroy() qdel(wires) diff --git a/code/game/objects/items/robot/ai_upgrades.dm b/code/game/objects/items/robot/ai_upgrades.dm index 39aff96c62c..b434ad34949 100644 --- a/code/game/objects/items/robot/ai_upgrades.dm +++ b/code/game/objects/items/robot/ai_upgrades.dm @@ -9,12 +9,12 @@ icon_state = "datadisk3" -/obj/item/malf_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user, proximity) - . = ..() +/obj/item/malf_upgrade/pre_attack(atom/A, mob/living/user, proximity) if(!proximity) - return - if(!istype(AI)) - return + return ..() + if(!isAI(A)) + return ..() + var/mob/living/silicon/ai/AI = A if(AI.malf_picker) AI.malf_picker.processing_time += 50 to_chat(AI, "[user] has attempted to upgrade you with combat software that you already possess. You gain 50 points to spend on Malfunction Modules instead.") @@ -27,6 +27,7 @@ message_admins("[ADMIN_LOOKUPFLW(user)] has upgraded [ADMIN_LOOKUPFLW(AI)] with a [src].") to_chat(user, "You upgrade [AI]. [src] is consumed in the process.") qdel(src) + return TRUE //Lipreading @@ -36,12 +37,12 @@ icon = 'icons/obj/module.dmi' icon_state = "datadisk3" -/obj/item/surveillance_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user, proximity) - . = ..() +/obj/item/surveillance_upgrade/pre_attack(atom/A, mob/living/user, proximity) if(!proximity) - return - if(!istype(AI)) - return + return ..() + if(!isAI(A)) + return ..() + var/mob/living/silicon/ai/AI = A if(AI.eyeobj) AI.eyeobj.relay_speech = TRUE to_chat(AI, "[user] has upgraded you with surveillance software!") @@ -50,3 +51,4 @@ log_game("[key_name(user)] has upgraded [key_name(AI)] with a [src].") message_admins("[ADMIN_LOOKUPFLW(user)] has upgraded [ADMIN_LOOKUPFLW(AI)] with a [src].") qdel(src) + return TRUE diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 66061c6b8f4..c0f1e37a636 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -704,18 +704,6 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra /obj/item/stack/sheet/paperframes/fifty amount = 50 -/obj/item/stack/sheet/capitalisium - name = "capitalisium sheet" - desc = "A source of raw capitalism, capable of bringing forth the prophesized Capitalist Golem." - icon_state = "sheet-capitalisium" - merge_type = /obj/item/stack/sheet/capitalisium - -/obj/item/stack/sheet/stalinium - name = "stalinium sheet" - desc = "A source of raw socialism, capable of bringing forth the prophesized Soviet Golem." - icon_state = "sheet-stalinium" - merge_type = /obj/item/stack/sheet/stalinium - /obj/item/stack/sheet/meat name = "meat sheets" desc = "Something's bloody meat compressed into a nice solid sheet." diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 3b5eb9a07ed..926960c6814 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -207,6 +207,23 @@ turf_type = /turf/open/floor/carpet/royalblue tableVariant = /obj/structure/table/wood/fancy/royalblue +/obj/item/stack/tile/carpet/executive + name = "executive carpet" + icon_state = "tile_carpet_executive" + inhand_icon_state = "tile-carpet-royalblue" + turf_type = /turf/open/floor/carpet/executive + +/obj/item/stack/tile/carpet/stellar + name = "stellar carpet" + icon_state = "tile_carpet_stellar" + inhand_icon_state = "tile-carpet-royalblue" + turf_type = /turf/open/floor/carpet/stellar + +/obj/item/stack/tile/carpet/donk + name = "donk co promotional carpet" + icon_state = "tile_carpet_donk" + inhand_icon_state = "tile-carpet-orange" + turf_type = /turf/open/floor/carpet/donk /obj/item/stack/tile/carpet/fifty amount = 50 @@ -238,6 +255,14 @@ /obj/item/stack/tile/carpet/royalblue/fifty amount = 50 +/obj/item/stack/tile/carpet/executive/thirty + amount = 30 + +/obj/item/stack/tile/carpet/stellar/thirty + amount = 30 + +/obj/item/stack/tile/carpet/donk/thirty + amount = 30 /obj/item/stack/tile/fakespace name = "astral carpet" diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index e34c93340ed..810896db3c0 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -120,7 +120,7 @@ /obj/item/storage/bag/ore/ComponentInitialize() . = ..() - AddComponent(/datum/component/rad_insulation, 0.01) //please datum mats no more cancer + AddElement(/datum/element/rad_insulation, 0.01) //please datum mats no more cancer var/datum/component/storage/concrete/stack/STR = GetComponent(/datum/component/storage/concrete/stack) STR.allow_quick_empty = TRUE STR.set_holdable(list(/obj/item/stack/ore)) diff --git a/code/game/objects/items/tcg/tcg.dm b/code/game/objects/items/tcg/tcg.dm index 80bffc48afc..6fe397b30c7 100644 --- a/code/game/objects/items/tcg/tcg.dm +++ b/code/game/objects/items/tcg/tcg.dm @@ -27,8 +27,8 @@ GLOBAL_LIST_EMPTY(cached_cards) /obj/item/tcgcard/Initialize(mapload, datum_series, datum_id) . = ..() zoom_out() - RegisterSignal(src, COMISG_STORAGE_ENTERED, .proc/zoom_in) - RegisterSignal(src, CONSIG_STORAGE_EXITED, .proc/zoom_out) + RegisterSignal(src, COMSIG_STORAGE_ENTERED, .proc/zoom_in) + RegisterSignal(src, COMSIG_STORAGE_EXITED, .proc/zoom_out) //If they are passed as null let's replace them with the vars on the card. this also means we can allow for map loaded ccards if(!datum_series) datum_series = series @@ -350,8 +350,8 @@ GLOBAL_LIST_EMPTY(tcgcard_radial_choices) /obj/item/cardpack/Initialize() . = ..() zoom_out() - RegisterSignal(src, COMISG_STORAGE_ENTERED, .proc/zoom_in) - RegisterSignal(src, CONSIG_STORAGE_EXITED, .proc/zoom_out) + RegisterSignal(src, COMSIG_STORAGE_ENTERED, .proc/zoom_in) + RegisterSignal(src, COMSIG_STORAGE_EXITED, .proc/zoom_out) //Pass by refrance moment //This lets us only have one rarity table per pack, badmins beware if(GLOB.cached_rarity_table[type]) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index 2512ea324ec..92a40fca9eb 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -140,7 +140,8 @@ blacklisted_turfs = typecacheof(list( /turf/open/space, /turf/open/chasm, - /turf/open/lava)) + /turf/open/lava, + /turf/open/transparent/openspace)) set_base_icon() diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm index 7a20d93e80b..306f18db292 100644 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ b/code/game/objects/structures/beds_chairs/alien_nest.dm @@ -71,8 +71,8 @@ add_overlay(nest_overlay) /obj/structure/bed/nest/post_unbuckle_mob(mob/living/M) - M.pixel_x = M.get_standard_pixel_x_offset(M.body_position == LYING_DOWN) - M.pixel_y = M.get_standard_pixel_y_offset(M.body_position == LYING_DOWN) + M.pixel_x = M.base_pixel_x + M.get_standard_pixel_x_offset(M.body_position == LYING_DOWN) + M.pixel_y = M.base_pixel_y + M.get_standard_pixel_y_offset(M.body_position == LYING_DOWN) M.layer = initial(M.layer) cut_overlay(nest_overlay) diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index 09c4f239e50..4a63540209c 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -101,8 +101,8 @@ /obj/structure/bed/roller/post_unbuckle_mob(mob/living/M) density = FALSE icon_state = "down" - M.pixel_x = M.get_standard_pixel_x_offset(M.body_position == LYING_DOWN) - M.pixel_y = M.get_standard_pixel_y_offset(M.body_position == LYING_DOWN) + M.pixel_x = M.base_pixel_x + M.get_standard_pixel_x_offset(M.body_position == LYING_DOWN) + M.pixel_y = M.base_pixel_y + M.get_standard_pixel_y_offset(M.body_position == LYING_DOWN) /obj/item/roller diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 04fa215aef6..5780b728f5d 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -46,9 +46,10 @@ LINEN BINS /obj/item/bedsheet/attackby(obj/item/I, mob/user, params) if(I.tool_behaviour == TOOL_WIRECUTTER || I.get_sharpness()) - var/obj/item/stack/sheet/cloth/C = new (get_turf(src), 3) - transfer_fingerprints_to(C) - C.add_fingerprint(user) + if (!(flags_1 & HOLOGRAM_1)) + var/obj/item/stack/sheet/cloth/shreds = new (get_turf(src), 3) + transfer_fingerprints_to(shreds) + shreds.add_fingerprint(user) qdel(src) to_chat(user, "You tear [src] up.") else diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 60697c4baef..b1e98427a4f 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -280,6 +280,7 @@ user.visible_message("[user] [welded ? "welds shut" : "unwelded"] \the [src].", "You [welded ? "weld" : "unwelded"] \the [src] with \the [W].", "You hear welding.") + log_game("[key_name(user)] [welded ? "welded":"unwelded"] closet [src] with [W] at [AREACOORD(src)]") update_icon() else if(W.tool_behaviour == TOOL_WRENCH && anchorable) if(isinspace() && !anchored) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 7af616d6dc6..4c92ce90129 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -249,3 +249,11 @@ ..() for(var/i in 1 to 5) new /obj/item/coin/silver(src) + +/obj/structure/closet/crate/decorations + icon_state = "engi_crate" + +/obj/structure/closet/crate/decorations/PopulateContents() + . = ..() + for(var/i in 1 to 4) + new /obj/effect/spawner/lootdrop/decorations_spawner(src) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index f42763f5336..ab85eca0d73 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -82,7 +82,7 @@ var/matrix/m180 = matrix(L.transform) m180.Turn(180) animate(L, transform = m180, time = 3) - L.pixel_y = L.get_standard_pixel_y_offset(180) + L.pixel_y = L.get_standard_pixel_y_offset(TRUE) else if (has_buckled_mobs()) for(var/mob/living/L in buckled_mobs) user_unbuckle_mob(L, user) @@ -124,7 +124,7 @@ var/matrix/m180 = matrix(M.transform) m180.Turn(180) animate(M, transform = m180, time = 3) - M.pixel_y = M.get_standard_pixel_y_offset(180) + M.pixel_y = M.base_pixel_y + M.get_standard_pixel_y_offset(TRUE) M.adjustBruteLoss(30) src.visible_message(text("[M] falls free of [src]!")) unbuckle_mob(M,force=1) diff --git a/code/game/objects/structures/manned_turret.dm b/code/game/objects/structures/manned_turret.dm index be832d087ca..c68a5bdd0eb 100644 --- a/code/game/objects/structures/manned_turret.dm +++ b/code/game/objects/structures/manned_turret.dm @@ -35,8 +35,8 @@ if(istype(I, /obj/item/gun_control)) qdel(I) if(istype(buckled_mob)) - buckled_mob.pixel_x = 0 - buckled_mob.pixel_y = 0 + buckled_mob.pixel_x = buckled_mob.base_pixel_x + buckled_mob.pixel_y = buckled_mob.base_pixel_y if(buckled_mob.client) buckled_mob.client.view_size.resetToDefault() anchored = FALSE diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index a2e80bff4ae..f73eeeeb76d 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -277,7 +277,7 @@ /obj/structure/statue/elder_atmosian name = "Elder Atmosian" - desc = "A statue of an Elder Atmosian, capable of bending the laws of thermodynamics to their will" + desc = "A statue of an Elder Atmosian, capable of bending the laws of thermodynamics to their will." icon_state = "eng" custom_materials = list(/datum/material/metalhydrogen = MINERAL_MATERIAL_AMOUNT*10) max_integrity = 1000 @@ -286,7 +286,7 @@ /obj/item/chisel name = "chisel" - desc = "breaking and making art since 4000 BC. This one uses advanced technology to allow creation of lifelike moving statues." + desc = "Breaking and making art since 4000 BC. This one uses advanced technology to allow the creation of lifelike moving statues." icon = 'icons/obj/statue.dmi' icon_state = "chisel" inhand_icon_state = "screwdriver_nuke" diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm index 7992b9f7f92..515e987b887 100644 --- a/code/game/objects/structures/table_frames.dm +++ b/code/game/objects/structures/table_frames.dm @@ -21,36 +21,48 @@ var/framestack = /obj/item/stack/rods var/framestackamount = 2 -/obj/structure/table_frame/attackby(obj/item/I, mob/user, params) - if(I.tool_behaviour == TOOL_WRENCH) - to_chat(user, "You start disassembling [src]...") - I.play_tool_sound(src) - if(I.use_tool(src, user, 30)) - playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE) - deconstruct(TRUE) - return - var/obj/item/stack/material = I - if (istype(material)) - if(material?.tableVariant) +/obj/structure/table_frame/wrench_act(mob/living/user, obj/item/I) + to_chat(user, "You start disassembling [src]...") + I.play_tool_sound(src) + if(!I.use_tool(src, user, 3 SECONDS)) + return TRUE + playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) + deconstruct(TRUE) + return TRUE + + +/obj/structure/table_frame/attackby(obj/item/I, mob/user, params) + if(isstack(I)) + var/obj/item/stack/material = I + if(material.tableVariant) if(material.get_amount() < 1) to_chat(user, "You need one [material.name] sheet to do this!") return + if(locate(/obj/structure/table) in loc) + to_chat(user, "There's already a table built here!") + return to_chat(user, "You start adding [material] to [src]...") - if(do_after(user, 20, target = src) && material.use(1)) - make_new_table(material.tableVariant) + if(!do_after(user, 2 SECONDS, target = src) || !material.use(1) || (locate(/obj/structure/table) in loc)) + return + make_new_table(material.tableVariant) else if(istype(material, /obj/item/stack/sheet)) if(material.get_amount() < 1) to_chat(user, "You need one sheet to do this!") return + if(locate(/obj/structure/table) in loc) + to_chat(user, "There's already a table built here!") + return to_chat(user, "You start adding [material] to [src]...") - if(do_after(user, 20, target = src) && material.use(1)) - var/list/material_list = list() - if(material.material_type) - material_list[material.material_type] = MINERAL_MATERIAL_AMOUNT - make_new_table(/obj/structure/table/greyscale, material_list) - else - return ..() + if(!do_after(user, 2 SECONDS, target = src) || !material.use(1) || (locate(/obj/structure/table) in loc)) + return + var/list/material_list = list() + if(material.material_type) + material_list[material.material_type] = MINERAL_MATERIAL_AMOUNT + make_new_table(/obj/structure/table/greyscale, material_list) + return + return ..() + /obj/structure/table_frame/proc/make_new_table(table_type, custom_materials) //makes sure the new table made retains what we had as a frame var/obj/structure/table/T = new table_type(loc) diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm index 9484be34503..892244d7c4e 100644 --- a/code/game/turfs/open/floor/fancy_floor.dm +++ b/code/game/turfs/open/floor/fancy_floor.dm @@ -290,6 +290,33 @@ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_ROYAL_BLUE) canSmoothWith = list(SMOOTH_GROUP_CARPET_ROYAL_BLUE) +/turf/open/floor/carpet/executive + name = "executive carpet" + icon = 'icons/turf/floors/carpet_executive.dmi' + icon_state = "executive_carpet-255" + base_icon_state = "executive_carpet" + floor_tile = /obj/item/stack/tile/carpet/executive + smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_EXECUTIVE) + canSmoothWith = list(SMOOTH_GROUP_CARPET_EXECUTIVE) + +/turf/open/floor/carpet/stellar + name = "stellar carpet" + icon = 'icons/turf/floors/carpet_stellar.dmi' + icon_state = "stellar_carpet-255" + base_icon_state = "stellar_carpet" + floor_tile = /obj/item/stack/tile/carpet/stellar + smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_STELLAR) + canSmoothWith = list(SMOOTH_GROUP_CARPET_STELLAR) + +/turf/open/floor/carpet/donk + name = "Donk Co. carpet" + icon = 'icons/turf/floors/carpet_donk.dmi' + icon_state = "donk_carpet-255" + base_icon_state = "donk_carpet" + floor_tile = /obj/item/stack/tile/carpet/donk + smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_DONK) + canSmoothWith = list(SMOOTH_GROUP_CARPET_DONK) + //*****Airless versions of all of the above.***** /turf/open/floor/carpet/airless initial_gas_mix = AIRLESS_ATMOS diff --git a/code/modules/antagonists/abductor/abductor.dm b/code/modules/antagonists/abductor/abductor.dm index 7a615cc5664..3d107e6e9b2 100644 --- a/code/modules/antagonists/abductor/abductor.dm +++ b/code/modules/antagonists/abductor/abductor.dm @@ -1,4 +1,5 @@ #define ABDUCTOR_MAX_TEAMS 4 +GLOBAL_LIST_INIT(possible_abductor_names, list("Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega")) /datum/antagonist/abductor name = "Abductor" @@ -135,7 +136,7 @@ /datum/team/abductor_team/New() ..() team_number = team_count++ - name = "Mothership [pick(GLOB.possible_changeling_IDs)]" //TODO Ensure unique and actual alieny names + name = "Mothership [pick(GLOB.possible_abductor_names)]" //TODO Ensure unique and actual alieny names add_objective(new/datum/objective/experiment) /datum/team/abductor_team/is_solo() diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index a7381e7b2cb..59706871fa3 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -13,7 +13,6 @@ hijack_speed = 0.5 var/you_are_greet = TRUE var/give_objectives = TRUE - var/team_mode = FALSE //Should assign team objectives ? var/competitive_objectives = FALSE //Should we assign objectives in competition with other lings? //Changeling Stuff @@ -28,7 +27,6 @@ var/chem_recharge_rate = 1 var/chem_recharge_slowdown = 0 var/sting_range = 2 - var/changelingID = "Changeling" var/geneticdamage = 0 var/was_absorbed = FALSE //if they were absorbed by another ling already. var/isabsorbing = FALSE @@ -63,34 +61,16 @@ QDEL_NULL(emporium_action) . = ..() -/datum/antagonist/changeling/proc/generate_name() - var/honorific - if(owner.current.gender == FEMALE) - honorific = "Ms." - else if(owner.current.gender == MALE) - honorific = "Mr." - else - honorific = "Mx." - if(GLOB.possible_changeling_IDs.len) - changelingID = pick(GLOB.possible_changeling_IDs) - GLOB.possible_changeling_IDs -= changelingID - changelingID = "[honorific] [changelingID]" - else - changelingID = "[honorific] [rand(1,999)]" - /datum/antagonist/changeling/proc/create_actions() cellular_emporium = new(src) emporium_action = new(cellular_emporium) emporium_action.Grant(owner.current) /datum/antagonist/changeling/on_gain() - generate_name() create_actions() reset_powers() create_initial_profile() if(give_objectives) - if(team_mode) - forge_team_objectives() forge_objectives() owner.current.grant_all_languages(FALSE, FALSE, TRUE) //Grants omnitongue. We are able to transform our body after all. . = ..() @@ -386,8 +366,7 @@ /datum/antagonist/changeling/greet() if (you_are_greet) - to_chat(owner.current, "You are [changelingID], a changeling! You have absorbed and taken the form of a human.") - to_chat(owner.current, "Use say \"[MODE_TOKEN_CHANGELING] message\" to communicate with your fellow changelings.") + to_chat(owner.current, "You are a changeling! You have absorbed and taken the form of a human.") to_chat(owner.current, "You must complete the following tasks:") owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ling_aler.ogg', 100, FALSE, pressure_affected = FALSE) @@ -396,15 +375,6 @@ /datum/antagonist/changeling/farewell() to_chat(owner.current, "You grow weak and lose your powers! You are no longer a changeling and are stuck in your current form!") -/datum/antagonist/changeling/proc/forge_team_objectives() - if(GLOB.changeling_team_objective_type) - var/datum/objective/changeling_team_objective/team_objective = new GLOB.changeling_team_objective_type - team_objective.owner = owner - if(team_objective.prepare())//Setting up succeeded - objectives += team_objective - else - qdel(team_objective) - return /datum/antagonist/changeling/proc/forge_objectives() //OBJECTIVES - random traitor objectives. Unique objectives "steal brain" and "identity theft". @@ -413,13 +383,7 @@ var/escape_objective_possible = TRUE - //if there's a team objective, check if it's compatible with escape objectives - for(var/datum/objective/changeling_team_objective/CTO in objectives) - if(!CTO.escape_objective_compatible) - escape_objective_possible = FALSE - break - - switch(competitive_objectives ? (team_mode ? rand(1,2) : rand(1,3)) : 1) + switch(competitive_objectives ? rand(1,3) : 1) if(1) var/datum/objective/absorb/absorb_objective = new absorb_objective.owner = owner @@ -429,7 +393,7 @@ var/datum/objective/absorb_most/ac = new ac.owner = owner objectives += ac - if(3) //only give the murder other changelings goal if they're not in a team. + if(3) var/datum/objective/absorb_changeling/ac = new ac.owner = owner objectives += ac @@ -456,18 +420,12 @@ if(prob(70)) var/datum/objective/assassinate/kill_objective = new kill_objective.owner = owner - if(team_mode) //No backstabbing while in a team - kill_objective.find_target_by_role(role = ROLE_CHANGELING, role_type = TRUE, invert = TRUE) - else - kill_objective.find_target() + kill_objective.find_target() objectives += kill_objective else var/datum/objective/maroon/maroon_objective = new maroon_objective.owner = owner - if(team_mode) - maroon_objective.find_target_by_role(role = ROLE_CHANGELING, role_type = TRUE, invert = TRUE) - else - maroon_objective.find_target() + maroon_objective.find_target() objectives += maroon_objective if (!(locate(/datum/objective/escape) in objectives) && escape_objective_possible) @@ -486,17 +444,14 @@ else var/datum/objective/escape/escape_with_identity/identity_theft = new identity_theft.owner = owner - if(team_mode) - identity_theft.find_target_by_role(role = ROLE_CHANGELING, role_type = TRUE, invert = TRUE) - else - identity_theft.find_target() + identity_theft.find_target() objectives += identity_theft escape_objective_possible = FALSE /datum/antagonist/changeling/admin_add(datum/mind/new_owner,mob/admin) . = ..() - to_chat(new_owner.current, "Our powers have awoken. A flash of memory returns to us...we are [changelingID], a changeling!") + to_chat(new_owner.current, "Our powers have awoken. A flash of memory returns to us...we are a changeling!") /datum/antagonist/changeling/get_admin_commands() . = ..() @@ -580,7 +535,6 @@ parts += printplayer(owner) //Removed sanity if(changeling) because we -want- a runtime to inform us that the changelings list is incorrect and needs to be fixed. - parts += "Changeling ID: [changelingID]." parts += "Genomes Extracted: [absorbedcount]" parts += " " if(objectives.len) @@ -600,8 +554,5 @@ return parts.Join("
") -/datum/antagonist/changeling/antag_listing_name() - return ..() + "([changelingID])" - /datum/antagonist/changeling/xenobio/antag_listing_name() return ..() + "(Xenobio)" diff --git a/code/modules/antagonists/changeling/powers/hivemind.dm b/code/modules/antagonists/changeling/powers/hivemind.dm index d3723650858..ff48cf5297c 100644 --- a/code/modules/antagonists/changeling/powers/hivemind.dm +++ b/code/modules/antagonists/changeling/powers/hivemind.dm @@ -1,38 +1,3 @@ -//HIVEMIND COMMUNICATION (:g) -/datum/action/changeling/hivemind_comms - name = "Hivemind Communication" - desc = "We tune our senses to the airwaves to allow us to discreetly communicate and exchange DNA with other changelings." - helptext = "We will be able to talk with other changelings with :g. Exchanged DNA do not count towards absorb objectives." - needs_button = FALSE - dna_cost = 0 - chemical_cost = -1 - -/datum/action/changeling/hivemind_comms/on_purchase(mob/user, is_respec) - ..() - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) - changeling.changeling_speak = 1 - to_chat(user, "Use say \"[MODE_TOKEN_CHANGELING] message\" to communicate with the other changelings.") - var/datum/action/changeling/hivemind_upload/S1 = new - if(!changeling.has_sting(S1)) - S1.Grant(user) - changeling.purchasedpowers+=S1 - var/datum/action/changeling/hivemind_download/S2 = new - if(!changeling.has_sting(S2)) - S2.Grant(user) - changeling.purchasedpowers+=S2 - -/datum/action/changeling/hivemind_comms/Remove(mob/user) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) - if(changeling.changeling_speak) - changeling.changeling_speak = FALSE - for(var/p in changeling.purchasedpowers) - var/datum/action/changeling/otherpower = p - if(istype(otherpower, /datum/action/changeling/hivemind_upload) || istype(otherpower, /datum/action/changeling/hivemind_download)) - changeling.purchasedpowers -= otherpower - otherpower.Remove(changeling.owner.current) - ..() - - // HIVE MIND UPLOAD/DOWNLOAD DNA GLOBAL_LIST_EMPTY(hivemind_bank) diff --git a/code/modules/antagonists/changeling/powers/linglink.dm b/code/modules/antagonists/changeling/powers/linglink.dm deleted file mode 100644 index 47113429ba8..00000000000 --- a/code/modules/antagonists/changeling/powers/linglink.dm +++ /dev/null @@ -1,75 +0,0 @@ -/datum/action/changeling/linglink - name = "Hivemind Link" - desc = "We link our victim's mind into the hivemind for personal interrogation." - helptext = "If we find a human mad enough to support our cause, this can be a helpful tool to stay in touch." - button_icon_state = "hivemind_link" - chemical_cost = 0 - dna_cost = 0 - req_human = 1 - -/datum/action/changeling/linglink/can_sting(mob/living/carbon/user) - if(!..()) - return - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) - if(changeling.islinking) - to_chat(user, "We have already formed a link with the victim!") - return - if(!user.pulling) - to_chat(user, "We must be tightly grabbing a creature to link with them!") - return - if(!iscarbon(user.pulling)) - to_chat(user, "We cannot link with this creature!") - return - var/mob/living/carbon/target = user.pulling - - if(!target.mind) - to_chat(user, "The victim has no mind to link to!") - return - if(target.stat == DEAD) - to_chat(user, "The victim is dead, you cannot link to a dead mind!") - return - if(target.mind.has_antag_datum(/datum/antagonist/changeling)) - to_chat(user, "The victim is already a part of the hivemind!") - return - if(user.grab_state <= GRAB_AGGRESSIVE) - to_chat(user, "We must have a tighter grip to link with this creature!") - return - return changeling.can_absorb_dna(target) - -/datum/action/changeling/linglink/sting_action(mob/user) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) - var/mob/living/carbon/human/target = user.pulling - changeling.islinking = 1 - for(var/i in 1 to 3) - switch(i) - if(1) - to_chat(user, "This creature is compatible. We must hold still...") - if(2) - to_chat(user, "We stealthily stab [target] with a minor proboscis...") - to_chat(target, "You experience a stabbing sensation and your ears begin to ring...") - if(3) - to_chat(user, "We mold the [target]'s mind like clay, granting [target.p_them()] the ability to speak in the hivemind!") - to_chat(target, "A migraine throbs behind your eyes, you hear yourself screaming - but your mouth has not opened!") - for(var/mi in GLOB.mob_list) - var/mob/M = mi - if(M.lingcheck() == LINGHIVE_LING) - to_chat(M, "We can sense a foreign presence in the hivemind...") - target.mind.linglink = 1 - target.say("[MODE_TOKEN_CHANGELING] AAAAARRRRGGGGGHHHHH!!") - to_chat(target, "You can now communicate in the changeling hivemind, say \"[MODE_TOKEN_CHANGELING] message\" to communicate!") - SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]", "[i]")) - if(!do_mob(user, target, 20)) - to_chat(user, "Our link with [target] has ended!") - changeling.islinking = 0 - target.mind.linglink = 0 - return - - to_chat(user, "We must keep holding on to [target] to sustain the link. ") - while(user.pulling && user.grab_state >= GRAB_NECK) - target.reagents.add_reagent(/datum/reagent/medicine/salbutamol, 0.5) // So they don't choke to death while you interrogate them - do_mob(user, target, 10 SECONDS, timed_action_flags = (IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM)) - - changeling.islinking = 0 - target.mind.linglink = 0 - to_chat(user, "You cannot sustain the connection any longer, your victim fades from the hivemind!") - to_chat(target, "The link cannot be sustained any longer, your connection to the hivemind has faded!") diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 394c8e622ba..e21cf1bd5ab 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -760,6 +760,18 @@ mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage/blood fire_sound = 'sound/magic/wand_teleport.ogg' +/obj/item/gun/ballistic/rifle/boltaction/enchanted/arcane_barrage/blood/can_trigger_gun(mob/living/user) + . = ..() + if(!iscultist(user)) + to_chat(user, "\"Did you truly think that you could channel MY blood without my approval? Amusing, but futile.\"") + if(iscarbon(user)) + var/mob/living/carbon/C = user + if(C.active_hand_index == 1) + C.apply_damage(20, BRUTE, BODY_ZONE_L_ARM, wound_bonus = 20, sharpness = SHARP_EDGED) //oof ouch + else + C.apply_damage(20, BRUTE, BODY_ZONE_R_ARM, wound_bonus = 20, sharpness = SHARP_EDGED) + qdel(src) + return FALSE /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage/blood ammo_type = /obj/item/ammo_casing/magic/arcane_barrage/blood diff --git a/code/modules/antagonists/morph/morph.dm b/code/modules/antagonists/morph/morph.dm index 606dd1e7202..ac275aebc4c 100644 --- a/code/modules/antagonists/morph/morph.dm +++ b/code/modules/antagonists/morph/morph.dm @@ -97,8 +97,8 @@ copy_overlays(target) alpha = max(alpha, 150) //fucking chameleons transform = initial(transform) - pixel_y = initial(pixel_y) - pixel_x = initial(pixel_x) + pixel_y = base_pixel_y + pixel_x = base_pixel_x //Morphed is weaker melee_damage_lower = melee_damage_disguised diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index 0f0ee164ea3..884958a7242 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -229,12 +229,24 @@ cost = 3 no_coexistance_typecache = /obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage +/datum/spellbook_entry/infinite_guns/Refund(mob/living/carbon/human/user, obj/item/spellbook/book) + for (var/obj/item/currentItem in user.get_all_gear()) + if (currentItem.type == /obj/item/gun/ballistic/rifle/boltaction/enchanted) + qdel(currentItem) + return ..() + /datum/spellbook_entry/arcane_barrage name = "Arcane Barrage" spell_type = /obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage cost = 3 no_coexistance_typecache = /obj/effect/proc_holder/spell/targeted/infinite_guns/gun +/datum/spellbook_entry/arcane_barrage/Refund(mob/living/carbon/human/user, obj/item/spellbook/book) + for (var/obj/item/currentItem in user.get_all_gear()) + if (currentItem.type == /obj/item/gun/ballistic/rifle/boltaction/enchanted/arcane_barrage) + qdel(currentItem) + return ..() + /datum/spellbook_entry/barnyard name = "Barnyard Curse" spell_type = /obj/effect/proc_holder/spell/pointed/barnyardcurse diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index c662842181f..e91f397c12f 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -81,7 +81,7 @@ /obj/machinery/portable_atmospherics/canister/examine(user) . = ..() if(mode) - . += "This canister is [mode]. A sticker on its side says MAX PRESSURE: [siunit(pressure_limit, "Pa", 0)]." + . += "This canister is [mode]. A sticker on its side says MAX PRESSURE: [siunit_pressure(pressure_limit, 0)]." /obj/machinery/portable_atmospherics/canister/nitrogen name = "Nitrogen canister" diff --git a/code/modules/cargo/bounties/item.dm b/code/modules/cargo/bounties/item.dm index b2586d7c5ba..1c2331e9f16 100644 --- a/code/modules/cargo/bounties/item.dm +++ b/code/modules/cargo/bounties/item.dm @@ -1,14 +1,29 @@ /datum/bounty/item + ///How many items have to be shipped to complete the bounty var/required_count = 1 + ///How many items have been shipped for the bounty so far 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. + ///Types accepted by the bounty (including all subtypes, unless include_subtypes is set to FALSE) + var/list/wanted_types + ///Set to FALSE to make the bounty not accept subtypes of the wanted_types + var/include_subtypes = TRUE + ///Types that should not be accepted by the bounty, also excluding all their subtypes + var/list/exclude_types + ///Individual types that should be accepted even if their supertypes are excluded (yes, apparently this is necessary) + var/list/special_include_types /datum/bounty/item/New() ..() - wanted_types = typecacheof(wanted_types) - exclude_types = typecacheof(exclude_types) + wanted_types = typecacheof(wanted_types, only_root_path = !include_subtypes) + if (exclude_types) + exclude_types = string_assoc_list(typecacheof(exclude_types)) + for (var/e_type in exclude_types) + wanted_types[e_type] = FALSE + if (special_include_types) + for (var/i_type in special_include_types) + wanted_types[i_type] = TRUE + wanted_types = string_assoc_list(wanted_types) + /datum/bounty/item/completion_string() return {"[shipped_count]/[required_count]"} @@ -17,9 +32,7 @@ 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))) + if(!is_type_in_typecache(O, wanted_types)) return FALSE if(O.flags_1 & HOLOGRAM_1) return FALSE @@ -36,4 +49,3 @@ /datum/bounty/item/compatible_with(datum/other_bounty) return type != other_bounty.type - diff --git a/code/modules/cargo/bounties/medical.dm b/code/modules/cargo/bounties/medical.dm index ceb18dd5814..7b2b0bc97c5 100644 --- a/code/modules/cargo/bounties/medical.dm +++ b/code/modules/cargo/bounties/medical.dm @@ -2,16 +2,18 @@ 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! We'll take a better cybernetic one, if need be." reward = 3000 - wanted_types = list(/obj/item/organ/heart, /obj/item/organ/heart/cybernetic/tier2, /obj/item/organ/heart/cybernetic/tier3) + wanted_types = list(/obj/item/organ/heart) exclude_types = list(/obj/item/organ/heart/cybernetic)//Excluding tier 1s, no cheesing. + special_include_types = list(/obj/item/organ/heart/cybernetic/tier2, /obj/item/organ/heart/cybernetic/tier3) /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. We'll take a better cybernetic one, if need be." reward = 10000 required_count = 3 - wanted_types = list(/obj/item/organ/lungs, /obj/item/organ/lungs/cybernetic/tier2, /obj/item/organ/lungs/cybernetic/tier3) + wanted_types = list(/obj/item/organ/lungs) exclude_types = list(/obj/item/organ/lungs/cybernetic)//As above, for all printable organs. + special_include_types = list(/obj/item/organ/lungs/cybernetic/tier2, /obj/item/organ/lungs/cybernetic/tier3) /datum/bounty/item/medical/appendix name = "Appendix" @@ -24,16 +26,18 @@ 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, /obj/item/organ/ears/cybernetic/upgraded) + wanted_types = list(/obj/item/organ/ears) exclude_types = list(/obj/item/organ/ears/cybernetic) + special_include_types = list(/obj/item/organ/ears/cybernetic/upgraded) /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?" + 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? We'll take better cybernetic ones, if need be." reward = 10000 required_count = 3 - wanted_types = list(/obj/item/organ/liver, /obj/item/organ/liver/cybernetic/tier2, /obj/item/organ/liver/cybernetic/tier3) + wanted_types = list(/obj/item/organ/liver) exclude_types = list(/obj/item/organ/liver/cybernetic) + special_include_types = list(/obj/item/organ/liver/cybernetic/tier2, /obj/item/organ/liver/cybernetic/tier3) /datum/bounty/item/medical/eye name = "Organic Eyes" diff --git a/code/modules/cargo/gondolapod.dm b/code/modules/cargo/gondolapod.dm index d8fa2f80a47..8ede2a26dc2 100644 --- a/code/modules/cargo/gondolapod.dm +++ b/code/modules/cargo/gondolapod.dm @@ -14,7 +14,9 @@ icon_state = "gondola" icon_living = "gondola" pixel_x = -16//2x2 sprite + base_pixel_x = -16 pixel_y = -5 + base_pixel_y = -5 layer = TABLE_LAYER//so that deliveries dont appear underneath it loot = list(/obj/effect/decal/cleanable/blood/gibs, /obj/item/stack/sheet/animalhide/gondola = 2, /obj/item/food/meat/slab/gondola = 2) //Gondolas aren't affected by cold. diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 506ee5cf3ba..228a0b557c8 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -235,7 +235,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car ambientocclusion = sanitize_integer(ambientocclusion, FALSE, TRUE, initial(ambientocclusion)) auto_fit_viewport = sanitize_integer(auto_fit_viewport, FALSE, TRUE, initial(auto_fit_viewport)) widescreenpref = sanitize_integer(widescreenpref, FALSE, TRUE, initial(widescreenpref)) - pixel_size = sanitize_integer(pixel_size, PIXEL_SCALING_AUTO, PIXEL_SCALING_3X, initial(pixel_size)) + pixel_size = sanitize_float(pixel_size, PIXEL_SCALING_AUTO, PIXEL_SCALING_3X, 0.5, initial(pixel_size)) scaling_method = sanitize_text(scaling_method, initial(scaling_method)) ghost_form = sanitize_inlist(ghost_form, GLOB.ghost_forms, initial(ghost_form)) ghost_orbit = sanitize_inlist(ghost_orbit, GLOB.ghost_orbits, initial(ghost_orbit)) diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 4758c3b9d5a..9259928ef61 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -3,6 +3,9 @@ //Example usage TOGGLE_CHECKBOX(datum/verbs/menu/settings/Ghost/chatterbox, toggle_ghost_ears)() +/datum/verbs/menu/settings + name = "Settings" + //override because we don't want to save preferences twice. /datum/verbs/menu/settings/Set_checked(client/C, verbpath) if (checkbox == CHECKBOX_GROUP) @@ -19,6 +22,9 @@ usr.client.prefs.current_tab = 1 usr.client.prefs.ShowChoices(usr) +/datum/verbs/menu/settings/ghost + name = "Ghost" + //toggles /datum/verbs/menu/settings/ghost/chatterbox name = "Chat Box Spam" @@ -126,6 +132,9 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/settings/ghost, togglemidroundantag)() /datum/verbs/menu/settings/ghost/togglemidroundantag/Get_checked(client/C) return C.prefs.toggles & MIDROUND_ANTAG +/datum/verbs/menu/settings/sound + name = "Sound" + TOGGLE_CHECKBOX(/datum/verbs/menu/settings/sound, toggletitlemusic)() set name = "Hear/Silence Lobby Music" set category = "Preferences" diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index bce61a4adb1..97feb275bdb 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -11,6 +11,8 @@ var/transfer_prints = FALSE strip_delay = 20 equip_delay_other = 40 + // Path variable. If defined, will produced the type through interaction with wirecutters. + var/cut_type = null /obj/item/clothing/gloves/wash(clean_types) . = ..() @@ -39,3 +41,13 @@ // Called just before an attack_hand(), in mob/UnarmedAttack() /obj/item/clothing/gloves/proc/Touch(atom/A, proximity) return FALSE // return 1 to cancel attack_hand() + +/obj/item/clothing/gloves/wirecutter_act(mob/living/user, obj/item/I) + . = ..() + if(!cut_type) + return + if(icon_state != initial(icon_state)) + return // We don't want to cut dyed gloves. + new cut_type(drop_location()) + qdel(src) + return TRUE diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index dcd0288ab2b..33c4a063687 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -11,6 +11,7 @@ resistance_flags = NONE custom_price = 1200 custom_premium_price = 1200 + cut_type = /obj/item/clothing/gloves/cut /obj/item/toy/sprayoncan name = "spray-on insulation applicator" @@ -67,6 +68,7 @@ siemens_coefficient = 1 //Set to a default of 1, gets overridden in Initialize() permeability_coefficient = 0.05 resistance_flags = NONE + cut_type = /obj/item/clothing/gloves/cut /obj/item/clothing/gloves/color/fyellow/Initialize() . = ..() @@ -80,6 +82,16 @@ . = ..() siemens_coefficient = pick(0,0,0,0.5,0.5,0.5,0.75) +/obj/item/clothing/gloves/cut + desc = "These gloves would protect the wearer from electric shock... if the fingers were covered." + name = "fingerless insulated gloves" + icon_state = "yellowcut" + inhand_icon_state = "ygloves" + transfer_prints = TRUE + +/obj/item/clothing/gloves/cut/heirloom + desc = "The old gloves your great grandfather stole from Engineering, many moons ago. They've seen some tough times recently." + /obj/item/clothing/gloves/color/black desc = "These gloves are fire-resistant." name = "black gloves" @@ -90,16 +102,7 @@ heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE - var/can_be_cut = TRUE - -/obj/item/clothing/gloves/color/black/attackby(obj/item/I, mob/user, params) - if(I.tool_behaviour == TOOL_WIRECUTTER) - if(can_be_cut && icon_state == initial(icon_state))//only if not dyed - to_chat(user, "You snip the fingertips off of [src].") - I.play_tool_sound(src) - new /obj/item/clothing/gloves/fingerless(drop_location()) - qdel(src) - ..() + cut_type = /obj/item/clothing/gloves/fingerless /obj/item/clothing/gloves/color/orange name = "orange gloves" diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 3f3a82a9bf8..7019a9beb1c 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -9,7 +9,7 @@ clothing_flags = SNUG_FIT resistance_flags = FIRE_PROOF dynamic_hair_suffix = "+generic" - light_system = MOVABLE_LIGHT + light_system = MOVABLE_LIGHT_DIRECTIONAL light_range = 4 light_power = 0.8 light_on = FALSE diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index dccf8594138..8cb0fdd6ba5 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -9,7 +9,7 @@ inhand_icon_state = "eng_helm" max_integrity = 300 armor = list(MELEE = 10, BULLET = 5, LASER = 10, ENERGY = 20, BOMB = 10, BIO = 100, RAD = 75, FIRE = 50, ACID = 75) - light_system = MOVABLE_LIGHT + light_system = MOVABLE_LIGHT_DIRECTIONAL light_range = 4 light_power = 1 light_on = FALSE diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 050f179c86f..e7b6d18b2a2 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -193,7 +193,7 @@ Contains: // ERT suit's gets EMP Protection /obj/item/clothing/suit/space/hardsuit/ert/Initialize() . = ..() - AddComponent(/datum/component/empprotection, EMP_PROTECT_CONTENTS) + AddElement(/datum/element/empprotection, EMP_PROTECT_CONTENTS) //ERT Security /obj/item/clothing/head/helmet/space/hardsuit/ert/sec diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 1fceaa16941..ae06fa523cf 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -45,7 +45,7 @@ tint = 2 armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 100, ACID = 75) resistance_flags = FIRE_PROOF - light_system = MOVABLE_LIGHT + light_system = MOVABLE_LIGHT_DIRECTIONAL light_range = 4 light_on = FALSE var/helmet_on = FALSE diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 89c31746ca3..de1f3ffc0a4 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -40,10 +40,15 @@ /obj/item/clothing/suit/toggle/labcoat/virologist name = "virologist labcoat" - desc = "A suit that protects against minor chemical spills. Offers slightly more protection against biohazards than the standard model. Has a green stripe on the shoulder." + desc = "A suit that protects against minor chemical spills. Has a green stripe on the shoulder." icon_state = "labcoat_vir" /obj/item/clothing/suit/toggle/labcoat/science name = "scientist labcoat" desc = "A suit that protects against minor chemical spills. Has a purple stripe on the shoulder." icon_state = "labcoat_tox" + +/obj/item/clothing/suit/toggle/labcoat/roboticist + name = "roboticist labcoat" + desc = "More like an eccentric coat than a labcoat. Helps pass off bloodstains as part of the aesthetic. Comes with red shoulder pads." + icon_state = "labcoat_robo" diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm index a1ab9559d35..fda60c10c88 100644 --- a/code/modules/clothing/suits/reactive_armour.dm +++ b/code/modules/clothing/suits/reactive_armour.dm @@ -72,28 +72,13 @@ if(!active) return FALSE if(prob(hit_reaction_chance)) - var/mob/living/carbon/human/H = owner if(world.time < reactivearmor_cooldown) - owner.visible_message("The reactive teleport system is still recharging! It fails to teleport [H]!") + owner.visible_message("The reactive teleport system is still recharging! It fails to teleport [owner]!") return FALSE - owner.visible_message("The reactive teleport system flings [H] clear of [attack_text], shutting itself off in the process!") + owner.visible_message("The reactive teleport system flings [owner] clear of [attack_text], shutting itself off in the process!") playsound(get_turf(owner),'sound/magic/blink.ogg', 100, TRUE) - var/list/turfs = new/list() - for(var/turf/T in orange(tele_range, H)) - if(T.density) - continue - if(T.x>world.maxx-tele_range || T.xworld.maxy-tele_range || T.yThe machine now has [stored_matter] monkey\s worth of material stored.")) /obj/machinery/monkey_recycler/interact(mob/user) diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index edba9ab3feb..710f3b8ab81 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -123,7 +123,7 @@ log_admin("DEBUG: [O] in processor doesn't have a suitable recipe. How do you put it in?") continue process_food(P, O) - pixel_x = initial(pixel_x) //return to its spot after shaking + pixel_x = base_pixel_x //return to its spot after shaking processing = FALSE visible_message("\The [src] finishes processing.") @@ -155,12 +155,12 @@ if(!(i = slimecores.Find(AM.type))) // If the item is not found return if (i <= 16) // If in the first 12 slots - AM.pixel_x = -12 + ((i%4)*8) - AM.pixel_y = -12 + (round(i/4)*8) + AM.pixel_x = AM.base_pixel_x - 12 + ((i%4)*8) + AM.pixel_y = AM.base_pixel_y - 12 + (round(i/4)*8) return i var/ii = i - 16 - AM.pixel_x = -8 + ((ii%3)*8) - AM.pixel_y = -8 + (round(ii/3)*8) + AM.pixel_x = AM.base_pixel_x - 8 + ((ii%3)*8) + AM.pixel_y = AM.base_pixel_y - 8 + (round(ii/3)*8) return i /obj/machinery/processor/slime/process() diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm index d1c3fd82e3b..f14d2726bb7 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm @@ -300,7 +300,8 @@ /datum/reagent/water = 10, /obj/item/reagent_containers/food/snacks/grown/peas = 2, /obj/item/reagent_containers/food/snacks/grown/parsnip = 1, - /obj/item/reagent_containers/food/snacks/grown/carrot = 1 + /obj/item/reagent_containers/food/snacks/grown/carrot = 1, + /obj/item/reagent_containers/glass/bowl = 1 ) result = /obj/item/food/soup/peasoup subcategory = CAT_SOUP diff --git a/code/modules/hydroponics/beekeeping/honey_frame.dm b/code/modules/hydroponics/beekeeping/honey_frame.dm index 370b31da177..71f9be1c8fd 100644 --- a/code/modules/hydroponics/beekeeping/honey_frame.dm +++ b/code/modules/hydroponics/beekeeping/honey_frame.dm @@ -9,5 +9,5 @@ /obj/item/honey_frame/Initialize() . = ..() - pixel_x = rand(8,-8) - pixel_y = rand(8,-8) + pixel_x = base_pixel_x + rand(8, -8) + pixel_y = base_pixel_y + rand(8, -8) diff --git a/code/modules/hydroponics/beekeeping/honeycomb.dm b/code/modules/hydroponics/beekeeping/honeycomb.dm index c0ce6dfb6db..8018c40fe78 100644 --- a/code/modules/hydroponics/beekeeping/honeycomb.dm +++ b/code/modules/hydroponics/beekeeping/honeycomb.dm @@ -15,8 +15,8 @@ /obj/item/reagent_containers/honeycomb/Initialize() . = ..() - pixel_x = rand(8,-8) - pixel_y = rand(8,-8) + pixel_x = base_pixel_x + rand(8, -8) + pixel_y = base_pixel_y + rand(8, -8) update_icon() diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index f02c7df8540..d4852a40900 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -35,8 +35,8 @@ seed = new seed() seed.adjust_potency(50-seed.potency) - pixel_x = rand(-5, 5) - pixel_y = rand(-5, 5) + pixel_x = base_pixel_x + rand(-5, 5) + pixel_y = base_pixel_y + rand(-5, 5) if(dried_type == -1) dried_type = src.type diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index c0378a63293..50932a0e5d7 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -206,8 +206,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 = clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) - W.pixel_y = clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) + W.pixel_x = W.base_pixel_x + clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) + W.pixel_y = W.base_pixel_y + clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) else return ..() diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index 2fbca01cbc5..eb2ca46ef5d 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -19,8 +19,8 @@ seed = new seed() seed.adjust_potency(50-seed.potency) - pixel_x = rand(-5, 5) - pixel_y = rand(-5, 5) + pixel_x = base_pixel_x + rand(-5, 5) + pixel_y = base_pixel_y + rand(-5, 5) if(seed) for(var/datum/plant_gene/trait/T in seed.genes) diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index 5d5493aa03a..319decc4ae0 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -248,8 +248,8 @@ /obj/item/reagent_containers/glass/bottle/nutrient/Initialize() . = ..() - pixel_x = rand(-5, 5) - pixel_y = rand(-5, 5) + pixel_x = base_pixel_x + rand(-5, 5) + pixel_y = base_pixel_y + rand(-5, 5) /obj/item/reagent_containers/glass/bottle/nutrient/ez diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 0472d8bdc89..621b6488179 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -64,8 +64,8 @@ /obj/item/seeds/Initialize(mapload, nogenes = 0) . = ..() - pixel_x = rand(-8, 8) - pixel_y = rand(-8, 8) + pixel_x = base_pixel_x + rand(-8, 8) + pixel_y = base_pixel_y + rand(-8, 8) if(!icon_grow) icon_grow = "[species]-grow" diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm index 8c5def4e58a..cdfef62689f 100644 --- a/code/modules/jobs/job_types/roboticist.dm +++ b/code/modules/jobs/job_types/roboticist.dm @@ -29,7 +29,7 @@ l_pocket = /obj/item/pda/roboticist ears = /obj/item/radio/headset/headset_sci uniform = /obj/item/clothing/under/rank/rnd/roboticist - suit = /obj/item/clothing/suit/toggle/labcoat + suit = /obj/item/clothing/suit/toggle/labcoat/roboticist backpack = /obj/item/storage/backpack/science satchel = /obj/item/storage/backpack/satchel/tox diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm index 8f9bc67bbdb..e3897572632 100644 --- a/code/modules/lighting/lighting_atom.dm +++ b/code/modules/lighting/lighting_atom.dm @@ -2,19 +2,22 @@ // The proc you should always use to set the light of this atom. // Nonesensical value for l_color default, so we can detect if it gets set to null. #define NONSENSICAL_VALUE -99999 -/atom/proc/set_light(l_range, l_power, l_color = NONSENSICAL_VALUE) +/atom/proc/set_light(l_range, l_power, l_color = NONSENSICAL_VALUE, l_on) if(l_range > 0 && l_range < MINIMUM_USEFUL_LIGHT_RANGE) l_range = MINIMUM_USEFUL_LIGHT_RANGE //Brings the range up to 1.4, which is just barely brighter than the soft lighting that surrounds players. - if (l_power != null) + if (!isnull(l_power)) light_power = l_power - if (l_range != null) + if (!isnull(l_range)) light_range = l_range if (l_color != NONSENSICAL_VALUE) light_color = l_color - SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT, l_range, l_power, l_color) + if(!isnull(l_on)) + light_on = l_on + + SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT, l_range, l_power, l_color, l_on) update_light() @@ -30,7 +33,7 @@ if(light_system != STATIC_LIGHT) CRASH("update_light() for [src] with following light_system value: [light_system]") - if (!light_power || !light_range) // We won't emit light anyways, destroy the light source. + if (!light_power || !light_range || !light_on) // We won't emit light anyways, destroy the light source. QDEL_NULL(light) else if (!ismovable(loc)) // We choose what atom should be the top atom of the light here. diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index 9faa709c0b1..1f3472c7ba5 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -55,8 +55,9 @@ atmos_machines += A SSmapping.reg_in_areas_in_z(areas) - SSatoms.InitializeAtoms(turfs) - SSatoms.InitializeAtoms(atoms) + SSatoms.InitializeAtoms(areas + turfs + atoms) + // NOTE, now that Initialize and LateInitialize run correctly, do we really + // need these two below? SSmachines.setup_template_powernets(cables) SSair.setup_template_machinery(atmos_machines) diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm index c9b701facb3..558567ec9f3 100644 --- a/code/modules/mining/lavaland/ash_flora.dm +++ b/code/modules/mining/lavaland/ash_flora.dm @@ -180,8 +180,8 @@ /obj/item/reagent_containers/food/snacks/grown/ash_flora/Initialize() . = ..() - pixel_x = rand(-4, 4) - pixel_y = rand(-4, 4) + pixel_x = base_pixel_x + rand(-4, 4) + pixel_y = base_pixel_y + rand(-4, 4) /obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings //So we can't craft bowls from everything. diff --git a/code/modules/mining/lavaland/ruins/gym.dm b/code/modules/mining/lavaland/ruins/gym.dm index ba0dbdd0449..d37f7c14bd9 100644 --- a/code/modules/mining/lavaland/ruins/gym.dm +++ b/code/modules/mining/lavaland/ruins/gym.dm @@ -48,7 +48,7 @@ playsound(user, 'sound/machines/click.ogg', 60, TRUE) obj_flags &= ~IN_USE - user.pixel_y = 0 + user.pixel_y = user.base_pixel_y var/finishmessage = pick("You feel stronger!","You feel like you can take on the world!","You feel robust!","You feel indestructible!") SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "exercise", /datum/mood_event/exercise) icon_state = initial(icon_state) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index cade32a68b7..5b9ed970a44 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -318,8 +318,8 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/stack/ore/Initialize() . = ..() - pixel_x = rand(0,16)-8 - pixel_y = rand(0,8)-8 + pixel_x = base_pixel_x + rand(0, 16) - 8 + pixel_y = base_pixel_y + rand(0, 8) - 8 /obj/item/stack/ore/ex_act(severity, target) if (!severity || severity >= 2) @@ -353,8 +353,8 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ . = ..() coinflip = pick(sideslist) icon_state = "coin_[coinflip]" - pixel_x = rand(0,16)-8 - pixel_y = rand(0,8)-8 + pixel_x = base_pixel_x + rand(0, 16) - 8 + pixel_y = base_pixel_y + rand(0, 8) - 8 /obj/item/coin/set_custom_materials(list/materials, multiplier = 1) . = ..() diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index 87476fcf349..a7fe98e8b44 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -20,7 +20,7 @@ /obj/structure/ore_box/ComponentInitialize() . = ..() - AddComponent(/datum/component/rad_insulation, 0.01) //please datum mats no more cancer + AddElement(/datum/element/rad_insulation, 0.01) //please datum mats no more cancer /obj/structure/ore_box/crowbar_act(mob/living/user, obj/item/I) if(I.use_tool(src, user, 50, volume=50)) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 077c683ee8a..f64a88f5940 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -479,8 +479,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/stop_orbit(datum/component/orbiter/orbits) . = ..() //restart our floating animation after orbit is done. - pixel_y = 0 - animate(src, pixel_y = 2, time = 10, loop = -1) + pixel_y = base_pixel_y + animate(src, pixel_y = base_pixel_y + 2, time = 1 SECONDS, loop = -1) /mob/dead/observer/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak set category = "Ghost" diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 27f8e702c6f..0d1b86a65ad 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -173,8 +173,8 @@ if(I.pulledby) I.pulledby.stop_pulling() update_inv_hands() - I.pixel_x = initial(I.pixel_x) - I.pixel_y = initial(I.pixel_y) + I.pixel_x = I.base_pixel_x + I.pixel_y = I.base_pixel_y return hand_index //Puts the item into the first available left hand if possible and calls all necessary triggers/updates. returns 1 on success. @@ -284,8 +284,8 @@ /mob/proc/dropItemToGround(obj/item/I, force = FALSE, silent = FALSE) . = doUnEquip(I, force, drop_location(), FALSE, silent = silent) if(. && I) //ensure the item exists and that it was dropped properly. - I.pixel_x = rand(-6,6) - I.pixel_y = rand(-6,6) + I.pixel_x = I.base_pixel_x + rand(-6, 6) + I.pixel_y = I.base_pixel_y + 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/brain/brain_say.dm b/code/modules/mob/living/brain/brain_say.dm index 30099806a91..8438e904302 100644 --- a/code/modules/mob/living/brain/brain_say.dm +++ b/code/modules/mob/living/brain/brain_say.dm @@ -19,9 +19,6 @@ else return ..() -/mob/living/brain/lingcheck() - return LINGHIVE_NONE - /mob/living/brain/treat_message(message) message = capitalize(message) return message diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 69cad88162d..8faac355aaf 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -116,7 +116,7 @@ Des: Removes all infected images from the alien. return FALSE return TRUE -/mob/living/carbon/alien/get_standard_pixel_y_offset(lying = 0) +/mob/living/carbon/alien/get_standard_pixel_y_offset(lying = FALSE) return initial(pixel_y) /mob/living/carbon/alien/proc/alien_evolve(mob/living/carbon/alien/new_xeno) diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index eaa8743a1c9..1cd3feddb2c 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -80,7 +80,7 @@ pulledby.stop_pulling() . = 0 -/mob/living/carbon/alien/humanoid/get_standard_pixel_y_offset(lying = 0) +/mob/living/carbon/alien/humanoid/get_standard_pixel_y_offset(lying = FALSE) if(leaping) return -32 else if(custom_pixel_y_offset) diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid_update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid_update_icons.dm index 28357dfea4a..8e402b2950e 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid_update_icons.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid_update_icons.dm @@ -34,15 +34,15 @@ icon = alt_icon alt_icon = old_icon icon_state = "alien[caste]_leap" - pixel_x = -32 - pixel_y = -32 + pixel_x = base_pixel_x - 32 + pixel_y = base_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(body_position == LYING_DOWN) - pixel_y = get_standard_pixel_y_offset(body_position == LYING_DOWN) + pixel_x = base_pixel_x + get_standard_pixel_x_offset(body_position == LYING_DOWN) + pixel_y = base_pixel_y + get_standard_pixel_y_offset(body_position == LYING_DOWN) update_inv_hands() update_inv_handcuffed() diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index 3b8a435bae0..ba15f06583f 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -4,6 +4,7 @@ status_flags = 0 ventcrawler = VENTCRAWLER_NONE //pull over that ass too fat pixel_x = -16 + base_pixel_x = -16 bubble_icon = "alienroyal" mob_size = MOB_SIZE_LARGE layer = LARGE_MOB_LAYER //above most mobs, but below speechbubbles diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 718c220e462..0091cf763d7 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -404,7 +404,7 @@ update_inv_legcuffed() return TRUE -/mob/living/carbon/get_standard_pixel_y_offset(lying = 0) +/mob/living/carbon/get_standard_pixel_y_offset(lying = FALSE) if(lying) return -6 else diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm index fe0e3d4be1c..afb39e094d9 100644 --- a/code/modules/mob/living/carbon/carbon_update_icons.dm +++ b/code/modules/mob/living/carbon/carbon_update_icons.dm @@ -8,11 +8,11 @@ changed++ ntransform.TurnTo(lying_prev , lying_angle) if(!lying_angle) //Lying to standing - final_pixel_y = get_standard_pixel_y_offset() + final_pixel_y = base_pixel_y + get_standard_pixel_y_offset() else //if(lying != 0) if(lying_prev == 0) //Standing to lying - pixel_y = get_standard_pixel_y_offset() - final_pixel_y = get_standard_pixel_y_offset(lying_angle) + pixel_y = base_pixel_y + get_standard_pixel_y_offset() + final_pixel_y = base_pixel_y + get_standard_pixel_y_offset(lying_angle) if(dir & (EAST|WEST)) //Facing east or west final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass if(resize != RESIZE_DEFAULT_SIZE) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b7223d22fd2..bb951f31f3b 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1296,12 +1296,6 @@ /mob/living/carbon/human/species/golem/snow race = /datum/species/golem/snow -/mob/living/carbon/human/species/golem/capitalist - race = /datum/species/golem/capitalist - -/mob/living/carbon/human/species/golem/soviet - race = /datum/species/golem/soviet - /mob/living/carbon/human/species/jelly race = /datum/species/jelly diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 0fef6c5ec3c..a7bfe4598c4 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1286,18 +1286,6 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(attacker_style?.grab_act(user,target)) return TRUE else - //Steal them shoes - if(target.body_position == LYING_DOWN && (user.zone_selected == BODY_ZONE_L_LEG || user.zone_selected == BODY_ZONE_R_LEG) && user.a_intent == INTENT_GRAB && target.shoes) - var/obj/item/I = target.shoes - user.visible_message("[user] starts stealing [target]'s [I.name]!", - "You start stealing [target]'s [I.name]...", null, null, target) - to_chat(target, "[user] starts stealing your [I.name]!") - if(do_after(user, I.strip_delay, target)) - target.dropItemToGround(I, TRUE) - user.put_in_hands(I) - user.visible_message("[user] stole [target]'s [I.name]!", - "You stole [target]'s [I.name]!", null, null, target) - to_chat(target, "[user] stole your [I.name]!") target.grabbedby(user) return TRUE 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 4e786d99840..6bf80bc109a 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -1052,94 +1052,6 @@ action_icon = 'icons/obj/toy.dmi' action_icon_state = "snowball" -/datum/species/golem/capitalist - name = "Capitalist Golem" - id = "capitalist golem" - prefix = "Capitalist" - attack_verb = "monopoliz" - limbs_id = "ca_golem" - special_names = list("John D. Rockefeller","Rich Uncle Pennybags","Commodore Vanderbilt","Entrepreneur","Mr. Moneybags", "Adam Smith") - species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES) - fixed_mut_color = null - inherent_traits = list(TRAIT_NOFLASH,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) - info_text = "As a Capitalist Golem, your fist spreads the powerful industrializing light of capitalism." - changesource_flags = MIRROR_BADMIN - random_eligible = FALSE - - var/last_cash = 0 - var/cash_cooldown = 100 - -/datum/species/golem/capitalist/on_species_gain(mob/living/carbon/C, datum/species/old_species) - . = ..() - C.equip_to_slot_or_del(new /obj/item/clothing/head/that (), ITEM_SLOT_HEAD) - C.equip_to_slot_or_del(new /obj/item/clothing/glasses/monocle (), ITEM_SLOT_EYES) - C.revive(full_heal = TRUE, admin_revive = FALSE) - - SEND_SOUND(C, sound('sound/misc/capitialism.ogg')) - C.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock ()) - RegisterSignal(C, COMSIG_MOB_SAY, .proc/handle_speech) - -/datum/species/golem/capitalist/on_species_loss(mob/living/carbon/C) - . = ..() - UnregisterSignal(C, COMSIG_MOB_SAY) - for(var/obj/effect/proc_holder/spell/aoe_turf/knock/spell in C.mob_spell_list) - C.RemoveSpell(spell) - -/datum/species/golem/capitalist/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target) - ..() - if(isgolem(target)) - return - if(target.nutrition >= NUTRITION_LEVEL_FAT) - target.set_species(/datum/species/golem/capitalist) - return - target.adjust_nutrition(40) - -/datum/species/golem/capitalist/proc/handle_speech(datum/source, list/speech_args) - playsound(source, 'sound/misc/mymoney.ogg', 25, FALSE) - speech_args[SPEECH_MESSAGE] = "Hello, I like money!" - -/datum/species/golem/soviet - name = "Soviet Golem" - id = "soviet golem" - prefix = "Comrade" - attack_verb = "nationaliz" - limbs_id = "s_golem" - special_names = list("Stalin","Lenin","Trotsky","Marx","Comrade") //comrade comrade - species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES) - fixed_mut_color = null - inherent_traits = list(TRAIT_NOFLASH, TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) - info_text = "As a Soviet Golem, your fist spreads the bright soviet light of communism." - changesource_flags = MIRROR_BADMIN - random_eligible = FALSE - -/datum/species/golem/soviet/on_species_gain(mob/living/carbon/C, datum/species/old_species) - . = ..() - C.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka (), ITEM_SLOT_HEAD) - C.revive(full_heal = TRUE, admin_revive = FALSE) - - SEND_SOUND(C, sound('sound/misc/Russian_Anthem_chorus.ogg')) - C.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock ()) - RegisterSignal(C, COMSIG_MOB_SAY, .proc/handle_speech) - -/datum/species/golem/soviet/on_species_loss(mob/living/carbon/C) - . = ..() - for(var/obj/effect/proc_holder/spell/aoe_turf/knock/spell in C.mob_spell_list) - C.RemoveSpell(spell) - UnregisterSignal(C, COMSIG_MOB_SAY, .proc/handle_speech) - -/datum/species/golem/soviet/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target) - ..() - if(isgolem(target)) - return - if(target.nutrition <= NUTRITION_LEVEL_STARVING) - target.set_species(/datum/species/golem/soviet) - return - target.adjust_nutrition(-40) - -/datum/species/golem/soviet/proc/handle_speech(datum/source, list/speech_args) - playsound(source, 'sound/misc/Cyka Blyat.ogg', 25, FALSE) - speech_args[SPEECH_MESSAGE] = "Cyka Blyat" - /datum/species/golem/mhydrogen name = "Metallic Hydrogen Golem" id = "Metallic Hydrogen golem" diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index b0461b3cda8..84c188fb6e0 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -248,7 +248,6 @@ /obj/item/light_eater/proc/disintegrate(obj/item/O, atom/A) if(istype(O, /obj/item/pda)) var/obj/item/pda/PDA = O - PDA.set_light(0) PDA.set_light_on(FALSE) PDA.set_light_range(0) //It won't be turning on again. PDA.update_icon() 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 80f15653616..4911e6f1ca8 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -123,7 +123,7 @@ . = ..() var/obj/item/organ/heart/vampire/darkheart = getorgan(/obj/item/organ/heart/vampire) if(darkheart) - . += "Current blood level: [blood_volume]/[BLOOD_VOLUME_MAXIMUM]." + . += "Current blood level: [blood_volume]/[BLOOD_VOLUME_MAXIMUM]." /obj/item/organ/heart/vampire diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index e0552576503..862742b8d00 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -322,22 +322,22 @@ M.setDir(get_dir(M, src)) switch(M.dir) if(NORTH) - animate(M, pixel_x = 0, pixel_y = offset, 3) + animate(M, pixel_x = M.base_pixel_x, pixel_y = M.base_pixel_y + offset, 3) if(SOUTH) - animate(M, pixel_x = 0, pixel_y = -offset, 3) + animate(M, pixel_x = M.base_pixel_x, pixel_y = M.base_pixel_y - offset, 3) if(EAST) if(M.lying_angle == 270) //update the dragged dude's direction if we've turned M.set_lying_angle(90) - animate(M, pixel_x = offset, pixel_y = 0, 3) + animate(M, pixel_x = M.base_pixel_x + offset, pixel_y = M.base_pixel_y, 3) if(WEST) if(M.lying_angle == 90) M.set_lying_angle(270) - animate(M, pixel_x = -offset, pixel_y = 0, 3) + animate(M, pixel_x = M.base_pixel_x - offset, pixel_y = M.base_pixel_y, 3) /mob/living/proc/reset_pull_offsets(mob/living/M, override) if(!override && M.buckled) return - animate(M, pixel_x = 0, pixel_y = 0, 1) + animate(M, pixel_x = base_pixel_x, pixel_y = base_pixel_y, 1) //mob verbs are a lot faster than object verbs //for more info on why this is not atom/pull, see examinate() in mob.dm @@ -947,7 +947,7 @@ animate(src, pixel_y = pixel_y - 2, time = 10, loop = -1) setMovetype(movement_type | FLOATING) else if(((!on || fixed) && (movement_type & FLOATING))) - animate(src, pixel_y = get_standard_pixel_y_offset(lying_angle), time = 10) + animate(src, pixel_y = base_pixel_y + get_standard_pixel_y_offset(lying_angle), time = 1 SECONDS) setMovetype(movement_type & ~FLOATING) // The src mob is trying to strip an item from someone @@ -959,6 +959,7 @@ who.visible_message("[src] tries to remove [who]'s [what.name].", \ "[src] tries to remove your [what.name].", null, null, src) to_chat(src, "You try to remove [who]'s [what.name]...") + log_combat(src, who, "started stripping [what] off") what.add_fingerprint(src) if(do_mob(src, who, what.strip_delay)) if(what && Adjacent(who)) @@ -1034,8 +1035,8 @@ var/amplitude = min(4, (jitteriness/100) + 1) var/pixel_x_diff = rand(-amplitude, amplitude) var/pixel_y_diff = rand(-amplitude/3, amplitude/3) - var/final_pixel_x = get_standard_pixel_x_offset(body_position == LYING_DOWN) - var/final_pixel_y = get_standard_pixel_y_offset(body_position == LYING_DOWN) + var/final_pixel_x = base_pixel_x + get_standard_pixel_x_offset(body_position == LYING_DOWN) + var/final_pixel_y = base_pixel_y + get_standard_pixel_y_offset(body_position == LYING_DOWN) animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff , time = 2, loop = 6) animate(pixel_x = final_pixel_x , pixel_y = final_pixel_y , time = 2) setMovetype(movement_type & ~FLOATING) // If we were without gravity, the bouncing animation got stopped, so we make sure to restart it in next life(). @@ -1052,10 +1053,10 @@ loc_temp = heat_turf.temperature return loc_temp -/mob/living/proc/get_standard_pixel_x_offset(lying = 0) +/mob/living/proc/get_standard_pixel_x_offset(lying = FALSE) return initial(pixel_x) -/mob/living/proc/get_standard_pixel_y_offset(lying = 0) +/mob/living/proc/get_standard_pixel_y_offset(lying = FALSE) return initial(pixel_y) /mob/living/cancel_camera() @@ -1286,17 +1287,6 @@ L[++L.len] = list("[A.panel]",A.get_panel_text(),A.name,"[REF(A)]") return L -/mob/living/lingcheck() - if(mind) - var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling) - if(changeling) - if(changeling.changeling_speak) - return LINGHIVE_LING - return LINGHIVE_OUTSIDER - if(mind?.linglink) - return LINGHIVE_LINK - return LINGHIVE_NONE - /mob/living/forceMove(atom/destination) stop_pulling() if(buckled) diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index 2678626e235..06915e2ad48 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -121,10 +121,10 @@ GLOBAL_LIST_INIT(department_radio_keys, list( if(SOFT_CRIT) message_mods[WHISPER_MODE] = MODE_WHISPER if(UNCONSCIOUS) - if(!(message_mods[MODE_CHANGELING] || message_mods[MODE_ALIEN])) + if(!message_mods[MODE_ALIEN]) return if(HARD_CRIT) - if(!(message_mods[WHISPER_MODE] || message_mods[MODE_CHANGELING] || message_mods[MODE_ALIEN])) + if(!(message_mods[WHISPER_MODE] || message_mods[MODE_ALIEN])) return if(DEAD) say_dead(original_message) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 73cc37ebd22..0e8f0207c12 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -13,7 +13,7 @@ radio = /obj/item/radio/borg blocks_emissive = EMISSIVE_BLOCK_UNIQUE - light_system = MOVABLE_LIGHT + light_system = MOVABLE_LIGHT_DIRECTIONAL light_on = FALSE var/custom_name = "" @@ -115,7 +115,7 @@ spark_system.attach(src) wires = new /datum/wires/robot(src) - AddComponent(/datum/component/empprotection, EMP_PROTECT_WIRES) + AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES) RegisterSignal(src, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, .proc/charge) robot_modules_background = new() diff --git a/code/modules/mob/living/silicon/silicon_say.dm b/code/modules/mob/living/silicon/silicon_say.dm index f147d28e7f6..a33d46d2f8e 100644 --- a/code/modules/mob/living/silicon/silicon_say.dm +++ b/code/modules/mob/living/silicon/silicon_say.dm @@ -26,9 +26,6 @@ /mob/living/silicon/binarycheck() return TRUE -/mob/living/silicon/lingcheck() - return FALSE //Borged or AI'd lings can't speak on the ling channel. - /mob/living/silicon/radio(message, list/message_mods = list(), list/spans, language) . = ..() if(.) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index eb8b06ca6f5..9880ba9f451 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -203,6 +203,15 @@ Auto Patrol: []"}, if(special_retaliate_after_attack(H)) return + // Turns an oversight into a feature. Beepsky will now announce when pacifists taunt him over sec comms. + if(HAS_TRAIT(H, TRAIT_PACIFISM)) + H.visible_message("[H] taunts [src], daring [p_them()] to give chase!", \ + "You taunt [src], daring [p_them()] to chase you!", "You hear someone shout a daring taunt!", DEFAULT_MESSAGE_RANGE, H) + speak("Taunted by pacifist scumbag [H] in [get_area(src)].", radio_channel) + + // Interrupt the attack chain. We've already handled this scenario for pacifists. + return + return ..() /mob/living/simple_animal/bot/secbot/attackby(obj/item/W, mob/user, params) diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 2aa0d7cceb7..9445f1a187c 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -276,8 +276,8 @@ /mob/living/simple_animal/chick/Initialize() . = ..() - pixel_x = rand(-6, 6) - pixel_y = rand(0, 10) + pixel_x = base_pixel_x + rand(-6, 6) + pixel_y = base_pixel_y + rand(0, 10) add_cell_sample() /mob/living/simple_animal/chick/add_cell_sample() @@ -347,8 +347,8 @@ icon_state = "[icon_prefix]_[body_color]" icon_living = "[icon_prefix]_[body_color]" icon_dead = "[icon_prefix]_[body_color]_dead" - pixel_x = rand(-6, 6) - pixel_y = rand(0, 10) + pixel_x = base_pixel_x + rand(-6, 6) + pixel_y = base_pixel_y + rand(0, 10) ++chicken_count add_cell_sample() diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 71c8c98cb85..9bfbc7cb1fe 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -182,6 +182,7 @@ maxHealth = 20 health = 20 pixel_x = -16 + base_pixel_x = -16 mob_size = MOB_SIZE_LARGE random_color = FALSE food_type = list() diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm index 1b9dcb366fd..fe410b194f3 100644 --- a/code/modules/mob/living/simple_animal/hostile/illusion.dm +++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm @@ -40,8 +40,9 @@ multiply_chance = replicate faction -= "neutral" transform = initial(transform) - pixel_y = initial(pixel_y) - pixel_x = initial(pixel_x) + pixel_x = base_pixel_x + pixel_y = base_pixel_y + /mob/living/simple_animal/hostile/illusion/examine(mob/user) if(parent_mob) diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm index 0c5506ab0a0..cb5d9e39b82 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm @@ -18,6 +18,7 @@ projectilesound = 'sound/weapons/pierce.ogg' ranged_cooldown_time = 30 pixel_x = -16 + base_pixel_x = -16 layer = LARGE_MOB_LAYER speed = 10 stat_attack = HARD_CRIT @@ -123,7 +124,9 @@ icon_state = "lily_pad" layer = BELOW_MOB_LAYER pixel_x = -32 + base_pixel_x = -32 pixel_y = -32 + base_pixel_y = -32 duration = 30 /mob/living/simple_animal/hostile/jungle/leaper/Initialize() diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm index 375a09e3869..841d24e8cf7 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm @@ -15,6 +15,7 @@ speed = 1 ranged = 1 pixel_x = -16 + base_pixel_x = -16 move_to_delay = 10 aggro_vision_range = 9 speak_emote = list("chitters") diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm index 17e1bb988a4..ef31752fedd 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm @@ -15,11 +15,13 @@ icon_dead = "mook_dead" mob_biotypes = MOB_ORGANIC|MOB_HUMANOID pixel_x = -16 + base_pixel_x = -16 + pixel_y = -8 + base_pixel_y = -8 maxHealth = 45 health = 45 melee_damage_lower = 30 melee_damage_upper = 30 - pixel_y = -8 ranged = TRUE ranged_cooldown_time = 10 pass_flags = LETPASSTHROW @@ -217,7 +219,9 @@ icon_state = "mook_leap_cloud" layer = BELOW_MOB_LAYER pixel_x = -16 + base_pixel_x = -16 pixel_y = -16 + base_pixel_y = -16 duration = 10 #undef MOOK_ATTACK_NEUTRAL diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm index 870c3cd0c56..8e20b79a229 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm @@ -18,7 +18,9 @@ melee_damage_lower = 30 melee_damage_upper = 30 pixel_x = -16 + base_pixel_x = -16 pixel_y = -14 + base_pixel_y = -14 minimum_distance = 3 move_to_delay = 20 vision_range = 9 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm index 9440257946f..5b414d364d5 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm @@ -40,6 +40,7 @@ Difficulty: Medium ranged = TRUE ranged_cooldown_time = 16 pixel_x = -16 + base_pixel_x = -16 crusher_loot = list(/obj/item/melee/transforming/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator, /obj/item/crusher_trophy/miner_eye) loot = list(/obj/item/melee/transforming/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator) wander = FALSE 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 34a0968e62b..a572fdc7f7a 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -54,6 +54,7 @@ Difficulty: Hard melee_queue_distance = 20 // as far as possible really, need this because of blood warp ranged = TRUE pixel_x = -32 + base_pixel_x = -32 del_on_death = TRUE crusher_loot = list(/obj/structure/closet/crate/necropolis/bubblegum/crusher) loot = list(/obj/structure/closet/crate/necropolis/bubblegum) 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 aa799eb0032..7a8f0f87605 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -44,6 +44,7 @@ Difficulty: Very Hard move_to_delay = 10 ranged = TRUE pixel_x = -32 + base_pixel_x = -32 del_on_death = TRUE gps_name = "Angelic Signal" achievement_type = /datum/award/achievement/boss/colossus_kill 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 32d4db1ed3c..96aadcd5a18 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -58,6 +58,7 @@ Difficulty: Medium move_to_delay = 5 ranged = TRUE pixel_x = -16 + base_pixel_x = -16 crusher_loot = list(/obj/structure/closet/crate/necropolis/dragon/crusher) loot = list(/obj/structure/closet/crate/necropolis/dragon) butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index 1c43ede1143..7edd36a4394 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -42,8 +42,10 @@ achievement_type = /datum/award/achievement/boss/legion_kill crusher_achievement_type = /datum/award/achievement/boss/legion_crusher score_achievement_type = /datum/award/score/legion_score - pixel_y = -16 pixel_x = -32 + base_pixel_x = -32 + pixel_y = -16 + base_pixel_y = -16 loot = list(/obj/item/stack/sheet/bone = 3) vision_range = 13 wander = FALSE 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 22f170ef90d..ada95a6c53c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -120,6 +120,9 @@ if(L.stat != DEAD) if(!client && ranged && ranged_cooldown <= world.time) OpenFire() + + if(L.health <= HEALTH_THRESHOLD_DEAD && HAS_TRAIT(L, TRAIT_NODEATH)) //Nope, it still gibs yall + devour(L) else devour(L) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm index 07520712f57..6ac5e103de9 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm @@ -29,6 +29,7 @@ Difficulty: Hard melee_queue_distance = 20 // as far as possible really, need this because of charging and teleports ranged = TRUE pixel_x = -16 + base_pixel_x = -16 loot = list() butcher_results = list() guaranteed_butcher_results = list(/obj/item/wendigo_blood = 1) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index 4601d83a42c..b13f01854b3 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -100,6 +100,7 @@ icon_dead = "watcher_dead" health_doll_icon = "watcher" pixel_x = -10 + base_pixel_x = -10 throw_message = "bounces harmlessly off of" melee_damage_lower = 15 melee_damage_upper = 15 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 75eb7a945b8..7a3fa749998 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 @@ -95,6 +95,7 @@ While using this makes the system rely on OnFire, it still gives options for tim icon = 'icons/obj/lavaland/tumor.dmi' icon_state = "tumor" pixel_x = -16 + base_pixel_x = -16 light_color = COLOR_SOFT_RED light_range = 3 anchored = TRUE 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 b4cf8bcf90d..d9792890b10 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -162,6 +162,7 @@ maxHealth = 150 health = 150 pixel_x = -16 + base_pixel_x = -16 speed = 10 harm_intent_damage = 5 melee_damage_lower = 5 @@ -187,6 +188,7 @@ maxHealth = 400 health = 400 pixel_x = -16 + base_pixel_x = -16 speed = 2 harm_intent_damage = 15 melee_damage_lower = 15 @@ -284,6 +286,7 @@ maxHealth = 130 health = 130 pixel_x = -16 + base_pixel_x = -16 speed = -5 harm_intent_damage = 10 melee_damage_lower = 10 diff --git a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm index 67c966383a2..3fe359d2b45 100644 --- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm @@ -49,6 +49,7 @@ mob_size = MOB_SIZE_LARGE armour_penetration = 30 pixel_x = -16 + base_pixel_x = -16 turns_per_move = 5 ranged = TRUE mouse_opacity = MOUSE_OPACITY_ICON diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 7d7148c0cc1..31b558d12a9 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -21,6 +21,7 @@ mob_size = MOB_SIZE_LARGE pixel_x = -16 + base_pixel_x = -16 harm_intent_damage = 5 melee_damage_lower = 8 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 c82142ace1f..419eb585e8f 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 @@ -129,7 +129,7 @@ /mob/living/simple_animal/hostile/venus_human_trap/Moved(atom/OldLoc, Dir) . = ..() - pixel_x = dir & (NORTH|WEST) ? 2 : -2 + pixel_x = base_pixel_x + (dir & (NORTH|WEST) ? 2 : -2) /mob/living/simple_animal/hostile/venus_human_trap/AttackingTarget() . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm index c958a784067..c2e567674a5 100644 --- a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm +++ b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm @@ -20,6 +20,7 @@ maxHealth = 50 health = 50 pixel_x = -16 + base_pixel_x = -16 harm_intent_damage = 5 obj_damage = 0 melee_damage_lower = 0 diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 3583968de77..47fc1507c28 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -142,10 +142,11 @@ if(buckled) buckled.unbuckle_mob(src,force=1) buckled = null - pixel_x = initial(pixel_x) - pixel_y = initial(pixel_y) + pixel_x = base_pixel_x + pixel_y = base_pixel_y + + return ..() - ..(gibbed) /mob/living/simple_animal/parrot/get_status_tab_items() . = ..() diff --git a/code/modules/mob/mob_say.dm b/code/modules/mob/mob_say.dm index 4326b71ceed..bcede6f82da 100644 --- a/code/modules/mob/mob_say.dm +++ b/code/modules/mob/mob_say.dm @@ -95,10 +95,6 @@ /mob/proc/hivecheck() return FALSE -///Check if the mob has a ling hivemind -/mob/proc/lingcheck() - return LINGHIVE_NONE - ///The amount of items we are looking for in the message #define MESSAGE_MODS_LENGTH 6 /** diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm index 81555340b21..1d074868c4a 100644 --- a/code/modules/modular_computers/hardware/_hardware.dm +++ b/code/modules/modular_computers/hardware/_hardware.dm @@ -24,8 +24,8 @@ /obj/item/computer_hardware/New(obj/L) ..() - pixel_x = rand(-8, 8) - pixel_y = rand(-8, 8) + pixel_x = base_pixel_x + rand(-8, 8) + pixel_y = base_pixel_y + rand(-8, 8) /obj/item/computer_hardware/Destroy() if(holder) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index d5ca09fe44c..a1808b2d503 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -101,8 +101,8 @@ /obj/item/paper/Initialize() . = ..() - pixel_y = rand(-8, 8) - pixel_x = rand(-9, 9) + pixel_x = base_pixel_x + rand(-9, 9) + pixel_y = base_pixel_y + rand(-8, 8) update_icon() /obj/item/paper/update_icon_state() diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm index 50a27914f62..bb530368655 100644 --- a/code/modules/paperwork/paper_cutter.dm +++ b/code/modules/paperwork/paper_cutter.dm @@ -121,8 +121,8 @@ /obj/item/paperslip/Initialize() . = ..() - pixel_x = rand(-5, 5) - pixel_y = rand(-5, 5) + pixel_x = base_pixel_x + rand(-5, 5) + pixel_y = base_pixel_y + rand(-5, 5) /obj/item/hatchet/cutterblade diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index 7fed4f02e13..397e0963239 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -21,8 +21,8 @@ /obj/item/paperplane/Initialize(mapload, obj/item/paper/newPaper) . = ..() - pixel_y = rand(-8, 8) - pixel_x = rand(-9, 9) + pixel_x = base_pixel_x + rand(-9, 9) + pixel_y = base_pixel_y + rand(-8, 8) if(newPaper) internalPaper = newPaper flags_1 = newPaper.flags_1 diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 6c59bbcc993..7cee678f604 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -206,8 +206,8 @@ * * copied_item - The paper, document, or photo that was just spawned on top of the printer. */ /obj/machinery/photocopier/proc/give_pixel_offset(obj/item/copied_item) - copied_item.pixel_x = rand(-10, 10) - copied_item.pixel_y = rand(-10, 10) + copied_item.pixel_x = copied_item.base_pixel_x + rand(-10, 10) + copied_item.pixel_y = copied_item.base_pixel_y + rand(-10, 10) /** * Handles the copying of devil contract paper. Transfers all the text, stamps and so on from the old paper, to the copy. diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index 75a5a863d52..13cc5454204 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -139,12 +139,7 @@ return on = FALSE - - var/realcooldown = cooldown - var/mob/living/carbon/human/H = user - if (HAS_TRAIT(H, TRAIT_PHOTOGRAPHER)) - realcooldown *= 0.5 - addtimer(CALLBACK(src, .proc/cooldown), realcooldown) + addtimer(CALLBACK(src, .proc/cooldown), cooldown) icon_state = state_off diff --git a/code/modules/photography/camera/silicon_camera.dm b/code/modules/photography/camera/silicon_camera.dm index 37e2f49157d..454c2474ff6 100644 --- a/code/modules/photography/camera/silicon_camera.dm +++ b/code/modules/photography/camera/silicon_camera.dm @@ -84,8 +84,8 @@ to_chat(user, "Invalid Image.") return var/obj/item/photo/p = new /obj/item/photo(C.loc, selection) - p.pixel_x = rand(-10, 10) - p.pixel_y = rand(-10, 10) + p.pixel_x = p.base_pixel_x + rand(-10, 10) + p.pixel_y = p.base_pixel_y + rand(-10, 10) C.toner -= printcost //All fun allowed. visible_message("[C.name] spits out a photograph from a narrow slot on its chassis.") to_chat(usr, "You print a photograph.") diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index ed1be864592..f826ecfca33 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -414,8 +414,8 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri /obj/item/stack/cable_coil/Initialize(mapload, new_amount = null) . = ..() - pixel_x = rand(-2,2) - pixel_y = rand(-2,2) + pixel_x = base_pixel_x + rand(-2, 2) + pixel_y = base_pixel_y + rand(-2, 2) update_icon() /obj/item/stack/cable_coil/examine(mob/user) @@ -593,8 +593,8 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri . = ..() if(!amount) amount = rand(1,2) - pixel_x = rand(-2,2) - pixel_y = rand(-2,2) + pixel_x = base_pixel_x + rand(-2, 2) + pixel_y = base_pixel_y + rand(-2, 2) update_icon() /obj/item/stack/cable_coil/cyborg diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index a297c8fe10f..e1bace8db24 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -338,7 +338,7 @@ /obj/item/stock_parts/cell/emproof/empty/ComponentInitialize() . = ..() - AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF) + AddElement(/datum/element/empprotection, EMP_PROTECT_SELF) /obj/item/stock_parts/cell/emproof/corrupt() return diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 0aa5873310a..cd95b790686 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -9,8 +9,8 @@ #define LIGHT_BROKEN 2 #define LIGHT_BURNED 3 -#define BROKEN_SPARKS_MIN (30 SECONDS) -#define BROKEN_SPARKS_MAX (90 SECONDS) +#define BROKEN_SPARKS_MIN (3 MINUTES) +#define BROKEN_SPARKS_MAX (9 MINUTES) #define LIGHT_DRAIN_TIME 25 #define LIGHT_POWER_GAIN 35 diff --git a/code/modules/power/pipecleaners.dm b/code/modules/power/pipecleaners.dm index da5ded778a1..37386750439 100644 --- a/code/modules/power/pipecleaners.dm +++ b/code/modules/power/pipecleaners.dm @@ -233,8 +233,8 @@ By design, d1 is the smallest direction and d2 is the highest if(pipe_cleaner_colors[pipe_cleaner_color]) pipe_cleaner_color = pipe_cleaner_colors[pipe_cleaner_color] - pixel_x = rand(-2,2) - pixel_y = rand(-2,2) + pixel_x = base_pixel_x + rand(-2, 2) + pixel_y = base_pixel_y + rand(-2, 2) update_icon() /////////////////////////////////// @@ -460,8 +460,8 @@ By design, d1 is the smallest direction and d2 is the highest . = ..() if(!amount) amount = rand(1,2) - pixel_x = rand(-2,2) - pixel_y = rand(-2,2) + pixel_x = base_pixel_x + rand(-2, 2) + pixel_y = base_pixel_y + rand(-2, 2) update_icon() /obj/item/stack/pipe_cleaner_coil/cut/red diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 78dd47bab20..34dcbc13698 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -69,7 +69,7 @@ /obj/machinery/power/emitter/ComponentInitialize() . = ..() - AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) + AddElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) /obj/machinery/power/emitter/set_anchored(anchorvalue) . = ..() @@ -388,8 +388,8 @@ if(istype(I, /obj/item/turret_control)) qdel(I) if(istype(buckled_mob)) - buckled_mob.pixel_x = 0 - buckled_mob.pixel_y = 0 + buckled_mob.pixel_x = buckled_mob.base_pixel_x + buckled_mob.pixel_y = buckled_mob.base_pixel_y if(buckled_mob.client) buckled_mob.client.view_size.resetToDefault() auto.Remove(buckled_mob) diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 836a507b413..0f7ecdb5bce 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -65,7 +65,7 @@ field_generator power level display /obj/machinery/field/generator/ComponentInitialize() . = ..() - AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) + AddElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) /obj/machinery/field/generator/process() if(active == FG_ONLINE) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index e60ad51be57..81f78112220 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -222,8 +222,8 @@ randomise_offset(random_offset) /obj/item/solar_assembly/proc/randomise_offset(amount) - pixel_x = rand(-amount,amount) - pixel_y = rand(-amount,amount) + pixel_x = base_pixel_x + rand(-amount, amount) + pixel_y = base_pixel_y + rand(-amount, amount) // Give back the glass type we were supplied with /obj/item/solar_assembly/proc/give_glass(device_broken) diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm index 9598ffe2251..8077d7ec42b 100644 --- a/code/modules/projectiles/ammunition/_ammunition.dm +++ b/code/modules/projectiles/ammunition/_ammunition.dm @@ -30,8 +30,8 @@ . = ..() if(projectile_type) BB = new projectile_type(src) - pixel_x = rand(-10, 10) - pixel_y = rand(-10, 10) + pixel_x = base_pixel_x + rand(-10, 10) + pixel_y = base_pixel_y + rand(-10, 10) setDir(pick(GLOB.alldirs)) update_icon() diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index e6f61be9a48..c661f0189d0 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -102,6 +102,8 @@ /obj/item/gun/ballistic/rifle/boltaction/enchanted/dropped() . = ..() guns_left = 0 + magazine = null + chambered = null /obj/item/gun/ballistic/rifle/boltaction/enchanted/proc/discard_gun(mob/living/user) user.throw_item(pick(oview(7,get_turf(user)))) diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 1deb8067f8e..a7f1e22b083 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -155,6 +155,13 @@ qdel(src) /proc/wabbajack(mob/living/M, randomize) + // If the mob has a shapeshifted form, we want to pull out the reference of the caster's original body from it. + // We then want to restore this original body through the shapeshift holder itself. + var/obj/shapeshift_holder/shapeshift = locate() in M + if(shapeshift) + M = shapeshift.stored + shapeshift.restore() + if(!istype(M) || M.stat == DEAD || M.notransform || (GODMODE & M.status_flags)) return diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 589c8c7c058..864256a2446 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -431,23 +431,23 @@ /obj/machinery/chem_master/adjust_item_drop_location(atom/movable/AM) // Special version for chemmasters and condimasters if (AM == beaker) - AM.pixel_x = -8 - AM.pixel_y = 8 + AM.pixel_x = AM.base_pixel_x - 8 + AM.pixel_y = AM.base_pixel_y + 8 return null else if (AM == bottle) if (length(bottle.contents)) - AM.pixel_x = -13 + AM.pixel_x = AM.base_pixel_x - 13 else - AM.pixel_x = -7 - AM.pixel_y = -8 + AM.pixel_x = AM.base_pixel_x - 7 + AM.pixel_y = AM.base_pixel_y - 8 return null else var/md5 = md5(AM.name) for (var/i in 1 to 32) . += hex2num(md5[i]) . = . % 9 - AM.pixel_x = ((.%3)*6) - AM.pixel_y = -8 + (round( . / 3)*8) + AM.pixel_x = AM.base_pixel_x + ((.%3)*6) + AM.pixel_y = AM.base_pixel_y - 8 + (round( . / 3)*8) /** * Translates styles data into UI compatible format diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index f65a21cf1ef..61ee4d3564f 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -3,6 +3,7 @@ desc = "A dropper. Holds up to 5 units." icon = 'icons/obj/chemical.dmi' icon_state = "dropper0" + worn_icon_state = "pen" amount_per_transfer_from_this = 5 possible_transfer_amounts = list(1, 2, 3, 4, 5) volume = 5 diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 0c07a6430d8..49361566f7d 100755 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -134,6 +134,7 @@ icon = 'icons/obj/chemical.dmi' icon_state = "beaker" inhand_icon_state = "beaker" + worn_icon_state = "beaker" custom_materials = list(/datum/material/glass=500) fill_icon_thresholds = list(0, 10, 25, 50, 75, 80, 90) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index fd311a291b7..e83fd42d0a9 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -7,6 +7,7 @@ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' icon_state = "hypo" + worn_icon_state = "hypo" amount_per_transfer_from_this = 5 volume = 30 possible_transfer_amounts = list() diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 72452a16675..403a9939b2a 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/chemical.dmi' icon_state = "pill" inhand_icon_state = "pill" + worn_icon_state = "pen" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' possible_transfer_amounts = list() diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index e027e73eaa2..fe5efb07637 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -6,6 +6,7 @@ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' icon_state = "0" + worn_icon_state = "pen" amount_per_transfer_from_this = 5 possible_transfer_amounts = list() volume = 15 diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 1b48d4d1f4f..f47744d6e8f 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -80,8 +80,8 @@ other types of metals and chemistry for reagents). /obj/item/disk/design_disk/Initialize() . = ..() - pixel_x = rand(-5, 5) - pixel_y = rand(-5, 5) + pixel_x = base_pixel_x + rand(-5, 5) + pixel_y = base_pixel_y + rand(-5, 5) for(var/i in 1 to max_blueprints) blueprints += null diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 6561cc311b4..33233cb1721 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -689,7 +689,7 @@ /datum/design/surgery/healing //PLEASE ACCOUNT FOR UNIQUE HEALING BRANCHES IN THE hptech HREF (currently 2 for Brute/Burn; Combo is bonus) name = "Tend Wounds" desc = "An upgraded version of the original surgery." - id = "surgery_healing_base" //holder because travis cries otherwise. Not used in techweb unlocks. + id = "surgery_healing_base" //holder because CI cries otherwise. Not used in techweb unlocks. research_icon_state = "surgery_chest" /datum/design/surgery/healing/brute_upgrade diff --git a/code/modules/research/nanites/nanite_programs/suppression.dm b/code/modules/research/nanites/nanite_programs/suppression.dm index 0b24d9ec24c..003e5aca683 100644 --- a/code/modules/research/nanites/nanite_programs/suppression.dm +++ b/code/modules/research/nanites/nanite_programs/suppression.dm @@ -121,11 +121,11 @@ /datum/nanite_program/comm/proc/receive_comm_signal(signal_comm_code, comm_message, comm_source) var/datum/nanite_extra_setting/comm_code = extra_settings[NES_COMM_CODE] - if(!activated || !comm_code) + if(!activated || !comm_code.get_value()) return - if(signal_comm_code == comm_code) + if(signal_comm_code == comm_code.get_value()) host_mob.investigate_log("'s [name] nanite program was messaged by [comm_source] with comm code [signal_comm_code] and message '[comm_message]'.", INVESTIGATE_NANITES) - trigger(comm_message) + trigger(FALSE, comm_message) /datum/nanite_program/comm/speech name = "Forced Speech" diff --git a/code/modules/research/nanites/nanite_remote.dm b/code/modules/research/nanites/nanite_remote.dm index fee5544ff76..8086a20eba9 100644 --- a/code/modules/research/nanites/nanite_remote.dm +++ b/code/modules/research/nanites/nanite_remote.dm @@ -181,21 +181,21 @@ return if(REMOTE_MODE_SELF) to_chat(user, "You activate [src], signaling the nanites in your bloodstream.") - signal_mob(user, code, comm_message) + signal_mob(user, code, key_name(user)) if(REMOTE_MODE_TARGET) if(isliving(target) && (get_dist(target, get_turf(src)) <= 7)) to_chat(user, "You activate [src], signaling the nanites inside [target].") - signal_mob(target, code, comm_message, key_name(user)) + signal_mob(target, code, key_name(user)) if(REMOTE_MODE_AOE) to_chat(user, "You activate [src], signaling the nanites inside every host around you.") for(var/mob/living/L in view(user, 7)) - signal_mob(L, code, comm_message, key_name(user)) + signal_mob(L, code, key_name(user)) if(REMOTE_MODE_RELAY) to_chat(user, "You activate [src], signaling all connected relay nanites.") - signal_relay(code, relay_code, comm_message, key_name(user)) + signal_relay(code, relay_code, key_name(user)) /obj/item/nanite_remote/comm/signal_mob(mob/living/M, code, source) - SEND_SIGNAL(M, COMSIG_NANITE_COMM_SIGNAL, code, comm_message) + SEND_SIGNAL(M, COMSIG_NANITE_COMM_SIGNAL, code, comm_message, source) /obj/item/nanite_remote/comm/signal_relay(code, relay_code, source) for(var/X in SSnanites.nanite_relays) diff --git a/code/modules/research/research_disk.dm b/code/modules/research/research_disk.dm index 223e5f184c1..62eca2aedf7 100644 --- a/code/modules/research/research_disk.dm +++ b/code/modules/research/research_disk.dm @@ -8,8 +8,8 @@ /obj/item/disk/tech_disk/Initialize() . = ..() - pixel_x = rand(-5, 5) - pixel_y = rand(-5, 5) + pixel_x = base_pixel_x + rand(-5, 5) + pixel_y = base_pixel_y + rand(-5, 5) stored_research = new /datum/techweb /obj/item/disk/tech_disk/debug diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index 9cde16cddb9..17ed354741b 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -130,8 +130,8 @@ If you create T5+ please take a pass at mech_fabricator.dm. The parts being good /obj/item/stock_parts/Initialize() . = ..() - pixel_x = rand(-5, 5) - pixel_y = rand(-5, 5) + pixel_x = base_pixel_x + rand(-5, 5) + pixel_y = base_pixel_y + rand(-5, 5) /obj/item/stock_parts/get_part_rating() return rating diff --git a/code/modules/research/xenobiology/crossbreeding/consuming.dm b/code/modules/research/xenobiology/crossbreeding/consuming.dm index c1e3f3de3f6..5183c2c5c99 100644 --- a/code/modules/research/xenobiology/crossbreeding/consuming.dm +++ b/code/modules/research/xenobiology/crossbreeding/consuming.dm @@ -35,8 +35,8 @@ Consuming extracts: last_produced = world.time for(var/i in 1 to cookies) var/obj/item/S = spawncookie() - S.pixel_x = rand(-5, 5) - S.pixel_y = rand(-5, 5) + S.pixel_x = base_pixel_x + rand(-5, 5) + S.pixel_y = base_pixel_y + rand(-5, 5) return ..() diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index a32c689630d..dacf118806f 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -85,8 +85,6 @@ /obj/item/stack/sheet/durathread = /datum/species/golem/durathread, /obj/item/stack/sheet/cotton/durathread = /datum/species/golem/durathread, /obj/item/stack/sheet/mineral/snow = /datum/species/golem/snow, - /obj/item/stack/sheet/capitalisium = /datum/species/golem/capitalist, - /obj/item/stack/sheet/stalinium = /datum/species/golem/soviet, /obj/item/stack/sheet/mineral/metal_hydrogen= /datum/species/golem/mhydrogen) if(istype(I, /obj/item/stack)) diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm index 643ff543f74..0ab33093d3f 100644 --- a/code/modules/spells/spell_types/shapeshift.dm +++ b/code/modules/spells/spell_types/shapeshift.dm @@ -149,11 +149,12 @@ shape.apply_damage(damapply, source.convert_damage_type, forced = TRUE, wound_bonus=CANT_WOUND); shape.blood_volume = stored.blood_volume; - stored.RegisterSignal(src, COMSIG_PARENT_QDELETING, .proc/shape_death) - stored.RegisterSignal(shape, list(COMSIG_PARENT_QDELETING, COMSIG_MOB_DEATH), .proc/shape_death) - shape.RegisterSignal(stored, list(COMSIG_PARENT_QDELETING, COMSIG_MOB_DEATH), .proc/shape_death) + RegisterSignal(shape, list(COMSIG_PARENT_QDELETING, COMSIG_MOB_DEATH), .proc/shape_death) + RegisterSignal(stored, list(COMSIG_PARENT_QDELETING, COMSIG_MOB_DEATH), .proc/caster_death) /obj/shapeshift_holder/Destroy() + // Restore manages signal unregistering. If restoring is TRUE, we've already unregistered the signals and we're here + // because restore() qdel'd src. if(!restoring) restore() stored = null @@ -191,6 +192,10 @@ restore() /obj/shapeshift_holder/proc/restore(death=FALSE) + // Destroy() calls this proc if it hasn't been called. Unregistering here prevents multiple qdel loops + // when caster and shape both die at the same time. + UnregisterSignal(shape, list(COMSIG_PARENT_QDELETING, COMSIG_MOB_DEATH)) + UnregisterSignal(stored, list(COMSIG_PARENT_QDELETING, COMSIG_MOB_DEATH)) restoring = TRUE stored.forceMove(shape.loc) stored.notransform = FALSE @@ -207,5 +212,10 @@ stored.apply_damage(damapply, source.convert_damage_type, forced = TRUE, wound_bonus=CANT_WOUND) if(source.convert_damage) stored.blood_volume = shape.blood_volume; - QDEL_NULL(shape) + + // This guard is important because restore() can also be called on COMSIG_PARENT_QDELETING for shape, as well as on death. + // This can happen in, for example, [/proc/wabbajack] where the mob hit is qdel'd. + if(!QDELETED(shape)) + QDEL_NULL(shape) + qdel(src) diff --git a/code/modules/unit_tests/siunit.dm b/code/modules/unit_tests/siunit.dm index 3ad2ee93d68..3a7a25a98d3 100644 --- a/code/modules/unit_tests/siunit.dm +++ b/code/modules/unit_tests/siunit.dm @@ -1,15 +1,15 @@ /datum/unit_test/siunit/Run() - TEST_ASSERT_EQUAL(siunit(1234, "Pa", 1), "1.2 kPa", "") - TEST_ASSERT_EQUAL(siunit(1234, "Pa", 2), "1.23 kPa", "") - TEST_ASSERT_EQUAL(siunit(1234, "Pa", 3), "1.234 kPa", "") TEST_ASSERT_EQUAL(siunit(0.5345, "A", 0), "535 mA", "") TEST_ASSERT_EQUAL(siunit(0.5344, "A", 0), "534 mA", "") TEST_ASSERT_EQUAL(siunit(-0.5344, "A", 0), "-534 mA", "") - TEST_ASSERT_EQUAL(siunit(1000, "Pa", 4), "1 kPa", "") - TEST_ASSERT_EQUAL(siunit(0, "Pa"), "0 Pa", "") - TEST_ASSERT_EQUAL(siunit(1e6, "Pa"), "1 MPa", "") - TEST_ASSERT_EQUAL(siunit(999e6, "Pa"), "999 MPa", "") - TEST_ASSERT_EQUAL(siunit(999.9e6, "Pa"), "999.9 MPa" , "") - TEST_ASSERT_EQUAL(siunit(999.9e6, "Pa", 0), "1 GPa", "") - TEST_ASSERT_EQUAL(siunit(1e9, "Pa"), "1 GPa", "") - TEST_ASSERT_EQUAL(siunit(3e20, "Pa"), "300000 PPa", "") + TEST_ASSERT_EQUAL(siunit_pressure(1.234, 1), "1.2 kPa", "") // test for pascal require *10e-3, as the game thinks in kPa, the proc siunit in Pa + TEST_ASSERT_EQUAL(siunit_pressure(1.234, 2), "1.23 kPa", "") + TEST_ASSERT_EQUAL(siunit_pressure(1.234, 3), "1.234 kPa", "") + TEST_ASSERT_EQUAL(siunit_pressure(1, 4), "1 kPa", "") + TEST_ASSERT_EQUAL(siunit_pressure(0), "0 Pa", "") + TEST_ASSERT_EQUAL(siunit_pressure(1e3), "1 MPa", "") + TEST_ASSERT_EQUAL(siunit_pressure(999e3), "999 MPa", "") + TEST_ASSERT_EQUAL(siunit_pressure(999.9e3), "999.9 MPa" , "") + TEST_ASSERT_EQUAL(siunit_pressure(999.9e3, 0), "1 GPa", "") + TEST_ASSERT_EQUAL(siunit_pressure(1e6), "1 GPa", "") + TEST_ASSERT_EQUAL(siunit_pressure(3e17), "300000 PPa", "") diff --git a/code/modules/vehicles/_vehicle.dm b/code/modules/vehicles/_vehicle.dm index de0c34cc12c..7b039127f4a 100644 --- a/code/modules/vehicles/_vehicle.dm +++ b/code/modules/vehicles/_vehicle.dm @@ -172,8 +172,9 @@ . = ..() if(emulate_door_bumps) if(istype(A, /obj/machinery/door)) + var/obj/machinery/door/conditionalwall = A for(var/m in occupants) - A.Bumped(m) + conditionalwall.bumpopen(m) /obj/vehicle/Move(newloc, dir) . = ..() diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index fde5cf399bc..ad4d75d35b4 100644 --- a/code/modules/vehicles/atv.dm +++ b/code/modules/vehicles/atv.dm @@ -7,6 +7,7 @@ armor = list(MELEE = 50, BULLET = 25, LASER = 20, ENERGY = 0, BOMB = 50, BIO = 0, RAD = 0, FIRE = 60, ACID = 60) key_type = /obj/item/key integrity_failure = 0.5 + rider_check_flags = REQUIRES_ARMS | REQUIRES_LEGS | UNBUCKLE_DISABLED_RIDER var/static/mutable_appearance/atvcover /obj/vehicle/ridden/atv/Initialize() @@ -49,20 +50,20 @@ turret.forceMove(get_turf(src)) switch(dir) if(NORTH) - turret.pixel_x = 0 - turret.pixel_y = 4 + turret.pixel_x = base_pixel_x + turret.pixel_y = base_pixel_y + 4 turret.layer = ABOVE_MOB_LAYER if(EAST) - turret.pixel_x = -12 - turret.pixel_y = 4 + turret.pixel_x = base_pixel_x - 12 + turret.pixel_y = base_pixel_y + 4 turret.layer = OBJ_LAYER if(SOUTH) - turret.pixel_x = 0 - turret.pixel_y = 4 + turret.pixel_x = base_pixel_x + turret.pixel_y = base_pixel_y + 4 turret.layer = OBJ_LAYER if(WEST) - turret.pixel_x = 12 - turret.pixel_y = 4 + turret.pixel_x = base_pixel_x + 12 + turret.pixel_y = base_pixel_y + 4 turret.layer = OBJ_LAYER /obj/vehicle/ridden/atv/welder_act(mob/living/user, obj/item/I) diff --git a/code/modules/vehicles/bicycle.dm b/code/modules/vehicles/bicycle.dm index 38d423137ce..c0c56dba6e4 100644 --- a/code/modules/vehicles/bicycle.dm +++ b/code/modules/vehicles/bicycle.dm @@ -2,7 +2,7 @@ name = "bicycle" desc = "Keep away from electricity." icon_state = "bicycle" - fall_off_if_missing_arms = TRUE + rider_check_flags = REQUIRES_LEGS | REQUIRES_ARMS | UNBUCKLE_DISABLED_RIDER /obj/vehicle/ridden/bicycle/Initialize() . = ..() diff --git a/code/modules/vehicles/lavaboat.dm b/code/modules/vehicles/lavaboat.dm index 6b56ea31c47..7582200e75b 100644 --- a/code/modules/vehicles/lavaboat.dm +++ b/code/modules/vehicles/lavaboat.dm @@ -9,8 +9,7 @@ var/allowed_turf = /turf/open/lava resistance_flags = LAVA_PROOF | FIRE_PROOF can_buckle = TRUE - legs_required = 0 - arms_required = 0 + rider_check_flags = REQUIRES_LEGS | REQUIRES_ARMS | UNBUCKLE_DISABLED_RIDER /obj/vehicle/ridden/lavaboat/Initialize() . = ..() diff --git a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm index 662b2de5267..d04fc2a933b 100644 --- a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm @@ -336,39 +336,39 @@ return FALSE return TRUE -/obj/item/mecha_parts/mecha_equipment/ripleyupgrade/attach(obj/vehicle/sealed/mecha/M) - var/obj/vehicle/sealed/mecha/working/ripley/mk2/N = new (get_turf(M),1) - if(!N) +/obj/item/mecha_parts/mecha_equipment/ripleyupgrade/attach(obj/vehicle/sealed/mecha/markone) + var/obj/vehicle/sealed/mecha/working/ripley/mk2/marktwo = new (get_turf(markone),1) + if(!marktwo) return - QDEL_NULL(N.cell) - if (M.cell) - N.cell = M.cell - M.cell.forceMove(N) - M.cell = null - QDEL_NULL(N.scanmod) - if (M.scanmod) - N.scanmod = M.scanmod - M.scanmod.forceMove(N) - M.scanmod = null - QDEL_NULL(N.capacitor) - if (M.capacitor) - N.capacitor = M.capacitor - M.capacitor.forceMove(N) - M.capacitor = null - N.update_part_values() - for(var/obj/item/mecha_parts/E in M.contents) - if(istype(E, /obj/item/mecha_parts/concealed_weapon_bay)) //why is the bay not just a variable change who did this - E.forceMove(N) - for(var/obj/item/mecha_parts/mecha_equipment/E in M.equipment) //Move the equipment over... - E.detach(M) - E.attach(N) - N.dna_lock = M.dna_lock - N.mecha_flags = M.mecha_flags - N.strafe = M.strafe - N.obj_integrity = M.obj_integrity //This is not a repair tool - if(M.name != initial(M.name)) - N.name = M.name - M.wreckage = FALSE - qdel(M) - playsound(get_turf(N),'sound/items/ratchet.ogg',50,TRUE) + QDEL_NULL(marktwo.cell) + if (markone.cell) + marktwo.cell = markone.cell + markone.cell.forceMove(marktwo) + markone.cell = null + QDEL_NULL(marktwo.scanmod) + if (markone.scanmod) + marktwo.scanmod = markone.scanmod + markone.scanmod.forceMove(marktwo) + markone.scanmod = null + QDEL_NULL(marktwo.capacitor) + if (markone.capacitor) + marktwo.capacitor = markone.capacitor + markone.capacitor.forceMove(marktwo) + markone.capacitor = null + marktwo.update_part_values() + for(var/obj/item/mecha_parts/equipment in markone.contents) + if(istype(equipment, /obj/item/mecha_parts/concealed_weapon_bay)) //why is the bay not just a variable change who did this + equipment.forceMove(marktwo) + for(var/obj/item/mecha_parts/mecha_equipment/equipment in markone.equipment) //Move the equipment over... + equipment.detach(marktwo) + equipment.attach(marktwo) + marktwo.dna_lock = markone.dna_lock + marktwo.mecha_flags = markone.mecha_flags + marktwo.strafe = markone.strafe + marktwo.obj_integrity = round((markone.obj_integrity / markone.max_integrity) * marktwo.obj_integrity) //Integ set to the same percentage integ as the old mecha, rounded to be whole number + if(markone.name != initial(markone.name)) + marktwo.name = markone.name + markone.wreckage = FALSE + qdel(markone) + playsound(get_turf(marktwo),'sound/items/ratchet.ogg',50,TRUE) return diff --git a/code/modules/vehicles/mecha/working/clarke.dm b/code/modules/vehicles/mecha/working/clarke.dm index 36b6a0d4356..dadc3c5a723 100644 --- a/code/modules/vehicles/mecha/working/clarke.dm +++ b/code/modules/vehicles/mecha/working/clarke.dm @@ -18,6 +18,7 @@ /obj/vehicle/sealed/mecha/working/clarke/Initialize() . = ..() + box = new(src) var/obj/item/mecha_parts/mecha_equipment/orebox_manager/ME = new(src) ME.attach(src) diff --git a/code/modules/vehicles/mecha/working/ripley.dm b/code/modules/vehicles/mecha/working/ripley.dm index 363485cc6bf..94c96bc89de 100644 --- a/code/modules/vehicles/mecha/working/ripley.dm +++ b/code/modules/vehicles/mecha/working/ripley.dm @@ -44,8 +44,6 @@ /obj/vehicle/sealed/mecha/working/ripley/Initialize() . = ..() - //Add ore box to cargo, here because the clarke has a unremovable box - LAZYADD(cargo, box) AddComponent(/datum/component/armor_plate,3,/obj/item/stack/sheet/animalhide/goliath_hide,list(MELEE = 10, BULLET = 5, LASER = 5)) diff --git a/code/modules/vehicles/mecha/working/working.dm b/code/modules/vehicles/mecha/working/working.dm index de496d8e51f..72952f1f800 100644 --- a/code/modules/vehicles/mecha/working/working.dm +++ b/code/modules/vehicles/mecha/working/working.dm @@ -4,10 +4,6 @@ /// Handles an internal ore box for working mechs var/obj/structure/ore_box/box -/obj/vehicle/sealed/mecha/working/Initialize() - . = ..() - box = new(src) - /obj/vehicle/sealed/mecha/working/Destroy() QDEL_NULL(box) return ..() diff --git a/code/modules/vehicles/motorized_wheelchair.dm b/code/modules/vehicles/motorized_wheelchair.dm index ab8f97c555d..50cf3e3bc09 100644 --- a/code/modules/vehicles/motorized_wheelchair.dm +++ b/code/modules/vehicles/motorized_wheelchair.dm @@ -52,8 +52,8 @@ canmove = FALSE addtimer(VARSET_CALLBACK(src, canmove, TRUE), 2 SECONDS) return FALSE - if(user.usable_hands < arms_required) - to_chat(user, "You don't have enough arms to operate the motor controller!") + if(rider_check_flags & REQUIRES_ARMS && HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) + to_chat(user, "You can't operate the motor controller!") canmove = FALSE addtimer(VARSET_CALLBACK(src, canmove, TRUE), 2 SECONDS) return FALSE diff --git a/code/modules/vehicles/pimpin_ride.dm b/code/modules/vehicles/pimpin_ride.dm index 41e1a9f1307..b0d7c9084aa 100644 --- a/code/modules/vehicles/pimpin_ride.dm +++ b/code/modules/vehicles/pimpin_ride.dm @@ -4,6 +4,7 @@ desc = "A brave janitor cyborg gave its life to produce such an amazing combination of speed and utility." icon_state = "pussywagon" key_type = /obj/item/key/janitor + rider_check_flags = REQUIRES_LEGS | REQUIRES_ARMS | UNBUCKLE_DISABLED_RIDER var/obj/item/storage/bag/trash/mybag = null var/floorbuffer = FALSE diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm index 28b24e73344..bd0b4691ed8 100644 --- a/code/modules/vehicles/ridden.dm +++ b/code/modules/vehicles/ridden.dm @@ -4,10 +4,8 @@ max_buckled_mobs = 1 buckle_lying = 0 default_driver_move = FALSE - var/legs_required = 2 - var/arms_required = 1 //why not? - var/fall_off_if_missing_arms = FALSE //heh... - var/message_cooldown = 0 + var/rider_check_flags = REQUIRES_LEGS | REQUIRES_ARMS + COOLDOWN_DECLARE(message_cooldown) /obj/vehicle/ridden/Initialize() . = ..() @@ -59,31 +57,46 @@ /obj/vehicle/ridden/driver_move(mob/living/user, direction) if(key_type && !is_key(inserted_key)) - if(message_cooldown < world.time) + if(COOLDOWN_FINISHED(src, message_cooldown)) to_chat(user, "[src] has no key inserted!") - message_cooldown = world.time + 5 SECONDS + COOLDOWN_START(src, message_cooldown, 5 SECONDS) return FALSE - if(legs_required) - if(user.usable_legs < legs_required) - if(message_cooldown < world.time) - to_chat(user, "You can't seem to manage that with[user.usable_legs ? " your leg[user.usable_legs > 1 ? "s" : null]" : "out legs"]...") - message_cooldown = world.time + 5 SECONDS - return FALSE - if(arms_required) - if(user.usable_hands < arms_required) - if(fall_off_if_missing_arms) - unbuckle_mob(user, TRUE) - user.visible_message("[user] falls off \the [src].",\ - "You fall off \the [src] while trying to operate it without [arms_required ? "both arms":"an arm"]!") - if(isliving(user)) - var/mob/living/L = user - L.Stun(30) - return FALSE - if(message_cooldown < world.time) - to_chat(user, "You can't seem to manage that with[user.usable_hands ? " your arm[user.usable_hands > 1 ? "s" : null]" : "out arms"]...") - message_cooldown = world.time + 5 SECONDS + if(HAS_TRAIT(user, TRAIT_INCAPACITATED)) + if(COOLDOWN_FINISHED(src, message_cooldown)) + to_chat(user, "You cannot operate \the [src] right now!") + COOLDOWN_START(src, message_cooldown, 5 SECONDS) + return FALSE + + if(rider_check_flags & REQUIRES_LEGS && HAS_TRAIT(user, TRAIT_FLOORED)) + if(rider_check_flags & UNBUCKLE_DISABLED_RIDER) + unbuckle_mob(user, TRUE) + user.visible_message("[user] falls off \the [src].",\ + "You fall off \the [src] while trying to operate it while unable to stand!") + if(isliving(user)) + var/mob/living/L = user + L.Stun(3 SECONDS) return FALSE + if(COOLDOWN_FINISHED(src, message_cooldown)) + to_chat(user, "You can't seem to manage that while unable to stand up enough to move \the [src]...") + COOLDOWN_START(src, message_cooldown, 5 SECONDS) + return FALSE + + if(rider_check_flags & REQUIRES_ARMS && HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) + if(rider_check_flags & UNBUCKLE_DISABLED_RIDER) + unbuckle_mob(user, TRUE) + user.visible_message("[user] falls off \the [src].",\ + "You fall off \the [src] while trying to operate it without being able to hold on!") + if(isliving(user)) + var/mob/living/rider = user + rider.Stun(3 SECONDS) + return FALSE + + if(COOLDOWN_FINISHED(src, message_cooldown)) + to_chat(user, "You can't seem to manage that unable to hold onto \the [src] to move it...") + COOLDOWN_START(src, message_cooldown, 5 SECONDS) + return FALSE + var/datum/component/riding/R = GetComponent(/datum/component/riding) R.handle_ride(user, direction) return ..() @@ -101,3 +114,9 @@ /obj/vehicle/ridden/zap_act(power, zap_flags) zap_buckle_check(power) return ..() + +/obj/vehicle/ridden/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() + + if(mover.pass_flags & PASSTABLE) + return TRUE diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index cf56ae1cab3..855d84d7cbc 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -2,8 +2,8 @@ name = "scooter" desc = "A fun way to get around." icon_state = "scooter" + rider_check_flags = REQUIRES_LEGS | REQUIRES_ARMS | UNBUCKLE_DISABLED_RIDER are_legs_exposed = TRUE - fall_off_if_missing_arms = TRUE /obj/vehicle/ridden/scooter/Initialize() . = ..() @@ -37,9 +37,6 @@ /obj/vehicle/ridden/scooter/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE) if(!istype(M)) return FALSE - if(M.usable_legs < legs_required && M.usable_hands < arms_required) - to_chat(M, "You don't think it'd be a good idea trying to ride \the [src]...") - return FALSE return ..() /obj/vehicle/ridden/scooter/skateboard @@ -47,8 +44,7 @@ desc = "An old, battered skateboard. It's still rideable, but probably unsafe." icon_state = "skateboard" density = FALSE - arms_required = 0 - fall_off_if_missing_arms = FALSE + rider_check_flags = REQUIRES_LEGS | UNBUCKLE_DISABLED_RIDER var/datum/effect_system/spark_spread/sparks ///Whether the board is currently grinding var/grinding = FALSE diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm index 15853c49c7f..634ccb5c4f6 100644 --- a/code/modules/vehicles/secway.dm +++ b/code/modules/vehicles/secway.dm @@ -7,7 +7,7 @@ armor = list(MELEE = 10, BULLET = 0, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 60, ACID = 60) key_type = /obj/item/key/security integrity_failure = 0.5 - + rider_check_flags = REQUIRES_LEGS | REQUIRES_ARMS | UNBUCKLE_DISABLED_RIDER ///This stores a banana that, when used on the secway, prevents the vehicle from moving until it is removed. diff --git a/code/modules/vehicles/speedbike.dm b/code/modules/vehicles/speedbike.dm index cc4f13cacfc..044820a5184 100644 --- a/code/modules/vehicles/speedbike.dm +++ b/code/modules/vehicles/speedbike.dm @@ -12,6 +12,7 @@ icon = 'icons/obj/bike.dmi' icon_state = "speedbike_blue" layer = LYING_MOB_LAYER + rider_check_flags = REQUIRES_LEGS | REQUIRES_ARMS | UNBUCKLE_DISABLED_RIDER var/overlay_state = "cover_blue" var/mutable_appearance/overlay diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm index 411d1e67217..7f89c2882bd 100644 --- a/code/modules/vehicles/wheelchair.dm +++ b/code/modules/vehicles/wheelchair.dm @@ -6,7 +6,7 @@ layer = OBJ_LAYER max_integrity = 100 armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 20, ACID = 30) //Wheelchairs aren't super tough yo - legs_required = 0 //You'll probably be using this if you don't have legs + rider_check_flags = REQUIRES_ARMS | UNBUCKLE_DISABLED_RIDER density = FALSE //Thought I couldn't fix this one easily, phew /// Run speed delay is multiplied with this for vehicle move delay. var/delay_multiplier = 6.7 @@ -41,10 +41,10 @@ /obj/vehicle/ridden/wheelchair/driver_move(mob/living/user, direction) if(istype(user)) - if(canmove && (user.usable_hands < arms_required)) - to_chat(user, "You don't have enough arms to operate the wheels!") + if(canmove && rider_check_flags & REQUIRES_ARMS && HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) + to_chat(user, "You can't grip the wheelchair well enough to move it!") canmove = FALSE - addtimer(VARSET_CALLBACK(src, canmove, TRUE), 20) + addtimer(VARSET_CALLBACK(src, canmove, TRUE), 2 SECONDS) return FALSE set_move_delay(user) return ..() diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 0400a7c0b33..7d16dc642c4 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -147,7 +147,7 @@ products = list(/obj/item/clothing/glasses/hud/diagnostic = 2, /obj/item/clothing/under/rank/rnd/roboticist = 2, /obj/item/clothing/under/rank/rnd/roboticist/skirt = 2, - /obj/item/clothing/suit/toggle/labcoat = 2, + /obj/item/clothing/suit/toggle/labcoat/roboticist = 2, /obj/item/clothing/shoes/sneakers/black = 2, /obj/item/clothing/gloves/fingerless = 2, /obj/item/clothing/head/soft/black = 2, diff --git a/html/changelog.html b/html/changelog.html index fca3edf0958..4766ace333d 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -51,6 +51,216 @@ -->
+

01 November 2020

+

EOBGames updated:

+
    +
  • pea soup now requires a bowl, and obeys the laws of conservation of kitchenware
  • +
+

Inept updated:

+
    +
  • a few wee issues on Delta
  • +
+

Skoglol updated:

+
    +
  • Vampire blood level status no longer has excess spans.
  • +
+

XDTM updated:

+
    +
  • Fixed nanite comm remotes not working at all.
  • +
+

cacogen updated:

+
    +
  • Lifeform stasis units have all lowercase names now
  • +
+ +

31 October 2020

+

Krysonism updated:

+
    +
  • Added 3 new types of fancy carpets.
  • +
  • A crate of decorative items now sometimes spawns in maintenance.
  • +
+

Rohesie updated:

+
    +
  • Fixed an issue preventing afterattacks from happening, which broke regenerative crossbreeds, fulton packs and other interactions.
  • +
+

necromanceranne updated:

+
    +
  • Ridden vehicles always pass any object that would normally pass through tables, such as thrown weapons and bullets.
  • +
  • Makes ridden objects more consistent with what causes you to fall off if they require hand availability, checking for the incapacitation traits.
  • +
+ +

30 October 2020

+

LemonInTheDark updated:

+
    +
  • Stripping is logged just a bit better
  • +
+

Timberpoes updated:

+
    +
  • Fixed various shapeshifting runtimes that would affect vampries in bat form and players in ash drake from in particular.
  • +
  • Interactions with mobs in shapeshifted form and the Wabbajack force-tranformation effects (including the Staff of Change) should now make more sense and not leave behind random corpses.
  • +
+

VexingRaven updated:

+
    +
  • Assistants no longer spawn in the chapel on Pubby
  • +
+

cacogen updated:

+
    +
  • Settings, Ghost and Sound menus on menu bar at top are correctly capitalised now
  • +
  • Slicing food in your hand (e.g. pizza) no longer results in it "disappearing" (i.e. having the slices created inside you)
  • +
+

necromanceranne updated:

+
    +
  • Roboticist unique labcoat! Because you're worth it! Aesthetics!
  • +
  • All other labcoats no longer utilize the oldest labcoat sprites we have for their icons!
  • +
  • The virologist labcoat no longer lies about being more resistant to biological effects! Not that bio armor does anything in the first place.
  • +
  • Some stuff that could be worn in the suit storage slot no longer shows pink! Hooray!
  • +
+

tralezab updated:

+
    +
  • Blind messages for gunpointing and tackling are fixed
  • +
+ +

29 October 2020

+

Ghommie updated:

+
    +
  • The reactive teleport armor will now actually teleport the owner instead of forcemoving them to the picked turf. Expect some slight changes to the item's behaviour as result.
  • +
+

Megarop updated:

+
    +
  • Sweet pea donuts no longer cause a giant "error" sign to appear when you put them in a donut box.
  • +
+

Skoglol updated:

+
    +
  • Removed changeling team objectives and hivemind chat channel. Now a pure solo antagonist, use pheromone receptors if you insist on teaming up.
  • +
+

Stewydeadmike#0068, Ghilker updated:

+
    +
  • new crystal invasion mob sprites
  • +
  • old crystal invasion mob sprites
  • +
+

tralezab updated:

+
    +
  • Capitalism (golem) and Communism (golem) are dead.
  • +
+ +

28 October 2020

+

Denton updated:

+
    +
  • Fixed the Pubby toxins mass driver door toggle button.
  • +
  • Replaced var edited mass driver machinery with proper subtypes.
  • +
+

Gamer025 and ATHATH updated:

+
    +
  • Refunding Lesser Summon Guns or Arcane Barrage as a wizard will now remove any instances of that spell's associated kind of projectile weapon from your inventory.
  • +
  • Non-cultists who try to fire a blood bolt from a Blood Barrage "spell"'s hand will be in for a nasty surprise.
  • +
+

Kylerace updated:

+
    +
  • holodecks now have one less way of producing infinite cloth
  • +
+

Ryll/Shaps updated:

+
    +
  • Fixed another issue with persistent dismemberment scars
  • +
+

TheChosenEvilOne updated:

+
    +
  • You can now change piping layers on the RPD by scrolling with the mouse wheel.
  • +
+

Timberpoes updated:

+
    +
  • Mobs that are in stasis now have a new visual effect.
  • +
+

YPOQ updated:

+
    +
  • Fixed an issue that prevented split personalities from switching control.
  • +
+

Yenwodyah updated:

+
    +
  • A few bounties that accepted/refused the wrong items will now accept/refuse the right ones.
  • +
+

skoglol updated:

+
    +
  • Removed a duplicate table and holopad from MetaStation
  • +
+ +

26 October 2020

+

ArcaneMusic updated:

+
    +
  • The off sprites of the new stasis bed look correctly turned off.
  • +
+

Azarak updated:

+
    +
  • Broken light fixtures will now spark much less often
  • +
  • Added functional directional lighting. You can notice them with flashlights, hardsuit lamps, hardhats and the likes.
  • +
  • Made the static light system respect the light_on variable
  • +
+

Dennok updated:

+
    +
  • Double evacuation fixed.
  • +
+

Denton updated:

+
    +
  • Alien resin floors can no spread to cover up Z level transitions like stairs.
  • +
  • Added a large toner pack to cargo - six cartridges for 3000 credits.
  • +
  • Increased the capacity of large toner cartridges from 15 to 25. This should make decal/airlock painting less frustrating.
  • +
  • Added a missing bucket for the Icebox hermit ghost role.
  • +
+

Fikou updated:

+
    +
  • adds alternate medborg sprites
  • +
+

Jared-Fogle updated:

+
    +
  • Runechat messages will now also display the icon.
  • +
+

LemonInTheDark updated:

+
    +
  • All pixel scaling prefs properly save now.
  • +
+

MadMedicineMan updated:

+
    +
  • Canisters now display correct max. pressure
  • +
+

Mickyan updated:

+
    +
  • Removed grab shortcut for shoe stealing, use the strip menu for your shoe stealing needs
  • +
+

Ryll/Shaps updated:

+
    +
  • The Photographer quirk is now neutral and does not cost a quirk point to take. It also no longer allows you to take photos 50% quicker.
  • +
+

SmArtKar updated:

+
    +
  • Megafauna once again gibs immortal miners
  • +
+

The0bserver, Stewydeadmike, and TripleZeta updated:

+
    +
  • Adds 3 new plants, and 6 new recipes ,as well as a juice reagent. Check out your local Megaseed Vendor today!
  • +
+

Timberpoes updated:

+
    +
  • Pacifists can now taunt secbots such as Beepsky. Secbots absolutely loathe pacifist scumbags and will chase down any pacifist who taunts them, informing security in the process.
  • +
+

bobbahbrown updated:

+
    +
  • Added the interview system, a 'soft' panic bunker which lets players who would normally be blocked from joining be interviewed by admins to be selectively allowed to play.
  • +
+

dragomagol updated:

+
    +
  • Meta and Delta EVA shutters and windoors can be accessed using EVA access
  • +
+

sergeirocks100 updated:

+
    +
  • Adds fingerless insulated gloves as a Assistant heirloom item.
  • +
+

zxaber updated:

+
    +
  • AI combat and surveillance upgrades work properly again.
  • +
  • Mech pilots can once again open doors they have access to without exiting their mech.
  • +
  • Upgrading a MK-I Ripley to MK-II no longer deletes the equipment, and will now match the same percentage integrity that the MK-I had before the upgrade.
  • +
  • Ripleys no longer spawn with ore boxes. Go raid the mining outpost if you really need one.
  • +
+

25 October 2020

ArcaneMusic updated:

    @@ -2140,331 +2350,6 @@
  • fixed overlay lighting sometimes displaying offset
  • Mech refactor
- -

30 August 2020

-

ArcaneMusic updated:

-
    -
  • Showers now preform a touch reaction, not a touch/vapor reaction with piped reagents.
  • -
  • You can now build water recyclers in lathes, as intended.
  • -
-

Ghilker updated:

-
    -
  • Pressure Valve (a device that allow gas flow in a pipenet if the input pressure is higher than the set pressure)
  • -
-

Jared-Fogle updated:

-
    -
  • You can now spray paint anything you want again.
  • -
-

LemonInTheDark updated:

-
    -
  • You can no longer increase your view range by messing about with ghostroles
  • -
-

Qustinnus, 4Dplanner updated:

-
    -
  • Adds map_generator datums, which will handle terrain generation for a specific area
  • -
  • Adds a jungle generator datum, which uses rust-g noise to generate 3 layers of perlin noise to make a somewhat coheisve and seamless jungle based on height humidity and heat.
  • -
-

YPOQ updated:

-
    -
  • Silicons and parrots can speak into their radios again.
  • -
-

oranges, kryson updated:

-
    -
  • Added a medal box for the Head Of Personnel
  • -
  • Added the OrdoM memorial medal for paperwork excellence
  • -
-

qustinnus updated:

-
    -
  • burgers now composition based
  • -
  • you can now grind bread again
  • -
  • you can now auto-eat things with edible component
  • -
  • food trash element, for dumping trash when u eat food
  • -
- -

29 August 2020

-

ATHATH updated:

-
    -
  • Blob spores from gold slime core and hostile life reactions are now marked as being independent, meaning that they can now drag things, but can no longer freely walk through blob tiles.
  • -
  • Independent blob spores and blobbernauts can now speak over blob chat like overmind-dependent blob mobs do.
  • -
  • Blob spores can no longer damage the environment, for realzies this time. This change does not affect blob zombies.
  • -
  • Removed an unused variable from tech nodes (and the unused proc that references it).
  • -
-

ArcaneMusic updated:

-
    -
  • Admins can now spawn the Teambuilding machine for assign teams, like Red or Blue, quickly!
  • -
  • Sinks and showers can now have reagents piped into them.
  • -
  • Using metal sheets on reagent dispensers will now produce a plumbing-enabled supply tank for station use.
  • -
  • Added a new stock part, the water recycler, used in building showers and sinks from scratch.
  • -
  • Hydroponics trays are now plumbing enabled. Water and nutrients will be sorted into their appropriate slots when piped in.
  • -
  • Sinks and showers now have internal water reservoirs, and start filled with water.
  • -
  • Showers and sinks must be constructed from a frame, then finished with a water recycler. remove: Hydroponics hoses have been removed in favor of actual plumbing between machines.
  • -
-

Donkie updated:

-
    -
  • Fixed regular pump on map icon north/south being misaligned by 1 pixel
  • -
-

EdgeLordExe updated:

-
    -
  • Rust_spread will no longer lag servers into oblivion
  • -
  • Changed a few flavour texts to better represent lore.
  • -
  • Rustbringer's oath now properly only heals while on rusted tiles.
  • -
-

Helianthus00 updated:

-
    -
  • Deltastation: made a maint area below the captain's office
  • -
-

Krysonism updated:

-
    -
  • granting a mob sentience, with the sentience potion also tames it.
  • -
-

Melbert updated:

-
    -
  • You can now remove items from food storage by clicking on them on grab intent.
  • -
  • Componentizes food storage from food/snacks/store.
  • -
-

TiviPlus updated:

-
    -
  • A bunch of 1 and 0 use the true/false define now and changed up a bunch of returns
  • -
-

VexingRaven updated:

-
    -
  • Plasmaman Supply Kit description now properly lists the envirosuit gloves it contains
  • -
-

Wayland-Smithy updated:

-
    -
  • A vulnerability in the AI chamber anti-abduction foil lining has been fixed.
  • -
-

actioninja updated:

-
    -
  • Automatic glide size adjustment for smoother movement
  • -
- -

27 August 2020

-

ATHATH updated:

-
    -
  • You can now print stethoscopes from autolathes and medical protolathes.
  • -
-

Arkatos updated:

-
    -
  • Fixed an issue where the Shuttle Console UI could become unusable.
  • -
  • Fixed an issue where certain shuttle statuses did not properly show on the Shuttle Console UI.
  • -
  • Fixed an issue where Syndicate Shuttle Consoles did not restrict nuclear operatives properly.
  • -
  • Fixed an issue where Labor Shuttle Consoles did not restrict crew properly.
  • -
-

Coul, actioninja, monster860 updated:

-
    -
  • New Status Panel!
  • -
-

Donkie updated:

-
    -
  • Footprints and bloody shoes major update. Hardsuits and bare feet can now get bloody as well. Improved blood spreading behaviour.
  • -
  • Shoes will no longer get bloody while wearing something that covers them.
  • -
-

Iamgoofball updated:

-
    -
  • Electric bolts no longer explode shit.
  • -
  • Electric bolts no longer lag the server as a result.
  • -
-

Jared-Fogle updated:

-
    -
  • You will now be able to succumb through the use of a button on your HUD.
  • -
-

Kylerace updated:

-
    -
  • All holodeck sims now 9x10,
  • -
  • All stations can accommodate the enlarged holodecks
  • -
  • added skatepark sim
  • -
  • added space checkers sim
  • -
-

Melbert updated:

-
    -
  • Bees, if placed in a container, will pop out at the next person to open it
  • -
-

OnlineGirlfriend updated:

-
    -
  • wedding crate
  • -
  • tuxedo, wedding dress, veil, cummerbund, craftable bouquets
  • -
-

Qustinnus updated:

-
    -
  • undress the clown and swab his clothing, I wonder what kind of gross cell samples they have.
  • -
-

Ryll/Shaps updated:

-
    -
  • Quickswapping clothing now properly unequips the swapped-out clothing, removing any traits they granted while worn
  • -
  • You can now grab your own bleeding limbs to slow your bloodloss! Target your bleeding limb and click on yourself with grab intent and an open hand. This won't speed the clotting, but you'll lose blood more slowly.
  • -
  • You can now juice/grind banana peels to act as makeshift coagulant. hahaha ewwwwww
  • -
  • Most wound treatments (besides manipulating dislocated limbs) now respect thick clothing, so you can no longer suture through space suits.
  • -
  • Scars are a bit less noticeable, and it takes twice as much scar severity to reach a state of "absolutely fucked up" when examined. They're also a bit more varied in description.
  • -
  • Whetstones now make things sharp edged instead of pointy edged, so they'll now deal slashing wounds instead of piercing (which means sharpening a cleaver or knife won't make it suddenly suck at hacking people apart). They also increase wounding power!
  • -
  • Romerol zombies can now be wounded properly
  • -
  • Using sutures to treat slashes and pierces now correctly consumes the sutures. You can also no longer use unopened regen mesh for treating wounds.
  • -
  • You can no longer repeatedly disembowel people who have already lost their guts.
  • -
  • Execution and gunpoint shots now increase the wounding power of the shot as well as the damage, and apply their bonuses to each pellet fired rather than just one
  • -
  • Piercing wounds make further wounds slightly easier to deal
  • -
  • Hellguns now cost 2250 credits instead of 2000
  • -
  • You can no longer punch yourself while holding someone up to trigger the charged shot
  • -
  • You can no longer purposely fail executions or gunpoints to spike the damage in a loaded round for later
  • -
-

TheVekter updated:

-
    -
  • Admins will now hear a sound and get a screen flash when someone tries to rename the station.
  • -
  • Fixed an exploit involving distance checks and the Voting Box.
  • -
-

VexingRaven updated:

-
    -
  • fixed grammar of "its" in several item descriptions.
  • -
  • fixed grammar of plasmaman suits' descriptions.
  • -
  • A few tweaks have been made to DeltaStation's surgery atmos piping
  • -
  • Added a missing air alarm in DeltaStation's Surgery Room B
  • -
  • Added an air alarm in DeltaStation's surgery observation area
  • -
-

nightred updated:

-
    -
  • New rats can spawn for the king when some die.
  • -
-

stylemistake updated:

-
    -
  • tgchat: External links starting with "www" now open properly and don't break the panel.
  • -
  • Unthickened hrefs.log (no more ping hrefs)
  • -
  • Thickened tgui.log (logs actions, interacted object and mob location)
  • -
- -

26 August 2020

-

Arkatos updated:

-
    -
  • Shuttle Console now uses tgui.
  • -
-

Donkie updated:

-
    -
  • Fixed cyborg advanced mop being available for all cyborgs modules
  • -
-

Jay Smith & Michael Trauf updated:

-
    -
  • The Portable Chemical Mixer no longer requires an anomaly core.
  • -
-

Qustinnus updated:

-
    -
  • adds a helper to see if something is edible
  • -
-

TemporalOroboros updated:

-
    -
  • Reagent exposure methods are now bitflags. There have been some additional changes to reflect and take advantage of this.
  • -
-

floyd updated:

-
    -
  • action speed modifiers
  • -
-

tralezab updated:

-
    -
  • goodbye bedsheet icon state you will not be missed
  • -
-

uomo91 updated:

-
    -
  • Lawyers with jumpskirt preference will now actually spawn with a lawyer jumpskirt.
  • -
- -

25 August 2020

-

ATHATH updated:

-
    -
  • The Summon Equipment spell, which formerly asked you to choose between its two possible effects whenever you casted it, has been split into the Summon Combat Equipment and Summon Ritual Dagger spells.
  • -
  • Summon Combat Equipment can now only be used on cultists, as its description implies.
  • -
-

ATHATH and Rohesie updated:

-
    -
  • Slavers (and particularly strict employers) have begun using anti-teleportation implants to keep their slaves (and wagies, respectively) from using teleporters to escape their grasp.
  • -
  • The staff (and sec force) of the currently-disabled (on /tg/) space hotel ruin now spawn with anti-teleportation implants.
  • -
-

ArcaneMusic updated:

-
    -
  • Your sector has upgraded the BSA with a new specialty lens, Remote Economic Punishment Bombardment.
  • -
-

Thebleh updated:

-
    -
  • RCDs can build doors over firelocks again
  • -
-

uomo91 updated:

-
    -
  • To change the ammo type the detective's revolver can fire you must now use a wrench instead of a screwdriver, removing the need to take out or destroy its firing pin, and you must be holding it to do so.
  • -
  • When the detective's revolver misfires from using 357 ammo, the chambered round will actually be spent now.
  • -
- -

24 August 2020

-

ATHATH updated:

-
    -
  • The robotic limbs of androids now have the damage reduction values that normal augmented limbs do.
  • -
  • The amount of favor received per point of cell charge for a cell sacrificed to the Technophile chaplain sect has been multiplied by 10 (1 point of favor per 3,000 points of cell charge -> 1 point of favor per 300 points of cell charge).
  • -
  • The amount of favor required to perform the Rite of Synthetic Conversion has been multiplied by 2 (500 points of favor ->1,000 points of favor).
  • -
  • The amount of time required to perform the Rite of Synthetic Conversion has been reduced from 1 minute to 30 seconds.
  • -
-

Bald People updated:

-
    -
  • Bull terriers are now added into the game. Buy one at your local cargo department today.
  • -
-

Fikou updated:

-
    -
  • fixes nukie base fake glass smoothing
  • -
  • shuttle navigation consoles can no longer dock at tiles that the shuttle is on
  • -
  • border firelocks will now be opaque after closing, regular now wont be opaque on spawn
  • -
-

IndieanaJones updated:

-
    -
  • Various blob reagents have received changes. Distributed Neurons and Networked Fibers have been nerfed, while the rest have been buffed or stayed the same.
  • -
  • Blob spores can no longer damage the environment. This change does not affect blob zombies.
  • -
  • Reflective blobs are now capable of taking more damage.
  • -
  • Reroll Strain now offers a blob 5 choices, up from 3.
  • -
-

LemonInTheDark updated:

-
    -
  • Power no longer get fuckey when a ship moves with connected machines
  • -
-

Paxilmaniac updated:

-
    -
  • disposable sentry gun deployment system, a toolbox that transforms into a turret when attacked with a wrench
  • -
-

Qustinnus updated:

-
    -
  • When using tools you no longer smash the fuck out of whatever you're fixing.
  • -
-

Rohesie updated:

-
    -
  • Refactored health status procs to improve quality and allow easier reaction to change events.
  • -
  • You can use the normal say verb while on crit, and it will be automatically converted into a whisper in soft crit, or just not work while unconscious, without risk of accidentally succumbing.
  • -
  • You can only whisper-succumb by explicitly whispering while in hard crit. Use the succumb verb otherwise.
  • -
  • Martyrdom mutation works only when on hard critical, the owner will no longer die by taking a nap.
  • -
  • Pets and some pushover bots (don't try it on beespky) can now be shoved away. No need to beat them up any longer.
  • -
-

Ryll/Shaps updated:

-
    -
  • Gripper glove tackles now disable throw mode when you hit something (whether it's a person, a window, or whatever)
  • -
  • You can no longer suffer head wounds from bad rolls on tackling other people, but you can if you hit an object/wall
  • -
  • Tackling solid objects/walls is now slightly less prone to maim you
  • -
-

ShizCalev updated:

-
    -
  • Fixed the broken circuit board in delta's electronic marketing den.
  • -
-

TemporalOroboros updated:

-
    -
  • Added defines for the damage flags. Please use them!
  • -
-

TiviPlus updated:

-
    -
  • Removed a var for bloodcrawling
  • -
-

dragomagol updated:

-
    -
  • Removed the get red/blue secret documents traitor objective
  • -
-

nightred updated:

-
    -
  • Icebox medical security check point has power
  • -
-

tralezab updated:

-
    -
  • some really dangerous "you're fucked" events don't trigger on ghost roles...
  • -
  • and some events have been forbidden from centcom. stop messing with my events on the OOC zlevel!
  • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 0144d50d160..19ce3d39a9e 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -44116,3 +44116,150 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. quirk. Aww! dragomagol: - admin: Added vox announcements to individual say logs +2020-10-26: + ArcaneMusic: + - bugfix: The off sprites of the new stasis bed look correctly turned off. + Azarak: + - tweak: Broken light fixtures will now spark much less often + - rscadd: Added functional directional lighting. You can notice them with flashlights, + hardsuit lamps, hardhats and the likes. + - code_imp: Made the static light system respect the light_on variable + Dennok: + - bugfix: Double evacuation fixed. + Denton: + - bugfix: Alien resin floors can no spread to cover up Z level transitions like + stairs. + - rscadd: Added a large toner pack to cargo - six cartridges for 3000 credits. + - tweak: Increased the capacity of large toner cartridges from 15 to 25. This should + make decal/airlock painting less frustrating. + - bugfix: Added a missing bucket for the Icebox hermit ghost role. + Fikou: + - imageadd: adds alternate medborg sprites + Jared-Fogle: + - rscadd: Runechat messages will now also display the icon. + LemonInTheDark: + - bugfix: All pixel scaling prefs properly save now. + MadMedicineMan: + - bugfix: Canisters now display correct max. pressure + Mickyan: + - rscdel: Removed grab shortcut for shoe stealing, use the strip menu for your shoe + stealing needs + Ryll/Shaps: + - tweak: The Photographer quirk is now neutral and does not cost a quirk point to + take. It also no longer allows you to take photos 50% quicker. + SmArtKar: + - bugfix: Megafauna once again gibs immortal miners + The0bserver, Stewydeadmike, and TripleZeta: + - rscadd: Adds 3 new plants, and 6 new recipes ,as well as a juice reagent. Check + out your local Megaseed Vendor today! + Timberpoes: + - tweak: Pacifists can now taunt secbots such as Beepsky. Secbots absolutely loathe + pacifist scumbags and will chase down any pacifist who taunts them, informing + security in the process. + bobbahbrown: + - rscadd: Added the interview system, a 'soft' panic bunker which lets players who + would normally be blocked from joining be interviewed by admins to be selectively + allowed to play. + dragomagol: + - tweak: Meta and Delta EVA shutters and windoors can be accessed using EVA access + sergeirocks100: + - rscadd: Adds fingerless insulated gloves as a Assistant heirloom item. + zxaber: + - bugfix: AI combat and surveillance upgrades work properly again. + - bugfix: Mech pilots can once again open doors they have access to without exiting + their mech. + - bugfix: Upgrading a MK-I Ripley to MK-II no longer deletes the equipment, and + will now match the same percentage integrity that the MK-I had before the upgrade. + - balance: Ripleys no longer spawn with ore boxes. Go raid the mining outpost if + you really need one. +2020-10-28: + Denton: + - bugfix: Fixed the Pubby toxins mass driver door toggle button. + - code_imp: Replaced var edited mass driver machinery with proper subtypes. + Gamer025 and ATHATH: + - bugfix: Refunding Lesser Summon Guns or Arcane Barrage as a wizard will now remove + any instances of that spell's associated kind of projectile weapon from your + inventory. + - rscadd: Non-cultists who try to fire a blood bolt from a Blood Barrage "spell"'s + hand will be in for a nasty surprise. + Kylerace: + - bugfix: holodecks now have one less way of producing infinite cloth + Ryll/Shaps: + - bugfix: Fixed another issue with persistent dismemberment scars + TheChosenEvilOne: + - rscadd: You can now change piping layers on the RPD by scrolling with the mouse + wheel. + Timberpoes: + - rscadd: Mobs that are in stasis now have a new visual effect. + YPOQ: + - bugfix: Fixed an issue that prevented split personalities from switching control. + Yenwodyah: + - bugfix: A few bounties that accepted/refused the wrong items will now accept/refuse + the right ones. + skoglol: + - bugfix: Removed a duplicate table and holopad from MetaStation +2020-10-29: + Ghommie: + - tweak: The reactive teleport armor will now actually teleport the owner instead + of forcemoving them to the picked turf. Expect some slight changes to the item's + behaviour as result. + Megarop: + - bugfix: Sweet pea donuts no longer cause a giant "error" sign to appear when you + put them in a donut box. + Skoglol: + - rscdel: Removed changeling team objectives and hivemind chat channel. Now a pure + solo antagonist, use pheromone receptors if you insist on teaming up. + Stewydeadmike#0068, Ghilker: + - imageadd: new crystal invasion mob sprites + - imagedel: old crystal invasion mob sprites + tralezab: + - rscdel: Capitalism (golem) and Communism (golem) are dead. +2020-10-30: + LemonInTheDark: + - admin: Stripping is logged just a bit better + Timberpoes: + - bugfix: Fixed various shapeshifting runtimes that would affect vampries in bat + form and players in ash drake from in particular. + - bugfix: Interactions with mobs in shapeshifted form and the Wabbajack force-tranformation + effects (including the Staff of Change) should now make more sense and not leave + behind random corpses. + VexingRaven: + - tweak: Assistants no longer spawn in the chapel on Pubby + cacogen: + - spellcheck: Settings, Ghost and Sound menus on menu bar at top are correctly capitalised + now + - bugfix: Slicing food in your hand (e.g. pizza) no longer results in it "disappearing" + (i.e. having the slices created inside you) + necromanceranne: + - rscadd: Roboticist unique labcoat! Because you're worth it! Aesthetics! + - bugfix: All other labcoats no longer utilize the oldest labcoat sprites we have + for their icons! + - bugfix: The virologist labcoat no longer lies about being more resistant to biological + effects! Not that bio armor does anything in the first place. + - bugfix: Some stuff that could be worn in the suit storage slot no longer shows + pink! Hooray! + tralezab: + - spellcheck: Blind messages for gunpointing and tackling are fixed +2020-10-31: + Krysonism: + - rscadd: Added 3 new types of fancy carpets. + - rscadd: A crate of decorative items now sometimes spawns in maintenance. + Rohesie: + - bugfix: Fixed an issue preventing afterattacks from happening, which broke regenerative + crossbreeds, fulton packs and other interactions. + necromanceranne: + - balance: Ridden vehicles always pass any object that would normally pass through + tables, such as thrown weapons and bullets. + - balance: Makes ridden objects more consistent with what causes you to fall off + if they require hand availability, checking for the incapacitation traits. +2020-11-01: + EOBGames: + - bugfix: pea soup now requires a bowl, and obeys the laws of conservation of kitchenware + Inept: + - bugfix: a few wee issues on Delta + Skoglol: + - bugfix: Vampire blood level status no longer has excess spans. + XDTM: + - bugfix: Fixed nanite comm remotes not working at all. + cacogen: + - spellcheck: Lifeform stasis units have all lowercase names now diff --git a/html/changelogs/AutoChangeLog-pr-54318.yml b/html/changelogs/AutoChangeLog-pr-54318.yml deleted file mode 100644 index 2552af68b96..00000000000 --- a/html/changelogs/AutoChangeLog-pr-54318.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Jared-Fogle" -delete-after: True -changes: - - rscadd: "Runechat messages will now also display the icon." diff --git a/html/changelogs/AutoChangeLog-pr-54465.yml b/html/changelogs/AutoChangeLog-pr-54465.yml deleted file mode 100644 index e36898a97b9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-54465.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "bobbahbrown" -delete-after: True -changes: - - rscadd: "Added the interview system, a 'soft' panic bunker which lets players who would normally be blocked from joining be interviewed by admins to be selectively allowed to play." diff --git a/html/changelogs/AutoChangeLog-pr-54556.yml b/html/changelogs/AutoChangeLog-pr-54556.yml deleted file mode 100644 index 746f984ae69..00000000000 --- a/html/changelogs/AutoChangeLog-pr-54556.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - rscadd: "Added a large toner pack to cargo - six cartridges for 3000 credits." - - tweak: "Increased the capacity of large toner cartridges from 15 to 25. This should make decal/airlock painting less frustrating." diff --git a/html/changelogs/AutoChangeLog-pr-54559.yml b/html/changelogs/AutoChangeLog-pr-54559.yml deleted file mode 100644 index 177a3ba88cc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-54559.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Denton" -delete-after: True -changes: - - bugfix: "Added a missing bucket for the Icebox hermit ghost role." diff --git a/html/changelogs/AutoChangeLog-pr-54573.yml b/html/changelogs/AutoChangeLog-pr-54573.yml deleted file mode 100644 index 8bba523585c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-54573.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "The0bserver, Stewydeadmike, and TripleZeta" -delete-after: True -changes: - - rscadd: "Adds 3 new plants, and 6 new recipes ,as well as a juice reagent. Check out your local Megaseed Vendor today!" diff --git a/html/changelogs/AutoChangeLog-pr-54650.yml b/html/changelogs/AutoChangeLog-pr-54650.yml new file mode 100644 index 00000000000..c03c4dc2849 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-54650.yml @@ -0,0 +1,4 @@ +author: "Rohesie" +delete-after: True +changes: + - bugfix: "The infinite table stacking exploit is fixed. One table per turf allowed only." diff --git a/html/changelogs/AutoChangeLog-pr-54701.yml b/html/changelogs/AutoChangeLog-pr-54701.yml new file mode 100644 index 00000000000..fe3a7f59076 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-54701.yml @@ -0,0 +1,4 @@ +author: "cacogen" +delete-after: True +changes: + - code_imp: "StartProcessingAtom() uses drop_location() instead of get_turf(src)" diff --git a/html/changelogs/AutoChangeLog-pr-54711.yml b/html/changelogs/AutoChangeLog-pr-54711.yml new file mode 100644 index 00000000000..66ed9ae3967 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-54711.yml @@ -0,0 +1,4 @@ +author: "Inept" +delete-after: True +changes: + - spellcheck: "the pettiest errata ever in the chisel description" diff --git a/icons/effects/light_overlays/light_cone.dmi b/icons/effects/light_overlays/light_cone.dmi new file mode 100644 index 00000000000..75f322a9371 Binary files /dev/null and b/icons/effects/light_overlays/light_cone.dmi differ diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi index 45c3b4e732e..ea140df9ab4 100644 Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ diff --git a/icons/mob/clothing/belt_mirror.dmi b/icons/mob/clothing/belt_mirror.dmi index dac7a1483ce..368adb79802 100644 Binary files a/icons/mob/clothing/belt_mirror.dmi and b/icons/mob/clothing/belt_mirror.dmi differ diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi index deaa2c08902..4fbe9361b5d 100644 Binary files a/icons/mob/clothing/hands.dmi and b/icons/mob/clothing/hands.dmi differ diff --git a/icons/mob/clothing/suit.dmi b/icons/mob/clothing/suit.dmi index cebfba3440f..3f13eb510a4 100644 Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ diff --git a/icons/mob/crystal_mobs.dmi b/icons/mob/crystal_mobs.dmi new file mode 100644 index 00000000000..9ccaa618462 Binary files /dev/null and b/icons/mob/crystal_mobs.dmi differ diff --git a/icons/mob/human_parts.dmi b/icons/mob/human_parts.dmi index beb144bdfb7..f8e7ff074db 100644 Binary files a/icons/mob/human_parts.dmi and b/icons/mob/human_parts.dmi differ diff --git a/icons/mob/simple_human.dmi b/icons/mob/simple_human.dmi index 056b998009d..bc10335e5ee 100644 Binary files a/icons/mob/simple_human.dmi and b/icons/mob/simple_human.dmi differ diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index cbf0904277a..86b52db72f0 100644 Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 60239f7205a..a4b58489d6a 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/food/donuts.dmi b/icons/obj/food/donuts.dmi index 652ee812814..b99cfd8142d 100644 Binary files a/icons/obj/food/donuts.dmi and b/icons/obj/food/donuts.dmi differ diff --git a/icons/obj/machines/stasis.dmi b/icons/obj/machines/stasis.dmi index 672717dc0c5..21844b0f8d5 100755 Binary files a/icons/obj/machines/stasis.dmi and b/icons/obj/machines/stasis.dmi differ diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi index 2911e0a035c..477b59e461c 100644 Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi index 905b2dc6f92..7983fba9a05 100644 Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ diff --git a/icons/turf/floors/carpet_donk.dmi b/icons/turf/floors/carpet_donk.dmi new file mode 100644 index 00000000000..04c4148d2bc Binary files /dev/null and b/icons/turf/floors/carpet_donk.dmi differ diff --git a/icons/turf/floors/carpet_executive.dmi b/icons/turf/floors/carpet_executive.dmi new file mode 100644 index 00000000000..2c17e542fcd Binary files /dev/null and b/icons/turf/floors/carpet_executive.dmi differ diff --git a/icons/turf/floors/carpet_stellar.dmi b/icons/turf/floors/carpet_stellar.dmi new file mode 100644 index 00000000000..6ba81678426 Binary files /dev/null and b/icons/turf/floors/carpet_stellar.dmi differ diff --git a/sound/misc/Cyka Blyat.ogg b/sound/misc/Cyka Blyat.ogg deleted file mode 100644 index ca5c8fd49be..00000000000 Binary files a/sound/misc/Cyka Blyat.ogg and /dev/null differ diff --git a/sound/misc/Russian_Anthem_chorus.ogg b/sound/misc/Russian_Anthem_chorus.ogg deleted file mode 100644 index 0105eb7f22a..00000000000 Binary files a/sound/misc/Russian_Anthem_chorus.ogg and /dev/null differ diff --git a/sound/misc/capitialism.ogg b/sound/misc/capitialism.ogg deleted file mode 100644 index 8645fc6ed72..00000000000 Binary files a/sound/misc/capitialism.ogg and /dev/null differ diff --git a/sound/misc/mymoney.ogg b/sound/misc/mymoney.ogg deleted file mode 100644 index 610545f5379..00000000000 Binary files a/sound/misc/mymoney.ogg and /dev/null differ diff --git a/tgstation.dme b/tgstation.dme index 16d6ee4a6dd..fa5910d40da 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -424,7 +424,6 @@ #include "code\datums\components\earprotection.dm" #include "code\datums\components\edit_complainer.dm" #include "code\datums\components\embedded.dm" -#include "code\datums\components\empprotection.dm" #include "code\datums\components\explodable.dm" #include "code\datums\components\footstep.dm" #include "code\datums\components\forensics.dm" @@ -456,7 +455,6 @@ #include "code\datums\components\pellet_cloud.dm" #include "code\datums\components\pricetag.dm" #include "code\datums\components\punchcooldown.dm" -#include "code\datums\components\rad_insulation.dm" #include "code\datums\components\radioactive.dm" #include "code\datums\components\religious_tool.dm" #include "code\datums\components\remote_materials.dm" @@ -578,10 +576,12 @@ #include "code\datums\elements\digitalcamo.dm" #include "code\datums\elements\earhealing.dm" #include "code\datums\elements\embed.dm" +#include "code\datums\elements\empprotection.dm" #include "code\datums\elements\firestacker.dm" #include "code\datums\elements\forced_gravity.dm" #include "code\datums\elements\light_blocking.dm" #include "code\datums\elements\obj_regen.dm" +#include "code\datums\elements\rad_insulation.dm" #include "code\datums\elements\selfknockback.dm" #include "code\datums\elements\snail_crawl.dm" #include "code\datums\elements\squish.dm" @@ -1492,7 +1492,6 @@ #include "code\modules\antagonists\changeling\powers\hivemind.dm" #include "code\modules\antagonists\changeling\powers\humanform.dm" #include "code\modules\antagonists\changeling\powers\lesserform.dm" -#include "code\modules\antagonists\changeling\powers\linglink.dm" #include "code\modules\antagonists\changeling\powers\mimic_voice.dm" #include "code\modules\antagonists\changeling\powers\mutations.dm" #include "code\modules\antagonists\changeling\powers\panacea.dm" diff --git a/tools/appveyor/build.ps1 b/tools/ci/build.ps1 similarity index 66% rename from tools/appveyor/build.ps1 rename to tools/ci/build.ps1 index 6bda0799771..8c9906dfe5c 100644 --- a/tools/appveyor/build.ps1 +++ b/tools/ci/build.ps1 @@ -1,10 +1,8 @@ if(!(Test-Path -Path "C:/byond")){ - bash tools/appveyor/download_byond.sh + bash tools/ci/download_byond.sh [System.IO.Compression.ZipFile]::ExtractToDirectory("C:/byond.zip", "C:/") Remove-Item C:/byond.zip } -Set-Location $env:APPVEYOR_BUILD_FOLDER - &"C:/byond/bin/dm.exe" -max_errors 0 tgstation.dme -exit $LASTEXITCODE \ No newline at end of file +exit $LASTEXITCODE diff --git a/tools/travis/build_spaceman_dmm.sh b/tools/ci/build_spaceman_dmm.sh old mode 100755 new mode 100644 similarity index 100% rename from tools/travis/build_spaceman_dmm.sh rename to tools/ci/build_spaceman_dmm.sh diff --git a/tools/travis/build_tgui.sh b/tools/ci/build_tgui.sh old mode 100755 new mode 100644 similarity index 100% rename from tools/travis/build_tgui.sh rename to tools/ci/build_tgui.sh diff --git a/tools/travis/check_changelogs.sh b/tools/ci/check_changelogs.sh old mode 100755 new mode 100644 similarity index 100% rename from tools/travis/check_changelogs.sh rename to tools/ci/check_changelogs.sh diff --git a/tools/travis/check_filedirs.sh b/tools/ci/check_filedirs.sh old mode 100755 new mode 100644 similarity index 100% rename from tools/travis/check_filedirs.sh rename to tools/ci/check_filedirs.sh diff --git a/tools/travis/check_grep.sh b/tools/ci/check_grep.sh old mode 100755 new mode 100644 similarity index 100% rename from tools/travis/check_grep.sh rename to tools/ci/check_grep.sh diff --git a/tools/travis/travis_config.txt b/tools/ci/ci_config.txt similarity index 82% rename from tools/travis/travis_config.txt rename to tools/ci/ci_config.txt index ff6bf9a793e..4925d781bbb 100644 --- a/tools/travis/travis_config.txt +++ b/tools/ci/ci_config.txt @@ -1,7 +1,7 @@ SQL_ENABLED ADDRESS 127.0.0.1 PORT 3306 -FEEDBACK_DATABASE tg_travis +FEEDBACK_DATABASE tg_ci FEEDBACK_TABLEPREFIX FEEDBACK_LOGIN root FEEDBACK_PASSWORD diff --git a/tools/travis/dm.sh b/tools/ci/dm.sh old mode 100755 new mode 100644 similarity index 100% rename from tools/travis/dm.sh rename to tools/ci/dm.sh diff --git a/tools/appveyor/download_byond.sh b/tools/ci/download_byond.sh old mode 100755 new mode 100644 similarity index 100% rename from tools/appveyor/download_byond.sh rename to tools/ci/download_byond.sh diff --git a/tools/travis/install_build_tools.sh b/tools/ci/install_build_tools.sh old mode 100755 new mode 100644 similarity index 88% rename from tools/travis/install_build_tools.sh rename to tools/ci/install_build_tools.sh index c36cd571ba7..6c3e267fca3 --- a/tools/travis/install_build_tools.sh +++ b/tools/ci/install_build_tools.sh @@ -10,5 +10,3 @@ npm install --global yarn pip3 install --user PyYaml pip3 install --user beautifulsoup4 - -phpenv global $PHP_VERSION diff --git a/tools/travis/install_byond.sh b/tools/ci/install_byond.sh old mode 100755 new mode 100644 similarity index 100% rename from tools/travis/install_byond.sh rename to tools/ci/install_byond.sh diff --git a/tools/travis/install_rust_g.sh b/tools/ci/install_rust_g.sh old mode 100755 new mode 100644 similarity index 100% rename from tools/travis/install_rust_g.sh rename to tools/ci/install_rust_g.sh diff --git a/tools/travis/install_spaceman_dmm.sh b/tools/ci/install_spaceman_dmm.sh old mode 100755 new mode 100644 similarity index 100% rename from tools/travis/install_spaceman_dmm.sh rename to tools/ci/install_spaceman_dmm.sh diff --git a/tools/ci/run_server.sh b/tools/ci/run_server.sh new file mode 100644 index 00000000000..f54c541bf66 --- /dev/null +++ b/tools/ci/run_server.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -euo pipefail + +tools/deploy.sh ci_test +rm ci_test/*.dll +mkdir ci_test/config + +#test config +cp tools/ci/ci_config.txt ci_test/config/config.txt + +cd ci_test +DreamDaemon tgstation.dmb -close -trusted -verbose -params "log-directory=ci" +cd .. +cat ci_test/data/logs/ci/clean_run.lk diff --git a/tools/travis/template_dm_generator.py b/tools/ci/template_dm_generator.py old mode 100755 new mode 100644 similarity index 100% rename from tools/travis/template_dm_generator.py rename to tools/ci/template_dm_generator.py diff --git a/tools/travis/run_server.sh b/tools/travis/run_server.sh deleted file mode 100755 index baa5e5ff770..00000000000 --- a/tools/travis/run_server.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -set -euo pipefail - -tools/deploy.sh travis_test -rm travis_test/*.dll -mkdir travis_test/config - -#test config -cp tools/travis/travis_config.txt travis_test/config/config.txt - -cd travis_test -DreamDaemon tgstation.dmb -close -trusted -verbose -params "log-directory=travis" -cd .. -cat travis_test/data/logs/travis/clean_run.lk