diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml index 9dafbb0d6b..34c1ec1b0e 100644 --- a/.github/workflows/ci_suite.yml +++ b/.github/workflows/ci_suite.yml @@ -13,11 +13,20 @@ jobs: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - - name: Setup cache + - name: Restore SpacemanDMM cache uses: actions/cache@v2 with: - path: $HOME/SpacemanDMM - key: ${{ runner.os }}-spacemandmm + path: ~/SpacemanDMM + key: ${{ runner.os }}-spacemandmm-${{ secrets.CACHE_PURGE_KEY }} + - name: Restore Yarn cache + uses: actions/cache@v2 + with: + path: tgui/.yarn/cache + key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-build-${{ secrets.CACHE_PURGE_KEY }}- + ${{ runner.os }}-build- + ${{ runner.os }}- - name: Install Tools run: | pip3 install setuptools @@ -28,11 +37,10 @@ jobs: run: | bash tools/ci/check_filedirs.sh tgstation.dme bash tools/ci/check_changelogs.sh + bash tools/ci/check_grep.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 - tgui/bin/tgui --lint - tgui/bin/tgui --test - bash tools/ci/check_grep.sh + tools/build/build --ci lint tools/bootstrap/python -m dmi.test tools/bootstrap/python -m mapmerge2.dmm_test ~/dreamchecker > ${GITHUB_WORKSPACE}/output-annotations.txt 2>&1 @@ -48,19 +56,16 @@ jobs: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - - name: Setup cache + - name: Restore BYOND cache uses: actions/cache@v2 with: - path: $HOME/BYOND - key: ${{ runner.os }}-byond + path: ~/BYOND + key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }} - name: Compile All Maps run: | bash tools/ci/install_byond.sh source $HOME/BYOND/byond/bin/byondsetup - python3 tools/ci/template_dm_generator.py - tools/build/build - env: - CBT_BUILD_MODE : ALL_MAPS + tools/build/build --ci dm -DCIBUILDING -DCITESTING -DALL_MAPS run_all_tests: if: "!contains(github.event.head_commit.message, '[ci skip]')" @@ -76,11 +81,20 @@ jobs: options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 steps: - uses: actions/checkout@v2 - - name: Setup cache + - name: Restore BYOND cache uses: actions/cache@v2 with: - path: $HOME/BYOND - key: ${{ runner.os }}-byond + path: ~/BYOND + key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }} + - name: Restore Yarn cache + uses: actions/cache@v2 + with: + path: tgui/.yarn/cache + key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-build-${{ secrets.CACHE_PURGE_KEY }}- + ${{ runner.os }}-build- + ${{ runner.os }}- - name: Setup database run: | sudo systemctl start mysql @@ -94,14 +108,16 @@ jobs: sudo apt update || true sudo apt install -o APT::Immediate-Configure=false libssl1.1:i386 bash tools/ci/install_rust_g.sh + - name: Install auxmos + run: | + sudo apt update || true + bash tools/ci/install_auxmos.sh - name: Compile and run tests run: | bash tools/ci/install_byond.sh source $HOME/BYOND/byond/bin/byondsetup - tools/build/build - # bash tools/ci/run_server.sh - env: - CBT_BUILD_MODE: TEST_RUN + tools/build/build --ci -DCIBUILDING + bash tools/ci/run_server.sh test_windows: if: "!contains(github.event.head_commit.message, '[ci skip]')" @@ -109,6 +125,15 @@ jobs: runs-on: windows-latest steps: - uses: actions/checkout@v2 + - name: Restore Yarn cache + uses: actions/cache@v2 + with: + path: tgui/.yarn/cache + key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-build-${{ secrets.CACHE_PURGE_KEY }}- + ${{ runner.os }}-build- + ${{ runner.os }}- - name: Compile run: pwsh tools/ci/build.ps1 env: diff --git a/.github/workflows/generate_documentation.yml b/.github/workflows/generate_documentation.yml index 0fa3f315be..265e179ff0 100644 --- a/.github/workflows/generate_documentation.yml +++ b/.github/workflows/generate_documentation.yml @@ -12,8 +12,8 @@ jobs: - name: Setup cache uses: actions/cache@v2 with: - path: $HOME/SpacemanDMM - key: ${{ runner.os }}-spacemandmm + path: ~/SpacemanDMM + key: ${{ runner.os }}-spacemandmm-${{ secrets.CACHE_PURGE_KEY }} - name: Install SpacemanDMM run: bash tools/ci/install_spaceman_dmm.sh dmdoc - name: Generate documentation diff --git a/.gitignore b/.gitignore index 91a0ef08eb..56a447fdd1 100644 --- a/.gitignore +++ b/.gitignore @@ -7,14 +7,16 @@ #Ignore byond config folder. /cfg/**/* -#Ignore rust-g and auxmos libraries which are compiled with scripts -*.so -/tools/build/binaries/**/* +# Ignore compiled linux libs in the root folder, e.g. librust_g.so +/*.so #Ignore compiled files and other files generated during compilation. *.mdme +*.mdme.* *.dmb *.rsc +*.m.dme +*.test.dme *.lk *.int *.backup @@ -53,27 +55,6 @@ __pycache__/ *.py[cod] *$py.class -# C extensions -#*.so - -# Distribution / packaging -.Python -env/ -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -*.egg-info/ -.installed.cfg -*.egg - # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. @@ -81,8 +62,7 @@ var/ *.spec # Installer logs -pip-log.txt -pip-delete-this-directory.txt +pip-*.txt # Unit test / coverage reports htmlcov/ @@ -92,7 +72,6 @@ htmlcov/ .cache nosetests.xml coverage.xml -*,cover .hypothesis/ # Translations @@ -101,10 +80,6 @@ coverage.xml # Django stuff: *.log -local_settings.py - -# Flask instance folder -instance/ # Scrapy stuff: .scrapy @@ -112,9 +87,6 @@ instance/ # Sphinx documentation docs/_build/ -# PyBuilder -target/ - # IPython Notebook .ipynb_checkpoints @@ -127,10 +99,6 @@ celerybeat-schedule # dotenv .env -# virtualenv -venv/ -ENV/ - # IntelliJ IDEA / PyCharm (with plugin) .idea @@ -153,12 +121,6 @@ Desktop.ini # Recycle Bin used on file shares $RECYCLE.BIN/ -# Windows Installer files -#*.cab -#*.msi -#*.msm -#*.msp - # Windows shortcuts *.lnk @@ -199,11 +161,10 @@ Temporary Items #Visual studio stuff *.vscode/* -!/.vscode/extensions.json -tools/MapAtmosFixer/MapAtmosFixer/obj/* -tools/MapAtmosFixer/MapAtmosFixer/bin/* -tools/CreditsTool/bin/* -tools/CreditsTool/obj/* +/tools/MapAtmosFixer/MapAtmosFixer/obj/* +/tools/MapAtmosFixer/MapAtmosFixer/bin/* +/tools/CreditsTool/bin/* +/tools/CreditsTool/obj/* #GitHub Atom .atom-build.json @@ -228,13 +189,10 @@ tools/CreditsTool/obj/* !/config/title_screens/images/exclude #Linux docker -tools/LinuxOneShot/SetupProgram/obj/* -tools/LinuxOneShot/SetupProgram/bin/* -tools/LinuxOneShot/SetupProgram/.vs -tools/LinuxOneShot/Database -tools/LinuxOneShot/TGS_Config -tools/LinuxOneShot/TGS_Instances -tools/LinuxOneShot/TGS_Logs - -# Common build tooling -!/tools/build +/tools/LinuxOneShot/SetupProgram/obj/* +/tools/LinuxOneShot/SetupProgram/bin/* +/tools/LinuxOneShot/SetupProgram/.vs +/tools/LinuxOneShot/Database +/tools/LinuxOneShot/TGS_Config +/tools/LinuxOneShot/TGS_Instances +/tools/LinuxOneShot/TGS_Logs diff --git a/Build.bat b/Build.bat index dd3a6fd9d9..68eaef0c2d 100644 --- a/Build.bat +++ b/Build.bat @@ -1,2 +1,3 @@ -@call tools\build\build -@pause +@echo off +call "%~dp0\tools\build\build.bat" %* +pause diff --git a/CLEAN.bat b/CLEAN.bat new file mode 100644 index 0000000000..47293bb769 --- /dev/null +++ b/CLEAN.bat @@ -0,0 +1,3 @@ +@echo off +call "%~dp0\tools\build\build.bat" dist-clean +pause diff --git a/README.md b/README.md index bbceb0f05b..cc485278cc 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ## Citadel Station 13 Based and maintained from /tg/station. -[![Build Status](https://api.travis-ci.org/Citadel-Station-13/Citadel-Station-13.png)](https://travis-ci.org/Citadel-Station-13/Citadel-Station-13) +[![Build Status](https://github.com/Citadel-Station-13/Citadel-Station-13/workflows/CI%20Suite/badge.svg)](https://github.com/Citadel-Station-13/Citadel-Station-13/actions?query=workflow%3A%22CI+Suite%22) [![Percentage of issues still open](http://isitmaintained.com/badge/open/Citadel-Station-13/Citadel-Station-13.svg)](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Percentage of issues still open") [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/Citadel-Station-13/Citadel-Station-13.svg)](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Average time to resolve an issue") @@ -100,6 +100,14 @@ install, overwriting when prompted except if we've specified otherwise, and recompile the game. Once you start the server up again, you should be running the new version. +## :exclamation: How to compile :exclamation: + +On **2021-01-04** we have changed the way to compile the codebase. + +Find `Build.cmd` in this folder, and double click it to initiate the build. It consists of multiple steps and might take around 1-5 minutes to compile. If it closes, it means it has finished its job. You can then setup the server normally by opening `tgstation.dmb` in DreamDaemon. + +**Building tgstation in DreamMaker directly is now deprecated and might produce errors**, such as `'tgui.bundle.js': cannot find file`. + ## HOSTING If you'd like a more robust server hosting option for tgstation and its diff --git a/RUN_SERVER.bat b/RUN_SERVER.bat new file mode 100644 index 0000000000..93438f0c2e --- /dev/null +++ b/RUN_SERVER.bat @@ -0,0 +1,3 @@ +@echo off +call "%~dp0\tools\build\build.bat" server %* +pause diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_bathhouse.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_bathhouse.dmm new file mode 100644 index 0000000000..a4b572a2ee --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_bathhouse.dmm @@ -0,0 +1,175 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/closed/wall/mineral/silver, +/area/ruin/powered/bathhouse) +"c" = ( +/obj/machinery/shower{ + pixel_y = 16 + }, +/obj/structure/curtain, +/turf/open/floor/plasteel/white, +/area/ruin/powered/bathhouse) +"e" = ( +/obj/structure/mirror{ + pixel_y = 28 + }, +/obj/structure/sink{ + pixel_y = 20 + }, +/turf/open/floor/plasteel/white, +/area/ruin/powered/bathhouse) +"f" = ( +/obj/structure/table/greyscale, +/obj/item/bikehorn/rubberducky, +/turf/open/floor/plasteel/white, +/area/ruin/powered/bathhouse) +"g" = ( +/turf/open/floor/plasteel/white, +/area/ruin/powered/bathhouse) +"h" = ( +/obj/item/soap, +/turf/open/floor/plasteel/white, +/area/ruin/powered/bathhouse) +"i" = ( +/obj/machinery/door/airlock/freezer{ + name = "bath house airlock" + }, +/turf/open/floor/plasteel/white, +/area/ruin/powered/bathhouse) +"j" = ( +/turf/closed/wall/mineral/wood, +/area/ruin/powered/bathhouse) +"k" = ( +/turf/open/floor/wood, +/area/ruin/powered/bathhouse) +"l" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/meatballspaghetti, +/turf/open/floor/wood, +/area/ruin/powered/bathhouse) +"m" = ( +/obj/structure/bookcase/random, +/turf/open/floor/wood, +/area/ruin/powered/bathhouse) +"n" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"o" = ( +/obj/structure/bed, +/obj/item/bedsheet, +/turf/open/floor/wood, +/area/ruin/powered/bathhouse) + +(1,1,1) = {" +b +b +b +b +b +n +a +a +"} +(2,1,1) = {" +b +c +g +g +b +j +j +j +"} +(3,1,1) = {" +b +b +g +g +i +k +k +j +"} +(4,1,1) = {" +b +c +g +g +b +l +k +j +"} +(5,1,1) = {" +b +b +g +g +b +m +o +j +"} +(6,1,1) = {" +b +c +g +g +b +j +j +j +"} +(7,1,1) = {" +b +b +g +h +b +n +n +n +"} +(8,1,1) = {" +b +e +g +g +b +n +n +n +"} +(9,1,1) = {" +b +e +g +g +i +n +n +n +"} +(10,1,1) = {" +b +f +g +g +b +n +n +a +"} +(11,1,1) = {" +b +b +b +b +b +n +a +a +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_engioutpost.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_engioutpost.dmm new file mode 100644 index 0000000000..ef07fa1303 --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_engioutpost.dmm @@ -0,0 +1,2063 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ab" = ( +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"ad" = ( +/obj/machinery/power/floodlight, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"ae" = ( +/turf/closed/wall/r_wall, +/area/lavaland/surface/outdoors) +"af" = ( +/obj/structure/lattice, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ag" = ( +/obj/structure/cable, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"ah" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"ai" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"aj" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"al" = ( +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"am" = ( +/obj/machinery/power/emitter, +/obj/effect/turf_decal/stripes/end{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"an" = ( +/turf/closed/wall/mineral/iron, +/area/lavaland/surface/outdoors) +"ao" = ( +/obj/item/clothing/under/rank/engineering/chief_engineer, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"ap" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"aq" = ( +/obj/machinery/field/generator, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"ar" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"as" = ( +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"at" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"au" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"av" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"ax" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber, +/turf/open/floor/engine/o2, +/area/lavaland/surface/outdoors) +"ay" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume, +/turf/open/floor/engine/o2, +/area/lavaland/surface/outdoors) +"az" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber, +/turf/open/floor/engine/n2, +/area/lavaland/surface/outdoors) +"aA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume, +/turf/open/floor/engine/n2, +/area/lavaland/surface/outdoors) +"aB" = ( +/turf/closed/wall, +/area/lavaland/surface/outdoors) +"aC" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/machinery/light/small/broken{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aD" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine/o2, +/area/lavaland/surface/outdoors) +"aE" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/open/floor/engine/o2, +/area/lavaland/surface/outdoors) +"aF" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine/n2, +/area/lavaland/surface/outdoors) +"aG" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/open/floor/engine/n2, +/area/lavaland/surface/outdoors) +"aH" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aI" = ( +/obj/effect/turf_decal/stripes/line, +/obj/item/clothing/suit/space/hardsuit/engine, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aJ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"aK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aL" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aM" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine/airless, +/area/lavaland/surface/outdoors) +"aN" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/open/floor/engine/airless, +/area/lavaland/surface/outdoors) +"aO" = ( +/turf/closed/wall/r_wall/rust, +/area/lavaland/surface/outdoors) +"aP" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aQ" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aR" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aU" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aV" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aW" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aX" = ( +/obj/machinery/atmospherics/components/trinary/mixer/flipped{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aY" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aZ" = ( +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 1 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"ba" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 10 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bb" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"bd" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bf" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/blood/gibs/core, +/obj/item/clothing/suit/space/hardsuit/engine, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"bh" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"bi" = ( +/obj/machinery/door/airlock/engineering{ + name = "The Singularity Engine" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"bj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bk" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engine Entry"; + req_access_txt = "204" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bn" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bo" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bp" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/visible{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"br" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bt" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bu" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bv" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bw" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bx" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 1 + }, +/obj/machinery/power/apc/unlocked{ + dir = 4; + pixel_x = 24 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"by" = ( +/obj/item/stack/rods{ + amount = 2 + }, +/obj/item/shard/plasma, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bA" = ( +/obj/item/flashlight/flare, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"bD" = ( +/obj/effect/decal/cleanable/robot_debris, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/book/manual/wiki/engineering_singulo_tesla, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bE" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bI" = ( +/obj/item/pda/clear{ + note = "Chief's asked me to check on the machinery inside PDA. He's also worried about Build, but i'm sure Harry'll handle the construction. I just need to work on Internals. Fuck i'm hungry" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bK" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 1 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bM" = ( +/obj/machinery/atmospherics/components/trinary/filter/flipped{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bN" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bO" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 10 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bP" = ( +/obj/machinery/atmospherics/components/binary/pump, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bQ" = ( +/obj/effect/spawner/structure/window/plasma, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bR" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bS" = ( +/obj/structure/sign/poster/official/build{ + pixel_x = -32 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bT" = ( +/obj/item/pipe_dispenser, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bU" = ( +/obj/effect/mob_spawn/human/corpse/assistant, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bV" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bW" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bY" = ( +/obj/structure/sign/poster/official/safety_internals{ + pixel_x = 32 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bZ" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"ca" = ( +/obj/item/flashlight, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cb" = ( +/obj/item/book/manual/wiki/atmospherics, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cc" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cd" = ( +/obj/machinery/atmospherics/pipe/manifold/dark/visible{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"ce" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 1 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cf" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cg" = ( +/obj/item/wallframe/apc, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"ch" = ( +/obj/machinery/light/broken, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"ci" = ( +/obj/structure/sign/poster/official/pda_ad{ + pixel_y = -32 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"ck" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 5 + }, +/obj/structure/sign/poster/contraband/atmosia_independence{ + pixel_x = -32 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cl" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/visible, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cm" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cn" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"co" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 6 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cp" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cq" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 1 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cr" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/door_assembly/door_assembly_eng, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cs" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"ct" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/visible{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cv" = ( +/obj/machinery/atmospherics/pipe/manifold/green/visible, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cw" = ( +/obj/machinery/atmospherics/pipe/manifold4w/green/visible, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cx" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cy" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cz" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 9 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cA" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cB" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cC" = ( +/obj/effect/decal/cleanable/oil, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"cD" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"cE" = ( +/obj/machinery/computer/rdconsole/production, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"cG" = ( +/obj/machinery/field/generator, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"cH" = ( +/obj/item/construction/rcd, +/obj/structure/rack, +/obj/item/rcd_ammo, +/obj/item/rcd_ammo, +/obj/item/rcd_upgrade/frames, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cI" = ( +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cJ" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/visible{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cL" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/space_heater, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cM" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cN" = ( +/obj/machinery/atmospherics/components/binary/pump, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cO" = ( +/obj/machinery/light/small, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cP" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cQ" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 9 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cR" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/space_heater, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cS" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cT" = ( +/obj/machinery/power/emitter{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/end, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"cV" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cW" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cY" = ( +/obj/machinery/light/small/broken, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cZ" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/engine/airless, +/area/lavaland/surface/outdoors) +"da" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/brown/visible, +/turf/open/floor/engine/airless, +/area/lavaland/surface/outdoors) +"db" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/turf/open/floor/engine/airless, +/area/lavaland/surface/outdoors) +"dc" = ( +/obj/machinery/power/rad_collector, +/obj/structure/cable, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"dd" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"de" = ( +/obj/machinery/autolathe, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"df" = ( +/obj/machinery/door/airlock, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"dg" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"dh" = ( +/obj/structure/sign/poster/contraband/grey_tide, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/lavaland/surface/outdoors) +"di" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"dj" = ( +/turf/closed/wall/rust, +/area/lavaland/surface/outdoors) +"dk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/engine/air, +/area/lavaland/surface/outdoors) +"dl" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/open/floor/engine/air, +/area/lavaland/surface/outdoors) +"dm" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible, +/turf/open/floor/engine/vacuum, +/area/lavaland/surface/outdoors) +"dn" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/turf/open/floor/engine/vacuum, +/area/lavaland/surface/outdoors) +"do" = ( +/obj/machinery/power/port_gen/pacman, +/obj/effect/decal/cleanable/oil/streak, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"dp" = ( +/obj/machinery/light/built, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"dq" = ( +/obj/item/tank/internals/plasma, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"dr" = ( +/obj/machinery/power/floodlight, +/obj/structure/cable, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"ds" = ( +/obj/structure/tank_dispenser, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"dt" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"du" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"dv" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"dw" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber{ + dir = 1 + }, +/turf/open/floor/engine/air, +/area/lavaland/surface/outdoors) +"dx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume{ + dir = 1 + }, +/turf/open/floor/engine/air, +/area/lavaland/surface/outdoors) +"dy" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber{ + dir = 1 + }, +/turf/open/floor/engine/vacuum, +/area/lavaland/surface/outdoors) +"dz" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume{ + dir = 1 + }, +/turf/open/floor/engine/vacuum, +/area/lavaland/surface/outdoors) +"dA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"dB" = ( +/obj/structure/girder, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"dC" = ( +/obj/structure/door_assembly/door_assembly_eng, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"gA" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"gD" = ( +/obj/machinery/power/emitter{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/end, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"mO" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"oi" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"tY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"CR" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"DM" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"Ee" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"Wr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +aB +an +aB +aB +an +ab +aa +by +bQ +bQ +aO +ae +ae +ae +ae +aO +aa +"} +(3,1,1) = {" +aa +aa +aa +aj +ab +al +al +ab +ab +ab +ab +ab +ab +al +al +al +do +ae +aa +"} +(4,1,1) = {" +aa +aa +aa +aa +aa +aj +al +al +al +al +al +al +al +al +al +al +gA +ae +aa +"} +(5,1,1) = {" +aa +aa +aa +aa +aa +aa +aw +aK +bc +bc +bR +bc +bc +cC +cT +ai +Ee +aO +aa +"} +(6,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +al +cD +gA +al +al +aO +aa +"} +(7,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +bd +aa +aa +aa +af +cA +DM +dc +al +ae +aa +"} +(8,1,1) = {" +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +DM +ag +al +ae +aa +"} +(9,1,1) = {" +ab +ab +al +ap +aa +aa +aa +aa +bf +aa +aa +aa +af +af +DM +dc +dp +ae +aa +"} +(10,1,1) = {" +ab +ab +dd +ap +al +aa +aa +aa +aa +aa +bT +aa +af +ab +DM +dc +dq +ae +aa +"} +(11,1,1) = {" +ad +ai +mO +aq +ab +aa +aa +aa +aa +bA +aa +aa +af +aI +DM +dc +al +ae +aa +"} +(12,1,1) = {" +ab +ab +gA +ap +al +ab +aJ +aa +aa +aa +aa +ab +ab +cF +gA +al +al +aO +aa +"} +(13,1,1) = {" +ab +ab +am +ar +at +at +at +at +Wr +bB +bB +bB +tY +cG +gD +ai +dr +ae +aa +"} +(14,1,1) = {" +ab +ah +al +as +au +as +as +as +bg +al +al +cg +gA +al +al +al +al +ae +aa +"} +(15,1,1) = {" +ab +al +al +al +al +al +al +al +bh +bC +al +al +CR +al +al +al +ds +aO +aa +"} +(16,1,1) = {" +aO +aO +ae +ae +ae +aO +ae +aO +bi +ae +aO +ae +ae +aO +ae +aO +ae +aO +aa +"} +(17,1,1) = {" +aa +aa +aa +aa +aa +aa +ae +aL +bb +bD +aO +aa +aa +aa +aa +aa +aa +aa +aa +"} +(18,1,1) = {" +aa +aa +aa +aa +aa +aa +ae +oi +bj +ab +ae +aa +aa +aa +aa +aa +aa +aa +aa +"} +(19,1,1) = {" +af +aa +aa +aB +an +dj +ae +aP +bk +aP +ae +aB +aB +dj +aB +aB +aB +aa +aa +"} +(20,1,1) = {" +af +af +ab +aa +aa +af +aC +aQ +bl +bE +bS +cf +cr +cB +cI +ab +aB +aa +aa +"} +(21,1,1) = {" +af +ab +ab +af +af +ab +ab +ab +bj +ab +bU +ch +aB +cE +ab +cY +dj +aa +aa +"} +(22,1,1) = {" +aa +aa +af +ab +ab +ab +ab +ab +bj +ab +bV +ab +aP +cH +ab +de +dj +aa +aa +"} +(23,1,1) = {" +ab +aa +af +ab +ao +ab +ab +aR +bm +ab +bH +ci +aB +aB +aP +aB +aB +ab +aa +"} +(24,1,1) = {" +aa +af +ab +al +ab +ab +ab +aS +bn +ab +bH +ab +ab +cI +cR +aB +dj +aB +aB +"} +(25,1,1) = {" +aa +af +ab +ab +ab +ab +ab +aT +bo +ab +bW +cj +cj +cj +cS +dh +dg +du +aB +"} +(26,1,1) = {" +aa +af +af +an +an +ab +ab +ab +bp +bF +bX +bF +bF +cJ +cV +df +di +dv +dB +"} +(27,1,1) = {" +aa +aa +aa +aa +an +av +aH +av +bj +bG +bY +av +av +cK +cW +aB +dt +dA +dC +"} +(28,1,1) = {" +aa +aa +aa +aa +an +an +dj +ae +bj +bH +ae +aB +dB +dB +aB +dj +aB +aB +dj +"} +(29,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ae +bj +bI +ae +aa +aa +aa +aa +aa +aa +aa +aB +"} +(30,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ae +bq +bH +aO +aa +aa +aa +aa +aa +aa +aa +aB +"} +(31,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ae +bq +bJ +ae +ae +aO +ae +aO +aa +aa +aa +aa +"} +(32,1,1) = {" +aa +aa +aa +ae +ae +ae +ae +ae +br +bK +bZ +ck +cs +cL +aO +ae +ae +aO +aa +"} +(33,1,1) = {" +aa +aa +aa +ae +ax +aD +aM +aU +bs +bL +bZ +cl +ct +cM +cZ +dk +dw +ae +aa +"} +(34,1,1) = {" +aa +aa +aa +ae +ay +aE +aN +aV +bt +bM +ab +cm +co +cN +aN +dl +dx +ae +aa +"} +(35,1,1) = {" +aa +aa +aa +ae +ae +ae +aO +aW +bu +bN +ca +cn +cv +cO +ae +aO +aO +aO +aa +"} +(36,1,1) = {" +aa +aa +aa +ae +az +aF +aM +aX +bv +bN +cb +co +cw +cM +da +dm +dy +ae +aa +"} +(37,1,1) = {" +aa +aa +aa +ae +aA +aG +aN +aY +bw +bM +cc +cp +cx +cP +db +dn +dz +ae +aa +"} +(38,1,1) = {" +aa +aa +aa +ae +aO +aO +ae +aZ +bu +bO +cd +cd +cy +cQ +ae +aO +aO +aO +aa +"} +(39,1,1) = {" +aa +aa +aa +aa +aa +aa +ae +ba +bx +bP +ce +cq +cz +ab +ae +aa +aa +aa +aa +"} +(40,1,1) = {" +aa +aa +aa +aa +aa +aa +ae +aO +aO +ae +ae +ae +aO +ae +aO +aa +aa +aa +aa +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_hotsprings.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_hotsprings.dmm new file mode 100644 index 0000000000..ae80410427 --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_hotsprings.dmm @@ -0,0 +1,161 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/sandstone, +/area/lavaland/surface/outdoors) +"c" = ( +/turf/open/water, +/area/lavaland/surface/outdoors) +"I" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"L" = ( +/obj/structure/fluff/beach_umbrella, +/turf/open/floor/plating/beach/sand, +/area/lavaland/surface/outdoors) +"U" = ( +/turf/open/floor/plating/beach/sand, +/area/lavaland/surface/outdoors) + +(1,1,1) = {" +I +I +I +I +I +I +I +I +I +I +I +"} +(2,1,1) = {" +I +I +I +a +a +I +a +a +I +I +I +"} +(3,1,1) = {" +I +I +a +U +U +U +U +U +a +I +I +"} +(4,1,1) = {" +I +a +U +L +c +c +c +L +U +a +I +"} +(5,1,1) = {" +I +a +U +c +c +c +c +c +U +a +I +"} +(6,1,1) = {" +I +I +U +c +c +c +c +c +U +I +I +"} +(7,1,1) = {" +I +a +U +c +c +c +c +c +U +a +I +"} +(8,1,1) = {" +I +a +U +L +c +c +c +L +U +a +I +"} +(9,1,1) = {" +I +I +a +U +U +U +U +U +a +I +I +"} +(10,1,1) = {" +I +I +I +a +a +I +a +a +I +I +I +"} +(11,1,1) = {" +I +I +I +I +I +I +I +I +I +I +I +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_library.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_library.dmm new file mode 100644 index 0000000000..829761b042 --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_library.dmm @@ -0,0 +1,729 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/template_noop, +/area/template_noop) +"ab" = ( +/obj/structure/table/wood/fancy/black, +/obj/item/documents/syndicate/mining, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"ac" = ( +/turf/closed/wall/mineral/wood, +/area/ruin/unpowered/buried_library) +"ad" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ae" = ( +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"af" = ( +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"ag" = ( +/obj/item/feather, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"ah" = ( +/obj/structure/bookcase/random, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"ai" = ( +/obj/structure/table/wood/fancy/black, +/obj/item/paper/crumpled/fluff/stations/lavaland/library/diary2, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"al" = ( +/turf/closed/wall/mineral/iron, +/area/ruin/unpowered/buried_library) +"am" = ( +/obj/structure/table/wood/fancy/black, +/obj/item/book_of_babel, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"ao" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"ap" = ( +/obj/item/stack/sheet/mineral/wood, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"aq" = ( +/obj/structure/bookcase/random, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"ar" = ( +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"as" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/fluff/ruins/oldstation/protosing, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"aw" = ( +/turf/open/floor/plating, +/area/ruin/unpowered/buried_library) +"ay" = ( +/obj/machinery/door/keycard/library, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"az" = ( +/obj/item/paper/crumpled/fluff/stations/lavaland/library/diary, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"aA" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/unpowered/buried_library) +"aC" = ( +/obj/item/feather, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"aD" = ( +/turf/open/floor/carpet/black, +/area/ruin/unpowered/buried_library) +"aE" = ( +/obj/item/stack/sheet/mineral/wood, +/obj/item/book/manual/random, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"aF" = ( +/obj/item/book/manual/random, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"aG" = ( +/obj/structure/table/bronze, +/obj/item/stack/ore/slag, +/turf/open/floor/carpet/black, +/area/ruin/unpowered/buried_library) +"aH" = ( +/obj/structure/table/bronze, +/obj/item/statuebust, +/turf/open/floor/carpet/black, +/area/ruin/unpowered/buried_library) +"aI" = ( +/obj/effect/mob_spawn/human/skeleton, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"aJ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"aK" = ( +/obj/item/feather, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"aL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/paper/stack, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"aM" = ( +/obj/item/stack/sheet/mineral/wood, +/obj/item/book/manual/random, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"aN" = ( +/obj/structure/statue/sandstone/venus, +/turf/open/floor/carpet/black, +/area/ruin/unpowered/buried_library) +"aP" = ( +/obj/item/keycard/library, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"aQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_autopsy, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"aR" = ( +/obj/structure/fluff/paper/stack, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"aS" = ( +/obj/structure/table/wood/fancy/black, +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/secretrecipe, +/obj/item/flashlight/lantern/jade{ + on = 1 + }, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"aV" = ( +/obj/item/stack/sheet/mineral/wood, +/obj/structure/fluff/paper/stack, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"aW" = ( +/obj/structure/fluff/paper/stack, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"aX" = ( +/obj/structure/table/bronze, +/obj/item/statuebust, +/turf/open/floor/plating, +/area/ruin/unpowered/buried_library) +"aY" = ( +/obj/structure/table_frame/wood, +/turf/open/floor/plating, +/area/ruin/unpowered/buried_library) +"ba" = ( +/obj/structure/barricade/wooden/crude, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"bg" = ( +/obj/item/paper/fluff/ruins/oldstation/protogun, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"bh" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/pet/fox, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"bi" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"bj" = ( +/obj/item/book/manual/random, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"bl" = ( +/obj/item/storage/box/fountainpens, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"bm" = ( +/obj/structure/fluff/paper/stack, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"bn" = ( +/obj/item/book/manual/random, +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"bo" = ( +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"bp" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"bq" = ( +/obj/structure/mineral_door/wood, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"br" = ( +/obj/structure/girder, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"bt" = ( +/obj/effect/decal/cleanable/dirt, +/turf/template_noop, +/area/template_noop) +"bu" = ( +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bw" = ( +/turf/open/floor/wood, +/area/lavaland/surface/outdoors) +"by" = ( +/obj/item/statuebust, +/turf/open/floor/carpet/black, +/area/ruin/unpowered/buried_library) +"bz" = ( +/obj/item/flashlight/lantern/jade{ + on = 1 + }, +/turf/open/floor/plating, +/area/ruin/unpowered/buried_library) +"bA" = ( +/obj/structure/fluff/paper/stack, +/turf/open/floor/plating, +/area/ruin/unpowered/buried_library) +"bB" = ( +/obj/structure/fluff/paper/stack, +/turf/open/floor/carpet/black, +/area/ruin/unpowered/buried_library) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ad +ad +ad +ad +ad +bt +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +bi +bi +bi +bi +bi +ac +ba +ac +ac +ac +ad +ad +aa +"} +(3,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +bi +bi +bi +bi +bo +bi +bi +bi +bm +ae +af +ae +ac +ad +ad +aa +"} +(4,1,1) = {" +aa +aa +aa +aa +aa +aa +bi +bi +aR +bi +bi +ae +bj +aq +bi +ah +aL +ah +ao +ac +ad +aa +aa +"} +(5,1,1) = {" +aa +aa +aa +aa +aa +bi +bi +bi +aC +ae +aQ +ah +bi +aq +bg +ah +ao +ah +bi +ac +ad +ad +aa +"} +(6,1,1) = {" +aa +aa +aa +aa +ad +ac +bi +ae +bi +aM +ae +ah +bm +aq +aA +ah +ao +ah +ae +ac +ad +ad +ad +"} +(7,1,1) = {" +aa +aa +aa +aa +ad +ac +bi +bm +bi +ao +aR +ao +aA +ao +ag +ah +aR +ah +bh +ac +ad +ad +ad +"} +(8,1,1) = {" +aa +aa +aa +aa +ad +bi +bi +aq +aA +bi +aG +aD +aX +bi +ao +ae +ao +ah +ae +ac +br +ad +ad +"} +(9,1,1) = {" +aa +aa +aa +aa +ad +ac +as +aq +aF +aD +aD +bz +aD +bB +bi +ae +ao +ae +ao +ac +bp +bw +ad +"} +(10,1,1) = {" +aa +aa +aa +ad +ad +ac +ap +bp +bi +aD +aD +aN +bi +aw +bi +ao +af +aR +ae +bq +ae +bu +ad +"} +(11,1,1) = {" +aa +al +al +al +al +al +ae +ah +aR +aD +bi +aD +aD +by +ao +aw +ao +ae +bm +ac +ae +ad +ad +"} +(12,1,1) = {" +ad +al +ab +aI +ar +al +aR +aE +af +aD +aH +bA +aY +aD +bi +ae +bm +aq +ag +br +ac +ad +ad +"} +(13,1,1) = {" +ad +al +am +aJ +aW +ay +ae +ah +ao +ae +ao +ae +af +bp +bi +aq +bi +aq +bp +ac +ad +ad +ad +"} +(14,1,1) = {" +ad +al +aS +aW +aK +al +ae +ah +bi +ah +ao +ah +az +aq +bi +aq +bi +bn +ao +ac +ad +aa +aa +"} +(15,1,1) = {" +ad +al +al +ai +ar +al +ag +ah +aL +ah +aA +ah +ao +aq +bi +bi +bl +bi +bi +bi +ad +aa +aa +"} +(16,1,1) = {" +ad +ad +al +al +al +al +ao +ah +ao +ah +ao +aV +bi +aq +bp +bi +bm +bo +bi +br +bu +aa +aa +"} +(17,1,1) = {" +aa +ad +ad +ad +ad +ac +ae +ao +ae +aP +ae +aR +ae +bp +bi +bj +bi +ad +ad +ad +aa +aa +aa +"} +(18,1,1) = {" +aa +aa +aa +aa +ad +ac +ac +ac +ac +ac +ac +ba +ac +ac +br +ad +aa +ad +aa +aa +aa +aa +aa +"} +(19,1,1) = {" +aa +aa +aa +aa +aa +ad +ad +ad +ad +ad +ad +aa +ad +ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_lust.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_lust.dmm new file mode 100644 index 0000000000..d341e39c29 --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_lust.dmm @@ -0,0 +1,170 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"b" = ( +/obj/structure/sign/poster/contraband/lusty_xenomorph, +/turf/closed/wall/mineral/abductor, +/area/lavaland/surface) +"c" = ( +/turf/open/floor/mineral/diamond, +/area/lavaland/surface) +"d" = ( +/obj/item/reagent_containers/food/drinks/trophy/gold_cup, +/turf/open/floor/mineral/diamond, +/area/lavaland/surface) +"e" = ( +/obj/item/greentext{ + light_color = "#64C864"; + light_range = 1 + }, +/turf/open/floor/mineral/diamond, +/area/lavaland/surface) +"f" = ( +/obj/item/tcg_card/special/xenomaid, +/turf/open/floor/mineral/diamond, +/area/lavaland/surface) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +"} +(3,1,1) = {" +a +a +a +a +b +b +b +a +a +a +a +"} +(4,1,1) = {" +a +a +a +b +f +c +c +b +a +a +a +"} +(5,1,1) = {" +a +a +b +c +c +d +c +c +b +a +a +"} +(6,1,1) = {" +a +a +b +c +d +e +d +c +b +a +a +"} +(7,1,1) = {" +a +a +b +c +c +d +c +c +b +a +a +"} +(8,1,1) = {" +a +a +a +b +c +c +c +b +a +a +a +"} +(9,1,1) = {" +a +a +a +a +b +b +b +a +a +a +a +"} +(10,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +"} +(11,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_mining_site.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_mining_site.dmm new file mode 100644 index 0000000000..dfe6a1b335 --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_mining_site.dmm @@ -0,0 +1,886 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"b" = ( +/turf/closed/wall/mineral/wood/nonmetal, +/area/ruin/unpowered) +"c" = ( +/obj/structure/closet/toolcloset, +/obj/item/wrench, +/obj/item/screwdriver, +/obj/item/crowbar, +/obj/item/weldingtool/largetank, +/obj/item/wirecutters, +/obj/item/radio/off, +/turf/open/floor/wood, +/area/ruin/unpowered) +"d" = ( +/turf/open/openspace/icemoon, +/area/template_noop) +"e" = ( +/obj/item/clothing/suit/hooded/explorer, +/obj/item/clothing/mask/gas/explorer, +/obj/item/clothing/gloves/color/black, +/obj/item/storage/backpack/explorer, +/obj/item/flashlight/lantern, +/obj/item/storage/bag/ore, +/obj/structure/closet, +/obj/item/clothing/shoes/jackboots, +/turf/open/floor/wood, +/area/ruin/unpowered) +"f" = ( +/turf/open/floor/wood, +/area/ruin/unpowered) +"g" = ( +/obj/structure/fireplace, +/turf/open/floor/wood, +/area/ruin/unpowered) +"h" = ( +/obj/structure/flora/ash/cacti, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"i" = ( +/turf/template_noop, +/area/template_noop) +"j" = ( +/obj/structure/sink/kitchen, +/turf/open/floor/wood, +/area/ruin/unpowered) +"k" = ( +/obj/structure/closet/crate/freezer, +/turf/open/floor/wood, +/area/ruin/unpowered) +"l" = ( +/obj/machinery/vending/dinnerware, +/turf/open/floor/wood, +/area/ruin/unpowered) +"m" = ( +/obj/structure/mineral_door/wood, +/obj/effect/decal/cleanable/trail_holder, +/turf/open/floor/wood, +/area/ruin/unpowered) +"n" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"o" = ( +/obj/item/reagent_containers/food/drinks/beer, +/turf/open/floor/wood, +/area/ruin/unpowered) +"p" = ( +/obj/machinery/light/broken{ + dir = 4 + }, +/obj/effect/decal/cleanable/trail_holder, +/turf/open/floor/wood, +/area/ruin/unpowered) +"q" = ( +/obj/structure/table/wood, +/obj/item/pen, +/obj/machinery/light/broken{ + dir = 8 + }, +/obj/item/paper/crumpled/bloody{ + info = "help..."; + text = "" + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"r" = ( +/obj/item/chair/wood, +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/decal/cleanable/blood/drip, +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/guidance{ + dir = 8 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"s" = ( +/obj/effect/decal/cleanable/trail_holder, +/turf/open/floor/wood, +/area/ruin/unpowered) +"N" = ( +/obj/effect/decal/cleanable/trail_holder, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) + +(1,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +"} +(2,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +"} +(3,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +"} +(4,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +"} +(5,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +"} +(6,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +"} +(7,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +"} +(8,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +"} +(9,1,1) = {" +i +i +i +i +i +i +i +i +d +b +b +b +b +b +b +b +i +i +i +i +i +i +i +i +i +"} +(10,1,1) = {" +i +i +i +i +i +i +i +i +b +b +b +b +b +b +b +b +b +i +i +i +i +i +i +i +i +"} +(11,1,1) = {" +i +i +i +i +i +i +i +i +b +b +c +f +f +o +q +b +b +i +i +i +i +i +i +i +i +"} +(12,1,1) = {" +i +i +i +i +i +i +i +i +b +b +e +f +f +f +r +b +b +i +i +i +i +i +i +i +i +"} +(13,1,1) = {" +i +i +i +i +i +i +i +i +b +b +f +f +f +f +s +b +b +i +i +i +i +i +i +i +i +"} +(14,1,1) = {" +i +i +i +i +i +i +i +i +b +b +g +f +f +f +s +b +b +i +i +i +i +i +i +i +i +"} +(15,1,1) = {" +i +i +i +i +i +i +i +i +b +b +f +f +f +f +s +b +b +i +i +i +i +i +i +i +i +"} +(16,1,1) = {" +i +i +i +i +i +i +i +i +b +b +j +f +f +f +s +b +b +i +i +i +i +i +i +i +i +"} +(17,1,1) = {" +i +i +i +i +i +i +i +i +b +b +k +f +f +f +s +b +b +i +i +i +i +i +i +i +i +"} +(18,1,1) = {" +i +i +i +i +i +i +i +i +b +b +l +f +f +s +s +b +b +i +i +i +i +i +i +i +i +"} +(19,1,1) = {" +i +i +i +i +i +i +i +i +b +b +b +f +s +p +b +b +b +i +i +i +i +i +i +i +i +"} +(20,1,1) = {" +i +i +i +i +i +i +i +i +i +b +b +b +s +b +b +b +i +i +i +i +i +i +i +i +i +"} +(21,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +b +s +b +i +i +i +i +i +i +i +i +i +i +i +"} +(22,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +b +s +b +i +i +i +i +i +i +i +i +i +i +i +"} +(23,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +b +s +b +i +i +i +i +i +i +i +i +i +i +i +"} +(24,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +b +m +b +i +i +i +i +i +i +i +i +i +i +i +"} +(25,1,1) = {" +i +i +i +i +i +i +i +i +i +i +n +h +N +h +n +i +i +i +i +i +i +i +i +i +i +"} +(26,1,1) = {" +i +i +i +i +i +i +i +i +i +n +n +n +h +n +n +n +i +i +i +i +i +i +i +i +i +"} +(27,1,1) = {" +i +i +i +i +i +i +i +i +n +n +n +n +n +n +n +n +n +i +i +i +i +i +i +i +i +"} +(28,1,1) = {" +i +i +i +i +i +i +i +n +n +n +n +n +n +n +n +n +n +n +i +i +i +i +i +i +i +"} +(29,1,1) = {" +i +i +i +i +i +i +i +n +n +n +n +n +n +n +n +n +n +n +i +i +i +i +i +i +i +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_wrath.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_wrath.dmm new file mode 100644 index 0000000000..506e689372 --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_wrath.dmm @@ -0,0 +1,270 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface) +"b" = ( +/turf/closed/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"e" = ( +/obj/structure/spawner/nether, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface) +"q" = ( +/turf/closed/mineral/strong/wasteland, +/area/lavaland/surface/outdoors) + +(1,1,1) = {" +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +"} +(2,1,1) = {" +b +b +b +b +q +q +q +q +q +q +q +b +b +b +b +"} +(3,1,1) = {" +b +b +q +q +q +a +a +a +a +a +q +q +q +b +b +"} +(4,1,1) = {" +b +b +q +a +a +a +a +a +a +a +a +a +q +b +b +"} +(5,1,1) = {" +b +q +q +a +a +a +a +a +a +a +a +a +q +q +b +"} +(6,1,1) = {" +b +q +a +a +a +a +a +a +a +a +a +a +a +q +b +"} +(7,1,1) = {" +b +q +a +a +a +a +a +a +a +a +a +a +a +q +b +"} +(8,1,1) = {" +b +q +a +a +a +a +a +e +a +a +a +a +a +q +b +"} +(9,1,1) = {" +b +q +a +a +a +a +a +a +a +a +a +a +a +q +b +"} +(10,1,1) = {" +b +q +a +a +a +a +a +a +a +a +a +a +a +q +b +"} +(11,1,1) = {" +b +q +q +a +a +a +a +a +a +a +a +a +q +q +b +"} +(12,1,1) = {" +b +b +q +a +a +a +a +a +a +a +a +a +q +b +b +"} +(13,1,1) = {" +b +b +q +q +q +a +a +a +a +a +q +q +q +b +b +"} +(14,1,1) = {" +b +b +b +b +q +q +q +q +q +q +q +b +b +b +b +"} +(15,1,1) = {" +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +"} diff --git a/_maps/RandomZLevels/away_mission/SnowCabin.dmm b/_maps/RandomZLevels/away_mission/SnowCabin.dmm index dda382c4b7..e7f5341bea 100644 --- a/_maps/RandomZLevels/away_mission/SnowCabin.dmm +++ b/_maps/RandomZLevels/away_mission/SnowCabin.dmm @@ -4408,7 +4408,7 @@ /area/awaymission/cabin/caves) "lr" = ( /obj/effect/decal/cleanable/blood/old, -/obj/item/kitchen/knife/carrotshiv, +/obj/item/kitchen/knife/shiv/carrot, /obj/effect/decal/cleanable/glitter/blue{ desc = "It looks like fancy glitter to me."; name = "icy wind" diff --git a/_maps/RandomZLevels/away_mission/TheBeach.dmm b/_maps/RandomZLevels/away_mission/TheBeach.dmm index 6877eb4b35..2c65f2dd8a 100644 --- a/_maps/RandomZLevels/away_mission/TheBeach.dmm +++ b/_maps/RandomZLevels/away_mission/TheBeach.dmm @@ -272,7 +272,7 @@ /obj/structure/mirror{ pixel_y = 28 }, -/turf/open/floor/wood, +/turf/open/floor/wood/wood_diagonal, /area/awaymission/beach) "bd" = ( /turf/open/floor/wood, @@ -312,7 +312,7 @@ pixel_x = 24; specialfunctions = 4 }, -/turf/open/floor/wood, +/turf/open/floor/wood/wood_diagonal, /area/awaymission/beach) "bj" = ( /obj/machinery/button/door{ @@ -322,7 +322,7 @@ pixel_x = -24; specialfunctions = 4 }, -/turf/open/floor/wood, +/turf/open/floor/wood/wood_diagonal, /area/awaymission/beach) "bk" = ( /obj/structure/closet/secure_closet/personal/cabinet, @@ -392,14 +392,14 @@ id_tag = "changlinhut2"; name = "changing room" }, -/turf/open/floor/wood, +/turf/open/floor/wood/wood_diagonal, /area/awaymission/beach) "bt" = ( /obj/machinery/door/airlock/sandstone{ id_tag = "changlinhut1"; name = "changing room" }, -/turf/open/floor/wood, +/turf/open/floor/wood/wood_diagonal, /area/awaymission/beach) "bu" = ( /obj/item/reagent_containers/food/drinks/bottle/wine, @@ -477,9 +477,9 @@ /turf/open/floor/plating/beach/sand, /area/awaymission/beach) "bF" = ( -/obj/structure/bedsheetbin, /obj/effect/turf_decal/sand, /obj/structure/table/wood, +/obj/structure/bedsheetbin/towel, /turf/open/floor/plating/beach/sand, /area/awaymission/beach) "bG" = ( @@ -773,7 +773,7 @@ /area/awaymission/beach) "cv" = ( /obj/effect/turf_decal/stripes/white/corner{ - dir = 4 + dir = 1 }, /turf/open/floor/plating/beach/sand, /area/awaymission/beach) @@ -1001,6 +1001,30 @@ /obj/item/clothing/glasses/heat, /turf/open/floor/plating/beach/sand, /area/awaymission/beach) +"iv" = ( +/obj/structure/dresser{ + density = 0; + pixel_y = 18 + }, +/turf/open/floor/wood/wood_diagonal, +/area/awaymission/beach) +"kr" = ( +/turf/open/floor/wood/wood_diagonal, +/area/awaymission/beach) +"np" = ( +/obj/machinery/shower{ + dir = 8 + }, +/obj/effect/turf_decal/sand, +/turf/open/floor/plasteel/white, +/area/awaymission/beach) +"Vi" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/effect/turf_decal/sand, +/turf/open/floor/plasteel/white, +/area/awaymission/beach) (1,1,1) = {" aa @@ -7572,8 +7596,8 @@ ak ak ak aX -bb -bd +iv +kr aX ak ba @@ -7892,10 +7916,10 @@ ak ak ak ak -ak -ak -ak -ak +Vi +Vi +Vi +Vi ak ba ba @@ -8213,10 +8237,10 @@ ak ak ak ak -ak -ak -ak -ak +np +np +np +np ak ba ba @@ -8428,7 +8452,7 @@ aJ aE ak aX -bb +iv bj bt ba @@ -8536,7 +8560,7 @@ ak aS aX bc -bd +kr aX ak ba @@ -9076,7 +9100,7 @@ ak ak ba ba -ak +bF ak ak ak diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 086cc9ffd6..ea760cd55a 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -68,118 +68,123 @@ "aai" = ( /turf/closed/wall/r_wall, /area/security/prison) -"aaj" = ( -/obj/structure/cable{ - icon_state = "1-4" +"aam" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 }, /turf/open/floor/plasteel, -/area/security/prison) -"aam" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/security/prison) +/area/security/prison/upper) "aan" = ( -/obj/machinery/hydroponics/soil, -/obj/item/seeds/ambrosia, -/obj/machinery/newscaster{ - pixel_y = 32 - }, -/turf/open/floor/grass, -/area/security/prison) -"aao" = ( -/obj/machinery/hydroponics/soil, -/obj/item/plant_analyzer, -/obj/structure/sign/warning/electricshock{ - pixel_y = 32 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/grass, -/area/security/prison) -"aap" = ( -/obj/machinery/hydroponics/soil, -/obj/item/seeds/carrot, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/grass, -/area/security/prison) -"aaq" = ( -/obj/machinery/camera{ - c_tag = "Prison Common Room"; - network = list("ss13","prison") +/obj/structure/closet/crate/bin, +/obj/effect/spawner/lootdrop/prison_contraband, +/obj/item/trash/sosjerky, +/obj/item/trash/boritos, +/obj/item/trash/can, +/obj/effect/turf_decal/tile/green{ + dir = 8 }, +/obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ dir = 1 }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/radio/intercom{ + desc = "Talk through this. It looks like it has been modified to not broadcast."; + name = "Prison Intercom (General)"; + pixel_x = -27; + pixel_y = -27; + prison_radio = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"aao" = ( /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"aap" = ( /obj/effect/turf_decal/tile/green{ dir = 8 }, -/obj/structure/sink{ - pixel_y = 20 - }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/turf_decal/tile/green{ + dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, -/area/security/prison) -"aar" = ( -/obj/machinery/hydroponics/soil, -/obj/item/seeds/glowshroom, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/grass, -/area/security/prison) -"aas" = ( -/obj/structure/sign/warning/electricshock{ - pixel_y = 32 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/security/prison) +/area/security/prison/upper) "aat" = ( -/turf/open/floor/plasteel, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, /area/security/prison) "aau" = ( -/obj/machinery/biogenerator, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, /turf/open/floor/plasteel, -/area/security/prison) +/area/security/prison/upper) "aav" = ( /obj/structure/cable{ icon_state = "1-2" }, /turf/open/floor/plasteel, /area/security/prison) -"aaw" = ( -/obj/machinery/light{ +"aax" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"aay" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ dir = 8 }, -/turf/open/floor/grass, -/area/security/prison) -"aax" = ( -/mob/living/simple_animal/mouse/brown/Tom, -/turf/open/floor/grass, -/area/security/prison) -"aay" = ( -/turf/open/floor/plating, -/area/security/prison) +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison/cells) "aaz" = ( /obj/machinery/disposal/bin, /obj/structure/sign/plaques/deempisi{ @@ -207,29 +212,109 @@ /turf/open/floor/plasteel, /area/service/bar) "aaA" = ( -/obj/machinery/seed_extractor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, -/area/security/prison) -"aaB" = ( -/obj/structure/window/reinforced, -/obj/machinery/hydroponics/soil, -/obj/item/seeds/potato, -/turf/open/floor/grass, -/area/security/prison) +/area/security/prison/upper) "aaC" = ( -/obj/machinery/hydroponics/soil, -/obj/structure/window/reinforced, -/obj/item/seeds/tower, -/turf/open/floor/grass, -/area/security/prison) +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/machinery/holopad, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/decal/cleanable/blood/old, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/prison/upper) "aaD" = ( -/obj/structure/window/reinforced, -/obj/machinery/hydroponics/soil, -/obj/item/seeds/grass, -/turf/open/floor/grass, -/area/security/prison) +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/security/prison/upper) "aaE" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Prison Cafeteria" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) +"aaF" = ( /obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"aaG" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) +"aaH" = ( +/turf/open/floor/plating/airless, +/area/space/nearstation) +"aaI" = ( +/obj/machinery/washing_machine, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) +"aaK" = ( /obj/effect/turf_decal/tile/green{ dir = 4 }, @@ -239,40 +324,12 @@ /obj/effect/turf_decal/tile/green{ dir = 1 }, -/turf/open/floor/plasteel, -/area/security/prison) -"aaF" = ( -/obj/structure/window/reinforced, -/obj/machinery/hydroponics/soil, -/obj/item/cultivator, -/turf/open/floor/grass, -/area/security/prison) -"aaG" = ( -/obj/machinery/light{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/vr_sleeper{ - dir = 8 - }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, -/area/security/prison) -"aaH" = ( -/turf/open/floor/plating/airless, -/area/space/nearstation) -"aaI" = ( -/obj/structure/bookcase, -/turf/open/floor/plasteel, -/area/security/prison) -"aaJ" = ( -/obj/structure/chair/stool, -/turf/open/floor/plasteel, -/area/security/prison) -"aaK" = ( -/obj/machinery/computer/arcade/battle{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) +/area/security/prison/upper) "aaL" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -300,9 +357,9 @@ /turf/open/floor/plating, /area/command/heads_quarters/hos) "aaN" = ( -/obj/structure/chair/sofa/right, -/turf/open/floor/plasteel, -/area/security/prison) +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/security/prison/upper) "aaO" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -314,25 +371,17 @@ /turf/open/floor/plating, /area/command/heads_quarters/hos) "aaP" = ( -/obj/machinery/computer/cryopod{ - dir = 8; - pixel_x = 26 - }, -/obj/machinery/cryopod{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/prison) +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) "aaQ" = ( /turf/closed/wall, /area/security/warden) "aaR" = ( -/obj/structure/lattice, -/obj/structure/sign/warning/securearea{ - pixel_y = -32 - }, -/turf/open/space, -/area/space/nearstation) +/obj/structure/table/reinforced, +/turf/open/floor/plasteel, +/area/security/prison/upper) "aaS" = ( /obj/structure/grille, /obj/structure/lattice, @@ -344,31 +393,41 @@ /turf/open/space, /area/space/nearstation) "aaU" = ( -/obj/machinery/computer/arcade/orion_trail{ +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/turf/open/floor/plasteel, -/area/security/prison) -"aaV" = ( -/obj/structure/table/wood, -/obj/item/storage/dice, -/turf/open/floor/plasteel, -/area/security/prison) -"aaW" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/chair/comfy/brown{ - color = "#596479"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aaX" = ( -/obj/structure/window/reinforced, -/obj/machinery/cryopod{ +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/security/glass{ + id_tag = "permaouter"; + name = "Permabrig Transfer"; + req_access_txt = "2" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, /area/security/prison) +"aaV" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/closed/wall, +/area/security/prison/upper) +"aaW" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/security/prison/upper) "aaY" = ( /obj/effect/turf_decal/bot, /obj/structure/closet/crate/secure/weapon{ @@ -408,11 +467,21 @@ /turf/open/space, /area/space/nearstation) "abb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 +/obj/effect/turf_decal/tile/red{ + dir = 4 }, -/turf/closed/wall, -/area/security/execution/transfer) +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison/cells) "abc" = ( /turf/closed/wall, /area/security/execution/transfer) @@ -429,31 +498,82 @@ /turf/closed/wall, /area/security/execution/transfer) "abf" = ( -/obj/machinery/vending/sustenance, -/turf/open/floor/plasteel, -/area/security/prison) -"abg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 }, -/turf/closed/wall, -/area/security/execution/transfer) -"abh" = ( -/obj/machinery/holopad, -/turf/open/floor/plasteel, -/area/security/prison) -"abi" = ( -/obj/machinery/shower{ +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/item/soap/nanotrasen, -/turf/open/floor/plasteel/freezer, -/area/security/prison) +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/grunge{ + name = "Prison Laundry"; + wiretypepath = /datum/wires/airlock/security + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) +"abg" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) +"abh" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/decal/cleanable/blood/old, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"abi" = ( +/obj/machinery/button/flasher{ + id = "visitorflash"; + pixel_x = -6; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/button/door{ + id = "visitation"; + name = "Visitation Shutters"; + pixel_x = -6; + pixel_y = 36; + req_access_txt = "2" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) "abj" = ( -/obj/structure/bedsheetbin/color, -/obj/structure/table, -/turf/open/floor/plasteel/freezer, -/area/security/prison) +/obj/structure/chair/office{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) "abk" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -496,22 +616,18 @@ }, /turf/open/floor/plasteel/dark, /area/command/heads_quarters/hos) -"abs" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/machinery/power/tracker, -/turf/open/floor/plasteel/airless/solarpanel, -/area/solars/port/fore) "abt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/effect/turf_decal/tile/red, +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) +/turf/open/floor/plasteel, +/area/security/prison/cells) "abu" = ( /obj/machinery/door/poddoor{ id = "executionspaceblast" @@ -519,27 +635,23 @@ /turf/open/floor/plating, /area/security/execution/transfer) "abv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 +/obj/machinery/camera{ + c_tag = "Prison Cell Block East"; + dir = 8; + network = list("ss13","prison") }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) -"abw" = ( -/obj/machinery/light/small{ - dir = 1 +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 }, -/obj/machinery/flasher{ - id = "executionflash"; - pixel_y = 25 +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) +/turf/open/floor/plasteel, +/area/security/prison/cells) "abx" = ( /obj/machinery/camera/motion{ c_tag = "Armory External Motion Sensor"; @@ -548,10 +660,6 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/ai_monitored/security/armory) -"aby" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/security/execution/transfer) "abz" = ( /obj/machinery/light/small{ dir = 4; @@ -560,43 +668,35 @@ /turf/open/floor/engine, /area/science/xenobiology) "abA" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "2-4" }, -/turf/open/floor/plasteel, -/area/security/prison) -"abB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 +/obj/structure/cable{ + icon_state = "0-2" }, -/turf/open/floor/plasteel, -/area/security/prison) -"abC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Prison Gate"; + name = "Prison Lockdown Shutters" }, -/turf/open/floor/plasteel, -/area/security/prison) -"abD" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/security/prison) "abE" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/chair/stool, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 }, /turf/open/floor/plasteel, -/area/security/prison) +/area/security/prison/upper) "abF" = ( -/turf/open/floor/plasteel/freezer, -/area/security/prison) +/obj/structure/table, +/obj/item/flashlight/lamp, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) "abG" = ( /obj/structure/lattice/catwalk, /turf/open/space/basic, @@ -633,43 +733,27 @@ /turf/open/floor/plasteel/dark, /area/security/office) "abK" = ( -/obj/structure/chair/stool, -/obj/machinery/light/small{ - dir = 1 +/obj/structure/window/reinforced{ + dir = 8 }, -/obj/machinery/button/door{ - id = "permabolt3"; - name = "Cell Bolt Control"; - normaldoorcontrol = 1; - pixel_y = 25; - specialfunctions = 4 +/obj/structure/chair{ + dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel, /area/security/prison) "abL" = ( /obj/structure/chair/stool, -/obj/machinery/light/small{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/machinery/button/door{ - id = "permabolt2"; - name = "Cell Bolt Control"; - normaldoorcontrol = 1; - pixel_y = 25; - specialfunctions = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, /turf/open/floor/plasteel, -/area/security/prison) -"abM" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/prison) +/area/security/prison/upper) "abN" = ( /obj/effect/landmark/secequipment, /obj/effect/turf_decal/tile/red{ @@ -731,7 +815,7 @@ }, /obj/machinery/firealarm{ dir = 4; - pixel_x = -26 + pixel_x = -24 }, /turf/open/floor/plasteel/showroomfloor, /area/security/office) @@ -757,13 +841,6 @@ /obj/structure/grille, /turf/open/space, /area/space/nearstation) -"abZ" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/solars/port/fore) "aca" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -788,52 +865,52 @@ /turf/closed/wall, /area/security/prison) "ace" = ( -/obj/machinery/door/poddoor/preopen{ - id = "permacell3"; - name = "cell blast door" +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 }, -/obj/machinery/door/airlock/public/glass{ - id_tag = "permabolt3"; - name = "Cell 3" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plasteel, -/area/security/prison) -"acf" = ( -/obj/machinery/door/poddoor/preopen{ - id = "permacell2"; - name = "cell blast door" - }, -/obj/machinery/door/airlock/public/glass{ - id_tag = "permabolt2"; - name = "Cell 2" +/obj/structure/cable{ + icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, /area/security/prison) "acg" = ( +/obj/machinery/door/poddoor/shutters{ + id = "visitation"; + name = "Visitation Shutters" + }, +/obj/machinery/door/window/southleft, +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) +"ach" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/door/poddoor/preopen{ - id = "permacell1"; - name = "cell blast door" +/obj/machinery/camera{ + c_tag = "Prison Visitation"; + dir = 8; + network = list("ss13","prison") }, -/obj/machinery/door/airlock/public/glass{ - id_tag = "permabolt1"; - name = "Cell 1" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plasteel, -/area/security/prison) -"ach" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restroom" - }, -/turf/open/floor/plasteel/freezer, -/area/security/prison) +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) "aci" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/cable{ @@ -949,10 +1026,12 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) "acp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/structure/cable{ icon_state = "2-4" }, @@ -1038,64 +1117,64 @@ /obj/item/stack/cable_coil/random, /turf/open/space, /area/space/nearstation) -"acz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) "acA" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on, -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) -"acB" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) -"acC" = ( -/obj/structure/bed, -/obj/machinery/camera{ - c_tag = "Prison Cell 3"; - network = list("ss13","prison") +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/obj/item/radio/intercom{ - desc = "Talk through this. It looks like it has been modified to not broadcast."; - name = "Prison Intercom (General)"; - pixel_y = 24; - prison_radio = 1 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"acD" = ( -/obj/structure/chair/stool, -/obj/machinery/light/small{ +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/effect/landmark/start/prisoner, /obj/machinery/button/door{ - id = "permabolt1"; - name = "Cell Bolt Control"; - normaldoorcontrol = 1; - pixel_y = 25; - specialfunctions = 4 + id = "permacells1"; + name = "Privacy Shutters"; + pixel_x = 25 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) +"acC" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, /area/security/prison) -"acE" = ( -/obj/structure/bed, -/obj/machinery/camera{ - c_tag = "Prison Cell 2"; - network = list("ss13","prison") +"acD" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "Prison Gate"; + name = "prison blast door" }, -/obj/item/radio/intercom{ - desc = "Talk through this. It looks like it has been modified to not broadcast."; - name = "Prison Intercom (General)"; - pixel_y = 24; - prison_radio = 1 +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Prison Gate"; + name = "Prison Lockdown Shutters" + }, +/turf/open/floor/plating, +/area/security/prison/upper) +"acE" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" }, /turf/open/floor/plasteel, /area/security/prison) @@ -1110,37 +1189,25 @@ /turf/open/floor/plasteel/dark, /area/command/heads_quarters/hos) "acG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/security/prison) +/turf/closed/wall, +/area/security/prison/upper) "acH" = ( -/obj/structure/bed, -/obj/machinery/camera{ - c_tag = "Prison Cell 1"; - network = list("ss13","prison") +/obj/structure/window/reinforced/tinted{ + dir = 8 }, -/obj/item/radio/intercom{ - desc = "Talk through this. It looks like it has been modified to not broadcast."; - name = "Prison Intercom (General)"; - pixel_y = 24; - prison_radio = 1 +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 }, -/turf/open/floor/plasteel, -/area/security/prison) -"acI" = ( -/obj/machinery/door/poddoor/preopen{ - id = "executionfireblast" +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/general/hidden, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/westright{ - dir = 1; - name = "Transfer Room"; - req_access_txt = "2" - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/blue{ dir = 1 }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"acI" = ( +/obj/effect/spawner/lootdrop/prison_contraband, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -1148,28 +1215,34 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/bed, +/obj/item/bedsheet/red, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel/dark, -/area/security/execution/transfer) +/area/security/prison/cells) "acJ" = ( +/obj/structure/chair/stool, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"acK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, -/area/security/prison) -"acK" = ( -/obj/structure/mirror{ - pixel_x = 25 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/turf/open/floor/plasteel/freezer, -/area/security/prison) +/area/security/prison/upper) "acL" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, @@ -1178,7 +1251,7 @@ }, /obj/machinery/firealarm{ dir = 8; - pixel_x = 28 + pixel_x = 24 }, /turf/open/floor/plasteel/dark, /area/command/heads_quarters/hos) @@ -1256,16 +1329,6 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/maintenance/fore/secondary) -"acV" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/solars/port/fore) "acW" = ( /obj/structure/cable{ icon_state = "0-2" @@ -1276,77 +1339,74 @@ }, /turf/open/floor/plasteel/airless/solarpanel, /area/solars/port/fore) -"acX" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/poddoor/preopen{ - id = "executionfireblast" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/security/execution/transfer) "acY" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, /obj/structure/table, -/obj/item/paper, -/obj/item/pen, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/security/prison) -"acZ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "executionfireblast" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/security/execution/transfer) "ada" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/machinery/flasher{ - id = "PCell 3"; - pixel_x = -28 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 }, -/turf/open/floor/plasteel, -/area/security/prison) -"adb" = ( -/obj/structure/table, -/obj/item/paper, -/obj/item/pen, -/turf/open/floor/plasteel, -/area/security/prison) -"adc" = ( -/obj/machinery/flasher{ - id = "PCell 1"; - pixel_x = -28 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"add" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/machinery/flasher{ - id = "PCell 2"; - pixel_x = -28 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"ade" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"adb" = ( +/turf/open/floor/plasteel, +/area/security/prison/upper) +"adc" = ( +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"add" = ( +/obj/structure/table, +/obj/item/clothing/shoes/sneakers/orange{ + pixel_x = -6; + pixel_y = 10 + }, +/obj/item/clothing/shoes/sneakers/orange{ + pixel_x = -6; + pixel_y = -2 + }, +/obj/item/clothing/shoes/sneakers/orange{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/clothing/shoes/sneakers/orange{ + pixel_x = -6; + pixel_y = -8 + }, +/obj/item/clothing/under/rank/prisoner{ + pixel_x = 8; + pixel_y = 5 + }, +/obj/machinery/camera{ + c_tag = "Permabrig Processing"; + dir = 8; + network = list("ss13","prison") }, /turf/open/floor/plasteel, /area/security/prison) "adf" = ( -/obj/structure/toilet/secret/prison{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/plasteel/freezer, -/area/security/prison) +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) "adg" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ @@ -1446,18 +1506,7 @@ /turf/open/floor/plasteel, /area/security/prison) "adp" = ( -/obj/structure/table, /obj/effect/turf_decal/tile/red, -/obj/item/radio/headset{ - desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast."; - name = "prisoner headset"; - prison_radio = 1 - }, -/obj/item/radio/headset{ - desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast."; - name = "prisoner headset"; - prison_radio = 1 - }, /turf/open/floor/plasteel, /area/security/prison) "adq" = ( @@ -1496,24 +1545,6 @@ /obj/effect/landmark/barthpot, /turf/open/floor/wood, /area/service/library) -"adw" = ( -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/solars/port/fore) -"adx" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/solars/port/fore) "ady" = ( /obj/structure/lattice/catwalk, /turf/open/space, @@ -1538,89 +1569,81 @@ }, /turf/open/floor/plasteel, /area/security/office) -"adC" = ( -/obj/structure/table, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/item/razor, -/obj/item/toy/plush/borgplushie{ - desc = "A horrible abomination to God in plushie form. Legends say this is used to torture prisoners by repeatedly beating them in the head with it.. ..It feels sorta heavy."; - force = 1; - name = "dogborg plushie"; - throwforce = 1 - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) "adD" = ( -/obj/machinery/button/flasher{ - id = "executionflash"; - pixel_x = 24; - pixel_y = 5 - }, -/obj/machinery/button/door{ - id = "executionspaceblast"; - name = "Vent to Space"; - pixel_x = 25; - pixel_y = -5; - req_access_txt = "7" - }, -/obj/machinery/atmospherics/pipe/simple/general/hidden, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) -"adE" = ( -/obj/structure/table, -/obj/item/folder/red{ - pixel_x = 3 - }, -/obj/item/taperecorder{ - pixel_x = -3 - }, -/obj/item/assembly/flash/handheld, -/obj/item/reagent_containers/spray/pepper, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/security/prison/cells) "adF" = ( +/obj/machinery/door/airlock/security/glass{ + id_tag = "permaouter"; + name = "Permabrig Transfer"; + req_access_txt = "2" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, -/area/security/prison) -"adG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, -/area/security/prison) -"adH" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Long-Term Cell 3"; - req_access_txt = "2" - }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/turf/open/floor/plasteel, -/area/security/prison) -"adI" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Long-Term Cell 2"; - req_access_txt = "2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"adJ" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Long-Term Cell 1"; - req_access_txt = "2" - }, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"adH" = ( +/obj/machinery/door/airlock/security/glass{ + id_tag = "permaouter"; + name = "Permabrig Transfer"; + req_access_txt = "2" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/turf/open/floor/plasteel, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, /area/security/prison) +"adI" = ( +/turf/closed/wall/r_wall, +/area/security/prison/upper) +"adJ" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Permabrig Visitation"; + req_access_txt = "2" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) "adK" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -1629,14 +1652,14 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -26 - }, /obj/machinery/camera{ c_tag = "Brig EVA Storage"; dir = 4 }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, /turf/open/floor/plasteel/dark, /area/security/brig) "adL" = ( @@ -1789,170 +1812,141 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/solars/starboard/fore) -"adZ" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/solars/port/fore) -"aea" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plating, -/area/security/execution/transfer) "aeb" = ( /obj/structure/table, -/obj/item/flashlight/lamp, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) -"aec" = ( -/obj/structure/window/reinforced{ - dir = 4 +/obj/item/storage/box/handcuffs{ + pixel_y = 10 }, -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/item/storage/box/prisoner{ + pixel_y = 4 }, -/turf/open/floor/plating, -/area/security/execution/transfer) -"aed" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/machinery/button/ignition{ - id = "executionburn"; - pixel_x = 24; - pixel_y = 5 - }, -/obj/machinery/button/door{ - id = "executionfireblast"; - name = "Transfer Area Lockdown"; - pixel_x = 25; - pixel_y = -5; - req_access_txt = "2" - }, -/obj/machinery/atmospherics/pipe/simple/general/hidden, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) -"aee" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) -"aef" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, /obj/effect/turf_decal/tile/red{ dir = 1 }, /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/table, -/obj/item/restraints/handcuffs, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/dark, /area/security/prison) -"aeg" = ( +"aed" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/security/execution/transfer) -"aeh" = ( -/obj/machinery/button/door{ - id = "permacell3"; - name = "Cell 3 Lockdown"; - pixel_x = -4; - pixel_y = 25; - req_access_txt = "2" +/obj/effect/turf_decal/delivery, +/obj/machinery/disposal/deliveryChute, +/obj/structure/plasticflaps/opaque{ + name = "Prisoner Transfer" }, -/obj/machinery/button/flasher{ - id = "PCell 3"; - pixel_x = 6; - pixel_y = 24 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel/dark, /area/security/prison) -"aei" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aej" = ( +"aef" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/structure/cable{ + icon_state = "1-2" }, /turf/open/floor/plasteel, /area/security/prison) -"aek" = ( -/obj/machinery/light{ +"aeg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/machinery/computer/security/telescreen/prison{ - pixel_y = 30 +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"aeh" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"aei" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Prison Gate"; + name = "Prison Lockdown Shutters" + }, +/turf/open/floor/plating, +/area/security/prison) +"aej" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_y = 23 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"aek" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /obj/effect/turf_decal/tile/red{ dir = 1 }, /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/machinery/firealarm{ + pixel_y = 24 + }, /turf/open/floor/plasteel, /area/security/prison) "ael" = ( -/obj/machinery/button/door{ - id = "permacell2"; - name = "Cell 2 Lockdown"; - pixel_x = -4; - pixel_y = 25; - req_access_txt = "2" - }, -/obj/machinery/button/flasher{ - id = "PCell 2"; - pixel_x = 6; - pixel_y = 24 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, /turf/open/floor/plasteel, /area/security/prison) "aem" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/security/prison) "aen" = ( -/obj/machinery/computer/security/telescreen/prison{ - pixel_y = 30 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/machinery/camera{ - c_tag = "Prison Hallway"; + c_tag = "Prison Hallway East"; network = list("ss13","prison") }, /obj/effect/turf_decal/tile/red{ @@ -1982,41 +1976,24 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/security/prison) "aeq" = ( -/obj/machinery/button/door{ - id = "permacell1"; - name = "Cell 1 Lockdown"; - pixel_x = -4; - pixel_y = 25; - req_access_txt = "2" - }, -/obj/machinery/button/flasher{ - id = "PCell 1"; - pixel_x = 6; - pixel_y = 24 - }, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, /turf/open/floor/plasteel, /area/security/prison) "aer" = ( -/obj/machinery/firealarm{ - pixel_y = 24 - }, /obj/machinery/power/apc{ areastring = "/area/security/prison"; dir = 4; name = "Prison Wing APC"; pixel_x = 24 }, -/obj/structure/cable{ - icon_state = "0-8" - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -2024,6 +2001,13 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, /turf/open/floor/plasteel, /area/security/prison) "aes" = ( @@ -2216,103 +2200,31 @@ }, /turf/open/floor/plasteel/airless/solarpanel, /area/solars/starboard/fore) -"aeH" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/security/execution/transfer) -"aeI" = ( -/obj/structure/rack, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/item/flashlight{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/item/tank/internals/anesthetic{ - pixel_x = -3; - pixel_y = 1 - }, -/obj/item/tank/internals/oxygen/red{ - pixel_x = 3 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) -"aeJ" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, -/turf/open/floor/plating, -/area/security/execution/transfer) -"aeK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/general/hidden, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) "aeL" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/dark, -/area/security/execution/transfer) +/area/security/prison) "aeM" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/structure/cable{ + icon_state = "2-4" }, /obj/structure/cable{ - icon_state = "2-8" + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 }, /turf/open/floor/plasteel, /area/security/prison) -"aeN" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security{ - aiControlDisabled = 1; - name = "Prisoner Transfer Centre"; - req_access_txt = "2" - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) "aeO" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -2332,22 +2244,24 @@ /obj/structure/cable{ icon_state = "2-4" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/prison) "aeQ" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/structure/cable{ icon_state = "4-8" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/prison) "aeR" = ( @@ -2357,16 +2271,10 @@ /turf/open/floor/plating, /area/hallway/secondary/exit) "aeS" = ( -/obj/structure/closet/secure_closet/brig, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/item/radio/headset{ - desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast."; - name = "prisoner headset"; - prison_radio = 1 - }, /obj/structure/cable{ icon_state = "1-2" }, @@ -2376,10 +2284,12 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/structure/cable{ icon_state = "4-8" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/prison) "aeU" = ( @@ -2691,6 +2601,10 @@ /obj/structure/cable{ icon_state = "0-4" }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Prison Gate"; + name = "Prison Lockdown Shutters" + }, /turf/open/floor/plating, /area/security/brig) "afr" = ( @@ -2717,90 +2631,73 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/dark, /area/command/heads_quarters/hos) -"aft" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plating, -/area/security/execution/transfer) "afu" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/security/execution/transfer) -"afv" = ( -/obj/machinery/atmospherics/pipe/simple/general/hidden{ +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) -"afw" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - layer = 2.4 - }, -/obj/machinery/door/window/southleft{ - base_state = "right"; - dir = 4; - icon_state = "right"; - name = "Armory"; - req_access_txt = "2" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/security/execution/transfer) -"afx" = ( -/obj/machinery/light_switch{ - pixel_x = 25 - }, -/obj/machinery/atmospherics/pipe/simple/general/hidden{ - dir = 9 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) -"afy" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/general/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) -"afz" = ( /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/bot_white, +/obj/structure/closet/secure_closet/brig, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"afv" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"afw" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/reagent_dispensers/peppertank{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"afy" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"afA" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, /turf/open/floor/plasteel, /area/security/prison) -"afA" = ( -/turf/closed/wall/r_wall, -/area/security/execution/transfer) "afB" = ( /obj/item/radio/intercom{ dir = 4; name = "Station Intercom (General)"; pixel_x = 27 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/prison) "afC" = ( @@ -2831,21 +2728,16 @@ /turf/open/floor/plating, /area/hallway/secondary/exit) "afF" = ( -/obj/structure/table, -/obj/item/assembly/signaler, -/obj/item/clothing/suit/straight_jacket, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/light{ + light_color = "#d1dfff" + }, /turf/open/floor/plasteel, /area/security/prison) "afG" = ( -/obj/structure/table, -/obj/item/storage/box/hug, -/obj/item/razor{ - pixel_x = -6 - }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 8 @@ -2899,9 +2791,6 @@ pixel_y = -27 }, /obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, /turf/open/floor/plasteel, /area/security/prison) "afK" = ( @@ -3082,39 +2971,59 @@ /area/security/range) "agf" = ( /obj/structure/table, -/obj/item/stack/sheet/metal, -/obj/item/storage/box/bodybags, -/obj/item/pen, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/item/clothing/gloves/color/orange, +/obj/item/restraints/handcuffs, +/obj/item/reagent_containers/spray/pepper, /turf/open/floor/plasteel/dark, -/area/security/execution/transfer) +/area/security/prison) "agg" = ( -/obj/structure/closet/secure_closet/injection, -/obj/structure/cable, -/obj/machinery/power/apc{ - areastring = "/area/security/execution/transfer"; - name = "Prisoner Transfer Centre"; - pixel_y = -27 +/obj/structure/table, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/item/clothing/suit/straight_jacket, +/obj/item/electropack/shockcollar, +/obj/item/assembly/signaler, /turf/open/floor/plasteel/dark, -/area/security/execution/transfer) +/area/security/prison) "agh" = ( /obj/structure/table, -/obj/item/electropack, -/obj/item/screwdriver, -/obj/item/wrench, -/obj/item/clothing/head/helmet, -/obj/item/assembly/signaler, -/obj/machinery/light/small, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 +/obj/item/storage/box/hug, +/obj/item/razor{ + pixel_x = -6 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/light{ + light_color = "#d1dfff" }, /turf/open/floor/plasteel/dark, -/area/security/execution/transfer) +/area/security/prison) "agi" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -3494,7 +3403,11 @@ /obj/structure/cable{ icon_state = "1-8" }, -/turf/open/floor/plasteel, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Prison Gate"; + name = "Prison Lockdown Shutters" + }, +/turf/open/floor/plasteel/dark, /area/security/brig) "agP" = ( /obj/structure/cable{ @@ -3846,6 +3759,10 @@ /obj/structure/cable{ icon_state = "0-4" }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Prison Gate"; + name = "Prison Lockdown Shutters" + }, /turf/open/floor/plating, /area/security/brig) "ahw" = ( @@ -3857,6 +3774,10 @@ icon_state = "1-4" }, /obj/structure/cable, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Prison Gate"; + name = "Prison Lockdown Shutters" + }, /turf/open/floor/plating, /area/security/brig) "ahx" = ( @@ -3972,19 +3893,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/security/processing) -"ahE" = ( -/obj/structure/closet/secure_closet/brig, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/item/radio/headset{ - desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast."; - name = "prisoner headset"; - prison_radio = 1 - }, -/turf/open/floor/plasteel, -/area/security/prison) "ahF" = ( /obj/structure/cable{ icon_state = "4-8" @@ -4407,9 +4315,6 @@ /turf/open/floor/plating, /area/security/brig) "aik" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -4424,12 +4329,6 @@ }, /turf/open/floor/plasteel, /area/security/office) -"ail" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/security/range) "aim" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ @@ -5070,9 +4969,6 @@ /turf/open/floor/plasteel, /area/commons/vacant_room/office/b) "aju" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/structure/cable{ icon_state = "2-4" }, @@ -5392,13 +5288,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/maintenance/solars/port/fore) -"ajW" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/solars/port/fore) "ajX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -5847,15 +5736,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/engine, /area/science/xenobiology) -"akQ" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/security/prison) "akR" = ( /obj/machinery/camera{ c_tag = "Security Office"; @@ -6629,19 +6509,6 @@ }, /turf/open/floor/plasteel/dark, /area/security/courtroom) -"amv" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/solars/port/fore) "amw" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -6690,20 +6557,6 @@ "amC" = ( /turf/open/floor/plating, /area/maintenance/port/fore) -"amD" = ( -/obj/item/trash/sosjerky, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"amE" = ( -/obj/item/electronics/airalarm, -/obj/item/circuitboard/machine/seed_extractor, -/obj/structure/table, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 4; - name = "4maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) "amF" = ( /obj/machinery/atmospherics/components/unary/tank/air, /turf/open/floor/plating, @@ -6977,37 +6830,12 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/fore) -"anj" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = -12; - pixel_y = 2 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) "ank" = ( /obj/machinery/door/airlock/maintenance/abandoned{ req_access_txt = "12" }, /turf/open/floor/plating, /area/maintenance/port/fore) -"anl" = ( -/obj/structure/bed, -/obj/effect/landmark/xeno_spawn, -/obj/item/bedsheet, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"anm" = ( -/obj/machinery/computer/slot_machine{ - balance = 15; - money = 500 - }, -/obj/item/coin/iron, -/obj/item/coin/diamond, -/obj/item/coin/diamond, -/obj/item/coin/diamond, -/turf/open/floor/plating, -/area/maintenance/port/fore) "ann" = ( /obj/effect/spawner/lootdrop/maintenance, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -7117,11 +6945,6 @@ id = "Cell 2"; name = "Cell 2 Locker" }, -/obj/item/radio/headset{ - desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast."; - name = "prisoner headset"; - prison_radio = 1 - }, /obj/structure/cable{ icon_state = "1-4" }, @@ -7729,7 +7552,7 @@ }, /obj/machinery/firealarm{ dir = 8; - pixel_x = 24; + pixel_x = 26; pixel_y = -28 }, /turf/open/floor/plasteel, @@ -8534,16 +8357,6 @@ }, /turf/open/floor/plasteel, /area/security/processing) -"aqJ" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/solars/port/fore) "aqN" = ( /obj/structure/closet/secure_closet/warden, /obj/structure/sign/poster/official/ion_rifle{ @@ -8871,11 +8684,6 @@ id = "Cell 3"; name = "Cell 3 Locker" }, -/obj/item/radio/headset{ - desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast."; - name = "prisoner headset"; - prison_radio = 1 - }, /obj/structure/cable{ icon_state = "1-4" }, @@ -9190,7 +8998,7 @@ }, /obj/machinery/firealarm{ dir = 8; - pixel_x = 28 + pixel_x = 24 }, /turf/open/floor/plasteel/dark, /area/security/brig) @@ -9264,7 +9072,7 @@ }, /obj/machinery/firealarm{ dir = 8; - pixel_x = 28 + pixel_x = 24 }, /turf/open/floor/plasteel, /area/security/processing) @@ -11807,25 +11615,6 @@ /obj/item/ectoplasm, /turf/open/floor/wood, /area/maintenance/port/fore) -"azH" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/service/theater/clown) "azK" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -12299,18 +12088,6 @@ /obj/item/pen/fourcolor, /turf/open/floor/plasteel, /area/commons/dorms) -"aBa" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/command/gateway) "aBh" = ( /obj/machinery/camera{ c_tag = "EVA Maintenance"; @@ -12447,13 +12224,6 @@ }, /turf/open/floor/plasteel, /area/service/hydroponics/garden) -"aBx" = ( -/obj/machinery/shower{ - dir = 8; - pixel_y = -4 - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet) "aBy" = ( /obj/machinery/door/airlock{ desc = "A small bathroom with a sink, toilet and shower."; @@ -12462,12 +12232,6 @@ }, /turf/open/floor/mineral/titanium/blue, /area/commons/toilet) -"aBz" = ( -/obj/machinery/shower{ - dir = 4 - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet) "aBA" = ( /obj/structure/cable{ icon_state = "4-8" @@ -12668,30 +12432,6 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/command/storage/eva) -"aCh" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/table/wood, -/obj/item/flashlight/lamp/bananalamp{ - pixel_y = 3 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/requests_console{ - department = "Theatre"; - name = "theatre RC"; - pixel_y = 32 - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/service/theater/clown) "aCi" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -13233,18 +12973,6 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/command/nuke_storage) -"aDy" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/snacks/baguette, -/obj/structure/mirror{ - pixel_y = 32 - }, -/obj/item/toy/crayon/spraycan/mimecan, -/obj/item/toy/dummy, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/service/theater/mime) "aDz" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance{ @@ -13373,25 +13101,6 @@ "aDM" = ( /turf/open/floor/mineral/titanium/blue, /area/commons/toilet) -"aDN" = ( -/obj/machinery/camera{ - c_tag = "Bathrooms"; - dir = 1 - }, -/obj/structure/urinal{ - pixel_y = 32 - }, -/turf/open/floor/mineral/titanium/blue, -/area/commons/toilet) -"aDP" = ( -/obj/machinery/shower{ - dir = 8; - pixel_y = -4 - }, -/obj/effect/landmark/xeno_spawn, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet) "aDQ" = ( /obj/machinery/door/airlock{ desc = "A small bathroom with a sink, toilet and shower."; @@ -13401,36 +13110,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium/blue, /area/commons/toilet) -"aDR" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/wood, -/area/service/bar) -"aDT" = ( -/obj/item/soap, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/light/small{ - dir = 1; - light_color = "#ffc1c1" - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet) -"aDU" = ( -/obj/machinery/shower{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet) -"aDY" = ( -/obj/structure/window{ - dir = 4 - }, -/turf/open/floor/wood, -/area/service/bar) "aDZ" = ( /obj/structure/cable{ icon_state = "4-8" @@ -13458,12 +13137,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"aEc" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/wood, -/area/service/bar) "aEd" = ( /obj/structure/cable{ icon_state = "4-8" @@ -13738,13 +13411,6 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/command/nuke_storage) -"aEU" = ( -/obj/machinery/vending/autodrobe, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/service/theater/mime) "aEV" = ( /obj/structure/reagent_dispensers/watertank, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -13818,20 +13484,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/commons/dorms) -"aFk" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/wood, -/area/service/bar) -"aFl" = ( -/obj/structure/festivus{ - anchored = 1; - desc = "A pole for dancing."; - name = "pole" - }, -/turf/open/floor/wood, -/area/service/bar) "aFm" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -14181,16 +13833,6 @@ }, /turf/open/floor/plasteel, /area/command/gateway) -"aGf" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/fore) "aGg" = ( /obj/structure/reagent_dispensers/fueltank, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -14292,44 +13934,12 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"aGw" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/wood, -/area/service/bar) "aGx" = ( /obj/item/radio/intercom{ pixel_x = -25 }, /turf/open/floor/mineral/titanium/blue, /area/commons/toilet) -"aGy" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"aGz" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "aGA" = ( /obj/structure/cable{ icon_state = "2-4" @@ -14944,12 +14554,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"aHZ" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/wood, -/area/service/bar) "aIa" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -14957,12 +14561,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"aIb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "aIc" = ( /obj/machinery/power/apc{ areastring = "/area/service/bar"; @@ -15445,13 +15043,6 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/command/storage/eva) -"aJk" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Bar Back Room" - }, -/turf/open/floor/plasteel/dark, -/area/service/bar) "aJl" = ( /obj/structure/tank_dispenser/oxygen, /obj/machinery/light{ @@ -15899,16 +15490,6 @@ }, /turf/open/floor/wood, /area/service/bar) -"aKr" = ( -/obj/machinery/vending/snack/orange, -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/sign/poster/contraband/donut_corp{ - pixel_y = 32 - }, -/turf/open/floor/wood, -/area/service/bar) "aKs" = ( /obj/structure/disposalpipe/segment, /obj/effect/spawner/structure/window, @@ -15992,13 +15573,6 @@ /obj/structure/closet/secure_closet/hydroponics, /turf/open/floor/plasteel, /area/service/hydroponics) -"aKJ" = ( -/obj/machinery/vending/cola/black, -/obj/structure/sign/poster/contraband/starkist{ - pixel_y = 32 - }, -/turf/open/floor/wood, -/area/service/bar) "aKL" = ( /obj/machinery/airalarm{ pixel_y = 24 @@ -16025,19 +15599,6 @@ }, /turf/open/floor/wood, /area/service/bar) -"aKN" = ( -/obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -3; - pixel_y = 20 - }, -/obj/item/reagent_containers/food/condiment/peppermill{ - dir = 1; - pixel_x = 3; - pixel_y = 20 - }, -/turf/open/floor/wood, -/area/service/bar) "aKO" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -16375,13 +15936,6 @@ }, /turf/open/floor/plasteel, /area/commons/storage/primary) -"aLN" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) "aLO" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -17227,22 +16781,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/fore) -"aOt" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) "aOv" = ( /obj/structure/cable{ icon_state = "4-8" @@ -19398,12 +18936,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/wood, /area/commons/vacant_room/office) -"aUn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/commons/locker) "aUo" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -19411,63 +18943,12 @@ }, /turf/open/floor/plasteel, /area/commons/locker) -"aUp" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/window{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/commons/locker) -"aUs" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/commons/locker) "aUt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel, /area/commons/locker) -"aUu" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/commons/locker) "aUv" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -19636,12 +19117,6 @@ /obj/item/flashlight/lamp/green, /turf/open/floor/wood, /area/commons/vacant_room/office) -"aUX" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/commons/locker) "aUY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -20244,16 +19719,6 @@ /obj/item/clothing/head/beret/black, /turf/open/floor/plasteel, /area/commons/locker) -"aWo" = ( -/obj/machinery/camera{ - c_tag = "Locker Room West"; - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/commons/locker) "aWp" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -20796,13 +20261,6 @@ }, /turf/open/floor/plasteel, /area/service/hydroponics) -"aXp" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/locker) "aXq" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -21117,13 +20575,6 @@ }, /turf/open/floor/wood, /area/commons/vacant_room/office) -"aYe" = ( -/obj/machinery/light_switch{ - pixel_y = 28 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/locker) "aYf" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -21583,17 +21034,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/wood, /area/commons/vacant_room/office) -"aZo" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/obj/structure/mirror{ - pixel_x = 28 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/locker) "aZp" = ( /obj/structure/rack, /obj/item/electronics/apc, @@ -21661,28 +21101,6 @@ }, /turf/open/floor/mineral/titanium/blue, /area/commons/toilet/locker) -"aZw" = ( -/obj/effect/landmark/blobstart, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/locker) -"aZx" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/window, -/obj/structure/window{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/commons/locker) "aZy" = ( /obj/machinery/camera{ c_tag = "Conference Room" @@ -22010,14 +21428,6 @@ }, /turf/open/floor/wood, /area/service/library) -"baw" = ( -/obj/machinery/camera{ - c_tag = "Locker Room Toilets"; - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/locker) "bax" = ( /obj/structure/chair/comfy/black{ dir = 4 @@ -22148,10 +21558,6 @@ }, /turf/open/floor/plating, /area/maintenance/port) -"baO" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/locker) "baP" = ( /obj/structure/table/wood, /obj/item/storage/fancy/donut_box, @@ -22331,13 +21737,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/ai_upload) -"bbq" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/locker) "bbs" = ( /obj/structure/window/reinforced{ dir = 8 @@ -22701,9 +22100,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"bct" = ( -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/locker) "bcu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/maintenance{ @@ -23184,13 +22580,6 @@ }, /turf/open/floor/carpet, /area/command/meeting_room) -"bdJ" = ( -/obj/machinery/door/airlock{ - id_tag = "LockerShitter3"; - name = "Unit 3" - }, -/turf/open/floor/mineral/titanium/blue, -/area/commons/toilet/locker) "bdK" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -23198,18 +22587,6 @@ /obj/machinery/holopad/secure, /turf/open/floor/carpet, /area/command/meeting_room) -"bdL" = ( -/obj/machinery/light, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/bedsheetbin/color, -/obj/structure/table, -/turf/open/floor/plasteel/cafeteria, -/area/commons/locker) "bdN" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -23870,28 +23247,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/port) -"bfr" = ( -/obj/structure/noticeboard{ - dir = 8; - pixel_x = 27 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/wood, -/area/command/meeting_room) -"bfs" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/closed/wall/r_wall, -/area/ai_monitored/turret_protected/ai_upload) "bft" = ( /obj/machinery/status_display/ai, /obj/structure/cable{ @@ -23905,19 +23260,6 @@ }, /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/ai_upload) -"bfv" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/closed/wall/r_wall, -/area/ai_monitored/turret_protected/ai_upload) -"bfw" = ( -/obj/machinery/status_display/evac, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/closed/wall/r_wall, -/area/ai_monitored/turret_protected/ai_upload) "bfx" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -23940,15 +23282,6 @@ }, /turf/open/floor/wood, /area/command/heads_quarters/captain) -"bfz" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/closed/wall/r_wall, -/area/ai_monitored/turret_protected/ai_upload) "bfA" = ( /obj/structure/table/wood, /obj/item/hand_tele, @@ -24243,13 +23576,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/port) -"bgr" = ( -/obj/machinery/door/airlock{ - id_tag = "LockerShitter4"; - name = "Unit 4" - }, -/turf/open/floor/mineral/titanium/blue, -/area/commons/toilet/locker) "bgt" = ( /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, @@ -24405,52 +23731,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) -"bgS" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/wood, -/area/command/heads_quarters/captain) -"bgT" = ( -/obj/machinery/computer/communications{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/wood, -/area/command/heads_quarters/captain) -"bgU" = ( -/obj/structure/chair/comfy/brown{ - dir = 4 - }, -/obj/effect/landmark/start/captain, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/wood, -/area/command/heads_quarters/captain) -"bgV" = ( -/obj/structure/table/wood, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/coin/plasma, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/wood, -/area/command/heads_quarters/captain) -"bgW" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/holopad/secure, -/turf/open/floor/wood, -/area/command/heads_quarters/captain) "bgX" = ( /obj/structure/table/wood, /obj/machinery/airalarm{ @@ -39370,19 +38650,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/science/circuit) -"bPM" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/science/circuit) "bPN" = ( /turf/closed/wall, /area/science/misc_lab) @@ -40568,13 +39835,6 @@ }, /turf/open/floor/engine, /area/science/misc_lab) -"bTo" = ( -/obj/structure/table/reinforced, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/circuit) "bTp" = ( /obj/structure/table/reinforced, /obj/item/stack/sheet/glass/fifty, @@ -42103,14 +41363,6 @@ "bXs" = ( /turf/open/floor/plasteel/white, /area/science/circuit) -"bXt" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/science/circuit) -"bXv" = ( -/obj/item/stack/rods, -/turf/open/space, -/area/space) "bXw" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/plasteel, @@ -42760,7 +42012,8 @@ /area/maintenance/port/aft) "bZm" = ( /obj/structure/disposaloutlet{ - dir = 8 + dir = 8; + name = "Prisoner Outlet" }, /obj/structure/disposalpipe/trunk{ dir = 4 @@ -45178,10 +44431,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/science/misc_lab) -"cfv" = ( -/obj/structure/plasticflaps/opaque, -/turf/open/floor/carpet/royalblue, -/area/maintenance/starboard/aft) "cfw" = ( /turf/closed/wall/r_wall, /area/maintenance/solars/port/aft) @@ -46096,6 +45345,9 @@ /obj/machinery/door/airlock/external{ req_access_txt = "13" }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/fore/secondary) "chP" = ( @@ -50928,11 +50180,6 @@ /obj/machinery/holopad, /turf/open/floor/plasteel, /area/security/processing) -"cxW" = ( -/obj/structure/lattice, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) "cxY" = ( /obj/machinery/camera{ c_tag = "Arrivals Escape Pod 1"; @@ -51182,6 +50429,12 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, /area/hallway/secondary/exit) +"czP" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/security/prison/cells) "czQ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment, @@ -51589,16 +50842,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plating, /area/service/hydroponics) -"cBh" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/commons/locker) "cBi" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -51632,16 +50875,6 @@ /obj/machinery/light, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"cBn" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/obj/structure/mirror{ - pixel_x = 28 - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/locker) "cBo" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/wood, @@ -51919,6 +51152,20 @@ /obj/machinery/deepfryer, /turf/open/floor/plasteel/cafeteria, /area/service/kitchen) +"cCr" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/cells) "cCs" = ( /obj/structure/closet/emcloset, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -52102,19 +51349,6 @@ /obj/structure/closet/boxinggloves, /turf/open/floor/plasteel, /area/commons/fitness) -"cFG" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/obj/structure/mirror{ - pixel_x = 28 - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/locker) "cGf" = ( /obj/structure/sign/poster/contraband/random{ pixel_y = 32 @@ -52456,6 +51690,22 @@ /obj/structure/sign/poster/official/cohiba_robusto_ad, /turf/closed/wall, /area/service/lawoffice) +"cJA" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/prison/cells) "cJW" = ( /obj/machinery/computer/gateway_control, /turf/open/floor/plasteel, @@ -52512,6 +51762,24 @@ "cNd" = ( /turf/open/space/basic, /area/space/station_ruins) +"cNi" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "Prison Gate"; + name = "prison blast door" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Prison Gate"; + name = "Prison Lockdown Shutters" + }, +/turf/open/floor/plating, +/area/security/prison/upper) "cNE" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall, @@ -52672,21 +51940,17 @@ /obj/structure/sign/warning/securearea{ pixel_x = -32 }, -/obj/machinery/door/poddoor/preopen{ - id = "Prison Gate"; - name = "prison blast door" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Prison Gate"; + name = "Prison Lockdown Shutters" + }, +/turf/open/floor/plasteel/dark, /area/security/prison) "cPb" = ( /turf/open/floor/wood/wood_diagonal, /area/maintenance/port/fore) -"cPn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet) "cPA" = ( /obj/machinery/atmospherics/components/binary/valve{ dir = 4 @@ -52746,6 +52010,10 @@ /obj/item/folder/blue, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"cSp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/security/prison/upper) "cSA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -53013,6 +52281,13 @@ }, /turf/open/floor/plasteel, /area/engineering/main) +"cTo" = ( +/obj/structure/table/wood, +/obj/item/storage/dice, +/obj/item/instrument/piano_synth, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "cTD" = ( /obj/structure/cable{ icon_state = "1-2" @@ -53086,32 +52361,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) -"cTT" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/command/gateway) "cTX" = ( /obj/structure/cable{ icon_state = "0-2" @@ -53134,6 +52383,17 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) +"cUb" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/blood/old, +/obj/item/kirbyplants/random, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "cUx" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable{ @@ -53157,6 +52417,13 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"cVE" = ( +/obj/machinery/computer/cryopod{ + pixel_y = 26 + }, +/obj/effect/turf_decal/loading_area, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "cVK" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel/white, @@ -53168,6 +52435,16 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"cYf" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "cZe" = ( /obj/structure/cable{ icon_state = "4-8" @@ -53227,6 +52504,12 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"ddl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/locker) "ddI" = ( /obj/machinery/door/airlock/public/glass{ name = "Central Access" @@ -53243,18 +52526,6 @@ icon_state = "wood-broken6" }, /area/maintenance/starboard/aft) -"ddV" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/command/gateway) "dev" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -53291,6 +52562,22 @@ }, /turf/open/floor/plasteel, /area/science/circuit) +"dfj" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/security/execution/transfer) "dfL" = ( /obj/structure/reagent_dispensers/keg/gargle, /turf/open/floor/wood, @@ -53358,6 +52645,16 @@ }, /turf/open/floor/plasteel/dark, /area/medical/paramedic) +"dnX" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "dqb" = ( /turf/open/floor/plasteel, /area/commons/fitness/pool) @@ -53365,6 +52662,12 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) +"dsi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/carpet/arcade, +/area/commons/arcade) "dsJ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/table/glass, @@ -53373,20 +52676,19 @@ }, /turf/open/floor/wood/wood_large, /area/service/chapel/main) -"dtx" = ( -/obj/structure/cable{ - icon_state = "1-2" +"dvb" = ( +/obj/structure/table, +/obj/item/trash/tray, +/obj/item/trash/boritos, +/obj/item/trash/can, +/obj/item/reagent_containers/food/drinks/sillycup{ + pixel_x = 8; + pixel_y = 10 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/sink{ - dir = 4; - pixel_x = 11 +/turf/open/floor/plating{ + icon_state = "panelscorched" }, -/obj/structure/mirror{ - pixel_x = 25 - }, -/turf/open/floor/mineral/titanium/blue, -/area/commons/toilet) +/area/commons/arcade) "dvc" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -53399,10 +52701,34 @@ }, /turf/closed/wall, /area/science/circuit) +"dxv" = ( +/obj/machinery/camera{ + c_tag = "Prison Cafeteria"; + dir = 8; + network = list("ss13","prison") + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "dxF" = ( /obj/machinery/gear_painter, /turf/open/floor/wood, /area/maintenance/bar) +"dyC" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/commons/locker) "dyE" = ( /obj/structure/cable{ icon_state = "0-4" @@ -53418,24 +52744,38 @@ /turf/open/floor/plating, /area/security/brig) "dyS" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 +/obj/machinery/door/airlock/public/glass{ + name = "Prison Cafeteria" }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/turf/open/floor/plasteel, -/area/security/prison) +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) "dzi" = ( /obj/structure/cable{ icon_state = "2-4" }, /turf/open/floor/carpet, /area/commons/cryopod) +"dzK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "dAe" = ( /obj/machinery/atmospherics/pipe/manifold/cyan/visible{ dir = 1 @@ -53443,20 +52783,11 @@ /obj/machinery/meter, /turf/open/floor/plasteel, /area/engineering/atmos) -"dBm" = ( -/obj/machinery/light/floor, +"dCd" = ( /obj/structure/table, -/obj/item/clothing/glasses/sunglasses/reagent, -/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ - pixel_x = -5; - pixel_y = 13 - }, -/obj/item/storage/fancy/cigarettes/cigpack_uplift{ - pixel_x = 10; - pixel_y = 7 - }, -/turf/open/floor/carpet/royalblue, -/area/maintenance/starboard/aft) +/obj/item/reagent_containers/food/drinks/drinkingglass, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) "dCr" = ( /obj/structure/pool/Rboard, /turf/open/floor/plasteel/yellowsiding{ @@ -53477,10 +52808,6 @@ }, /turf/open/floor/plasteel, /area/security/range) -"dEh" = ( -/obj/machinery/jukebox/disco/indestructible, -/turf/open/floor/light/colour_cycle/dancefloor_b, -/area/maintenance/starboard/aft) "dEX" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/machinery/requests_console{ @@ -53494,16 +52821,46 @@ "dFX" = ( /turf/closed/wall, /area/commons/fitness/pool) -"dHp" = ( -/mob/living/simple_animal/bot/secbot/grievous/toy, -/turf/open/floor/light/colour_cycle/dancefloor_a, -/area/maintenance/starboard/aft) +"dGa" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/commons/arcade) "dIu" = ( /obj/structure/chair/sofa{ dir = 8 }, /turf/open/floor/plating, /area/maintenance/port/fore) +"dIZ" = ( +/turf/open/floor/padded, +/area/security/execution/transfer) +"dJu" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/button/door{ + id = "permacells3"; + name = "Privacy Shutters"; + pixel_x = 25 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "dJL" = ( /obj/structure/cable{ icon_state = "1-2" @@ -53523,6 +52880,28 @@ /obj/structure/chair/stool/bar, /turf/open/floor/wood, /area/maintenance/bar) +"dLi" = ( +/obj/machinery/hydroponics/soil, +/obj/item/cultivator, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"dLl" = ( +/obj/item/stack/rods, +/turf/open/space, +/area/space) +"dLZ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "dMj" = ( /obj/machinery/space_heater, /obj/effect/turf_decal/stripes/line{ @@ -53536,6 +52915,12 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"dNP" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "dPk" = ( /obj/structure/closet{ name = "Costume Closet" @@ -53562,6 +52947,36 @@ }, /turf/open/floor/plating, /area/maintenance/fore) +"dPs" = ( +/obj/machinery/hydroponics/soil, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"dPE" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "dQD" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -53569,6 +52984,26 @@ }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) +"dQS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"dSh" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "dTI" = ( /obj/structure/urinal{ pixel_y = 32 @@ -53585,6 +53020,35 @@ }, /turf/open/floor/plasteel, /area/engineering/gravity_generator) +"dYl" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/command/gateway) +"dYQ" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/button/electrochromatic{ + id = "!permabrigshowers"; + pixel_x = -25 + }, +/turf/open/floor/plasteel/freezer, +/area/security/prison/cells) "dYZ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -53609,6 +53073,13 @@ }, /turf/open/space, /area/solars/starboard/fore) +"ebo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) "ecg" = ( /turf/open/floor/plasteel/yellowsiding/corner{ dir = 4 @@ -53621,6 +53092,10 @@ }, /turf/open/floor/plasteel/dark, /area/medical/morgue) +"ecB" = ( +/obj/item/toy/beach_ball/holoball, +/turf/open/floor/plasteel, +/area/security/prison/upper) "edj" = ( /obj/structure/sign/poster/contraband/random{ pixel_y = 32 @@ -53684,12 +53159,55 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"ejr" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/grunge{ + name = "Permanent Cell 4"; + wiretypepath = /datum/wires/airlock/security + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) +"eky" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/baguette, +/obj/structure/mirror{ + pixel_y = 32 + }, +/obj/item/toy/crayon/spraycan/mimecan, +/obj/item/toy/dummy, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/service/theater) "elh" = ( /obj/structure/chair/comfy/black{ dir = 8 }, /turf/open/floor/wood, /area/service/bar) +"emf" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Permabrig Maintenance"; + req_access_txt = "1" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/prison/starboard) "ene" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -53715,6 +53233,48 @@ /obj/structure/table/wood/poker, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"eoJ" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/grunge{ + name = "Permanent Cell 5"; + wiretypepath = /datum/wires/airlock/security + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) +"eoR" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"epj" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/prison/cells) "epD" = ( /obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /obj/machinery/light{ @@ -53726,21 +53286,27 @@ }, /turf/open/floor/plasteel, /area/commons/fitness) -"eqd" = ( -/obj/item/electropack/shockcollar, -/obj/item/assembly/signaler, -/turf/open/floor/plating, -/area/security/prison) +"epG" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "eqq" = ( /obj/machinery/atmospherics/pipe/manifold/orange/visible, /turf/open/floor/plasteel, /area/engineering/atmos) "eqA" = ( -/obj/machinery/shower{ - dir = 8 +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/plasteel/freezer, -/area/security/prison) +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) "esK" = ( /obj/machinery/door/airlock/maintenance/abandoned{ name = "Chemical Storage"; @@ -53772,6 +53338,17 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood, /area/service/library) +"etr" = ( +/obj/structure/chair/stool, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "eus" = ( /obj/machinery/portable_atmospherics/scrubber, /obj/effect/turf_decal/stripes/line{ @@ -53779,6 +53356,40 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"evc" = ( +/obj/machinery/hydroponics/soil, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Prison Forestry"; + dir = 4; + network = list("ss13","prison") + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"evh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Prison Workshop"; + dir = 4; + network = list("ss13","prison") + }, +/obj/item/stack/sticky_tape, +/obj/item/stack/sheet/cardboard{ + amount = 14 + }, +/obj/item/stack/packageWrap, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "evR" = ( /turf/open/floor/plating, /area/maintenance/bar) @@ -53793,6 +53404,17 @@ }, /turf/open/floor/plating, /area/commons/fitness) +"ewG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "permacells5"; + name = "Privacy Shutters" + }, +/turf/open/floor/plating, +/area/security/prison/cells) "ewN" = ( /obj/machinery/hydroponics/soil{ pixel_y = 8 @@ -53808,6 +53430,12 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"exX" = ( +/obj/machinery/door/airlock{ + name = "Shower Room" + }, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet) "eyq" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on, /turf/open/floor/plating, @@ -53838,6 +53466,12 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"eAe" = ( +/obj/structure/dresser, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/service/theater) "eAG" = ( /obj/item/clothing/under/misc/pj/blue, /obj/item/clothing/shoes/sneakers/white, @@ -53889,6 +53523,16 @@ /obj/item/clothing/under/rank/civilian/lawyer/red, /turf/open/floor/plasteel, /area/commons/fitness) +"eCB" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/security/prison/upper) "eCR" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -53896,6 +53540,19 @@ }, /turf/closed/wall/r_wall, /area/engineering/gravity_generator) +"eDf" = ( +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "eDz" = ( /obj/structure/cable/white{ icon_state = "2-8" @@ -53904,20 +53561,37 @@ icon_state = "panelscorched" }, /area/maintenance/starboard/aft) -"eEe" = ( -/obj/effect/turf_decal/tile/blue{ +"eDF" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/chair/comfy/brown{ + color = "#596479"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"eDJ" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/red{ dir = 8 }, /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/landmark/start/clown, -/turf/open/floor/plasteel, -/area/service/theater/clown) +/turf/open/floor/plasteel/dark, +/area/security/prison) "eFx" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -53954,6 +53628,14 @@ /obj/effect/spawner/structure/window/shuttle, /turf/open/floor/plating/airless, /area/space/nearstation) +"eIW" = ( +/obj/structure/table, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) "eJa" = ( /obj/structure/table/wood/poker, /obj/item/toy/cards/deck{ @@ -53964,6 +53646,22 @@ }, /turf/open/floor/wood, /area/service/bar) +"eJu" = ( +/obj/machinery/button/door{ + id = "executionspaceblast"; + name = "Vent to Space"; + pixel_x = 25; + pixel_y = -5; + req_access_txt = "7" + }, +/obj/machinery/button/flasher{ + id = "executionflash"; + pixel_x = 24; + pixel_y = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) "eMs" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance{ @@ -53975,6 +53673,12 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) +"eOu" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/coin/plasma, +/turf/open/floor/wood, +/area/command/heads_quarters/captain) "eQb" = ( /turf/open/floor/carpet, /area/commons/dorms) @@ -53987,10 +53691,76 @@ /obj/structure/grille, /turf/open/space/basic, /area/space/nearstation) +"eRS" = ( +/obj/structure/table, +/obj/item/folder/red{ + pixel_x = 3 + }, +/obj/item/taperecorder{ + pixel_x = -3 + }, +/obj/item/assembly/flash/handheld, +/obj/item/reagent_containers/spray/pepper, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) "eSe" = ( /obj/structure/closet/secure_closet/personal/cabinet, /turf/open/floor/carpet, /area/commons/dorms) +"eSJ" = ( +/obj/machinery/button/ignition{ + id = "executionburn"; + pixel_x = 24; + pixel_y = 5 + }, +/obj/machinery/button/door{ + id = "executionfireblast"; + name = "Transfer Area Lockdown"; + pixel_x = 25; + pixel_y = -5; + req_access_txt = "2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) +"eTt" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/solars/port/fore) +"eTA" = ( +/obj/structure/table/wood/fancy, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = 20 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + dir = 1; + pixel_x = 3; + pixel_y = 20 + }, +/obj/structure/sign/poster/contraband/eat{ + pixel_y = 32; + poster_item_desc = "This poster promotes obesity, it also promotes giving the Chef a reason to keep their job." + }, +/turf/open/floor/wood, +/area/service/bar) "eUy" = ( /obj/machinery/door/airlock{ name = "Starboard Emergency Storage" @@ -54004,6 +53774,10 @@ }, /turf/open/space, /area/space/nearstation) +"eUX" = ( +/obj/machinery/jukebox/disco, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/maintenance/starboard/aft) "eVC" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/firedoor, @@ -54026,13 +53800,13 @@ /area/cargo/miningdock) "eWL" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "Prison Gate"; - name = "prison blast door" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Prison Gate"; + name = "Prison Lockdown Shutters" + }, +/turf/open/floor/plasteel/dark, /area/security/prison) "eXz" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -54040,6 +53814,15 @@ }, /turf/open/floor/plasteel, /area/security/processing) +"eXI" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "eXL" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 10 @@ -54051,11 +53834,62 @@ /obj/effect/landmark/start/paramedic, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"eZI" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 10 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"eZS" = ( +/obj/effect/turf_decal/bot_white, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/prison/starboard) "fbp" = ( /obj/structure/tank_dispenser, /obj/effect/turf_decal/bot, /turf/open/floor/engine, /area/science/storage) +"fbr" = ( +/obj/machinery/door/window/southleft{ + base_state = "right"; + dir = 4; + icon_state = "right"; + name = "Transfer Chamber Configuration"; + req_access_txt = "2" + }, +/obj/machinery/atmospherics/pipe/simple{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/security/execution/transfer) +"fbY" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/bed, +/obj/item/bedsheet/red, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "fcd" = ( /obj/structure/chair/sofa/right{ dir = 8 @@ -54064,6 +53898,11 @@ icon_state = "platingdmg1" }, /area/maintenance/port/fore) +"fcj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/area/maintenance/prison/starboard) "fcn" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/maintenance{ @@ -54081,11 +53920,61 @@ }, /turf/closed/wall/r_wall, /area/science/mixing) +"fdJ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/prison/cells) "fdQ" = ( /obj/structure/bed, /obj/effect/spawner/lootdrop/bedsheet, /turf/open/floor/plating, /area/maintenance/fore) +"fdR" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/security/prison/cells"; + damage_deflection = 21; + desc = "A control terminal for the area's electrical systems. It's secured with a durable antitampering plasteel cage."; + dir = 4; + name = "Armored Prison Wing Cells APC"; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/security/prison/cells) +"fdS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "feE" = ( /obj/structure/cable{ icon_state = "1-2" @@ -54101,20 +53990,24 @@ }, /turf/open/floor/wood, /area/service/bar) -"fgG" = ( -/obj/machinery/power/apc{ - areastring = "/area/service/theater"; - dir = 8; - name = "Theatre APC"; - pixel_x = -25 +"fgd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 }, /obj/structure/cable{ - icon_state = "0-4" + icon_state = "1-8" }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/service/theater/mime) +/turf/open/floor/plating, +/area/security/execution/transfer) +"fgl" = ( +/obj/structure/closet/crate/bin, +/obj/item/coin/silver, +/turf/open/floor/carpet/arcade, +/area/commons/arcade) "fhu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -54125,12 +54018,39 @@ /obj/item/clothing/mask/gas/owl_mask, /turf/open/floor/plating, /area/maintenance/port/fore) +"fiv" = ( +/obj/effect/spawner/lootdrop/cigars_cases, +/obj/structure/table, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/commons/arcade) "fiy" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, /turf/closed/wall, /area/maintenance/disposal/incinerator) +"fiR" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "fjS" = ( /obj/structure/closet/radiation, /turf/open/floor/plasteel, @@ -54142,6 +54062,12 @@ /obj/structure/lattice, /turf/open/space, /area/space/nearstation) +"fkh" = ( +/mob/living/simple_animal/bot/secbot/grievous/toy{ + name = "Rave Bot 9001" + }, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/maintenance/starboard/aft) "fkW" = ( /obj/structure/cable/white, /obj/structure/cable/white{ @@ -54167,6 +54093,10 @@ }, /turf/open/floor/plasteel, /area/commons/dorms) +"flG" = ( +/obj/machinery/computer/arcade, +/turf/open/floor/carpet/arcade, +/area/commons/arcade) "flP" = ( /obj/machinery/hydroponics/soil{ pixel_y = 8 @@ -54181,11 +54111,19 @@ }, /turf/open/floor/wood/wood_diagonal, /area/maintenance/port/fore) -"fne" = ( -/turf/open/floor/plasteel/white/side{ - dir = 4 +"fmR" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" }, -/area/service/theater/mime) +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "fnC" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -54199,6 +54137,25 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) +"fnE" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/service/theater) "foT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -54299,9 +54256,8 @@ /turf/open/floor/wood/wood_large, /area/service/chapel/main) "fty" = ( -/obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/orange/visible, -/obj/structure/lattice, +/obj/structure/lattice/catwalk, /turf/open/space, /area/space/nearstation) "ftE" = ( @@ -54320,6 +54276,30 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/medical/storage) +"fvU" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/table/wood, +/obj/item/flashlight/lamp/bananalamp{ + pixel_y = 3 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/requests_console{ + department = "Theatre"; + name = "theatre RC"; + pixel_y = 32 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/service/theater) "fvY" = ( /obj/machinery/computer/cryopod{ pixel_y = 26 @@ -54399,6 +54379,25 @@ }, /turf/open/floor/plating, /area/service/abandoned_gambling_den) +"fBW" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/button/door{ + id = "commissaryshutters"; + name = "Commissary Shutters Control"; + pixel_x = 24; + pixel_y = 6; + req_access_txt = null + }, +/obj/item/paper_bin{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/pen, +/turf/open/floor/plasteel, +/area/commons/locker) "fCx" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -54410,12 +54409,56 @@ }, /turf/open/floor/plasteel, /area/commons/fitness) +"fCJ" = ( +/obj/structure/sign/poster/contraband/missing_gloves{ + pixel_x = -32 + }, +/turf/open/floor/carpet/arcade, +/area/commons/arcade) +"fDn" = ( +/obj/structure/table, +/obj/item/trash/chips{ + pixel_x = -4; + pixel_y = 1 + }, +/obj/item/reagent_containers/food/drinks/beer/light{ + pixel_x = 7 + }, +/obj/item/cigbutt{ + pixel_x = 10; + pixel_y = 17 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"fFl" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/window{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/commons/locker) "fFA" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/plasteel, /area/service/hydroponics) +"fFR" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) "fGf" = ( /obj/machinery/smartfridge/disks{ pixel_y = 2 @@ -54452,11 +54495,6 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/security/processing) -"fKl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/science/circuit) "fKC" = ( /obj/structure/chair/office/dark{ dir = 1 @@ -54464,6 +54502,17 @@ /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/plasteel, /area/engineering/atmos) +"fKN" = ( +/obj/structure/table, +/obj/structure/bedsheetbin, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) "fLN" = ( /obj/machinery/chem_dispenser/drinks/beer{ dir = 1 @@ -54475,6 +54524,49 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/security/courtroom) +"fMF" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/grunge{ + name = "Prison Laundry"; + wiretypepath = /datum/wires/airlock/security + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) +"fMY" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"fNB" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/spawner/structure/window/reinforced/tinted/electrochromatic{ + electrochromatic_id = "!permabrigshowers" + }, +/turf/open/floor/plating, +/area/security/prison/cells) "fNN" = ( /obj/machinery/door/firedoor, /obj/structure/cable{ @@ -54498,6 +54590,12 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"fOK" = ( +/obj/machinery/shower{ + dir = 1 + }, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet) "fPi" = ( /obj/effect/decal/cleanable/oil{ icon_state = "floor6" @@ -54509,6 +54607,20 @@ /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"fRe" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/window{ + dir = 1 + }, +/obj/structure/bedsheetbin/color, +/obj/structure/table, +/turf/open/floor/plasteel/cafeteria, +/area/commons/locker) "fSO" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/machinery/atmospherics/pipe/simple/orange/visible{ @@ -54533,6 +54645,12 @@ /obj/item/pen/fountain, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"fWi" = ( +/obj/structure/sign/poster/contraband/robust_softdrinks{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/service/bar) "fZm" = ( /obj/structure/chair/sofa/left, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -54540,6 +54658,12 @@ }, /turf/open/floor/plasteel, /area/commons/fitness) +"fZR" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/commons/storage/primary) "gav" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -54587,11 +54711,6 @@ }, /turf/open/floor/plating, /area/construction) -"gbu" = ( -/obj/structure/bed, -/obj/effect/spawner/lootdrop/bedsheet, -/turf/open/floor/plating, -/area/security/prison) "gbT" = ( /obj/item/storage/box/lights/mixed, /obj/machinery/power/apc{ @@ -54605,6 +54724,22 @@ }, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) +"gcm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) +"gcx" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/mob/living/simple_animal/opossum{ + name = "garbage" + }, +/turf/open/floor/carpet/royalblue, +/area/maintenance/starboard/aft) "gcF" = ( /obj/structure/cable{ icon_state = "1-2" @@ -54614,6 +54749,38 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"gcV" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"gcX" = ( +/obj/structure/table, +/obj/item/flashlight/lamp, +/obj/item/stack/sheet/metal, +/obj/item/storage/box/bodybags, +/obj/item/pen, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) +"gcY" = ( +/obj/structure/weightmachine/weightlifter, +/turf/open/floor/plasteel, +/area/security/prison/upper) "geg" = ( /obj/machinery/light/small{ dir = 8 @@ -54623,6 +54790,16 @@ /obj/item/reagent_containers/food/snacks/egg/yellow, /turf/open/floor/plating, /area/maintenance/port/fore) +"gfw" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/security/prison/upper) "gfC" = ( /obj/effect/turf_decal/tile/red, /obj/structure/chair{ @@ -54645,10 +54822,47 @@ }, /turf/open/floor/plasteel/white, /area/medical/surgery) +"ggT" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/cells) "ghD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/commons/fitness) +"giy" = ( +/turf/open/floor/carpet/arcade, +/area/commons/arcade) +"giE" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/landmark/start/prisoner, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "permacells4"; + name = "Privacy Shutters"; + pixel_y = 25 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "giT" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -54672,6 +54886,20 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"got" = ( +/obj/structure/closet, +/obj/item/poster/random_contraband, +/obj/item/poster/random_contraband, +/obj/item/poster/random_contraband, +/turf/open/floor/plasteel, +/area/commons/locker) +"goJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) "gpD" = ( /obj/effect/turf_decal/bot_white/left, /obj/effect/turf_decal/tile/neutral{ @@ -54697,6 +54925,10 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) +"grd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, +/area/security/prison/upper) "grr" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -54721,12 +54953,6 @@ "gvX" = ( /turf/open/floor/plasteel/yellowsiding, /area/commons/fitness/pool) -"gwd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/circuit) "gxc" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -54748,10 +54974,46 @@ /obj/machinery/meter, /turf/closed/wall/r_wall, /area/engineering/atmos) +"gxK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "permacells3"; + name = "Privacy Shutters" + }, +/turf/open/floor/plating, +/area/security/prison/cells) "gyr" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/security/brig) +"gyy" = ( +/obj/machinery/door/airlock/security{ + name = "Isolation Cell"; + req_access_txt = "2" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) +"gyQ" = ( +/turf/open/floor/plasteel/freezer, +/area/commons/toilet) "gzf" = ( /obj/structure/window/reinforced/tinted{ dir = 8 @@ -54794,16 +55056,16 @@ /turf/open/floor/plasteel/dark, /area/command/gateway) "gDP" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 28 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, /obj/item/radio/intercom{ pixel_y = 20 }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, /turf/open/floor/plasteel, /area/security/processing) "gDZ" = ( @@ -54811,6 +55073,27 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/maintenance/starboard/aft) +"gER" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/service/theater) +"gFs" = ( +/obj/effect/landmark/start/assistant, +/obj/structure/chair{ + dir = 1 + }, +/obj/structure/sign/poster/contraband/lusty_xenomorph{ + pixel_x = 32 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/port/fore) "gGK" = ( /turf/open/floor/carpet/royalblue, /area/maintenance/starboard/aft) @@ -54849,6 +55132,29 @@ /obj/structure/bedsheetbin/towel, /turf/open/floor/wood/wood_diagonal, /area/maintenance/port/fore) +"gLu" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"gLw" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/landmark/start/clown, +/turf/open/floor/plasteel, +/area/service/theater) "gLz" = ( /obj/structure/cable{ icon_state = "1-2" @@ -54876,6 +55182,26 @@ }, /turf/open/floor/wood, /area/maintenance/bar) +"gMB" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/grunge{ + name = "Permanent Cell 6"; + wiretypepath = /datum/wires/airlock/security + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "gMD" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 6 @@ -54885,17 +55211,6 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) -"gNC" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/wood, -/area/command/meeting_room) "gNE" = ( /obj/structure/cable{ icon_state = "0-8" @@ -54907,41 +55222,40 @@ }, /turf/open/floor/plating, /area/security/brig) +"gOF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/structure/sign/poster/official/high_class_martini{ + pixel_x = -32 + }, +/mob/living/simple_animal/bot/mulebot{ + beacon_freq = 1400; + home_destination = "QM #1"; + name = "Massive Load"; + suffix = "#1" + }, +/turf/open/floor/carpet/royalblue, +/area/maintenance/starboard/aft) "gOZ" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, /turf/open/floor/plating, /area/commons/fitness) +"gPY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "gQr" = ( /obj/machinery/atmospherics/components/binary/valve/digital{ name = "gas to sauna" }, /turf/open/floor/plating, /area/maintenance/fore) -"gQX" = ( -/obj/machinery/button/door{ - id = "LockerShitter4"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 14; - pixel_y = 38; - specialfunctions = 4 - }, -/obj/structure/toilet/secret/low_loot{ - dir = 4 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/structure/sink{ - pixel_y = 25 - }, -/obj/structure/mirror{ - pixel_y = 32 - }, -/turf/open/floor/mineral/titanium/blue, -/area/commons/toilet/locker) "gRV" = ( /turf/open/floor/wood{ icon_state = "wood-broken6" @@ -54953,6 +55267,24 @@ }, /turf/open/floor/carpet, /area/service/library) +"gSj" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/grunge{ + name = "Permanent Cell 3"; + wiretypepath = /datum/wires/airlock/security + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "gTx" = ( /obj/effect/turf_decal/bot_white/left, /obj/effect/turf_decal/tile/neutral{ @@ -54974,6 +55306,11 @@ }, /turf/closed/wall/r_wall, /area/engineering/gravity_generator) +"gVc" = ( +/obj/machinery/vending/sustenance, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "gWd" = ( /obj/structure/cable{ icon_state = "1-4" @@ -54987,6 +55324,19 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"gXu" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "gYo" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -55000,6 +55350,13 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"gZB" = ( +/obj/item/clothing/mask/cigarette{ + pixel_x = -6; + pixel_y = 14 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "gZG" = ( /obj/structure/cable{ icon_state = "4-8" @@ -55011,6 +55368,18 @@ dir = 8 }, /area/medical/surgery) +"gZT" = ( +/obj/machinery/power/apc{ + areastring = "/area/maintenance/prison/port"; + dir = 8; + name = "Prison Port Maintenance APC"; + pixel_x = -25 + }, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/plating, +/area/maintenance/prison/port) "haM" = ( /obj/item/radio/intercom{ name = "Station Intercom (General)"; @@ -55042,6 +55411,21 @@ icon_state = "platingdmg1" }, /area/maintenance/starboard/aft) +"hch" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/prison/cells) "hcA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -55052,6 +55436,19 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel, /area/commons/fitness) +"hcT" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/solars/port/fore) "hgG" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/structure/extinguisher_cabinet{ @@ -55088,6 +55485,33 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"hkA" = ( +/obj/structure/table, +/obj/item/clothing/under/rank/prisoner/skirt{ + pixel_x = -13; + pixel_y = 5 + }, +/obj/item/clothing/under/rank/prisoner/skirt{ + pixel_x = 9; + pixel_y = 5 + }, +/obj/item/clothing/under/rank/prisoner{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/machinery/flasher{ + id = "waitingflash"; + pixel_y = -28 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"hlS" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/mineral/titanium/blue, +/area/commons/toilet) "hlT" = ( /obj/machinery/door/airlock/external{ name = "Labor Camp Shuttle Airlock"; @@ -55111,6 +55535,18 @@ }, /turf/open/floor/wood/wood_diagonal, /area/maintenance/port/fore) +"hnp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "hnU" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -55123,6 +55559,39 @@ }, /turf/open/floor/plating, /area/security/range) +"hoL" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/command/gateway) +"hpY" = ( +/obj/machinery/vr_sleeper{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "hrF" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -55147,11 +55616,52 @@ /obj/item/kirbyplants/random, /turf/open/floor/plating, /area/maintenance/port/fore) +"hty" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/command/gateway) +"hvC" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) +"hxg" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "hxn" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plating, /area/engineering/atmos) +"hzs" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/plate_press, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"hzC" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison/cells) "hzK" = ( /turf/open/floor/plasteel/yellowsiding/corner{ dir = 1 @@ -55174,6 +55684,13 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/port/fore) +"hEL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/security/execution/transfer) "hGH" = ( /obj/machinery/door/airlock{ desc = "Private study room where nerds are probably playing Dungeons and Dragons 13e, or a place for blood cult rituals."; @@ -55204,12 +55721,35 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"hJO" = ( +/obj/structure/closet/crate/trashcart, +/obj/effect/spawner/lootdrop/prison_contraband, +/obj/item/trash/chips, +/obj/item/trash/candy, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/security/prison/upper) +"hKo" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/spawner/structure/window/reinforced/tinted/electrochromatic{ + electrochromatic_id = "!permabrigshowers" + }, +/turf/open/floor/plating, +/area/security/prison/cells) "hMs" = ( /obj/structure/table, /obj/item/storage/box/bodybags, /obj/item/pen, /turf/open/floor/plasteel/dark, /area/medical/morgue) +"hNm" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/commons/locker) "hOv" = ( /obj/structure/table/wood/fancy, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -55219,13 +55759,6 @@ /obj/item/reagent_containers/food/snacks/burger/plain, /turf/open/floor/wood, /area/service/bar) -"hPs" = ( -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 23 - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/locker) "hPP" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -55235,6 +55768,21 @@ }, /turf/closed/wall, /area/cargo/warehouse) +"hQw" = ( +/obj/item/electropack/shockcollar, +/obj/item/assembly/signaler, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/prison/port) +"hQX" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable, +/turf/open/floor/plating, +/area/command/gateway) "hQY" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 6 @@ -55262,6 +55810,11 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plating, /area/service/abandoned_gambling_den) +"hSf" = ( +/obj/structure/cable, +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/solars/port/fore) "hSl" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -55293,11 +55846,6 @@ /obj/effect/spawner/structure/window/hollow/reinforced/directional, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"hUJ" = ( -/obj/structure/reagent_dispensers/beerkeg, -/obj/machinery/light/floor, -/turf/open/floor/carpet/royalblue, -/area/maintenance/starboard/aft) "hWd" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -55317,6 +55865,11 @@ "ibK" = ( /turf/open/floor/plasteel, /area/security/processing) +"icS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/prison/port) "idK" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -55341,18 +55894,30 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"igi" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +"ifM" = ( +/obj/machinery/shower{ + dir = 8; + pixel_y = -4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/closed/wall/r_wall, -/area/ai_monitored/turret_protected/ai_upload) +/turf/open/floor/plasteel/freezer, +/area/security/prison/cells) "ihR" = ( /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) +"ihS" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/cafeteria, +/area/commons/locker) "iiW" = ( /turf/open/floor/wood, /area/maintenance/bar) @@ -55387,6 +55952,18 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"ikv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/security/prison) "iky" = ( /obj/effect/turf_decal/weather/dirt, /obj/effect/decal/cleanable/dirt, @@ -55395,6 +55972,22 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"ili" = ( +/obj/structure/table, +/obj/item/electropack, +/obj/item/screwdriver, +/obj/item/wrench, +/obj/item/clothing/head/helmet, +/obj/item/assembly/signaler, +/obj/machinery/light/small, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_y = 23 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) "imk" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/orange/visible{ @@ -55442,6 +56035,21 @@ }, /turf/open/floor/plasteel, /area/commons/fitness/pool) +"iqi" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera{ + c_tag = "Prison Laundry"; + dir = 4; + network = list("ss13","prison") + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) "iql" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -55460,12 +56068,6 @@ /obj/machinery/holopad, /turf/open/floor/plasteel, /area/security/brig) -"itG" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/plasteel/white, -/area/science/circuit) "itK" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/maintenance{ @@ -55509,11 +56111,15 @@ /obj/structure/table/optable, /turf/open/floor/plasteel/white, /area/medical/surgery) -"ixd" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/beer, -/turf/open/floor/carpet/royalblue, -/area/maintenance/starboard/aft) +"iwU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "iyG" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small{ @@ -55534,12 +56140,44 @@ }, /turf/open/floor/wood, /area/maintenance/bar) +"iBj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/prison/starboard) +"iBq" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/prison/starboard) "iBv" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, /turf/open/floor/plasteel, /area/commons/fitness/pool) +"iCN" = ( +/obj/machinery/door/airlock{ + name = "Permabrig Showers" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "iDo" = ( /obj/structure/grille, /turf/open/space/basic, @@ -55616,6 +56254,14 @@ }, /turf/open/floor/plasteel, /area/commons/fitness/pool) +"iMy" = ( +/obj/structure/chair/sofa/right, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "iNn" = ( /obj/machinery/camera{ c_tag = "Kitchen Cold Room" @@ -55639,6 +56285,12 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"iQg" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "iRj" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -55791,6 +56443,24 @@ }, /turf/open/space, /area/space) +"jdu" = ( +/obj/structure/table, +/obj/machinery/light/floor, +/obj/machinery/light/floor, +/obj/item/clothing/glasses/sunglasses/reagent, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ + pixel_x = -5; + pixel_y = 12 + }, +/obj/item/storage/fancy/cigarettes/cigpack_uplift{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/structure/sign/poster/contraband/borg_fancy_2{ + pixel_y = -32 + }, +/turf/open/floor/carpet/royalblue, +/area/maintenance/starboard/aft) "jdE" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 1 @@ -55822,6 +56492,13 @@ /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"jfZ" = ( +/obj/machinery/computer/communications{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/wood, +/area/command/heads_quarters/captain) "jgm" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -55850,11 +56527,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) -"jjC" = ( -/obj/structure/table/wood, -/obj/item/toy/cards/deck, -/turf/open/floor/plasteel, -/area/security/prison) "jkx" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/machinery/computer/slot_machine, @@ -55871,6 +56543,20 @@ /obj/machinery/rnd/production/techfab/department/cargo, /turf/open/floor/plasteel, /area/cargo/office) +"jlQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/prison/port) +"jmL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai_upload) "jmV" = ( /obj/structure/table/wood/fancy, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -55881,6 +56567,9 @@ }, /turf/open/floor/plasteel, /area/commons/fitness) +"jnk" = ( +/turf/closed/wall/r_wall, +/area/maintenance/prison/starboard) "jnV" = ( /obj/structure/cable{ icon_state = "1-2" @@ -55904,10 +56593,42 @@ icon_state = "wood-broken7" }, /area/maintenance/bar) +"jqD" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/item/cigbutt{ + pixel_x = -12; + pixel_y = 22 + }, +/obj/item/cigbutt{ + pixel_x = -15; + pixel_y = 16 + }, +/turf/open/floor/carpet/arcade, +/area/commons/arcade) +"jqK" = ( +/obj/structure/rack, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/clothing/mask/breath, +/obj/effect/spawner/lootdrop/prison_contraband, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/prison/starboard) "jrE" = ( /obj/item/beacon, /turf/open/floor/plasteel/white, /area/science/circuit) +"jrR" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "jsO" = ( /obj/machinery/hydroponics/soil{ pixel_y = 8 @@ -55945,10 +56666,63 @@ /obj/structure/closet/athletic_mixed, /turf/open/floor/plasteel, /area/commons/fitness) +"jvB" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"jvO" = ( +/obj/structure/rack, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/item/tank/internals/anesthetic{ + pixel_x = -3; + pixel_y = 1 + }, +/obj/item/tank/internals/oxygen/red{ + pixel_x = 3 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple{ + dir = 6 + }, +/turf/open/floor/plating, +/area/security/execution/transfer) "jwH" = ( /obj/machinery/holopad, /turf/open/floor/plasteel, /area/service/hydroponics) +"jxx" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/public/glass{ + name = "Prison Yard" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) "jxF" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -56015,18 +56789,18 @@ /obj/machinery/atmospherics/pipe/manifold4w/general/visible, /turf/open/floor/plasteel, /area/engineering/atmos) -"jCq" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, +"jBZ" = ( /obj/structure/cable{ - icon_state = "1-4" + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) +/obj/effect/landmark/start/mime, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/service/theater) "jDr" = ( /obj/machinery/door/poddoor/preopen{ id = "atmos"; @@ -56103,6 +56877,23 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"jHp" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "jHt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment{ @@ -56138,6 +56929,19 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"jIH" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "jIW" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -56152,6 +56956,37 @@ }, /turf/open/floor/wood, /area/maintenance/port/aft) +"jJP" = ( +/obj/structure/sign/warning/securearea{ + pixel_x = 32 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"jKc" = ( +/obj/structure/closet/secure_closet/injection, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/power/apc{ + areastring = "/area/security/execution/transfer"; + dir = 1; + name = "Prisoner Transfer Centre"; + pixel_y = 23 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) +"jKm" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "jKP" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -56173,12 +57008,6 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plasteel, /area/engineering/engine_smes) -"jLv" = ( -/obj/structure/sign/warning/securearea{ - pixel_x = 32 - }, -/turf/open/space, -/area/space) "jLJ" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/light/small, @@ -56201,12 +57030,88 @@ }, /turf/open/floor/plasteel, /area/commons/fitness/pool) -"jRw" = ( -/obj/machinery/computer/arcade/minesweeper{ - dir = 4 +"jNr" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/obj/item/cigbutt{ + pixel_x = -15; + pixel_y = 16 + }, +/turf/open/floor/plating/rust, +/area/maintenance/port/fore) +"jNN" = ( +/obj/structure/cable{ + icon_state = "1-8" }, /turf/open/floor/plasteel, /area/security/prison) +"jOB" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Prison Forestry" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) +"jRw" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"jRV" = ( +/turf/open/floor/plasteel, +/area/security/prison) +"jRW" = ( +/obj/item/reagent_containers/glass/bucket, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sink{ + dir = 8; + pixel_x = -12 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"jSD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "jSO" = ( /obj/machinery/light{ dir = 4 @@ -56216,6 +57121,39 @@ }, /turf/open/floor/plasteel, /area/science/circuit) +"jSY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"jTy" = ( +/obj/machinery/washing_machine, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) +"jUN" = ( +/obj/structure/table/reinforced, +/obj/structure/reagent_dispensers/servingdish, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "jUV" = ( /obj/structure/cable{ icon_state = "1-2" @@ -56232,6 +57170,22 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"jVP" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) +"jVV" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "jVX" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -56243,6 +57197,13 @@ dir = 1 }, /area/engineering/atmos) +"jYl" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "jZT" = ( /obj/structure/cable{ icon_state = "4-8" @@ -56283,6 +57244,43 @@ /obj/machinery/atmospherics/pipe/simple/dark/visible, /turf/open/space/basic, /area/space/nearstation) +"kcB" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/camera{ + c_tag = "Prison Isolation Cell"; + dir = 8; + network = list("ss13","prison"); + view_range = 5 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/security/execution/transfer) +"kcR" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "permacells4"; + name = "Privacy Shutters"; + pixel_y = 25 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "kdF" = ( /obj/structure/window/reinforced{ dir = 1 @@ -56317,15 +57315,23 @@ /turf/open/floor/plasteel, /area/commons/dorms) "keM" = ( -/obj/machinery/light/small{ - dir = 1 +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "Prison Gate"; + name = "prison blast door" }, -/obj/structure/window/reinforced{ - dir = 8 +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/machinery/washing_machine, -/turf/open/floor/plasteel/freezer, -/area/security/prison) +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Prison Gate"; + name = "Prison Lockdown Shutters" + }, +/turf/open/floor/plating, +/area/security/prison/upper) "kfv" = ( /obj/structure/cable{ icon_state = "4-8" @@ -56335,6 +57341,16 @@ }, /turf/open/floor/plating, /area/engineering/storage/tech) +"kfG" = ( +/obj/structure/table/wood, +/obj/item/toy/cards/deck, +/obj/item/instrument/harmonica, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "kfS" = ( /turf/closed/wall/rust, /area/maintenance/starboard/aft) @@ -56350,12 +57366,25 @@ }, /area/maintenance/starboard) "kgr" = ( -/obj/machinery/light/small{ - brightness = 3; +/obj/machinery/cryopod{ dir = 8 }, -/turf/open/floor/plating, -/area/security/prison) +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) +"kgB" = ( +/obj/machinery/vending/snack/orange, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/wood, +/area/service/bar) "khb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -56373,6 +57402,22 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) +"khO" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security{ + aiControlDisabled = 1; + name = "Prisoner Transfer Centre"; + req_access_txt = "2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) "khV" = ( /obj/machinery/vending/cola/red, /obj/structure/sign/poster/contraband/robust_softdrinks{ @@ -56381,6 +57426,22 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"kic" = ( +/obj/structure/table, +/obj/item/circuitboard/machine/paystand{ + pixel_x = 5; + pixel_y = -5 + }, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 3; + name = "3maintenance loot spawner" + }, +/turf/open/floor/plasteel, +/area/commons/locker) "kil" = ( /obj/machinery/atmospherics/pipe/simple/dark/visible{ dir = 5 @@ -56406,6 +57467,20 @@ }, /turf/open/floor/plating, /area/hallway/secondary/entry) +"kkb" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"kkK" = ( +/obj/machinery/vending/autodrobe, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/service/theater) "klN" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -56413,6 +57488,16 @@ /obj/structure/grille, /turf/open/floor/plating, /area/maintenance/port/fore) +"kma" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/security/prison/cells) "kmw" = ( /obj/structure/chair/comfy/black{ dir = 1 @@ -56450,6 +57535,27 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"knA" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/prison/cells) "kob" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment, @@ -56471,10 +57577,27 @@ /obj/machinery/gear_painter, /turf/open/floor/plasteel, /area/commons/fitness) -"kqI" = ( -/obj/structure/window, -/turf/open/floor/wood, -/area/service/bar) +"ksa" = ( +/obj/structure/closet/secure_closet/brig, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/bot_white, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) "ktP" = ( /obj/machinery/power/smes{ charge = 5e+006 @@ -56490,6 +57613,17 @@ "ktS" = ( /turf/open/space/basic, /area/space/nearstation) +"ktW" = ( +/obj/machinery/hydroponics/soil, +/obj/item/plant_analyzer, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "kuh" = ( /obj/structure/cable{ icon_state = "4-8" @@ -56503,6 +57637,19 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"kuw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/commons/arcade"; + dir = 8; + name = "Arcade Room"; + pixel_x = -25 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "kuA" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/item/radio/intercom{ @@ -56514,10 +57661,6 @@ /obj/item/trash/candy, /turf/open/floor/plating, /area/maintenance/port/fore) -"kvl" = ( -/obj/structure/grille, -/turf/closed/wall/r_wall, -/area/space/nearstation) "kvL" = ( /obj/structure/cable{ icon_state = "1-2" @@ -56556,6 +57699,15 @@ /obj/effect/landmark/xeno_spawn, /turf/open/floor/wood, /area/maintenance/bar) +"kzn" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/command/gateway) "kzT" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, @@ -56605,10 +57757,31 @@ /mob/living/simple_animal/opossum/poppy, /turf/open/floor/plating, /area/maintenance/port/aft) +"kEJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/wood, +/area/service/bar) "kEY" = ( /obj/effect/landmark/stationroom/box/engine, /turf/open/space/basic, /area/space) +"kGj" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "kGv" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible, /obj/machinery/atmospherics/pipe/simple/dark/visible{ @@ -56632,6 +57805,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"kGL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/maintenance/prison/starboard) "kHd" = ( /obj/structure/cable{ icon_state = "1-2" @@ -56664,6 +57842,36 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"kLK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) +"kMn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera{ + c_tag = "Permabrig North"; + dir = 4; + network = list("ss13","prison") + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/disposaloutlet{ + dir = 4; + name = "Prisoner Delivery" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/window/reinforced, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) "kMt" = ( /obj/machinery/computer/prisoner/gulag_teleporter_computer, /turf/open/floor/plasteel, @@ -56683,6 +57891,14 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"kOE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel, +/area/security/prison/upper) "kOL" = ( /obj/structure/table/glass, /turf/open/floor/wood/wood_large, @@ -56694,6 +57910,14 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) +"kPi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/light/small/broken{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "kPj" = ( /obj/structure/cable{ icon_state = "1-2" @@ -56787,6 +58011,24 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"kYm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/structure/chair/stool, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "kZS" = ( /obj/machinery/light{ dir = 8 @@ -56820,6 +58062,27 @@ }, /turf/closed/wall/r_wall, /area/command/gateway) +"ldT" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) +"ldY" = ( +/obj/machinery/door/airlock/security{ + name = "Firing Range"; + req_access_txt = "2" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/security/prison) "leE" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -56835,6 +58098,16 @@ /obj/effect/decal/cleanable/blood/gibs/human/body, /turf/open/floor/plasteel/dark, /area/maintenance/starboard/aft) +"lfu" = ( +/obj/machinery/light/small, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/structure/urinal{ + pixel_y = 32 + }, +/turf/open/floor/mineral/titanium/blue, +/area/commons/toilet) "lfV" = ( /obj/structure/cable{ icon_state = "4-8" @@ -56860,6 +58133,13 @@ }, /turf/open/floor/plasteel, /area/commons/dorms) +"lht" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) "lhQ" = ( /obj/machinery/power/floodlight, /obj/structure/cable{ @@ -56867,6 +58147,20 @@ }, /turf/open/floor/plating, /area/engineering/atmos) +"lic" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "lip" = ( /obj/structure/closet{ name = "Suit Closet" @@ -56892,6 +58186,12 @@ /obj/item/clothing/under/rank/civilian/lawyer/red, /turf/open/floor/plasteel, /area/commons/locker) +"liJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) "ljV" = ( /obj/machinery/airalarm{ dir = 8; @@ -56903,18 +58203,27 @@ }, /turf/open/floor/plasteel, /area/command/gateway) -"lld" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 +"lkT" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"llb" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/structure/cable{ + icon_state = "1-2" }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-8" }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/closed/wall/r_wall, -/area/ai_monitored/turret_protected/ai_upload) +/turf/open/floor/plasteel, +/area/security/prison/upper) "lnk" = ( /obj/item/radio/intercom{ pixel_y = 25 @@ -56929,6 +58238,20 @@ icon_state = "wood-broken6" }, /area/maintenance/bar) +"lpx" = ( +/obj/structure/window, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/security/prison/upper) +"lpQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/command/gateway) "lqO" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -56958,6 +58281,44 @@ /obj/machinery/vending/kink, /turf/open/floor/plasteel, /area/commons/fitness) +"lsS" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"ltm" = ( +/obj/structure/chair/comfy/brown{ + color = "#66b266"; + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"ltv" = ( +/mob/living/simple_animal/bot/cleanbot{ + name = "Honest Work" + }, +/turf/open/floor/carpet/royalblue, +/area/maintenance/starboard/aft) +"ltw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "ltK" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -56970,12 +58331,60 @@ }, /turf/open/floor/plasteel, /area/commons/dorms) +"lux" = ( +/obj/structure/closet/crate/hydroponics, +/obj/item/paper/guides/jobs/hydroponics, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/item/seeds/onion, +/obj/item/seeds/garlic, +/obj/item/seeds/potato, +/obj/item/seeds/tomato, +/obj/item/seeds/carrot, +/obj/item/seeds/grass, +/obj/item/seeds/ambrosia, +/obj/item/seeds/wheat, +/obj/item/seeds/pumpkin, +/obj/effect/spawner/lootdrop/prison_contraband, +/turf/open/floor/plasteel, +/area/security/prison/upper) "lva" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 }, /turf/open/floor/plasteel, /area/service/hydroponics) +"lvc" = ( +/obj/structure/window/reinforced/tinted{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"lvw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "permacells6"; + name = "Privacy Shutters" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/security/prison/cells) "lwN" = ( /obj/structure/cable{ icon_state = "1-8" @@ -57001,6 +58410,25 @@ /obj/structure/sign/nanotrasen, /turf/closed/wall, /area/science/circuit) +"lAD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera{ + c_tag = "Prison Cell Block Central"; + dir = 1; + network = list("ss13","prison") + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/cells) "lAH" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -57020,6 +58448,26 @@ dir = 1 }, /area/hallway/secondary/entry) +"lBk" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Prison Yard" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) "lBz" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -57043,6 +58491,50 @@ }, /turf/open/floor/plasteel, /area/commons/fitness/pool) +"lCt" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"lDm" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/security/prison/cells) +"lEf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "permacells4"; + name = "Privacy Shutters" + }, +/turf/open/floor/plating, +/area/security/prison/cells) +"lGm" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/freezer, +/area/security/prison/cells) "lGV" = ( /obj/machinery/button/door{ id = "maintdiy"; @@ -57052,6 +58544,23 @@ }, /turf/open/floor/plating, /area/service/abandoned_gambling_den) +"lHK" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel, +/area/security/prison/cells) +"lJA" = ( +/turf/closed/wall, +/area/security/prison/cells) "lJC" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -57061,6 +58570,13 @@ }, /turf/open/floor/plating, /area/security/office) +"lJS" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/security/prison) "lKj" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 @@ -57070,6 +58586,23 @@ "lLf" = ( /turf/closed/wall/r_wall, /area/ai_monitored/command/nuke_storage) +"lLu" = ( +/obj/structure/chair/stool, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"lLA" = ( +/obj/machinery/computer/slot_machine{ + balance = 15; + money = 500 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "lMg" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -57095,12 +58628,39 @@ }, /turf/open/floor/plasteel, /area/security/processing) +"lNQ" = ( +/obj/machinery/light{ + dir = 1; + light_color = "#d1dfff" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"lOr" = ( +/obj/structure/table, +/obj/machinery/light/floor, +/obj/item/reagent_containers/food/drinks/beer{ + pixel_x = -6 + }, +/obj/item/reagent_containers/blood/oilblood{ + pixel_x = 7 + }, +/turf/open/floor/carpet/royalblue, +/area/maintenance/starboard/aft) "lPr" = ( /obj/item/kirbyplants{ icon_state = "applebush" }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"lPG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/item/soap, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet) "lQG" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -57136,11 +58696,58 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/carpet, /area/commons/dorms) +"lUU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"lVy" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"lWD" = ( +/obj/effect/decal/cleanable/vomit/old, +/turf/open/floor/carpet/arcade, +/area/commons/arcade) "lXy" = ( /obj/machinery/light, /obj/item/light/tube/broken, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"lYI" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/cells) +"lZa" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/door/window/westright{ + name = "Red Corner" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/commons/locker) "lZl" = ( /obj/structure/closet, /obj/effect/spawner/lootdrop/maintenance, @@ -57162,6 +58769,17 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/security/brig) +"lZp" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/cells) "lZs" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet, @@ -57181,10 +58799,54 @@ }, /turf/open/floor/wood/wood_diagonal, /area/maintenance/port/fore) +"mau" = ( +/obj/machinery/power/apc{ + areastring = "/area/service/theater"; + dir = 8; + name = "Theatre APC"; + pixel_x = -25 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/service/theater) +"maP" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/cells) "maT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/maintenance/disposal/incinerator) +"maU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"mbC" = ( +/turf/closed/wall/r_wall, +/area/security/execution/transfer) "mbU" = ( /obj/machinery/vr_sleeper{ dir = 8 @@ -57204,6 +58866,16 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/security/range) +"mcE" = ( +/obj/machinery/vending/cigarette, +/obj/effect/decal/cleanable/cobweb{ + icon_state = "cobweb2" + }, +/obj/structure/sign/poster/contraband/fun_police{ + pixel_x = 32 + }, +/turf/open/floor/carpet/arcade, +/area/commons/arcade) "meb" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/bed, @@ -57218,10 +58890,59 @@ /obj/structure/bed, /turf/open/floor/plasteel, /area/commons/fitness/pool) +"mhv" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Visitation Observation"; + req_access_txt = "2" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) "mjr" = ( /obj/structure/reagent_dispensers/keg/milk, /turf/open/floor/wood, /area/service/bar) +"mjJ" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) +"mke" = ( +/obj/machinery/camera{ + c_tag = "Prison Common Room"; + dir = 8; + network = list("ss13","prison") + }, +/obj/machinery/vr_sleeper{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "mkv" = ( /obj/machinery/camera{ c_tag = "Gravity Generator Room"; @@ -57233,13 +58954,6 @@ }, /turf/open/floor/plasteel, /area/engineering/gravity_generator) -"mkO" = ( -/obj/machinery/door/airlock{ - name = "Shower Room" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/dark, -/area/commons/toilet) "mkU" = ( /obj/machinery/door/airlock/external{ name = "Labor Camp Shuttle Airlock" @@ -57264,11 +58978,35 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) +"mmx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/locker) +"mnu" = ( +/obj/machinery/cryopod{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "mnC" = ( /obj/structure/target_stake, /obj/item/target/syndicate, /turf/open/floor/plating, /area/security/range) +"moe" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) "mos" = ( /obj/machinery/light/small{ dir = 8 @@ -57326,6 +59064,17 @@ icon_state = "wood-broken5" }, /area/maintenance/bar) +"mpY" = ( +/obj/item/reagent_containers/glass/bucket, +/obj/item/mop, +/obj/item/reagent_containers/glass/bottle/ammonia, +/obj/structure/sink{ + dir = 4; + pixel_x = 12 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/security/prison/upper) "mqo" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -57337,6 +59086,25 @@ dir = 1 }, /area/hallway/secondary/entry) +"mqH" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters{ + id = "commissaryshutters"; + name = "Vacant Commissary Shutters" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/commons/locker) +"mqQ" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/maintenance/prison/port) "mqZ" = ( /obj/item/reagent_containers/glass/beaker, /turf/open/floor/plating, @@ -57345,17 +59113,58 @@ /obj/effect/spawner/lootdrop/keg, /turf/open/floor/wood, /area/maintenance/bar) +"msp" = ( +/obj/machinery/computer/arcade/orion_trail, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"mte" = ( +/obj/structure/closet/crate, +/obj/item/reagent_containers/glass/bowl, +/obj/item/reagent_containers/glass/bowl, +/obj/item/reagent_containers/glass/bowl, +/obj/item/reagent_containers/glass/bowl, +/obj/item/reagent_containers/glass/bowl, +/obj/item/reagent_containers/glass/bowl, +/obj/item/reagent_containers/glass/bowl, +/obj/item/reagent_containers/glass/bowl, +/obj/item/storage/box/drinkingglasses, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/box/drinkingglasses, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/security/prison/upper) "mtU" = ( /obj/structure/sign/departments/holy, /turf/closed/wall, /area/service/chapel/main) -"mug" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +"mui" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Prison Common Room" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/mob/living/simple_animal/bot/mulebot, -/turf/open/floor/carpet/royalblue, -/area/maintenance/starboard/aft) +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) +"muv" = ( +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/obj/machinery/shower, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet) "mvt" = ( /obj/machinery/airalarm{ dir = 1; @@ -57363,6 +59172,49 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"mvV" = ( +/obj/effect/spawner/lootdrop/prison_contraband, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/bed{ + dir = 8 + }, +/obj/item/bedsheet/red{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) +"mwj" = ( +/obj/structure/noticeboard{ + dir = 8; + pixel_x = 27 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/wood, +/area/command/meeting_room) +"mwN" = ( +/obj/structure/chair/sofa/left, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "mwS" = ( /turf/open/floor/plating{ icon_state = "platingdmg3" @@ -57377,6 +59229,33 @@ }, /turf/open/floor/plating, /area/security/office) +"mxZ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/closet/crate/trashcart/laundry, +/obj/item/clothing/under/rank/prisoner, +/obj/item/clothing/under/rank/prisoner, +/obj/item/clothing/under/rank/prisoner/skirt, +/obj/item/clothing/under/rank/prisoner/skirt, +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/shoes/sneakers/orange{ + pixel_y = 8 + }, +/obj/item/clothing/shoes/sneakers/orange{ + pixel_y = 8 + }, +/obj/item/clothing/shoes/sneakers/orange{ + pixel_y = 8 + }, +/obj/item/clothing/shoes/sneakers/orange{ + pixel_y = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) "myh" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -57396,12 +59275,44 @@ }, /turf/open/floor/wood, /area/service/theater) +"mzT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/coffee, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "mAH" = ( /obj/machinery/atmospherics/components/unary/tank/air{ dir = 8 }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"mAT" = ( +/obj/machinery/shower{ + dir = 8; + pixel_y = -4 + }, +/turf/open/floor/plasteel/freezer, +/area/security/prison/cells) +"mCm" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating, +/area/security/execution/transfer) +"mCo" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) "mDZ" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -57457,6 +59368,18 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"mHH" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "mHU" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/light_construct{ @@ -57465,9 +59388,13 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "mIZ" = ( -/obj/structure/falsewall, -/turf/open/floor/plating, -/area/security/prison) +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "mJf" = ( /obj/structure/cable{ icon_state = "0-8" @@ -57486,20 +59413,21 @@ /obj/item/electronics/airlock, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"mJG" = ( -/obj/machinery/light{ - dir = 4; - light_color = "#c1caff" +"mJy" = ( +/obj/structure/table, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/item/restraints/handcuffs, +/obj/item/taperecorder, +/obj/item/folder/red, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) +"mJH" = ( +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced/tinted/electrochromatic{ + electrochromatic_id = "!permabrigshowers" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/wood, -/area/service/theater) +/turf/open/floor/plating, +/area/security/prison/cells) "mLS" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating{ @@ -57614,6 +59542,13 @@ }, /turf/open/floor/plasteel, /area/commons/locker) +"mZu" = ( +/obj/machinery/door/airlock{ + name = "Cleaning Closet" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/security/prison/upper) "mZx" = ( /obj/structure/table/glass, /obj/item/storage/box/matches{ @@ -57622,6 +59557,18 @@ }, /turf/open/floor/wood/wood_large, /area/service/chapel/main) +"naj" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "executionfireblast" + }, +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/security/execution/transfer) "naI" = ( /turf/open/space, /area/space/station_ruins) @@ -57666,6 +59613,35 @@ }, /turf/open/floor/plasteel/dark, /area/security/brig) +"ncg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/shower{ + dir = 1 + }, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet) +"ncU" = ( +/obj/structure/window/reinforced/tinted{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters{ + id = "visitation"; + name = "Visitation Shutters" + }, +/obj/structure/window/reinforced, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) "ndq" = ( /turf/open/floor/plating, /area/service/abandoned_gambling_den) @@ -57690,6 +59666,18 @@ /obj/machinery/vending/autodrobe, /turf/open/floor/wood, /area/maintenance/bar) +"ngq" = ( +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/prison/upper) "ngs" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -57720,6 +59708,26 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"nko" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/landmark/start/prisoner, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/button/door{ + id = "permacells2"; + name = "Privacy Shutters"; + pixel_x = 25 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "nkP" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance{ @@ -57770,17 +59778,53 @@ }, /turf/open/floor/plasteel/dark, /area/maintenance/starboard/fore) +"noJ" = ( +/obj/structure/closet/secure_closet/brig, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/plasteel/dark, +/area/security/prison) "noL" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, /turf/open/floor/plating, /area/maintenance/port/fore) +"noR" = ( +/obj/structure/sink/kitchen{ + pixel_y = 28 + }, +/obj/structure/chair/stool, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/security/prison/upper) "noT" = ( /turf/open/floor/wood{ icon_state = "wood-broken4" }, /area/maintenance/starboard/aft) +"nqu" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/security/prison/upper) "nsf" = ( /obj/structure/cable/white{ icon_state = "0-2" @@ -57839,6 +59883,19 @@ "nyi" = ( /turf/closed/wall, /area/medical/paramedic) +"nyn" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "nzB" = ( /obj/machinery/hydroponics/soil{ pixel_y = 8 @@ -57859,6 +59916,20 @@ }, /turf/closed/wall, /area/maintenance/port/fore) +"nDd" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "nEj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external{ @@ -57876,6 +59947,21 @@ }, /turf/open/space/basic, /area/space/nearstation) +"nFA" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/security/prison/cells) "nGf" = ( /obj/machinery/hydroponics/constructable, /obj/machinery/light{ @@ -57894,6 +59980,11 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"nGR" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/computer/arcade, +/turf/open/floor/carpet/arcade, +/area/commons/arcade) "nJP" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 5 @@ -57935,6 +60026,21 @@ }, /turf/open/floor/plasteel, /area/commons/locker) +"nLP" = ( +/obj/item/storage/bag/trash, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/security/prison/upper) +"nNF" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/wood, +/area/service/bar) +"nPr" = ( +/obj/item/broken_bottle, +/turf/open/floor/plating, +/area/maintenance/port/fore) "nQi" = ( /obj/machinery/recharge_station, /turf/open/floor/plating, @@ -57948,6 +60054,24 @@ }, /turf/open/floor/wood, /area/maintenance/starboard/aft) +"nRO" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/grunge{ + name = "Permanent Cell 2"; + wiretypepath = /datum/wires/airlock/security + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "nSt" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -57960,6 +60084,11 @@ }, /turf/open/floor/plasteel, /area/commons/dorms) +"nSI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel/white, +/area/security/prison/upper) "nTG" = ( /obj/structure/chair{ dir = 1 @@ -57981,6 +60110,9 @@ }, /turf/open/floor/plasteel, /area/service/hydroponics) +"nVz" = ( +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai_upload) "nXg" = ( /obj/structure/girder, /obj/structure/grille, @@ -58014,6 +60146,16 @@ /obj/machinery/atmospherics/pipe/simple/dark/visible, /turf/open/space, /area/space/nearstation) +"nZs" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "nZE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral, @@ -58048,6 +60190,22 @@ /obj/item/clothing/head/hardhat/cakehat, /turf/open/floor/wood, /area/service/bar) +"obq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/security/prison/upper) +"obs" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/padded, +/area/security/execution/transfer) "oby" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -58100,6 +60258,12 @@ }, /turf/open/floor/plasteel, /area/commons/fitness/pool) +"oiY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "okK" = ( /obj/machinery/light/small{ dir = 8 @@ -58156,6 +60320,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/science/circuit) +"olH" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/prison_contraband, +/turf/open/floor/plasteel/white, +/area/security/prison/upper) "omk" = ( /obj/machinery/atmospherics/pipe/manifold/cyan/visible{ dir = 1 @@ -58181,41 +60350,33 @@ /obj/machinery/holopad, /turf/open/floor/plasteel, /area/security/prison) -"omY" = ( -/obj/machinery/button/door{ - id = "LockerShitter3"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 14; - pixel_y = 38; - specialfunctions = 4 - }, -/obj/structure/toilet/secret/low_loot{ +"ooF" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/structure/sink{ - pixel_y = 25 - }, -/obj/structure/mirror{ - pixel_y = 32 - }, -/turf/open/floor/mineral/titanium/blue, -/area/commons/toilet/locker) -"opg" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, +/obj/effect/decal/cleanable/dirt, /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/cable{ - icon_state = "2-8" +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 }, -/turf/closed/wall/r_wall, -/area/ai_monitored/turret_protected/ai_upload) +/turf/open/floor/plasteel, +/area/security/prison/upper) +"oqf" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/cells) "oqj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -58237,6 +60398,25 @@ }, /turf/open/floor/plasteel, /area/engineering/gravity_generator) +"oss" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/security/prison/cells) +"otC" = ( +/obj/machinery/status_display/evac, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai_upload) "ouf" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 @@ -58270,6 +60450,19 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"owx" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/cafeteria, +/area/commons/locker) "oxm" = ( /obj/structure/flora/ausbushes/fullgrass, /obj/structure/flora/ausbushes/sparsegrass, @@ -58312,12 +60505,22 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) -"oAb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +"ozh" = ( +/obj/machinery/door/window/eastright{ + dir = 8; + name = "Holding Cell"; + req_access_txt = "2" }, -/turf/closed/wall, -/area/service/bar) +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/button/flasher{ + id = "waitingflash"; + pixel_x = 6; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/security/prison) "oAB" = ( /obj/structure/fireplace{ pixel_y = -6 @@ -58344,6 +60547,12 @@ /obj/machinery/gulag_teleporter, /turf/open/floor/plasteel, /area/security/prison) +"oDD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/service/bar) "oDN" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -58366,12 +60575,11 @@ "oHB" = ( /turf/open/floor/plasteel/dark, /area/commons/dorms) -"oHU" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, +"oIl" = ( +/obj/structure/weightmachine/weightlifter, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, -/area/science/circuit) +/area/security/prison/upper) "oIJ" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -58400,6 +60608,14 @@ }, /turf/open/floor/wood, /area/maintenance/bar) +"oKB" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "oLl" = ( /obj/structure/cable{ icon_state = "4-8" @@ -58417,6 +60633,19 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"oPY" = ( +/obj/structure/window/reinforced/tinted{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "oQP" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/grimy, @@ -58427,17 +60656,20 @@ }, /turf/closed/wall, /area/medical/medbay/central) -"oSl" = ( -/obj/machinery/door/airlock/security{ - name = "Firing Range"; - req_access_txt = "2" +"oTx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "permacells2"; + name = "Privacy Shutters" }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/security/range) +/turf/open/floor/plating, +/area/security/prison/cells) +"oTH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/shower, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet) "oTW" = ( /obj/machinery/light{ dir = 1 @@ -58455,10 +60687,22 @@ /obj/machinery/disposal/bin, /turf/open/floor/plasteel/white, /area/science/circuit) +"oUF" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/security/prison/upper) "oVo" = ( /obj/structure/pool/ladder, /turf/open/pool, /area/commons/fitness/pool) +"oVL" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "oVN" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/manifold/cyan/visible, @@ -58470,11 +60714,28 @@ }, /turf/closed/wall/r_wall, /area/engineering/atmos) -"oYQ" = ( -/obj/structure/chair/stool, -/mob/living/simple_animal/bot/medbot, -/turf/open/floor/carpet/royalblue, -/area/maintenance/starboard/aft) +"oXV" = ( +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters{ + id = "visitation"; + name = "Visitation Shutters" + }, +/obj/structure/window/reinforced, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) "oZl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/closet/wardrobe/pjs, @@ -58495,11 +60756,11 @@ /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/maintenance/aft) -"pcK" = ( -/mob/living/simple_animal/bot/cleanbot{ - name = "C.L.E.A.N." +"pcz" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 }, -/turf/open/floor/light/colour_cycle/dancefloor_a, +/turf/open/floor/carpet/royalblue, /area/maintenance/starboard/aft) "pcQ" = ( /obj/effect/turf_decal/tile/neutral{ @@ -58527,6 +60788,27 @@ }, /turf/open/floor/wood, /area/service/library) +"peD" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"peE" = ( +/obj/structure/table/reinforced, +/obj/structure/reagent_dispensers/servingdish, +/turf/open/floor/plasteel, +/area/security/prison/upper) "pgf" = ( /turf/open/floor/mineral/titanium/blue, /area/commons/dorms) @@ -58536,6 +60818,23 @@ }, /turf/open/floor/plating, /area/security/range) +"pgq" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Prison Common Room" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) "pgZ" = ( /obj/structure/cable{ icon_state = "1-2" @@ -58582,15 +60881,6 @@ /obj/effect/decal/cleanable/blood/gibs/core, /turf/open/floor/plasteel/dark, /area/maintenance/starboard/aft) -"plC" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/wood, -/area/service/bar) "plS" = ( /obj/machinery/door/window/brigdoor/security/cell{ id = "Cell 1"; @@ -58611,6 +60901,32 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"pnb" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) +"pnc" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/window{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/commons/locker) "poc" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -58655,6 +60971,19 @@ }, /turf/open/floor/wood/wood_diagonal, /area/maintenance/port/fore) +"pry" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/solars/port/fore) "psf" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/structure/sign/poster/official/the_owl{ @@ -58710,18 +61039,12 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) -"pyC" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "1-4" +"pwF" = ( +/obj/machinery/shower{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/command/gateway) +/turf/open/floor/plasteel/freezer, +/area/security/prison/cells) "pzG" = ( /obj/item/radio/intercom{ name = "Station Intercom (General)"; @@ -58738,6 +61061,12 @@ }, /turf/open/floor/plating, /area/maintenance/disposal/incinerator) +"pzP" = ( +/obj/structure/sign/poster/contraband/punch_shit{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "pAK" = ( /obj/machinery/door/window/brigdoor/security/cell{ id = "Cell 3"; @@ -58761,6 +61090,18 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"pBd" = ( +/obj/machinery/power/apc{ + areastring = "/area/maintenance/prison/starboard"; + dir = 8; + name = "Prison Starboard Maintenance APC"; + pixel_x = -25 + }, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/plating, +/area/maintenance/prison/starboard) "pBp" = ( /obj/effect/landmark/event_spawn, /turf/closed/wall, @@ -58772,6 +61113,13 @@ }, /turf/open/floor/plating, /area/engineering/atmos) +"pCE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/science/circuit) "pDe" = ( /obj/machinery/door/window/southright{ name = "Target Storage" @@ -58787,6 +61135,24 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"pFj" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 4; + light_color = "#d8b1b1" + }, +/turf/open/floor/plasteel, +/area/security/execution/transfer) +"pFt" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/security/prison/cells) "pFY" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -58796,6 +61162,21 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"pGs" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/prison/starboard) +"pGA" = ( +/obj/machinery/hydroponics/soil, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/security/prison/upper) "pHl" = ( /obj/structure/table, /obj/item/storage/box/beakers{ @@ -58831,6 +61212,15 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"pHK" = ( +/obj/machinery/camera{ + c_tag = "Prison Yard"; + dir = 4; + network = list("ss13","prison") + }, +/obj/structure/chair/stool, +/turf/open/floor/plasteel, +/area/security/prison/upper) "pHO" = ( /obj/effect/turf_decal/tile/blue, /obj/structure/sign/poster/contraband/fun_police{ @@ -58838,15 +61228,28 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"pIf" = ( -/obj/effect/turf_decal/tile/blue{ +"pIR" = ( +/obj/structure/closet/secure_closet/brig, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel/white/side{ +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/area/service/theater/clown) +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/bot_white, +/obj/machinery/camera{ + c_tag = "Prison Hallway West"; + network = list("ss13","prison") + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) "pJR" = ( /obj/structure/disposalpipe/segment, /obj/structure/chair/comfy/brown{ @@ -58871,6 +61274,13 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/hallway/primary/port) +"pNS" = ( +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/turf/open/floor/plasteel, +/area/commons/locker) "pPi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -58883,6 +61293,14 @@ }, /turf/open/floor/plasteel, /area/commons/fitness) +"pPE" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "permacells1"; + name = "Privacy Shutters" + }, +/turf/open/floor/plating, +/area/security/prison/cells) "pPI" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -58908,6 +61326,25 @@ "pQN" = ( /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"pRi" = ( +/obj/structure/table, +/obj/item/razor, +/obj/item/toy/plush/borgplushie{ + desc = "A horrible abomination to God in plushie form. Legends say this is used to torture prisoners by repeatedly beating them in the head with it.. ..It feels sorta heavy."; + force = 1; + name = "dogborg plushie"; + throwforce = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) "pRj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 @@ -58932,6 +61369,43 @@ }, /turf/open/space, /area/solars/starboard/aft) +"pTT" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"pUf" = ( +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "pUy" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -58973,6 +61447,29 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"pZD" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/grunge{ + name = "Permanent Cell 1"; + wiretypepath = /datum/wires/airlock/security + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) +"qae" = ( +/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/fore) "qaY" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/bar, @@ -58982,18 +61479,23 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/service/bar) -"qcm" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "0-2" +"qbk" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable{ - icon_state = "1-2" +/turf/open/floor/plasteel, +/area/security/prison/upper) +"qcU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/command/gateway) +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "qeb" = ( /obj/structure/cable{ icon_state = "0-8" @@ -59048,6 +61550,27 @@ /obj/effect/spawner/structure/window, /turf/open/floor/wood, /area/service/library) +"qgj" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/cells) +"qhA" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/solars/port/fore) "qje" = ( /obj/structure/sign/mining{ pixel_y = 7 @@ -59062,6 +61585,15 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"qki" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/locker) "qkn" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/light{ @@ -59082,30 +61614,47 @@ }, /turf/closed/wall, /area/maintenance/port/fore) +"qlV" = ( +/obj/item/mop{ + name = "Ain't Much" + }, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/maintenance/starboard/aft) "qlY" = ( /obj/item/kirbyplants/random, /turf/open/floor/plating{ icon_state = "panelscorched" }, /area/maintenance/starboard/aft) -"qmn" = ( -/obj/machinery/computer/libraryconsole/bookmanagement, -/obj/structure/table, -/turf/open/floor/plasteel, -/area/security/prison) "qnC" = ( /obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) -"qqs" = ( -/obj/structure/mirror{ - pixel_y = 32 +"qoT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 }, -/obj/structure/sink{ - pixel_y = 25 +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/mineral/titanium/blue, -/area/commons/toilet) +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/science/circuit) +"qto" = ( +/obj/machinery/hydroponics/soil, +/obj/item/shovel/spade, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "qtw" = ( /obj/machinery/door/airlock/external{ dir = 2; @@ -59140,6 +61689,26 @@ /obj/structure/grille/broken, /turf/open/space/basic, /area/space/nearstation) +"qvc" = ( +/obj/structure/table, +/obj/structure/window, +/obj/item/reagent_containers/food/condiment/saltshaker{ + layer = 3.1; + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + desc = "Often used to flavor food or make people sneeze. Fashionably moved to the left side of the table."; + pixel_x = -8; + pixel_y = 2 + }, +/obj/item/reagent_containers/food/condiment/enzyme{ + pixel_x = 9; + pixel_y = 3 + }, +/obj/item/book/manual/chef_recipes, +/turf/open/floor/plasteel/white, +/area/security/prison/upper) "qvf" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -59149,12 +61718,47 @@ }, /turf/open/floor/plasteel, /area/commons/dorms) +"qwA" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/security/prison/cells) +"qAu" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/structure/rack, +/obj/item/storage/toolbox/emergency, +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/commons/locker) "qBi" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"qCc" = ( +/turf/closed/wall, +/area/maintenance/prison/port) +"qCw" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/obj/machinery/light/small/broken{ + dir = 8 + }, +/obj/item/glasswork/glass_base/glasses_frame_1{ + pixel_x = -6; + pixel_y = 13 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/commons/arcade) "qCR" = ( /obj/structure/musician/piano, /obj/effect/decal/cleanable/cobweb, @@ -59180,6 +61784,20 @@ }, /turf/open/floor/plasteel/dark, /area/maintenance/starboard/aft) +"qFK" = ( +/obj/machinery/biogenerator, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "qGw" = ( /obj/structure/chair/pew/right{ dir = 8 @@ -59195,6 +61813,15 @@ "qIO" = ( /turf/open/floor/plating/rust, /area/maintenance/starboard/aft) +"qIW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) "qJr" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -59207,6 +61834,18 @@ /obj/structure/lattice, /turf/open/space, /area/space/nearstation) +"qLo" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/spawner/structure/window/reinforced/tinted/electrochromatic{ + electrochromatic_id = "!permabrigshowers" + }, +/turf/open/floor/plating, +/area/security/prison/cells) "qLy" = ( /obj/structure/chair/sofa/left{ dir = 8 @@ -59244,6 +61883,29 @@ /obj/effect/decal/cleanable/blood/gibs/core, /turf/open/floor/plasteel/dark, /area/maintenance/starboard/aft) +"qNU" = ( +/obj/machinery/door/poddoor/preopen{ + id = "executionfireblast" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/westright{ + dir = 2; + name = "Transfer Room"; + req_access_txt = "2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) "qOc" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -59264,6 +61926,37 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"qOY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/prison/starboard) +"qQK" = ( +/obj/machinery/hydroponics/soil, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"qRI" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel, +/area/security/prison/upper) "qSf" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable{ @@ -59274,6 +61967,18 @@ }, /turf/open/floor/plasteel/dark, /area/medical/morgue) +"qSo" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/commons/locker) "qSF" = ( /obj/item/seeds/bee_balm/honey_balm, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -59311,9 +62016,12 @@ /turf/open/pool, /area/commons/fitness/pool) "qXg" = ( -/obj/structure/chair/sofa/left, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/cola/red{ + onstation = 0 + }, /turf/open/floor/plasteel, -/area/security/prison) +/area/security/prison/upper) "qXJ" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 9 @@ -59321,10 +62029,38 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"qYa" = ( +/obj/effect/turf_decal/bot_white, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/prison/port) "qZD" = ( /obj/effect/decal/cleanable/egg_smudge, /turf/open/floor/plating, /area/maintenance/port/fore) +"qZQ" = ( +/obj/structure/holohoop{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"qZT" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/freezer, +/area/security/prison/cells) "raH" = ( /obj/machinery/atmospherics/pipe/manifold/orange/hidden{ dir = 8 @@ -59341,6 +62077,19 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"rbH" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/window{ + dir = 1 + }, +/obj/machinery/washing_machine, +/turf/open/floor/plasteel/cafeteria, +/area/commons/locker) "rcD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -59355,11 +62104,6 @@ id = "Cell 1"; name = "Cell 1 Locker" }, -/obj/item/radio/headset{ - desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast."; - name = "prisoner headset"; - prison_radio = 1 - }, /obj/structure/cable{ icon_state = "1-4" }, @@ -59372,6 +62116,12 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"rcV" = ( +/obj/structure/sign/warning/securearea{ + pixel_y = -32 + }, +/turf/open/space/basic, +/area/space) "rdl" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/cyan/visible{ @@ -59387,6 +62137,15 @@ }, /turf/open/floor/plasteel/dark, /area/service/hydroponics) +"ref" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/security/prison) "reA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -59398,6 +62157,40 @@ /obj/machinery/vending/games, /turf/open/floor/plasteel, /area/commons/fitness) +"reE" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/cells) +"rgu" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + layer = 2.4 + }, +/turf/open/floor/plating, +/area/security/execution/transfer) "rgL" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -59479,18 +62272,23 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/commons/dorms) +"rqq" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "rqE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, /turf/open/floor/wood, /area/service/bar) -"rqW" = ( -/obj/structure/dresser, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/service/theater/mime) "rrM" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 @@ -59499,6 +62297,18 @@ /obj/item/clothing/under/dress/sundress, /turf/open/floor/plasteel, /area/commons/fitness) +"rsn" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "executionfireblast" + }, +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/pipe/simple, +/turf/open/floor/plating, +/area/security/execution/transfer) "rsp" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/table, @@ -59538,6 +62348,28 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/commons/dorms) +"ruu" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/security/glass{ + id_tag = "permaouter"; + name = "Permabrig Transfer"; + req_access_txt = "2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark, +/area/security/prison) "rvr" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -59555,12 +62387,38 @@ /turf/open/floor/plasteel, /area/commons/fitness) "rvS" = ( -/obj/structure/chair/comfy/brown{ - color = "#66b266"; - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /turf/open/floor/plasteel, -/area/security/prison) +/area/security/prison/upper) +"rwj" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/closet/crate/bin, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/maintenance/port/fore) +"rwA" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/solars/port/fore) +"rxD" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Locker Room Toilets"; + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/locker) "rxF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/table/glass, @@ -59569,6 +62427,21 @@ }, /turf/open/floor/wood/wood_large, /area/service/chapel/main) +"ryi" = ( +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison/cells) "ryr" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -59579,6 +62452,27 @@ }, /turf/open/floor/plasteel, /area/commons/fitness) +"ryN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) "rAR" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -59588,12 +62482,42 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"rAW" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/flasher{ + id = "executionflash"; + pixel_y = -25 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) "rBq" = ( /obj/item/clothing/head/kitty, /obj/item/clothing/under/costume/maid, /obj/item/clothing/mask/muzzle, /turf/open/floor/plating, /area/maintenance/bar) +"rBK" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) +"rBY" = ( +/obj/structure/bed, +/turf/open/floor/padded, +/area/security/execution/transfer) "rCl" = ( /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -59616,6 +62540,49 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"rDc" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"rDh" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/sign/poster/contraband/clown{ + pixel_y = -32 + }, +/obj/structure/closet/crate/wooden/toy, +/obj/item/toy/crayon/spraycan/lubecan, +/turf/open/floor/plasteel, +/area/service/theater) +"rDm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "rGo" = ( /obj/machinery/light/small{ dir = 1 @@ -59633,6 +62600,16 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"rGZ" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/solars/port/fore) "rIA" = ( /obj/machinery/light{ dir = 8 @@ -59687,18 +62664,11 @@ /obj/machinery/status_display/evac, /turf/closed/wall, /area/ai_monitored/command/storage/eva) -"rPU" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/obj/effect/landmark/start/mime, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/service/theater/mime) +"rQy" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space/basic, +/area/space) "rQJ" = ( /obj/machinery/light/small{ dir = 8 @@ -59720,6 +62690,12 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"rTj" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) "rTo" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -59727,16 +62703,6 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) -"rTu" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) "rTD" = ( /turf/open/floor/plasteel, /area/command/gateway) @@ -59744,6 +62710,12 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/medical/medbay/central) +"rUr" = ( +/obj/effect/spawner/lootdrop/prison_contraband, +/obj/structure/rack, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/prison/port) "rVy" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -59806,6 +62778,18 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/port/fore) +"rYM" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/tracker, +/turf/open/floor/plasteel/airless/solarpanel, +/area/solars/port/fore) +"rZE" = ( +/obj/structure/table, +/obj/item/flashlight/lamp, +/turf/open/floor/carpet/arcade, +/area/commons/arcade) "rZQ" = ( /obj/docking_port/stationary{ dir = 8; @@ -59834,10 +62818,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, /area/engineering/engine_smes) -"saX" = ( -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/grass, -/area/security/prison) "sci" = ( /obj/machinery/vr_sleeper{ dir = 4 @@ -59855,6 +62835,11 @@ dir = 4 }, /area/commons/fitness) +"sew" = ( +/obj/structure/table, +/obj/machinery/microwave, +/turf/open/floor/plasteel/white, +/area/security/prison/upper) "seP" = ( /obj/structure/cable{ icon_state = "0-8" @@ -59873,12 +62858,61 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/fore) +"sfz" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/bed, +/obj/item/bedsheet/red, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "shR" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plating/airless, /area/space/nearstation) +"siz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"ske" = ( +/obj/machinery/camera{ + c_tag = "Permabrig South"; + dir = 1; + network = list("ss13","prison") + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "slk" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" @@ -59891,6 +62925,16 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) +"smN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/machinery/camera{ + c_tag = "Locker Room West"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/commons/locker) "smP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -59913,12 +62957,6 @@ /obj/item/clothing/shoes/sneakers/white, /turf/open/floor/plating, /area/maintenance/fore) -"sqp" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/closed/wall/r_wall, -/area/space/nearstation) "srk" = ( /turf/open/floor/light/colour_cycle/dancefloor_a, /area/maintenance/starboard/aft) @@ -59929,6 +62967,17 @@ }, /turf/open/floor/plating, /area/service/abandoned_gambling_den) +"ssc" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "ssB" = ( /obj/effect/turf_decal/tile/green{ dir = 1 @@ -59956,6 +63005,33 @@ /obj/item/toy/poolnoodle/yellow, /turf/open/floor/plasteel, /area/commons/fitness/pool) +"suC" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/item/soap/nanotrasen, +/turf/open/floor/plasteel/freezer, +/area/security/prison/cells) +"suN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/landmark/event_spawn, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/science/circuit) +"suS" = ( +/obj/structure/table, +/obj/item/storage/fancy/egg_box, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/condiment/rice, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/security/prison/upper) "sxs" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/table, @@ -59976,6 +63052,18 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/hallway/primary/port) +"szf" = ( +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"szn" = ( +/turf/closed/wall/r_wall, +/area/security/prison/cells) "sAk" = ( /obj/structure/cable{ icon_state = "1-8" @@ -59985,6 +63073,11 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"sAm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "sAH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -60005,6 +63098,43 @@ icon_state = "wood-broken6" }, /area/maintenance/bar) +"sAT" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"sBM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "sCa" = ( /obj/structure/rack, /obj/item/circuitboard/machine/monkey_recycler, @@ -60055,6 +63185,12 @@ }, /turf/open/floor/plasteel, /area/commons/dorms) +"sHd" = ( +/obj/machinery/door/window/southleft{ + name = "Permabrig Kitchen" + }, +/turf/open/floor/plasteel/white, +/area/security/prison/upper) "sHx" = ( /obj/structure/table, /obj/item/book/manual/hydroponics_pod_people{ @@ -60067,6 +63203,14 @@ }, /turf/open/floor/plasteel, /area/service/hydroponics) +"sIn" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/area/maintenance/prison/starboard) "sJw" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -60099,30 +63243,17 @@ }, /turf/open/floor/plasteel, /area/commons/fitness) +"sKA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/closed/wall, +/area/security/execution/transfer) "sKL" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/grille/broken, /turf/open/floor/plating, /area/maintenance/aft) -"sLa" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/window{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/commons/locker) "sLj" = ( /obj/structure/chair/comfy/brown{ dir = 4 @@ -60137,6 +63268,12 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"sMu" = ( +/obj/structure/lattice, +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) "sMG" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 @@ -60145,23 +63282,17 @@ icon_state = "platingdmg3" }, /area/maintenance/starboard/aft) -"sNK" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ +"sMI" = ( +/obj/structure/table, +/obj/item/storage/secure/briefcase, +/turf/open/floor/plasteel, +/area/commons/locker) +"sNj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/red, -/obj/structure/closet/secure_closet/freezer/cream_pie, -/obj/machinery/airalarm{ - pixel_y = 23 - }, /turf/open/floor/plasteel, -/area/service/theater/clown) +/area/security/prison/upper) "sOs" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -60214,6 +63345,24 @@ /obj/structure/chair/office/light, /turf/open/floor/plasteel/white, /area/science/circuit) +"sUx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/command/gateway) +"sVt" = ( +/obj/item/storage/secure/safe{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/commons/locker) "sVD" = ( /obj/structure/table/wood/poker, /obj/item/storage/box/matches{ @@ -60252,17 +63401,111 @@ /obj/effect/turf_decal/vg_decals/atmos/mix, /turf/open/floor/engine/vacuum, /area/engineering/atmos) -"sYR" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" +"sYv" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/dark, -/area/service/bar) +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/closet/secure_closet/freezer/cream_pie, +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/turf/open/floor/plasteel, +/area/service/theater) +"sYV" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "tal" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/hallway/secondary/service) +"tbR" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/toilet{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) +"tcU" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "46" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/fore) +"tdd" = ( +/obj/machinery/camera{ + c_tag = "Prison Cell Block North"; + dir = 4; + network = list("ss13","prison") + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/prison/cells) +"teq" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/light, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"teS" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/mob/living/simple_animal/opossum{ + name = "trash" + }, +/turf/open/floor/carpet/royalblue, +/area/maintenance/starboard/aft) "tgH" = ( /obj/structure/filingcabinet/employment, /turf/open/floor/wood, @@ -60280,11 +63523,27 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "thB" = ( -/obj/structure/sign/warning/securearea{ - pixel_y = -32 +/obj/effect/turf_decal/tile/green{ + dir = 4 }, -/turf/open/space, -/area/space) +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "tif" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -60303,6 +63562,19 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, /area/commons/dorms) +"tkx" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/prison/cells) "tkB" = ( /obj/structure/sign/poster/official/help_others{ pixel_y = -32 @@ -60323,6 +63595,22 @@ }, /turf/open/floor/plating, /area/security/range) +"tnH" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison/cells) "tnL" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -60338,6 +63626,10 @@ }, /turf/open/floor/carpet, /area/commons/cryopod) +"tqk" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/closed/wall, +/area/security/execution/transfer) "tqB" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -60356,6 +63648,36 @@ }, /turf/open/floor/plasteel, /area/security/courtroom) +"trT" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"tso" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/toilet{ + dir = 4 + }, +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "tsq" = ( /obj/structure/cable/white{ icon_state = "0-4" @@ -60404,6 +63726,57 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"txs" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/window/reinforced/tinted{ + dir = 4 + }, +/obj/structure/toilet{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) +"tyb" = ( +/obj/machinery/door/poddoor/shutters{ + id = "visitation"; + name = "Visitation Shutters" + }, +/obj/machinery/door/window/southright, +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) +"tyE" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "tyX" = ( /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/tile/neutral{ @@ -60425,6 +63798,11 @@ /obj/item/soap, /turf/open/floor/mineral/titanium/blue, /area/commons/dorms) +"tAy" = ( +/obj/effect/decal/cleanable/oil/slippery, +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/maintenance/starboard/aft) "tAC" = ( /obj/structure/closet/athletic_mixed, /obj/item/toy/poolnoodle/red, @@ -60437,6 +63815,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/engineering/atmos) +"tAS" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "tBV" = ( /turf/closed/wall, /area/medical/storage) @@ -60462,6 +63844,29 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) +"tCs" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/window/reinforced/tinted{ + dir = 4 + }, +/obj/structure/toilet{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "tEK" = ( /obj/structure/cable{ icon_state = "4-8" @@ -60510,6 +63915,18 @@ dir = 1 }, /area/hallway/secondary/entry) +"tHO" = ( +/obj/structure/table/reinforced, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/bag/tray/cafeteria, +/turf/open/floor/plasteel, +/area/security/prison/upper) "tIE" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -60527,6 +63944,23 @@ /obj/structure/musician/piano, /turf/open/floor/wood, /area/service/theater) +"tJE" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Isolation Cell"; + req_access_txt = "2" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) "tJK" = ( /obj/machinery/door/airlock/engineering{ name = "Gravity Generator"; @@ -60569,6 +64003,12 @@ }, /turf/open/floor/plasteel, /area/commons/dorms) +"tLC" = ( +/obj/machinery/vr_sleeper{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "tMl" = ( /obj/effect/turf_decal/loading_area, /turf/open/floor/plasteel/showroomfloor, @@ -60585,6 +64025,23 @@ }, /turf/open/floor/plasteel, /area/engineering/gravity_generator) +"tOk" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/security/prison/cells) "tOq" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -60596,6 +64053,12 @@ /obj/structure/table/wood, /turf/open/floor/wood, /area/maintenance/bar) +"tPY" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) "tRe" = ( /obj/machinery/chem_master, /turf/open/floor/plasteel/white, @@ -60637,6 +64100,14 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"tVB" = ( +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/locker) "tVE" = ( /obj/item/chair/wood{ dir = 4 @@ -60646,6 +64117,21 @@ icon_state = "wood-broken5" }, /area/maintenance/port/fore) +"tWe" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/security/prison/upper) "tWj" = ( /obj/structure/window/reinforced, /turf/open/floor/wood, @@ -60664,6 +64150,24 @@ }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) +"tYg" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"tZa" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "tZe" = ( /obj/effect/turf_decal/bot, /obj/structure/sign/poster/official/pda_ad{ @@ -60671,6 +64175,9 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"tZp" = ( +/turf/closed/wall, +/area/commons/arcade) "tZu" = ( /obj/machinery/light/small{ dir = 8 @@ -60689,25 +64196,6 @@ }, /turf/open/floor/wood, /area/maintenance/bar) -"ubj" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/door/window/westright{ - name = "Red Corner" - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/commons/locker) "ucq" = ( /obj/structure/sign/poster/contraband/red_rum{ pixel_y = 32 @@ -60724,6 +64212,19 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) +"ueN" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) "ueZ" = ( /obj/item/radio/intercom{ name = "Station Intercom (General)"; @@ -60751,6 +64252,9 @@ dir = 4 }, /area/commons/fitness) +"ugi" = ( +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) "ugp" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ dir = 4 @@ -60790,6 +64294,16 @@ /obj/effect/decal/cleanable/blood/gibs/human/lizard/body, /turf/open/floor/plasteel/dark, /area/maintenance/starboard/aft) +"uhK" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/security/prison/upper) "ujv" = ( /obj/structure/sign/departments/restroom, /turf/closed/wall, @@ -60817,6 +64331,14 @@ }, /turf/open/floor/wood, /area/service/bar) +"unQ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/item/papercutter, +/obj/structure/table, +/turf/open/floor/carpet, +/area/command/heads_quarters/hop) "unR" = ( /turf/open/floor/plasteel/yellowsiding{ dir = 8 @@ -60844,6 +64366,15 @@ }, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) +"uql" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) "uqu" = ( /obj/machinery/hydroponics/soil{ pixel_y = 8 @@ -60868,6 +64399,17 @@ /obj/machinery/atmospherics/components/binary/valve, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"uuw" = ( +/obj/machinery/hydroponics/soil, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "uuG" = ( /obj/structure/cable{ icon_state = "4-8" @@ -60973,6 +64515,15 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) +"uCn" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) "uCo" = ( /obj/structure/chair{ dir = 1 @@ -61003,12 +64554,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/commons/fitness/pool) -"uEI" = ( -/obj/structure/chair/comfy/brown{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/prison) "uFp" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -61045,8 +64590,19 @@ /turf/open/floor/plasteel, /area/security/processing) "uGI" = ( -/turf/open/floor/grass, -/area/security/prison) +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "uHc" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -61089,16 +64645,58 @@ /obj/machinery/door/window, /turf/open/floor/wood, /area/service/theater) -"uNu" = ( +"uJY" = ( +/obj/structure/chair/comfy/brown{ + color = "#596479"; + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"uKW" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/security/prison/upper) +"uLB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable{ - icon_state = "1-8" +/obj/effect/turf_decal/bot, +/obj/structure/window/reinforced{ + dir = 4 }, -/turf/open/floor/plasteel, -/area/science/circuit) +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) +"uOd" = ( +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/service/theater) +"uOm" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/mob/living/simple_animal/mouse/brown/Tom, +/turf/open/floor/plating, +/area/security/prison/upper) "uOJ" = ( /obj/structure/cable{ icon_state = "1-8" @@ -61116,24 +64714,12 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) -"uQS" = ( -/obj/machinery/light/small, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/mineral/titanium/blue, -/area/commons/toilet) "uRd" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, /turf/closed/wall/r_wall, /area/engineering/gravity_generator) -"uRn" = ( -/obj/structure/chair/stool, -/mob/living/simple_animal/opossum, -/turf/open/floor/carpet/royalblue, -/area/maintenance/starboard/aft) "uRS" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -61144,6 +64730,16 @@ }, /turf/open/floor/plating, /area/maintenance/fore) +"uSc" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/service/theater) "uSC" = ( /obj/machinery/pool/drain, /turf/open/pool, @@ -61155,12 +64751,19 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/security/brig) -"uUi" = ( -/obj/effect/decal/cleanable/vomit, +"uTL" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/fore) +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/commons/locker) +"uUb" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "uUP" = ( /obj/structure/cable/white, /obj/structure/cable/white{ @@ -61196,6 +64799,17 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"uZM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai_upload) +"uZY" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/security/prison/upper) "vae" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -61244,6 +64858,14 @@ }, /turf/open/floor/plating, /area/security/range) +"vde" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/effect/landmark/start/captain, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/wood, +/area/command/heads_quarters/captain) "vdo" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /obj/structure/lattice, @@ -61287,18 +64909,38 @@ }, /turf/open/floor/plating, /area/maintenance/fore) -"vhb" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ +"vhy" = ( +/obj/effect/turf_decal/tile/green{ dir = 8 }, -/obj/structure/window{ - dir = 1 +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/turf/open/floor/plasteel/cafeteria, -/area/commons/locker) +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"vhC" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"vim" = ( +/obj/machinery/computer/arcade/minesweeper, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "viF" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -61306,6 +64948,31 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) +"viH" = ( +/obj/machinery/camera{ + c_tag = "Permabrig Central"; + dir = 8; + network = list("ss13","prison") + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "vjm" = ( /obj/structure/table/wood, /obj/item/reagent_containers/rag, @@ -61347,6 +65014,19 @@ /obj/machinery/meter, /turf/open/floor/plasteel, /area/engineering/atmos) +"voT" = ( +/obj/machinery/camera{ + c_tag = "Bathrooms"; + dir = 1 + }, +/obj/structure/sink{ + pixel_y = 25 + }, +/obj/structure/mirror{ + pixel_y = 32 + }, +/turf/open/floor/mineral/titanium/blue, +/area/commons/toilet) "voW" = ( /obj/structure/pool/Lboard, /turf/open/pool, @@ -61431,6 +65111,25 @@ }, /turf/open/floor/wood, /area/service/library) +"vws" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/prison/cells) +"vwQ" = ( +/obj/structure/bookcase, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "vxh" = ( /turf/open/floor/plating{ icon_state = "platingdmg1" @@ -61467,6 +65166,17 @@ }, /turf/open/floor/plating, /area/security/brig) +"vyP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/mirror{ + pixel_x = 28 + }, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/locker) "vzp" = ( /obj/structure/table/reinforced, /obj/machinery/firealarm{ @@ -61491,18 +65201,6 @@ }, /turf/open/floor/plasteel, /area/commons/fitness/pool) -"vBa" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/command/gateway) "vCb" = ( /obj/machinery/rnd/production/techfab/department/service, /turf/open/floor/plasteel, @@ -61535,6 +65233,22 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"vCS" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) "vEi" = ( /obj/structure/cable{ icon_state = "4-8" @@ -61570,6 +65284,25 @@ }, /turf/open/floor/plasteel, /area/engineering/gravity_generator) +"vFZ" = ( +/obj/effect/spawner/lootdrop/prison_contraband, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/bed, +/obj/item/bedsheet/red, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "vGn" = ( /obj/structure/cable{ icon_state = "1-2" @@ -61611,6 +65344,9 @@ }, /turf/open/floor/plasteel, /area/commons/fitness) +"vHK" = ( +/turf/closed/wall, +/area/maintenance/prison/starboard) "vHT" = ( /obj/machinery/door/firedoor, /obj/structure/sign/departments/evac{ @@ -61678,6 +65414,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/fore) +"vMi" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "vOC" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/dark/visible{ @@ -61730,6 +65477,14 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"vRN" = ( +/obj/structure/closet/crate, +/obj/item/stack/license_plates/empty/fifty, +/obj/item/stack/license_plates/empty/fifty, +/obj/item/stack/license_plates/empty/fifty, +/obj/item/stack/license_plates/empty/fifty, +/turf/open/floor/plating, +/area/security/prison/upper) "vTP" = ( /obj/machinery/door/airlock/external{ name = "Labor Camp Shuttle Airlock"; @@ -61740,6 +65495,29 @@ }, /turf/open/floor/plating, /area/security/processing) +"vYF" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) +"vYY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "vZA" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -61757,6 +65535,18 @@ }, /turf/open/floor/plasteel, /area/commons/fitness/pool) +"waX" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) "wbE" = ( /obj/effect/turf_decal/tile/blue{ alpha = 255 @@ -61785,6 +65575,15 @@ "wcR" = ( /turf/open/floor/plasteel/yellowsiding/corner, /area/commons/fitness/pool) +"wcS" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/cells) "wdr" = ( /obj/machinery/door/window/southleft{ name = "Target Storage" @@ -61803,11 +65602,46 @@ /obj/structure/girder, /turf/open/floor/plating/airless, /area/space/nearstation) +"weW" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison/cells) +"wfC" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/mob/living/simple_animal/bot/medbot{ + name = "Doctor Love" + }, +/turf/open/floor/carpet/royalblue, +/area/maintenance/starboard/aft) "wfR" = ( /obj/item/electropack/shockcollar, /obj/item/assembly/signaler, /turf/open/floor/plating, /area/maintenance/bar) +"wgu" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Permabrig Maintenance"; + req_access_txt = "1" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/prison/port) "wig" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -61842,6 +65676,13 @@ "wkN" = ( /turf/closed/wall, /area/science/circuit) +"wkU" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "wlg" = ( /obj/structure/cable{ icon_state = "1-2" @@ -61874,6 +65715,15 @@ }, /turf/open/floor/plating, /area/engineering/main) +"wnX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/freezer, +/area/security/prison/cells) "woR" = ( /obj/machinery/cryopod{ dir = 1 @@ -61894,6 +65744,22 @@ }, /turf/open/floor/plating, /area/construction/mining/aux_base) +"wpV" = ( +/obj/machinery/seed_extractor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#d1dfff" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/security/prison/upper) "wql" = ( /turf/closed/wall/r_wall, /area/command/gateway) @@ -61934,6 +65800,26 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) +"wrX" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/window, +/obj/structure/window{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/commons/locker) "wuO" = ( /obj/effect/spawner/lootdrop/maintenance{ lootcount = 2; @@ -61957,6 +65843,30 @@ /obj/item/stack/sheet/metal/ten, /turf/open/floor/plasteel/white, /area/science/circuit) +"wwG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/commons/locker) +"wxf" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/holopad/secure, +/turf/open/floor/wood, +/area/command/heads_quarters/captain) +"wxk" = ( +/obj/item/reagent_containers/food/drinks/beer{ + pixel_x = -15 + }, +/obj/machinery/computer/arcade, +/turf/open/floor/carpet/arcade, +/area/commons/arcade) "wxT" = ( /obj/structure/chair/sofa/left, /obj/structure/window{ @@ -61971,18 +65881,75 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) +"wAj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) +"wAN" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "wBd" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, /turf/closed/wall, /area/hallway/secondary/service) +"wCQ" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"wDq" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) +"wGc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) "wHk" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel, /area/commons/fitness/pool) +"wHm" = ( +/obj/structure/window/reinforced, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/wood, +/area/service/theater) "wHz" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -61993,6 +65960,18 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"wIl" = ( +/obj/structure/bed, +/obj/effect/spawner/lootdrop/bedsheet, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/area/maintenance/prison/port) +"wII" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/maintenance, +/turf/open/floor/wood, +/area/service/bar) "wJA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -62065,6 +66044,41 @@ icon_state = "platingdmg3" }, /area/maintenance/starboard/aft) +"wVq" = ( +/obj/machinery/door/airlock/security{ + name = "Prison Workshop" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) +"wVt" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/cells) "wVN" = ( /obj/structure/falsewall, /turf/open/floor/plating, @@ -62097,11 +66111,16 @@ /turf/open/floor/plasteel, /area/commons/fitness/pool) "wYc" = ( -/obj/machinery/vr_sleeper{ - dir = 8 +/obj/structure/table, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) +"wYn" = ( +/obj/structure/plasticflaps/opaque, +/obj/structure/sign/poster/contraband/free_drone{ + pixel_y = 32 }, -/turf/open/floor/plasteel, -/area/security/prison) +/turf/open/floor/carpet/royalblue, +/area/maintenance/starboard/aft) "wZI" = ( /obj/machinery/light{ dir = 1 @@ -62149,6 +66168,20 @@ /obj/item/coin/gold, /turf/open/floor/plasteel, /area/commons/fitness) +"xbP" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "xcl" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/dark/visible{ @@ -62169,6 +66202,13 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"xfW" = ( +/obj/machinery/vr_sleeper{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "xgk" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -62231,13 +66271,18 @@ /turf/open/floor/plating, /area/construction) "xib" = ( -/obj/machinery/door/window/westleft{ - base_state = "right"; - icon_state = "right"; - name = "Unisex Showers" +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "Prison Gate"; + name = "prison blast door" }, -/turf/open/floor/plasteel/freezer, -/area/security/prison) +/obj/structure/cable, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Prison Gate"; + name = "Prison Lockdown Shutters" + }, +/turf/open/floor/plating, +/area/security/prison/upper) "xiw" = ( /obj/machinery/door/airlock{ name = "Service Hall"; @@ -62249,6 +66294,26 @@ }, /turf/open/floor/plating, /area/hallway/secondary/service) +"xjU" = ( +/obj/machinery/door/airlock/security{ + name = "Permabrig Visitation" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) "xkd" = ( /obj/machinery/light/small{ dir = 4; @@ -62256,24 +66321,33 @@ }, /turf/open/floor/plasteel, /area/commons/fitness) -"xmo" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 +"xkk" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/structure/sign/warning/securearea{ + pixel_x = -32; + pixel_y = 32 }, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Prison Gate"; + name = "Prison Lockdown Shutters" + }, +/turf/open/floor/plasteel/dark, +/area/security/range) +"xlX" = ( +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/red, -/obj/structure/sign/poster/contraband/clown{ - pixel_y = -32 +/obj/machinery/door/poddoor/shutters{ + id = "commissaryshutters"; + name = "Vacant Commissary Shutters" }, -/obj/structure/closet/crate/wooden/toy, -/obj/item/toy/crayon/spraycan/lubecan, /turf/open/floor/plasteel, -/area/service/theater/clown) +/area/commons/locker) "xmS" = ( /obj/structure/chair/comfy/beige{ dir = 8 @@ -62290,6 +66364,31 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"xnF" = ( +/obj/machinery/door/airlock/security{ + name = "Isolation Cell"; + req_access_txt = "2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) +"xpH" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) "xqG" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/bar, @@ -62331,6 +66430,26 @@ }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) +"xuu" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Prison Gate"; + name = "Prison Lockdown Shutters" + }, +/turf/open/floor/plating, +/area/security/brig) +"xwB" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/carpet/arcade, +/area/commons/arcade) "xxi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -62350,6 +66469,11 @@ "xxp" = ( /turf/open/floor/plating, /area/security/range) +"xzd" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/closet, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "xzv" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -62375,6 +66499,13 @@ }, /turf/open/floor/plasteel, /area/commons/dorms) +"xAA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "xBk" = ( /obj/structure/cable{ icon_state = "1-2" @@ -62391,6 +66522,16 @@ /obj/item/radio/headset/headset_cargo, /turf/open/floor/plasteel, /area/cargo/storage) +"xBJ" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "xDM" = ( /obj/machinery/camera{ c_tag = "Locker Room South"; @@ -62435,6 +66576,12 @@ }, /turf/open/floor/wood/wood_large, /area/service/chapel/main) +"xFj" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "xFM" = ( /obj/item/clothing/gloves/color/rainbow, /obj/item/clothing/head/soft/rainbow, @@ -62442,6 +66589,20 @@ /obj/item/clothing/under/color/rainbow, /turf/open/floor/plating, /area/maintenance/port/fore) +"xGm" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/cells) "xGQ" = ( /obj/structure/sign/plaques/golden{ pixel_y = 32 @@ -62483,6 +66644,44 @@ }, /turf/open/floor/plating, /area/security/office) +"xKl" = ( +/obj/machinery/computer/security/telescreen/prison{ + pixel_y = 30 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"xLQ" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/security/prison/upper"; + damage_deflection = 21; + desc = "A control terminal for the area's electrical systems. It's secured with a durable antitampering plasteel cage."; + dir = 1; + name = "Armored Upper Prison Wing APC"; + pixel_y = 23 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "xLX" = ( /obj/structure/lattice/catwalk, /obj/item/stack/marker_beacon{ @@ -62496,13 +66695,54 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"xOx" = ( -/obj/structure/chair/comfy/brown{ - color = "#596479"; - dir = 1 +"xMg" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) +"xMS" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) +"xNV" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "4-8" }, /turf/open/floor/plasteel, -/area/security/prison) +/area/security/prison/cells) +"xOx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/flasher{ + id = "visitorflash"; + pixel_x = 16; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "xPk" = ( /obj/structure/bed, /obj/machinery/button/door{ @@ -62516,15 +66756,6 @@ /obj/effect/spawner/lootdrop/bedsheet, /turf/open/floor/wood, /area/commons/dorms) -"xPY" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/closed/wall/r_wall, -/area/ai_monitored/turret_protected/ai_upload) "xRa" = ( /obj/item/kirbyplants{ icon_state = "plant-20" @@ -62573,6 +66804,21 @@ /obj/effect/landmark/carpspawn, /turf/open/space, /area/space/station_ruins) +"xUC" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) "xUL" = ( /obj/effect/turf_decal/bot_white/right, /obj/effect/turf_decal/tile/neutral{ @@ -62608,6 +66854,13 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"xVZ" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/solars/port/fore) "xWq" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external{ @@ -62622,6 +66875,13 @@ }, /turf/open/floor/plasteel/grimy, /area/maintenance/starboard/aft) +"xWS" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/security/prison/upper) "xXi" = ( /obj/machinery/vending/clothing, /turf/open/floor/plasteel, @@ -62686,12 +66946,22 @@ }, /turf/open/floor/mineral/titanium/blue, /area/commons/toilet/locker) -"ycu" = ( +"yco" = ( +/obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ - icon_state = "2-4" + icon_state = "0-8" }, -/turf/open/floor/plasteel, -/area/science/circuit) +/turf/open/floor/plating, +/area/security/prison/cells) +"ycL" = ( +/obj/effect/spawner/lootdrop/prison_contraband, +/obj/structure/closet/crate, +/obj/item/stack/license_plates/empty/fifty, +/obj/item/stack/license_plates/empty/fifty, +/obj/item/stack/license_plates/empty/fifty, +/obj/item/stack/license_plates/empty/fifty, +/turf/open/floor/plating, +/area/security/prison/upper) "ycY" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -62723,24 +66993,44 @@ /obj/machinery/status_display/evac, /turf/closed/wall, /area/hallway/primary/central) +"yeU" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/landmark/start/prisoner, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "permacells5"; + name = "Privacy Shutters"; + pixel_y = 25 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) +"yeZ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/closed/wall, +/area/security/execution/transfer) +"yfX" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/carpet/arcade, +/area/commons/arcade) "ygb" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 4 }, /turf/open/floor/wood/wood_diagonal, /area/maintenance/port/fore) -"ygG" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable, -/turf/open/floor/plating, -/area/command/gateway) "yhx" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 @@ -62758,6 +67048,14 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"yhI" = ( +/obj/machinery/computer/arcade/battle, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) (1,1,1) = {" cNd @@ -76960,12 +81258,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa aaS aaS aaS @@ -76981,9 +81273,15 @@ aaS aba aaS aaS +gXs +gXs +gXs +eRz +eRz +eRz aaf aaf -aaf +aaT aaf aaf alU @@ -77217,12 +81515,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa abY aaa aaf @@ -77235,7 +81527,7 @@ acy aaa aaf aaa -bXv +dLl aaa aaS aaa @@ -77243,6 +81535,12 @@ aaa aaa aaa aaa +gXs +aaa +aaa +aaa +aaa +aaa alU ash atU @@ -77474,31 +81772,31 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa abY aaa acW -acV +eTt adA aaa acW -acV +eTt adA aaa acW -acV +eTt adA aaa aaS +gXs +gXs +gXs +gXs +eRz +eRz aaf aaf -aaf -aaf +aaT +aaT aaf alU atn @@ -77728,34 +82026,34 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa aae aaa aaa abY aaf acW -adx +hcT adA aaa acW -adx +hcT adA aaa acW -adx +hcT adA aaf aaf aaa aaa +gXs aaa aaa +ktS +aaa +aaa +gXs +aaa aaa alU alU @@ -77988,31 +82286,31 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa abY aaa acW -adx +hcT adA aaf acW -adx +hcT adA aaf acW -adx +hcT adA aaa aaf aaa aaa +gXs aaa aaa +ktS +aaa +aaa +gXs +aaa aaa gXs ali @@ -78245,27 +82543,27 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa aaf aaf acW -adx +hcT adA aaa acW -adx +hcT adA aaa acW -adx +hcT adA aaf aaf +gXs +gXs +gXs +gXs +gXs +gXs aaf aaf aaf @@ -78499,32 +82797,32 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa aaS aaS aaS aaf aaa acW -adx +hcT adA aaa acW -adx +hcT adA aaa acW -adx +hcT adA aaa aaf aaa aaa +aaa +gXs +aaa +ktS +aaa +aaa ajV alR alR @@ -78756,29 +83054,29 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa aaS aaa aaf aaa aaa aaa -adZ +rwA aaa aaa aaa -adZ +rwA aaa aaa aaa -adZ +rwA aaa aaa +aaf +aaa +aaa +aaa +gXs +aaa ajV ajV ajV @@ -79013,18 +83311,12 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa aaS aaf -abs -abZ -abZ -adw +rYM +qhA +qhA +hSf ady ady ady @@ -79036,6 +83328,12 @@ ady ady cfK uDO +uDO +uDO +uDO +uDO +uDO +uDO ajq akB akB @@ -79073,10 +83371,10 @@ aQM aTv aUT aPz -aXQ -aXQ -aXQ -aXQ +aPA +hNm +aPA +aPA aXQ aXQ aXQ @@ -79270,29 +83568,29 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa aaS aaa aaf aaa aaa aaa -ajW +xVZ aaa aaa aaa -ajW +xVZ aaa aaa aaa -ajW +xVZ aaa aaa +aaf +aaa +aaa +aaa +gXs +aaa ajV ajV ajV @@ -79330,14 +83628,14 @@ aPA aPA aPA aPA +got +pNS +sMI +kic aXQ aZt aXQ ycd -aXQ -omY -aXQ -gQX bhQ bjj bkF @@ -79527,32 +83825,32 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa aaS aba aaS aaf aaa acW -amv +pry adA aaa acW -amv +pry adA aaa acW -amv +pry adA aaa aaf aaa aaa +aaa +gXs +aaa +ktS +aaa +aaa ajV alR alR @@ -79586,15 +83884,15 @@ aQO aSh aTw aUU -aWn +aPA +aPA +sVt +pNS +qAu aXQ aZv aXQ bbL -aXQ -bdJ -aXQ -bgr bhQ bjj bkF @@ -79787,30 +84085,30 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa aaf aaf acW -amv +pry adA aaa acW -amv +pry adA aaa acW -amv +pry adA aaf aaf aaa aaa aaa +gXs +aaa +ktS +aaa +aaa +aaa alU amF alF @@ -79842,16 +84140,16 @@ aPA aQN aQN aQN -aUn -aTy +aQN +aWn +aPA +uTL +wwG +fBW aWy -aYe -bbq -aZw +mmx +tVB wTk -bct -bct -bct bhQ bjk bkE @@ -80044,27 +84342,27 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa aaS aaa acW -amv +pry adA aaf acW -amv +pry adA aaf acW -amv +pry adA aaa aaf +gXs +gXs +gXs +gXs +gXs +gXs aaf aaf aaf @@ -80099,16 +84397,16 @@ aPA aQS aQN aSV -aUo -aUX -aXp -baO -aZo -baw -cFG -hPs -cBn -bct +aYU +smN +aPA +mqH +xlX +aPA +aXQ +ddl +vyP +rxD bhQ bjk bkF @@ -80301,35 +84599,35 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa aaS aaf acW -amv +pry adA aaa acW -amv +pry adA aaa acW -amv +pry adA aaf aaf aaa aaa aaa +aaa +aaa +ktS +wDq +aaa +aaa +alU alU alU ank alU -alU aoW amC avW @@ -80356,14 +84654,14 @@ aPA aQP aQN aTB +aQN +aWq +aQN +aWq aUt -aWo -aXQ -aXQ -aXQ -aXQ -aXQ +aQN aXQ +qki aXQ aXQ bhQ @@ -80558,34 +84856,34 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa aaS aaa acW -aqJ +rGZ adA aaa acW -aqJ +rGZ adA aaa acW -aqJ +rGZ adA aaa aaS aaa aaa aaa +aaa +aaa +ktS +rQy +aaa +aaa alU -anj -amD -amC +lLA +mzT +aKY alU arG amC @@ -80613,14 +84911,14 @@ aPA aQR aQN aQN -aUt +aQN aWq aQN +aWq +aUt aQN -aQN -aQN -vhb -bbO +fRe +qSo aPA bgt bhS @@ -80802,18 +85100,12 @@ cNd cNd cNd cNd +naI cNd cNd cNd cNd cNd -cNd -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -80836,12 +85128,18 @@ aaa aaf aaa aaS -aaf +gXs +gXs +gXs +gXs +gXs +eRz +aaT aaf aaf alU -amC -arK +jNr +gZB amC ank amC @@ -80870,14 +85168,14 @@ aPC aQN aQN aTz -aUp -ubj aXr -aZx -aQN -aQN -cBh -bdL +lZa +fFl +wrX +aUo +aYU +ihS +owx aPA bgt bhR @@ -81067,17 +85365,11 @@ cNd cNd aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +gXs +gXs +gXs +gXs +gXs aaS aaS aaS @@ -81096,10 +85388,16 @@ aaS aaa aaa aaa +gXs +aaa +ktS +aaa +aaa +aaa alU -anl -amE -amC +enJ +enJ +arL alU qjo alU @@ -81127,13 +85425,13 @@ aPD aQT aQN aTC -aUs +dyC aUY aXv aYS +aUt aQN -aQN -vhb +rbH bbO aPA aSg @@ -81330,6 +85628,7 @@ aaa aaa aaa aaa +gXs aaa aaa aaa @@ -81337,25 +85636,24 @@ aaa aaa aaa aaa +gXs aaa aaa aaa aaa +gXs aaa aaa aaa -aaa -aaa -aaa -aaa +gXs aaa aaa aaa aaa aaa alU -alU -alU +rwj +nPr amC alU alU @@ -81384,11 +85682,11 @@ aPA pqs aQN aTC -aUs +dyC mTG aXt ijG -aQN +aUt aQN aPA aPA @@ -81587,6 +85885,7 @@ aaa aaa aaa aaa +gXs aaa aaa aaa @@ -81594,26 +85893,25 @@ aaa aaa aaa aaa +gXs +aaa +aaa +aaa +aaa +gXs +aaa +aaa +aaa +gXs aaa aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -alU -anm -alU -amC +ali +fDn +gFs +aKY alU xFM alU @@ -81641,11 +85939,11 @@ aPE aQV aQN aTC -aUu +aXv gxc aXt ijG -aQN +aUt aQN aZB aPA @@ -81839,6 +86137,12 @@ aaa aaa aaa aaa +gXs +gXs +gXs +gXs +gXs +gXs aaa aaa aaa @@ -81846,22 +86150,16 @@ aaa aaa aaa aaa +gXs aaa aaa aaa aaa +gXs aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +gXs aaa aaa aaa @@ -81886,7 +86184,7 @@ ayy aAO aBN aDe -aDe +fZR aFT aDe aIU @@ -81898,11 +86196,11 @@ aPA aiB aQN nLw -sLa +pnc oyl aXw qfk -aQN +aUt aQN aZA aPA @@ -82096,29 +86394,29 @@ aaa aaa aaa aaa +gXs aaa aaa aaa aaa +gXs +aaa +aaa +aaa +eRz +eRz +eRz +gXs +gXs aaa aaa aaa aaa +eRz aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +gXs aaa aaa aaa @@ -82155,11 +86453,11 @@ aPA aQX aQN aSi -aUv +aTy aWp aTy aTy -aTy +aUv aTy bbs bcw @@ -82353,29 +86651,29 @@ aaa aaa aaa aaa +gXs aaa aaa aaa aaa +gXs +aaa +aaa +aaa +eRz +aaa +aaa +aaa +gXs aaa aaa aaa aaa +eRz aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +gXs aaa aaa aaa @@ -82606,32 +86904,32 @@ aaa aaa aaa aaa +gXs +gXs +gXs +aaa +gXs aaa aaa aaa aaa +gXs aaa aaa aaa +eRz aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +gXs +gXs +gXs +gXs +gXs +eRz +gXs +gXs +gXs ali ali alU @@ -82652,9 +86950,9 @@ lZN amC jIW nBI -aDy -fgG -rqW +eky +mau +eAe wUr tJi aLP @@ -82862,33 +87160,33 @@ cNd aaa aaa aaa +eRz +eRz +eRz +eRz +eRz +eRz +eRz +eRz +eRz +eRz +eRz +aaa +aaa +aaa +gXs +aaa +aaa +aaa +gXs aaa aaa aaa aaa +eRz aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aae -aaa -aaa ali anL avY @@ -82909,9 +87207,9 @@ alU amC ntt ugq -aEU -rPU -fne +kkK +jBZ +uOd wUr aHI fOA @@ -83118,31 +87416,31 @@ cNd cNd aaa aaa +gXs +eRz +aaa +gXs aaa aaa +gXs aaa aaa +gXs +aaa +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +aaa +aae aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +eRz aaa aaa aaa @@ -83167,8 +87465,8 @@ aFJ ntt nBI wUr -aCh -pIf +fvU +gER kCo aHK aHK @@ -83375,6 +87673,18 @@ cNd cNd aaa aaa +gXs +eRz +aaa +aaa +aaa +aaa +gXs +gXs +aaa +gXs +aaa +gXs aaa aaa aaa @@ -83382,24 +87692,12 @@ aaa aaa aaa aaa +gXs aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +gXs aaa aaa aaa @@ -83423,9 +87721,9 @@ alU alU awa axp -aGf -azH -eEe +tcU +fnE +gLw wUr aCr aLT @@ -83633,33 +87931,33 @@ cNd aaa aaa aaa +eRz aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +rcV +szn +hKo +fNB +szn +qLo +mJH +szn +szn +szn +szn +szn +szn +mbC +mbC +mbC +mbC +gXs +jJP +gXs +gXs +gXs +gXs +gXs +gXs ali ali alU @@ -83677,16 +87975,16 @@ gQr xbi wje rQJ -uUi +arP avZ xtP wUr -sNK -xmo +sYv +rDh wUr mzB -mJG -tWj +uSc +wHm qTG aJe aKw @@ -83880,44 +88178,44 @@ cNd cNd cNd cNd +cNd +cNd +cNd +cNd aaa aaa aaa aaa +gDl +aaa +eRz +gXs +gXs +szn +suC +qZT +dYQ +lGm +pwF +lJA +mvV +tso +lJA +mvV +tso +abc +dIZ +dIZ +mbC +abc +abc +hEL +abc aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +gXs aaa aaa aaa @@ -84137,44 +88435,44 @@ cNd cNd cNd cNd +cNd +cNd +cNd +cNd +aaa +gXs aaa aaa aaa aaa +eRz +aaa +aaa +szn +mAT +ifM +wnX +mAT +mAT +lJA +yeU +rBK +lJA +giE +rBK +abc +obs +rBY +mbC +jvO +dfj +fgd +abc aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +gXs aaa aaa aaa @@ -84204,9 +88502,9 @@ aOs ngs uRS fcn -aLN -rTu -aOt +trT +jSD +nDd aPK aPK aPK @@ -84394,44 +88692,44 @@ cNd cNd cNd cNd +cNd +cNd +cNd +cNd aaa +gXs aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +fIs +fIs +fIs +eRz +gXs +gXs +szn +lJA +czP +iCN +lJA +lJA +lJA +ewG +eoJ +lJA +lEf +ejr +abc +tJE +hEL +mbC +rgu +fbr +mCm +abc +abc +abu +abu +abu +abc aaa aaa aaa @@ -84651,44 +88949,44 @@ cNd cNd cNd cNd +cNd +cNd +cNd +cNd +aaa +gXs +gXs +fIs aaa aaa +gXs aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +gXs +kma +fdJ +hch +reE +tdd +cJA +tOk +knA +vws +tkx +epj +lDm +xnF +pFj +kcB +gyy +xUC +vCS +gcX +pRi +rsn +qIW +aca +ebo +yeZ aaa aaa aaa @@ -84910,42 +89208,42 @@ cNd cNd aaa aaa +eRz +eRz +eRz +eRz +eRz +eRz +gXs +gXs +gXs aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aae -aaa -aaa -aaa -aaa +gXs +yco +lZp +qgj +lYI +hzC +ggT +fdR +qwA +oqf +wcS +pFt +lAD +lJA +lJA +lJA +szn +ili +waX +mCo +eRS +naj +liJ +acc +rAW +abe aaa aaa aaa @@ -84958,7 +89256,7 @@ anO aaa aaa arP -aqR +qae aqR arP asQ @@ -85167,42 +89465,42 @@ cNd cNd aaa aaa +eRz +aaa +gXs +gXs aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +adI +oUF +eCB +adI +qCc +qCc +wgu +qCc +qCc +qCc +lvw +gMB +lJA +tnH +wVt +gSj +vYF +txs +szn +jKc +mjJ +eJu +eSJ +qNU +moe +acb +gcm +tqk aaa aaa aaa @@ -85220,7 +89518,7 @@ dPq arP asP cya -arP +avZ axu ayH ktS @@ -85424,42 +89722,42 @@ cNd cNd aaa aaa +eRz aaa aaa +gXs +aaa +gXs aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jLv -aaa -aaa -aaa -gWo -gWo -gWo -dYZ -gWo -gWo +adI +hzs +evh +ycL +qCc +rUr +jlQ +gZT +hQw +qCc +kcR +rBK +lJA +weW +xNV +gxK +dJu +fbY +szn +abd +khO +enB +enB +enB +enB +enB +enB +sKA gXs gXs gXs @@ -85681,37 +89979,37 @@ cNd cNd aaa aaa +sMu aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abc -abc -abc +adI +xWS +adI +xWS +adI +adI +lCt +qcU +vRN +qCc +icS +mqQ +qYa +wIl +qCc +sfz +tbR +lJA +ryi +cCr +lJA +lJA +lJA +szn +noJ +uql afu -abc +acd wdr itQ pgn @@ -85938,37 +90236,37 @@ cNd cNd aaa aaa +eRz aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -abc -aea -aeH -aft -abc +oUF +llb +eXI +gLu +vwQ +acG +hzs +hnp +jVV +qCc +qCc +qCc +qCc +qCc +qCc +acG +acG +lJA +maP +lHK +nRO +vYF +txs +szn +ksa +dQS +afu +acd pDe dly mnC @@ -86090,7 +90388,7 @@ bgO jBA btG aaa -kvl +iDo ctv iDo aaa @@ -86195,38 +90493,38 @@ cNd cNd aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +eRz aaa gXs -gXs -gXs -abc -abu -abu -abu -abc -abc -aec -aeJ +adI +lNQ +eDF +jYl +lUU +acG +acG +aaW +wVq +acG +qFK +jRW +dLi +evc +qto +pGA +acG +mnu +xGm +xNV +oTx +nko +vFZ +szn +noJ +uql afw -abc -abc +acd +acd dly xxp mcp @@ -86349,7 +90647,7 @@ aaa aaa iDo ctv -aaT +iDo aaa aaa aaa @@ -86452,38 +90750,38 @@ cNd cNd aaa aaa +eRz aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aae -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -gXs -aai -aai -aai +oUF +iMy +cTo +ltm +kkb +xfW +aaN +kMn +rDc +grd +wpV +tYg +tAS +sAm +jrR +teq +acG +cVE abb abt -aca -acz -acX -adC +lJA +lJA +lJA +szn aeb -aeI +uql afv agf -abc +acd dly xxp mcp @@ -86606,7 +90904,7 @@ aaa aaa iDo iDo -aaT +iDo aaa aaa aaa @@ -86709,38 +91007,38 @@ cNd cNd aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aai -eqd +eRz +gXs +gXs +adI +mwN +kfG +uJY +vhC +tLC +aaN +uLB +kGj +acG +lux +gPY +ktW +qQK +uuw +dPs +acG kgr -abe -abw -acc -acB -acZ -adE -aee +nFA +wVt +pZD +vYF +tCs +szn +pIR aeL afy agh -abc +acd kCa hnU vda @@ -86965,39 +91263,39 @@ cNd cNd cNd aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa gXs -aai -gbu +eRz +aaa +aaa +oUF +xFj +jKm +cYf +kkb +tAS +pgq +peD +sBM +acG +aaN +jOB +acG +acG +acG +acG +acG aay -abd +oss abv -acb +pPE acA acI adD aed -aeK -afx +wGc +afv agg -abc +acd ovv dCV idK @@ -87222,39 +91520,39 @@ cNd cNd cNd aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaf -aaf -aai -acd +gXs +sMu +gXs +gXs +adI +adI +yhI +lLu +dLZ +vYY +mui +gcV +lic +aau +xbP +mHH +fMF +ueN +iqi +fKN +acG mIZ abg -enB -aby -aby -aby -aby +lJA +lJA +lJA +lJA +szn aeg -aeN +ryN afA -afA -abc +acd +acd kuA laq kdP @@ -87477,41 +91775,41 @@ cNd cNd cNd cNd -cNd +gXs +gXs +gXs +eRz aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaf -aaf -aaf -aai -aai +oUF +vim +kYm +mke +hpY +obq +fiR +dPE +pTT +jIH +rqq +acG +mxZ +xMS +pnb abf aaK jRw aaU -acd +eDJ acC ada adF aef aeM -afz -oSl -ail +aav +ldY +xkk lRb vIi fsj @@ -87737,35 +92035,35 @@ cNd cNd aaa aaa +eRz aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aag +rcV +adI +adI +adI +acG +acG +acG +lBk +jxx +acG thB -aai -aai -aai -aai +rqq +acG +acG +jTy aaI -aat -aat -aat -aat +acG +gXu +wAN +ruu ace -aat +ref aat adH -aei -aeO +aem +ikv afJ sXV sXV @@ -87994,35 +92292,35 @@ cNd cNd aaa aaa +eRz +eRz +gXs aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aag -aaf -aai +gXs +adI +msp +pHK +wkU +sNj +rDm +acG +sAT +rqq aan -aaw -aaB -qmn -aaJ -aat +acG +acG +acG +acG +xLQ abh -aat acd +ozh abK acY -adG +aai aeh -aeO +lJS ado afq afH @@ -88252,32 +92550,32 @@ cNd aaa aaa aaa +eRz aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aag -aaa +xWS +gcY +oVL +dSh +xBJ +fMY +acG +pUf aam aap -saX +aau aaD aau -aat -aat -aat +vMi +oKB +vhy abA -acd -acd -acd -acd +jNN +jRV +hkA +aai aek acp aav @@ -88509,32 +92807,32 @@ cNd aaa aaa aaa +eRz +eRz +eRz aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aag -aaf -aai +uKW +tAS +tAS +eoR +tAS +ooF +acG +viH +siz aao aax aaC aaA -aat -aat -aat +ngq +tWe +jHp aei -acd +fFR acE add -adF +aai aej aeQ adp @@ -88766,36 +93064,36 @@ cNd aaa aaa aaa +gXs aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aag -aaa -aam -aar +eRz +gXs +gXs +uKW +oIl +tAS +eoR +ecB +dnX +acG +acG +mZu +acG uGI aaF -aat -aat +qbk +ske aaW -aat -abB -acf -abM +xjU +acG +acG +acG acG adI -aem +xKl omX afG -aim +xuu afL ahu aie @@ -89023,32 +93321,32 @@ cNd aaa aaa aaa +gXs +aaa +eRz aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aag -aaf -aai -aaq +uhK +xAA +jSY +hxg +acK +ssc +acG +uOm +nLP +acG dyS aaE -aat +aaN aaN aaV rvS -aat -acd +etr +tyb abL adb -acd +adI ael aeO afF @@ -89280,35 +93578,35 @@ cNd aaa aaa aaa +gXs +aaa +eRz aaa aaa -aaa -aaa -aae -aaa -aaa -aaa -aaa -aaa -aaa -aag -aaa -aam -aaj -aat -aat -aat +adI +oIl +uUb +eZI +qZQ +dNP +acG +hJO +mpY +acG +szf +rDm +gVc qXg -jjC +acG xOx -abD -acd -acd -acd -acd +oPY +ncU +lvc +epG +adI aen aeO -ahE +afG afq aii afM @@ -89368,7 +93666,7 @@ bmo bnR bpe bqB -bqq +unQ btD buO bwk @@ -89537,32 +93835,32 @@ cNd aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aag -aaf -aai -aas -aat -aat -aat -aat -uEI -aat -abC -acd +gXs +gXs +eRz +gXs +gXs +adI +jnk +emf +vHK +vHK +vHK +vHK +vHK +acG +acG +fdS +qRI +jvB +iwU +acG +ltw +eDf +oXV acH adc -acd +adI aeo aev aeS @@ -89796,34 +94094,34 @@ aaa aaa aaa aaa +eRz aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aag -aaa -aam -akQ -aav -aav -aav -aav -aav -aav +jnk +qOY +pBd +kGL +fcj +jqK +vHK +rTj +rTj +goJ +kLK +rTj +hvC +acG +oiY abE acg acJ -ade +adb adJ aep aeT -ahE -aim +afG +xuu ajL akj afM @@ -89874,7 +94172,7 @@ bde kvL bcd bcd -gNC +bcd bcd bcd bcd @@ -90053,30 +94351,30 @@ aaa aaa aaa aaa +eRz aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aag -aaf -aai -wYc -wYc +jnk +sIn +eZS +iBj +pGs +iBq +vHK +dCd +aaP +xpH aaG wYc aaP -aaX +acG keM xib -acd +acG acD -acY -adG +cNi +adI aeq aeV agj @@ -90130,7 +94428,7 @@ bbh bcc bdd cVs -bfr +mwj bbX bif aZM @@ -90310,30 +94608,30 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aag -aaa -aai -aai -aai -aai -aai -aai -aai +eRz +eRz +gXs +gXs +jnk +jnk +jnk +jnk +vHK +vHK +vHK +xMg +tPY +ugi +lht +jVP +tPY +acG abj abF -acd -acd -acd -acd +eIW +mJy +ldT +cSp aeP afC agk @@ -90387,10 +94685,10 @@ bbk bbk bfu bbk -bfs -ctv -ctv -ctv +jmL +aZM +aZM +aZM ktS gXs ktS @@ -90568,29 +94866,29 @@ aaa aaa aaa aaa +eRz aaa aaa +gXs aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaf -aaf -aaa -aaf -aai +gXs +adI +olH +mte +lpx +nZs +nZs +nZs +sYV +nZs +maU +acG abi eqA ach -acK +wAj adf -acd +mhv aer afB agi @@ -90644,7 +94942,7 @@ bbj bce bdf beb -xPY +aYv ktS ktS ktS @@ -90823,31 +95121,31 @@ aaa aaa aaa aaa +gDl +aaa +eRz aaa aaa +gXs aaa aaa -aaa -aaa -aaa -aaa -aaa -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf +adI +noR +nSI +sHd +tAS +tHO aaR -aai -aai -aai -aai -aai -aai -aai +jUN +peE +aaR +adI +adI +adI +adI +adI +adI +adI aaZ aaZ aiX @@ -90901,10 +95199,10 @@ aZR aZR bbm bec -lld -vBa -aBa -pyC +bfu +hty +lpQ +sUx iZd wql wql @@ -91082,23 +95380,23 @@ aaa aaa aaa aaa +eRz +eRz +eRz +eRz aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaf -aaa -aaf -aaf +adI +sew +suS +qvc +adb +kOE +dxv +fmR +dzK +adb +adI aaT aaf abx @@ -91340,22 +95638,22 @@ aaa aaa aaa aaa +gXs +gXs +eRz aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaf -aaa -aaf -aaf +rcV +adI +adI +adI +adI +oUF +gfw +adI +adI +nqu +uZY +adI aaT gXs abG @@ -91415,7 +95713,7 @@ bbm bbm bdh bee -bfv +nVz xUL tyX gpD @@ -91598,21 +95896,21 @@ aaa aaa aaa aaa +gXs +eRz aaa aaa aaa aaa +gXs aaa aaa aaa aaa +gXs aaa +gXs aaa -aaa -aaf -aaa -aaf -aaf abY gXs abG @@ -91672,10 +95970,10 @@ cBj bcf bdg bed -bfv +nVz tyX pst -cTT +hoL alu aEM aGd @@ -91852,24 +96150,24 @@ aaa aaa aaa aaa +gXs +gXs +gXs +gXs +eRz +aaa +gXs +aaa +aaa +gXs aaa aaa aaa aaa +gXs aaa +gXs aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaf -aaa -aaf -aaf aaT gXs abG @@ -91929,7 +96227,7 @@ bbm bbm bdh bef -bfv +nVz gTx tyX xEB @@ -92113,18 +96411,18 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaf -aaa +eRz +eRz +eRz +eRz +eRz +eRz +eRz +eRz +eRz +eRz +aaT +eRz aaf aaf aaT @@ -92186,7 +96484,7 @@ aZR aZR aZR aZR -bfw +otC wZI gDO aBW @@ -92372,18 +96670,18 @@ aaa aaa aaa aaa +gXs +gXs +gXs +gXs +gXs aaa -aaa -aaa -aaa -aaa -aaa -aaa +gXs aaa aaf aaa aaf -aaf +ktS abY gXs abG @@ -92443,10 +96741,10 @@ aZR aZR bbm beh -opg -qcm -ddV -ygG +bfx +dYl +kzn +hQX iss iss lcx @@ -92630,17 +96928,17 @@ aaa aaa aaa aaa +gXs +aaa +gXs aaa aaa -aaa -aaa -aaa -aaa +gXs aaa aaf aaa aaf -aaf +ktS adR abo adR @@ -92700,7 +96998,7 @@ bbn bcg aZU beg -igi +aYB ktS ktS ktS @@ -92887,17 +97185,17 @@ aaa aaa aaa aaa +gXs +aaa +gXs aaa aaa -aaa -aaa -aaa -aaa +gXs aaa aaf aaa aaf -aaf +ktS adR aaY abJ @@ -92957,10 +97255,10 @@ bbp bbp bfx bbp -bfz -sqp -ctv -ctv +uZM +aZV +aZV +aZV ktS gXs ktS @@ -93146,15 +97444,15 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa +gXs +gXs +gXs +gXs aaf aaf aaf aaf -aaa +gXs abo abk abk @@ -93215,7 +97513,7 @@ bch bdi bbw bfy -bgS +bbw bik aZV aZV @@ -93403,7 +97701,7 @@ aaa aaa aaa aaa -aaa +gXs aaa aaa aaa @@ -93472,7 +97770,7 @@ bdk mRQ bek bfB -bgU +vde bdk bjF blc @@ -93660,7 +97958,7 @@ aaa aaa aaa aaa -aaa +gXs aaa aaa aaa @@ -93668,7 +97966,7 @@ aaa aaa aaa aaf -aaa +gXs abo abO abO @@ -93729,7 +98027,7 @@ bej bdj bej bfA -bgT +jfZ bil bej blb @@ -93917,7 +98215,7 @@ aaa aaa aaa aaa -aaa +gXs aaa aaa aaa @@ -93986,7 +98284,7 @@ baQ wcB bcQ bfC -bgV +eOu bim bjG aZV @@ -94174,11 +98472,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +gXs +gXs +gXs +gXs +gXs aaf aaf aaf @@ -94243,7 +98541,7 @@ baP asD bcP cBo -bgS +bbw bbw bbw aZV @@ -94500,7 +98798,7 @@ bcm bcm bem bfD -bgW +wxf bfD bjI aZV @@ -95507,7 +99805,7 @@ aAi uIO aCn xBk -dtx +hlS aGm aHV aDM @@ -95764,10 +100062,10 @@ kmw xrN aAh aAh +exX aAh aAh -aAh -aDN +voT aAh aMo aNC @@ -96020,9 +100318,9 @@ aze awr flE aAh -aDU -aBz -aBz +muv +gyQ +fOK aAh dTI ujv @@ -96277,11 +100575,11 @@ awr azX aAZ aCe -aDT -cPn -cPn -mkO -uQS +oTH +lPG +ncg +aCe +lfu aAh aJC aJC @@ -96534,12 +100832,12 @@ awr avG aBA aAh -aDP -aBx -aBx aAh -qqs -sYR +aAh +aAh +aAh +aJC +aJC aMq adq aQb @@ -96791,13 +101089,13 @@ lgX qvf wqF aAh -aAh -aAh -aAh -aAh -aAh -aAh -aKR +nGR +qCw +fCJ +fiv +aJC +fWi +hIL aKR fxe aPY @@ -97047,14 +101345,14 @@ axT axW aAl cHf +tZp +wxk +xwB +lWD +dvb aJC -aDR -aFl -kqI -aHZ -aJC -aKJ -hIL +nNF +aKR aKR wxT moD @@ -97304,14 +101602,14 @@ axS azk aAk tvi -aJC -aDY -aDY -kqI -aKR -aJk -aKR -aKR +tZp +flG +jqD +giy +yfX +wII +aMu +kEJ aKR aKR aKR @@ -97399,7 +101697,7 @@ aaa aaa aaa aaa -jAD +fIs aaa aaa aaa @@ -97561,14 +101859,14 @@ awr awr aAn rqk +tZp +mcE +dsi +fgl +rZE aJC -aEc -aFk -aGw -aKR -aJC -aKr -aKR +kgB +oDD aKR sLj sLj @@ -97818,14 +102116,14 @@ awr awr aAn jGW -aJC -aJC -plC -oAb -aJC +tZp +tZp +dGa +tZp +tZp aJC aKq -aKR +oDD aNF hOv oax @@ -98078,11 +102376,11 @@ uxY aBC aCt aEA -aGz -aIb +lsS +kuw aJC -aKN -aKR +eTA +oDD aKR aOJ oIJ @@ -98335,11 +102633,11 @@ vyp aBB aBB aBB -aGy +tZa aIa cNE aKM -aMu +feG aMu feG tif @@ -98661,7 +102959,7 @@ cCS bMK bMK bMK -gXs +gJi aaa aaa aaa @@ -99175,7 +103473,7 @@ bMK bMK bMK bMK -aaf +aag aoV aoV aoV @@ -103202,7 +107500,7 @@ aaf aaf aaf aaf -cxW +aag alO anf anf @@ -111498,7 +115796,7 @@ mRe olr bPL cVK -bTo +uCn eaI cbZ bSl @@ -112008,11 +116306,11 @@ cbe bTp vCt bVs -fKl -bXt -bPM +suN +pCE +qoT bZh -itG +bXs cbe wvX bSl @@ -112262,14 +116560,14 @@ bEC bSl dMZ bXs +vPE bXs -bXs -gwd -ycu -oHU -uNu -bXs -bXs +bVt +dfh +jSO +jgm +oUh +vPE bXs bXs bSl @@ -112519,14 +116817,14 @@ cOe bSl bUq flc -vPE -bXs -bVt -dfh -jSO -jgm -oUh -vPE +bSl +bSl +bSl +bSl +bSl +bSl +bSl +bSl jrE saK bSl @@ -112772,17 +117070,17 @@ bKb cNX cNZ cNZ -jCq -bSl -bSl -bSl -bSl -bSl -bSl +nyn bSl bSl bSl bSl +kPi +cOe +cae +oMT +wCQ +xzd bSl bSl bSl @@ -113028,22 +117326,22 @@ bGL bKd cNY bMC -cOb +lVy jHt bPO kob bSm bTr -bTr -bTr -bTr -bTr -bTr +tyE +lkT +cUb +lkT +tyE bTr bTr cbg bTr -bTr +tyE bTr nGt cbg @@ -113561,13 +117859,13 @@ ccW cNW clt cNW -cfv +wYn cNW -mug -hUJ -ixd +gOF +gGK +lOr cNW -ktS +gXs aaf aaf aaf @@ -113816,13 +118114,13 @@ cNW wly ccV noa -clu -cNW -xgs +iQg +ccU +pcz srk +tAy srk -srk -oYQ +wfC cNW aaa aaf @@ -114077,11 +118375,11 @@ ceT cNW gGK chH -dEh +eUX srk gGK cNW -ktS +gXs aaf aaf aaf @@ -114332,11 +118630,11 @@ cNW cNW cPH cNW -gGK -pcK +xgs +qlV srk -dHp -uRn +fkh +gcx cNW aaa aaf @@ -114590,10 +118888,10 @@ cNW ceU cNW cgy +ltv gGK -gGK -uRn -dBm +teS +jdu cNW aaa aaf @@ -114827,7 +119125,7 @@ gXs aaf aaa cNW -bPP +pzP tsq pkS olh @@ -114852,7 +119150,7 @@ cNW cNW cNW cNW -ktS +gXs aaf aaf aaf diff --git a/_maps/map_files/CogStation/CogStation.dmm b/_maps/map_files/CogStation/CogStation.dmm index 25598ac9a1..74debaa989 100644 --- a/_maps/map_files/CogStation/CogStation.dmm +++ b/_maps/map_files/CogStation/CogStation.dmm @@ -9962,6 +9962,7 @@ /area/security/prison) "axk" = ( /obj/item/storage/pill_bottle/penis_enlargement, +/obj/effect/landmark/start/prisoner, /turf/open/floor/plasteel/freezer, /area/security/prison) "axl" = ( @@ -71005,6 +71006,11 @@ /obj/machinery/atmospherics/pipe/simple/violet/visible, /turf/open/floor/plasteel, /area/engineering/atmos) +"kTm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/prisoner, +/turf/open/floor/plating, +/area/security/prison) "lcD" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer{ dir = 1 @@ -71078,6 +71084,11 @@ /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, /area/tcommsat/computer) +"mTf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/prisoner, +/turf/open/floor/plasteel, +/area/security/prison) "nvn" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -95879,7 +95890,7 @@ adE aew afG agP -agP +kTm aiL ajT anu @@ -95894,7 +95905,7 @@ aHT aJt aJN aQg -akv +mTf aew ayU aSQ @@ -96395,7 +96406,7 @@ afY agP agP aiL -akv +mTf anw akv akv diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 2108c61d32..904b8958af 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -10552,6 +10552,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/effect/landmark/start/prisoner, /turf/open/floor/plasteel, /area/security/prison) "aMj" = ( @@ -12412,6 +12413,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/landmark/start/prisoner, /turf/open/floor/plasteel, /area/security/prison) "aUx" = ( @@ -12458,6 +12460,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/landmark/start/prisoner, /turf/open/floor/plasteel, /area/security/prison) "aUA" = ( @@ -12486,6 +12489,7 @@ /area/security/prison) "aUB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/landmark/start/prisoner, /turf/open/floor/plating{ icon_state = "panelscorched" }, diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 2690cb1644..731641d737 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -55924,6 +55924,7 @@ dir = 1; pixel_y = -22 }, +/obj/effect/landmark/start/prisoner, /turf/open/floor/plasteel/showroomfloor, /area/security/prison) "bLR" = ( @@ -59245,6 +59246,7 @@ dir = 1; pixel_y = -22 }, +/obj/effect/landmark/start/prisoner, /turf/open/floor/plasteel/showroomfloor, /area/security/prison) "bRc" = ( @@ -61866,6 +61868,7 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/effect/landmark/start/prisoner, /turf/open/floor/plasteel/showroomfloor, /area/security/prison) "bVq" = ( @@ -79329,6 +79332,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/neutral, +/obj/effect/landmark/start/prisoner, /turf/open/floor/plasteel/dark, /area/security/prison) "czS" = ( diff --git a/_maps/map_files/LambdaStation/lambda.dmm b/_maps/map_files/LambdaStation/lambda.dmm index 98bdbe6542..e4aee6ffd6 100644 --- a/_maps/map_files/LambdaStation/lambda.dmm +++ b/_maps/map_files/LambdaStation/lambda.dmm @@ -443,6 +443,7 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/effect/landmark/start/prisoner, /turf/open/floor/plasteel, /area/security/prison) "abr" = ( @@ -63052,6 +63053,11 @@ }, /turf/open/space/basic, /area/space) +"cZI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/prisoner, +/turf/open/floor/plasteel, +/area/security/prison) "dcB" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -112428,7 +112434,7 @@ agJ ahA ady bPZ -adx +cZI adx ama aNh @@ -113456,7 +113462,7 @@ afg agM ady ajM -adx +cZI adx asb baj @@ -115255,7 +115261,7 @@ amN agQ ady aiu -adx +cZI adx amc beg diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 57a4831073..9279c8f11b 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -1344,6 +1344,7 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/landmark/start/prisoner, /turf/open/floor/plasteel, /area/security/prison) "adw" = ( @@ -45097,6 +45098,10 @@ /obj/effect/landmark/start/scientist, /turf/open/floor/plasteel/white, /area/science/xenobiology) +"cUU" = ( +/obj/effect/landmark/start/prisoner, +/turf/open/floor/plasteel, +/area/security/prison) "cUZ" = ( /obj/docking_port/stationary{ dir = 8; @@ -81318,6 +81323,13 @@ }, /turf/open/floor/plating, /area/command/bridge) +"wXA" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/landmark/start/prisoner, +/turf/open/floor/plasteel, +/area/security/prison) "wXC" = ( /obj/machinery/light_switch{ pixel_y = 28 @@ -105902,7 +105914,7 @@ abC acr acE adb -aaR +cUU aaR aem aeN @@ -107181,7 +107193,7 @@ aaC aaI aaR abb -aaI +wXA abG acb acu @@ -107958,7 +107970,7 @@ aaR aaR aaR ade -aaR +cUU aaR aeo aeV diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 385df5e097..92f9ff0c53 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -1648,19 +1648,12 @@ /turf/open/floor/plating, /area/maintenance/starboard) "acx" = ( -/obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/obj/effect/landmark/xeno_spawn, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/maintenance/starboard) +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/restrooms) "acy" = ( /obj/machinery/door/airlock/external{ name = "External Airlock"; @@ -5386,12 +5379,14 @@ /turf/open/floor/plating/asteroid, /area/security/prison) "aiw" = ( -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /obj/item/stack/cable_coil/white, /obj/item/stack/cable_coil/white, /obj/item/stack/sheet/glass, /obj/item/stack/sheet/glass, /obj/item/circuitboard/machine/microwave, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plating{ icon_state = "panelscorched" }, @@ -5797,9 +5792,6 @@ /turf/open/floor/plating, /area/security/brig) "ajd" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, @@ -5810,6 +5802,7 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/structure/closet/crate/bin, /turf/open/floor/plasteel, /area/hallway/primary/port/fore) "aje" = ( @@ -6468,12 +6461,10 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, -/obj/structure/cable/white{ - icon_state = "2-8" - }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/chair, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -6489,6 +6480,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/chair, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -6504,6 +6496,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/cable/white{ + icon_state = "2-8" + }, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -7138,26 +7133,17 @@ "ald" = ( /obj/structure/sign/nanotrasen, /turf/closed/wall, -/area/commons/toilet/restrooms) +/area/service/lawoffice) "ale" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Primary Restroom" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable/white{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/service/lawoffice) "alf" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, -/area/commons/toilet/restrooms) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/service/lawoffice) "alg" = ( /turf/closed/wall/r_wall, /area/command/teleporter) @@ -7614,35 +7600,29 @@ /turf/open/floor/plasteel, /area/hallway/primary/port/fore) "alT" = ( -/obj/structure/table, -/obj/item/storage/firstaid/regular, /obj/structure/extinguisher_cabinet{ pixel_x = -26 }, +/obj/item/kirbyplants{ + icon_state = "plant-22" + }, /obj/machinery/newscaster{ pixel_y = 32 }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/turf/open/floor/wood, +/area/service/lawoffice) "alU" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/delivery, -/obj/structure/cable/white{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/turf/open/floor/wood, +/area/service/lawoffice) "alV" = ( -/obj/structure/urinal{ - pixel_y = 28 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/obj/structure/window/reinforced/spawner/east, +/obj/structure/chair, +/turf/open/floor/wood, +/area/service/lawoffice) "alW" = ( /obj/structure/urinal{ pixel_y = 28 @@ -7650,12 +7630,9 @@ /turf/open/floor/plasteel/freezer, /area/commons/toilet/restrooms) "alX" = ( -/obj/structure/closet/crate/bin, -/obj/machinery/light_switch{ - pixel_y = 24 - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/obj/machinery/vending/wardrobe/law_wardrobe, +/turf/open/floor/wood, +/area/service/lawoffice) "alY" = ( /obj/machinery/shieldwallgen, /obj/machinery/button/door{ @@ -8143,50 +8120,31 @@ /turf/open/floor/plasteel, /area/security/brig) "amO" = ( -/obj/structure/mirror{ - pixel_x = -26 - }, -/obj/structure/sink{ - dir = 8; - pixel_x = -12 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/turf/open/floor/wood, +/area/service/lawoffice) "amP" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/obj/machinery/light/small, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, +/turf/open/floor/wood, +/area/service/lawoffice) +"amQ" = ( +/obj/structure/table/wood, +/obj/structure/window/reinforced/spawner/east, +/obj/structure/window/reinforced/spawner, +/obj/item/clipboard, +/obj/item/folder/red, +/turf/open/floor/wood, +/area/service/lawoffice) +"amR" = ( /obj/structure/cable/white{ icon_state = "1-4" }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) -"amQ" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) -"amR" = ( -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/obj/machinery/light/small, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/turf/open/floor/wood, +/area/service/lawoffice) "amS" = ( /obj/machinery/camera{ - c_tag = "Locker Room Toilets"; + c_tag = "Law Office"; dir = 8 }, /obj/machinery/power/apc{ @@ -8198,8 +8156,11 @@ /obj/structure/cable/white{ icon_state = "0-8" }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/obj/structure/rack, +/obj/item/storage/briefcase, +/obj/item/storage/briefcase, +/turf/open/floor/wood, +/area/service/lawoffice) "amT" = ( /obj/structure/table/reinforced, /obj/item/stack/cable_coil/white, @@ -8665,15 +8626,15 @@ /turf/open/floor/plasteel, /area/hallway/primary/port/fore) "anJ" = ( -/obj/machinery/door/airlock{ - name = "Toilet Unit" +/obj/structure/chair{ + dir = 4 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/turf/open/floor/wood, +/area/service/lawoffice) "anK" = ( /obj/structure/closet/secure_closet/engineering_chief, /obj/effect/turf_decal/tile/neutral{ @@ -9242,40 +9203,30 @@ /turf/open/floor/plasteel, /area/hallway/primary/port) "aoC" = ( -/obj/effect/decal/cleanable/vomit/old, -/obj/structure/toilet{ - dir = 8 +/obj/structure/chair{ + dir = 4 }, -/obj/machinery/newscaster{ - pixel_x = -32 - }, -/obj/machinery/light/small, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/turf/open/floor/wood, +/area/service/lawoffice) "aoD" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/machinery/newscaster{ - pixel_x = -32 - }, /obj/machinery/light/small, -/obj/effect/landmark/blobstart, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/obj/structure/table/wood, +/obj/structure/window/reinforced/spawner/west, +/obj/item/folder/blue, +/turf/open/floor/carpet/green/airless, +/area/service/lawoffice) "aoE" = ( -/obj/structure/toilet{ - dir = 8 +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 }, -/obj/machinery/newscaster{ - pixel_x = -32 +/obj/structure/filingcabinet/employment, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 }, -/obj/machinery/light/small, -/obj/effect/landmark/start/assistant, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/turf/open/floor/wood, +/area/service/lawoffice) "aoF" = ( /obj/structure/table/reinforced, /obj/item/stock_parts/cell/high, @@ -9379,7 +9330,6 @@ /turf/open/floor/plasteel, /area/service/bar/atrium) "aoO" = ( -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /obj/structure/cable/white{ icon_state = "1-2" }, @@ -9392,12 +9342,12 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/service/bar/atrium) "aoP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/structure/cable/white{ icon_state = "4-8" }, @@ -9414,22 +9364,18 @@ /turf/open/floor/plasteel, /area/service/bar/atrium) "aoQ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/structure/cable/white{ icon_state = "4-8" }, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, /turf/open/floor/plasteel, /area/service/bar/atrium) "aoR" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/cable/white{ icon_state = "4-8" @@ -9438,6 +9384,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/service/bar/atrium) "aoS" = ( @@ -9445,9 +9394,6 @@ name = "Maintenance Hatch"; req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/structure/cable/white{ icon_state = "4-8" }, @@ -9457,26 +9403,18 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/starboard/central) -"aoT" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/turf/open/floor/plating, /area/maintenance/starboard/central) "aoU" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, /obj/structure/cable/white{ icon_state = "2-8" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, /turf/open/floor/plating, /area/maintenance/starboard/central) "aoV" = ( @@ -10266,27 +10204,18 @@ /turf/closed/wall, /area/maintenance/starboard/central) "apZ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /turf/open/floor/plating, /area/maintenance/starboard/central) "aqa" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/structure/cable/white{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating{ icon_state = "panelscorched" }, /area/maintenance/starboard/central) "aqb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, /obj/effect/turf_decal/stripes/line{ dir = 10 }, @@ -10936,19 +10865,14 @@ /turf/open/floor/plating, /area/service/bar/atrium) "arg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/white{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating{ icon_state = "platingdmg3" }, /area/maintenance/starboard/central) -"arh" = ( -/obj/structure/girder, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/starboard/central) "ari" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/extinguisher_cabinet{ @@ -11758,19 +11682,21 @@ /turf/open/floor/plasteel/dark, /area/service/bar/atrium) "ask" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/white{ icon_state = "1-4" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, /turf/open/floor/plating, /area/maintenance/starboard/central) "asl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, /obj/structure/cable/white{ icon_state = "4-8" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/starboard/central) "asm" = ( @@ -12453,24 +12379,6 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/security/detectives_office) -"atl" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall, -/area/service/bar/atrium) -"atm" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/service/bar/atrium) -"atn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/turf/closed/wall, -/area/service/bar/atrium) "ato" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -12487,8 +12395,7 @@ /obj/structure/cable/white{ icon_state = "1-2" }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/white/corner, /area/hallway/primary/starboard/fore) "atq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -13161,10 +13068,6 @@ }, /turf/open/floor/plasteel/dark, /area/service/bar/atrium) -"aum" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, -/area/service/bar/atrium) "aun" = ( /obj/effect/landmark/blobstart, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -13196,8 +13099,7 @@ /obj/structure/cable/white{ icon_state = "1-2" }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/white/corner, /area/hallway/primary/starboard/fore) "auq" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible, @@ -13816,9 +13718,6 @@ dir = 8; pixel_x = 24 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -13829,13 +13728,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/service/bar/atrium) -"avr" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 }, -/turf/closed/wall, +/turf/open/floor/plasteel/dark, /area/service/bar/atrium) "avs" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -13865,23 +13761,23 @@ /obj/structure/cable/white{ icon_state = "1-2" }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/white/corner, /area/hallway/primary/starboard/fore) "avv" = ( -/obj/machinery/shieldgen, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 }, -/turf/open/floor/plasteel, -/area/maintenance/starboard) -"avw" = ( -/obj/machinery/shieldgen, -/obj/effect/turf_decal/stripes/line{ - dir = 5 +/obj/structure/mirror{ + pixel_x = -26 }, -/turf/open/floor/plasteel, -/area/maintenance/starboard) +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/restrooms) "avx" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible, /obj/machinery/computer/atmos_control/tank/oxygen_tank{ @@ -14552,7 +14448,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/white{ icon_state = "4-8" }, @@ -14594,11 +14489,9 @@ }, /area/hallway/primary/starboard/fore) "awz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/maintenance/starboard) +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/restrooms) "awA" = ( /turf/open/floor/engine/o2, /area/engineering/atmos) @@ -14970,21 +14863,37 @@ /turf/open/floor/plating, /area/maintenance/starboard/central) "axf" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/structure/table, +/obj/effect/turf_decal/bot, +/obj/structure/bedsheetbin/towel, +/obj/structure/sign/poster/official/cleanliness{ + pixel_y = -32 }, -/turf/open/floor/plasteel, -/area/maintenance/starboard) +/obj/machinery/newscaster{ + pixel_x = -32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_x = -26; + pixel_y = -26 + }, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/restrooms) "axg" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance, -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/obj/machinery/light/small, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 }, -/obj/item/wrench, -/obj/item/wirecutters, -/turf/open/floor/plasteel, -/area/maintenance/starboard) +/obj/effect/turf_decal/bot, +/obj/machinery/light_switch{ + pixel_x = 8; + pixel_y = -24 + }, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/restrooms) "axh" = ( /obj/structure/closet, /obj/effect/spawner/lootdrop/maintenance{ @@ -16011,7 +15920,6 @@ /area/maintenance/starboard/central) "ayT" = ( /obj/structure/girder, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/starboard/central) "ayU" = ( @@ -17273,16 +17181,6 @@ icon_state = "platingdmg3" }, /area/maintenance/starboard/central) -"aAW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/central) "aAX" = ( /obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, /obj/structure/cable/white{ @@ -17951,10 +17849,6 @@ "aCe" = ( /turf/closed/wall, /area/service/kitchen) -"aCf" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, -/area/service/kitchen) "aCg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -19079,32 +18973,13 @@ /area/service/kitchen) "aDU" = ( /obj/effect/landmark/start/cook, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 }, /turf/open/floor/plasteel/white, /area/service/kitchen) -"aDV" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/service/kitchen) "aDW" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /turf/open/floor/plasteel/white, /area/service/kitchen) "aDX" = ( @@ -19112,9 +18987,6 @@ name = "Station Intercom"; pixel_x = 28 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -19127,12 +18999,6 @@ }, /turf/open/floor/plasteel, /area/service/kitchen) -"aDY" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/service/kitchen) "aDZ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -19934,7 +19800,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/white{ icon_state = "4-8" }, @@ -22470,15 +22335,13 @@ /turf/open/floor/plasteel/freezer, /area/service/kitchen) "aIT" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 - }, /obj/structure/cable/white{ icon_state = "1-2" }, /obj/structure/cable/white{ icon_state = "1-4" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/freezer, /area/service/kitchen) "aIU" = ( @@ -22487,9 +22350,6 @@ name = "sink"; pixel_y = 28 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/structure/cable/white{ icon_state = "2-8" }, @@ -22503,16 +22363,10 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/service/kitchen) "aIW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/structure/reagent_dispensers/cooking_oil, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, @@ -23665,6 +23519,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/effect/turf_decal/trimline/green/line, /turf/open/floor/plating, /area/maintenance/port/aft) "aKK" = ( @@ -24055,9 +23910,6 @@ dir = 8; pixel_x = 24 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -24066,17 +23918,8 @@ }, /turf/open/floor/plasteel/dark, /area/service/bar/atrium) -"aLh" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/service/kitchen) "aLi" = ( /obj/structure/kitchenspike, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -24088,32 +23931,12 @@ /obj/structure/extinguisher_cabinet{ pixel_y = -32 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plasteel, /area/service/kitchen) -"aLk" = ( -/obj/structure/kitchenspike, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/service/kitchen) -"aLl" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/turf/closed/wall/rust, -/area/service/kitchen) "aLm" = ( /obj/structure/extinguisher_cabinet{ pixel_x = -24 @@ -24872,23 +24695,16 @@ /turf/closed/wall, /area/maintenance/port/aft) "aME" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plasteel, -/area/maintenance/port/aft) -"aMF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/turf/open/floor/plating{ + icon_state = "platingdmg2" }, -/obj/structure/closet/crate, -/obj/item/stack/ore/silver, -/obj/item/stack/ore/iron, -/obj/item/stack/ore/iron, -/obj/item/stack/ore/iron, -/obj/item/pickaxe/emergency, -/turf/open/floor/plasteel, /area/maintenance/port/aft) "aMG" = ( /obj/structure/girder, @@ -25297,6 +25113,11 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/power/apc{ + areastring = "/area/service/hydroponics"; + name = "Hydroponics APC"; + pixel_y = -26 + }, /turf/open/floor/plasteel, /area/service/hydroponics) "aNr" = ( @@ -25405,18 +25226,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/central) -"aNC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/maintenance/starboard/central) "aND" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -25891,13 +25700,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/rack, +/obj/machinery/shieldgen, /turf/open/floor/plasteel, /area/maintenance/port/aft) -"aOt" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, -/area/maintenance/starboard/central) "aOu" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; @@ -26081,6 +25886,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, +/obj/structure/cable/white{ + icon_state = "1-2" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aOJ" = ( @@ -26731,20 +26539,6 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/medical/morgue) -"aPC" = ( -/obj/machinery/computer/security/telescreen/entertainment, -/obj/structure/bodycontainer/morgue{ - dir = 2 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) "aPD" = ( /obj/machinery/light, /obj/structure/noticeboard{ @@ -27261,8 +27055,10 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "aQw" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "aQx" = ( @@ -27680,6 +27476,7 @@ /turf/open/floor/plating, /area/command/heads_quarters/cmo) "aRm" = ( +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood, /area/maintenance/port/aft) "aRn" = ( @@ -28156,6 +27953,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/shieldgen, /turf/open/floor/plasteel, /area/maintenance/port/aft) "aSg" = ( @@ -29580,6 +29381,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/effect/turf_decal/trimline/green/line, /turf/open/floor/plating, /area/maintenance/port/aft) "aUM" = ( @@ -29602,6 +29404,10 @@ /obj/structure/cable/white{ icon_state = "1-2" }, +/obj/effect/turf_decal/trimline/green/line{ + dir = 8; + icon_state = "trimline" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aUO" = ( @@ -29710,6 +29516,10 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1; + icon_state = "trimline" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aVa" = ( @@ -29720,6 +29530,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1; + icon_state = "trimline" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aVb" = ( @@ -29759,6 +29573,10 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1; + icon_state = "trimline" + }, /turf/open/floor/plating{ icon_state = "panelscorched" }, @@ -29777,6 +29595,10 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1; + icon_state = "trimline" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aVe" = ( @@ -29787,6 +29609,10 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1; + icon_state = "trimline" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aVf" = ( @@ -29803,6 +29629,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/effect/turf_decal/trimline/green/corner{ + dir = 1; + icon_state = "trimline_corner" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aVg" = ( @@ -30084,6 +29914,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, +/obj/effect/turf_decal/trimline/green/line{ + dir = 9; + icon_state = "trimline" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aVJ" = ( @@ -30093,6 +29927,10 @@ /obj/structure/cable/white{ icon_state = "2-4" }, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1; + icon_state = "trimline" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aVK" = ( @@ -30116,6 +29954,10 @@ /obj/structure/cable/white{ icon_state = "1-8" }, +/obj/effect/turf_decal/trimline/green/corner{ + dir = 1; + icon_state = "trimline_corner" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aVN" = ( @@ -30171,7 +30013,6 @@ /turf/open/floor/plasteel, /area/maintenance/port/aft) "aVS" = ( -/obj/structure/bookcase/random/fiction, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -30182,6 +30023,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/bookcase/random/nonfiction, /turf/open/floor/plasteel/dark, /area/service/library) "aVT" = ( @@ -30191,7 +30033,6 @@ /turf/open/floor/plasteel/dark, /area/service/library) "aVU" = ( -/obj/structure/bookcase/random/adult, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -30202,10 +30043,11 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/bookcase/random/reference, /turf/open/floor/plasteel/dark, /area/service/library) "aVV" = ( -/obj/structure/bookcase/random/adult, +/obj/structure/bookcase/random/religion, /turf/open/floor/plasteel/dark, /area/service/library) "aVW" = ( @@ -30564,6 +30406,10 @@ pixel_x = -32 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/trimline/green/line{ + dir = 8; + icon_state = "trimline" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aWx" = ( @@ -30914,6 +30760,10 @@ /obj/structure/cable/white{ icon_state = "4-8" }, +/obj/effect/turf_decal/trimline/green/corner{ + dir = 1; + icon_state = "trimline_corner" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aXe" = ( @@ -30929,11 +30779,12 @@ /turf/closed/wall, /area/service/library) "aXg" = ( -/obj/structure/bookcase/random/nonfiction, +/obj/structure/sign/painting{ + pixel_y = -32 + }, /turf/open/floor/plasteel/dark, /area/service/library) "aXh" = ( -/obj/structure/bookcase/random/nonfiction, /obj/machinery/light, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -30962,7 +30813,6 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "aXj" = ( -/obj/structure/bookcase/random/reference, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -30973,10 +30823,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/service/library) -"aXk" = ( -/obj/structure/bookcase/random/reference, +/obj/structure/sign/painting{ + pixel_y = -32 + }, /turf/open/floor/plasteel/dark, /area/service/library) "aXl" = ( @@ -31337,10 +31186,12 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel, /area/maintenance/port/aft) "aXO" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood, /area/maintenance/port/aft) "aXP" = ( @@ -31843,6 +31694,7 @@ "aYC" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/landmark/event_spawn, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood, /area/maintenance/port/aft) "aYD" = ( @@ -31866,11 +31718,13 @@ /area/medical/virology) "aYF" = ( /obj/structure/chair/comfy/black, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood, /area/maintenance/port/aft) "aYG" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/chair/comfy/black, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood, /area/maintenance/port/aft) "aYH" = ( @@ -32087,6 +31941,7 @@ dir = 1 }, /obj/structure/window/reinforced/spawner/north, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel, /area/maintenance/port/aft) "aYY" = ( @@ -32198,6 +32053,7 @@ dir = 1 }, /obj/effect/landmark/xeno_spawn, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel, /area/maintenance/port/aft) "aZo" = ( @@ -32208,6 +32064,7 @@ /obj/machinery/door/window/northright{ name = "Theatre Stage" }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel, /area/maintenance/port/aft) "aZp" = ( @@ -32215,6 +32072,7 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel, /area/maintenance/port/aft) "aZq" = ( @@ -32228,6 +32086,7 @@ name = "Maintenance Hatch"; req_access_txt = "12" }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel, /area/maintenance/port/aft) "aZr" = ( @@ -32238,6 +32097,7 @@ /obj/machinery/light/small{ dir = 1 }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel, /area/maintenance/port/aft) "aZs" = ( @@ -32248,6 +32108,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel/dark, /area/maintenance/port/aft) "aZt" = ( @@ -32260,6 +32121,7 @@ /obj/structure/table/wood, /obj/item/clothing/suit/syndicatefake, /obj/item/clothing/head/syndicatefake, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel/dark, /area/maintenance/port/aft) "aZu" = ( @@ -32297,7 +32159,8 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, -/obj/structure/bookcase{ +/obj/structure/bookcase/random/adult{ + desc = "Oh whoa, what's this?"; name = "Forbidden Knowledge" }, /turf/open/floor/wood, @@ -32320,6 +32183,7 @@ pixel_y = -3 }, /obj/item/lipstick/random, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel/dark, /area/maintenance/port/aft) "aZy" = ( @@ -32334,6 +32198,7 @@ /obj/item/clothing/head/helmet/justice/escape{ name = "justice helmet" }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel/dark, /area/maintenance/port/aft) "aZz" = ( @@ -32344,6 +32209,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel/dark, /area/maintenance/port/aft) "aZA" = ( @@ -32387,6 +32253,7 @@ /obj/structure/sign/poster/random{ pixel_x = 32 }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood, /area/maintenance/port/aft) "aZD" = ( @@ -33440,15 +33307,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"bbe" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plating/airless, -/area/maintenance/port/aft) "bbf" = ( /obj/machinery/power/smes, /obj/structure/cable/white{ @@ -34363,7 +34221,16 @@ /obj/structure/closet/l3closet/scientist{ pixel_x = -2 }, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, /area/science/mixing) "bcF" = ( /obj/structure/sign/warning/securearea, @@ -35296,7 +35163,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green, /turf/open/floor/plasteel/white, /area/medical/medbay/zone3) "bdV" = ( @@ -35304,8 +35171,8 @@ /obj/structure/cable/white{ icon_state = "1-2" }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ dir = 8 }, /turf/open/floor/plasteel/white, @@ -35619,7 +35486,11 @@ }, /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, /area/science/mixing) "bev" = ( /obj/structure/table/plasmaglass, @@ -35709,7 +35580,11 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, /area/science/mixing) "beB" = ( /obj/structure/cable/white{ @@ -35993,7 +35868,11 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, /area/science/mixing) "beW" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -36038,7 +35917,11 @@ /obj/machinery/portable_atmospherics/scrubber, /obj/item/storage/firstaid/toxin, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, /area/science/mixing) "bfc" = ( /obj/structure/cable/white{ @@ -36193,7 +36076,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ dir = 8 }, /turf/open/floor/plasteel, @@ -36208,12 +36094,22 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/maintenance/starboard/aft) "bfs" = ( /obj/machinery/vending/wardrobe/science_wardrobe, /obj/machinery/light, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, /area/science/mixing) "bft" = ( /obj/structure/closet/secure_closet/RD, @@ -36980,74 +36876,24 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/sand, +/obj/structure/cable/white{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/dark, /area/maintenance/starboard/aft) "bgv" = ( -/obj/machinery/biogenerator, -/obj/item/wrench, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, /obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/weather, +/obj/effect/turf_decal/weather, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/aft) -"bgw" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/machinery/airalarm{ - pixel_y = 24 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/aft) -"bgx" = ( -/obj/machinery/hydroponics/soil, -/obj/item/reagent_containers/food/snacks/grown/tomato, -/obj/item/seeds/tea, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/aft) -"bgy" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/aft) -"bgz" = ( -/obj/machinery/seed_extractor, -/obj/item/reagent_containers/glass/bucket, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/aft) -"bgA" = ( -/obj/machinery/hydroponics/soil, -/obj/item/seeds/poppy, -/obj/item/reagent_containers/food/snacks/grown/cherries, -/obj/item/shovel/spade, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, +/obj/structure/bedsheetbin/towel, +/obj/structure/table/wood/poker, /turf/open/floor/plasteel/dark, /area/maintenance/starboard/aft) "bgB" = ( @@ -37399,32 +37245,26 @@ /turf/open/floor/plasteel/dark, /area/science/xenobiology) "bhj" = ( +/obj/effect/turf_decal/sand/plating, /obj/structure/sink{ dir = 8; pixel_x = -12; pixel_y = 2 }, -/obj/structure/sign/warning/nosmoking{ +/obj/structure/sign/poster/ripped{ pixel_x = -32 }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"bhk" = ( -/turf/open/floor/plating, -/area/maintenance/starboard) "bhm" = ( -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/plating, +/turf/open/floor/plasteel/yellowsiding, /area/maintenance/starboard/aft) "bhn" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 +/obj/machinery/light/floor, +/turf/open/floor/plasteel/yellowsiding/corner{ + dir = 8; + icon_state = "yellowcornersiding" }, -/obj/structure/sign/departments/botany{ - pixel_x = 32 - }, -/turf/open/floor/plating, /area/maintenance/starboard/aft) "bho" = ( /obj/machinery/door/airlock/silver{ @@ -37794,77 +37634,11 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) -"bhT" = ( -/obj/machinery/hydroponics/soil, -/obj/item/seeds/harebell, -/obj/item/reagent_containers/food/snacks/grown/watermelon, -/obj/item/cultivator, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/aft) -"bhU" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/aft) -"bhV" = ( -/obj/machinery/hydroponics/soil, -/obj/item/reagent_containers/food/snacks/grown/wheat, -/obj/item/reagent_containers/glass/bottle/nutrient/ez, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/aft) -"bhW" = ( -/obj/machinery/light/small, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "bhX" = ( -/obj/machinery/hydroponics/soil, -/obj/item/reagent_containers/food/snacks/grown/tea, -/obj/item/hatchet, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/machinery/pool/filter{ + pixel_y = 16 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/aft) -"bhY" = ( -/obj/machinery/hydroponics/soil, -/obj/item/seeds/tower, -/obj/item/reagent_containers/glass/bottle/nutrient/rh, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, +/turf/open/pool, /area/maintenance/starboard/aft) "bhZ" = ( /obj/machinery/light_switch{ @@ -39571,21 +39345,27 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/secondary/exit) +"boD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/commons/toilet/restrooms) "boE" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/dark/visible{ dir = 5 }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/science/mixing) "bpj" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, /obj/machinery/camera{ c_tag = "Toxins Launch Room Access"; dir = 4 }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, /turf/open/floor/plasteel, /area/science/mixing) "bpn" = ( @@ -39607,6 +39387,9 @@ /obj/machinery/meter/atmos, /turf/open/floor/plasteel, /area/engineering/atmos) +"bsq" = ( +/turf/closed/mineral/random/labormineral, +/area/maintenance/starboard/aft) "bsv" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/white{ @@ -40547,6 +40330,7 @@ /obj/structure/cable/white{ icon_state = "0-8" }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating{ icon_state = "panelscorched" }, @@ -40621,14 +40405,21 @@ }, /area/engineering/atmos) "bOJ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, /obj/machinery/atmospherics/components/unary/thermomachine/heater{ dir = 8 }, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/science/mixing) +"bRf" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall, +/area/command/gateway) +"bVs" = ( +/obj/structure/girder, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating, +/area/maintenance/port/aft) "bYE" = ( /obj/structure/sign/warning/fire, /obj/machinery/atmospherics/pipe/simple/general/visible{ @@ -40648,6 +40439,13 @@ dir = 1 }, /area/engineering/atmos) +"caJ" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard) "ccy" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -40767,6 +40565,10 @@ }, /turf/open/floor/engine/vacuum, /area/maintenance/disposal/incinerator) +"cGA" = ( +/obj/machinery/pool/controller, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "cRz" = ( /obj/machinery/button/door{ id = "supplybridge"; @@ -40791,6 +40593,18 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) +"cUd" = ( +/obj/structure/cable/white{ + icon_state = "0-8" + }, +/obj/machinery/power/apc/highcap/ten_k{ + areastring = "/area/command/gateway"; + dir = 1; + name = "Gateway APC"; + pixel_y = 23 + }, +/turf/open/floor/plasteel, +/area/command/gateway) "cWv" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/closed/wall/r_wall, @@ -40832,7 +40646,7 @@ "dfK" = ( /obj/machinery/portable_atmospherics/canister/toxins, /turf/open/floor/plating, -/area/science/storage) +/area/science/mixing) "dfP" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; @@ -40896,6 +40710,10 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"dvB" = ( +/obj/structure/sink/puddle, +/turf/open/floor/plating/asteroid, +/area/maintenance/port/aft) "dFV" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 @@ -40924,6 +40742,20 @@ }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) +"dMx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel, +/area/command/gateway) +"dQg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) "dQC" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -40941,6 +40773,12 @@ }, /turf/open/floor/plasteel, /area/service/bar/atrium) +"dSq" = ( +/turf/open/floor/plasteel/yellowsiding{ + dir = 4; + icon_state = "yellowsiding" + }, +/area/maintenance/starboard/aft) "dXv" = ( /obj/item/transfer_valve{ pixel_x = -5 @@ -40956,7 +40794,7 @@ receive_ore_updates = 1 }, /obj/structure/table/reinforced, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/white, /area/science/mixing) "dYC" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -40982,6 +40820,11 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"ekG" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken" + }, +/area/maintenance/starboard/aft) "emA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -40990,6 +40833,11 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable/white{ + icon_state = "2-8" + }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "eva" = ( @@ -41106,9 +40954,20 @@ }, /turf/open/floor/plasteel/dark, /area/engineering/atmos) -"eGm" = ( -/turf/closed/wall/r_wall, -/area/science/storage) +"eOg" = ( +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/storage/box, +/turf/open/floor/plasteel, +/area/maintenance/starboard) "eOs" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 @@ -41210,6 +41069,11 @@ /obj/machinery/status_display/ai, /turf/closed/wall, /area/commons/lounge) +"fgZ" = ( +/obj/structure/girder/reinforced, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating/airless, +/area/asteroid/nearstation) "fjs" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 @@ -41243,6 +41107,12 @@ }, /turf/open/floor/plasteel, /area/science/mixing) +"fmq" = ( +/obj/structure/table/wood, +/obj/structure/window/reinforced/spawner/west, +/obj/item/flashlight/lamp/green, +/turf/open/floor/carpet/green/airless, +/area/service/lawoffice) "fnp" = ( /obj/machinery/air_sensor/atmos/nitrous_tank, /turf/open/floor/engine/n2o, @@ -41252,10 +41122,19 @@ /obj/item/wrench, /turf/open/space, /area/space/nearstation) -"foz" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/turf/open/floor/plasteel, -/area/science/mixing) +"foP" = ( +/obj/structure/chair/stool/bar, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken" + }, +/area/maintenance/starboard/aft) +"fpH" = ( +/obj/item/seeds/harebell, +/turf/open/space/basic, +/area/space) "fsl" = ( /obj/docking_port/stationary{ dir = 2; @@ -41279,6 +41158,15 @@ }, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) +"fuR" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/science/mixing) "fvd" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -41349,6 +41237,22 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"fNN" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/tea, +/obj/machinery/light/small, +/turf/open/floor/plating/asteroid, +/area/maintenance/port/aft) +"fRe" = ( +/turf/open/floor/plating/airless{ + icon_state = "platingdmg3" + }, +/area/asteroid/nearstation) +"fWh" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken5" + }, +/area/maintenance/starboard/aft) "fWz" = ( /obj/machinery/door/airlock/external{ name = "External Docking Port"; @@ -41406,6 +41310,11 @@ }, /turf/open/floor/plasteel/dark, /area/command/bridge) +"ghr" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) "gii" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -41469,6 +41378,22 @@ }, /turf/open/floor/plating, /area/science/mixing) +"gIT" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) "gLD" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -41489,8 +41414,13 @@ /obj/structure/cable/white{ icon_state = "2-8" }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, +/obj/structure/sign/departments/restroom{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner, /area/hallway/primary/starboard/fore) "gNH" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ @@ -41512,6 +41442,18 @@ }, /turf/open/floor/plasteel, /area/service/bar/atrium) +"gRe" = ( +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/command/gateway) +"gSu" = ( +/turf/open/floor/plasteel/yellowsiding{ + dir = 8; + icon_state = "yellowsiding" + }, +/area/maintenance/starboard/aft) "gSv" = ( /obj/structure/cable{ icon_state = "4-8" @@ -41549,6 +41491,15 @@ }, /turf/open/floor/plasteel/dark, /area/engineering/atmos) +"gWt" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/broken{ + dir = 1; + icon_state = "tube-broken" + }, +/turf/open/floor/carpet/green/airless, +/area/maintenance/starboard/aft) "gZk" = ( /obj/machinery/atmospherics/pipe/simple/dark/visible{ dir = 10 @@ -41568,11 +41519,13 @@ /turf/closed/mineral/random/labormineral, /area/science/test_area) "hiR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plating, +/obj/machinery/light/floor, +/turf/open/floor/plasteel/yellowsiding/corner, /area/maintenance/starboard/aft) +"hkI" = ( +/obj/machinery/gateway/centerstation, +/turf/open/floor/plasteel/dark, +/area/command/gateway) "hpr" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=3.2-AtriumSW"; @@ -41603,6 +41556,11 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall, /area/maintenance/starboard/aft) +"hsR" = ( +/obj/machinery/door/airlock/shuttle/glass, +/obj/machinery/door/firedoor/closed, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "hsV" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -41624,12 +41582,12 @@ pixel_x = 24 }, /obj/structure/cable/white, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/mixing) "hDi" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=3.4-AtriumNE"; location = "3.3-AtriumSE" @@ -41646,6 +41604,27 @@ }, /turf/open/floor/plasteel, /area/service/bar/atrium) +"hGN" = ( +/obj/machinery/light, +/obj/structure/closet/secure_closet/exile, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/command/gateway) +"hIu" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1; + icon_state = "trimline" + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "hNO" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 5 @@ -41694,6 +41673,21 @@ /obj/structure/sign/warning/vacuum, /turf/closed/wall, /area/cargo/storage) +"hSE" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1; + icon_state = "trimline" + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/port/aft) "hTn" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/door/airlock/research/glass{ @@ -41731,6 +41725,15 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engineering/atmos) +"hYy" = ( +/obj/structure/lattice, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/aft) +"hZH" = ( +/turf/open/floor/plating/airless{ + icon_state = "platingdmg2" + }, +/area/asteroid/nearstation) "iaa" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/navbeacon{ @@ -41784,18 +41787,24 @@ /turf/closed/wall, /area/science/mixing) "iiW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel, /area/science/mixing) "iqC" = ( /obj/machinery/air_sensor/atmos/carbon_tank, /turf/open/floor/engine/co2, /area/engineering/atmos) +"isT" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken2" + }, +/area/maintenance/starboard/aft) "ixk" = ( /obj/machinery/atmospherics/pipe/simple/green/visible, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -41809,6 +41818,9 @@ }, /turf/open/floor/engine/vacuum, /area/maintenance/disposal/incinerator) +"iGT" = ( +/turf/closed/wall, +/area/service/lawoffice) "iIj" = ( /obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped{ dir = 4 @@ -41863,14 +41875,43 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) +"iSq" = ( +/turf/open/floor/plating/asteroid/airless, +/area/maintenance/starboard/aft) +"iSy" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/item/toy/poolnoodle/red, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "iUq" = ( /obj/machinery/status_display, /turf/closed/wall, /area/service/library) +"iUJ" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/command/gateway) "iUO" = ( /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_toxmix, /turf/open/floor/engine, /area/science/mixing) +"iVs" = ( +/obj/machinery/computer/gateway_control{ + dir = 4; + icon_state = "computer" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/camera{ + c_tag = "Gateway"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/command/gateway) "iVw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -41892,6 +41933,11 @@ /obj/machinery/atmospherics/pipe/simple/supply/visible, /turf/open/floor/plasteel, /area/engineering/atmos) +"iYt" = ( +/obj/structure/chair/office/dark, +/obj/effect/landmark/start/lawyer, +/turf/open/floor/carpet/green/airless, +/area/service/lawoffice) "iZQ" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/carbon_input, /turf/open/floor/engine/co2, @@ -41946,6 +41992,18 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/science/xenobiology) +"jeI" = ( +/turf/open/floor/plasteel/yellowsiding{ + dir = 1; + icon_state = "yellowsiding" + }, +/area/maintenance/starboard/aft) +"jkc" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/airless{ + icon_state = "wood-broken7" + }, +/area/asteroid/nearstation) "jkl" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 4 @@ -41953,6 +42011,18 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/engineering/atmos) +"jlZ" = ( +/obj/structure/closet/crate, +/obj/item/stack/ore/silver, +/obj/item/stack/ore/iron, +/obj/item/stack/ore/iron, +/obj/item/pickaxe/emergency, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) "jnK" = ( /obj/machinery/light_switch{ pixel_y = 24 @@ -41990,6 +42060,10 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/primary/starboard) +"jrd" = ( +/obj/machinery/pool/drain, +/turf/open/pool, +/area/maintenance/starboard/aft) "jsD" = ( /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/door/airlock/research/glass/incinerator/toxmix_exterior, @@ -42009,6 +42083,10 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"juY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "jwi" = ( /obj/structure/sign/directions/engineering{ dir = 8; @@ -42031,6 +42109,17 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"jBh" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/maintenance/port/aft) "jBG" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -42093,12 +42182,13 @@ pixel_y = 5 }, /obj/structure/table/reinforced, -/turf/open/floor/plasteel, +/obj/structure/window/reinforced/spawner/west, +/turf/open/floor/plasteel/white, /area/science/mixing) "jIu" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/dark/visible, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/science/mixing) "jLF" = ( /obj/effect/turf_decal/stripes/line{ @@ -42109,12 +42199,47 @@ }, /turf/open/floor/plasteel, /area/science/mixing) +"jMP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken2" + }, +/area/maintenance/starboard/aft) +"jOJ" = ( +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/dark, +/area/command/gateway) "jRe" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/closed/wall/r_wall, /area/science/mixing) +"jXc" = ( +/obj/machinery/door/airlock/external{ + name = "External Airlock"; + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "jXX" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/effect/turf_decal/stripes/line{ @@ -42141,12 +42266,26 @@ }, /turf/open/floor/plasteel/cafeteria, /area/engineering/atmos) +"kbe" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/command/gateway) "kcN" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/junction{ dir = 4 }, /turf/open/floor/plating/asteroid/airless, /area/asteroid/nearstation) +"kdd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "kit" = ( /obj/machinery/portable_atmospherics/canister/toxins, /obj/machinery/light/small{ @@ -42181,10 +42320,13 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/science/mixing) -"kuK" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plasteel, -/area/science/mixing) +"krX" = ( +/obj/machinery/light/floor, +/turf/open/floor/plasteel/yellowsiding/corner{ + dir = 4; + icon_state = "yellowcornersiding" + }, +/area/maintenance/starboard/aft) "kwF" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 @@ -42207,6 +42349,18 @@ }, /turf/open/floor/plasteel/dark, /area/engineering/atmos) +"kyS" = ( +/obj/structure/chair/stool/bar, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) +"kAD" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/beer, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "kCG" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 9 @@ -42241,6 +42395,10 @@ }, /turf/open/floor/plasteel/dark, /area/engineering/atmos) +"kIL" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating/airless, +/area/asteroid/nearstation) "kKd" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/external{ @@ -42258,6 +42416,10 @@ }, /turf/open/floor/plasteel, /area/cargo/miningdock) +"kKr" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/airless, +/area/asteroid/nearstation) "kPi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -42268,11 +42430,19 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, /area/science/mixing) +"kQz" = ( +/turf/open/floor/plasteel, +/area/command/gateway) "kRV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 +/obj/effect/turf_decal/sand/plating, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/white{ + icon_state = "2-8" }, /turf/open/floor/plating, /area/maintenance/starboard/aft) @@ -42283,19 +42453,39 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) -"leU" = ( -/turf/closed/wall/r_wall/rust, -/area/science/storage) +"kUu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) +"lcW" = ( +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "lmq" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /turf/open/floor/plating, -/area/science/storage) +/area/science/mixing) "low" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 4 }, /turf/closed/wall/r_wall, /area/science/mixing) +"loB" = ( +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/machinery/light_switch{ + pixel_x = 32; + pixel_y = 24 + }, +/obj/effect/landmark/start/lawyer, +/turf/open/floor/wood, +/area/service/lawoffice) +"loX" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/cigarettes/cigars/havana, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "lqz" = ( /obj/machinery/atmospherics/pipe/manifold/yellow/visible, /obj/effect/decal/cleanable/dirt, @@ -42307,6 +42497,10 @@ dir = 1 }, /area/engineering/atmos) +"lqJ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/service/lawoffice) "lrg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 @@ -42486,6 +42680,23 @@ }, /turf/open/floor/plasteel, /area/science/mixing) +"mia" = ( +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/command/gateway) "mkF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 @@ -42512,6 +42723,9 @@ }, /turf/open/floor/engine/vacuum, /area/maintenance/disposal/incinerator) +"msl" = ( +/turf/closed/wall/rust, +/area/command/gateway) "msG" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -42530,6 +42744,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/science/mixing) +"myQ" = ( +/turf/closed/wall/mineral/titanium, +/area/maintenance/starboard/aft) "mDx" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -42598,13 +42815,35 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"mZm" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit) "nbT" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 1; name = "Space Loop Out" }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/mixing) +"ncG" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance, +/obj/item/wrench, +/obj/item/wirecutters, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard) "ndg" = ( /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, @@ -42612,11 +42851,14 @@ "nfS" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /turf/open/floor/plating, -/area/science/storage) +/area/science/mixing) "ngY" = ( /obj/machinery/atmospherics/components/binary/valve{ dir = 1 }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/mixing) "nhU" = ( @@ -42625,6 +42867,20 @@ }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) +"nio" = ( +/obj/structure/pool/ladder{ + dir = 1; + icon_state = "ladder"; + pixel_y = -24 + }, +/turf/open/pool, +/area/maintenance/starboard/aft) +"nqr" = ( +/obj/item/kirbyplants{ + icon_state = "plant-22" + }, +/turf/open/space/basic, +/area/space) "nty" = ( /obj/machinery/button/massdriver{ id = "toxinsdriver"; @@ -42636,10 +42892,21 @@ }, /turf/open/floor/plasteel, /area/science/mixing) +"nvk" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "nwY" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/hallway/primary/starboard/fore) +"nBu" = ( +/obj/structure/chair/stool/bar, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "nFG" = ( /obj/machinery/atmospherics/pipe/manifold/yellow/visible{ dir = 8 @@ -42647,6 +42914,10 @@ /obj/machinery/meter, /turf/open/floor/plasteel, /area/engineering/atmos) +"nIf" = ( +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "nKi" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; @@ -42682,7 +42953,11 @@ network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, /area/science/mixing) "nTg" = ( /obj/item/assembly/timer{ @@ -42692,7 +42967,7 @@ /obj/item/assembly/timer, /obj/structure/table/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/white, /area/science/mixing) "nTi" = ( /obj/structure/sign/warning/biohazard, @@ -42715,6 +42990,12 @@ /obj/machinery/atmospherics/pipe/simple/yellow/visible, /turf/closed/wall/r_wall, /area/engineering/atmos) +"ogx" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood{ + icon_state = "wood-broken" + }, +/area/asteroid/nearstation) "ogL" = ( /obj/structure/sign/warning/vacuum/external{ pixel_y = -32 @@ -42738,6 +43019,9 @@ dir = 1 }, /area/engineering/atmos) +"omB" = ( +/turf/closed/wall, +/area/asteroid/nearstation) "ooX" = ( /obj/machinery/smartfridge/organ/preloaded{ pixel_y = 2 @@ -42812,6 +43096,10 @@ /area/maintenance/disposal/incinerator) "oys" = ( /obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small{ + dir = 8 + }, /turf/open/floor/plasteel, /area/science/mixing) "oyD" = ( @@ -42841,6 +43129,13 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"oIA" = ( +/obj/machinery/light/floor, +/turf/open/floor/plasteel/yellowsiding/corner{ + dir = 1; + icon_state = "yellowcornersiding" + }, +/area/maintenance/starboard/aft) "oIG" = ( /obj/structure/sign/warning/fire, /turf/closed/wall/r_wall, @@ -42855,7 +43150,7 @@ "oKp" = ( /obj/structure/chair/stool, /obj/effect/landmark/start/scientist, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/white, /area/science/mixing) "oKz" = ( /obj/structure/cable/white{ @@ -42891,12 +43186,36 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"oXj" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/door/window/westright, +/obj/effect/decal/cleanable/egg_smudge, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/restrooms) "oXz" = ( /obj/machinery/atmospherics/pipe/simple/dark/visible{ dir = 5 }, /turf/open/floor/plasteel, /area/science/mixing) +"par" = ( +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/command/gateway) "pbT" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 @@ -42917,14 +43236,41 @@ /obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/mix_output, /turf/open/floor/engine/vacuum, /area/engineering/atmos) +"pcD" = ( +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/command/gateway) "pdX" = ( /obj/machinery/portable_atmospherics/canister, /obj/item/radio/intercom{ pixel_y = 25 }, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, /area/science/mixing) +"pix" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken7" + }, +/area/maintenance/starboard/aft) +"pjh" = ( +/obj/machinery/vending/boozeomat/pubby_maint, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "pjU" = ( /obj/structure/grille, /obj/machinery/atmospherics/pipe/simple/yellow/hidden{ @@ -42956,6 +43302,13 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) +"pmx" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "pmK" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 @@ -43004,6 +43357,10 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"puc" = ( +/obj/structure/bed, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "pvX" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/orange/visible, @@ -43033,10 +43390,9 @@ }, /obj/item/analyzer, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/white, /area/science/mixing) "pEt" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/power/apc{ areastring = "/area/hallway/primary/starboard/fore"; dir = 8; @@ -43050,6 +43406,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -43092,8 +43451,28 @@ /obj/machinery/atmospherics/components/binary/valve{ dir = 8 }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/mixing) +"pML" = ( +/obj/machinery/shower{ + dir = 1 + }, +/obj/structure/curtain, +/obj/structure/window/spawner/north, +/obj/structure/sign/poster/official/no_erp{ + pixel_x = 32 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/restrooms) +"pMQ" = ( +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/obj/item/reagent_containers/glass/bottle/nutrient/rh, +/turf/open/floor/plating/asteroid/airless, +/area/maintenance/port/aft) "pNE" = ( /obj/structure/grille, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ @@ -43106,6 +43485,12 @@ /obj/structure/grille, /turf/open/space/basic, /area/space/nearstation) +"qab" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/airless{ + icon_state = "wood-broken5" + }, +/area/asteroid/nearstation) "qcg" = ( /obj/structure/window/reinforced{ dir = 4 @@ -43125,6 +43510,12 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, /turf/open/floor/plasteel, /area/science/mixing) "qdt" = ( @@ -43148,6 +43539,28 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"qeO" = ( +/obj/machinery/door/airlock/command{ + name = "Gateway"; + req_access_txt = "62" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/command/gateway) +"qgg" = ( +/obj/machinery/seed_extractor, +/obj/structure/cable/white{ + icon_state = "0-8" + }, +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/turf/open/floor/plating/asteroid/airless, +/area/maintenance/port/aft) "qgC" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/incinerator_input{ dir = 4 @@ -43162,9 +43575,14 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/science/mixing) +"qjS" = ( +/obj/structure/table/reinforced, +/obj/machinery/light, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "qnA" = ( /turf/open/floor/plating, -/area/science/storage) +/area/science/mixing) "qoT" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 1; @@ -43206,6 +43624,13 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engineering/atmos) +"qFj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "qFw" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 @@ -43230,6 +43655,11 @@ }, /turf/open/floor/plasteel/dark, /area/engineering/atmos) +"qHx" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/science/mixing) "qIp" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -43249,6 +43679,13 @@ /obj/machinery/meter, /turf/open/floor/plasteel, /area/engineering/atmos) +"qRz" = ( +/obj/machinery/newscaster{ + pixel_x = 32 + }, +/obj/machinery/photocopier, +/turf/open/floor/wood, +/area/service/lawoffice) "qTa" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 @@ -43258,6 +43695,13 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"qUQ" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/food/drinks/shaker, +/turf/open/floor/wood{ + icon_state = "wood-broken6" + }, +/area/maintenance/starboard/aft) "qUW" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 @@ -43271,6 +43715,27 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"ria" = ( +/obj/effect/turf_decal/bot_white/right, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/command/gateway) +"rih" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white/corner, +/area/hallway/primary/starboard/fore) "rjQ" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/open/floor/plasteel, @@ -43287,6 +43752,15 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) +"rmZ" = ( +/obj/structure/chair/stool/bar, +/turf/open/floor/wood{ + icon_state = "wood-broken5" + }, +/area/maintenance/starboard/aft) +"rwH" = ( +/turf/closed/wall/mineral/titanium, +/area/asteroid/nearstation) "rzn" = ( /obj/machinery/status_display, /turf/closed/wall, @@ -43346,6 +43820,13 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/mix_input, /turf/open/floor/engine/vacuum, /area/engineering/atmos) +"rVP" = ( +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/item/extinguisher, +/turf/open/floor/plasteel, +/area/command/gateway) "sak" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/blue{ @@ -43366,24 +43847,46 @@ /mob/living/simple_animal/opossum, /turf/open/floor/plating, /area/maintenance/starboard) +"sdk" = ( +/obj/structure/table/wood, +/obj/item/lighter, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "sdL" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/hydroponics/soil, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/weather, +/obj/effect/turf_decal/weather, /turf/open/floor/plasteel/dark, /area/maintenance/starboard/aft) "sdX" = ( /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"sjr" = ( +/obj/item/reagent_containers/food/snacks/grown/wheat, +/turf/open/space/basic, +/area/space) +"slf" = ( +/obj/machinery/door/poddoor/shutters{ + id = "stationawaygate"; + name = "Gateway Access Shutters" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/command/gateway) "soC" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/white{ icon_state = "4-8" }, @@ -43514,8 +44017,16 @@ /turf/closed/wall/rust, /area/cargo/miningdock) "syS" = ( -/turf/closed/wall/rust, -/area/commons/toilet/restrooms) +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen/fountain, +/obj/machinery/requests_console{ + department = "Law office"; + name = "Lawyer RC"; + pixel_y = -30 + }, +/turf/open/floor/carpet/green/airless, +/area/service/lawoffice) "syT" = ( /turf/closed/wall/r_wall/rust, /area/ai_monitored/command/storage/eva) @@ -43531,18 +44042,9 @@ "sAA" = ( /turf/closed/wall/rust, /area/service/bar/atrium) -"sAX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/maintenance/starboard/central) "sAY" = ( +/obj/structure/easel, +/obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plating{ icon_state = "panelscorched" }, @@ -43553,12 +44055,6 @@ }, /turf/closed/wall/rust, /area/service/theater) -"sBw" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall/rust, -/area/service/bar/atrium) "sBx" = ( /obj/effect/landmark/xeno_spawn, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -43588,10 +44084,6 @@ }, /turf/open/floor/plasteel, /area/maintenance/starboard) -"sBW" = ( -/obj/structure/sign/warning/vacuum, -/turf/closed/wall/rust, -/area/maintenance/starboard) "sCr" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -43601,30 +44093,6 @@ icon_state = "platingdmg2" }, /area/maintenance/port/central) -"sCt" = ( -/obj/structure/easel, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/maintenance/starboard) -"sCQ" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/sign/poster/contraband/random{ - pixel_x = 32 - }, -/obj/item/storage/box, -/turf/open/floor/plasteel, -/area/maintenance/starboard) "sDl" = ( /turf/closed/wall/rust, /area/commons/dorms) @@ -43649,10 +44117,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/rust, /area/service/theater) -"sDM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/rust, -/area/service/bar/atrium) "sDP" = ( /turf/closed/wall/rust, /area/hallway/secondary/exit) @@ -43666,19 +44130,20 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) -"sEm" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +"sEn" = ( /obj/structure/cable/white{ icon_state = "1-8" }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"sEn" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/cable/white{ + icon_state = "4-8" }, /turf/open/floor/plating, /area/maintenance/starboard) +"sEq" = ( +/obj/item/reagent_containers/glass/bottle/nutrient/ez, +/turf/open/floor/plating/asteroid/airless, +/area/asteroid/nearstation) "sEG" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -43744,9 +44209,13 @@ /turf/open/floor/plasteel/dark, /area/maintenance/starboard) "sEQ" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall, -/area/maintenance/starboard) +/obj/structure/rack, +/obj/item/radio, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/command/gateway) "sFn" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/stripes/line{ @@ -43901,43 +44370,23 @@ /turf/open/floor/plasteel/dark, /area/maintenance/starboard) "sFX" = ( -/obj/structure/table, /obj/machinery/light/small{ dir = 8 }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/hallway/secondary/exit) "sFY" = ( -/obj/structure/table, -/obj/effect/turf_decal/stripes/line, -/obj/item/crowbar, -/obj/item/crowbar, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/tank/internals/emergency_oxygen, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/blue{ dir = 4 }, -/turf/open/floor/plasteel/dark, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, /area/hallway/secondary/exit) "sGy" = ( /obj/machinery/door/firedoor, @@ -43983,6 +44432,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white/corner{ dir = 1 }, @@ -44044,10 +44494,12 @@ /turf/open/floor/plating, /area/maintenance/starboard) "sHf" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, +/obj/structure/table, +/obj/item/crowbar, +/obj/item/crowbar, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/tank/internals/emergency_oxygen, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/hallway/secondary/exit) "sHz" = ( @@ -44130,7 +44582,7 @@ /obj/machinery/atmospherics/pipe/simple/dark/visible{ dir = 10 }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/science/mixing) "sIu" = ( /turf/closed/wall/r_wall/rust, @@ -44186,15 +44638,13 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit) "sIy" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/structure/cable/white{ icon_state = "4-8" }, /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel, /area/hallway/secondary/exit) "sIB" = ( @@ -44226,15 +44676,6 @@ "sIK" = ( /turf/closed/wall/rust, /area/service/janitor) -"sIL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/white{ - icon_state = "1-2" - }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/maintenance/starboard/central) "sIN" = ( /obj/structure/sign/warning/securearea, /turf/closed/wall/rust, @@ -44249,6 +44690,17 @@ /turf/open/floor/plasteel/dark, /area/hallway/secondary/exit) "sIR" = ( +/obj/structure/table, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, /obj/structure/cable/white{ icon_state = "1-2" }, @@ -44390,17 +44842,6 @@ }, /turf/open/floor/plasteel/dark, /area/service/bar/atrium) -"sJo" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/maintenance/starboard/central) "sJq" = ( /obj/structure/sign/directions/engineering{ desc = "A sign that shows there are doors here. There are doors everywhere!"; @@ -44591,19 +45032,6 @@ "sLf" = ( /turf/closed/wall/rust, /area/service/chapel/main) -"sLg" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/aft) "sLm" = ( /turf/closed/wall/rust, /area/hallway/secondary/entry) @@ -46028,18 +46456,18 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Maintenance Hatch"; - req_access_txt = "12" - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plasteel, -/area/maintenance/starboard) +/obj/machinery/door/airlock{ + name = "Primary Restroom" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/restrooms) "sOL" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -46159,9 +46587,6 @@ icon_state = "panelscorched" }, /area/maintenance/starboard/aft) -"sPY" = ( -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "sSy" = ( /obj/structure/window/reinforced{ dir = 4 @@ -46169,9 +46594,24 @@ /obj/structure/flora/ausbushes/ppflowers, /turf/open/floor/grass, /area/hallway/secondary/entry) +"sTH" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/tower, +/turf/open/floor/plating/asteroid, +/area/maintenance/port/aft) "sVt" = ( /turf/closed/wall/r_wall, /area/science/mixing) +"sYi" = ( +/obj/structure/table/reinforced, +/turf/open/floor/wood{ + icon_state = "wood-broken5" + }, +/area/maintenance/starboard/aft) +"sZH" = ( +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/plating/asteroid, +/area/maintenance/port/aft) "tac" = ( /obj/structure/grille, /obj/machinery/meter, @@ -46188,6 +46628,12 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"tfP" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/airless{ + icon_state = "wood-broken" + }, +/area/asteroid/nearstation) "tgm" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -46207,6 +46653,24 @@ "tin" = ( /turf/open/floor/engine/vacuum, /area/science/mixing) +"tjk" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/carpet/green/airless, +/area/asteroid/nearstation) +"tkH" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Courtroom" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/service/lawoffice) "ttp" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -46235,6 +46699,16 @@ dir = 1 }, /area/engineering/atmos) +"twy" = ( +/obj/structure/table/reinforced, +/obj/machinery/chem_dispenser/drinks{ + dir = 1; + icon_state = "soda_dispenser" + }, +/turf/open/floor/wood{ + icon_state = "wood-broken6" + }, +/area/maintenance/starboard/aft) "tFk" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -46374,9 +46848,7 @@ /obj/machinery/atmospherics/components/unary/thermomachine/freezer{ dir = 4 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/science/mixing) "ujg" = ( @@ -46400,6 +46872,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/mixing) "uqY" = ( @@ -46411,6 +46889,12 @@ heat_capacity = 1e+006 }, /area/hallway/primary/starboard) +"uqZ" = ( +/obj/structure/table/wood, +/turf/open/floor/wood{ + icon_state = "wood-broken2" + }, +/area/maintenance/starboard/aft) "uuj" = ( /obj/machinery/plantgenes{ pixel_y = 6 @@ -46505,12 +46989,21 @@ }, /turf/open/floor/plasteel/dark, /area/engineering/gravity_generator) +"uCY" = ( +/turf/open/pool, +/area/maintenance/starboard/aft) "uDp" = ( /obj/machinery/atmospherics/pipe/simple/dark/visible{ dir = 5 }, /turf/open/floor/plating/asteroid/airless, /area/asteroid/nearstation) +"uDz" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "uEu" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 6 @@ -46525,6 +47018,35 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"uIq" = ( +/obj/effect/turf_decal/bot_white/left, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/command/gateway) +"uMi" = ( +/obj/machinery/door/airlock/security{ + name = "Law Office"; + req_access_txt = "38" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/service/lawoffice) "uSs" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/machinery/atmospherics/pipe/simple/green/visible{ @@ -46646,6 +47168,17 @@ }, /turf/open/floor/plasteel/dark, /area/engineering/atmos) +"vmV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/white, +/turf/open/floor/wood{ + icon_state = "wood-broken4" + }, +/area/maintenance/starboard/aft) +"vna" = ( +/obj/item/wrench, +/turf/open/space/basic, +/area/space) "voi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -46741,6 +47274,18 @@ }, /turf/open/floor/engine/vacuum, /area/science/mixing) +"vDy" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "vGQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -46748,6 +47293,10 @@ /obj/structure/cable/white{ icon_state = "1-2" }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel, /area/science/mixing) "vJk" = ( @@ -46792,6 +47341,10 @@ }, /turf/open/floor/plasteel, /area/science/mixing) +"vTk" = ( +/obj/item/hatchet, +/turf/open/space/basic, +/area/space) "vVA" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 @@ -46837,18 +47390,23 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel, /area/science/mixing) "wbV" = ( /obj/effect/turf_decal/delivery, -/obj/machinery/hydroponics/soil, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/effect/turf_decal/weather, +/obj/effect/turf_decal/weather, +/obj/structure/closet/athletic_mixed, /turf/open/floor/plasteel/dark, /area/maintenance/starboard/aft) "wdt" = ( @@ -46867,6 +47425,12 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) +"wkn" = ( +/obj/machinery/hydroponics/soil, +/obj/item/shovel/spade, +/obj/item/cultivator, +/turf/open/floor/plating/asteroid, +/area/maintenance/port/aft) "wkG" = ( /obj/structure/lattice/catwalk, /turf/open/floor/plating/airless, @@ -46890,17 +47454,36 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"wtA" = ( +/obj/structure/fluff/broken_flooring{ + dir = 8; + icon_state = "plating" + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "wvy" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible, /obj/machinery/meter, /turf/open/floor/plasteel, /area/science/mixing) +"wvA" = ( +/obj/machinery/biogenerator, +/obj/structure/cable/white{ + icon_state = "0-4" + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/port/aft) "wwT" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 5 }, /turf/open/floor/plasteel, /area/science/mixing) +"wDb" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) "wOe" = ( /obj/machinery/door/firedoor/heavy, /obj/machinery/door/airlock/research{ @@ -46910,6 +47493,12 @@ /obj/structure/cable/white{ icon_state = "4-8" }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/mixing) "wPr" = ( @@ -46922,7 +47511,8 @@ pixel_y = 9 }, /obj/structure/table/reinforced, -/turf/open/floor/plasteel, +/obj/structure/window/reinforced/spawner/west, +/turf/open/floor/plasteel/white, /area/science/mixing) "wRY" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ @@ -46977,10 +47567,13 @@ /turf/open/floor/plasteel/dark, /area/engineering/atmos) "xdr" = ( -/obj/structure/barricade/wooden, +/obj/effect/turf_decal/sand/plating, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, +/obj/structure/cable/white{ + icon_state = "1-2" + }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "xej" = ( @@ -47004,6 +47597,16 @@ }, /turf/open/floor/plasteel, /area/science/mixing) +"xpX" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/structure/window/spawner/north, +/obj/machinery/door/window/westright, +/obj/effect/turf_decal/bot, +/obj/effect/landmark/blobstart, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/restrooms) "xrf" = ( /obj/machinery/light{ dir = 8 @@ -47143,12 +47746,46 @@ /obj/structure/grille, /turf/closed/wall/r_wall, /area/engineering/atmos) +"xMv" = ( +/obj/structure/lattice, +/obj/structure/fluff/broken_flooring{ + dir = 8; + icon_state = "plating" + }, +/turf/open/space/basic, +/area/space/nearstation) +"xMZ" = ( +/turf/closed/wall, +/area/command/gateway) "xPz" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 9 }, /turf/open/floor/plating/asteroid/airless, /area/asteroid/nearstation) +"xTs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/commons/toilet/restrooms"; + dir = 8; + name = "Restrooms APC"; + pixel_x = -25; + pixel_y = 3 + }, +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard) +"xWb" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/command/gateway) "xZO" = ( /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/door/airlock/public/glass{ @@ -47190,6 +47827,7 @@ /obj/structure/cable/white{ icon_state = "2-8" }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel, /area/science/mixing) "yeE" = ( @@ -47233,6 +47871,36 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port/aft) +"ygB" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard) +"ygE" = ( +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/service/bar/atrium) "yhg" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -47242,6 +47910,24 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"yin" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/port/aft) +"ykL" = ( +/obj/structure/chair/stool/bar, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) +"ylr" = ( +/obj/machinery/door/airlock/external{ + name = "External Airlock"; + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/maintenance/port/aft) "ymj" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 @@ -77720,11 +78406,11 @@ aUR aVL aUR aUQ -bvo +bvg aLs bbd aKm -aac +aKm aad aac aad @@ -77977,15 +78663,15 @@ aUS aUU aWz aVL -bvo +bvg aqo -bbe +aVh +bbb aKm aad aad aad aad -aad aac aac aaa @@ -78234,14 +78920,14 @@ aUR aUU aWz aUQ -bvg -aKm +aqo +aqo +aqo bbd aKm -aKm -aad -aad -aad +wvA +bVs +wkn aad aad aad @@ -78491,16 +79177,16 @@ aUS aUU aWz aVL -bvg -aLv -bbd +ylr +aSG +jXc aME -aKm -aad -aad -aad -aad -aad +aLv +yin +dvB +sZH +sTH +bVs aad aad aad @@ -78748,14 +79434,14 @@ aUT aUU aUU aUQ -bvg -aKm +aqo +aqo +aqo bbd -aMF aKm -aac -aac -aad +qgg +pMQ +fNN aKm aKm aKm @@ -79007,12 +79693,12 @@ aWz aVL bvg aKm -bbd -aMG -aKm -aKm +ghr +jBh aKm aKm +gIT +aLv aKm aOs aSf @@ -79262,13 +79948,13 @@ aUR aUU aWz aUQ -bvo +bvg aKm -baq -bbb +jlZ +vDy aOI -aPQ -aPQ +qFj +kdd aPQ aPQ aPQ @@ -82865,7 +83551,7 @@ bdW aOl aOQ aCy -aPC +aPE aQh aRb aKJ @@ -83373,7 +84059,7 @@ aBn aDf aVV aVQ -aXk +aXg ajG aOZ bey @@ -84106,10 +84792,10 @@ aqy ajf ake ald -oyD -syS -oyD -oyD +iGT +tkH +iGT +lqJ apI apI arP @@ -84362,7 +85048,7 @@ aid aqw ajg akf -oyD +iGT alT amO anJ @@ -84411,7 +85097,7 @@ aSh aSh aSh aSh -atE +hIu bfA bfu bgF @@ -84622,8 +85308,8 @@ akg ale alU amP -oyD -oyD +aoC +aoC sAc aqU arR @@ -84668,7 +85354,7 @@ bcd bcU bdQ aSh -atE +hIu bfA bfV bgG @@ -84879,7 +85565,7 @@ akh alf alV amQ -anJ +fmq aoD apI aqV @@ -85133,10 +85819,10 @@ ahG aix ajj aki -oyD -alW +uMi +loB amR -oyD +iYt syS apI aqW @@ -85182,7 +85868,7 @@ bcf bcW bfF ooX -avB +hSE bfA bfX bgI @@ -85390,10 +86076,10 @@ swC abw ajk akj -oyD +iGT alX amS -anJ +qRz aoE apI aqX @@ -85439,7 +86125,7 @@ bcg bcX bdS aSh -avB +hSE bfy bfY bgJ @@ -85696,7 +86382,7 @@ aUn aWb bdT aSh -atE +hIu bfA bfZ bgK @@ -88757,7 +89443,7 @@ aGN aHS asf aJW -aJW +ygE aMu aNy aOn @@ -89014,7 +89700,7 @@ aGO aHT gPY dQC -avi +asg axP ard aOo @@ -89271,7 +89957,7 @@ aGP aud ash ayK -ayK +ash aAQ aNz aOp @@ -89764,7 +90450,7 @@ aml and tKM aoS -apY +ayP ara asj atj @@ -90020,7 +90706,7 @@ alt amm amm tKM -aoT +asl apZ ara ara @@ -90042,7 +90728,7 @@ aCe aCe aCe aJY -aLh +aCe aAT ayP sJA @@ -90281,7 +90967,7 @@ aoU aqa arg ask -atl +ara aug avl awq @@ -90299,7 +90985,7 @@ aGR aCe aIR aJZ -aLh +aCe aso ayP ayP @@ -90536,9 +91222,9 @@ aae anQ aoV aqb -arh +ayT asl -atm +ara abb abJ awr @@ -90556,8 +91242,8 @@ aGS aHV aIS aKa -aLh -sJo +aCe +aMx aNA ayP aPr @@ -90795,7 +91481,7 @@ syT alu alu asp -atm +ara aui avn aws @@ -90813,7 +91499,7 @@ aGT aHW aIT aKb -aLh +aCe aCe aso ayP @@ -91052,7 +91738,7 @@ aoW aqc syT bxC -atm +ara auj avo awt @@ -91063,7 +91749,7 @@ azN asp aCe aCY -aDV +aFU aFc aFU aGU @@ -91309,7 +91995,7 @@ anV aqd alu aso -atm +ara auk avp awu @@ -91566,7 +92252,7 @@ aoX aqe alu asp -sBw +ara aul avq awv @@ -91584,10 +92270,10 @@ aGW sIC aIW aKe -aLk -aCf -aNC -aOt +aLi +aCe +asp +ayP soC aQw aRs @@ -91822,26 +92508,26 @@ anX ani aqf alu -sAX -atn -aum -avr +asp +ara +ara +ara aww -aum -sDM +ara +ara ayT aiw -aAW -aCf -aCf -aDY +asp +aCe +aCe +aCe aFf -aCf -aCf -aCf -aDY +aCe +aCe +aCe +aCe aFf -aLl +aCe aCe aND aOu @@ -92096,7 +92782,7 @@ aFg axe avs axe -sIL +axe aKf ato axe @@ -92856,7 +93542,7 @@ aup avu atp gMe -arj +rih arj sEJ aBa @@ -93109,11 +93795,11 @@ nwY sOF sOG atq -aRz -aRz +oyD +oyD sOK -aRz -aRz +boD +oyD bli azU aBb @@ -93366,11 +94052,11 @@ aqj aRz asr bfp -aRz +oyD avv acx axf -aRz +oyD aRz sEK sJN @@ -93623,11 +94309,11 @@ aqk aRz ass aTR -sJN -avw +oyD +alW awz axg -aRz +oyD sEl sEL aXb @@ -93880,11 +94566,11 @@ aql aRz ast bfo -aRz -aRz -aRz -sJN -aRz +oyD +oXj +xpX +pML +oyD bfp aSD aRz @@ -93926,20 +94612,20 @@ sdL bhj wbV sOM -aad -aad -aad +bsq +iSq +bsq bfP bfP bjc bfP bfP -aad -aad -aad -aad -aad -aad +myQ +rwH +fgZ +aac +aac +aac aaa aaa aaa @@ -94136,13 +94822,13 @@ ape aqm sJN sAY -acw -aXJ -aSC -aXJ -bai -aXb -sEm +caJ +oyD +oyD +oyD +oyD +oyD +sGY aRz sFn sFR @@ -94180,22 +94866,22 @@ beQ emA xdr bgu -sPY -bhT -sOM -aad +pmx +myQ +aRy +aRy +aRy +aRy +aRy +hYy +nIf +nIf +lcW +myQ +ogx bvg +aKo aac -aad -aac -aac -aac -aad -aad -aac -aac -aac -aad aaa aaa aaa @@ -94393,12 +95079,12 @@ apf aqn aRz abO -bfp -aSD -sCt -sCQ -sDq -aSD +acw +aXJ +aXJ +xTs +aXJ +aXJ sEn sEN sFo @@ -94438,20 +95124,20 @@ bfr hso bgv kRV -bhU -aRy -bvg -aac -aaa -aaa -aaa -aaa -aac -aad -aad -aad -aad -aac +vmV +kUu +iSy +kUu +kUu +kUu +jMP +lcW +fWh +lcW +hsR +kKr +tfP +kKr aac aaa aaa @@ -94652,11 +95338,11 @@ aRz abN acy aRz -sJN -aRz -aRz -aRz +ncG +eOg +sDq aRz +bfp aRz sFp sFT @@ -94693,23 +95379,23 @@ aRy aRy aRy mgV -bgw +myQ hiR -bhV -aRy -bvg -aaa -aaa -aaa -aaa -aaa -aaa -aac -aad -aad -aac -aac -aaa +dSq +dSq +dSq +dSq +krX +ekG +nBu +nvk +lcW +twy +myQ +tjk +tjk +tjk +sdX aaa aaa aaa @@ -94908,13 +95594,13 @@ aqp aRz bvh sBx +xMZ +xMZ +xMZ +bRf +xMZ +ygB aRz -aad -aad -aah -aad -aad -aSD sFq sFU aRz @@ -94950,23 +95636,23 @@ bes bes bes mgV -bgx +aRy bhm -bhW -sON -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +uCY +uCY +uCY +uCY +jeI +lcW +foP +uqZ +lcW +qUQ +myQ +tjk +tjk +tjk +sdX aaa aaa aaa @@ -95165,14 +95851,14 @@ amD amC amC sBy -sBW -aad -aac -bvg -aad -aad -sJN -aRz +xMZ +ria +pcD +uIq +iVs +iUJ +xMZ +xMZ aRz aSD sHd @@ -95207,22 +95893,22 @@ bet bet bet lMu -bgy -sPY -bhX aRy -bvg -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bhm +bhX +jrd +uCY +nio +jeI +juY +kyS +kAD +pix +qjS +myQ +gWt +tjk +tjk aaa aaa aaa @@ -95422,15 +96108,15 @@ aqq ark amC sOJ -bvg -aac -aac -aae -aac -aad -aRz +xMZ +mia +hkI +jOJ +gRe +par +hGN +xMZ aXK -bhk sGA sHe aRz @@ -95464,22 +96150,22 @@ vCu tin tin vxf -bgz -sPY -sLg aRy -bvg -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bhm +uCY +uCY +uCY +uCY +jeI +lcW +rmZ +sdk +lcW +sYi +myQ +tjk +tjk +wtA aaa aaa aaa @@ -95679,15 +96365,15 @@ aqr arl amC bvg -aac -aac -aaa -aae -aac -aac +xMZ +uIq +pcD +ria +kQz +xWb sEQ +bRf aRz -sJN atq aRz aRz @@ -95721,27 +96407,27 @@ fDZ hNT bkf lMu -bgA +myQ bhn -bhY -sON -aad -aac -aac +gSu +gSu +gSu +gSu +oIA +lcW +ykL +loX +lcW +pjh +myQ +tjk +hZH +aaa aaa aaa aaa aaa aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP jFP jFP jFP @@ -95936,19 +96622,19 @@ aqs arm syD aac -aaa -aaa -aaa -aae -aaa -aac -bvg -sFs +xMZ +xMZ +xMZ +xMZ +xMZ +cUd +dMx +slf sFX sGC sHf -sHB -blM +mZm +dQg sIy blZ sHB @@ -95979,26 +96665,26 @@ jsD low lMu sON -sOM -sOM -sOM -aad -aad -aad -aad +myQ +cGA +puc +puc +puc +lcW +lcW +lcW +lcW +isT +lcW +hsR +jkc +fRe +aaa +aaa aaa aaa aaa aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP jFP jFP jFP @@ -96197,10 +96883,10 @@ aaa aaa aaa aae -aae -bvg -bvg -sFs +xMZ +rVP +kbe +qeO sFY sGD bsS @@ -96236,26 +96922,26 @@ iUO svX eWo aad -aad -aad -aad -aad -aad -aad -aac -aac -aac +omB +myQ +aRy +aRy +aRy +aRy +aRy +lcW +lcW +uDz +lcW +myQ +kKr +qab +sdX +aaa +aaa +aaa aaa aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP jFP jFP jFP @@ -96454,10 +97140,10 @@ aaf aaf aae aae -axW -sDP -azb -axW +xMZ +msl +xMZ +xMZ axW axW azb @@ -96495,24 +97181,24 @@ jRe aad aad aad +sEq +aac aad aad -aad -aad -aad -aad -aad +aRy +myQ +aRy +myQ +aRy +myQ +rwH +rwH +kIL +xMv +aaa +aaa aaa aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP jFP jFP jFP @@ -96756,20 +97442,20 @@ aad aad aad aad -aad +omB aad aaa aaa aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa uXD jFP jFP @@ -97018,15 +97704,15 @@ aac aaa aaa aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP +aaa +aaa +wDb +aaa +aaa +aaa +aaa +aaa +aaa jFP jFP jFP @@ -97274,16 +97960,16 @@ aad aaa aaa aaa +wDb +aaa +sjr +aaa +aaa +aaa +vna +aaa +aaa aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP jFP jFP jFP @@ -97528,19 +98214,19 @@ aad aad aad aaa +vTk +aaa +aaa +aaa +aaa +aaa +aaa +fpH +aaa aaa aaa aaa aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP jFP jFP jFP @@ -97767,19 +98453,29 @@ bdK bew ajP ajP -eGm +sVt meo uiT bfq bpj +qHx +qHx +qHx oys -oys -oys -oys -fjN +fuR iio aad aaa +sdX +aaa +aaa +aaa +aaa +aaa +wDb +aaa +aaa +nqr aaa aaa aaa @@ -97788,16 +98484,6 @@ aaa aaa aaa aaa -aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP jFP jFP jFP @@ -98034,9 +98720,18 @@ hVE hVE hVE pMh -kuK +tPn aac aaa +sdX +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -98046,15 +98741,6 @@ aaa aaa aaa aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP jFP jFP jFP @@ -98279,14 +98965,14 @@ aaa aaa aad aad -leU +meo dfK qnA ucd vZb iiW bOJ -foz +mhf nbT ngY oXz @@ -98303,15 +98989,15 @@ aaa aaa aaa aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa jFP jFP jFP @@ -98536,7 +99222,7 @@ aaa aaa aac aad -eGm +sVt lmq nfS sVt @@ -98560,15 +99246,15 @@ aaa aaa aaa aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa jFP jFP jFP @@ -98793,9 +99479,9 @@ aaa aaa aac aad -eGm -eGm -eGm +sVt +sVt +sVt sVt gLD lFm diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 3f07daecc2..d3c8c90947 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -2055,12 +2055,12 @@ /turf/open/floor/plating, /area/ai_monitored/turret_protected/AIsatextAP) "afd" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "afe" = ( @@ -2076,6 +2076,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "aff" = ( @@ -2091,6 +2094,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "afg" = ( @@ -2108,14 +2114,18 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "afh" = ( /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) @@ -2127,24 +2137,21 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/AIsatextAS) "afj" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/AIsatextAS) "afk" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, /obj/structure/cable/yellow{ icon_state = "4-8" }, @@ -2155,15 +2162,21 @@ c_tag = "MiniSat Maintenance Starboard Aft"; network = list("minisat") }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/AIsatextAS) "afl" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/AIsatextAS) "afm" = ( @@ -2708,6 +2721,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, +/obj/effect/landmark/start/prisoner, /turf/open/floor/plasteel, /area/security/prison) "agN" = ( @@ -2736,6 +2750,7 @@ /obj/machinery/light/small{ dir = 4 }, +/obj/effect/landmark/start/prisoner, /turf/open/floor/plasteel/freezer, /area/security/prison) "agP" = ( @@ -8590,7 +8605,7 @@ dir = 10 }, /turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) +/area/command/bridge) "atN" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -9640,7 +9655,7 @@ dir = 8 }, /turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) +/area/command/bridge) "avR" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -9746,7 +9761,7 @@ req_access_txt = "10;13" }, /turf/open/floor/plating, -/area/ai_monitored/turret_protected/aisat_interior) +/area/command/bridge) "awd" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -10367,7 +10382,7 @@ }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, -/area/hallway/primary/fore) +/area/security/brig) "axF" = ( /obj/item/kirbyplants{ icon_state = "plant-10" @@ -10570,7 +10585,7 @@ }, /obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) +/area/command/bridge) "ayf" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -22902,7 +22917,7 @@ req_access_txt = "10;13" }, /turf/open/floor/plating, -/area/ai_monitored/turret_protected/aisat_interior) +/area/command/bridge) "baI" = ( /obj/structure/cable{ icon_state = "0-8" @@ -26842,10 +26857,10 @@ /turf/open/space, /area/solars/starboard) "bkQ" = ( -/obj/machinery/vending/snack, /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/structure/closet/emcloset, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bkR" = ( @@ -29615,7 +29630,9 @@ }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellowsiding{ + dir = 8 + }, /area/hallway/secondary/entry) "bqT" = ( /obj/structure/flora/grass/jungle/b, @@ -30302,7 +30319,9 @@ }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellowsiding{ + dir = 8 + }, /area/hallway/secondary/entry) "bsn" = ( /obj/structure/girder, @@ -30967,7 +30986,9 @@ dir = 8 }, /obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellowsiding{ + dir = 8 + }, /area/hallway/secondary/entry) "btO" = ( /obj/structure/cable{ @@ -36795,15 +36816,9 @@ /turf/open/floor/plating, /area/maintenance/department/science) "bFE" = ( -/obj/docking_port/stationary{ - dwidth = 2; - height = 6; - id = "monastery_shuttle_asteroid"; - name = "monastery"; - width = 5 - }, -/turf/open/space, -/area/space/nearstation) +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/maintenance/department/crew_quarters/dorms) "bFF" = ( /obj/machinery/atmospherics/components/unary/tank/air{ dir = 1 @@ -37332,21 +37347,19 @@ /turf/open/floor/plating, /area/service/chapel/dock) "bGF" = ( -/obj/machinery/door/airlock/external{ - name = "Pod Docking Bay" +/obj/docking_port/stationary{ + dwidth = 2; + height = 6; + id = "monastery_shuttle_asteroid"; + name = "monastery"; + width = 5 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/service/chapel/dock) +/turf/open/space, +/area/space/nearstation) "bGG" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8; - layer = 2.9 - }, -/turf/open/floor/plating/airless, -/area/service/chapel/dock) +/obj/effect/spawner/lootdrop/grille_or_trash, +/turf/open/floor/plating, +/area/maintenance/department/security/brig) "bGH" = ( /obj/structure/window/reinforced, /turf/open/space, @@ -37850,38 +37863,39 @@ /turf/open/floor/plasteel, /area/science/mixing) "bHI" = ( -/obj/structure/grille/broken, -/turf/open/space/basic, -/area/space/nearstation) +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/maintenance/department/cargo) "bHJ" = ( +/obj/machinery/door/airlock/external{ + name = "Pod Docking Bay" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/service/chapel/dock) "bHK" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, +/obj/item/cigbutt, /turf/open/floor/plating, -/area/service/chapel/dock) +/area/maintenance/department/cargo) "bHL" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/turf/open/floor/plating, -/area/service/chapel/dock) -"bHM" = ( -/turf/closed/wall/r_wall, -/area/service/chapel/dock) -"bHN" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on, /obj/structure/window/reinforced, /obj/structure/window/reinforced{ dir = 8; layer = 2.9 }, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) +/turf/open/floor/plating/airless, +/area/service/chapel/dock) +"bHM" = ( +/turf/closed/wall/r_wall, +/area/service/chapel/dock) +"bHN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/vending/cola/random, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "bHP" = ( /obj/effect/decal/cleanable/cobweb, /turf/open/floor/plasteel/dark, @@ -38420,50 +38434,36 @@ /turf/open/space/basic, /area/space/nearstation) "bIU" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/closed/wall, -/area/service/chapel/dock) +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "bIV" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/vacuum/external, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, /turf/open/floor/plating, /area/service/chapel/dock) "bIW" = ( -/obj/machinery/computer/shuttle/monastery_shuttle, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating, /area/service/chapel/dock) "bIX" = ( -/obj/machinery/atmospherics/components/unary/tank/air, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/service/chapel/dock) +/obj/structure/grille/broken, +/turf/open/space/basic, +/area/space/nearstation) "bIY" = ( +/obj/structure/window/reinforced, /obj/structure/window/reinforced{ dir = 8; layer = 2.9 }, +/obj/structure/lattice, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "bIZ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -38978,44 +38978,58 @@ /turf/open/space/basic, /area/space/nearstation) "bKa" = ( -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 +/obj/machinery/door/airlock/external{ + name = "Pod Docking Bay" }, -/turf/open/floor/plasteel/dark, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, /area/service/chapel/dock) "bKb" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/vacuum/external, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating, /area/service/chapel/dock) "bKc" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/computer/shuttle/monastery_shuttle, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, /turf/open/floor/plasteel/dark, /area/service/chapel/dock) "bKd" = ( -/obj/machinery/power/apc{ - dir = 4; - name = "Monastery Docking Bay APC"; - pixel_x = 24 +/obj/machinery/atmospherics/components/unary/tank/air, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/structure/cable{ - icon_state = "0-8" +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/service/chapel/dock) "bKe" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/white{ - heat_capacity = 1e+006 +/obj/structure/lattice, +/obj/structure/window/reinforced{ + dir = 8; + layer = 2.9 }, -/area/service/chapel/dock) +/turf/open/space/basic, +/area/space/nearstation) "bKf" = ( +/obj/structure/chair, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -39486,52 +39500,40 @@ /turf/open/floor/plating, /area/science/mixing) "bLn" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -24 + }, /turf/open/floor/plasteel/dark, /area/service/chapel/dock) "bLo" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 + icon_state = "2-4" }, /turf/open/floor/plasteel/dark, /area/service/chapel/dock) "bLp" = ( -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/dark, /area/service/chapel/dock) "bLq" = ( -/obj/machinery/door/airlock/grunge{ - name = "Monastery Transit" +/obj/machinery/power/apc{ + dir = 4; + name = "Monastery Docking Bay APC"; + pixel_y = 24 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/structure/cable{ + icon_state = "0-8" }, /turf/open/floor/plasteel/dark, /area/service/chapel/dock) "bLr" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -39980,9 +39982,6 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -39993,12 +39992,12 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/service/chapel/dock) "bMt" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -40006,39 +40005,27 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, /turf/open/floor/plasteel/dark, /area/service/chapel/dock) "bMu" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel/dark, /area/service/chapel/dock) "bMv" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/service/chapel/dock) -"bMw" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white{ - heat_capacity = 1e+006 +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 }, +/turf/open/floor/plasteel/dark, /area/service/chapel/dock) "bMx" = ( /obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -40448,12 +40435,6 @@ /turf/open/floor/plating, /area/service/chapel/asteroid/monastery) "bNt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = -24 - }, /obj/machinery/light/small, /obj/machinery/camera{ c_tag = "Monastery Dock"; @@ -40470,21 +40451,18 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/table/wood, +/obj/item/clothing/under/misc/burial, /turf/open/floor/plasteel/dark, /area/service/chapel/dock) "bNu" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/service/chapel/dock) "bNv" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, /obj/item/radio/intercom{ name = "Station Intercom (General)"; pixel_x = 27 @@ -40500,6 +40478,8 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/grown/poppy, /turf/open/floor/plasteel/dark, /area/service/chapel/dock) "bNw" = ( @@ -40538,13 +40518,26 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/space/nearstation) -"bNE" = ( -/obj/machinery/light/small{ +"bNC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" +/turf/open/floor/plasteel/dark, +/area/service/library) +"bNE" = ( +/obj/machinery/atmospherics/pipe/manifold/general/hidden{ + dir = 1 }, +/obj/machinery/meter, +/turf/open/floor/plating, /area/maintenance/department/chapel/monastery) "bNF" = ( /obj/item/stack/medical/suture, @@ -40669,6 +40662,7 @@ /obj/machinery/light/small{ dir = 1 }, +/obj/machinery/space_heater, /turf/open/floor/plating{ icon_state = "platingdmg3" }, @@ -40898,19 +40892,12 @@ /turf/open/floor/plasteel/dark, /area/service/chapel/dock) "bOy" = ( -/obj/effect/turf_decal/tile/neutral{ +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/chair{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, /turf/open/floor/plasteel/dark, /area/service/chapel/dock) "bOz" = ( @@ -41302,7 +41289,7 @@ req_access_txt = "23" }, /turf/open/floor/plating, -/area/engineering/storage/tech) +/area/maintenance/department/engine) "bPG" = ( /obj/machinery/light{ dir = 8 @@ -44340,8 +44327,8 @@ /turf/open/floor/plating, /area/maintenance/department/engine) "bWl" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 +/obj/structure/disposalpipe/junction/yjunction{ + dir = 8 }, /turf/open/floor/plating, /area/maintenance/department/engine) @@ -45441,15 +45428,15 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /turf/open/floor/plasteel, /area/engineering/main) "bYS" = ( @@ -45462,15 +45449,15 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engineering/main) "bYT" = ( @@ -45486,15 +45473,15 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /obj/structure/cable{ icon_state = "1-2" }, @@ -45514,15 +45501,15 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engineering/main) "bYV" = ( @@ -45533,6 +45520,12 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -45545,15 +45538,15 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -45572,15 +45565,15 @@ /obj/machinery/firealarm{ pixel_y = 29 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engineering/main) "bYY" = ( @@ -46213,8 +46206,12 @@ /turf/open/floor/engine, /area/maintenance/disposal/incinerator) "caS" = ( -/turf/closed/wall, -/area/service/chapel/asteroid/monastery) +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "caT" = ( /obj/structure/grille, /obj/structure/window/reinforced/tinted/fulltile, @@ -46513,6 +46510,9 @@ "cbT" = ( /obj/item/shovel, /obj/effect/landmark/xeno_spawn, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /turf/open/floor/plating, /area/maintenance/department/engine) "cbV" = ( @@ -46885,6 +46885,7 @@ "cdE" = ( /obj/structure/chair, /obj/item/cigbutt, +/obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/department/engine) "cdI" = ( @@ -46956,6 +46957,11 @@ }, /turf/open/floor/plating, /area/engineering/main) +"cdV" = ( +/obj/structure/window/reinforced/fulltile, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/service/library/lounge) "cdW" = ( /obj/structure/reflector/box/anchored, /turf/open/floor/plasteel/dark, @@ -47266,6 +47272,10 @@ dir = 4; light_color = "#e8eaff" }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 22 + }, /turf/open/floor/plasteel/dark, /area/engineering/main) "cfk" = ( @@ -48301,48 +48311,26 @@ /turf/open/floor/plating, /area/service/chapel/main/monastery) "cjH" = ( -/obj/machinery/door/airlock/grunge{ - name = "Chapel Garden" +/obj/item/kirbyplants{ + icon_state = "plant-21" }, /turf/open/floor/plasteel/dark, /area/service/chapel/main/monastery) "cjO" = ( -/obj/effect/decal/cleanable/cobweb{ - icon_state = "cobweb2" - }, -/obj/item/stack/sheet/glass/fifty{ - layer = 4 - }, -/obj/item/stack/sheet/metal{ - amount = 20; - layer = 3.1 - }, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) -"cjP" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_y = 26 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 }, /turf/open/floor/plasteel/dark, -/area/service/library/lounge) +/area/security/courtroom) +"cjP" = ( +/obj/structure/table, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "cjQ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/carpet, +/obj/structure/bookcase/random/nonfiction, +/turf/open/floor/plasteel/dark, /area/service/library) -"cjR" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/carpet, -/area/service/library/lounge) "cjV" = ( /obj/machinery/camera/preset/toxins, /turf/open/floor/plating/asteroid/airless, @@ -48384,71 +48372,47 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel/dark, /area/service/chapel/main/monastery) -"cke" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) "ckf" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) -"ckg" = ( -/obj/item/wrench, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) -"ckh" = ( -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) -"cki" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "Air Out" - }, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) -"ckj" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) -"ckk" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = 24 - }, -/obj/item/stack/rods/fifty, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) -"ckl" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/machinery/photocopier, +/obj/structure/table, +/obj/item/book/manual/wiki/security_space_law, /turf/open/floor/plasteel/dark, -/area/service/library/lounge) -"ckm" = ( +/area/security/courtroom) +"ckh" = ( +/obj/structure/chair, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"ckj" = ( +/obj/structure/chair, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"cko" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/carpet, /area/service/library) -"cko" = ( -/obj/structure/bookcase/random/religion, -/turf/open/floor/plasteel/dark, -/area/service/library) "ckp" = ( -/obj/structure/bookcase/random/religion, -/obj/effect/decal/cleanable/cobweb{ - icon_state = "cobweb2" - }, +/obj/structure/closet/crate/bin, /turf/open/floor/plasteel/dark, /area/service/library/lounge) "ckt" = ( @@ -48485,74 +48449,66 @@ /turf/open/floor/plasteel/dark, /area/service/chapel/main/monastery) "cky" = ( -/obj/machinery/power/smes{ - charge = 5e+006 +/obj/structure/cable{ + icon_state = "0-4" }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) -"ckz" = ( -/obj/machinery/atmospherics/pipe/simple/general/hidden{ - dir = 6 +/obj/machinery/power/apc{ + areastring = "/area/security/courtroom"; + dir = 8; + name = "Courtroom APC"; + pixel_x = -25 }, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "ckA" = ( -/obj/machinery/atmospherics/pipe/manifold/general/hidden{ - dir = 1 - }, -/obj/machinery/meter, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/chair, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "ckB" = ( -/obj/machinery/atmospherics/pipe/manifold/general/hidden{ +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"ckD" = ( +/obj/structure/statue/sandstone/venus{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"ckE" = ( +/obj/structure/grille/broken, +/obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) -"ckC" = ( -/obj/item/extinguisher, +/area/maintenance/department/engine) +"ckF" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, /turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) -"ckD" = ( +/area/maintenance/department/engine) +"ckG" = ( /obj/structure/chair/wood/normal, /obj/machinery/firealarm{ dir = 4; pixel_x = -28 }, -/turf/open/floor/plasteel/dark, -/area/service/library/lounge) -"ckE" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 +/obj/machinery/camera{ + c_tag = "Monastery Library"; + dir = 4; + network = list("ss13","monastery") }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/service/chapel/main/monastery) -"ckF" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/carpet, -/area/service/library/lounge) -"ckG" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/light/small{ dir = 8 }, /turf/open/floor/plasteel/dark, @@ -48561,8 +48517,8 @@ /turf/open/floor/plasteel/dark, /area/service/library) "ckI" = ( -/obj/machinery/light/small{ - dir = 4 +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 }, /turf/open/floor/plasteel/dark, /area/service/library/lounge) @@ -48596,57 +48552,39 @@ }, /turf/open/floor/plasteel/dark, /area/service/chapel/main/monastery) -"ckO" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) -"ckP" = ( -/obj/machinery/atmospherics/components/unary/tank/air{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) "ckQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/mineral/iron, -/area/maintenance/department/chapel/monastery) -"ckR" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) -"ckS" = ( -/obj/structure/table/wood, -/obj/item/folder/yellow, -/obj/item/pen, -/obj/machinery/camera{ - c_tag = "Monastery Library"; - dir = 4; - network = list("ss13","monastery") +/obj/machinery/door/airlock/public/glass{ + name = "Courtroom" }, -/turf/open/floor/plasteel/dark, -/area/service/library/lounge) -"ckT" = ( -/obj/machinery/door/airlock/grunge{ - name = "Library" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, -/area/service/library/lounge) +/area/security/courtroom) +"ckS" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/security/courtroom) "ckU" = ( -/obj/machinery/bookbinder, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/libraryscanner, /turf/open/floor/plasteel/dark, /area/service/library/lounge) "ckV" = ( -/obj/structure/bookcase/random/reference, -/turf/open/floor/plasteel/dark, +/obj/effect/landmark/barthpot, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/carpet, /area/service/library/lounge) "ckW" = ( -/obj/structure/bookcase/random/nonfiction, -/turf/open/floor/plasteel/dark, -/area/service/library) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/department/engine) "ckX" = ( -/obj/structure/bookcase/random/fiction, +/obj/structure/table/wood, +/obj/machinery/computer/libraryconsole, /turf/open/floor/plasteel/dark, /area/service/library/lounge) "clb" = ( @@ -48656,36 +48594,18 @@ }, /turf/open/floor/plating, /area/service/chapel/main/monastery) -"cld" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/closed/wall, -/area/maintenance/department/chapel/monastery) "cle" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/maintenance/department/chapel/monastery) +/obj/structure/statue/sandstone/venus, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "clf" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/item/storage/box/lights/bulbs, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) -"clg" = ( -/obj/structure/chair/wood/normal{ - dir = 1 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 }, /turf/open/floor/plasteel/dark, -/area/service/library/lounge) +/area/security/courtroom) "cli" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, /turf/open/floor/plasteel/dark, @@ -48697,25 +48617,23 @@ /turf/open/floor/plating/asteroid/airless, /area/asteroid/nearstation/bomb_site) "clk" = ( -/obj/machinery/light/small{ - dir = 8 +/obj/machinery/light{ + dir = 4 }, -/obj/machinery/libraryscanner, /turf/open/floor/plasteel/dark, -/area/service/library/lounge) +/area/security/courtroom) "clm" = ( -/obj/structure/closet/crate/bin, +/obj/machinery/photocopier, /turf/open/floor/plasteel/dark, /area/service/library/lounge) "cln" = ( -/obj/structure/bookcase/random/adult, -/turf/open/floor/plasteel/dark, +/obj/machinery/newscaster{ + pixel_x = -32; + pixel_y = -32 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/carpet, /area/service/library/lounge) -"clp" = ( -/obj/structure/table/wood, -/obj/machinery/computer/libraryconsole/bookmanagement, -/turf/open/floor/plasteel/dark, -/area/service/library) "cls" = ( /obj/effect/spawner/lootdrop/maintenance, /turf/closed/mineral, @@ -50308,8 +50226,9 @@ /turf/open/floor/plasteel, /area/engineering/atmos) "cqH" = ( -/obj/machinery/light/small{ - dir = 8 +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 }, /turf/open/floor/plasteel/dark, /area/service/chapel/dock) @@ -50335,11 +50254,10 @@ /turf/open/floor/plasteel, /area/command/heads_quarters/ce) "cqW" = ( -/obj/structure/chair, -/turf/open/floor/plasteel/white{ - heat_capacity = 1e+006 - }, -/area/service/chapel/dock) +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) "cqX" = ( /obj/structure/disposalpipe/segment, /obj/structure/lattice, @@ -50696,7 +50614,7 @@ "csy" = ( /obj/effect/spawner/lootdrop/maintenance, /obj/structure/disposalpipe/segment{ - dir = 6 + dir = 4 }, /turf/open/floor/plating, /area/maintenance/department/engine) @@ -51032,12 +50950,13 @@ /turf/open/floor/plating, /area/service/chapel/main/monastery) "ctS" = ( -/obj/structure/disposaloutlet, -/obj/structure/disposalpipe/trunk{ - dir = 1 +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 3; + name = "3maintenance loot spawner" }, -/turf/open/floor/plating/airless, -/area/space/nearstation) +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) "ctX" = ( /obj/machinery/vending/wardrobe/chap_wardrobe, /turf/open/floor/carpet, @@ -51530,9 +51449,6 @@ /turf/open/floor/plasteel/dark, /area/service/chapel/main/monastery) "cvy" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -51543,6 +51459,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/service/chapel/main/monastery) "cvA" = ( @@ -51574,9 +51491,7 @@ icon_state = "1-4" }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, +/obj/machinery/light/small, /turf/open/floor/plasteel/dark, /area/service/chapel/main/monastery) "cvF" = ( @@ -51599,15 +51514,9 @@ /turf/open/floor/plasteel/dark, /area/service/chapel/main/monastery) "cvH" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -51618,10 +51527,18 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Monastery Cloister Aft"; + dir = 1; + network = list("ss13","monastery") + }, +/obj/machinery/light/small, /turf/open/floor/plasteel/dark, /area/service/chapel/main/monastery) "cvI" = ( -/obj/machinery/light/small, /obj/structure/cable{ icon_state = "4-8" }, @@ -51629,21 +51546,6 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/camera{ - c_tag = "Monastery Cloister Aft"; - dir = 1; - network = list("ss13","monastery") - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /turf/open/floor/plasteel/dark, /area/service/chapel/main/monastery) "cvJ" = ( @@ -51654,38 +51556,16 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /turf/open/floor/plasteel/dark, /area/service/chapel/main/monastery) "cvK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 8; + name = "8maintenance loot spawner" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/service/chapel/main/monastery) +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) "cvR" = ( /obj/machinery/light/small{ dir = 8 @@ -51714,52 +51594,16 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/service/chapel/main/monastery) -"cvX" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/closed/wall/mineral/iron, -/area/maintenance/department/chapel/monastery) -"cvY" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/closed/wall/mineral/iron, -/area/maintenance/department/chapel/monastery) -"cvZ" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/closed/wall/mineral/iron, -/area/maintenance/department/chapel/monastery) -"cwa" = ( -/turf/closed/wall/mineral/iron, -/area/maintenance/department/chapel/monastery) "cwc" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/airlock/maintenance{ - name = "Monastery Maintenance"; - req_one_access_txt = "22;24;10;11;37" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) +/turf/closed/wall/mineral/iron, +/area/security/courtroom) "cwe" = ( /turf/closed/wall/mineral/iron, /area/service/library/lounge) "cwg" = ( -/obj/machinery/door/airlock/grunge{ - name = "Library" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/dark, -/area/service/library/lounge) +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) "cwj" = ( /obj/item/storage/box/matches{ pixel_x = -3; @@ -51783,69 +51627,42 @@ /turf/open/floor/plasteel/dark, /area/service/chapel/main/monastery) "cwm" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) -"cwn" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/item/storage/toolbox/mechanical, -/obj/machinery/light/small{ +/obj/machinery/light{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"cwn" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "cwo" = ( -/obj/machinery/power/apc{ - dir = 1; - name = "Monastery Maintenance APC"; - pixel_y = 23 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "cwp" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable{ - icon_state = "1-8" +/obj/machinery/camera{ + c_tag = "Courtroom North" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/machinery/airalarm{ + pixel_y = 22 }, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "cwr" = ( /obj/item/kirbyplants{ icon_state = "plant-22" }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - dir = 4; - name = "Library Lounge APC"; - pixel_x = 24 - }, -/obj/machinery/airalarm{ - pixel_y = 22 +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = 26 }, /turf/open/floor/plasteel/dark, /area/service/library/lounge) @@ -51882,9 +51699,6 @@ /obj/structure/table/wood, /turf/open/floor/plasteel/dark, /area/service/chapel/main/monastery) -"cwA" = ( -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) "cwE" = ( /obj/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -51910,17 +51724,12 @@ /turf/open/floor/plasteel/dark, /area/service/chapel/main/monastery) "cwH" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) +/obj/structure/chair, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "cwK" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/service/library/lounge) +/turf/closed/wall, +/area/security/courtroom) "cwM" = ( /obj/structure/window/reinforced{ dir = 4; @@ -51940,12 +51749,14 @@ /turf/open/space/basic, /area/space/nearstation) "cwS" = ( -/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) +/area/security/courtroom) "cwU" = ( /obj/structure/table/wood, -/obj/machinery/computer/libraryconsole, +/obj/item/folder/yellow, +/obj/item/pen, /turf/open/floor/plasteel/dark, /area/service/library/lounge) "cxb" = ( @@ -51957,14 +51768,12 @@ /turf/open/floor/plasteel, /area/science/mixing) "cxe" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 +/obj/structure/disposalpipe/segment{ + dir = 5 }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/carpet, -/area/service/library/lounge) +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) "cxg" = ( /obj/structure/window/reinforced{ dir = 1; @@ -51994,14 +51803,6 @@ }, /turf/open/space/basic, /area/space/nearstation) -"cxn" = ( -/obj/machinery/newscaster{ - pixel_x = -32; - pixel_y = -32 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/carpet, -/area/service/library/lounge) "cxt" = ( /obj/effect/turf_decal/box/corners{ dir = 8 @@ -52019,265 +51820,134 @@ /turf/open/floor/plasteel/dark, /area/science/explab) "cxz" = ( -/obj/machinery/door/airlock/grunge{ - name = "Library" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/dark, -/area/service/library/lounge) +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) "cxB" = ( +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"cxD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) +"cxE" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, /turf/closed/wall, /area/service/library/lounge) -"cxC" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/service/library/lounge) -"cxD" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/service/library/lounge) -"cxE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +"cxL" = ( +/obj/effect/landmark/xeno_spawn, +/obj/structure/disposalpipe/segment{ dir = 10 }, -/turf/closed/wall, -/area/service/library/lounge) -"cxJ" = ( +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) +"cxM" = ( /obj/structure/window/reinforced/fulltile, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/service/library/lounge) -"cxK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/service/library/lounge) -"cxL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/service/library/lounge) -"cxM" = ( -/obj/structure/window/reinforced/fulltile, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/service/library/lounge) "cxX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/machinery/power/smes{ + charge = 5e+006 }, -/obj/machinery/camera{ - c_tag = "Monastery Archives Access Tunnel"; - dir = 4; - network = list("ss13","monastery") +/obj/structure/cable{ + icon_state = "0-2" }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/service/library/lounge) +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) "cxY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/power/terminal{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/service/library/lounge) +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) "cyl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/item/storage/toolbox/mechanical, +/obj/machinery/light/small{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/service/library/lounge) -"cym" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "2-4" }, -/obj/effect/turf_decal/tile/neutral{ +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) +"cym" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "Monastery Maintenance APC"; + pixel_y = 23 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/effect/decal/cleanable/cobweb{ + icon_state = "cobweb2" + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) +"cyy" = ( +/obj/item/storage/box/lights/bulbs, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) +"cyz" = ( +/obj/machinery/light/small{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) +"cyA" = ( +/obj/machinery/power/smes{ + charge = 5e+006 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" }, -/turf/open/floor/plasteel/dark, -/area/service/library/lounge) -"cyy" = ( +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) +"cyB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, /turf/closed/wall, /area/service/library/lounge) -"cyz" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 +"cyL" = ( +/obj/machinery/power/terminal{ + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 + dir = 6 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) +"cyM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/service/library/lounge) -"cyA" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 - }, /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/service/library/lounge) -"cyB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/turf/closed/wall, -/area/service/library/lounge) -"cyL" = ( -/obj/structure/lattice, -/obj/structure/lattice, -/turf/closed/mineral, -/area/service/chapel/asteroid/monastery) -"cyM" = ( -/obj/structure/lattice, -/turf/closed/mineral, -/area/service/chapel/asteroid/monastery) +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) "cyP" = ( -/obj/structure/bookcase/random/nonfiction, -/obj/machinery/light/small{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 10 }, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) +"cyQ" = ( +/obj/machinery/vending/games, /turf/open/floor/plasteel/dark, /area/service/library) -"cyQ" = ( +"cyR" = ( /obj/item/kirbyplants{ icon_state = "plant-22" }, @@ -52290,48 +51960,52 @@ }, /turf/open/floor/plasteel/dark, /area/service/library) -"cyR" = ( +"cyT" = ( /obj/item/kirbyplants{ icon_state = "plant-22" }, /turf/open/floor/plasteel/dark, /area/service/library) -"cyS" = ( -/obj/structure/bookcase/random/religion, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/service/library) -"cyT" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - layer = 2.9; - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/pen, -/turf/open/floor/plasteel/dark, -/area/service/library) "cyU" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/service/library) "cyY" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/item/extinguisher, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) +"cyZ" = ( /obj/machinery/light/small{ dir = 8 }, /turf/open/floor/plasteel/dark, /area/service/library) -"cyZ" = ( -/obj/structure/displaycase/trophy, -/turf/open/floor/plasteel/dark, -/area/service/library) "czl" = ( -/obj/structure/chair/wood/normal, -/turf/open/floor/carpet, -/area/service/library) -"czo" = ( +/obj/item/stack/cable_coil, +/obj/item/stack/sheet/glass/fifty{ + layer = 4 + }, +/obj/item/stack/sheet/metal{ + amount = 20; + layer = 3.1 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) +"czp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) +"czq" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp/green{ pixel_x = 1; @@ -52339,28 +52013,26 @@ }, /turf/open/floor/plasteel/dark, /area/service/library) -"czp" = ( -/obj/structure/table/wood, -/obj/item/barcodescanner, -/turf/open/floor/plasteel/dark, -/area/service/library) -"czq" = ( -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/dark, -/area/service/library) "czr" = ( -/obj/structure/table/wood/fancy, -/turf/open/floor/carpet, -/area/service/library) +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) "czt" = ( -/obj/structure/table/wood/fancy, -/obj/item/storage/photo_album, +/obj/machinery/atmospherics/pipe/manifold/general/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) +"czv" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/carpet, /area/service/library) -"czu" = ( +"czw" = ( /obj/structure/table/wood, /obj/item/paper_bin{ layer = 2.9; @@ -52369,38 +52041,26 @@ }, /turf/open/floor/plasteel/dark, /area/service/library) -"czv" = ( -/obj/structure/chair/wood/normal{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/service/library) -"czw" = ( -/obj/machinery/newscaster{ - pixel_x = 32 - }, -/turf/open/floor/plasteel/dark, -/area/service/library) "czB" = ( -/obj/structure/table/wood/fancy, -/obj/item/storage/fancy/candle_box, -/turf/open/floor/carpet, -/area/service/library) +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) "czC" = ( -/obj/structure/table/wood/fancy, -/obj/item/flashlight/lantern{ - icon_state = "lantern-on"; - pixel_y = 8 - }, -/turf/open/floor/carpet, -/area/service/library) +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) "czD" = ( -/obj/structure/table/wood, -/obj/item/folder/yellow, -/obj/item/pen, -/turf/open/floor/plasteel/dark, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/carpet, /area/service/library) "czH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) +"czI" = ( /obj/machinery/light/small{ dir = 8 }, @@ -52411,73 +52071,71 @@ }, /turf/open/floor/plasteel/dark, /area/service/library) -"czI" = ( +"czM" = ( /obj/structure/chair/wood/normal{ dir = 1 }, /turf/open/floor/carpet, /area/service/library) -"czL" = ( +"czN" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/service/library) -"czM" = ( +"czO" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/service/library) -"czN" = ( +"czP" = ( +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) +"czQ" = ( /obj/structure/table/wood, /obj/item/storage/bag/books, /turf/open/floor/plasteel/dark, /area/service/library) -"czO" = ( -/obj/structure/table/wood, -/obj/item/instrument/saxophone, -/turf/open/floor/plasteel/dark, -/area/service/library) -"czP" = ( -/obj/structure/table/wood, -/obj/item/stack/packageWrap, -/obj/item/coin/gold, -/turf/open/floor/plasteel/dark, -/area/service/library) -"czQ" = ( -/obj/machinery/light/small{ +"czV" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/camera{ - c_tag = "Monastery Archives Starboard"; - dir = 8; - network = list("ss13","monastery") +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/service/chapel/main/monastery) +"czW" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, /turf/open/floor/plasteel/dark, -/area/service/library) -"czV" = ( +/area/service/chapel/main/monastery) +"czY" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, /turf/open/floor/plasteel/dark, /area/service/library) -"czW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/service/library) -"czY" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/service/library) -"czZ" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/service/library) "cAa" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel/dark, @@ -52496,56 +52154,39 @@ /turf/open/floor/plasteel/dark, /area/service/library) "cAi" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/service/library) +/turf/closed/mineral, +/area/service/chapel/asteroid/monastery) "cAj" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/service/library) +/turf/closed/wall, +/area/maintenance/department/chapel/monastery) "cAr" = ( -/obj/machinery/light/small{ - dir = 8 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/door/window/northright{ - base_state = "left"; - dir = 2; - icon_state = "left"; - name = "Curator Desk Door"; - req_access_txt = "37" +/obj/machinery/door/airlock/maintenance{ + name = "Monastery Maintenance"; + req_one_access_txt = "22;24;10;11;37" }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/service/library) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) "cAs" = ( /obj/structure/table/wood, -/obj/item/kirbyplants{ - icon_state = "plant-05"; - pixel_y = 10 - }, +/obj/item/clothing/head/pharaoh, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -52576,9 +52217,28 @@ /turf/open/floor/plasteel/dark, /area/service/library) "cAu" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/door/window/northright{ + base_state = "left"; + dir = 2; + icon_state = "left"; + name = "Curator Desk Door"; + req_access_txt = "37" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/service/library) +"cAv" = ( /obj/structure/table/wood, -/obj/item/clothing/head/pharaoh, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/item/kirbyplants{ + icon_state = "plant-05"; + pixel_y = 10 + }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -52591,7 +52251,7 @@ }, /turf/open/floor/plasteel/dark, /area/service/library) -"cAv" = ( +"cAy" = ( /obj/structure/table/wood, /obj/item/camera, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -52607,38 +52267,7 @@ }, /turf/open/floor/plasteel/dark, /area/service/library) -"cAy" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/door/window/northright{ - dir = 2; - name = "Curator Desk Door"; - req_access_txt = "37" - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/service/library) "cAB" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/service/library) -"cAC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/chair/wood/wings{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/service/library) -"cAD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/chair/wood/wings{ dir = 1 @@ -52646,32 +52275,46 @@ /obj/effect/landmark/start/librarian, /turf/open/floor/plasteel/dark, /area/service/library) +"cAC" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/service/library) +"cAD" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) "cAH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/department/chapel/monastery) +"cAJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/space/basic, +/area/space) +"cAK" = ( /obj/machinery/light/small, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, /turf/open/floor/plasteel/dark, /area/service/library) -"cAJ" = ( +"cAM" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, /turf/open/floor/plasteel/dark, /area/service/library) -"cAK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/service/library) -"cAM" = ( -/obj/machinery/light/small, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/service/library) "cAQ" = ( /obj/structure/cable{ icon_state = "1-8" @@ -52682,31 +52325,57 @@ /turf/open/floor/plating, /area/engineering/main) "cAS" = ( -/obj/machinery/vending/wardrobe/curator_wardrobe, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel/dark, -/area/service/library) +/area/service/chapel/main/monastery) "cAT" = ( -/obj/structure/destructible/cult/tome, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plasteel/dark, -/area/service/library) +/area/service/chapel/main/monastery) "cAU" = ( -/obj/structure/rack{ - icon = 'icons/obj/stationobjs.dmi'; - icon_state = "minibar"; - name = "skeletal minibar" +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/item/book/codex_gigas, -/obj/machinery/camera{ - c_tag = "Monastery Archives Aft"; - dir = 1; - network = list("ss13","monastery") +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 }, /turf/open/floor/plasteel/dark, -/area/service/library) +/area/service/chapel/main/monastery) "cAV" = ( -/obj/structure/bookcase{ - name = "Forbidden Knowledge" - }, +/obj/machinery/vending/wardrobe/curator_wardrobe, /turf/open/floor/plasteel/dark, /area/service/library) "cBi" = ( @@ -52910,15 +52579,6 @@ /obj/effect/turf_decal/bot/right, /turf/open/floor/plasteel/white, /area/engineering/gravity_generator) -"cCR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/maintenance/department/chapel/monastery) "cCS" = ( /obj/machinery/rnd/production/techfab/department/security, /turf/open/floor/plasteel/dark, @@ -52941,9 +52601,14 @@ /turf/open/floor/plasteel, /area/engineering/main) "cCW" = ( -/obj/machinery/vending/games, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/dark, -/area/service/library) +/area/service/chapel/main/monastery) "cCX" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -52992,6 +52657,15 @@ icon_state = "platingdmg3" }, /area/maintenance/department/security/brig) +"cIN" = ( +/obj/machinery/door/airlock/grunge{ + name = "Library" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) "cJo" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -53126,6 +52800,12 @@ }, /turf/open/floor/plasteel/dark, /area/science/lab) +"cTI" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "cXP" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -53150,6 +52830,14 @@ /obj/machinery/power/rad_collector/anchored, /turf/open/floor/engine, /area/engineering/supermatter) +"daQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/flora/ausbushes/reedbush{ + pixel_x = 3; + pixel_y = 3 + }, +/turf/open/water/decorative, +/area/hallway/secondary/entry) "daY" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating, @@ -53171,14 +52859,7 @@ /turf/open/floor/plating, /area/maintenance/department/security/brig) "deJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/table, -/obj/item/gps/mining{ - gpstag = "MINE_PUB" - }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellowsiding/corner, /area/hallway/secondary/entry) "dgg" = ( /obj/structure/disposalpipe/segment{ @@ -53418,6 +53099,13 @@ }, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/exit/departure_lounge) +"dwq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/chair/wood/wings{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/service/library) "dxc" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -53459,18 +53147,31 @@ }, /area/maintenance/department/engine) "dEy" = ( -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, /obj/structure/reflector/double/anchored{ dir = 9 }, /turf/open/floor/plasteel/dark, /area/engineering/main) +"dET" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "dFJ" = ( /turf/open/floor/engine, /area/engineering/supermatter) +"dHg" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/obj/effect/landmark/start/prisoner, +/turf/open/floor/plasteel, +/area/security/prison) "dHo" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -53581,6 +53282,10 @@ /obj/machinery/shieldwallgen/xenobiologyaccess, /turf/open/floor/plating, /area/maintenance/department/engine) +"dRT" = ( +/obj/structure/bookcase/random/reference, +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) "dSp" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/engine_waste{ dir = 1 @@ -53597,6 +53302,12 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) +"dVp" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "dVI" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 4; @@ -53635,6 +53346,13 @@ }, /turf/open/floor/plasteel/dark, /area/security/prison) +"dYI" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/dark, +/area/service/library) "dZj" = ( /obj/machinery/atmospherics/pipe/manifold/green/visible, /obj/machinery/airalarm/engine{ @@ -53675,6 +53393,10 @@ /obj/machinery/status_display/supply, /turf/closed/wall, /area/cargo/office) +"eeG" = ( +/obj/machinery/bookbinder, +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) "eeQ" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -53696,6 +53418,10 @@ icon_state = "panelscorched" }, /area/maintenance/department/science) +"egu" = ( +/obj/structure/bookcase/random/religion, +/turf/open/floor/plasteel/dark, +/area/service/library) "egK" = ( /obj/structure/girder, /turf/open/floor/plating{ @@ -53710,6 +53436,14 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) +"ehR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/chair, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "eiV" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 4 @@ -53721,6 +53455,7 @@ /obj/effect/decal/cleanable/cobweb{ icon_state = "cobweb2" }, +/obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/maintenance/department/security/brig) "elk" = ( @@ -53900,6 +53635,18 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"eKC" = ( +/obj/machinery/door/airlock/grunge{ + name = "Library" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) "eLt" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/tile/neutral{ @@ -53923,14 +53670,7 @@ }, /area/maintenance/department/science) "eNc" = ( -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/obj/structure/rack, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/turf/open/floor/plating, /area/maintenance/department/chapel/monastery) "eNq" = ( /obj/effect/turf_decal/stripes/line{ @@ -54244,6 +53984,18 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) +"fug" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/power/apc{ + dir = 4; + name = "Library APC"; + pixel_x = 24 + }, +/obj/structure/cable, +/turf/open/floor/plasteel/dark, +/area/service/library) "fuP" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -54333,13 +54085,13 @@ /turf/open/floor/plasteel, /area/maintenance/department/engine) "fAx" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plating, /area/maintenance/department/security/brig) "fBt" = ( @@ -54471,8 +54223,8 @@ }, /area/hallway/secondary/exit/departure_lounge) "fWv" = ( -/obj/structure/bookcase/random/religion, -/turf/open/floor/plasteel/dark, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/carpet, /area/service/library/lounge) "fZK" = ( /obj/machinery/atmospherics/pipe/manifold/cyan/visible{ @@ -54529,13 +54281,19 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) +"geL" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/AIsatextAS) "geN" = ( /obj/machinery/igniter{ id = "xenoigniter"; luminosity = 2 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 }, /turf/open/floor/engine, /area/science/xenobiology) @@ -54561,6 +54319,25 @@ }, /turf/open/floor/plasteel/dark, /area/engineering/main) +"ggN" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) "giI" = ( /obj/machinery/light/small{ dir = 1 @@ -54727,6 +54504,10 @@ }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) +"gqi" = ( +/obj/structure/bookcase/random/religion, +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) "gue" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -54924,6 +54705,14 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"gJV" = ( +/obj/machinery/door/window/southleft{ + dir = 1; + name = "Court Cell"; + req_access_txt = "2" + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "gKz" = ( /obj/structure/table/wood, /obj/item/kirbyplants{ @@ -54988,6 +54777,20 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"gPs" = ( +/obj/machinery/door/airlock/grunge{ + name = "Library" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/service/library) "gPV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 @@ -55033,6 +54836,9 @@ }, /turf/open/floor/plating, /area/maintenance/department/science) +"gXv" = ( +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) "gXZ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ @@ -55062,6 +54868,12 @@ /obj/machinery/door/poddoor/incinerator_atmos_main, /turf/open/floor/engine/vacuum, /area/maintenance/disposal/incinerator) +"het" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) "heC" = ( /obj/machinery/power/apc/highcap/five_k{ dir = 8; @@ -55148,6 +54960,18 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) +"hlj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/service/library) +"hlw" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "hnu" = ( /obj/machinery/button/door{ id = "lawyer_shutters"; @@ -55181,6 +55005,13 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/engine, /area/engineering/main) +"hpF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "hqo" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -55196,6 +55027,16 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"hrk" = ( +/obj/item/beacon, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "hvW" = ( /obj/machinery/door/poddoor/preopen{ id = "xenobio4"; @@ -55280,6 +55121,20 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port) +"hBu" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/service/library) "hDG" = ( /obj/machinery/door/airlock/engineering{ name = "Auxillary Base Construction"; @@ -55348,6 +55203,10 @@ /obj/machinery/power/rad_collector/anchored, /turf/open/floor/engine, /area/engineering/supermatter) +"hKX" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/maintenance/department/security/brig) "hMx" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /turf/open/floor/plating{ @@ -55466,7 +55325,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "hVx" = ( @@ -55584,11 +55443,11 @@ /turf/open/floor/plasteel/white, /area/science/xenobiology) "ijF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/bookcase/random/nonfiction, +/obj/machinery/light/small{ + dir = 1 }, -/turf/open/floor/carpet, +/turf/open/floor/plasteel/dark, /area/service/library) "ijU" = ( /obj/effect/spawner/lootdrop/organ_spawner, @@ -55674,6 +55533,10 @@ }, /turf/open/floor/plasteel, /area/engineering/main) +"ipv" = ( +/obj/structure/chair/wood/normal, +/turf/open/floor/carpet, +/area/service/library) "iqc" = ( /turf/open/floor/plasteel/stairs/right, /area/maintenance/department/crew_quarters/dorms) @@ -55743,6 +55606,9 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) +"iye" = ( +/turf/closed/wall, +/area/service/chapel/asteroid/monastery) "iyg" = ( /obj/structure/cable{ icon_state = "1-2" @@ -55759,6 +55625,12 @@ }, /turf/open/floor/plasteel/dark, /area/engineering/main) +"iyL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/closed/wall, +/area/service/library/lounge) "izB" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod" @@ -55769,11 +55641,16 @@ /turf/open/floor/plating, /area/commons/dorms) "izF" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plasteel/white{ - heat_capacity = 1e+006 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "2-8" }, -/area/service/chapel/dock) +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/service/chapel/main/monastery) "iAx" = ( /obj/structure/cable{ icon_state = "4-8" @@ -55819,6 +55696,11 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plating, /area/security/execution/transfer) +"iEP" = ( +/obj/structure/table/wood/fancy, +/obj/item/storage/fancy/candle_box, +/turf/open/floor/carpet, +/area/service/library) "iEQ" = ( /obj/structure/table, /obj/item/storage/box/lights/mixed, @@ -55828,6 +55710,12 @@ /obj/effect/spawner/lootdrop/keg, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/dorms) +"iEX" = ( +/obj/structure/table/wood, +/obj/item/storage/briefcase, +/obj/item/folder/red, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "iFI" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -55888,6 +55776,7 @@ id = "xenoigniter"; luminosity = 2 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/engine, /area/science/xenobiology) "iPz" = ( @@ -55979,16 +55868,64 @@ /area/maintenance/department/cargo) "iXx" = ( /obj/machinery/light/small, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plating{ icon_state = "panelscorched" }, /area/maintenance/department/chapel/monastery) +"iYp" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) +"iYQ" = ( +/obj/structure/chair{ + dir = 4; + name = "Prosecution" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "jcT" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"jee" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/closed/wall, +/area/service/library/lounge) "jen" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 @@ -56021,16 +55958,14 @@ }, /area/hallway/secondary/exit/departure_lounge) "jgr" = ( -/obj/machinery/door/airlock/grunge{ - name = "Library" +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/dark, -/area/service/library) +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) "jhk" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -56069,6 +56004,16 @@ /obj/machinery/atmospherics/components/binary/pump, /turf/closed/wall/r_wall, /area/tcommsat/computer) +"jqZ" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + layer = 2.9; + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/pen, +/turf/open/floor/plasteel/dark, +/area/service/library) "jrG" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -56189,6 +56134,22 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"jzw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) "jzz" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external, @@ -56253,6 +56214,10 @@ }, /turf/open/floor/plating, /area/maintenance/department/science) +"jEZ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/yellowsiding, +/area/hallway/secondary/entry) "jFw" = ( /obj/effect/spawner/lootdrop/maintenance, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -56261,11 +56226,8 @@ /turf/open/floor/plating, /area/maintenance/department/science) "jFO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/carpet, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/service/library/lounge) "jHP" = ( /obj/structure/table, @@ -56309,6 +56271,12 @@ /area/maintenance/department/science) "jSa" = ( /obj/machinery/door/airlock/maintenance, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plating, /area/service/chapel/main/monastery) "jTh" = ( @@ -56352,8 +56320,8 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "jXh" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 +/obj/structure/chair/wood/normal{ + dir = 1 }, /turf/open/floor/plasteel/dark, /area/service/library/lounge) @@ -56419,6 +56387,12 @@ }, /turf/open/floor/engine, /area/engineering/main) +"keD" = ( +/obj/structure/table/wood, +/obj/item/storage/briefcase, +/obj/item/folder/blue, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "kfh" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 @@ -56445,6 +56419,12 @@ }, /turf/open/floor/plasteel, /area/science/mixing) +"kix" = ( +/obj/structure/chair/wood/normal{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/service/library) "kjK" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "MiniSat Maintenance"; @@ -56532,6 +56512,15 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) +"kuS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/computer/shuttle/mining/common{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "kvj" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -56604,6 +56593,17 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/secondary/exit/departure_lounge) +"kAX" = ( +/obj/structure/table/wood, +/obj/item/gavelblock, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "kDf" = ( /obj/machinery/light/small, /turf/open/floor/carpet/black, @@ -56711,12 +56711,15 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "kJo" = ( -/obj/structure/cable{ - icon_state = "1-4" +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, -/area/maintenance/department/security/brig) +/area/maintenance/department/chapel/monastery) "kJw" = ( /obj/machinery/door/airlock/maintenance/abandoned{ name = "Firing Range Target" @@ -56725,6 +56728,22 @@ icon_state = "platingdmg3" }, /area/maintenance/department/security/brig) +"kJN" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Courtroom South"; + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "kKI" = ( /obj/effect/spawner/lootdrop/maintenance, /obj/structure/closet, @@ -56746,6 +56765,15 @@ }, /turf/open/floor/engine, /area/science/xenobiology) +"kOW" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/carpet, +/area/service/library/lounge) "kPi" = ( /obj/structure/table, /obj/machinery/microwave, @@ -56772,6 +56800,12 @@ }, /turf/open/floor/plasteel/white, /area/medical/treatment_center) +"kQH" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/service/library) "kQZ" = ( /obj/structure/closet, /obj/item/stack/spacecash/c10, @@ -56796,6 +56830,26 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"kRY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) "kSb" = ( /obj/structure/chair/office/light{ dir = 8 @@ -56887,6 +56941,9 @@ /obj/item/kirbyplants{ icon_state = "plant-10" }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/service/chapel/main/monastery) "kYM" = ( @@ -57011,15 +57068,6 @@ /obj/effect/decal/cleanable/oil, /turf/open/floor/plating, /area/maintenance/department/security/brig) -"lqy" = ( -/obj/machinery/door/airlock/grunge{ - name = "Library" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/dark, -/area/service/library/lounge) "lrM" = ( /obj/structure/cable{ icon_state = "2-8" @@ -57028,10 +57076,8 @@ /turf/open/floor/plasteel, /area/engineering/main) "lxI" = ( -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, /area/maintenance/department/chapel/monastery) "lzJ" = ( /obj/structure/closet/crate/bin, @@ -57047,6 +57093,28 @@ "lAs" = ( /turf/closed/wall, /area/cargo/sorting) +"lAL" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "lAR" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -57070,6 +57138,12 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/engine, /area/science/xenobiology) +"lEh" = ( +/obj/structure/bookcase{ + name = "Forbidden Knowledge" + }, +/turf/open/floor/plasteel/dark, +/area/service/library) "lEn" = ( /obj/structure/window/reinforced{ dir = 1 @@ -57179,6 +57253,12 @@ }, /turf/open/floor/plating, /area/maintenance/department/science) +"lQo" = ( +/obj/machinery/newscaster{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/dark, +/area/service/library) "lQQ" = ( /obj/machinery/door/poddoor/preopen{ id = "bridgespace"; @@ -57214,6 +57294,12 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) +"lUz" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "lUO" = ( /obj/structure/sign/warning/radiation, /turf/closed/wall/r_wall, @@ -57260,6 +57346,20 @@ }, /turf/open/floor/engine, /area/science/xenobiology) +"lXv" = ( +/obj/structure/chair{ + dir = 8; + name = "Defense" + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "lXJ" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -57311,6 +57411,19 @@ /obj/machinery/portable_atmospherics/canister/toxins, /turf/open/floor/plating, /area/engineering/main) +"mck" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + layer = 2.9; + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/pen{ + pixel_x = -2; + pixel_y = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "mdL" = ( /obj/structure/table, /obj/item/paper_bin, @@ -57609,6 +57722,17 @@ /obj/structure/cable, /turf/open/floor/plating, /area/tcommsat/computer) +"mEe" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "mEu" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 @@ -57630,12 +57754,10 @@ /turf/open/floor/wood, /area/maintenance/department/engine) "mIa" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, /obj/machinery/light/small{ dir = 8 }, +/obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/department/engine) "mJp" = ( @@ -57645,9 +57767,15 @@ }, /turf/open/space/basic, /area/space/nearstation) +"mJR" = ( +/turf/open/water/decorative, +/area/hallway/secondary/entry) "mKc" = ( -/obj/structure/bookcase/random/nonfiction, -/turf/open/floor/plasteel/dark, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/carpet, /area/service/library/lounge) "mKk" = ( /obj/structure/cable{ @@ -57655,6 +57783,11 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) +"mKP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/security/courtroom) "mLB" = ( /obj/structure/cable{ icon_state = "1-4" @@ -57707,12 +57840,38 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating/airless, /area/space/nearstation) +"mWN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) "mXq" = ( /obj/item/taperecorder, /obj/item/cartridge/lawyer, /obj/structure/table/wood, /turf/open/floor/wood, /area/service/lawoffice) +"mXJ" = ( +/obj/structure/table/wood/fancy, +/turf/open/floor/carpet, +/area/service/library) "mZE" = ( /turf/open/space/basic, /area/space/nearstation) @@ -57801,6 +57960,11 @@ /obj/effect/spawner/lootdrop/costume, /turf/open/floor/plating, /area/maintenance/department/security/brig) +"nix" = ( +/obj/structure/lattice, +/obj/structure/lattice, +/turf/closed/mineral, +/area/service/chapel/asteroid/monastery) "niy" = ( /obj/structure/table, /obj/item/reagent_containers/food/snacks/cookie, @@ -57819,6 +57983,11 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/secondary/exit/departure_lounge) +"njI" = ( +/obj/structure/table/wood, +/obj/machinery/computer/libraryconsole/bookmanagement, +/turf/open/floor/plasteel/dark, +/area/service/library) "nku" = ( /obj/machinery/door/airlock/centcom{ name = "Crematorium"; @@ -57865,6 +58034,13 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"nso" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "nsy" = ( /obj/structure/table, /obj/item/stack/sheet/metal/fifty, @@ -58063,10 +58239,14 @@ /turf/open/floor/engine, /area/science/explab) "nKo" = ( -/obj/structure/lattice, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) "nLl" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -58122,6 +58302,25 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) +"nOF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) "nOY" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -58177,6 +58376,10 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) +"nUc" = ( +/obj/structure/disposaloutlet, +/turf/open/floor/plating, +/area/space/nearstation) "nUQ" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine, @@ -58185,10 +58388,33 @@ /obj/item/spear, /turf/open/floor/plating, /area/maintenance/department/engine) +"nWD" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/door/window/northright{ + dir = 2; + name = "Curator Desk Door"; + req_access_txt = "37" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/service/library) "nWP" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/maintenance/department/engine) +"nXR" = ( +/obj/structure/table/wood/fancy, +/obj/item/flashlight/lantern{ + icon_state = "lantern-on"; + pixel_y = 8 + }, +/turf/open/floor/carpet, +/area/service/library) "nYb" = ( /obj/structure/table_frame/wood, /turf/open/floor/wood, @@ -58198,6 +58424,12 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/hallway/secondary/exit/departure_lounge) +"nYC" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/service/library) "nZw" = ( /obj/machinery/door/airlock/abandoned{ name = "Backup Laboratory" @@ -58225,11 +58457,14 @@ /obj/item/pen, /turf/open/floor/plating, /area/maintenance/department/science) -"odM" = ( -/obj/effect/landmark/barthpot, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +"odz" = ( +/obj/structure/table/wood/fancy, +/obj/item/storage/photo_album, /turf/open/floor/carpet, -/area/service/library/lounge) +/area/service/library) +"odM" = ( +/turf/closed/wall/r_wall, +/area/security/courtroom) "oep" = ( /obj/structure/table/glass, /obj/item/paper_bin, @@ -58346,6 +58581,19 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"osW" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"osY" = ( +/obj/structure/flora/ausbushes/reedbush{ + pixel_x = -2; + pixel_y = 13 + }, +/turf/open/water/decorative, +/area/hallway/secondary/entry) "ous" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/button/door{ @@ -58401,6 +58649,13 @@ }, /turf/open/floor/plasteel/dark, /area/service/chapel/office) +"oxo" = ( +/obj/structure/bookcase/random/religion, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/service/library) "oxw" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -58414,6 +58669,7 @@ /area/commons/storage/primary) "ozO" = ( /obj/machinery/door/airlock/maintenance, +/obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/department/engine) "oAw" = ( @@ -58531,6 +58787,22 @@ }, /turf/open/floor/plating, /area/engineering/main) +"oHk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/carpet, +/area/service/library/lounge) +"oIU" = ( +/obj/structure/table/wood, +/obj/item/folder/yellow, +/obj/item/pen, +/turf/open/floor/plasteel/dark, +/area/service/library) "oKa" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance{ @@ -58577,7 +58849,6 @@ dir = 8 }, /obj/machinery/atmospherics/components/binary/pump/on{ - dir = 3; name = "Waste to Space" }, /turf/open/floor/plasteel/dark, @@ -58709,6 +58980,12 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) +"oWD" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/service/library) "oXe" = ( /obj/structure/table/glass, /obj/item/mmi, @@ -58757,12 +59034,6 @@ /turf/open/floor/plating/airless, /area/engineering/main) "pbm" = ( -/obj/machinery/door/airlock/external{ - name = "Pod Docking Bay" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, /turf/open/floor/plating, /area/service/chapel/dock) "pbI" = ( @@ -58790,7 +59061,7 @@ dir = 5 }, /turf/open/floor/plating, -/area/science/explab) +/area/maintenance/department/cargo) "peE" = ( /obj/structure/cable{ icon_state = "1-4" @@ -58848,15 +59119,9 @@ /turf/open/floor/plating, /area/maintenance/disposal) "pia" = ( -/obj/effect/spawner/lootdrop/maintenance, -/obj/structure/rack, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/chapel/monastery) +/obj/structure/disposalpipe/segment, +/turf/open/space/basic, +/area/space) "pjH" = ( /obj/structure/cable{ icon_state = "1-2" @@ -59078,6 +59343,13 @@ }, /turf/open/floor/wood, /area/command/heads_quarters/hop) +"pJy" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -26 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "pKd" = ( /obj/effect/spawner/lootdrop/maintenance{ lootcount = 2; @@ -59195,12 +59467,16 @@ /turf/open/floor/plasteel, /area/service/hydroponics) "pXc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable{ - icon_state = "1-4" + icon_state = "1-2" }, -/turf/open/floor/carpet, -/area/service/library) +/obj/machinery/door/airlock/public/glass{ + name = "Courtroom" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "pXg" = ( /obj/structure/table/glass, /obj/structure/window/reinforced, @@ -59419,6 +59695,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/engine, /area/science/xenobiology) "qAx" = ( @@ -59429,10 +59706,13 @@ /turf/open/floor/plasteel, /area/commons/fitness/recreation) "qAM" = ( -/obj/effect/spawner/lootdrop/maintenance, -/obj/item/cigbutt, -/turf/open/floor/plating, -/area/maintenance/department/cargo) +/obj/machinery/door/airlock/grunge{ + name = "Library" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) "qBv" = ( /obj/item/clothing/head/ushanka, /turf/open/floor/plating, @@ -59477,6 +59757,21 @@ }, /turf/open/floor/plasteel, /area/engineering/main) +"qFw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/yellowsiding{ + dir = 1 + }, +/area/hallway/secondary/entry) +"qGf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/maintenance/department/chapel/monastery) "qGu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -59529,6 +59824,20 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/plating, /area/maintenance/department/science) +"qLb" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/security_space_law, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "qLI" = ( /obj/structure/table, /obj/item/stack/sheet/glass/fifty{ @@ -59562,7 +59871,10 @@ /turf/open/floor/plating, /area/security/execution/transfer) "qOE" = ( -/turf/open/floor/plasteel/dark, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/carpet, /area/service/library/lounge) "qOH" = ( /obj/structure/cable{ @@ -59636,6 +59948,19 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) +"qUD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/flora/ausbushes/sparsegrass, +/obj/structure/flora/rock/pile/largejungle{ + pixel_x = -50; + pixel_y = -50 + }, +/obj/structure/flora/ausbushes/sparsegrass{ + pixel_x = -60; + pixel_y = -60 + }, +/turf/open/water/decorative, +/area/hallway/secondary/entry) "qVk" = ( /obj/machinery/door/poddoor/incinerator_atmos_aux, /obj/structure/lattice/catwalk, @@ -59662,9 +59987,10 @@ /turf/open/floor/plasteel/dark, /area/science/xenobiology) "qWo" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 }, +/turf/closed/wall, /area/maintenance/department/chapel/monastery) "qWG" = ( /obj/structure/closet/emcloset/anchored, @@ -59736,6 +60062,10 @@ }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) +"qYW" = ( +/obj/structure/bookcase/random/nonfiction, +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) "rar" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment{ @@ -59857,12 +60187,16 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "rnE" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/door/airlock/grunge{ + name = "Library" }, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) "roc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -59872,10 +60206,18 @@ /obj/machinery/light/small{ dir = 4 }, +/obj/structure/closet/emcloset, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, /area/service/chapel/dock) +"rpx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "rrb" = ( /obj/structure/cable{ icon_state = "1-2" @@ -59961,6 +60303,12 @@ }, /turf/open/floor/plasteel/cafeteria, /area/service/kitchen) +"rzm" = ( +/obj/structure/table/wood, +/obj/item/stack/packageWrap, +/obj/item/coin/gold, +/turf/open/floor/plasteel/dark, +/area/service/library) "rzp" = ( /obj/structure/table, /obj/item/stack/sheet/metal/fifty, @@ -59996,6 +60344,13 @@ icon_state = "platingdmg3" }, /area/maintenance/department/science) +"rGY" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/yellowsiding/corner{ + dir = 8 + }, +/area/hallway/secondary/entry) "rHA" = ( /turf/open/floor/plasteel, /area/construction/mining/aux_base) @@ -60086,6 +60441,19 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, /area/science/mixing) +"rRv" = ( +/obj/structure/bookcase/random/religion, +/obj/effect/decal/cleanable/cobweb{ + icon_state = "cobweb2" + }, +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) +"rSE" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) "rSH" = ( /obj/item/trash/can, /turf/open/floor/wood, @@ -60185,6 +60553,17 @@ }, /turf/open/space, /area/space/nearstation) +"sgD" = ( +/obj/structure/bookcase/random/adult, +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) +"shw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/carpet, +/area/service/library) "shH" = ( /turf/closed/wall/r_wall, /area/space/nearstation) @@ -60246,6 +60625,13 @@ }, /turf/open/floor/plasteel/dark, /area/maintenance/department/crew_quarters/dorms) +"sqt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "sqQ" = ( /turf/open/floor/plating, /area/maintenance/disposal) @@ -60375,7 +60761,9 @@ dir = 8 }, /obj/structure/table, -/obj/item/flashlight, +/obj/item/gps/mining{ + gpstag = "MINE_PUB" + }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "sJp" = ( @@ -60399,6 +60787,17 @@ }, /turf/open/floor/plasteel, /area/engineering/main) +"sKq" = ( +/obj/machinery/door/airlock/grunge{ + name = "Library" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/service/library) "sNk" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -60419,6 +60818,9 @@ }, /turf/open/floor/plating, /area/security/execution/transfer) +"sPh" = ( +/turf/open/floor/plasteel/yellowsiding, +/area/hallway/secondary/entry) "sQt" = ( /obj/machinery/door/airlock/external{ name = "Supply Dock Airlock"; @@ -60592,6 +60994,7 @@ /area/maintenance/department/science) "tfP" = ( /obj/item/beacon, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/engine, /area/science/xenobiology) "tfZ" = ( @@ -60615,7 +61018,7 @@ }, /obj/structure/disposalpipe/segment, /turf/open/floor/plating, -/area/science/explab) +/area/maintenance/department/cargo) "tix" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -60797,11 +61200,15 @@ }, /area/maintenance/department/science) "tyL" = ( -/obj/structure/cable{ - icon_state = "1-8" +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" }, -/turf/open/floor/plating, -/area/maintenance/department/security/brig) +/obj/structure/rack, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/department/chapel/monastery) "tzj" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel/white, @@ -60823,6 +61230,10 @@ /obj/item/pen, /turf/open/floor/plasteel/dark, /area/science/explab) +"tCJ" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/maintenance/department/crew_quarters/bar) "tCP" = ( /obj/docking_port/stationary/public_mining_dock, /turf/open/floor/plating, @@ -60881,6 +61292,11 @@ icon_state = "panelscorched" }, /area/maintenance/department/engine) +"tRZ" = ( +/obj/structure/lattice, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "tSL" = ( /turf/open/floor/plating{ icon_state = "panelscorched" @@ -60909,6 +61325,26 @@ }, /turf/closed/wall/r_wall, /area/science/xenobiology) +"tVY" = ( +/obj/structure/chair{ + dir = 4; + name = "Prosecution" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"tVZ" = ( +/obj/effect/landmark/start/prisoner, +/turf/open/floor/plasteel/dark, +/area/security/prison) "tXn" = ( /obj/structure/sink{ dir = 4; @@ -61032,11 +61468,15 @@ /turf/open/floor/plating, /area/maintenance/department/security/brig) "ukn" = ( -/obj/structure/disposalpipe/segment{ +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/rack, +/obj/machinery/light/small{ dir = 4 }, -/turf/closed/wall, -/area/maintenance/department/engine) +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/department/chapel/monastery) "ukp" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 4; @@ -61061,6 +61501,24 @@ }, /turf/open/floor/plasteel, /area/commons/storage/primary) +"ulQ" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Courtroom"; + req_access_txt = "42" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "ulY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, @@ -61108,6 +61566,15 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"upz" = ( +/turf/open/floor/plasteel/yellowsiding{ + dir = 4 + }, +/area/hallway/secondary/entry) +"upX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/water/decorative, +/area/hallway/secondary/entry) "uqJ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -61237,12 +61704,37 @@ }, /turf/open/floor/plasteel, /area/tcommsat/computer) +"uzy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) "uzB" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, /turf/open/floor/engine, /area/science/xenobiology) +"uAA" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "uAU" = ( /obj/structure/table/wood, /obj/item/folder/blue, @@ -61278,10 +61770,27 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating/airless, /area/space/nearstation) +"uIh" = ( +/obj/structure/chair{ + dir = 8; + name = "Defense" + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "uIn" = ( /obj/machinery/power/terminal{ dir = 1 }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, /turf/open/floor/plating, /area/maintenance/department/engine) "uIB" = ( @@ -61347,6 +61856,12 @@ }, /turf/open/floor/engine, /area/engineering/main) +"uTZ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/service/library) "uUQ" = ( /obj/machinery/door/airlock/maintenance{ name = "Engineering Maintenance"; @@ -61373,6 +61888,13 @@ /obj/item/stamp/law, /turf/open/floor/carpet, /area/service/lawoffice) +"uXp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "uXG" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -61399,6 +61921,11 @@ }, /turf/open/floor/plating, /area/maintenance/solars/starboard) +"uXL" = ( +/turf/open/floor/plasteel/yellowsiding{ + dir = 1 + }, +/area/hallway/secondary/entry) "uZb" = ( /obj/structure/lattice, /obj/structure/window/reinforced{ @@ -61414,9 +61941,7 @@ /turf/open/floor/plating, /area/maintenance/department/engine) "vco" = ( -/obj/machinery/light/small{ - dir = 8 - }, +/obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/department/chapel/monastery) "veF" = ( @@ -61442,6 +61967,11 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) +"vgg" = ( +/obj/structure/table/wood, +/obj/item/barcodescanner, +/turf/open/floor/plasteel/dark, +/area/service/library) "vgp" = ( /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -61538,6 +62068,25 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"vrn" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) "vsk" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -61622,6 +62171,10 @@ }, /turf/open/floor/plasteel, /area/engineering/main) +"vxV" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "vzp" = ( /obj/effect/turf_decal/tile/brown, /obj/item/stack/ore/iron, @@ -61717,6 +62270,15 @@ }, /turf/open/floor/plating, /area/maintenance/department/science) +"vHh" = ( +/obj/structure/lattice, +/turf/closed/mineral, +/area/service/chapel/asteroid/monastery) +"vIa" = ( +/turf/open/floor/plasteel/yellowsiding/corner{ + dir = 4 + }, +/area/hallway/secondary/entry) "vIc" = ( /obj/structure/cable{ icon_state = "2-4" @@ -61743,19 +62305,30 @@ /turf/open/floor/plasteel/dark, /area/science/xenobiology) "vOw" = ( -/obj/machinery/door/airlock/grunge{ - name = "Library" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 +/obj/structure/lattice, +/obj/structure/disposalpipe/segment, +/turf/open/space/basic, +/area/space/nearstation) +"vQN" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 }, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, /turf/open/floor/plasteel/dark, -/area/service/library) +/area/service/library/lounge) "vRi" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -61794,6 +62367,20 @@ }, /turf/open/floor/plasteel, /area/engineering/main) +"vTc" = ( +/obj/structure/rack{ + icon = 'icons/obj/stationobjs.dmi'; + icon_state = "minibar"; + name = "skeletal minibar" + }, +/obj/item/book/codex_gigas, +/obj/machinery/camera{ + c_tag = "Monastery Archives Aft"; + dir = 1; + network = list("ss13","monastery") + }, +/turf/open/floor/plasteel/dark, +/area/service/library) "vTL" = ( /obj/machinery/vending/tool, /obj/effect/turf_decal/tile/neutral{ @@ -61873,6 +62460,17 @@ /obj/machinery/meter, /turf/open/floor/plating, /area/maintenance/department/engine) +"wdY" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Monastery Archives Starboard"; + dir = 8; + network = list("ss13","monastery") + }, +/turf/open/floor/plasteel/dark, +/area/service/library) "weL" = ( /obj/machinery/light/small, /turf/open/floor/plating, @@ -61911,6 +62509,13 @@ }, /turf/open/floor/engine, /area/engineering/main) +"whP" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/yellowsiding/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) "wig" = ( /obj/machinery/vending/cigarette, /turf/open/floor/plating{ @@ -61943,15 +62548,14 @@ /turf/open/floor/plasteel, /area/engineering/main) "wjQ" = ( -/obj/machinery/computer/shuttle/mining/common{ - dir = 4 - }, /obj/machinery/light{ dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/structure/table, +/obj/item/flashlight, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "wkZ" = ( @@ -61981,6 +62585,13 @@ }, /turf/open/floor/plasteel/white, /area/science/explab) +"wnE" = ( +/obj/machinery/light/small, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/service/library) "wnJ" = ( /obj/structure/sign/warning, /turf/closed/wall, @@ -62056,6 +62667,11 @@ }, /turf/open/floor/plasteel/dark, /area/security/brig) +"wyf" = ( +/obj/structure/chair, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "wzb" = ( /obj/structure/chair, /turf/open/floor/wood, @@ -62093,6 +62709,10 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/department/security/brig) +"wDq" = ( +/obj/structure/bookcase/random/fiction, +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) "wDZ" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -62241,6 +62861,14 @@ }, /turf/open/floor/plating, /area/maintenance/department/security/brig) +"wSX" = ( +/obj/structure/flora/junglebush/large{ + pixel_x = -15; + pixel_y = -4 + }, +/obj/structure/flora/rock/pile, +/turf/open/water/decorative, +/area/hallway/secondary/entry) "wTD" = ( /obj/structure/table/wood, /obj/item/folder/red, @@ -62283,6 +62911,11 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"wWJ" = ( +/obj/structure/closet/secure_closet/courtroom, +/obj/item/gavelhammer, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "wXu" = ( /obj/machinery/disposal/bin, /obj/structure/window/reinforced{ @@ -62379,9 +63012,9 @@ /turf/open/floor/plasteel, /area/science/explab) "xhj" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/carpet, -/area/service/library/lounge) +/obj/structure/table, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) "xhE" = ( /obj/structure/extinguisher_cabinet{ pixel_x = 27 @@ -62400,23 +63033,19 @@ /turf/open/floor/plasteel, /area/engineering/main) "xja" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/power/apc{ - dir = 4; - name = "Library APC"; - pixel_x = 24 - }, -/obj/structure/cable, +/obj/structure/displaycase/trophy, /turf/open/floor/plasteel/dark, /area/service/library) "xjc" = ( /obj/structure/cable{ - icon_state = "2-8" + icon_state = "1-4" }, -/turf/open/floor/plasteel/dark, -/area/service/library) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/carpet, +/area/service/library/lounge) "xje" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/firedoor, @@ -62451,6 +63080,33 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"xkB" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/courtroom) +"xld" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Monastery Archives Access Tunnel"; + dir = 4; + network = list("ss13","monastery") + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) "xlg" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/heat_exchanging/junction, @@ -62608,6 +63264,10 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) +"xEb" = ( +/obj/structure/destructible/cult/tome, +/turf/open/floor/plasteel/dark, +/area/service/library) "xEx" = ( /obj/machinery/portable_atmospherics/scrubber/huge, /obj/effect/turf_decal/stripes/line, @@ -62631,6 +63291,11 @@ /obj/effect/landmark/carpspawn, /turf/open/space, /area/space/station_ruins) +"xGY" = ( +/obj/structure/table/wood, +/obj/item/instrument/saxophone, +/turf/open/floor/plasteel/dark, +/area/service/library) "xIx" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -62675,10 +63340,22 @@ /turf/open/floor/plasteel/dark, /area/service/lawoffice) "xNx" = ( -/obj/structure/lattice, -/obj/structure/disposalpipe/junction/flip, -/turf/open/space/basic, -/area/space/nearstation) +/obj/item/kirbyplants{ + icon_state = "plant-22" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + dir = 4; + name = "Library Lounge APC"; + pixel_x = 24 + }, +/obj/machinery/airalarm{ + pixel_y = 22 + }, +/turf/open/floor/plasteel/dark, +/area/service/library/lounge) "xNy" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line{ @@ -62722,6 +63399,12 @@ /area/space/nearstation) "xSd" = ( /obj/machinery/light/small, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plating, /area/maintenance/department/chapel/monastery) "xSX" = ( @@ -62738,14 +63421,8 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "xVt" = ( -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/obj/structure/rack, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, /area/maintenance/department/chapel/monastery) "xWl" = ( /obj/item/pen, @@ -62759,9 +63436,13 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "xYV" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" +/obj/item/stack/rods/fifty, +/obj/item/wrench, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "Air to Distro" }, +/turf/open/floor/plating, /area/maintenance/department/chapel/monastery) "ybX" = ( /obj/structure/table, @@ -76637,31 +77318,31 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC rmC rmC rmC @@ -76894,31 +77575,31 @@ cxg aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC rmC rmC rmC @@ -77151,31 +77832,31 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC +rmC rmC rmC rmC @@ -77393,11 +78074,11 @@ cbK ceP cdC ciO -bWV -bWV -cgf +cfm +cfm +chF cjl -bWV +cfm cwl cwz bWV @@ -77414,17 +78095,17 @@ aaa aaa aaa aaa -cfN -cfN -cfN aaa aaa aaa aaa aaa aaa -cfN -cfN +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -77650,11 +78331,11 @@ cuK ceP bXJ cve -bWV +cfm bXJ ckd ceP -bWV +cfm bWV bWV bWV @@ -77668,22 +78349,22 @@ aaa aaa aaa aaa -cfN -cfN -cfN -cfN -cfN -cyM aaa aaa aaa -cfN -cfN -cfN -cfN -cfN -cfN -cfN +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -77820,7 +78501,7 @@ aaa aaa aaa aaa -aaa +cFB aaa aaa aaa @@ -77909,13 +78590,30 @@ cfm cfm cfm cjH -chF -cuQ -cvX -cke +czV +ceP +cwc +xhj cky -cld -cCR +cwK +odM +odM +odM +odM +odM +odM +aaa +aaa +aaa +aaa +cfN +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -77923,26 +78621,9 @@ aaa aaa aaa aaa -cfN -cfN -cfN -cfN -cfN -cfN -cfN -aht aaa aaa aaa -cfN -cyM -cfN -cfN -cfN -cfN -cfN -cfN -cfN aaa aaa aaa @@ -78168,12 +78849,26 @@ chf cfD cvu cvE -cvY -ckf +cwc ckf +uAA cle -cjm -cjm +ckS +cxB +xkB +cxB +vxV +odM +odM +aaa +aaa +cfN +cfN +cfN +aaa +cfN +cfN +cfN aaa aaa aaa @@ -78182,24 +78877,10 @@ aaa aaa cfN cfN -cfN -cyM -cfN -cyM -aaa -aht aaa aaa aaa aaa -aht -aaa -cfN -cfN -cfN -cfN -cfN -cfN aaa aaa aaa @@ -78425,38 +79106,38 @@ cfE cfE cfo cvF -cvZ +cwc cwm ckj cwH -ckO -cjm +ckS +tVY +iYQ +cxB +cxB +wWJ +odM +aaa +aaa cfN +cfN +cfN +cfN +cfN +cfN +vHh aaa aaa aaa +cfN +cfN +cfN +cfN +cfN +cfN +cfN aaa aaa -cfN -cfN -cfN -aht -aaa -aht -aaa -aht -aht -aht -aht -aht -aht -aaa -cfN -cfN -cyM -cfN -cfN -cfN aaa aaa aaa @@ -78640,8 +79321,8 @@ aaa aaa aaa aaa -bHI -aby +aaa +bIX aby aby bGH @@ -78681,39 +79362,39 @@ cgG cgG bWV cfn -ciR -cwa +cAS +cwc cwn -ckg -ckz -ckP -cjm -cfN -cfN -cfN -aaa -aaa -aaa -aaa -aaa -aaa +ckj +cwH +ckS +mck +iEX +cxB +cxB +dVp +odM aht -aaa aht -aaa +cfN +cfN +cfN +cfN +cfN +cfN aht aaa aaa aaa -aaa -aht -aaa -aaa -aaa -aht +cfN +vHh +cfN +cfN +cfN +cfN +cfN cfN cfN -aaa aaa aaa aaa @@ -78896,11 +79577,11 @@ aaa aaa aaa aaa +aaa bGD bGD bIT bJZ -bIT bMr bNs bOw @@ -78938,40 +79619,40 @@ ciT cvh cgG cfn -cvF -cwa +cAT +pXc cwo ckh ckA -ckP -cjm +mKP +hpF +sqt +cTI +qLb +kJN +odM +aaa cfN cfN cfN +vHh cfN +vHh aaa -aaa -aaa -aaa -aaa -cjp -cyU -cjp -cyU -cjp -cjp -cyU -cjp -cyU -cjp -cyU -aht -aht aht aaa aaa aaa aaa +aht +aaa +cfN +cfN +cfN +cfN +cfN +cfN +aaa aaa aaa aaa @@ -79153,10 +79834,10 @@ aaa aaa aaa aaa +aaa +bGE bGE bGE -bIU -bHM bHM bHM bHM @@ -79198,43 +79879,43 @@ cfn cvH cwc cwp -cki +cxB ckB -ckP -cjm -caS -caS -caS +ulQ +hrk caS +osW +kAX +nso +odM +aaa +cfN +cfN +cfN +aht +aaa +aht +aaa +aht aht aht aht aht -cjp -cjp -ckH -cyY -ckH -ckH -ckH -ckH -czH -ckH -cyR -cyU -aaa -aaa aht aaa +cfN +cfN +vHh +cfN +cfN +cfN aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +rmC +rmC +rmC rmC rmC rmC @@ -79409,7 +80090,7 @@ aaa aaa aaa aaa -bFE +aaa bGF bHJ pbm @@ -79455,43 +80136,43 @@ cvw cvI ckQ clf -cwA -cwA +wyf +ehR cwS -cjm -cfN -caS -cfN +rpx +uXp +lUz +mEe +dET +odM aaa aaa aaa aaa +aht +aaa +aht aaa -cjp -cCW -ckH -cyZ -ckH -czl -czr -czr -czI -ckH -ckH -cjp -cjp -cyU aht aaa aaa aaa aaa +aht +aaa +aaa +aaa +aht +cfN +cfN aaa aaa aaa aaa aaa -aaa +rmC +rmC +rmC rmC rmC rmC @@ -79667,8 +80348,8 @@ aaa aaa aaa aaa +aaa bGE -bHK bIV bKb bLo @@ -79709,36 +80390,36 @@ cgH cvi cgG cfn -ciR -cwa +cAS +cwc cjO -ckk -ckC -ckR -cjm -cfN -caS -caS -aht -aht -aht -aht -aht +cwH +cwH +ckS +keD +mck +cxB +cxB +pJy +odM +aaa +aaa +aaa +aaa cjp -ckW -ckH -ckH -ckH -czl -czr -czB -czI -czV -ckH -cAr -cAB cyU cjp +cyU +cjp +cjp +cyU +cjp +cyU +cjp +cyU +aht +aht +aht aaa aaa aaa @@ -79746,9 +80427,9 @@ aaa aaa aaa aaa -aaa -aaa -aaa +rmC +rmC +rmC rmC rmC rmC @@ -79924,7 +80605,7 @@ aaa aaa aaa aaa -bGG +aaa bHL bIW bKc @@ -79967,41 +80648,41 @@ cid cgG cfn ciR -cwe -cwe -cwe -cwe -cwe -cwe -cwe -cwe -cfN -aaa -aaa -aaa -aaa -aaa +cwc +cwm +cwH +cwH +ckS +uIh +lXv +cxB +lAL +hlw +odM +aht +aht +aht +cjp cjp -cyP ckH cyZ ckH -czl -czt -czC -czI -czW -cAg -cAs ckH -cAH -cjp +ckH +ckH +czI +ckH +cyT cyU aaa aaa +aht +aaa +aaa +aaa +aaa aaa aaa -cfN aaa aaa aaa @@ -80127,8 +80808,8 @@ wxb aiu xuv aoe -ajD -ajD +bGG +hKX aiu apB aiu @@ -80136,7 +80817,7 @@ aBa oTC ait aaa -abN +bBW aaa aHA aKz @@ -80181,9 +80862,9 @@ aaa aaa aaa aaa +aaa bGH bGE -bIX bKd bLp bMu @@ -80224,42 +80905,42 @@ cvj bWV cfn cvJ -cwe +cwc cjP -ckl +cxB ckD ckS -clg -clk -cwe -cwe cxB -cxJ -cxJ -cxJ -cyy +clk +cxB +gJV +cxB +odM +aaa +aaa +aaa cjp cyQ ckH +xja +ckH +ipv +mXJ +mXJ +czM ckH ckH -ckH -ckH -ckH -ckH -czW -cAg -cAt -ckH -czW -cAS +cjp +cjp cyU aht -aht -aht -cyM -cfN -cfN +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -80382,7 +81063,7 @@ aut aiu giO aDm -kJo +ujI fAx aDm aDm @@ -80438,10 +81119,10 @@ aaa aaa aaa aaa +aaa bGI bHM bHM -bNw bLq bMv bNw @@ -80480,43 +81161,43 @@ ciV cjq cgG cfn -ckE -ckT -xhj +ciR +cwc xhj +cxB cwK odM -xhj -cxn -xhj -lqy -cxC -cxK -cxX -cyl -cyz -jgr +odM +odM +odM +odM +odM +odM +aht +aht +aht +cjp cjQ -cjQ -cjQ -cjQ -cjQ -cjQ -cjQ -czL +ckH +ckH +ckH +ipv +mXJ +iEP +czM czY -cAi +ckH cAu cAC -cAJ -cAT cyU +cjp +aaa +aaa +aaa +aaa aaa aaa aaa -cfN -cfN -cfN aaa aaa aaa @@ -80639,9 +81320,9 @@ auu aiu ekU aiu -asr -tyL +aqh ajD +bGG nPA mtu aCc @@ -80696,11 +81377,11 @@ aaa aaa aaa aaa -bHN +aaa +bIY bGE -bKe bLr -bMw +bMx bNx bNw bOw @@ -80736,45 +81417,45 @@ ciE ciW cjr cgG -cvw -cvK -cwg -cjR -jFO -ckF -jFO -cxe +czW +ceJ +cwe jFO jFO -cxz -cxD -cxL -cxY -cym -cyA -vOw +cwe +cwe +cwe +cwe +cwe +cfN +aaa +aaa +aaa +aaa +aaa +cjp ijF -pXc -ckm -ckm -ckm -ckm -ckm +ckH +xja +ckH +ipv +odz +nXR czM -czZ -cAj +cAa +cAg cAv -cAD +ckH cAK -cAU +cjp cyU aaa aaa aaa +aaa cfN -cfN -cfN -cfN +aaa +aaa aaa aaa rmC @@ -80952,12 +81633,12 @@ aaa aaa aaa aaa -aht +aaa +aaa aqG bGE -cqW bKf -bMw +bMx bNy bNw bOw @@ -80994,7 +81675,7 @@ cgG cgG bWV cfn -ceP +cAU cwe cwr clm @@ -81011,7 +81692,7 @@ cxM cyB cjp cyR -ick +ckH ckH ckH ckH @@ -81025,14 +81706,14 @@ ckH cAa cAV cyU +aht +aht +aht +vHh +cfN +cfN aaa aaa -cfN -cfN -cfN -cfN -cfN -aaa aaa rmC rmC @@ -81208,11 +81889,11 @@ aaa aaa aaa aaa -aht +aaa +aaa aht aqG bGE -izF ros bMx bNz @@ -81251,44 +81932,44 @@ chn cfE cfE cvy -cfG -cwe -cwe +cCW +qAM +fWv fWv qOE ckV -qOE +fWv cln -cwe -cfN -aaa -aaa -aaa -aaa -aaa -cjp -cyS -ick -cyZ -ckH -czo -czu +fWv +cIN +ggN +nOF +xld +jzw +vrn +sKq +czD +czD +czD +czD +czD +czD czD czN -cAa -cAg +kQH +bNC cAs -ckH +dwq cAM -cjp +xEb cyU aaa aaa +aaa cfN cfN cfN -cfN -cfN +aaa aaa aaa rmC @@ -81467,11 +82148,11 @@ aaa aaa aaa aaa +aaa aqG bGE bGE bHM -bHM bNA bHM bSZ @@ -81508,40 +82189,40 @@ cho cvk cdx kXx -csS -cfm -cwe -fWv -qOE +izF +rnE +xjc mKc -qOE -cln -cwe -caS -aht -aht -aht -aht -aht -cjp +oHk +mKc +kOW +mKc +mKc +eKC +vQN +uzy +mWN +kRY +iYp +gPs cko -ick -ckH -ckH -clp +shw +czv +czv +czv czv czv czO cli -ckH +hBu cAy cAB +uTZ +vTc cyU -cjp -aht -aht -aht -cyM +aaa +aaa +aaa cfN cfN cfN @@ -81725,9 +82406,9 @@ aaa aaa aaa aaa -bIY -bIY -aht +aaa +cwR +bKe aht bNB abI @@ -81764,45 +82445,45 @@ cfm ciF cuQ cfm -cfm +chF jSa -cfm cwe +xNx ckp ckI ckX -ckI -cln +het +eeG cwe -cfN -cfN -aaa -aaa -aaa -aaa +cwe +jee +cdV +cdV +cdV +iyL cjp cyT ick -cyZ -ckH -czp ckH ckH -czP ckH ckH -cjp -cjp +ckH +ckH +hlj +cAg +cAt +ckH +hlj +lEh cyU -aht -aaa aaa aaa cfN cfN cfN cfN -aaa +cfN aaa aaa rmC @@ -82021,39 +82702,40 @@ cio chq ciX cfm +cAi +jgr +cjm +cwe +gqi +gXv +dRT +gXv +sgD +cwe cfN -cwA -cfN -cwe -cwe -cwe -cwe -cwe -cwe -cwe -caS -caS -aht -aht -aht -aht +aaa +aaa +aaa +aaa +aaa cjp -cjp -xjc +oxo +ick xja ckH czq czw -ckH +oIU czQ +hlj +cAg +cAv ckH -cyR +wnE +cjp cyU aaa aaa -aht -aaa -aaa cfN cfN cfN @@ -82061,7 +82743,6 @@ cfN cfN aaa aaa -aaa rmC rmC rmC @@ -82278,47 +82959,47 @@ cgM chr chL cfm -cfN +cAi xSd -cfN -cfN -cfN -cfN -cfN -cfN -cfN -cfN -cfN -cfN -aaa -aaa -aaa -aaa -aht -cjp -cyU -cjp -cyU -cjp -cjp -cyU -cjp -cyU -cjp -cyU +cjm +cwe +gqi +gXv +qYW +gXv +sgD +cwe +iye aht aht aht aht -cyM +aht +cjp +egu +ick +ckH +ckH +njI +kix +kix +xGY +oWD +ckH +nWD +cAC +cyU +cjp +aht +aht +aht +vHh cfN cfN cfN cfN aaa aaa -aaa -aaa rmC rmC rmC @@ -82535,47 +83216,47 @@ cip chs ciY cfm -cfN -cwA -cfN -cfN -cfN -cfN -cfN -cfN -cfN -cfN -cfN +cAi +jgr +cjm +cwe +rRv +rSE +wDq +rSE +sgD +cwe cfN cfN aaa aaa aaa -aht -aaa -aaa -aht -aaa -aaa -aht -aaa -aht aaa +cjp +jqZ +ick +xja +ckH +vgg +ckH +ckH +rzm +ckH +ckH +cjp +cjp +cyU aht aaa aaa aaa -aaa -aaa cfN cfN -aaa cfN cfN aaa aaa aaa -aaa rmC rmC rmC @@ -82792,44 +83473,44 @@ cfm cht cfm cfm +cAi +jgr cfN -cwA -cfN -cfN -cfN -cfN -cfN -cfN -cfN -cfN -cfN -cfN -cfN -aaa -aaa -aaa +cwe +cwe +cwe +cwe +cwe +cwe +cwe +iye +iye aht aht aht aht +cjp +cjp +nYC +fug +ckH +dYI +lQo +ckH +wdY +ckH +cyT +cyU aaa aaa aht -aht -aht aaa -aht aaa cfN cfN -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +cfN +cfN +cfN aaa aaa aaa @@ -82923,13 +83604,13 @@ aaa aem aeq aeE -aeU +tVZ afo afD aga aga agz -aie +dHg aiH ahm ahD @@ -83049,9 +83730,8 @@ ciq chu ciZ cfm -cfN -cwA -cfN +cAi +kJo cfN cfN cfN @@ -83065,27 +83745,28 @@ cfN aaa aaa aaa +aaa aht -aaa -aaa +cjp +cyU +cjp +cyU +cjp +cjp +cyU +cjp +cyU +cjp +cyU aht -cfN -cfN -cyM -cfN aht -aaa aht +aht +vHh +cfN cfN cfN cfN -aaa -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -83253,10 +83934,10 @@ bdV bnp baK pEH -deJ +pEH sIK wjQ -pEH +kuS bbR aZx aaa @@ -83306,43 +83987,43 @@ cfm cfm cfm cfm +cAj +jgr +cfN +cfN +cfN +cfN +cfN +cfN +cfN cfN -cwA -cjm cfN cfN cfN aaa aaa -cfN -cfN -cfN -cfN -aaa aaa +aht aaa aaa aht aaa -cfN -cyM -cfN -cfN -cfN -cfN -cyM -cfN -cyM -cfN -cfN -cfN -cfN +aaa +aht +aaa +aht +aaa +aht aaa aaa aaa aaa aaa +cfN +cfN aaa +cfN +cfN aaa aaa aaa @@ -83509,11 +84190,11 @@ aZx jzz bnp baK -baK -baK -baK -baK -baK +deJ +upz +upz +upz +vIa baK aZx aaa @@ -83554,38 +84235,20 @@ arF crO crO crO -crO -crO -cfN -cfN -cfN -cfN -cfN -cfN -cfN -cfN +aaa +aaa +cjm +cjm +cjm +cxX +cyA +czl +czC +cAj iXx cjm cfN cfN -aaa -aaa -aaa -aaa -cfN -cfN -aaa -aaa -aaa -aaa -aaa -cyL -cfN -cfN -cfN -cfN -cfN -cfN cfN cfN cfN @@ -83597,13 +84260,31 @@ cfN aaa aaa aaa -rmC -rmC -rmC -rmC -rmC -rmC -rmC +aht +aht +aht +aht +aaa +aaa +aht +aht +aht +aaa +aht +aaa +cfN +cfN +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa rmC rmC rmC @@ -83762,15 +84443,15 @@ aaa aaa aaa aYG -bbR +bHN bbR bnp baK -baK -baK -baK -baK -baK +sPh +osY +mJR +mJR +uXL baK aZx aZx @@ -83808,24 +84489,48 @@ bva bIZ bIZ bIZ -aaa -aaa -aaa -aaa -aaa -aaa -cfN -cfN -cfN -cfN -cfN -cfN -cfN -xYV +aht +aht +aht +aht +aht cjm +cvK +cjm +cxY +cyL +czp +czH +cAr +nKo +cfN +cfN +cfN +cfN +cfN +cfN +cfN +cfN +cfN +cfN +cfN +aaa +aaa +aaa aht aaa aaa +aht +cfN +cfN +vHh +cfN +aht +aaa +aht +cfN +cfN +cfN aaa aaa aaa @@ -83835,32 +84540,8 @@ aaa aaa aaa aaa -cfN -cfN -cfN -cfN -cfN -cfN -cfN -cfN -cfN -cfN -cfN -cfN -cfN -cfN -cfN -cfN aaa aaa -aaa -rmC -rmC -rmC -rmC -rmC -rmC -rmC rmC rmC rmC @@ -84019,15 +84700,15 @@ aZx aZx aYG aYG -baK +bIU baK bnq baM -baK -baK -baK -baK -baK +sPh +mJR +wSX +mJR +uXL baK bxY bzz @@ -84065,24 +84746,49 @@ caZ cbS ccN bIZ +xgh +xgh +xgh +xgh cjm cjm +cwg cjm -cjm -cjm -cjm -cjm -cjm +cyl +cyM +czr +czP +cAj +eNc cjm cfN cfN cfN +fon +aaa cfN -qWo -cjm -cjm +cfN +cfN +cfN +aaa +aaa +aaa +aaa aht aaa +cfN +vHh +cfN +cfN +cfN +cfN +vHh +cfN +vHh +cfN +cfN +cfN +cfN aaa aaa aaa @@ -84092,32 +84798,7 @@ aaa aaa aaa aaa -cfN -cfN -cfN -cfN -cfN -cfN -cfN aaa -aaa -cfN -cfN -cfN -cfN -cfN -cfN -cfN -aaa -aaa -aaa -rmC -rmC -rmC -rmC -rmC -rmC -rmC rmC rmC rmC @@ -84280,11 +84961,11 @@ bbT bbT bnr bop -bbT -bbT -bbT -bbT -bbT +jEZ +qUD +upX +daQ +qFw bbT bxZ bzA @@ -84320,51 +85001,51 @@ aaa bIZ cba cbT -bDi +bRD ozO -cwA -cwA -cwA -cwA vco -cwA -cwA -cwA -cwA +vco +vco +vco +vco +vco +cxe +cjm +cym xYV bNE -xYV +czP qWo lxI xVt -cjm +qGf aht -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aht +fon aaa aaa cfN cfN -cfN -aaa aaa aaa aaa aaa aaa +nix +cfN +cfN +cfN +cfN +cfN +cfN +cfN +cfN +cfN +cfN cfN cfN cfN cfN -aaa aaa aaa aaa @@ -84537,11 +85218,11 @@ bkT bfY bns bfY -bfY +rGY bqS bsm btN -bfY +whP bfY bya bzB @@ -84576,27 +85257,28 @@ bva aaa bIZ cbb -bDi +bSq ccO bva -cjm -cjm -xgh -xgh -cjm -cjm -cjm +xgh +xgh xgh xgh cjm cjm +cxz cjm +cyy +cyP +czt +czP cjm eNc -pia +cjm cjm aht aaa +fon aaa aaa aaa @@ -84605,23 +85287,22 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +cfN +cfN +cfN +cfN +cfN +cfN +cfN +cfN +cfN +cfN +cfN +cfN +cfN +cfN +cfN +cfN aaa aaa aaa @@ -84833,42 +85514,28 @@ bIZ aaa bva bva -bNK +ckE bva bva aht aht -fon -fon aht aht +cjm +cqW +cxD +cjm +cyz +cyY +czB +cjm +cjm +eNc +tyL +cjm +aht +aaa mau -fon -fon -aht -aht -aht -cjm -cjm -cjm -cjm -aht -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -84877,8 +85544,22 @@ aaa aaa aaa aaa +cfN +cfN +cfN +cfN +cfN +cfN +cfN aaa aaa +cfN +cfN +cfN +cfN +cfN +cfN +cfN aaa aaa aaa @@ -85091,54 +85772,54 @@ aaa aaa bIZ csy -bQl -cqX -xNx +bIZ +aht +aaa +aaa +aaa +aaa +cjm ctS -cFB -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +cxD +cjm +cjm +cjm +cjm +cjm +eNc +eNc +ukn +cjm +aht aaa fon -fon -aht -aht -nKo aaa aaa aaa -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC +aaa +aaa +aaa +aaa +aaa +aaa +aaa +cfN +cfN +cfN +aaa +aaa +aaa +aaa +aaa +aaa +cfN +cfN +cfN +cfN +aaa +aaa +aaa +aaa rmC rmC rmC @@ -85350,7 +86031,33 @@ bva bSq bva bva -rnE +aaa +aaa +aaa +aaa +cjm +cjm +cxL +vco +vco +vco +vco +vco +cAD +cjm +cjm +cjm +aht +aaa +fon +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -85370,32 +86077,6 @@ aaa aaa aaa aaa -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC rmC rmC rmC @@ -85606,15 +86287,41 @@ bXa bRD bWl cdE -bIZ -rnE +ckF +aaa +aaa +aaa +aaa +aaa +cjm +cjm +cjm +cjm +cjm +cjm +cjm +cAH +cjm +aht +aht +tRZ +aht +mau +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa -nge -adR -adR -adR aaa aaa aaa @@ -85627,32 +86334,6 @@ aaa aaa aaa aaa -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC rmC rmC rmC @@ -85863,15 +86544,41 @@ bva bva bva bva +ckW bva -ukn bIZ bva bva -aht -aht -aht -aht +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +cAJ +pia +vOw +pia +vOw +pia +nUc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -85884,32 +86591,6 @@ aaa aaa aaa aaa -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC rmC rmC rmC @@ -86133,6 +86814,7 @@ aht adR aaa aaa +cFB aaa aaa aaa @@ -86203,7 +86885,6 @@ rmC rmC rmC rmC -rmC "} (92,1,1) = {" rmC @@ -86390,15 +87071,15 @@ aht nge aaa aaa -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC -rmC +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa rmC rmC rmC @@ -90936,7 +91617,7 @@ aKT aLH aNf aKT -aLL +tCJ aQO aRO aSH @@ -97057,7 +97738,7 @@ aek aek aek aeA -adF +geL afk ael afS @@ -99430,8 +100111,8 @@ aVu bat aLf bcy -qAM -aEj +aKp +kKI aEj bgC bhi @@ -99686,8 +100367,8 @@ aYp aPY bau aLf -aFi -aFi +bHK +aIp beI beI bgD @@ -100457,7 +101138,7 @@ aYs aZk bax aLf -aFi +aMA bdC beI bfx @@ -105810,7 +106491,7 @@ aaa aaa aiT akn -ajv +bFE aaF aaU aaL @@ -106610,7 +107291,7 @@ aFi aJs aFi aFi -aFi +bHI aEj aaa aaa @@ -107142,7 +107823,7 @@ aaa aEl aTx aFi -aFi +aMA aEj bhz lEn @@ -114605,13 +115286,13 @@ abI aby aaa xKc -blX +lCN qAk iPj tfP geN qAk -blX +uzB xKc aaa aby diff --git a/auxmos.dll b/auxmos.dll index 04522e9d44..fc227f62c9 100644 Binary files a/auxmos.dll and b/auxmos.dll differ diff --git a/auxmos.pdb b/auxmos.pdb index 78725799be..a2db349011 100644 Binary files a/auxmos.pdb and b/auxmos.pdb differ diff --git a/code/__DEFINES/_auxtools.dm b/code/__DEFINES/_auxtools.dm new file mode 100644 index 0000000000..ab07becbd9 --- /dev/null +++ b/code/__DEFINES/_auxtools.dm @@ -0,0 +1,9 @@ +#define AUXMOS (world.system_type == MS_WINDOWS ? "auxmos.dll" : __detect_auxmos()) + +/proc/__detect_auxmos() + if (fexists("./libauxmos.so")) + return "./libauxmos.so" + else if (fexists("[world.GetConfig("env", "HOME")]/.byond/bin/libauxmos.so")) + return "[world.GetConfig("env", "HOME")]/.byond/bin/libauxmos.so" + else + CRASH("Could not find libauxmos.so") diff --git a/code/__DEFINES/_extools.dm b/code/__DEFINES/_extools.dm deleted file mode 100644 index 281eabf374..0000000000 --- a/code/__DEFINES/_extools.dm +++ /dev/null @@ -1,2 +0,0 @@ -#define EXTOOLS (world.system_type == MS_WINDOWS ? "byond-extools.dll" : "libbyond-extools.so") -#define AUXMOS (world.system_type == MS_WINDOWS ? "auxmos.dll" : "libauxmos.so") diff --git a/code/__DEFINES/_flags/obj_flags.dm b/code/__DEFINES/_flags/obj_flags.dm index e48146a1d0..ac772c6e8e 100644 --- a/code/__DEFINES/_flags/obj_flags.dm +++ b/code/__DEFINES/_flags/obj_flags.dm @@ -15,6 +15,7 @@ #define BLOCK_Z_IN_UP (1<<12) // Should this object block z uprise from below? #define SHOVABLE_ONTO (1<<13)//called on turf.shove_act() to consider whether an object should have a niche effect (defined in their own shove_act()) when someone is pushed onto it, or do a sanity CanPass() check. #define EXAMINE_SKIP (1<<14) /// Makes the Examine proc not read out this item. +#define IN_STORAGE (1<<15) //is this item in the storage item, such as backpack? used for tooltips /// Integrity defines for clothing (not flags but close enough) #define CLOTHING_PRISTINE 0 // We have no damage on the clothing diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 8fc2dc116b..1c6b7c21d4 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -155,10 +155,10 @@ //LAVALAND #define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 //what pressure you have to be under to increase the effect of equipment meant for lavaland -#define LAVALAND_DEFAULT_ATMOS "o2=14;n2=23;TEMP=300" +#define LAVALAND_DEFAULT_ATMOS "LAVALAND_ATMOS" //SNOSTATION -#define ICEMOON_DEFAULT_ATMOS "o2=17;n2=63;TEMP=180" +#define ICEMOON_DEFAULT_ATMOS "ICEMOON_ATMOS" //ATMOSIA GAS MONITOR TAGS #define ATMOS_GAS_MONITOR_INPUT_O2 "o2_in" @@ -268,6 +268,15 @@ #define GAS_FLAG_DANGEROUS (1<<0) #define GAS_FLAG_BREATH_PROC (1<<1) +//SUPERMATTER DEFINES +#define HEAT_PENALTY "heat penalties" +#define TRANSMIT_MODIFIER "transmit" +#define RADIOACTIVITY_MODIFIER "radioactivity" +#define HEAT_RESISTANCE "heat resistance" +#define POWERLOSS_INHIBITION "powerloss inhibition" +#define ALL_SUPERMATTER_GASES "gases we care about" +#define POWER_MIX "gas powermix" + //HELPERS #define PIPING_LAYER_SHIFT(T, PipingLayer) \ if(T.dir & (NORTH|SOUTH)) { \ diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index 9f45d8da79..db78144689 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -24,6 +24,7 @@ #define COLOR_BEIGE "#CEB689" #define COLOR_BLUE_GRAY "#75A2BB" #define COLOR_BROWN "#BA9F6D" +#define COLOR_SOFT_RED "#FA8282" #define COLOR_DARK_BROWN "#997C4F" #define COLOR_DARK_ORANGE "#C3630C" #define COLOR_GREEN_GRAY "#99BB76" diff --git a/code/__DEFINES/dcs/flags.dm b/code/__DEFINES/dcs/flags.dm index 719a795824..3a6877eeb3 100644 --- a/code/__DEFINES/dcs/flags.dm +++ b/code/__DEFINES/dcs/flags.dm @@ -83,3 +83,19 @@ #define COMBAT_MODE_ACTIVE (1<<1) /// combat mode is not active #define COMBAT_MODE_INACTIVE (1<<2) + +// Update flags for [/atom/proc/update_appearance] +/// Update the atom's name +#define UPDATE_NAME (1<<0) +/// Update the atom's desc +#define UPDATE_DESC (1<<1) +/// Update the atom's icon state +#define UPDATE_ICON_STATE (1<<2) +/// Update the atom's overlays +#define UPDATE_OVERLAYS (1<<3) +/// Update the atom's greyscaling +#define UPDATE_GREYSCALE (1<<4) +/// Update the atom's smoothing. (More accurately, queue it for an update) +#define UPDATE_SMOOTHING (1<<5) +/// Update the atom's icon +#define UPDATE_ICON (UPDATE_ICON_STATE|UPDATE_OVERLAYS) diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 5f8745ca8e..66912fa787 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -74,11 +74,30 @@ #define EXAMINE_POSITION_BEFORE (1<<1) //End positions #define COMPONENT_EXNAME_CHANGED (1<<0) -#define COMSIG_ATOM_UPDATE_ICON "atom_update_icon" //from base of atom/update_icon(): () - #define COMSIG_ATOM_NO_UPDATE_ICON_STATE 1 - #define COMSIG_ATOM_NO_UPDATE_OVERLAYS 2 -#define COMSIG_ATOM_UPDATE_OVERLAYS "atom_update_overlays" //from base of atom/update_overlays(): (list/new_overlays) -#define COMSIG_ATOM_UPDATED_ICON "atom_updated_icon" //from base of atom/update_icon(): (signalOut, did_anything) +///from base of [/atom/proc/update_appearance]: (updates) +#define COMSIG_ATOM_UPDATE_APPEARANCE "atom_update_appearance" + /// If returned from [COMSIG_ATOM_UPDATE_APPEARANCE] it prevents the atom from updating its name. + #define COMSIG_ATOM_NO_UPDATE_NAME UPDATE_NAME + /// If returned from [COMSIG_ATOM_UPDATE_APPEARANCE] it prevents the atom from updating its desc. + #define COMSIG_ATOM_NO_UPDATE_DESC UPDATE_DESC + /// If returned from [COMSIG_ATOM_UPDATE_APPEARANCE] it prevents the atom from updating its icon. + #define COMSIG_ATOM_NO_UPDATE_ICON UPDATE_ICON +///from base of [/atom/proc/update_name]: (updates) +#define COMSIG_ATOM_UPDATE_NAME "atom_update_name" +///from base of [/atom/proc/update_desc]: (updates) +#define COMSIG_ATOM_UPDATE_DESC "atom_update_desc" +///from base of [/atom/update_icon]: () +#define COMSIG_ATOM_UPDATE_ICON "atom_update_icon" + /// If returned from [COMSIG_ATOM_UPDATE_ICON] it prevents the atom from updating its icon state. + #define COMSIG_ATOM_NO_UPDATE_ICON_STATE UPDATE_ICON_STATE + /// If returned from [COMSIG_ATOM_UPDATE_ICON] it prevents the atom from updating its overlays. + #define COMSIG_ATOM_NO_UPDATE_OVERLAYS UPDATE_OVERLAYS +///from base of [atom/update_icon_state]: () +#define COMSIG_ATOM_UPDATE_ICON_STATE "atom_update_icon_state" +///from base of [/atom/update_overlays]: (list/new_overlays) +#define COMSIG_ATOM_UPDATE_OVERLAYS "atom_update_overlays" +///from base of [/atom/update_icon]: (signalOut, did_anything) +#define COMSIG_ATOM_UPDATED_ICON "atom_updated_icon" #define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (atom/movable/entering, /atom) #define COMSIG_ATOM_EXIT "atom_exit" //from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc) #define COMPONENT_ATOM_BLOCK_EXIT 1 @@ -112,8 +131,6 @@ ///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) -#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" ///from base of atom/handle_atom_del(): (atom/deleted) @@ -278,6 +295,32 @@ ///from base of mob/AltClickOn(): (atom/A) #define COMSIG_MOB_ALTCLICKON "mob_altclickon" +// Lighting: +///from base of [atom/proc/set_light]: (l_range, l_power, l_color, l_on) +#define COMSIG_ATOM_SET_LIGHT "atom_set_light" + /// Blocks [/atom/proc/set_light], [/atom/proc/set_light_power], [/atom/proc/set_light_range], [/atom/proc/set_light_color], [/atom/proc/set_light_on], and [/atom/proc/set_light_flags]. + #define COMPONENT_BLOCK_LIGHT_UPDATE (1<<0) +///Called right before the atom changes the value of light_power to a different one, from base [atom/proc/set_light_power]: (new_power) +#define COMSIG_ATOM_SET_LIGHT_POWER "atom_set_light_power" +///Called right after the atom changes the value of light_power to a different one, from base of [/atom/proc/set_light_power]: (old_power) +#define COMSIG_ATOM_UPDATE_LIGHT_POWER "atom_update_light_power" +///Called right before the atom changes the value of light_range to a different one, from base [atom/proc/set_light_range]: (new_range) +#define COMSIG_ATOM_SET_LIGHT_RANGE "atom_set_light_range" +///Called right after the atom changes the value of light_range to a different one, from base of [/atom/proc/set_light_range]: (old_range) +#define COMSIG_ATOM_UPDATE_LIGHT_RANGE "atom_update_light_range" +///Called right before the atom changes the value of light_color to a different one, from base [atom/proc/set_light_color]: (new_color) +#define COMSIG_ATOM_SET_LIGHT_COLOR "atom_set_light_color" +///Called right after the atom changes the value of light_color to a different one, from base of [/atom/proc/set_light_color]: (old_color) +#define COMSIG_ATOM_UPDATE_LIGHT_COLOR "atom_update_light_color" +///Called right before the atom changes the value of light_on to a different one, from base [atom/proc/set_light_on]: (new_value) +#define COMSIG_ATOM_SET_LIGHT_ON "atom_set_light_on" +///Called right after the atom changes the value of light_on to a different one, from base of [/atom/proc/set_light_on]: (old_value) +#define COMSIG_ATOM_UPDATE_LIGHT_ON "atom_update_light_on" +///Called right before the atom changes the value of light_flags to a different one, from base [atom/proc/set_light_flags]: (new_flags) +#define COMSIG_ATOM_SET_LIGHT_FLAGS "atom_set_light_flags" +///Called right after the atom changes the value of light_flags to a different one, from base of [/atom/proc/set_light_flags]: (old_flags) +#define COMSIG_ATOM_UPDATE_LIGHT_FLAGS "atom_update_light_flags" + // /client signals #define COMSIG_MOB_CLIENT_LOGIN "mob_client_login" //sent when a mob/login() finishes: (client) #define COMSIG_MOB_CLIENT_LOGOUT "mob_client_logout" //sent when a mob/logout() starts: (client) @@ -361,6 +404,12 @@ // /machinery signals #define COMSIG_MACHINE_EJECT_OCCUPANT "eject_occupant" //from base of obj/machinery/dropContents() (occupant) +///from base power_change() when power is lost +#define COMSIG_MACHINERY_POWER_LOST "machinery_power_lost" +///from base power_change() when power is restored +#define COMSIG_MACHINERY_POWER_RESTORED "machinery_power_restored" +///from /obj/machinery/obj_break(damage_flag): (damage_flag) +#define COMSIG_MACHINERY_BROKEN "machinery_broken" // /obj/item signals #define COMSIG_ITEM_ATTACK "item_attack" //from base of obj/item/attack(): (/mob/living/target, /mob/living/user) @@ -388,8 +437,9 @@ #define COMPONENT_BLOCK_SHARPEN_BLOCKED 2 #define COMPONENT_BLOCK_SHARPEN_ALREADY 4 #define COMPONENT_BLOCK_SHARPEN_MAXED 8 -#define COMSIG_ITEM_MICROWAVE_ACT "microwave_act" //called on item when microwaved (): (obj/machinery/microwave/M) +#define COMSIG_ITEM_MICROWAVE_ACT "microwave_act" //called on item when microwaved (): (obj/machinery/microwave/M) #define COMSIG_ITEM_WORN_OVERLAYS "item_worn_overlays" //from base of obj/item/worn_overlays(): (isinhands, icon_file, used_state, style_flags, list/overlays) +#define COMSIG_ARMOR_PLATED "armor_plated" //called when an armor plate is successfully applied to an object // THE FOLLOWING TWO BLOCKS SHOULD RETURN BLOCK FLAGS AS DEFINED IN __DEFINES/combat.dm! #define COMSIG_ITEM_CHECK_BLOCK "check_block" //from base of obj/item/check_block(): (mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) #define COMSIG_ITEM_RUN_BLOCK "run_block" //from base of obj/item/run_block(): (mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) diff --git a/code/__DEFINES/footsteps.dm b/code/__DEFINES/footsteps.dm index 215e287adf..cc0c6547b0 100644 --- a/code/__DEFINES/footsteps.dm +++ b/code/__DEFINES/footsteps.dm @@ -8,6 +8,7 @@ #define FOOTSTEP_LAVA "lava" #define FOOTSTEP_MEAT "meat" #define FOOTSTEP_RUST "rust" +#define FOOTSTEP_CATWALK "catwalk" //barefoot sounds #define FOOTSTEP_WOOD_BAREFOOT "woodbarefoot" @@ -94,6 +95,12 @@ GLOBAL_LIST_INIT(footstep, list( 'sound/effects/footstep/lava3.ogg'), 100, 0), FOOTSTEP_MEAT = list(list( 'sound/effects/meatslap.ogg'), 100, 0), + FOOTSTEP_CATWALK = list(list( + 'sound/effects/footstep/catwalk1.ogg', + 'sound/effects/footstep/catwalk2.ogg', + 'sound/effects/footstep/catwalk3.ogg', + 'sound/effects/footstep/catwalk4.ogg', + 'sound/effects/footstep/catwalk5.ogg'), 100, 1), FOOTSTEP_RUST = list(list( 'sound/effects/footstep/rustystep1.ogg'), 100, 0) )) diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index 35348df3d1..d4ab59cbc1 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -42,6 +42,7 @@ #define CLOWN (1<<11) #define MIME (1<<12) #define ASSISTANT (1<<13) +#define PRISONER (1<<14) #define JOB_AVAILABLE 0 #define JOB_UNAVAILABLE_GENERIC 1 @@ -89,3 +90,4 @@ #define JOB_DISPLAY_ORDER_WARDEN 31 #define JOB_DISPLAY_ORDER_DETECTIVE 32 #define JOB_DISPLAY_ORDER_SECURITY_OFFICER 33 +#define JOB_DISPLAY_ORDER_PRISONER 34 diff --git a/code/__DEFINES/layers_planes.dm b/code/__DEFINES/layers_planes.dm index 37584d892d..c7be89721e 100644 --- a/code/__DEFINES/layers_planes.dm +++ b/code/__DEFINES/layers_planes.dm @@ -64,8 +64,9 @@ #define GAS_PIPE_VISIBLE_LAYER 2.47 #define GAS_FILTER_LAYER 2.48 #define GAS_PUMP_LAYER 2.49 - #define LOW_OBJ_LAYER 2.5 +///catwalk overlay of /turf/open/floor/plating/plating_catwalk +#define CATWALK_LAYER 2.51 #define LOW_SIGIL_LAYER 2.52 #define SIGIL_LAYER 2.54 #define HIGH_SIGIL_LAYER 2.56 @@ -124,16 +125,20 @@ #define EMISSIVE_PLANE 13 #define EMISSIVE_LAYER 13 -#define EMISSIVE_RENDER_TARGET "*EMISSIVE_PLANE" #define EMISSIVE_UNBLOCKABLE_PLANE 14 #define EMISSIVE_UNBLOCKABLE_LAYER 14 +#define EMISSIVE_LAYER_UNBLOCKABLE 14 #define EMISSIVE_UNBLOCKABLE_RENDER_TARGET "*EMISSIVE_UNBLOCKABLE_PLANE" +#define EMISSIVE_RENDER_TARGET "*EMISSIVE_PLANE" #define LIGHTING_PLANE 15 #define LIGHTING_LAYER 15 #define LIGHTING_RENDER_TARGET "LIGHT_PLANE" +#define O_LIGHTING_VISUAL_PLANE 110 +#define O_LIGHTING_VISUAL_RENDER_TARGET "O_LIGHT_VISUAL_PLANE" + #define RAD_TEXT_LAYER 15.1 #define ABOVE_LIGHTING_PLANE 16 diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index 3fba27ba52..95d91da14a 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -84,11 +84,24 @@ #define FLASH_LIGHT_POWER 3 #define FLASH_LIGHT_RANGE 3.8 +// Emissive blocking. /// Uses vis_overlays to leverage caching so that very few new items need to be made for the overlay. For anything that doesn't change outline or opaque area much or at all. #define EMISSIVE_BLOCK_GENERIC 1 /// Uses a dedicated render_target object to copy the entire appearance in real time to the blocking layer. For things that can change in appearance a lot from the base state, like humans. #define EMISSIVE_BLOCK_UNIQUE 2 +/// The color matrix applied to all emissive overlays. Should be solely dependent on alpha and not have RGB overlap with [EM_BLOCK_COLOR]. +#define EMISSIVE_COLOR list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 1,1,1,0) +/// A globaly cached version of [EMISSIVE_COLOR] for quick access. +GLOBAL_LIST_INIT(emissive_color, EMISSIVE_COLOR) +/// The color matrix applied to all emissive blockers. Should be solely dependent on alpha and not have RGB overlap with [EMISSIVE_COLOR]. +#define EM_BLOCK_COLOR list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) +/// A globaly cached version of [EM_BLOCK_COLOR] for quick access. +GLOBAL_LIST_INIT(em_block_color, EM_BLOCK_COLOR) +/// The color matrix used to mask out emissive blockers on the emissive plane. Alpha should default to zero, be solely dependent on the RGB value of [EMISSIVE_COLOR], and be independant of the RGB value of [EM_BLOCK_COLOR]. +#define EM_MASK_MATRIX list(0,0,0,1/3, 0,0,0,1/3, 0,0,0,1/3, 0,0,0,0, 1,1,1,0) +/// A globaly cached version of [EM_MASK_MATRIX] for quick access. +GLOBAL_LIST_INIT(em_mask_matrix, EM_MASK_MATRIX) /// Returns the red part of a #RRGGBB hex sequence as number #define GETREDPART(hexa) hex2num(copytext(hexa, 2, 4)) diff --git a/code/__DEFINES/loadout.dm b/code/__DEFINES/loadout.dm index c900a33d06..f9b4c36c9c 100644 --- a/code/__DEFINES/loadout.dm +++ b/code/__DEFINES/loadout.dm @@ -59,7 +59,7 @@ #define LOADOUT_CATEGORY_UNLOCKABLE "Unlockable" //how many prosthetics can we have -#define MAXIMUM_LOADOUT_PROSTHETICS 2 +#define MAXIMUM_LOADOUT_PROSTHETICS 4 //what limbs can be amputated or be prosthetic #define LOADOUT_ALLOWED_LIMB_TARGETS list(BODY_ZONE_L_ARM,BODY_ZONE_R_ARM,BODY_ZONE_L_LEG,BODY_ZONE_R_LEG) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 850a2b0f39..6a63ced634 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -347,3 +347,7 @@ // / Breathing types. Lungs can access either by these or by a string, which will be considered a gas ID. #define BREATH_OXY /datum/breathing_class/oxygen #define BREATH_PLASMA /datum/breathing_class/plasma + +//Gremlins +#define NPC_TAMPER_ACT_FORGET 1 //Don't try to tamper with this again +#define NPC_TAMPER_ACT_NOMSG 2 //Don't produce a visible message diff --git a/code/__DEFINES/power.dm b/code/__DEFINES/power.dm index 78d942d78b..8cd3e7d525 100644 --- a/code/__DEFINES/power.dm +++ b/code/__DEFINES/power.dm @@ -1,3 +1,8 @@ #define SOLAR_TRACK_OFF 0 #define SOLAR_TRACK_TIMED 1 #define SOLAR_TRACK_AUTO 2 + +///conversion ratio from joules to watts +#define WATTS / 0.002 +///conversion ratio from watts to joules +#define JOULES * 0.002 diff --git a/code/__DEFINES/qdel.dm b/code/__DEFINES/qdel.dm index 63259774fa..32e0025ab2 100644 --- a/code/__DEFINES/qdel.dm +++ b/code/__DEFINES/qdel.dm @@ -1,30 +1,44 @@ -//defines that give qdel hints. these can be given as a return in destory() or by calling +//! Defines that give qdel hints. +//! +//! These can be given as a return in [/atom/proc/Destroy] or by calling [/proc/qdel]. + +/// `qdel` should queue the object for deletion. +#define QDEL_HINT_QUEUE 0 +/// `qdel` should let the object live after calling [/atom/proc/Destroy]. +#define QDEL_HINT_LETMELIVE 1 +/// Functionally the same as the above. `qdel` should assume the object will gc on its own, and not check it. +#define QDEL_HINT_IWILLGC 2 +/// Qdel should assume this object won't GC, and queue a hard delete using a hard reference. +#define QDEL_HINT_HARDDEL 3 +// Qdel should assume this object won't gc, and hard delete it posthaste. +#define QDEL_HINT_HARDDEL_NOW 4 -#define QDEL_HINT_QUEUE 0 //qdel should queue the object for deletion. -#define QDEL_HINT_LETMELIVE 1 //qdel should let the object live after calling destory. -#define QDEL_HINT_IWILLGC 2 //functionally the same as the above. qdel should assume the object will gc on its own, and not check it. -#define QDEL_HINT_HARDDEL 3 //qdel should assume this object won't gc, and queue a hard delete using a hard reference. -#define QDEL_HINT_HARDDEL_NOW 4 //qdel should assume this object won't gc, and hard del it post haste. - -#ifdef LEGACY_REFERENCE_TRACKING -/** If LEGACY_REFERENCE_TRACKING is enabled, qdel will call this object's find_references() verb. - * - * Functionally identical to QDEL_HINT_QUEUE if GC_FAILURE_HARD_LOOKUP is not enabled in _compiler_options.dm. +#ifdef REFERENCE_TRACKING +/** If REFERENCE_TRACKING is enabled, qdel will call this object's find_references() verb. + * + * Functionally identical to [QDEL_HINT_QUEUE] if [GC_FAILURE_HARD_LOOKUP] is not enabled in _compiler_options.dm. */ -#define QDEL_HINT_FINDREFERENCE 5 -/// Behavior as QDEL_HINT_FINDREFERENCE, but only if the GC fails and a hard delete is forced. +#define QDEL_HINT_FINDREFERENCE 5 +/// Behavior as [QDEL_HINT_FINDREFERENCE], but only if the GC fails and a hard delete is forced. #define QDEL_HINT_IFFAIL_FINDREFERENCE 6 #endif - #define GC_QUEUE_CHECK 1 #define GC_QUEUE_HARDDELETE 2 #define GC_QUEUE_COUNT 2 //increase this when adding more steps. +#define QDEL_ITEM_ADMINS_WARNED (1<<0) //! Set when admins are told about lag causing qdels in this type. +#define QDEL_ITEM_SUSPENDED_FOR_LAG (1<<1) //! Set when a type can no longer be hard deleted on failure because of lag it causes while this happens. + +// Defines for the [gc_destroyed][/datum/var/gc_destroyed] var. #define GC_QUEUED_FOR_QUEUING -1 #define GC_CURRENTLY_BEING_QDELETED -2 +// Defines for the time left for an item to get its reference cleaned +#define GC_FILTER_QUEUE 5 MINUTES +#define GC_DEL_QUEUE 10 SECONDS + #define QDELING(X) (X.gc_destroyed) #define QDELETED(X) (!X || QDELING(X)) #define QDESTROYING(X) (!X || X.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index 44e97ef345..8864e41ae9 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -76,3 +76,8 @@ //Chemical reaction flags, for determining reaction specialties #define REACTION_CLEAR_IMPURE (1<<0) //Convert into impure/pure on reaction completion #define REACTION_CLEAR_INVERSE (1<<1) //Convert into inverse on reaction completion when purity is low enough + +//Chemical blacklists for smartdarts +GLOBAL_LIST_INIT(blacklisted_medchems, list( + /datum/reagent/medicine/morphine, /datum/reagent/medicine/haloperidol, //harmful chemicals in medicine + )) diff --git a/code/__DEFINES/rust_g.dm b/code/__DEFINES/rust_g.dm index 988acd3dae..0da05e7c1d 100644 --- a/code/__DEFINES/rust_g.dm +++ b/code/__DEFINES/rust_g.dm @@ -38,6 +38,9 @@ #define RUST_G (__rust_g || __detect_rust_g()) #endif +/// Gets the version of rust_g +/proc/rustg_get_version() return call(RUST_G, "get_version")() + /** * This proc generates a cellular automata noise grid which can be used in procedural generation methods. * @@ -77,8 +80,8 @@ #define RUSTG_HTTP_METHOD_PATCH "patch" #define RUSTG_HTTP_METHOD_HEAD "head" #define RUSTG_HTTP_METHOD_POST "post" -#define rustg_http_request_blocking(method, url, body, headers) call(RUST_G, "http_request_blocking")(method, url, body, headers) -#define rustg_http_request_async(method, url, body, headers) call(RUST_G, "http_request_async")(method, url, body, headers) +#define rustg_http_request_blocking(method, url, body, headers, options) call(RUST_G, "http_request_blocking")(method, url, body, headers, options) +#define rustg_http_request_async(method, url, body, headers, options) call(RUST_G, "http_request_async")(method, url, body, headers, options) #define rustg_http_check_request(req_id) call(RUST_G, "http_check_request")(req_id) #define RUSTG_JOB_NO_RESULTS_YET "NO RESULTS YET" @@ -99,3 +102,11 @@ #define rustg_sql_disconnect_pool(handle) call(RUST_G, "sql_disconnect_pool")(handle) #define rustg_sql_check_query(job_id) call(RUST_G, "sql_check_query")("[job_id]") +#define rustg_url_encode(text) call(RUST_G, "url_encode")(text) +#define rustg_url_decode(text) call(RUST_G, "url_decode")(text) + +#ifdef RUSTG_OVERRIDE_BUILTINS + #define url_encode(text) rustg_url_encode(text) + #define url_decode(text) rustg_url_decode(text) +#endif + diff --git a/code/__DEFINES/rust_g_overrides.dm b/code/__DEFINES/rust_g_overrides.dm new file mode 100644 index 0000000000..57de7d96ac --- /dev/null +++ b/code/__DEFINES/rust_g_overrides.dm @@ -0,0 +1,3 @@ +// RUSTG_OVERRIDE_BUILTINS is not used since the file APIs don't work well over Linux. +#define url_encode(text) rustg_url_encode("[text]") +#define url_decode(text) rustg_url_decode("[text]") diff --git a/code/__DEFINES/spans.dm b/code/__DEFINES/spans.dm new file mode 100644 index 0000000000..45eae3ce76 --- /dev/null +++ b/code/__DEFINES/spans.dm @@ -0,0 +1,114 @@ +// Sorted alphabetically +#define span_abductor(str) ("" + str + "") +#define span_admin(str) ("" + str + "") +#define span_adminhelp(str) ("" + str + "") +#define span_adminnotice(str) ("" + str + "") +#define span_adminobserverooc(str) ("" + str + "") +#define span_adminooc(str) ("" + str + "") +#define span_adminsay(str) ("" + str + "") +#define span_aiprivradio(str) ("" + str + "") +#define span_alert(str) ("" + str + "") +#define span_alertalien(str) ("" + str + "") +#define span_alertsyndie(str) ("" + str + "") +#define span_alertwarning(str) ("" + str + "") +#define span_alien(str) ("" + str + "") +#define span_announce(str) ("" + str + "") +#define span_big(str) ("" + str + "") +#define span_bigicon(str) ("" + str + "") +#define span_binarysay(str) ("" + str + "") +#define span_blue(str) ("" + str + "") +#define span_blueteamradio(str) ("" + str + "") +#define span_bold(str) ("" + str + "") +#define span_boldannounce(str) ("" + str + "") +#define span_boldnotice(str) ("" + str + "") +#define span_boldwarning(str) ("" + str + "") +#define span_centcomradio(str) ("" + str + "") +#define span_changeling(str) ("" + str + "") +#define span_clown(str) ("" + str + "") +#define span_colossus(str) ("" + str + "") +#define span_command_headset(str) ("" + str + "") +#define span_comradio(str) ("" + str + "") +#define span_cult(str) ("" + str + "") +#define span_cultbold(str) ("" + str + "") +#define span_cultboldtalic(str) ("" + str + "") +#define span_cultitalic(str) ("" + str + "") +#define span_cultlarge(str) ("" + str + "") +#define span_danger(str) ("" + str + "") +#define span_deadsay(str) ("" + str + "") +#define span_deconversion_message(str) ("" + str + "") +#define span_drone(str) ("" + str + "") +#define span_engradio(str) ("" + str + "") +#define span_extremelybig(str) ("" + str + "") +#define span_ghostalert(str) ("" + str + "") +#define span_green(str) ("" + str + "") +#define span_greenannounce(str) ("" + str + "") +#define span_greenteamradio(str) ("" + str + "") +#define span_greentext(str) ("" + str + "") +#define span_hear(str) ("" + str + "") +#define span_hidden(str) ("") +#define span_hierophant(str) ("" + str + "") +#define span_hierophant_warning(str) ("" + str + "") +#define span_highlight(str) ("" + str + "") +#define span_his_grace(str) ("" + str + "") +#define span_holoparasite(str) ("" + str + "") +#define span_hypnophrase(str) ("" + str + "") +#define span_icon(str) ("" + str + "") +#define span_info(str) ("" + str + "") +#define span_interface(str) ("" + str + "") +#define span_looc(str) ("" + str + "") +#define span_medal(str) ("" + str + "") +#define span_medradio(str) ("" + str + "") +#define span_memo(str) ("" + str + "") +#define span_memoedit(str) ("" + str + "") +#define span_mind_control(str) ("" + str + "") +#define span_minorannounce(str) ("" + str + "") +#define span_monkey(str) ("" + str + "") +#define span_monkeyhive(str) ("" + str + "") +#define span_monkeylead(str) ("" + str + "") +#define span_name(str) ("" + str + "") +#define span_narsie(str) ("" + str + "") +#define span_narsiesmall(str) ("" + str + "") +#define span_nicegreen(str) ("" + str + "") +#define span_notice(str) ("" + str + "") +#define span_noticealien(str) ("" + str + "") +#define span_ooc(str) ("" + str + "") +#define span_papyrus(str) ("" + str + "") +#define span_phobia(str) ("" + str + "") +#define span_prefix(str) ("" + str + "") +#define span_purple(str) ("" + str + "") +#define span_radio(str) ("" + str + "") +#define span_reallybig(str) ("" + str + "") +#define span_red(str) ("" + str + "") +#define span_redteamradio(str) ("" + str + "") +#define span_redtext(str) ("" + str + "") +#define span_resonate(str) ("" + str + "") +#define span_revenbignotice(str) ("" + str + "") +#define span_revenboldnotice(str) ("" + str + "") +#define span_revendanger(str) ("" + str + "") +#define span_revenminor(str) ("" + str + "") +#define span_revennotice(str) ("" + str + "") +#define span_revenwarning(str) ("" + str + "") +#define span_robot(str) ("" + str + "") +#define span_rose(str) ("" + str + "") +#define span_sans(str) ("" + str + "") +#define span_sciradio(str) ("" + str + "") +#define span_secradio(str) ("" + str + "") +#define span_servradio(str) ("" + str + "") +#define span_singing(str) ("" + str + "") +#define span_slime(str) ("" + str + "") +#define span_small(str) ("" + str + "") +#define span_smallnotice(str) ("" + str + "") +#define span_smallnoticeital(str) ("" + str + "") +#define span_spider(str) ("" + str + "") +#define span_suicide(str) ("" + str + "") +#define span_suppradio(str) ("" + str + "") +#define span_swarmer(str) ("" + str + "") +#define span_syndradio(str) ("" + str + "") +#define span_tape_recorder(str) ("" + str + "") +#define span_tinynotice(str) ("" + str + "") +#define span_tinynoticeital(str) ("" + str + "") +#define span_unconscious(str) ("" + str + "") +#define span_userdanger(str) ("" + str + "") +#define span_warning(str) ("" + str + "") +#define span_yell(str) ("" + str + "") +#define span_yellowteamradio(str) ("" + str + "") diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index fb0ec3d39c..30899c0ca2 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -215,6 +215,12 @@ #define SSAIR_ATMOSMACHINERY_AIR 12 #define SSAIR_DEFERRED_AIRS 13 +// Subsystem delta times or tickrates, in seconds. I.e, how many seconds in between each process() call for objects being processed by that subsystem. +// Only use these defines if you want to access some other objects processing delta_time, otherwise use the delta_time that is sent as a parameter to process() +#define SSFLUIDS_DT (SSfluids.wait/10) +#define SSMACHINES_DT (SSmachines.wait/10) +#define SSMOBS_DT (SSmobs.wait/10) +#define SSOBJ_DT (SSobj.wait/10) //! ## Overlays subsystem diff --git a/code/__DEFINES/time.dm b/code/__DEFINES/time.dm index 01990ddc17..252fe0910e 100644 --- a/code/__DEFINES/time.dm +++ b/code/__DEFINES/time.dm @@ -49,10 +49,16 @@ When using time2text(), please use "DDD" to find the weekday. Refrain from using #define TICKS *world.tick_lag +#define MILLISECONDS * 0.01 + #define DS2TICKS(DS) ((DS)/world.tick_lag) #define TICKS2DS(T) ((T) TICKS) +#define MS2DS(T) ((T) MILLISECONDS) + +#define DS2MS(T) ((T) * 100) + #define GAMETIMESTAMP(format, wtime) time2text(wtime, format) #define WORLDTIME2TEXT(format) GAMETIMESTAMP(format, world.time) #define WORLDTIMEOFDAY2TEXT(format) GAMETIMESTAMP(format, world.timeofday) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index eb9bdccc22..665c0340a4 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -343,3 +343,9 @@ #define STICKY_NODROP "sticky-nodrop" //sticky nodrop sounds like a bad soundcloud rapper's name #define TRAIT_SACRIFICED "sacrificed" //Makes sure that people cant be cult sacrificed twice. #define TRAIT_SPACEWALK "spacewalk" + + +/// obtained from mapping helper +#define MAPPING_HELPER_TRAIT "mapping-helper" +/// Trait associated with mafia +#define MAFIA_TRAIT "mafia" diff --git a/code/__HELPERS/_extools_api.dm b/code/__HELPERS/_extools_api.dm index 8605c6a975..7bff3f06c0 100644 --- a/code/__HELPERS/_extools_api.dm +++ b/code/__HELPERS/_extools_api.dm @@ -10,12 +10,16 @@ GLOBAL_LIST_EMPTY(auxtools_initialized) #define AUXTOOLS_CHECK(LIB)\ - if (!GLOB.auxtools_initialized[LIB] && fexists(LIB)) {\ - var/string = call(LIB,"auxtools_init")();\ - if(findtext(string, "SUCCESS")) {\ - GLOB.auxtools_initialized[LIB] = TRUE;\ + if (!GLOB.auxtools_initialized[LIB]) {\ + if (fexists(LIB)) {\ + var/string = call(LIB,"auxtools_init")();\ + if(findtext(string, "SUCCESS")) {\ + GLOB.auxtools_initialized[LIB] = TRUE;\ + } else {\ + CRASH(string);\ + }\ } else {\ - CRASH(string);\ + CRASH("No file named [LIB] found!")\ }\ }\ diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 8464e373d5..d61adf4337 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -1,9 +1,12 @@ //wrapper macros for easier grepping #define DIRECT_OUTPUT(A, B) A << B +#define DIRECT_INPUT(A, B) A >> B #define SEND_IMAGE(target, image) DIRECT_OUTPUT(target, image) #define SEND_SOUND(target, sound) DIRECT_OUTPUT(target, sound) #define SEND_TEXT(target, text) DIRECT_OUTPUT(target, text) #define WRITE_FILE(file, text) DIRECT_OUTPUT(file, text) +#define READ_FILE(file, text) DIRECT_INPUT(file, text) + #ifdef EXTOOLS_LOGGING // proc hooked, so we can just put in standard TRUE and FALSE #define WRITE_LOG(log, text) extools_log_write(log,text,TRUE) @@ -13,6 +16,7 @@ #define WRITE_LOG(log, text) rustg_log_write(log, text, "true") #define WRITE_LOG_NO_FORMAT(log, text) rustg_log_write(log, text, "false") #endif + //print a warning message to world.log #define WARNING(MSG) warning("[MSG] in [__FILE__] at line [__LINE__] src: [UNLINT(src)] usr: [usr].") /proc/warning(msg) @@ -38,6 +42,12 @@ SEND_TEXT(world.log, text) #endif +#ifdef REFERENCE_TRACKING_LOG +#define log_reftracker(msg) log_world("## REF SEARCH [msg]") +#else +#define log_reftracker(msg) +#endif + /* Items with ADMINPRIVATE prefixed are stripped from public logs. */ /proc/log_admin(text) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 745b12e84f..e55faab1be 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -395,7 +395,7 @@ /proc/ScreenText(obj/O, maptext="", screen_loc="CENTER-7,CENTER-7", maptext_height=480, maptext_width=480) if(!isobj(O)) - O = new /obj/screen/text() + O = new /atom/movable/screen/text() O.maptext = maptext O.maptext_height = maptext_height O.maptext_width = maptext_width diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 0a17f0d1df..19aac1aee0 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -78,6 +78,12 @@ var/datum/emote/E = new path() E.emote_list[E.key] = E + // Hair Gradients - Initialise all /datum/sprite_accessory/hair_gradient into an list indexed by gradient-style name + for(var/path in subtypesof(/datum/sprite_accessory/hair_gradient)) + var/datum/sprite_accessory/hair_gradient/H = new path() + GLOB.hair_gradients_list[H.name] = H + + // Keybindings init_keybindings() //Uplink Items diff --git a/code/__HELPERS/lighting.dm b/code/__HELPERS/lighting.dm new file mode 100644 index 0000000000..685958b015 --- /dev/null +++ b/code/__HELPERS/lighting.dm @@ -0,0 +1,5 @@ +/// Produces a mutable appearance glued to the [EMISSIVE_PLANE] dyed to be the [EMISSIVE_COLOR]. +/proc/emissive_appearance(icon, icon_state = "", layer = FLOAT_LAYER, alpha = 255, appearance_flags = NONE) + var/mutable_appearance/appearance = mutable_appearance(icon, icon_state, layer, EMISSIVE_PLANE, alpha, appearance_flags) + appearance.color = GLOB.emissive_color + return appearance diff --git a/code/__HELPERS/markov.dm b/code/__HELPERS/markov.dm new file mode 100644 index 0000000000..7e195f8b9c --- /dev/null +++ b/code/__HELPERS/markov.dm @@ -0,0 +1,61 @@ +#define MAXIMUM_MARKOV_LENGTH 25000 + +/proc/markov_chain(var/text, var/order = 4, var/length = 250) + if(!text || order < 0 || order > 20 || length < 1 || length > MAXIMUM_MARKOV_LENGTH) + return + + var/table = markov_table(text, order) + var/markov = markov_text(length, table, order) + return markov + +/proc/markov_table(var/text, var/look_forward = 4) + if(!text) + return + var/list/table = list() + + for(var/i = 1, i <= length(text), i++) + var/char = copytext(text, i, look_forward+i) + if(!table[char]) + table[char] = list() + + for(var/i = 1, i <= (length(text) - look_forward), i++) + var/char_index = copytext(text, i, look_forward+i) + var/char_count = copytext(text, i+look_forward, (look_forward*2)+i) + + if(table[char_index][char_count]) + table[char_index][char_count]++ + else + table[char_index][char_count] = 1 + + return table + +/proc/markov_text(var/length = 250, var/table, var/look_forward = 4) + if(!table) + return + var/char = pick(table) + var/o = char + + for(var/i = 0, i <= (length / look_forward), i++) + var/newchar = markov_weighted_char(table[char]) + + if(newchar) + char = newchar + o += "[newchar]" + else + char = pick(table) + + return o + +/proc/markov_weighted_char(var/list/array) + if(!array || !array.len) + return + + var/total = 0 + for(var/i in array) + total += array[i] + var/r = rand(1, total) + for(var/i in array) + var/weight = array[i] + if(r <= weight) + return i + r -= weight diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 2c13f30707..9a59b2b0a9 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -218,20 +218,14 @@ to_chat(world, "


The round has ended.") log_game("The round has ended.") - if(LAZYLEN(GLOB.round_end_notifiees)) - world.TgsTargetedChatBroadcast("[GLOB.round_end_notifiees.Join(", ")] the round has ended.", FALSE) + + CONFIG_SET(flag/suicide_allowed,TRUE) // EORG suicides allowed for(var/I in round_end_events) var/datum/callback/cb = I cb.InvokeAsync() LAZYCLEARLIST(round_end_events) - for(var/client/C in GLOB.clients) - if(!C.credits) - C.RollCredits() - C.playtitlemusic(40) - CONFIG_SET(flag/suicide_allowed,TRUE) // EORG suicides allowed - var/speed_round = FALSE if(world.time - SSticker.round_start_time <= 300 SECONDS) speed_round = TRUE @@ -264,12 +258,15 @@ send2adminchat("Server", "A round of [mode.name] just ended[mode_result == "undefined" ? "." : " with a [mode_result]."] Survival rate: [survival_rate]") + if(LAZYLEN(GLOB.round_end_notifiees)) + world.TgsTargetedChatBroadcast("[GLOB.round_end_notifiees.Join(", ")] the round has ended.", FALSE) + if(length(CONFIG_GET(keyed_list/cross_server))) send_news_report() //tell the nice people on discord what went on before the salt cannon happens. world.TgsTargetedChatBroadcast("The current round has ended. Please standby for your shift interlude Nanotrasen News Network's report!", FALSE) - world.TgsTargetedChatBroadcast(send_news_report(),FALSE) + world.TgsTargetedChatBroadcast(send_news_report(), FALSE) CHECK_TICK @@ -543,21 +540,24 @@ ///Generate a report for how much money is on station, as well as the richest crewmember on the station. /datum/controller/subsystem/ticker/proc/market_report() var/list/parts = list() - parts += "Station Economic Summary:" + ///This is the richest account on station at roundend. var/datum/bank_account/mr_moneybags ///This is the station's total wealth at the end of the round. var/station_vault = 0 ///How many players joined the round. var/total_players = GLOB.joined_player_list.len - var/list/typecache_bank = typecacheof(list(/datum/bank_account/department, /datum/bank_account/remote)) - for(var/datum/bank_account/current_acc in SSeconomy.generated_accounts) + var/static/list/typecache_bank = typecacheof(list(/datum/bank_account/department, /datum/bank_account/remote)) + for(var/i in SSeconomy.generated_accounts) + var/datum/bank_account/current_acc = SSeconomy.generated_accounts[i] if(typecache_bank[current_acc.type]) continue station_vault += current_acc.account_balance if(!mr_moneybags || mr_moneybags.account_balance < current_acc.account_balance) mr_moneybags = current_acc - parts += "
There were [station_vault] credits collected by crew this shift.
" + parts += "
Station Economic Summary:
" + parts += "General Statistics:
" + parts += "There were [station_vault] credits collected by crew this shift.
" if(total_players > 0) parts += "An average of [station_vault/total_players] credits were collected.
" // log_econ("Roundend credit total: [station_vault] credits. Average Credits: [station_vault/total_players]") diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 12430df500..9fee97bbb1 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -163,6 +163,7 @@ Turf and target are separate in case you want to teleport some distance from a t //Generalised helper proc for letting mobs rename themselves. Used to be clname() and ainame() /mob/proc/apply_pref_name(role, client/C) + set waitfor = FALSE if(!C) C = client var/oldname = real_name diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 64b4129024..1aca8959c2 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -1,7 +1,7 @@ -//#define TESTING //By using the testing("message") proc you can create debug-feedback for people with this +//#define TESTING //By using the testing("message") proc you can create debug-feedback for people with this //uncommented, but not visible in the release version) -//#define DATUMVAR_DEBUGGING_MODE //Enables the ability to cache datum vars and retrieve later for debugging which vars changed. +//#define DATUMVAR_DEBUGGING_MODE //Enables the ability to cache datum vars and retrieve later for debugging which vars changed. // Comment this out if you are debugging problems that might be obscured by custom error handling in world/Error #ifdef DEBUG @@ -11,34 +11,44 @@ #ifdef TESTING #define DATUMVAR_DEBUGGING_MODE -/* -* Enables extools-powered reference tracking system, letting you see what is referencing objects that refuse to hard delete. -* -* * Requires TESTING to be defined to work. -*/ +///Used to find the sources of harddels, quite laggy, don't be surpised if it freezes your client for a good while //#define REFERENCE_TRACKING +#ifdef REFERENCE_TRACKING -///Method of tracking references without using extools. Slower, kept to avoid over-reliance on extools. -//#define LEGACY_REFERENCE_TRACKING -#ifdef LEGACY_REFERENCE_TRACKING +///alternate to reftracking, extool variant +//#define EXTOOLS_REFERENCE_TRACKING -///Use the legacy reference on things hard deleting by default. +///Should we be logging our findings or not +#define REFERENCE_TRACKING_LOG + +///Used for doing dry runs of the reference finder, to test for feature completeness +//#define REFERENCE_TRACKING_DEBUG + +///Run a lookup on things hard deleting by default. //#define GC_FAILURE_HARD_LOOKUP #ifdef GC_FAILURE_HARD_LOOKUP #define FIND_REF_NO_CHECK_TICK #endif //ifdef GC_FAILURE_HARD_LOOKUP -#endif //ifdef LEGACY_REFERENCE_TRACKING +#endif //ifdef REFERENCE_TRACKING -//#define VISUALIZE_ACTIVE_TURFS //Highlights atmos active turfs in green +/* +* Enables debug messages for every single reaction step. This is 1 message per 0.5s for a SINGLE reaction. Useful for tracking down bugs/asking me for help in the main reaction handiler (equilibrium.dm). +* +* * Requires TESTING to be defined to work. +*/ +//#define REAGENTS_TESTING +// #define VISUALIZE_ACTIVE_TURFS //Highlights atmos active turfs in green +// #define TRACK_MAX_SHARE //Allows max share tracking, for use in the atmos debugging ui #endif //ifdef TESTING -//#define UNIT_TESTS //Enables unit tests via TEST_RUN_PARAMETER -#ifndef PRELOAD_RSC //set to: -#define PRELOAD_RSC 2 // 0 to allow using external resources or on-demand behaviour; -#endif // 1 to use the default behaviour; - // 2 for preloading absolutely everything; +//#define UNIT_TESTS //If this is uncommented, we do a single run though of the game setup and tear down process with unit tests in between + +#ifndef PRELOAD_RSC //set to: +#define PRELOAD_RSC 2 // 0 to allow using external resources or on-demand behaviour; +#endif // 1 to use the default behaviour; + // 2 for preloading absolutely everything; #ifdef LOWMEMORYMODE #define FORCE_MAP "_maps/runtimestation.json" @@ -47,7 +57,7 @@ //Update this whenever you need to take advantage of more recent byond features #define MIN_COMPILER_VERSION 513 #define MIN_COMPILER_BUILD 1514 -#if DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD +#if (DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD) && !defined(SPACEMAN_DMM) //Don't forget to update this part #error Your version of BYOND is too out-of-date to compile this project. Go to https://secure.byond.com/download and update. #error You need version 513.1514 or higher @@ -58,10 +68,6 @@ #warn compiling in TESTING mode. testing() debug messages will be visible. #endif -#ifdef GC_FAILURE_HARD_LOOKUP -#define FIND_REF_NO_CHECK_TICK -#endif - #ifdef CIBUILDING #define UNIT_TESTS #endif @@ -70,6 +76,24 @@ #define TESTING #endif +#if defined(UNIT_TESTS) +//Hard del testing defines +#define REFERENCE_TRACKING +#define REFERENCE_TRACKING_DEBUG +#define FIND_REF_NO_CHECK_TICK +#endif + +#ifdef TGS +// TGS performs its own build of dm.exe, but includes a prepended TGS define. +#define CBT +#endif + // A reasonable number of maximum overlays an object needs // If you think you need more, rethink it #define MAX_ATOM_OVERLAYS 100 + +#if !defined(CBT) && !defined(SPACEMAN_DMM) +#warn Building with Dream Maker is no longer supported and will result in errors. +#warn In order to build, run BUILD.bat in the root directory. +#warn Consider switching to VSCode editor instead, where you can press Ctrl+Shift+B to build. +#endif diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 781fa38b94..c8e5b72f26 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -71,6 +71,7 @@ GLOBAL_LIST_INIT(bitfields, list( "DROPDEL" = DROPDEL, "NOBLUDGEON" = NOBLUDGEON, "ABSTRACT" = ABSTRACT, + "IN_STORAGE" = IN_STORAGE, "ITEM_CAN_BLOCK" = ITEM_CAN_BLOCK, "ITEM_CAN_PARRY" = ITEM_CAN_PARRY ), diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 28f657828b..0110d43e04 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -6,6 +6,7 @@ GLOBAL_LIST_EMPTY(hair_styles_female_list) //stores only hair names GLOBAL_LIST_EMPTY(facial_hair_styles_list) //stores /datum/sprite_accessory/facial_hair indexed by name GLOBAL_LIST_EMPTY(facial_hair_styles_male_list) //stores only hair names GLOBAL_LIST_EMPTY(facial_hair_styles_female_list) //stores only hair names +GLOBAL_LIST_EMPTY(hair_gradients_list) //stores /datum/sprite_accessory/hair_gradient indexed by name //Underwear GLOBAL_LIST_EMPTY_TYPED(underwear_list, /datum/sprite_accessory/underwear/bottom) //stores bottoms indexed by name GLOBAL_LIST_EMPTY(underwear_m) //stores only underwear name @@ -367,6 +368,7 @@ GLOBAL_LIST_INIT(job_heirlooms, list( "Janitor" = list(/obj/item/mop), "Scientist" = list(/obj/item/toy/plush/slimeplushie), "Assistant" = list(/obj/item/clothing/gloves/cut/family), + "Prisoner" = list (/obj/item/pen/blue), "Chaplain" = list(/obj/item/camera/spooky/family), "Head of Personnel" = list(/obj/item/pinpointer/ian) )) diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index daa4f5879d..b41b7356a8 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -112,7 +112,6 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/item/storage/box/marshmallow = 2, /obj/item/clothing/gloves/tackler/offbrand = 1, /obj/item/stack/sticky_tape = 1, - /obj/effect/spawner/lootdrop/grille_or_trash = 15, "" = 3 )) diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index f153b5965c..c7834dc5ef 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -25,7 +25,7 @@ if(multicam_on) var/turf/T = get_turf(A) if(T) - for(var/obj/screen/movable/pic_in_pic/ai/P in T.vis_locs) + for(var/atom/movable/screen/movable/pic_in_pic/ai/P in T.vis_locs) if(P.ai == src) P.Click(params) break diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index d24aa06806..1b72cc71b1 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -63,6 +63,8 @@ return ShiftClickOn(A) if(modifiers["alt"]) // alt and alt-gr (rightalt) return AltClickOn(A) + if(modifiers["ctrl"] && modifiers["right"]) //CIT CHANGE - right click ctrl for a new form of dropping items + return CtrlRightClickOn(A, params) //CIT CHANGE if(modifiers["ctrl"]) return CtrlClickOn(A) @@ -295,6 +297,46 @@ if(!(flags & COMPONENT_DENY_EXAMINATE) && user.client && (user.client.eye == user || user.client.eye == user.loc || flags & COMPONENT_ALLOW_EXAMINATE)) user.examinate(src) +/* + Ctrl + Right click + Combat mode feature + Drop item in hand at position. +*/ +/atom/proc/CtrlRightClickOn(atom/A, params) + if(isliving(src) && Adjacent(A)) //honestly only humans can do this given it's combat mode but if it's implemented for any other mobs... + var/mob/living/L = src + if(L.incapacitated()) + return + var/obj/item/I = L.get_active_held_item() + var/turf/T = get_turf(A) + if(T) + if(I) //drop item at cursor. + if(T.density) //no, you can't use your funny blue cube or red cube to clip into the fucking wall. + return + for(var/atom/C in T.contents) //nor can you clip into a window or a door/false wall that's not open. + if(C.opacity || (((C.flags_1 & PREVENT_CLICK_UNDER_1) > 0) != (istype(C,/obj/machinery/door) && !C.density))) //XOR operation within because doors always have PREVENT_CLICK_UNDER_1 flag enabled. Dumb, I know. + return + if(L.transferItemToLoc(I, T)) + var/list/click_params = params2list(params) + //Center the icon where the user clicked. (shamelessly stole code from tables) + 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 + I.pixel_x = clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) + I.pixel_y = clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) + return TRUE + else if(isitem(A) && L.has_active_hand()) //if they have an open hand they'll rotate the item instead. + var/obj/item/I2 = A + if(!I2.anchored) + var/matrix/ntransform = matrix(I2.transform) + ntransform.Turn(15) + animate(I2, transform = ntransform, time = 2) + return TRUE + else + A.CtrlClick(src) + + + /* Ctrl click For most objects, pull @@ -429,14 +471,14 @@ setDir(WEST, ismousemovement) //debug -/obj/screen/proc/scale_to(x1,y1) +/atom/movable/screen/proc/scale_to(x1,y1) if(!y1) y1 = x1 var/matrix/M = new M.Scale(x1,y1) transform = M -/obj/screen/click_catcher +/atom/movable/screen/click_catcher icon = 'icons/mob/screen_gen.dmi' icon_state = "catcher" plane = CLICKCATCHER_PLANE @@ -446,7 +488,7 @@ #define MAX_SAFE_BYOND_ICON_SCALE_TILES (MAX_SAFE_BYOND_ICON_SCALE_PX / world.icon_size) #define MAX_SAFE_BYOND_ICON_SCALE_PX (33 * 32) //Not using world.icon_size on purpose. -/obj/screen/click_catcher/proc/UpdateGreed(view_size_x = 15, view_size_y = 15) +/atom/movable/screen/click_catcher/proc/UpdateGreed(view_size_x = 15, view_size_y = 15) var/icon/newicon = icon('icons/mob/screen_gen.dmi', "catcher") var/ox = min(MAX_SAFE_BYOND_ICON_SCALE_TILES, view_size_x) var/oy = min(MAX_SAFE_BYOND_ICON_SCALE_TILES, view_size_y) @@ -461,7 +503,7 @@ M.Scale(px/sx, py/sy) transform = M -/obj/screen/click_catcher/Click(location, control, params) +/atom/movable/screen/click_catcher/Click(location, control, params) var/list/modifiers = params2list(params) if(modifiers["middle"] && iscarbon(usr)) var/mob/living/carbon/C = usr diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index cf3f45e196..743d75b557 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -43,7 +43,7 @@ INVOKE_ASYNC(aicamera, /obj/item/camera.proc/captureimage, A, usr) return - var/obj/item/W = get_active_held_item() + var/obj/item/W = get_active_held_item(TRUE) if(!W && A.Adjacent(src) && (isobj(A) || ismob(A))) var/atom/movable/C = A diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index 43451bd056..ae853a4e1a 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -80,10 +80,10 @@ /atom/proc/IsAutoclickable() . = 1 -/obj/screen/IsAutoclickable() +/atom/movable/screen/IsAutoclickable() . = 0 -/obj/screen/click_catcher/IsAutoclickable() +/atom/movable/screen/click_catcher/IsAutoclickable() . = 1 //Please don't roast me too hard diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 8a66374029..791cf336ac 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -1,6 +1,6 @@ #define ACTION_BUTTON_DEFAULT_BACKGROUND "default" -/obj/screen/movable/action_button +/atom/movable/screen/movable/action_button var/datum/action/linked_action var/actiontooltipstyle = "" screen_loc = null @@ -11,7 +11,7 @@ var/id var/ordered = TRUE //If the button gets placed into the default bar -/obj/screen/movable/action_button/proc/can_use(mob/user) +/atom/movable/screen/movable/action_button/proc/can_use(mob/user) if (linked_action) return linked_action.owner == user else if (isobserver(user)) @@ -20,14 +20,14 @@ else return TRUE -/obj/screen/movable/action_button/MouseDrop(over_object) +/atom/movable/screen/movable/action_button/MouseDrop(over_object) if(!can_use(usr)) return - if((istype(over_object, /obj/screen/movable/action_button) && !istype(over_object, /obj/screen/movable/action_button/hide_toggle))) + if((istype(over_object, /atom/movable/screen/movable/action_button) && !istype(over_object, /atom/movable/screen/movable/action_button/hide_toggle))) if(locked) to_chat(usr, "Action button \"[name]\" is locked, unlock it first.") return - var/obj/screen/movable/action_button/B = over_object + var/atom/movable/screen/movable/action_button/B = over_object var/list/actions = usr.actions actions.Swap(actions.Find(src.linked_action), actions.Find(B.linked_action)) moved = FALSE @@ -38,7 +38,7 @@ else return ..() -/obj/screen/movable/action_button/Click(location,control,params) +/atom/movable/screen/movable/action_button/Click(location,control,params) if (!can_use(usr)) return @@ -60,7 +60,7 @@ return TRUE //Hide/Show Action Buttons ... Button -/obj/screen/movable/action_button/hide_toggle +/atom/movable/screen/movable/action_button/hide_toggle name = "Hide Buttons" desc = "Shift-click any button to reset its position, and Control-click it to lock it in place. Alt-click this button to reset all buttons to their default positions." icon = 'icons/mob/actions.dmi' @@ -72,7 +72,7 @@ var/mutable_appearance/hide_appearance var/mutable_appearance/show_appearance -/obj/screen/movable/action_button/hide_toggle/Initialize() +/atom/movable/screen/movable/action_button/hide_toggle/Initialize() . = ..() var/static/list/icon_cache = list() @@ -86,7 +86,7 @@ if(!show_appearance) show_appearance = icon_cache[cache_key] = mutable_appearance(hide_icon, show_state) -/obj/screen/movable/action_button/hide_toggle/Click(location,control,params) +/atom/movable/screen/movable/action_button/hide_toggle/Click(location,control,params) if (!can_use(usr)) return @@ -107,7 +107,7 @@ if(modifiers["alt"]) for(var/V in usr.actions) var/datum/action/A = V - var/obj/screen/movable/action_button/B = A.button + var/atom/movable/screen/movable/action_button/B = A.button B.moved = FALSE if(B.id && usr.client) usr.client.prefs.action_buttons_screen_locs["[B.name]_[B.id]"] = null @@ -129,10 +129,10 @@ update_icon() usr.update_action_buttons() -/obj/screen/movable/action_button/hide_toggle/AltClick(mob/user) +/atom/movable/screen/movable/action_button/hide_toggle/AltClick(mob/user) for(var/V in user.actions) var/datum/action/A = V - var/obj/screen/movable/action_button/B = A.button + var/atom/movable/screen/movable/action_button/B = A.button B.moved = FALSE if(moved) moved = FALSE @@ -141,7 +141,7 @@ return TRUE -/obj/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(datum/hud/owner_hud) +/atom/movable/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(datum/hud/owner_hud) var/settings = owner_hud.get_action_buttons_icons() icon = settings["bg_icon"] icon_state = settings["bg_state"] @@ -150,7 +150,7 @@ show_state = settings["toggle_show"] update_icon() -/obj/screen/movable/action_button/hide_toggle/update_overlays() +/atom/movable/screen/movable/action_button/hide_toggle/update_overlays() . = ..() if(hidden) . += show_appearance @@ -158,12 +158,12 @@ . += hide_appearance -/obj/screen/movable/action_button/MouseEntered(location,control,params) +/atom/movable/screen/movable/action_button/MouseEntered(location,control,params) if(!QDELETED(src)) openToolTip(usr,src,params,title = name,content = desc,theme = actiontooltipstyle) -/obj/screen/movable/action_button/MouseExited() +/atom/movable/screen/movable/action_button/MouseExited() closeToolTip(usr) /datum/hud/proc/get_action_buttons_icons() @@ -203,7 +203,7 @@ else for(var/datum/action/A in actions) A.UpdateButtonIcon() - var/obj/screen/movable/action_button/B = A.button + var/atom/movable/screen/movable/action_button/B = A.button if(B.ordered) button_number++ if(B.moved) @@ -235,7 +235,7 @@ return "WEST[coord_col]:[coord_col_offset],NORTH[coord_row]:-6" -/datum/hud/proc/SetButtonCoords(obj/screen/button,number, supportedcolumns) +/datum/hud/proc/SetButtonCoords(atom/movable/screen/button,number, supportedcolumns) var/row = round((number-1)/supportedcolumns) var/col = ((number - 1)%(supportedcolumns)) + 1 var/x_offset = 32*(col-1) + 4 + 2*col diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index 93c3b63d1e..17b5a9ed61 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -1,136 +1,136 @@ -/obj/screen/ai +/atom/movable/screen/ai icon = 'icons/mob/screen_ai.dmi' -/obj/screen/ai/Click() +/atom/movable/screen/ai/Click() if(isobserver(usr) || usr.incapacitated()) return TRUE -/obj/screen/ai/aicore +/atom/movable/screen/ai/aicore name = "AI core" icon_state = "ai_core" -/obj/screen/ai/aicore/Click() +/atom/movable/screen/ai/aicore/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.view_core() -/obj/screen/ai/camera_list +/atom/movable/screen/ai/camera_list name = "Show Camera List" icon_state = "camera" -/obj/screen/ai/camera_list/Click() +/atom/movable/screen/ai/camera_list/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.show_camera_list() -/obj/screen/ai/camera_track +/atom/movable/screen/ai/camera_track name = "Track With Camera" icon_state = "track" -/obj/screen/ai/camera_track/Click() +/atom/movable/screen/ai/camera_track/Click() if(..()) return var/mob/living/silicon/ai/AI = usr var/target_name = input(AI, "Choose who you want to track", "Tracking") as null|anything in AI.trackable_mobs() AI.ai_camera_track(target_name) -/obj/screen/ai/camera_light +/atom/movable/screen/ai/camera_light name = "Toggle Camera Light" icon_state = "camera_light" -/obj/screen/ai/camera_light/Click() +/atom/movable/screen/ai/camera_light/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.toggle_camera_light() -/obj/screen/ai/crew_monitor +/atom/movable/screen/ai/crew_monitor name = "Crew Monitoring Console" icon_state = "crew_monitor" -/obj/screen/ai/crew_monitor/Click() +/atom/movable/screen/ai/crew_monitor/Click() if(..()) return var/mob/living/silicon/ai/AI = usr GLOB.crewmonitor.show(AI,AI) -/obj/screen/ai/crew_manifest +/atom/movable/screen/ai/crew_manifest name = "Crew Manifest" icon_state = "manifest" -/obj/screen/ai/crew_manifest/Click() +/atom/movable/screen/ai/crew_manifest/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.ai_roster() -/obj/screen/ai/alerts +/atom/movable/screen/ai/alerts name = "Show Alerts" icon_state = "alerts" -/obj/screen/ai/alerts/Click() +/atom/movable/screen/ai/alerts/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.ai_alerts() -/obj/screen/ai/announcement +/atom/movable/screen/ai/announcement name = "Make Vox Announcement" icon_state = "announcement" -/obj/screen/ai/announcement/Click() +/atom/movable/screen/ai/announcement/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.announcement() -/obj/screen/ai/call_shuttle +/atom/movable/screen/ai/call_shuttle name = "Call Emergency Shuttle" icon_state = "call_shuttle" -/obj/screen/ai/call_shuttle/Click() +/atom/movable/screen/ai/call_shuttle/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.ai_call_shuttle() -/obj/screen/ai/state_laws +/atom/movable/screen/ai/state_laws name = "State Laws" icon_state = "state_laws" -/obj/screen/ai/state_laws/Click() +/atom/movable/screen/ai/state_laws/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.checklaws() -/obj/screen/ai/pda_msg_send +/atom/movable/screen/ai/pda_msg_send name = "PDA - Send Message" icon_state = "pda_send" -/obj/screen/ai/pda_msg_send/Click() +/atom/movable/screen/ai/pda_msg_send/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.cmd_send_pdamesg(usr) -/obj/screen/ai/pda_msg_show +/atom/movable/screen/ai/pda_msg_show name = "PDA - Show Message Log" icon_state = "pda_receive" -/obj/screen/ai/pda_msg_show/Click() +/atom/movable/screen/ai/pda_msg_show/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.cmd_show_message_log(usr) -/obj/screen/ai/image_take +/atom/movable/screen/ai/image_take name = "Take Image" icon_state = "take_picture" -/obj/screen/ai/image_take/Click() +/atom/movable/screen/ai/image_take/Click() if(..()) return if(isAI(usr)) @@ -140,11 +140,11 @@ var/mob/living/silicon/robot/R = usr R.aicamera.toggle_camera_mode(usr) -/obj/screen/ai/image_view +/atom/movable/screen/ai/image_view name = "View Images" icon_state = "view_images" -/obj/screen/ai/image_view/Click() +/atom/movable/screen/ai/image_view/Click() if(..()) return if(isAI(usr)) @@ -154,31 +154,31 @@ var/mob/living/silicon/robot/R = usr R.aicamera.viewpictures(usr) -/obj/screen/ai/sensors +/atom/movable/screen/ai/sensors name = "Sensor Augmentation" icon_state = "ai_sensor" -/obj/screen/ai/sensors/Click() +/atom/movable/screen/ai/sensors/Click() if(..()) return var/mob/living/silicon/S = usr S.toggle_sensors() -/obj/screen/ai/multicam +/atom/movable/screen/ai/multicam name = "Multicamera Mode" icon_state = "multicam" -/obj/screen/ai/multicam/Click() +/atom/movable/screen/ai/multicam/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.toggle_multicam() -/obj/screen/ai/add_multicam +/atom/movable/screen/ai/add_multicam name = "New Camera" icon_state = "new_cam" -/obj/screen/ai/add_multicam/Click() +/atom/movable/screen/ai/add_multicam/Click() if(..()) return var/mob/living/silicon/ai/AI = usr @@ -190,112 +190,112 @@ /datum/hud/ai/New(mob/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using // Language menu - using = new /obj/screen/language_menu + using = new /atom/movable/screen/language_menu using.screen_loc = ui_borg_language_menu using.hud = src static_inventory += using //AI core - using = new /obj/screen/ai/aicore() + using = new /atom/movable/screen/ai/aicore() using.screen_loc = ui_ai_core using.hud = src static_inventory += using //Camera list - using = new /obj/screen/ai/camera_list() + using = new /atom/movable/screen/ai/camera_list() using.screen_loc = ui_ai_camera_list using.hud = src static_inventory += using //Track - using = new /obj/screen/ai/camera_track() + using = new /atom/movable/screen/ai/camera_track() using.screen_loc = ui_ai_track_with_camera using.hud = src static_inventory += using //Camera light - using = new /obj/screen/ai/camera_light() + using = new /atom/movable/screen/ai/camera_light() using.screen_loc = ui_ai_camera_light using.hud = src static_inventory += using //Crew Monitoring - using = new /obj/screen/ai/crew_monitor() + using = new /atom/movable/screen/ai/crew_monitor() using.screen_loc = ui_ai_crew_monitor using.hud = src static_inventory += using //Crew Manifest - using = new /obj/screen/ai/crew_manifest() + using = new /atom/movable/screen/ai/crew_manifest() using.screen_loc = ui_ai_crew_manifest using.hud = src static_inventory += using //Alerts - using = new /obj/screen/ai/alerts() + using = new /atom/movable/screen/ai/alerts() using.screen_loc = ui_ai_alerts using.hud = src static_inventory += using //Announcement - using = new /obj/screen/ai/announcement() + using = new /atom/movable/screen/ai/announcement() using.screen_loc = ui_ai_announcement using.hud = src static_inventory += using //Shuttle - using = new /obj/screen/ai/call_shuttle() + using = new /atom/movable/screen/ai/call_shuttle() using.screen_loc = ui_ai_shuttle using.hud = src static_inventory += using //Laws - using = new /obj/screen/ai/state_laws() + using = new /atom/movable/screen/ai/state_laws() using.screen_loc = ui_ai_state_laws using.hud = src static_inventory += using //PDA message - using = new /obj/screen/ai/pda_msg_send() + using = new /atom/movable/screen/ai/pda_msg_send() using.screen_loc = ui_ai_pda_send using.hud = src static_inventory += using //PDA log - using = new /obj/screen/ai/pda_msg_show() + using = new /atom/movable/screen/ai/pda_msg_show() using.screen_loc = ui_ai_pda_log using.hud = src static_inventory += using //Take image - using = new /obj/screen/ai/image_take() + using = new /atom/movable/screen/ai/image_take() using.screen_loc = ui_ai_take_picture using.hud = src static_inventory += using //View images - using = new /obj/screen/ai/image_view() + using = new /atom/movable/screen/ai/image_view() using.screen_loc = ui_ai_view_images using.hud = src static_inventory += using //Medical/Security sensors - using = new /obj/screen/ai/sensors() + using = new /atom/movable/screen/ai/sensors() using.screen_loc = ui_ai_sensor using.hud = src static_inventory += using //Multicamera mode - using = new /obj/screen/ai/multicam() + using = new /atom/movable/screen/ai/multicam() using.screen_loc = ui_ai_multicam using.hud = src static_inventory += using //Add multicamera camera - using = new /obj/screen/ai/add_multicam() + using = new /atom/movable/screen/ai/add_multicam() using.screen_loc = ui_ai_add_multicam using.hud = src static_inventory += using diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 81d8593d4e..ed4c91dd9b 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -18,7 +18,7 @@ if(!category || QDELETED(src)) return - var/obj/screen/alert/thealert + var/atom/movable/screen/alert/thealert if(alerts[category]) thealert = alerts[category] if(thealert.override_alerts) @@ -69,13 +69,13 @@ thealert.timeout = world.time + thealert.timeout - world.tick_lag return thealert -/mob/proc/alert_timeout(obj/screen/alert/alert, category) +/mob/proc/alert_timeout(atom/movable/screen/alert/alert, category) if(alert.timeout && alerts[category] == alert && world.time >= alert.timeout) clear_alert(category) // Proc to clear an existing alert. /mob/proc/clear_alert(category, clear_override = FALSE) - var/obj/screen/alert/alert = alerts[category] + var/atom/movable/screen/alert/alert = alerts[category] if(!alert) return 0 if(alert.override_alerts && !clear_override) @@ -87,7 +87,7 @@ client.screen -= alert qdel(alert) -/obj/screen/alert +/atom/movable/screen/alert icon = 'icons/mob/screen_alert.dmi' icon_state = "default" name = "Alert" @@ -100,72 +100,72 @@ var/mob/mob_viewer //the mob viewing this alert -/obj/screen/alert/MouseEntered(location,control,params) +/atom/movable/screen/alert/MouseEntered(location,control,params) if(!QDELETED(src)) openToolTip(usr,src,params,title = name,content = desc,theme = alerttooltipstyle) -/obj/screen/alert/MouseExited() +/atom/movable/screen/alert/MouseExited() closeToolTip(usr) //Gas alerts -/obj/screen/alert/not_enough_oxy +/atom/movable/screen/alert/not_enough_oxy name = "Choking (No O2)" desc = "You're not getting enough oxygen. Find some good air before you pass out! The box in your backpack has an oxygen tank and breath mask in it." icon_state = "not_enough_oxy" -/obj/screen/alert/too_much_oxy +/atom/movable/screen/alert/too_much_oxy name = "Choking (O2)" desc = "There's too much oxygen in the air, and you're breathing it in! Find some good air before you pass out!" icon_state = "too_much_oxy" -/obj/screen/alert/not_enough_nitro +/atom/movable/screen/alert/not_enough_nitro name = "Choking (No N2)" desc = "You're not getting enough nitrogen. Find some good air before you pass out!" icon_state = "not_enough_nitro" -/obj/screen/alert/too_much_nitro +/atom/movable/screen/alert/too_much_nitro name = "Choking (N2)" desc = "There's too much nitrogen in the air, and you're breathing it in! Find some good air before you pass out!" icon_state = "too_much_nitro" -/obj/screen/alert/not_enough_co2 +/atom/movable/screen/alert/not_enough_co2 name = "Choking (No CO2)" desc = "You're not getting enough carbon dioxide. Find some good air before you pass out!" icon_state = "not_enough_co2" -/obj/screen/alert/too_much_co2 +/atom/movable/screen/alert/too_much_co2 name = "Choking (CO2)" desc = "There's too much carbon dioxide in the air, and you're breathing it in! Find some good air before you pass out!" icon_state = "too_much_co2" -/obj/screen/alert/not_enough_tox +/atom/movable/screen/alert/not_enough_tox name = "Choking (No Plasma)" desc = "You're not getting enough plasma. Find some good air before you pass out!" icon_state = "not_enough_tox" -/obj/screen/alert/too_much_tox +/atom/movable/screen/alert/too_much_tox name = "Choking (Plasma)" desc = "There's highly flammable, toxic plasma in the air and you're breathing it in. Find some fresh air. The box in your backpack has an oxygen tank and gas mask in it." icon_state = "too_much_tox" -/obj/screen/alert/not_enough_ch4 +/atom/movable/screen/alert/not_enough_ch4 name = "Choking (No CH4)" desc = "You're not getting enough methane. Find some good air before you pass out!" icon_state = "not_enough_ch4" -/obj/screen/alert/too_much_ch4 +/atom/movable/screen/alert/too_much_ch4 name = "Choking (CH4)" desc = "There's too much methane in the air, and you're breathing it in! Find some good air before you pass out!" icon_state = "too_much_ch4" -/obj/screen/alert/not_enough_ch3br +/atom/movable/screen/alert/not_enough_ch3br name = "Choking (No CH3Br)" desc = "You're not getting enough methyl bromide. Find some good air before you pass out!" icon_state = "not_enough_tox" -/obj/screen/alert/too_much_ch3br +/atom/movable/screen/alert/too_much_ch3br name = "Choking (CH3Br)" desc = "There's highly toxic methyl bromide in the air and you're breathing it in. Find some fresh air. The box in your backpack has an oxygen tank and gas mask in it." icon_state = "too_much_tox" @@ -173,109 +173,109 @@ //End gas alerts -/obj/screen/alert/fat +/atom/movable/screen/alert/fat name = "Fat" desc = "You ate too much food, lardass. Run around the station and lose some weight." icon_state = "fat" -/obj/screen/alert/hungry +/atom/movable/screen/alert/hungry name = "Hungry" desc = "Some food would be good right about now." icon_state = "hungry" -/obj/screen/alert/starving +/atom/movable/screen/alert/starving name = "Starving" desc = "You're severely malnourished. The hunger pains make moving around a chore." icon_state = "starving" -/obj/screen/alert/gross +/atom/movable/screen/alert/gross name = "Grossed out." desc = "That was kind of gross..." icon_state = "gross" -/obj/screen/alert/verygross +/atom/movable/screen/alert/verygross name = "Very grossed out." desc = "You're not feeling very well..." icon_state = "gross2" -/obj/screen/alert/disgusted +/atom/movable/screen/alert/disgusted name = "DISGUSTED" desc = "ABSOLUTELY DISGUSTIN'" icon_state = "gross3" -/obj/screen/alert/hot +/atom/movable/screen/alert/hot name = "Too Hot" desc = "The air around you is pretty toasty! Consider putting on some insulating clothing, or moving to a cooler area." icon_state = "hot" -/obj/screen/alert/cold +/atom/movable/screen/alert/cold name = "Too Cold" desc = "The air around you is pretty cold! Consider wearing a coat, or moving to a warmer area." icon_state = "cold" -/obj/screen/alert/sweat +/atom/movable/screen/alert/sweat name = "Sweating" desc = "You're sweating! Get somewhere cooler and take off any insulating clothing like a fire suit." icon_state = "sweat" -/obj/screen/alert/shiver +/atom/movable/screen/alert/shiver name = "Shivering" desc = "You're shivering! Get somewhere warmer and take off any insulating clothing like a space suit." -/obj/screen/alert/lowpressure +/atom/movable/screen/alert/lowpressure name = "Low Pressure" desc = "The air around you is hazardously thin. A space suit would protect you." icon_state = "lowpressure" -/obj/screen/alert/highpressure +/atom/movable/screen/alert/highpressure name = "High Pressure" desc = "The air around you is hazardously thick. A fire suit would protect you." icon_state = "highpressure" -/obj/screen/alert/blind +/atom/movable/screen/alert/blind name = "Blind" desc = "You can't see! This may be caused by a genetic defect, eye trauma, being unconscious, \ or something covering your eyes." icon_state = "blind" -/obj/screen/alert/high +/atom/movable/screen/alert/high name = "High" desc = "Whoa man, you're tripping balls! Careful you don't get addicted... if you aren't already." icon_state = "high" -/obj/screen/alert/mind_control +/atom/movable/screen/alert/mind_control name = "Mind Control" desc = "Your mind has been hijacked! Click to view the mind control command." icon_state = "mind_control" var/command -/obj/screen/alert/mind_control/Click() +/atom/movable/screen/alert/mind_control/Click() var/mob/living/L = usr to_chat(L, "[command]") -/obj/screen/alert/hypnosis +/atom/movable/screen/alert/hypnosis name = "Hypnosis" desc = "Something's hypnotizing you, but you're not really sure about what." icon_state = "hypnosis" var/phrase -/obj/screen/alert/drunk //Not implemented +/atom/movable/screen/alert/drunk //Not implemented name = "Drunk" desc = "All that alcohol you've been drinking is impairing your speech, motor skills, and mental cognition. Make sure to act like it." icon_state = "drunk" -/obj/screen/alert/embeddedobject +/atom/movable/screen/alert/embeddedobject name = "Embedded Object" desc = "Something got lodged into your flesh and is causing major bleeding. It might fall out with time, but surgery is the safest way. \ If you're feeling frisky, examine yourself and click the underlined item to pull the object out." icon_state = "embeddedobject" -/obj/screen/alert/embeddedobject/Click() +/atom/movable/screen/alert/embeddedobject/Click() if(isliving(usr)) var/mob/living/carbon/M = usr return M.help_shake_act(M) -/obj/screen/alert/weightless +/atom/movable/screen/alert/weightless name = "Weightless" desc = "Gravity has ceased affecting you, and you're floating around aimlessly. You'll need something large and heavy, like a \ wall or lattice, to push yourself off if you want to move. A jetpack would enable free range of motion. A pair of \ @@ -283,22 +283,22 @@ magboots would let you walk around normally on the floor. Barring those, you can or shoot a gun to move around via Newton's 3rd Law of Motion." icon_state = "weightless" -/obj/screen/alert/highgravity +/atom/movable/screen/alert/highgravity name = "High Gravity" desc = "You're getting crushed by high gravity, picking up items and movement will be slowed." icon_state = "paralysis" -/obj/screen/alert/veryhighgravity +/atom/movable/screen/alert/veryhighgravity name = "Crushing Gravity" desc = "You're getting crushed by high gravity, picking up items and movement will be slowed. You'll also accumulate brute damage!" icon_state = "paralysis" -/obj/screen/alert/fire +/atom/movable/screen/alert/fire name = "On Fire" desc = "You're on fire. Stop, drop and roll to put the fire out or move to a vacuum area." icon_state = "fire" -/obj/screen/alert/fire/Click() +/atom/movable/screen/alert/fire/Click() var/mob/living/L = usr if(!istype(L) || !L.can_resist()) return @@ -306,7 +306,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." if(CHECK_MOBILITY(L, MOBILITY_MOVE)) return L.resist_fire() //I just want to start a flame in your hearrrrrrtttttt. -/obj/screen/alert/give // information set when the give alert is made +/atom/movable/screen/alert/give // information set when the give alert is made icon_state = "default" var/mob/living/carbon/giver var/obj/item/receiving @@ -321,7 +321,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." * * giver - The person giving the alert and item * * receiving - The item being given by the giver */ -/obj/screen/alert/give/proc/setup(mob/living/carbon/taker, mob/living/carbon/giver, obj/item/receiving) +/atom/movable/screen/alert/give/proc/setup(mob/living/carbon/taker, mob/living/carbon/giver, obj/item/receiving) name = "[giver] is offering [receiving]" desc = "[giver] is offering [receiving]. Click this alert to take it." icon_state = "template" @@ -331,31 +331,31 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." src.giver = giver RegisterSignal(taker, COMSIG_MOVABLE_MOVED, .proc/removeAlert) -/obj/screen/alert/give/proc/removeAlert() +/atom/movable/screen/alert/give/proc/removeAlert() to_chat(usr, "You moved out of range of [giver]!") usr.clear_alert("[giver]") -/obj/screen/alert/give/Click(location, control, params) +/atom/movable/screen/alert/give/Click(location, control, params) . = ..() var/mob/living/carbon/C = usr C.take(giver, receiving) //ALIENS -/obj/screen/alert/alien_tox +/atom/movable/screen/alert/alien_tox name = "Plasma" desc = "There's flammable plasma in the air. If it lights up, you'll be toast." icon_state = "alien_tox" alerttooltipstyle = "alien" -/obj/screen/alert/alien_fire +/atom/movable/screen/alert/alien_fire // This alert is temporarily gonna be thrown for all hot air but one day it will be used for literally being on fire name = "Too Hot" desc = "It's too hot! Flee to space or at least away from the flames. Standing on weeds will heal you." icon_state = "alien_fire" alerttooltipstyle = "alien" -/obj/screen/alert/alien_vulnerable +/atom/movable/screen/alert/alien_vulnerable name = "Severed Matriarchy" desc = "Your queen has been killed, you will suffer movement penalties and loss of hivemind. A new queen cannot be made until you recover." icon_state = "alien_noqueen" @@ -363,7 +363,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." //BLOBS -/obj/screen/alert/nofactory +/atom/movable/screen/alert/nofactory name = "No Factory" desc = "You have no factory, and are slowly dying!" icon_state = "blobbernaut_nofactory" @@ -371,7 +371,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." // BLOODCULT -/obj/screen/alert/bloodsense +/atom/movable/screen/alert/bloodsense name = "Blood Sense" desc = "Allows you to sense blood that is manipulated by dark magicks." icon_state = "cult_sense" @@ -380,17 +380,17 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." var/angle = 0 var/mob/living/simple_animal/hostile/construct/Cviewer = null -/obj/screen/alert/bloodsense/Initialize() +/atom/movable/screen/alert/bloodsense/Initialize() . = ..() narnar = new('icons/mob/screen_alert.dmi', "mini_nar") START_PROCESSING(SSprocessing, src) -/obj/screen/alert/bloodsense/Destroy() +/atom/movable/screen/alert/bloodsense/Destroy() Cviewer = null STOP_PROCESSING(SSprocessing, src) return ..() -/obj/screen/alert/bloodsense/process() +/atom/movable/screen/alert/bloodsense/process() var/atom/blood_target if(!mob_viewer.mind) @@ -480,15 +480,15 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." // CLOCKCULT -/obj/screen/alert/clockwork +/atom/movable/screen/alert/clockwork alerttooltipstyle = "clockcult" -/obj/screen/alert/clockwork/infodump +/atom/movable/screen/alert/clockwork/infodump name = "Global Records" desc = "You shouldn't be seeing this description, because it should be dynamically generated." icon_state = "clockinfo" -/obj/screen/alert/clockwork/infodump/MouseEntered(location,control,params) +/atom/movable/screen/alert/clockwork/infodump/MouseEntered(location,control,params) if(GLOB.ratvar_awakens) desc = "CHETR
NYY
HAGEHUGF-NAQ-UBABE
RATVAR.
" else @@ -520,19 +520,19 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." //GUARDIANS -/obj/screen/alert/cancharge +/atom/movable/screen/alert/cancharge name = "Charge Ready" desc = "You are ready to charge at a location!" icon_state = "guardian_charge" alerttooltipstyle = "parasite" -/obj/screen/alert/canstealth +/atom/movable/screen/alert/canstealth name = "Stealth Ready" desc = "You are ready to enter stealth!" icon_state = "guardian_canstealth" alerttooltipstyle = "parasite" -/obj/screen/alert/instealth +/atom/movable/screen/alert/instealth name = "In Stealth" desc = "You are in stealth and your next attack will do bonus damage!" icon_state = "guardian_instealth" @@ -540,52 +540,52 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." //SILICONS -/obj/screen/alert/nocell +/atom/movable/screen/alert/nocell name = "Missing Power Cell" desc = "Unit has no power cell. No modules available until a power cell is reinstalled. Robotics may provide assistance." icon_state = "nocell" -/obj/screen/alert/emptycell +/atom/movable/screen/alert/emptycell name = "Out of Power" desc = "Unit's power cell has no charge remaining. No modules available until power cell is recharged. \ Recharging stations are available in robotics, the dormitory bathrooms, and the AI satellite." icon_state = "emptycell" -/obj/screen/alert/lowcell +/atom/movable/screen/alert/lowcell name = "Low Charge" desc = "Unit's power cell is running low. Recharging stations are available in robotics, the dormitory bathrooms, and the AI satellite." icon_state = "lowcell" -/obj/screen/alert/etherealcharge +/atom/movable/screen/alert/etherealcharge name = "Low Blood Charge" desc = "Your blood's electric charge is running low, find a source of charge for your blood. Use a recharging station found in robotics or the dormitory bathrooms, or eat some Ethereal-friendly food." icon_state = "etherealcharge" -/obj/screen/alert/ethereal_overcharge +/atom/movable/screen/alert/ethereal_overcharge name = "Blood Overcharge" desc = "Your blood's electric charge is becoming dangerously high, find an outlet for your energy. Use Grab Intent on an APC to channel your energy into it." icon_state = "ethereal_overcharge" //Need to cover all use cases - emag, illegal upgrade module, malf AI hack, traitor cyborg -/obj/screen/alert/hacked +/atom/movable/screen/alert/hacked name = "Hacked" desc = "Hazardous non-standard equipment detected. Please ensure any usage of this equipment is in line with unit's laws, if any." icon_state = "hacked" -/obj/screen/alert/locked +/atom/movable/screen/alert/locked name = "Locked Down" desc = "Unit has been remotely locked down. Usage of a Robotics Control Console like the one in the Research Director's \ office by your AI master or any qualified human may resolve this matter. Robotics may provide further assistance if necessary." icon_state = "locked" -/obj/screen/alert/newlaw +/atom/movable/screen/alert/newlaw name = "Law Update" desc = "Laws have potentially been uploaded to or removed from this unit. Please be aware of any changes \ so as to remain in compliance with the most up-to-date laws." icon_state = "newlaw" timeout = 300 -/obj/screen/alert/hackingapc +/atom/movable/screen/alert/hackingapc name = "Hacking APC" desc = "An Area Power Controller is being hacked. When the process is \ complete, you will have exclusive control of it, and you will gain \ @@ -594,7 +594,7 @@ so as to remain in compliance with the most up-to-date laws." timeout = 600 var/atom/target = null -/obj/screen/alert/hackingapc/Click() +/atom/movable/screen/alert/hackingapc/Click() if(!usr || !usr.client) return if(!target) @@ -606,7 +606,7 @@ so as to remain in compliance with the most up-to-date laws." //MECHS -/obj/screen/alert/low_mech_integrity +/atom/movable/screen/alert/low_mech_integrity name = "Mech Damaged" desc = "Mech integrity is low." icon_state = "low_mech_integrity" @@ -614,19 +614,19 @@ so as to remain in compliance with the most up-to-date laws." //GHOSTS //TODO: expand this system to replace the pollCandidates/CheckAntagonist/"choose quickly"/etc Yes/No messages -/obj/screen/alert/notify_cloning +/atom/movable/screen/alert/notify_cloning name = "Revival" desc = "Someone is trying to revive you. Re-enter your corpse if you want to be revived!" icon_state = "template" timeout = 300 -/obj/screen/alert/notify_cloning/Click() +/atom/movable/screen/alert/notify_cloning/Click() if(!usr || !usr.client) return var/mob/dead/observer/G = usr G.reenter_corpse() -/obj/screen/alert/notify_action +/atom/movable/screen/alert/notify_action name = "Body created" desc = "A body was created. You can enter it." icon_state = "template" @@ -634,7 +634,7 @@ so as to remain in compliance with the most up-to-date laws." var/atom/target = null var/action = NOTIFY_JUMP -/obj/screen/alert/notify_action/Click() +/atom/movable/screen/alert/notify_action/Click() if(!usr || !usr.client) return if(!target) @@ -654,44 +654,44 @@ so as to remain in compliance with the most up-to-date laws." //OBJECT-BASED -/obj/screen/alert/restrained/buckled +/atom/movable/screen/alert/restrained/buckled name = "Buckled" desc = "You've been buckled to something. Click the alert to unbuckle unless you're handcuffed." icon_state = "buckled" -/obj/screen/alert/restrained/handcuffed +/atom/movable/screen/alert/restrained/handcuffed name = "Handcuffed" desc = "You're handcuffed and can't act. If anyone drags you, you won't be able to move. Click the alert to free yourself." -/obj/screen/alert/restrained/legcuffed +/atom/movable/screen/alert/restrained/legcuffed name = "Legcuffed" desc = "You're legcuffed, which slows you down considerably. Click the alert to free yourself." -/obj/screen/alert/restrained/Click() +/atom/movable/screen/alert/restrained/Click() var/mob/living/L = usr if(!istype(L) || !L.can_resist()) return L.MarkResistTime() return L.resist_restraints() -/obj/screen/alert/restrained/buckled/Click() +/atom/movable/screen/alert/restrained/buckled/Click() var/mob/living/L = usr if(!istype(L) || !L.can_resist()) return L.MarkResistTime() return L.resist_buckle() -/obj/screen/alert/shoes/untied +/atom/movable/screen/alert/shoes/untied name = "Untied Shoes" desc = "Your shoes are untied! Click the alert or your shoes to tie them." icon_state = "shoealert" -/obj/screen/alert/shoes/knotted +/atom/movable/screen/alert/shoes/knotted name = "Knotted Shoes" desc = "Someone tied your shoelaces together! Click the alert or your shoes to undo the knot." icon_state = "shoealert" -/obj/screen/alert/shoes/Click() +/atom/movable/screen/alert/shoes/Click() var/mob/living/carbon/C = usr if(!istype(C) || !C.can_resist() || C != mob_viewer || !C.shoes) return @@ -708,7 +708,7 @@ so as to remain in compliance with the most up-to-date laws." mymob.client.screen -= alerts[alerts[i]] return 1 for(var/i = 1, i <= alerts.len, i++) - var/obj/screen/alert/alert = alerts[alerts[i]] + var/atom/movable/screen/alert/alert = alerts[alerts[i]] if(alert.icon_state == "template") alert.icon = ui_style switch(i) @@ -728,7 +728,7 @@ so as to remain in compliance with the most up-to-date laws." mymob.client.screen |= alert return 1 -/obj/screen/alert/Click(location, control, params) +/atom/movable/screen/alert/Click(location, control, params) if(!usr || !usr.client) return var/paramslist = params2list(params) @@ -738,7 +738,7 @@ so as to remain in compliance with the most up-to-date laws." if(master) return usr.client.Click(master, location, control, params) -/obj/screen/alert/Destroy() +/atom/movable/screen/alert/Destroy() . = ..() severity = 0 master = null diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index 94585cbd52..bf7969a6ba 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -1,23 +1,23 @@ -/obj/screen/alien +/atom/movable/screen/alien icon = 'icons/mob/screen_alien.dmi' -/obj/screen/alien/leap +/atom/movable/screen/alien/leap name = "toggle leap" icon_state = "leap_off" -/obj/screen/alien/leap/Click() +/atom/movable/screen/alien/leap/Click() if(isalienhunter(usr)) var/mob/living/carbon/alien/humanoid/hunter/AH = usr AH.toggle_leap() -/obj/screen/alien/plasma_display +/atom/movable/screen/alien/plasma_display icon = 'icons/mob/screen_gen.dmi' icon_state = "power_display2" name = "plasma stored" screen_loc = ui_alienplasmadisplay -/obj/screen/alien/alien_queen_finder +/atom/movable/screen/alien/alien_queen_finder icon = 'icons/mob/screen_alien.dmi' icon_state = "queen_finder" name = "queen sense" @@ -30,7 +30,7 @@ /datum/hud/alien/New(mob/living/carbon/alien/humanoid/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using //equippable shit @@ -39,55 +39,55 @@ //begin buttons - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_1" using.screen_loc = ui_swaphand_position(owner,1) using.hud = src static_inventory += using - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_2" using.screen_loc = ui_swaphand_position(owner,2) using.hud = src static_inventory += using - action_intent = new /obj/screen/act_intent/alien() + action_intent = new /atom/movable/screen/act_intent/alien() action_intent.icon_state = mymob.a_intent action_intent.hud = src static_inventory += action_intent if(isalienhunter(mymob)) var/mob/living/carbon/alien/humanoid/hunter/H = mymob - H.leap_icon = new /obj/screen/alien/leap() + H.leap_icon = new /atom/movable/screen/alien/leap() H.leap_icon.screen_loc = ui_alien_storage_r static_inventory += H.leap_icon - using = new/obj/screen/language_menu + using = new/atom/movable/screen/language_menu using.screen_loc = ui_alien_language_menu using.hud = src static_inventory += using - using = new /obj/screen/drop() + using = new /atom/movable/screen/drop() using.icon = ui_style using.screen_loc = ui_drop_throw using.hud = src static_inventory += using - using = new /obj/screen/resist() + using = new /atom/movable/screen/resist() using.icon = ui_style using.screen_loc = ui_pull_resist using.hud = src hotkeybuttons += using - throw_icon = new /obj/screen/throw_catch() + throw_icon = new /atom/movable/screen/throw_catch() throw_icon.icon = ui_style throw_icon.screen_loc = ui_drop_throw throw_icon.hud = src hotkeybuttons += throw_icon - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = ui_style pull_icon.hud = src pull_icon.update_icon() @@ -96,25 +96,25 @@ //begin indicators - healths = new /obj/screen/healths/alien() + healths = new /atom/movable/screen/healths/alien() healths.hud = src infodisplay += healths - alien_plasma_display = new /obj/screen/alien/plasma_display() + alien_plasma_display = new /atom/movable/screen/alien/plasma_display() alien_plasma_display.hud = src infodisplay += alien_plasma_display if(!isalienqueen(mymob)) - alien_queen_finder = new /obj/screen/alien/alien_queen_finder + alien_queen_finder = new /atom/movable/screen/alien/alien_queen_finder alien_queen_finder.hud = src infodisplay += alien_queen_finder - zone_select = new /obj/screen/zone_sel/alien() + zone_select = new /atom/movable/screen/zone_sel/alien() zone_select.hud = src zone_select.update_icon() static_inventory += zone_select - for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) inv.hud = src inv_slots[inv.slot_id] = inv diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index 0f3c6ccf17..17d3ad35e4 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -3,34 +3,34 @@ /datum/hud/larva/New(mob/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using - action_intent = new /obj/screen/act_intent/alien() + action_intent = new /atom/movable/screen/act_intent/alien() action_intent.icon_state = mymob.a_intent action_intent.hud = src static_inventory += action_intent - healths = new /obj/screen/healths/alien() + healths = new /atom/movable/screen/healths/alien() healths.hud = src infodisplay += healths - alien_queen_finder = new /obj/screen/alien/alien_queen_finder() + alien_queen_finder = new /atom/movable/screen/alien/alien_queen_finder() alien_queen_finder.hud = src infodisplay += alien_queen_finder - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = 'icons/mob/screen_alien.dmi' pull_icon.hud = src pull_icon.update_icon() pull_icon.screen_loc = ui_pull_resist hotkeybuttons += pull_icon - using = new/obj/screen/language_menu + using = new/atom/movable/screen/language_menu using.screen_loc = ui_alien_language_menu using.hud = src static_inventory += using - zone_select = new /obj/screen/zone_sel/alien() + zone_select = new /atom/movable/screen/zone_sel/alien() zone_select.hud = src zone_select.update_icon() static_inventory += zone_select diff --git a/code/_onclick/hud/blob_overmind.dm b/code/_onclick/hud/blob_overmind.dm index b9118da5f1..f4d6ffc919 100644 --- a/code/_onclick/hud/blob_overmind.dm +++ b/code/_onclick/hud/blob_overmind.dm @@ -1,39 +1,39 @@ -/obj/screen/blob +/atom/movable/screen/blob icon = 'icons/mob/blob.dmi' -/obj/screen/blob/MouseEntered(location,control,params) +/atom/movable/screen/blob/MouseEntered(location,control,params) openToolTip(usr,src,params,title = name,content = desc, theme = "blob") -/obj/screen/blob/MouseExited() +/atom/movable/screen/blob/MouseExited() closeToolTip(usr) -/obj/screen/blob/BlobHelp +/atom/movable/screen/blob/BlobHelp icon_state = "ui_help" name = "Blob Help" desc = "Help on playing blob!" -/obj/screen/blob/BlobHelp/Click() +/atom/movable/screen/blob/BlobHelp/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.blob_help() -/obj/screen/blob/JumpToNode +/atom/movable/screen/blob/JumpToNode icon_state = "ui_tonode" name = "Jump to Node" desc = "Moves your camera to a selected blob node." -/obj/screen/blob/JumpToNode/Click() +/atom/movable/screen/blob/JumpToNode/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.jump_to_node() -/obj/screen/blob/JumpToCore +/atom/movable/screen/blob/JumpToCore icon_state = "ui_tocore" name = "Jump to Core" desc = "Moves your camera to your blob core." -/obj/screen/blob/JumpToCore/MouseEntered(location,control,params) +/atom/movable/screen/blob/JumpToCore/MouseEntered(location,control,params) if(hud && hud.mymob && isovermind(hud.mymob)) var/mob/camera/blob/B = hud.mymob if(!B.placed) @@ -44,59 +44,59 @@ desc = initial(desc) ..() -/obj/screen/blob/JumpToCore/Click() +/atom/movable/screen/blob/JumpToCore/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr if(!B.placed) B.place_blob_core(0) B.transport_core() -/obj/screen/blob/Blobbernaut +/atom/movable/screen/blob/Blobbernaut icon_state = "ui_blobbernaut" name = "Produce Blobbernaut (40)" desc = "Produces a strong, smart blobbernaut from a factory blob for 40 resources.
The factory blob used will become fragile and unable to produce spores." -/obj/screen/blob/Blobbernaut/Click() +/atom/movable/screen/blob/Blobbernaut/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.create_blobbernaut() -/obj/screen/blob/ResourceBlob +/atom/movable/screen/blob/ResourceBlob icon_state = "ui_resource" name = "Produce Resource Blob (40)" desc = "Produces a resource blob for 40 resources.
Resource blobs will give you resources every few seconds." -/obj/screen/blob/ResourceBlob/Click() +/atom/movable/screen/blob/ResourceBlob/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.create_resource() -/obj/screen/blob/NodeBlob +/atom/movable/screen/blob/NodeBlob icon_state = "ui_node" name = "Produce Node Blob (50)" desc = "Produces a node blob for 50 resources.
Node blobs will expand and activate nearby resource and factory blobs." -/obj/screen/blob/NodeBlob/Click() +/atom/movable/screen/blob/NodeBlob/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.create_node() -/obj/screen/blob/FactoryBlob +/atom/movable/screen/blob/FactoryBlob icon_state = "ui_factory" name = "Produce Factory Blob (60)" desc = "Produces a factory blob for 60 resources.
Factory blobs will produce spores every few seconds." -/obj/screen/blob/FactoryBlob/Click() +/atom/movable/screen/blob/FactoryBlob/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.create_factory() -/obj/screen/blob/ReadaptStrain +/atom/movable/screen/blob/ReadaptStrain icon_state = "ui_chemswap" name = "Readapt Strain (40)" desc = "Allows you to choose a new strain from 4 random choices for 40 resources." -/obj/screen/blob/ReadaptStrain/MouseEntered(location,control,params) +/atom/movable/screen/blob/ReadaptStrain/MouseEntered(location,control,params) if(hud && hud.mymob && isovermind(hud.mymob)) var/mob/camera/blob/B = hud.mymob if(B.free_strain_rerolls) @@ -107,26 +107,26 @@ desc = initial(desc) ..() -/obj/screen/blob/ReadaptStrain/Click() +/atom/movable/screen/blob/ReadaptStrain/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.strain_reroll() -/obj/screen/blob/RelocateCore +/atom/movable/screen/blob/RelocateCore icon_state = "ui_swap" name = "Relocate Core (80)" desc = "Swaps a node and your core for 80 resources." -/obj/screen/blob/RelocateCore/Click() +/atom/movable/screen/blob/RelocateCore/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.relocate_core() /datum/hud/blob_overmind/New(mob/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using - blobpwrdisplay = new /obj/screen() + blobpwrdisplay = new /atom/movable/screen() blobpwrdisplay.name = "blob power" blobpwrdisplay.icon_state = "block" blobpwrdisplay.screen_loc = ui_health @@ -136,51 +136,51 @@ blobpwrdisplay.hud = src infodisplay += blobpwrdisplay - healths = new /obj/screen/healths/blob() + healths = new /atom/movable/screen/healths/blob() healths.hud = src infodisplay += healths - using = new /obj/screen/blob/BlobHelp() + using = new /atom/movable/screen/blob/BlobHelp() using.screen_loc = "WEST:6,NORTH:-3" using.hud = src static_inventory += using - using = new /obj/screen/blob/JumpToNode() + using = new /atom/movable/screen/blob/JumpToNode() using.screen_loc = ui_inventory using.hud = src static_inventory += using - using = new /obj/screen/blob/JumpToCore() + using = new /atom/movable/screen/blob/JumpToCore() using.screen_loc = ui_zonesel using.hud = src static_inventory += using - using = new /obj/screen/blob/Blobbernaut() + using = new /atom/movable/screen/blob/Blobbernaut() using.screen_loc = ui_belt using.hud = src static_inventory += using - using = new /obj/screen/blob/ResourceBlob() + using = new /atom/movable/screen/blob/ResourceBlob() using.screen_loc = ui_back using.hud = src static_inventory += using - using = new /obj/screen/blob/NodeBlob() + using = new /atom/movable/screen/blob/NodeBlob() using.screen_loc = ui_hand_position(2) using.hud = src static_inventory += using - using = new /obj/screen/blob/FactoryBlob() + using = new /atom/movable/screen/blob/FactoryBlob() using.screen_loc = ui_hand_position(1) using.hud = src static_inventory += using - using = new /obj/screen/blob/ReadaptStrain() + using = new /atom/movable/screen/blob/ReadaptStrain() using.screen_loc = ui_storage1 using.hud = src static_inventory += using - using = new /obj/screen/blob/RelocateCore() + using = new /atom/movable/screen/blob/RelocateCore() using.screen_loc = ui_storage2 using.hud = src static_inventory += using diff --git a/code/_onclick/hud/blobbernauthud.dm b/code/_onclick/hud/blobbernauthud.dm index ed45d5b1f6..430e8e81e7 100644 --- a/code/_onclick/hud/blobbernauthud.dm +++ b/code/_onclick/hud/blobbernauthud.dm @@ -2,10 +2,10 @@ /datum/hud/blobbernaut/New(mob/owner) ..() - blobpwrdisplay = new /obj/screen/healths/blob/naut/core() + blobpwrdisplay = new /atom/movable/screen/healths/blob/naut/core() blobpwrdisplay.hud = src infodisplay += blobpwrdisplay - healths = new /obj/screen/healths/blob/naut() + healths = new /atom/movable/screen/healths/blob/naut() healths.hud = src infodisplay += healths diff --git a/code/_onclick/hud/clockwork_marauder.dm b/code/_onclick/hud/clockwork_marauder.dm index b1b24cc58b..de9cb65c75 100644 --- a/code/_onclick/hud/clockwork_marauder.dm +++ b/code/_onclick/hud/clockwork_marauder.dm @@ -1,20 +1,20 @@ /datum/hud/marauder - var/obj/screen/hosthealth - var/obj/screen/blockchance - var/obj/screen/counterchance + var/atom/movable/screen/hosthealth + var/atom/movable/screen/blockchance + var/atom/movable/screen/counterchance /datum/hud/marauder/New(mob/living/simple_animal/hostile/clockwork/guardian/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using - healths = new /obj/screen/healths/clock() + healths = new /atom/movable/screen/healths/clock() infodisplay += healths - hosthealth = new /obj/screen/healths/clock() + hosthealth = new /atom/movable/screen/healths/clock() hosthealth.screen_loc = ui_internal infodisplay += hosthealth - using = new /obj/screen/marauder/emerge() + using = new /atom/movable/screen/marauder/emerge() using.screen_loc = ui_zonesel static_inventory += using @@ -28,15 +28,15 @@ if(client && !hud_used) hud_used = new /datum/hud/marauder(src, ui_style2icon(client.prefs.UI_style)) -/obj/screen/marauder +/atom/movable/screen/marauder icon = 'icons/mob/clockwork_mobs.dmi' -/obj/screen/marauder/emerge +/atom/movable/screen/marauder/emerge icon_state = "clockguard_emerge" name = "Emerge/Return" desc = "Emerge or Return." -/obj/screen/marauder/emerge/Click() +/atom/movable/screen/marauder/emerge/Click() if(istype(usr, /mob/living/simple_animal/hostile/clockwork/guardian)) var/mob/living/simple_animal/hostile/clockwork/guardian/G = usr if(G.is_in_host()) diff --git a/code/_onclick/hud/constructs.dm b/code/_onclick/hud/constructs.dm index 06e657d136..31f1060f17 100644 --- a/code/_onclick/hud/constructs.dm +++ b/code/_onclick/hud/constructs.dm @@ -3,13 +3,13 @@ /datum/hud/constructs/New(mob/owner) ..() - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = ui_style pull_icon.hud = src pull_icon.update_icon() pull_icon.screen_loc = ui_construct_pull static_inventory += pull_icon - healths = new /obj/screen/healths/construct() + healths = new /atom/movable/screen/healths/construct() healths.hud = src infodisplay += healths diff --git a/code/_onclick/hud/credits.dm b/code/_onclick/hud/credits.dm index 31ea453d4a..974f158323 100644 --- a/code/_onclick/hud/credits.dm +++ b/code/_onclick/hud/credits.dm @@ -18,7 +18,7 @@ for(var/I in credit_order_for_this_round) if(!credits) return - _credits += new /obj/screen/credit(null, I, src, credits_icon) + _credits += new /atom/movable/screen/credit(null, I, src, credits_icon) sleep(CREDIT_SPAWN_SPEED) sleep(CREDIT_ROLL_SPEED - CREDIT_SPAWN_SPEED) remove_verb(src, /client/proc/ClearCredits) @@ -31,7 +31,7 @@ QDEL_LIST(credits) credits = null -/obj/screen/credit +/atom/movable/screen/credit mouse_opacity = MOUSE_OPACITY_TRANSPARENT alpha = 0 screen_loc = "12,1" @@ -39,7 +39,7 @@ var/client/parent var/matrix/target -/obj/screen/credit/Initialize(mapload, credited, client/P, icon/I) +/atom/movable/screen/credit/Initialize(mapload, credited, client/P, icon/I) . = ..() icon = I parent = P @@ -57,7 +57,7 @@ QDEL_IN(src, CREDIT_ROLL_SPEED) P.screen += src -/obj/screen/credit/Destroy() +/atom/movable/screen/credit/Destroy() var/client/P = parent P.screen -= src icon = null @@ -65,5 +65,5 @@ parent = null return ..() -/obj/screen/credit/proc/FadeOut() +/atom/movable/screen/credit/proc/FadeOut() animate(src, alpha = 0, transform = target, time = CREDIT_EASE_DURATION) diff --git a/code/_onclick/hud/devil.dm b/code/_onclick/hud/devil.dm index fd2146424c..574f5dd1fd 100644 --- a/code/_onclick/hud/devil.dm +++ b/code/_onclick/hud/devil.dm @@ -4,15 +4,15 @@ /datum/hud/devil/New(mob/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using - using = new /obj/screen/drop() + using = new /atom/movable/screen/drop() using.icon = ui_style using.screen_loc = ui_drone_drop using.hud = src static_inventory += using - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = ui_style pull_icon.hud = src pull_icon.update_icon() @@ -21,7 +21,7 @@ build_hand_slots() - using = new /obj/screen/inventory() + using = new /atom/movable/screen/inventory() using.name = "hand" using.icon = ui_style using.icon_state = "swap_1_m" @@ -31,7 +31,7 @@ using.hud = src static_inventory += using - using = new /obj/screen/inventory() + using = new /atom/movable/screen/inventory() using.name = "hand" using.icon = ui_style using.icon_state = "swap_2" @@ -41,15 +41,15 @@ using.hud = src static_inventory += using - zone_select = new /obj/screen/zone_sel() + zone_select = new /atom/movable/screen/zone_sel() zone_select.icon = ui_style zone_select.hud = src zone_select.update_icon() - lingchemdisplay = new /obj/screen/ling/chems() + lingchemdisplay = new /atom/movable/screen/ling/chems() lingchemdisplay.hud = src - devilsouldisplay = new /obj/screen/devil/soul_counter + devilsouldisplay = new /atom/movable/screen/devil/soul_counter devilsouldisplay.hud = src infodisplay += devilsouldisplay diff --git a/code/_onclick/hud/drones.dm b/code/_onclick/hud/drones.dm index bcdfa084d3..849936d4ed 100644 --- a/code/_onclick/hud/drones.dm +++ b/code/_onclick/hud/drones.dm @@ -1,8 +1,8 @@ /datum/hud/dextrous/drone/New(mob/owner) ..() - var/obj/screen/inventory/inv_box + var/atom/movable/screen/inventory/inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "internal storage" inv_box.icon = ui_style inv_box.icon_state = "suit_storage" @@ -11,7 +11,7 @@ inv_box.slot_id = SLOT_GENERC_DEXTROUS_STORAGE static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "head/mask" inv_box.icon = ui_style inv_box.icon_state = "mask" @@ -20,7 +20,7 @@ inv_box.slot_id = SLOT_HEAD static_inventory += inv_box - for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) inv.hud = src inv_slots[inv.slot_id] = inv diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index 076c949f8e..a7247ccf09 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -1,5 +1,5 @@ /mob/proc/overlay_fullscreen(category, type, severity) - var/obj/screen/fullscreen/screen = screens[category] + var/atom/movable/screen/fullscreen/screen = screens[category] if (!screen || screen.type != type) // needs to be recreated clear_fullscreen(category, FALSE) @@ -17,7 +17,7 @@ return screen /mob/proc/clear_fullscreen(category, animated = 10) - var/obj/screen/fullscreen/screen = screens[category] + var/atom/movable/screen/fullscreen/screen = screens[category] if(!screen) return @@ -31,7 +31,7 @@ client.screen -= screen qdel(screen) -/mob/proc/clear_fullscreen_after_animate(obj/screen/fullscreen/screen) +/mob/proc/clear_fullscreen_after_animate(atom/movable/screen/fullscreen/screen) if(client) client.screen -= screen qdel(screen) @@ -47,7 +47,7 @@ /mob/proc/reload_fullscreen() if(client) - var/obj/screen/fullscreen/screen + var/atom/movable/screen/fullscreen/screen for(var/category in screens) screen = screens[category] if(screen.should_show_to(src)) @@ -56,7 +56,7 @@ else client.screen -= screen -/obj/screen/fullscreen +/atom/movable/screen/fullscreen icon = 'icons/mob/screen_full.dmi' icon_state = "default" screen_loc = "CENTER-7,CENTER-7" @@ -67,89 +67,89 @@ var/severity = 0 var/show_when_dead = FALSE -/obj/screen/fullscreen/proc/update_for_view(client_view) +/atom/movable/screen/fullscreen/proc/update_for_view(client_view) if (screen_loc == "CENTER-7,CENTER-7" && view != client_view) var/list/actualview = getviewsize(client_view) view = client_view transform = matrix(actualview[1]/FULLSCREEN_OVERLAY_RESOLUTION_X, 0, 0, 0, actualview[2]/FULLSCREEN_OVERLAY_RESOLUTION_Y, 0) -/obj/screen/fullscreen/proc/should_show_to(mob/mymob) +/atom/movable/screen/fullscreen/proc/should_show_to(mob/mymob) if(!show_when_dead && mymob.stat == DEAD) return FALSE return TRUE -/obj/screen/fullscreen/Destroy() +/atom/movable/screen/fullscreen/Destroy() severity = 0 . = ..() -/obj/screen/fullscreen/brute +/atom/movable/screen/fullscreen/brute icon_state = "brutedamageoverlay" layer = UI_DAMAGE_LAYER plane = FULLSCREEN_PLANE -/obj/screen/fullscreen/oxy +/atom/movable/screen/fullscreen/oxy icon_state = "oxydamageoverlay" layer = UI_DAMAGE_LAYER plane = FULLSCREEN_PLANE -/obj/screen/fullscreen/crit +/atom/movable/screen/fullscreen/crit icon_state = "passage" layer = CRIT_LAYER plane = FULLSCREEN_PLANE -/obj/screen/fullscreen/crit/vision +/atom/movable/screen/fullscreen/crit/vision icon_state = "oxydamageoverlay" layer = BLIND_LAYER -/obj/screen/fullscreen/blind +/atom/movable/screen/fullscreen/blind icon_state = "blackimageoverlay" layer = BLIND_LAYER plane = FULLSCREEN_PLANE -/obj/screen/fullscreen/curse +/atom/movable/screen/fullscreen/curse icon_state = "curse" layer = CURSE_LAYER plane = FULLSCREEN_PLANE -/obj/screen/fullscreen/impaired +/atom/movable/screen/fullscreen/impaired icon_state = "impairedoverlay" -/obj/screen/fullscreen/blurry +/atom/movable/screen/fullscreen/blurry icon = 'icons/mob/screen_gen.dmi' screen_loc = "WEST,SOUTH to EAST,NORTH" icon_state = "blurry" -/obj/screen/fullscreen/flash +/atom/movable/screen/fullscreen/flash icon = 'icons/mob/screen_gen.dmi' screen_loc = "WEST,SOUTH to EAST,NORTH" icon_state = "flash" -/obj/screen/fullscreen/flash/static +/atom/movable/screen/fullscreen/flash/static icon = 'icons/mob/screen_gen.dmi' screen_loc = "WEST,SOUTH to EAST,NORTH" icon_state = "noise" -/obj/screen/fullscreen/high +/atom/movable/screen/fullscreen/high icon = 'icons/mob/screen_gen.dmi' screen_loc = "WEST,SOUTH to EAST,NORTH" icon_state = "druggy" -/obj/screen/fullscreen/color_vision +/atom/movable/screen/fullscreen/color_vision icon = 'icons/mob/screen_gen.dmi' screen_loc = "WEST,SOUTH to EAST,NORTH" icon_state = "flash" alpha = 80 -/obj/screen/fullscreen/color_vision/green +/atom/movable/screen/fullscreen/color_vision/green color = "#00ff00" -/obj/screen/fullscreen/color_vision/red +/atom/movable/screen/fullscreen/color_vision/red color = "#ff0000" -/obj/screen/fullscreen/color_vision/blue +/atom/movable/screen/fullscreen/color_vision/blue color = "#0000ff" -/obj/screen/fullscreen/cinematic_backdrop +/atom/movable/screen/fullscreen/cinematic_backdrop icon = 'icons/mob/screen_gen.dmi' screen_loc = "WEST,SOUTH to EAST,NORTH" icon_state = "flash" @@ -158,7 +158,7 @@ color = "#000000" show_when_dead = TRUE -/obj/screen/fullscreen/lighting_backdrop +/atom/movable/screen/fullscreen/lighting_backdrop icon = 'icons/mob/screen_gen.dmi' icon_state = "flash" transform = matrix(200, 0, 0, 0, 200, 0) @@ -167,18 +167,18 @@ show_when_dead = TRUE //Provides darkness to the back of the lighting plane -/obj/screen/fullscreen/lighting_backdrop/lit +/atom/movable/screen/fullscreen/lighting_backdrop/lit invisibility = INVISIBILITY_LIGHTING layer = BACKGROUND_LAYER+21 color = "#000" show_when_dead = TRUE //Provides whiteness in case you don't see lights so everything is still visible -/obj/screen/fullscreen/lighting_backdrop/unlit +/atom/movable/screen/fullscreen/lighting_backdrop/unlit layer = BACKGROUND_LAYER+20 show_when_dead = TRUE -/obj/screen/fullscreen/see_through_darkness +/atom/movable/screen/fullscreen/see_through_darkness icon_state = "nightvision" plane = LIGHTING_PLANE layer = LIGHTING_LAYER diff --git a/code/_onclick/hud/generic_dextrous.dm b/code/_onclick/hud/generic_dextrous.dm index e9f325fb10..88407bb04c 100644 --- a/code/_onclick/hud/generic_dextrous.dm +++ b/code/_onclick/hud/generic_dextrous.dm @@ -1,15 +1,15 @@ //Used for normal mobs that have hands. /datum/hud/dextrous/New(mob/living/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using - using = new /obj/screen/drop() + using = new /atom/movable/screen/drop() using.icon = ui_style using.screen_loc = ui_drone_drop using.hud = src static_inventory += using - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = ui_style pull_icon.hud = src pull_icon.update_icon() @@ -18,14 +18,14 @@ build_hand_slots() - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_1_m" using.screen_loc = ui_swaphand_position(owner,1) using.hud = src static_inventory += using - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_2" using.screen_loc = ui_swaphand_position(owner,2) @@ -35,29 +35,29 @@ if(mymob.possible_a_intents) if(mymob.possible_a_intents.len == 4) // All possible intents - full intent selector - action_intent = new /obj/screen/act_intent/segmented + action_intent = new /atom/movable/screen/act_intent/segmented else - action_intent = new /obj/screen/act_intent + action_intent = new /atom/movable/screen/act_intent action_intent.icon = ui_style action_intent.icon_state = mymob.a_intent action_intent.hud = src static_inventory += action_intent - zone_select = new /obj/screen/zone_sel() + zone_select = new /atom/movable/screen/zone_sel() zone_select.icon = ui_style zone_select.hud = src zone_select.update_icon() static_inventory += zone_select - using = new /obj/screen/area_creator + using = new /atom/movable/screen/area_creator using.icon = ui_style using.hud = src static_inventory += using mymob.client.screen = list() - for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) inv.hud = src inv_slots[inv.slot_id] = inv diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm index 0cdac111b0..b9514bff46 100644 --- a/code/_onclick/hud/ghost.dm +++ b/code/_onclick/hud/ghost.dm @@ -1,79 +1,79 @@ -/obj/screen/ghost +/atom/movable/screen/ghost icon = 'icons/mob/screen_ghost.dmi' -/obj/screen/ghost/MouseEntered() +/atom/movable/screen/ghost/MouseEntered() flick(icon_state + "_anim", src) -/obj/screen/ghost/jumptomob +/atom/movable/screen/ghost/jumptomob name = "Jump to mob" icon_state = "jumptomob" -/obj/screen/ghost/jumptomob/Click() +/atom/movable/screen/ghost/jumptomob/Click() var/mob/dead/observer/G = usr G.jumptomob() -/obj/screen/ghost/orbit +/atom/movable/screen/ghost/orbit name = "Orbit" icon_state = "orbit" -/obj/screen/ghost/orbit/Click() +/atom/movable/screen/ghost/orbit/Click() var/mob/dead/observer/G = usr G.follow() -/obj/screen/ghost/reenter_corpse +/atom/movable/screen/ghost/reenter_corpse name = "Reenter corpse" icon_state = "reenter_corpse" -/obj/screen/ghost/reenter_corpse/Click() +/atom/movable/screen/ghost/reenter_corpse/Click() var/mob/dead/observer/G = usr G.reenter_corpse() -/obj/screen/ghost/teleport +/atom/movable/screen/ghost/teleport name = "Teleport" icon_state = "teleport" -/obj/screen/ghost/teleport/Click() +/atom/movable/screen/ghost/teleport/Click() var/mob/dead/observer/G = usr G.dead_tele() -/obj/screen/ghost/spawners +/atom/movable/screen/ghost/spawners name = "Ghost role spawners" icon_state = "spawners" -/obj/screen/ghost/spawners/Click() +/atom/movable/screen/ghost/spawners/Click() var/mob/dead/observer/G = usr G.open_spawners_menu() /datum/hud/ghost/New(mob/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using - using = new /obj/screen/ghost/jumptomob() + using = new /atom/movable/screen/ghost/jumptomob() using.screen_loc = ui_ghost_jumptomob using.hud = src static_inventory += using - using = new /obj/screen/ghost/orbit() + using = new /atom/movable/screen/ghost/orbit() using.screen_loc = ui_ghost_orbit using.hud = src static_inventory += using - using = new /obj/screen/ghost/reenter_corpse() + using = new /atom/movable/screen/ghost/reenter_corpse() using.screen_loc = ui_ghost_reenter_corpse using.hud = src static_inventory += using - using = new /obj/screen/ghost/teleport() + using = new /atom/movable/screen/ghost/teleport() using.screen_loc = ui_ghost_teleport using.hud = src static_inventory += using - using = new /obj/screen/ghost/spawners() + using = new /atom/movable/screen/ghost/spawners() using.screen_loc = ui_ghost_spawners using.hud = src static_inventory += using - using = new /obj/screen/language_menu + using = new /atom/movable/screen/language_menu using.icon = ui_style using.hud = src static_inventory += using diff --git a/code/_onclick/hud/guardian.dm b/code/_onclick/hud/guardian.dm index 35b40ee5db..7f360b48dc 100644 --- a/code/_onclick/hud/guardian.dm +++ b/code/_onclick/hud/guardian.dm @@ -1,18 +1,18 @@ /datum/hud/guardian/New(mob/living/simple_animal/hostile/guardian/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using - healths = new /obj/screen/healths/guardian() + healths = new /atom/movable/screen/healths/guardian() healths.hud = src infodisplay += healths - using = new /obj/screen/guardian/Manifest() + using = new /atom/movable/screen/guardian/Manifest() using.screen_loc = ui_hand_position(2) using.hud = src static_inventory += using - using = new /obj/screen/guardian/Recall() + using = new /atom/movable/screen/guardian/Recall() using.screen_loc = ui_hand_position(1) using.hud = src static_inventory += using @@ -22,23 +22,23 @@ using.hud = src static_inventory += using - using = new /obj/screen/guardian/ToggleLight() + using = new /atom/movable/screen/guardian/ToggleLight() using.screen_loc = ui_inventory using.hud = src static_inventory += using - using = new /obj/screen/guardian/Communicate() + using = new /atom/movable/screen/guardian/Communicate() using.screen_loc = ui_back using.hud = src static_inventory += using /datum/hud/dextrous/guardian/New(mob/living/simple_animal/hostile/guardian/owner) //for a dextrous guardian ..() - var/obj/screen/using + var/atom/movable/screen/using if(istype(owner, /mob/living/simple_animal/hostile/guardian/dextrous)) - var/obj/screen/inventory/inv_box + var/atom/movable/screen/inventory/inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "internal storage" inv_box.icon = ui_style inv_box.icon_state = "suit_storage" @@ -46,24 +46,24 @@ inv_box.slot_id = SLOT_GENERC_DEXTROUS_STORAGE static_inventory += inv_box - using = new /obj/screen/guardian/Communicate() + using = new /atom/movable/screen/guardian/Communicate() using.screen_loc = ui_sstore1 static_inventory += using else - using = new /obj/screen/guardian/Communicate() + using = new /atom/movable/screen/guardian/Communicate() using.screen_loc = ui_id static_inventory += using - healths = new /obj/screen/healths/guardian() + healths = new /atom/movable/screen/healths/guardian() infodisplay += healths - using = new /obj/screen/guardian/Manifest() + using = new /atom/movable/screen/guardian/Manifest() using.screen_loc = ui_belt static_inventory += using - using = new /obj/screen/guardian/Recall() + using = new /atom/movable/screen/guardian/Recall() using.screen_loc = ui_back static_inventory += using @@ -71,7 +71,7 @@ using.screen_loc = ui_storage2 static_inventory += using - using = new /obj/screen/guardian/ToggleLight() + using = new /atom/movable/screen/guardian/ToggleLight() using.screen_loc = ui_inventory static_inventory += using @@ -91,65 +91,65 @@ ..() -/obj/screen/guardian +/atom/movable/screen/guardian icon = 'icons/mob/guardian.dmi' -/obj/screen/guardian/Manifest +/atom/movable/screen/guardian/Manifest icon_state = "manifest" name = "Manifest" desc = "Spring forth into battle!" -/obj/screen/guardian/Manifest/Click() +/atom/movable/screen/guardian/Manifest/Click() if(isguardian(usr)) var/mob/living/simple_animal/hostile/guardian/G = usr G.Manifest() -/obj/screen/guardian/Recall +/atom/movable/screen/guardian/Recall icon_state = "recall" name = "Recall" desc = "Return to your user." -/obj/screen/guardian/Recall/Click() +/atom/movable/screen/guardian/Recall/Click() if(isguardian(usr)) var/mob/living/simple_animal/hostile/guardian/G = usr G.Recall() -/obj/screen/guardian/ToggleMode +/atom/movable/screen/guardian/ToggleMode icon_state = "toggle" name = "Toggle Mode" desc = "Switch between ability modes." -/obj/screen/guardian/ToggleMode/Click() +/atom/movable/screen/guardian/ToggleMode/Click() if(isguardian(usr)) var/mob/living/simple_animal/hostile/guardian/G = usr G.ToggleMode() -/obj/screen/guardian/ToggleMode/Inactive +/atom/movable/screen/guardian/ToggleMode/Inactive icon_state = "notoggle" //greyed out so it doesn't look like it'll work -/obj/screen/guardian/ToggleMode/Assassin +/atom/movable/screen/guardian/ToggleMode/Assassin icon_state = "stealth" name = "Toggle Stealth" desc = "Enter or exit stealth." -/obj/screen/guardian/Communicate +/atom/movable/screen/guardian/Communicate icon_state = "communicate" name = "Communicate" desc = "Communicate telepathically with your user." -/obj/screen/guardian/Communicate/Click() +/atom/movable/screen/guardian/Communicate/Click() if(isguardian(usr)) var/mob/living/simple_animal/hostile/guardian/G = usr G.Communicate() -/obj/screen/guardian/ToggleLight +/atom/movable/screen/guardian/ToggleLight icon_state = "light" name = "Toggle Light" desc = "Glow like star dust." -/obj/screen/guardian/ToggleLight/Click() +/atom/movable/screen/guardian/ToggleLight/Click() if(isguardian(usr)) var/mob/living/simple_animal/hostile/guardian/G = usr G.ToggleLight() diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 57335a966e..36a3cd1f1a 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -25,38 +25,38 @@ GLOBAL_LIST_INIT(available_ui_styles, list( var/inventory_shown = FALSE //Equipped item inventory var/hotkey_ui_hidden = FALSE //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) - var/obj/screen/ling/chems/lingchemdisplay - var/obj/screen/ling/sting/lingstingdisplay + var/atom/movable/screen/ling/chems/lingchemdisplay + var/atom/movable/screen/ling/sting/lingstingdisplay - var/obj/screen/blobpwrdisplay + var/atom/movable/screen/blobpwrdisplay - var/obj/screen/alien_plasma_display - var/obj/screen/alien_queen_finder + var/atom/movable/screen/alien_plasma_display + var/atom/movable/screen/alien_queen_finder - var/obj/screen/devil/soul_counter/devilsouldisplay + var/atom/movable/screen/devil/soul_counter/devilsouldisplay - var/obj/screen/action_intent - var/obj/screen/zone_select - var/obj/screen/pull_icon - var/obj/screen/rest_icon - var/obj/screen/throw_icon - var/obj/screen/module_store_icon + var/atom/movable/screen/action_intent + var/atom/movable/screen/zone_select + var/atom/movable/screen/pull_icon + var/atom/movable/screen/rest_icon + var/atom/movable/screen/throw_icon + var/atom/movable/screen/module_store_icon var/list/static_inventory = list() //the screen objects which are static var/list/toggleable_inventory = list() //the screen objects which can be hidden - var/list/obj/screen/hotkeybuttons = list() //the buttons that can be used via hotkeys + var/list/atom/movable/screen/hotkeybuttons = list() //the buttons that can be used via hotkeys var/list/infodisplay = list() //the screen objects that display mob info (health, alien plasma, etc...) var/list/screenoverlays = list() //the screen objects used as whole screen overlays (flash, damageoverlay, etc...) - var/list/inv_slots[SLOTS_AMT] // /obj/screen/inventory objects, ordered by their slot ID. - var/list/hand_slots // /obj/screen/inventory/hand objects, assoc list of "[held_index]" = object - var/list/obj/screen/plane_master/plane_masters = list() // see "appearance_flags" in the ref, assoc list of "[plane]" = object + var/list/inv_slots[SLOTS_AMT] // /atom/movable/screen/inventory objects, ordered by their slot ID. + var/list/hand_slots // /atom/movable/screen/inventory/hand objects, assoc list of "[held_index]" = object + var/list/atom/movable/screen/plane_master/plane_masters = list() // see "appearance_flags" in the ref, assoc list of "[plane]" = object - var/obj/screen/movable/action_button/hide_toggle/hide_actions_toggle + var/atom/movable/screen/movable/action_button/hide_toggle/hide_actions_toggle var/action_buttons_hidden = FALSE - var/obj/screen/healths - var/obj/screen/healthdoll - var/obj/screen/internals + var/atom/movable/screen/healths + var/atom/movable/screen/healthdoll + var/atom/movable/screen/internals // subtypes can override this to force a specific UI style var/ui_style @@ -75,8 +75,8 @@ GLOBAL_LIST_INIT(available_ui_styles, list( hand_slots = list() - for(var/mytype in subtypesof(/obj/screen/plane_master)) - var/obj/screen/plane_master/instance = new mytype() + for(var/mytype in subtypesof(/atom/movable/screen/plane_master)) + var/atom/movable/screen/plane_master/instance = new mytype() plane_masters["[instance.plane]"] = instance instance.backdrop(mymob) @@ -169,7 +169,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( //These ones are a part of 'static_inventory', 'toggleable_inventory' or 'hotkeybuttons' but we want them to stay for(var/h in hand_slots) - var/obj/screen/hand = hand_slots[h] + var/atom/movable/screen/hand = hand_slots[h] if(hand) screenmob.client.screen += hand if(action_intent) @@ -207,7 +207,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( /datum/hud/proc/plane_masters_update() // Plane masters are always shown to OUR mob, never to observers for(var/thing in plane_masters) - var/obj/screen/plane_master/PM = plane_masters[thing] + var/atom/movable/screen/plane_master/PM = plane_masters[thing] PM.backdrop(mymob) mymob.client.screen += PM @@ -261,13 +261,13 @@ GLOBAL_LIST_INIT(available_ui_styles, list( //9/10 this is only called once per mob and only for 2 hands /datum/hud/proc/build_hand_slots() for(var/h in hand_slots) - var/obj/screen/inventory/hand/H = hand_slots[h] + var/atom/movable/screen/inventory/hand/H = hand_slots[h] if(H) static_inventory -= H hand_slots = list() - var/obj/screen/inventory/hand/hand_box + var/atom/movable/screen/inventory/hand/hand_box for(var/i in 1 to mymob.held_items.len) - hand_box = new /obj/screen/inventory/hand() + hand_box = new /atom/movable/screen/inventory/hand() hand_box.name = mymob.get_held_index_name(i) hand_box.icon = ui_style hand_box.icon_state = "hand_[mymob.held_index_to_dir(i)]" @@ -279,10 +279,10 @@ GLOBAL_LIST_INIT(available_ui_styles, list( hand_box.update_icon() var/i = 1 - for(var/obj/screen/swap_hand/SH in static_inventory) + for(var/atom/movable/screen/swap_hand/SH in static_inventory) SH.screen_loc = ui_swaphand_position(mymob,!(i % 2) ? 2: 1) i++ - for(var/obj/screen/human/equip/E in static_inventory) + for(var/atom/movable/screen/human/equip/E in static_inventory) E.screen_loc = ui_equip_position(mymob) if(ismob(mymob) && mymob.hud_used == src) diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 841a3e8303..e4a9dc24e8 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -1,11 +1,11 @@ -/obj/screen/human +/atom/movable/screen/human icon = 'icons/mob/screen_midnight.dmi' -/obj/screen/human/toggle +/atom/movable/screen/human/toggle name = "toggle" icon_state = "toggle" -/obj/screen/human/toggle/Click() +/atom/movable/screen/human/toggle/Click() var/mob/targetmob = usr @@ -23,26 +23,26 @@ targetmob.hud_used.hidden_inventory_update(usr) -/obj/screen/human/equip +/atom/movable/screen/human/equip name = "equip" icon_state = "act_equip" -/obj/screen/human/equip/Click() +/atom/movable/screen/human/equip/Click() if(ismecha(usr.loc)) // stops inventory actions in a mech return 1 var/mob/living/carbon/human/H = usr H.quick_equip() -/obj/screen/devil +/atom/movable/screen/devil invisibility = INVISIBILITY_ABSTRACT -/obj/screen/devil/soul_counter +/atom/movable/screen/devil/soul_counter icon = 'icons/mob/screen_gen.dmi' name = "souls owned" icon_state = "Devil-6" screen_loc = ui_devilsouldisplay -/obj/screen/devil/soul_counter/proc/update_counter(souls = 0) +/atom/movable/screen/devil/soul_counter/proc/update_counter(souls = 0) invisibility = 0 maptext = "
[souls]
" switch(souls) @@ -59,53 +59,53 @@ else icon_state = "Devil-6" -/obj/screen/devil/soul_counter/proc/clear() +/atom/movable/screen/devil/soul_counter/proc/clear() invisibility = INVISIBILITY_ABSTRACT -/obj/screen/ling +/atom/movable/screen/ling invisibility = INVISIBILITY_ABSTRACT -/obj/screen/ling/sting +/atom/movable/screen/ling/sting name = "current sting" screen_loc = ui_lingstingdisplay -/obj/screen/ling/sting/Click() +/atom/movable/screen/ling/sting/Click() if(isobserver(usr)) return var/mob/living/carbon/U = usr U.unset_sting() -/obj/screen/ling/chems +/atom/movable/screen/ling/chems name = "chemical storage" icon_state = "power_display" screen_loc = ui_lingchemdisplay /datum/hud/human/New(mob/living/carbon/human/owner) ..() - owner.overlay_fullscreen("see_through_darkness", /obj/screen/fullscreen/see_through_darkness) + owner.overlay_fullscreen("see_through_darkness", /atom/movable/screen/fullscreen/see_through_darkness) var/widescreenlayout = FALSE //CIT CHANGE - adds support for different hud layouts depending on widescreen pref if(owner.client && owner.client.prefs && owner.client.prefs.widescreenpref) //CIT CHANGE - ditto widescreenlayout = TRUE // CIT CHANGE - ditto - var/obj/screen/using - var/obj/screen/inventory/inv_box + var/atom/movable/screen/using + var/atom/movable/screen/inventory/inv_box - using = new/obj/screen/language_menu + using = new/atom/movable/screen/language_menu using.icon = ui_style if(!widescreenlayout) // CIT CHANGE using.screen_loc = ui_boxlang // CIT CHANGE using.hud = src static_inventory += using - using = new /obj/screen/area_creator + using = new /atom/movable/screen/area_creator using.icon = ui_style if(!widescreenlayout) // CIT CHANGE using.screen_loc = ui_boxarea // CIT CHANGE using.hud = src static_inventory += using - using = new /obj/screen/voretoggle() //We fancy Vore now + using = new /atom/movable/screen/voretoggle() //We fancy Vore now using.icon = tg_ui_icon_to_cit_ui(ui_style) using.screen_loc = ui_voremode if(!widescreenlayout) @@ -113,7 +113,7 @@ using.hud = src static_inventory += using - action_intent = new /obj/screen/act_intent/segmented + action_intent = new /atom/movable/screen/act_intent/segmented action_intent.icon_state = mymob.a_intent action_intent.hud = src static_inventory += action_intent @@ -132,13 +132,13 @@ resistdelay.screen_loc = ui_resistdelay static_inventory += resistdelay - using = new /obj/screen/drop() + using = new /atom/movable/screen/drop() using.icon = ui_style using.screen_loc = ui_drop_throw using.hud = src static_inventory += using - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "i_clothing" inv_box.icon = ui_style inv_box.slot_id = SLOT_W_UNIFORM @@ -146,7 +146,7 @@ inv_box.screen_loc = ui_iclothing toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "o_clothing" inv_box.icon = ui_style inv_box.slot_id = SLOT_WEAR_SUIT @@ -156,21 +156,21 @@ build_hand_slots() - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_1" using.screen_loc = ui_swaphand_position(owner,1) using.hud = src static_inventory += using - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_2" using.screen_loc = ui_swaphand_position(owner,2) using.hud = src static_inventory += using - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "id" inv_box.icon = ui_style inv_box.icon_state = "id" @@ -178,7 +178,7 @@ inv_box.slot_id = SLOT_WEAR_ID static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "mask" inv_box.icon = ui_style inv_box.icon_state = "mask" @@ -186,7 +186,7 @@ inv_box.slot_id = SLOT_WEAR_MASK toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "neck" inv_box.icon = ui_style inv_box.icon_state = "neck" @@ -194,7 +194,7 @@ inv_box.slot_id = SLOT_NECK toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "back" inv_box.icon = ui_style inv_box.icon_state = "back" @@ -202,7 +202,7 @@ inv_box.slot_id = SLOT_BACK static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "storage1" inv_box.icon = ui_style inv_box.icon_state = "pocket" @@ -210,7 +210,7 @@ inv_box.slot_id = SLOT_L_STORE static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "storage2" inv_box.icon = ui_style inv_box.icon_state = "pocket" @@ -218,7 +218,7 @@ inv_box.slot_id = SLOT_R_STORE static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "suit storage" inv_box.icon = ui_style inv_box.icon_state = "suit_storage" @@ -226,32 +226,32 @@ inv_box.slot_id = SLOT_S_STORE static_inventory += inv_box - using = new /obj/screen/resist() + using = new /atom/movable/screen/resist() using.icon = ui_style using.screen_loc = ui_overridden_resist // CIT CHANGE - changes this to overridden resist using.hud = src hotkeybuttons += using - using = new /obj/screen/rest() + using = new /atom/movable/screen/rest() using.icon = ui_style using.screen_loc = ui_pull_resist using.hud = src static_inventory += using //END OF CIT CHANGES - using = new /obj/screen/human/toggle() + using = new /atom/movable/screen/human/toggle() using.icon = ui_style using.screen_loc = ui_inventory using.hud = src static_inventory += using - using = new /obj/screen/human/equip() + using = new /atom/movable/screen/human/equip() using.icon = ui_style using.screen_loc = ui_equip_position(mymob) using.hud = src static_inventory += using - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "gloves" inv_box.icon = ui_style inv_box.icon_state = "gloves" @@ -259,7 +259,7 @@ inv_box.slot_id = SLOT_GLOVES toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "eyes" inv_box.icon = ui_style inv_box.icon_state = "glasses" @@ -267,7 +267,7 @@ inv_box.slot_id = SLOT_GLASSES toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "ears" inv_box.icon = ui_style inv_box.icon_state = "ears" @@ -275,7 +275,7 @@ inv_box.slot_id = SLOT_EARS toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "head" inv_box.icon = ui_style inv_box.icon_state = "head" @@ -283,7 +283,7 @@ inv_box.slot_id = SLOT_HEAD toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "shoes" inv_box.icon = ui_style inv_box.icon_state = "shoes" @@ -291,7 +291,7 @@ inv_box.slot_id = SLOT_SHOES toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "belt" inv_box.icon = ui_style inv_box.icon_state = "belt" @@ -300,72 +300,72 @@ inv_box.slot_id = SLOT_BELT static_inventory += inv_box - throw_icon = new /obj/screen/throw_catch() + throw_icon = new /atom/movable/screen/throw_catch() throw_icon.icon = ui_style throw_icon.screen_loc = ui_drop_throw throw_icon.hud = src hotkeybuttons += throw_icon - internals = new /obj/screen/internals() + internals = new /atom/movable/screen/internals() internals.hud = src infodisplay += internals - healths = new /obj/screen/healths() + healths = new /atom/movable/screen/healths() healths.hud = src infodisplay += healths - staminas = new /obj/screen/staminas() + staminas = new /atom/movable/screen/staminas() staminas.hud = src infodisplay += staminas if(!CONFIG_GET(flag/disable_stambuffer)) - staminabuffer = new /obj/screen/staminabuffer() + staminabuffer = new /atom/movable/screen/staminabuffer() staminabuffer.hud = src infodisplay += staminabuffer //END OF CIT CHANGES - healthdoll = new /obj/screen/healthdoll() + healthdoll = new /atom/movable/screen/healthdoll() healthdoll.hud = src infodisplay += healthdoll - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = ui_style pull_icon.hud = src pull_icon.update_icon() pull_icon.screen_loc = ui_pull_resist static_inventory += pull_icon - lingchemdisplay = new /obj/screen/ling/chems() + lingchemdisplay = new /atom/movable/screen/ling/chems() lingchemdisplay.hud = src infodisplay += lingchemdisplay - lingstingdisplay = new /obj/screen/ling/sting() + lingstingdisplay = new /atom/movable/screen/ling/sting() lingstingdisplay.hud = src infodisplay += lingstingdisplay - devilsouldisplay = new /obj/screen/devil/soul_counter + devilsouldisplay = new /atom/movable/screen/devil/soul_counter devilsouldisplay.hud = src infodisplay += devilsouldisplay - blood_display = new /obj/screen/bloodsucker/blood_counter // Blood Volume + blood_display = new /atom/movable/screen/bloodsucker/blood_counter // Blood Volume blood_display.hud = src infodisplay += blood_display - vamprank_display = new /obj/screen/bloodsucker/rank_counter // Bloodsucker Rank + vamprank_display = new /atom/movable/screen/bloodsucker/rank_counter // Bloodsucker Rank vamprank_display.hud = src infodisplay += vamprank_display - sunlight_display = new /obj/screen/bloodsucker/sunlight_counter // Sunlight + sunlight_display = new /atom/movable/screen/bloodsucker/sunlight_counter // Sunlight sunlight_display.hud = src infodisplay += sunlight_display - zone_select = new /obj/screen/zone_sel() + zone_select = new /atom/movable/screen/zone_sel() zone_select.icon = ui_style zone_select.hud = src zone_select.update_icon() static_inventory += zone_select - for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) inv.hud = src inv_slots[inv.slot_id] = inv @@ -374,12 +374,12 @@ update_locked_slots() /datum/hud/human/proc/assert_move_intent_ui(mob/living/carbon/human/owner = mymob, on_new = FALSE) - var/obj/screen/using + var/atom/movable/screen/using // delete old ones - var/list/obj/screen/victims = list() - victims += locate(/obj/screen/mov_intent) in static_inventory - victims += locate(/obj/screen/sprintbutton) in static_inventory - victims += locate(/obj/screen/sprint_buffer) in static_inventory + var/list/atom/movable/screen/victims = list() + victims += locate(/atom/movable/screen/mov_intent) in static_inventory + victims += locate(/atom/movable/screen/sprintbutton) in static_inventory + victims += locate(/atom/movable/screen/sprint_buffer) in static_inventory if(victims) static_inventory -= victims if(mymob?.client) @@ -388,7 +388,7 @@ // make new ones // walk/run - using = new /obj/screen/mov_intent + using = new /atom/movable/screen/mov_intent using.icon = tg_ui_icon_to_cit_ui(ui_style) // CIT CHANGE - overrides mov intent icon using.screen_loc = ui_movi using.hud = src @@ -401,7 +401,7 @@ return // sprint button - using = new /obj/screen/sprintbutton + using = new /atom/movable/screen/sprintbutton using.icon = tg_ui_icon_to_cit_ui(ui_style) using.icon_state = ((owner.combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) ? "act_sprint_on" : "act_sprint") using.screen_loc = ui_movi @@ -411,7 +411,7 @@ owner?.client?.screen += using // same as above but buffer. - sprint_buffer = new /obj/screen/sprint_buffer + sprint_buffer = new /atom/movable/screen/sprint_buffer sprint_buffer.screen_loc = ui_sprintbufferloc sprint_buffer.hud = src static_inventory += sprint_buffer @@ -425,7 +425,7 @@ if(!istype(H) || !H.dna.species) return var/datum/species/S = H.dna.species - for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) if(inv.slot_id in S.no_equip) inv.alpha = 128 diff --git a/code/_onclick/hud/lavaland_elite.dm b/code/_onclick/hud/lavaland_elite.dm index a36d9a0f36..f3ca5fec32 100644 --- a/code/_onclick/hud/lavaland_elite.dm +++ b/code/_onclick/hud/lavaland_elite.dm @@ -4,13 +4,13 @@ /datum/hud/lavaland_elite/New(mob/living/simple_animal/hostile/asteroid/elite) ..() - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = ui_style pull_icon.hud = src pull_icon.update_icon() pull_icon.screen_loc = ui_living_pull static_inventory += pull_icon - healths = new /obj/screen/healths/lavaland_elite() + healths = new /atom/movable/screen/healths/lavaland_elite() healths.hud = src infodisplay += healths diff --git a/code/_onclick/hud/map_popups.dm b/code/_onclick/hud/map_popups.dm index 2ecfe80ab5..7c40f654ff 100644 --- a/code/_onclick/hud/map_popups.dm +++ b/code/_onclick/hud/map_popups.dm @@ -2,7 +2,7 @@ * A screen object, which acts as a container for turfs and other things * you want to show on the map, which you usually attach to "vis_contents". */ -/obj/screen/map_view +/atom/movable/screen/map_view // Map view has to be on the lowest plane to enable proper lighting layer = GAME_PLANE plane = GAME_PLANE @@ -12,7 +12,7 @@ * It is also implicitly used to allocate a rectangle on the map, which will * be used for auto-scaling the map. */ -/obj/screen/background +/atom/movable/screen/background name = "background" icon = 'icons/mob/map_backgrounds.dmi' icon_state = "clear" @@ -25,7 +25,7 @@ * * If applicable, "assigned_map" has to be assigned before this proc call. */ -/obj/screen/proc/set_position(x, y, px = 0, py = 0) +/atom/movable/screen/proc/set_position(x, y, px = 0, py = 0) if(assigned_map) screen_loc = "[assigned_map]:[x]:[px],[y]:[py]" else @@ -36,7 +36,7 @@ * * If applicable, "assigned_map" has to be assigned before this proc call. */ -/obj/screen/proc/fill_rect(x1, y1, x2, y2) +/atom/movable/screen/proc/fill_rect(x1, y1, x2, y2) if(assigned_map) screen_loc = "[assigned_map]:[x1],[y1] to [x2],[y2]" else @@ -46,7 +46,7 @@ * Registers screen obj with the client, which makes it visible on the * assigned map, and becomes a part of the assigned map's lifecycle. */ -/client/proc/register_map_obj(obj/screen/screen_obj) +/client/proc/register_map_obj(atom/movable/screen/screen_obj) if(!screen_obj.assigned_map) CRASH("Can't register [screen_obj] without 'assigned_map' property.") if(!screen_maps[screen_obj.assigned_map]) @@ -68,7 +68,7 @@ /client/proc/clear_map(map_name) if(!map_name || !(map_name in screen_maps)) return FALSE - for(var/obj/screen/screen_obj in screen_maps[map_name]) + for(var/atom/movable/screen/screen_obj in screen_maps[map_name]) screen_maps[map_name] -= screen_obj if(screen_obj.del_on_map_removal) qdel(screen_obj) @@ -122,7 +122,7 @@ var/y_value = world.icon_size * tilesize * height var/map_name = create_popup(popup_name, x_value, y_value) - var/obj/screen/background/background = new + var/atom/movable/screen/background/background = new background.assigned_map = map_name background.fill_rect(1, 1, width, height) if(bg_icon) diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm index d665330aac..376db7bf96 100644 --- a/code/_onclick/hud/monkey.dm +++ b/code/_onclick/hud/monkey.dm @@ -1,28 +1,28 @@ /datum/hud/monkey/New(mob/living/carbon/monkey/owner) ..() - var/obj/screen/using - var/obj/screen/inventory/inv_box + var/atom/movable/screen/using + var/atom/movable/screen/inventory/inv_box - action_intent = new /obj/screen/act_intent() + action_intent = new /atom/movable/screen/act_intent() action_intent.icon = ui_style action_intent.icon_state = mymob.a_intent action_intent.screen_loc = ui_acti action_intent.hud = src static_inventory += action_intent - using = new /obj/screen/mov_intent() + using = new /atom/movable/screen/mov_intent() using.icon = ui_style using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking") using.screen_loc = ui_movi using.hud = src static_inventory += using - using = new/obj/screen/language_menu + using = new/atom/movable/screen/language_menu using.icon = ui_style using.hud = src static_inventory += using - using = new /obj/screen/drop() + using = new /atom/movable/screen/drop() using.icon = ui_style using.screen_loc = ui_drop_throw using.hud = src @@ -30,21 +30,21 @@ build_hand_slots() - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_1_m" //extra wide! using.screen_loc = ui_swaphand_position(owner,1) using.hud = src static_inventory += using - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_2" using.screen_loc = ui_swaphand_position(owner,2) using.hud = src static_inventory += using - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "mask" inv_box.icon = ui_style inv_box.icon_state = "mask" @@ -53,7 +53,7 @@ inv_box.slot_id = SLOT_WEAR_MASK static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "neck" inv_box.icon = ui_style inv_box.icon_state = "neck" @@ -62,7 +62,7 @@ inv_box.slot_id = SLOT_NECK static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "head" inv_box.icon = ui_style inv_box.icon_state = "head" @@ -71,7 +71,7 @@ inv_box.slot_id = SLOT_HEAD static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "back" inv_box.icon = ui_style inv_box.icon_state = "back" @@ -79,37 +79,37 @@ inv_box.slot_id = SLOT_BACK static_inventory += inv_box - throw_icon = new /obj/screen/throw_catch() + throw_icon = new /atom/movable/screen/throw_catch() throw_icon.icon = ui_style throw_icon.screen_loc = ui_drop_throw throw_icon.hud = src hotkeybuttons += throw_icon - internals = new /obj/screen/internals() + internals = new /atom/movable/screen/internals() internals.hud = src infodisplay += internals - healths = new /obj/screen/healths() + healths = new /atom/movable/screen/healths() healths.hud = src infodisplay += healths - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = ui_style pull_icon.screen_loc = ui_pull_resist pull_icon.hud = src pull_icon.update_icon() static_inventory += pull_icon - lingchemdisplay = new /obj/screen/ling/chems() + lingchemdisplay = new /atom/movable/screen/ling/chems() lingchemdisplay.hud = src infodisplay += lingchemdisplay - lingstingdisplay = new /obj/screen/ling/sting() + lingstingdisplay = new /atom/movable/screen/ling/sting() lingstingdisplay.hud = src infodisplay += lingstingdisplay - zone_select = new /obj/screen/zone_sel() + zone_select = new /atom/movable/screen/zone_sel() zone_select.icon = ui_style zone_select.hud = src zone_select.update_icon() @@ -117,13 +117,13 @@ mymob.client.screen = list() - using = new /obj/screen/resist() + using = new /atom/movable/screen/resist() using.icon = ui_style using.screen_loc = ui_pull_resist using.hud = src hotkeybuttons += using - for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) inv.hud = src inv_slots[inv.slot_id] = inv diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm index ae11613885..eeb56d67f5 100644 --- a/code/_onclick/hud/movable_screen_objects.dm +++ b/code/_onclick/hud/movable_screen_objects.dm @@ -8,7 +8,7 @@ //Movable Screen Object //Not tied to the grid, places it's center where the cursor is -/obj/screen/movable +/atom/movable/screen/movable var/snap2grid = FALSE var/moved = FALSE var/locked = FALSE @@ -18,11 +18,11 @@ //Snap Screen Object //Tied to the grid, snaps to the nearest turf -/obj/screen/movable/snap +/atom/movable/screen/movable/snap snap2grid = TRUE -/obj/screen/movable/MouseDrop(over_object, src_location, over_location, src_control, over_control, params) +/atom/movable/screen/movable/MouseDrop(over_object, src_location, over_location, src_control, over_control, params) if(locked) //no! I am locked! begone! return var/list/PM = params2list(params) @@ -56,7 +56,7 @@ set category = "Debug" set name = "Spawn Movable UI Object" - var/obj/screen/movable/M = new() + var/atom/movable/screen/movable/M = new() M.name = "Movable UI Object" M.icon_state = "block" M.maptext = "Movable" @@ -75,7 +75,7 @@ set category = "Debug" set name = "Spawn Snap UI Object" - var/obj/screen/movable/snap/S = new() + var/atom/movable/screen/movable/snap/S = new() S.name = "Snap UI Object" S.icon_state = "block" S.maptext = "Snap" diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index 5d48f430d7..a98fec03c4 100755 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -7,12 +7,12 @@ if(!length(C.parallax_layers_cached)) C.parallax_layers_cached = list() - C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_1(null, C.view) - C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_2(null, C.view) - C.parallax_layers_cached += new /obj/screen/parallax_layer/planet(null, C.view) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_1(null, C.view) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_2(null, C.view) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet(null, C.view) if(SSparallax.random_layer) C.parallax_layers_cached += new SSparallax.random_layer - C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_3(null, C.view) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_3(null, C.view) C.parallax_layers = C.parallax_layers_cached.Copy() @@ -20,9 +20,9 @@ C.parallax_layers.len = C.parallax_layers_max C.screen |= (C.parallax_layers) - var/obj/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"] + var/atom/movable/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"] if(screenmob != mymob) - C.screen -= locate(/obj/screen/plane_master/parallax_white) in C.screen + C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen C.screen += PM PM.color = list( 0, 0, 0, 0, @@ -37,9 +37,9 @@ var/mob/screenmob = viewmob || mymob var/client/C = screenmob.client C.screen -= (C.parallax_layers_cached) - var/obj/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"] + var/atom/movable/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"] if(screenmob != mymob) - C.screen -= locate(/obj/screen/plane_master/parallax_white) in C.screen + C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen C.screen += PM PM.color = initial(PM.color) C.parallax_layers = null @@ -90,7 +90,7 @@ if(new_parallax_movedir == FALSE) var/animate_time = 0 for(var/thing in C.parallax_layers) - var/obj/screen/parallax_layer/L = thing + var/atom/movable/screen/parallax_layer/L = thing L.icon_state = initial(L.icon_state) L.update_o(C.view) var/T = PARALLAX_LOOP_TIME / L.speed @@ -113,7 +113,7 @@ var/shortesttimer if(!skip_windups) for(var/thing in C.parallax_layers) - var/obj/screen/parallax_layer/L = thing + var/atom/movable/screen/parallax_layer/L = thing var/T = PARALLAX_LOOP_TIME / L.speed if (isnull(shortesttimer)) @@ -141,7 +141,7 @@ return C.parallax_animate_timer = FALSE for(var/thing in C.parallax_layers) - var/obj/screen/parallax_layer/L = thing + var/atom/movable/screen/parallax_layer/L = thing if (!new_parallax_movedir) animate(L) continue @@ -188,7 +188,7 @@ C.last_parallax_shift = world.time for(var/thing in C.parallax_layers) - var/obj/screen/parallax_layer/L = thing + var/atom/movable/screen/parallax_layer/L = thing L.update_status(mymob) if (L.view_sized != C.view) L.update_o(C.view) @@ -233,7 +233,7 @@ var/area/areaobj = get_area(client.eye) hud_used.set_parallax_movedir(areaobj.parallax_movedir, TRUE) -/obj/screen/parallax_layer +/atom/movable/screen/parallax_layer icon = 'icons/effects/parallax.dmi' var/speed = 1 var/offset_x = 0 @@ -246,13 +246,13 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/parallax_layer/Initialize(mapload, view) +/atom/movable/screen/parallax_layer/Initialize(mapload, view) . = ..() if (!view) view = world.view update_o(view) -/obj/screen/parallax_layer/proc/update_o(view) +/atom/movable/screen/parallax_layer/proc/update_o(view) if (!view) view = world.view @@ -271,52 +271,52 @@ add_overlay(new_overlays) view_sized = view -/obj/screen/parallax_layer/proc/update_status(mob/M) +/atom/movable/screen/parallax_layer/proc/update_status(mob/M) return -/obj/screen/parallax_layer/layer_1 +/atom/movable/screen/parallax_layer/layer_1 icon_state = "layer1" speed = 0.6 layer = 1 -/obj/screen/parallax_layer/layer_2 +/atom/movable/screen/parallax_layer/layer_2 icon_state = "layer2" speed = 1 layer = 2 -/obj/screen/parallax_layer/layer_3 +/atom/movable/screen/parallax_layer/layer_3 icon_state = "layer3" speed = 1.4 layer = 3 -/obj/screen/parallax_layer/random +/atom/movable/screen/parallax_layer/random blend_mode = BLEND_OVERLAY speed = 3 layer = 3 -/obj/screen/parallax_layer/random/space_gas +/atom/movable/screen/parallax_layer/random/space_gas icon_state = "space_gas" -/obj/screen/parallax_layer/random/space_gas/Initialize(mapload, view) +/atom/movable/screen/parallax_layer/random/space_gas/Initialize(mapload, view) . = ..() src.add_atom_colour(SSparallax.random_parallax_color, ADMIN_COLOUR_PRIORITY) -/obj/screen/parallax_layer/random/asteroids +/atom/movable/screen/parallax_layer/random/asteroids icon_state = "asteroids" -/obj/screen/parallax_layer/planet +/atom/movable/screen/parallax_layer/planet icon_state = "planet" blend_mode = BLEND_OVERLAY absolute = TRUE //Status of seperation speed = 3 layer = 30 -/obj/screen/parallax_layer/planet/update_status(mob/M) +/atom/movable/screen/parallax_layer/planet/update_status(mob/M) var/client/C = M.client var/turf/posobj = get_turf(C.eye) if(!posobj) return invisibility = is_station_level(posobj.z) ? 0 : INVISIBILITY_ABSTRACT -/obj/screen/parallax_layer/planet/update_o() +/atom/movable/screen/parallax_layer/planet/update_o() return //Shit won't move diff --git a/code/_onclick/hud/picture_in_picture.dm b/code/_onclick/hud/picture_in_picture.dm index 5e474331f6..6cf1bfd6a6 100644 --- a/code/_onclick/hud/picture_in_picture.dm +++ b/code/_onclick/hud/picture_in_picture.dm @@ -1,4 +1,4 @@ -/obj/screen/movable/pic_in_pic +/atom/movable/screen/movable/pic_in_pic name = "Picture-in-picture" screen_loc = "CENTER" plane = FLOOR_PLANE @@ -7,18 +7,18 @@ var/height = 0 var/list/shown_to = list() var/list/viewing_turfs = list() - var/obj/screen/component_button/button_x - var/obj/screen/component_button/button_expand - var/obj/screen/component_button/button_shrink + var/atom/movable/screen/component_button/button_x + var/atom/movable/screen/component_button/button_expand + var/atom/movable/screen/component_button/button_shrink var/mutable_appearance/standard_background var/const/max_dimensions = 10 -/obj/screen/movable/pic_in_pic/Initialize() +/atom/movable/screen/movable/pic_in_pic/Initialize() . = ..() make_backgrounds() -/obj/screen/movable/pic_in_pic/Destroy() +/atom/movable/screen/movable/pic_in_pic/Destroy() for(var/C in shown_to) unshow_to(C) QDEL_NULL(button_x) @@ -26,7 +26,7 @@ QDEL_NULL(button_expand) return ..() -/obj/screen/movable/pic_in_pic/component_click(obj/screen/component_button/component, params) +/atom/movable/screen/movable/pic_in_pic/component_click(atom/movable/screen/component_button/component, params) if(component == button_x) qdel(src) else if(component == button_expand) @@ -34,13 +34,13 @@ else if(component == button_shrink) set_view_size(width-1, height-1) -/obj/screen/movable/pic_in_pic/proc/make_backgrounds() +/atom/movable/screen/movable/pic_in_pic/proc/make_backgrounds() standard_background = new /mutable_appearance() standard_background.icon = 'icons/misc/pic_in_pic.dmi' standard_background.icon_state = "background" standard_background.layer = SPACE_LAYER -/obj/screen/movable/pic_in_pic/proc/add_buttons() +/atom/movable/screen/movable/pic_in_pic/proc/add_buttons() var/static/mutable_appearance/move_tab if(!move_tab) move_tab = new /mutable_appearance() @@ -55,7 +55,7 @@ add_overlay(move_tab) if(!button_x) - button_x = new /obj/screen/component_button(null, src) + button_x = new /atom/movable/screen/component_button(null, src) var/mutable_appearance/MA = new /mutable_appearance() MA.name = "close" MA.icon = 'icons/misc/pic_in_pic.dmi' @@ -68,7 +68,7 @@ vis_contents += button_x if(!button_expand) - button_expand = new /obj/screen/component_button(null, src) + button_expand = new /atom/movable/screen/component_button(null, src) var/mutable_appearance/MA = new /mutable_appearance() MA.name = "expand" MA.icon = 'icons/misc/pic_in_pic.dmi' @@ -81,7 +81,7 @@ vis_contents += button_expand if(!button_shrink) - button_shrink = new /obj/screen/component_button(null, src) + button_shrink = new /atom/movable/screen/component_button(null, src) var/mutable_appearance/MA = new /mutable_appearance() MA.name = "shrink" MA.icon = 'icons/misc/pic_in_pic.dmi' @@ -93,7 +93,7 @@ button_shrink.transform = M vis_contents += button_shrink -/obj/screen/movable/pic_in_pic/proc/add_background() +/atom/movable/screen/movable/pic_in_pic/proc/add_background() if((width > 0) && (height > 0)) var/matrix/M = matrix() M.Scale(width + 0.5, height + 0.5) @@ -101,7 +101,7 @@ standard_background.transform = M add_overlay(standard_background) -/obj/screen/movable/pic_in_pic/proc/set_view_size(width, height, do_refresh = TRUE) +/atom/movable/screen/movable/pic_in_pic/proc/set_view_size(width, height, do_refresh = TRUE) width = clamp(width, 0, max_dimensions) height = clamp(height, 0, max_dimensions) src.width = width @@ -115,19 +115,19 @@ if(do_refresh) refresh_view() -/obj/screen/movable/pic_in_pic/proc/set_view_center(atom/target, do_refresh = TRUE) +/atom/movable/screen/movable/pic_in_pic/proc/set_view_center(atom/target, do_refresh = TRUE) center = target if(do_refresh) refresh_view() -/obj/screen/movable/pic_in_pic/proc/refresh_view() +/atom/movable/screen/movable/pic_in_pic/proc/refresh_view() vis_contents -= viewing_turfs if(!width || !height) return viewing_turfs = get_visible_turfs() vis_contents += viewing_turfs -/obj/screen/movable/pic_in_pic/proc/get_visible_turfs() +/atom/movable/screen/movable/pic_in_pic/proc/get_visible_turfs() var/turf/T = get_turf(center) if(!T) return list() @@ -135,12 +135,12 @@ var/turf/upperright = locate(min(world.maxx, lowerleft.x + width - 1), min(world.maxy, lowerleft.y + height - 1), lowerleft.z) return block(lowerleft, upperright) -/obj/screen/movable/pic_in_pic/proc/show_to(client/C) +/atom/movable/screen/movable/pic_in_pic/proc/show_to(client/C) if(C) shown_to[C] = 1 C.screen += src -/obj/screen/movable/pic_in_pic/proc/unshow_to(client/C) +/atom/movable/screen/movable/pic_in_pic/proc/unshow_to(client/C) if(C) shown_to -= C C.screen -= src diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm index 4c736c9a2b..bb6a9cd925 100644 --- a/code/_onclick/hud/plane_master.dm +++ b/code/_onclick/hud/plane_master.dm @@ -1,4 +1,4 @@ -/obj/screen/plane_master +/atom/movable/screen/plane_master screen_loc = "CENTER" icon_state = "blank" appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR @@ -6,25 +6,25 @@ var/show_alpha = 255 var/hide_alpha = 0 -/obj/screen/plane_master/proc/Show(override) +/atom/movable/screen/plane_master/proc/Show(override) alpha = override || show_alpha -/obj/screen/plane_master/proc/Hide(override) +/atom/movable/screen/plane_master/proc/Hide(override) alpha = override || hide_alpha //Why do plane masters need a backdrop sometimes? Read https://secure.byond.com/forum/?post=2141928 //Trust me, you need one. Period. If you don't think you do, you're doing something extremely wrong. -/obj/screen/plane_master/proc/backdrop(mob/mymob) +/atom/movable/screen/plane_master/proc/backdrop(mob/mymob) ///Things rendered on "openspace"; holes in multi-z -/obj/screen/plane_master/openspace +/atom/movable/screen/plane_master/openspace name = "open space plane master" plane = OPENSPACE_BACKDROP_PLANE appearance_flags = PLANE_MASTER blend_mode = BLEND_MULTIPLY alpha = 255 -/obj/screen/plane_master/openspace/Initialize() +/atom/movable/screen/plane_master/openspace/Initialize() . = ..() filters += filter(type="alpha", render_source=FIELD_OF_VISION_RENDER_TARGET, flags=MASK_INVERSE) @@ -32,163 +32,143 @@ filters += filter(type = "drop_shadow", color = "#04080FAA", size = -15) filters += filter(type = "drop_shadow", color = "#04080FAA", size = -20) -/obj/screen/plane_master/proc/outline(_size, _color) +/atom/movable/screen/plane_master/proc/outline(_size, _color) filters += filter(type = "outline", size = _size, color = _color) -/obj/screen/plane_master/proc/shadow(_size, _offset = 0, _x = 0, _y = 0, _color = "#04080FAA") +/atom/movable/screen/plane_master/proc/shadow(_size, _offset = 0, _x = 0, _y = 0, _color = "#04080FAA") filters += filter(type = "drop_shadow", x = _x, y = _y, color = _color, size = _size, offset = _offset) ///Contains just the floor -/obj/screen/plane_master/floor +/atom/movable/screen/plane_master/floor name = "floor plane master" plane = FLOOR_PLANE appearance_flags = PLANE_MASTER blend_mode = BLEND_OVERLAY -/obj/screen/plane_master/wall +/atom/movable/screen/plane_master/wall name = "wall plane master" plane = WALL_PLANE appearance_flags = PLANE_MASTER -/obj/screen/plane_master/wall/backdrop(mob/mymob) +/atom/movable/screen/plane_master/wall/backdrop(mob/mymob) if(mymob?.client?.prefs.ambientocclusion) add_filter("ambient_occlusion", 0, AMBIENT_OCCLUSION(4, "#04080FAA")) else remove_filter("ambient_occlusion") -/obj/screen/plane_master/above_wall +/atom/movable/screen/plane_master/above_wall name = "above wall plane master" plane = ABOVE_WALL_PLANE appearance_flags = PLANE_MASTER -/obj/screen/plane_master/above_wall/Initialize() +/atom/movable/screen/plane_master/above_wall/Initialize() . = ..() add_filter("vision_cone", 100, list(type="alpha", render_source=FIELD_OF_VISION_RENDER_TARGET, flags=MASK_INVERSE)) -/obj/screen/plane_master/above_wall/backdrop(mob/mymob) +/atom/movable/screen/plane_master/above_wall/backdrop(mob/mymob) if(mymob?.client?.prefs.ambientocclusion) add_filter("ambient_occlusion", 0, AMBIENT_OCCLUSION(3, "#04080F64")) else remove_filter("ambient_occlusion") ///Contains most things in the game world -/obj/screen/plane_master/game_world +/atom/movable/screen/plane_master/game_world name = "game world plane master" plane = GAME_PLANE appearance_flags = PLANE_MASTER //should use client color blend_mode = BLEND_OVERLAY -/obj/screen/plane_master/game_world/Initialize() +/atom/movable/screen/plane_master/game_world/Initialize() . = ..() add_filter("vision_cone", 100, list(type="alpha", render_source=FIELD_OF_VISION_RENDER_TARGET, flags=MASK_INVERSE)) -/obj/screen/plane_master/game_world/backdrop(mob/mymob) +/atom/movable/screen/plane_master/game_world/backdrop(mob/mymob) if(mymob?.client?.prefs.ambientocclusion) add_filter("ambient_occlusion", 0, AMBIENT_OCCLUSION(4, "#04080FAA")) else remove_filter("ambient_occlusion") ///Contains all shadow cone masks, whose image overrides are displayed only to their respective owners. -/obj/screen/plane_master/field_of_vision +/atom/movable/screen/plane_master/field_of_vision name = "field of vision mask plane master" plane = FIELD_OF_VISION_PLANE render_target = FIELD_OF_VISION_RENDER_TARGET mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/plane_master/field_of_vision/Initialize() +/atom/movable/screen/plane_master/field_of_vision/Initialize() . = ..() filters += filter(type="alpha", render_source=FIELD_OF_VISION_BLOCKER_RENDER_TARGET, flags=MASK_INVERSE) ///Used to display the owner and its adjacent surroundings through the FoV plane mask. -/obj/screen/plane_master/field_of_vision_blocker +/atom/movable/screen/plane_master/field_of_vision_blocker name = "field of vision blocker plane master" plane = FIELD_OF_VISION_BLOCKER_PLANE render_target = FIELD_OF_VISION_BLOCKER_RENDER_TARGET mouse_opacity = MOUSE_OPACITY_TRANSPARENT ///Stores the visible portion of the FoV shadow cone. -/obj/screen/plane_master/field_of_vision_visual +/atom/movable/screen/plane_master/field_of_vision_visual name = "field of vision visual plane master" plane = FIELD_OF_VISION_VISUAL_PLANE mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/plane_master/field_of_vision_visual/Initialize() +/atom/movable/screen/plane_master/field_of_vision_visual/Initialize() . = ..() filters += filter(type="alpha", render_source=FIELD_OF_VISION_BLOCKER_RENDER_TARGET, flags=MASK_INVERSE) ///Contains all lighting objects -/obj/screen/plane_master/lighting +/atom/movable/screen/plane_master/lighting name = "lighting plane master" plane = LIGHTING_PLANE blend_mode = BLEND_MULTIPLY mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/plane_master/lighting/backdrop(mob/mymob) - mymob.overlay_fullscreen("lighting_backdrop_lit", /obj/screen/fullscreen/lighting_backdrop/lit) - mymob.overlay_fullscreen("lighting_backdrop_unlit", /obj/screen/fullscreen/lighting_backdrop/unlit) +/atom/movable/screen/plane_master/lighting/backdrop(mob/mymob) + mymob.overlay_fullscreen("lighting_backdrop_lit", /atom/movable/screen/fullscreen/lighting_backdrop/lit) + mymob.overlay_fullscreen("lighting_backdrop_unlit", /atom/movable/screen/fullscreen/lighting_backdrop/unlit) -/obj/screen/plane_master/lighting/Initialize() +/*! + * This system works by exploiting BYONDs color matrix filter to use layers to handle emissive blockers. + * + * Emissive overlays are pasted with an atom color that converts them to be entirely some specific color. + * Emissive blockers are pasted with an atom color that converts them to be entirely some different color. + * Emissive overlays and emissive blockers are put onto the same plane. + * The layers for the emissive overlays and emissive blockers cause them to mask eachother similar to normal BYOND objects. + * A color matrix filter is applied to the emissive plane to mask out anything that isn't whatever the emissive color is. + * This is then used to alpha mask the lighting plane. + */ + +/atom/movable/screen/plane_master/lighting/Initialize() . = ..() - filters += filter(type="alpha", render_source = EMISSIVE_RENDER_TARGET, flags = MASK_INVERSE) - filters += filter(type="alpha", render_source = EMISSIVE_UNBLOCKABLE_RENDER_TARGET, flags = MASK_INVERSE) + add_filter("emissives", 1, alpha_mask_filter(render_source = EMISSIVE_RENDER_TARGET, flags = MASK_INVERSE)) + add_filter("object_lighting", 2, alpha_mask_filter(render_source = O_LIGHTING_VISUAL_RENDER_TARGET, flags = MASK_INVERSE)) + /** - * Things placed on this mask the lighting plane. Doesn't render directly. - * - * Gets masked by blocking plane. Use for things that you want blocked by - * mobs, items, etc. - */ -/obj/screen/plane_master/emissive + * Handles emissive overlays and emissive blockers. + */ +/atom/movable/screen/plane_master/emissive name = "emissive plane master" plane = EMISSIVE_PLANE mouse_opacity = MOUSE_OPACITY_TRANSPARENT render_target = EMISSIVE_RENDER_TARGET -/obj/screen/plane_master/emissive/Initialize() +/atom/movable/screen/plane_master/emissive/Initialize() . = ..() - filters += filter(type="alpha", render_source=EMISSIVE_BLOCKER_RENDER_TARGET, flags=MASK_INVERSE) - filters += filter(type="alpha", render_source=FIELD_OF_VISION_RENDER_TARGET, flags=MASK_INVERSE) - -/** - * Things placed on this always mask the lighting plane. Doesn't render directly. - * - * Always masks the light plane, isn't blocked by anything (except Field of Vision). Use for on mob glows, - * magic stuff, etc. - */ - -/obj/screen/plane_master/emissive_unblockable - name = "unblockable emissive plane master" - plane = EMISSIVE_UNBLOCKABLE_PLANE - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - render_target = EMISSIVE_UNBLOCKABLE_RENDER_TARGET - -/obj/screen/plane_master/emissive_unblockable/Initialize() - . = ..() - filters += filter(type="alpha", render_source=FIELD_OF_VISION_RENDER_TARGET, flags=MASK_INVERSE) - -/** - * Things placed on this layer mask the emissive layer. Doesn't render directly - * - * You really shouldn't be directly using this, use atom helpers instead - */ -/obj/screen/plane_master/emissive_blocker - name = "emissive blocker plane master" - plane = EMISSIVE_BLOCKER_PLANE - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - render_target = EMISSIVE_BLOCKER_RENDER_TARGET + add_filter("em_block_masking", 1, color_matrix_filter(GLOB.em_mask_matrix)) ///Contains space parallax -/obj/screen/plane_master/parallax +/atom/movable/screen/plane_master/parallax name = "parallax plane master" plane = PLANE_SPACE_PARALLAX blend_mode = BLEND_MULTIPLY mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/plane_master/parallax_white +/atom/movable/screen/plane_master/parallax_white name = "parallax whitifier plane master" plane = PLANE_SPACE -/obj/screen/plane_master/camera_static +/atom/movable/screen/plane_master/camera_static name = "camera static plane master" plane = CAMERA_STATIC_PLANE appearance_flags = PLANE_MASTER @@ -196,7 +176,7 @@ //Reserved to chat messages, so they are still displayed above the field of vision masking. -/obj/screen/plane_master/chat_messages +/atom/movable/screen/plane_master/chat_messages name = "runechat plane master" plane = CHAT_PLANE appearance_flags = PLANE_MASTER diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 7d22b70cbc..3cce288e67 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -3,49 +3,49 @@ GLOBAL_LIST_EMPTY(radial_menus) -/obj/screen/radial +/atom/movable/screen/radial icon = 'icons/mob/radial.dmi' layer = ABOVE_HUD_LAYER plane = ABOVE_HUD_PLANE var/datum/radial_menu/parent -/obj/screen/radial/slice +/atom/movable/screen/radial/slice icon_state = "radial_slice" var/choice var/next_page = FALSE -/obj/screen/radial/slice/MouseEntered(location, control, params) +/atom/movable/screen/radial/slice/MouseEntered(location, control, params) . = ..() icon_state = "radial_slice_focus" if(tooltips) openToolTip(usr, src, params, title = name) -/obj/screen/radial/slice/MouseExited(location, control, params) +/atom/movable/screen/radial/slice/MouseExited(location, control, params) . = ..() icon_state = "radial_slice" if(tooltips) closeToolTip(usr) -/obj/screen/radial/slice/Click(location, control, params) +/atom/movable/screen/radial/slice/Click(location, control, params) if(usr.client == parent.current_user) if(next_page) parent.next_page() else parent.element_chosen(choice,usr) -/obj/screen/radial/center +/atom/movable/screen/radial/center name = "Close Menu" icon_state = "radial_center" -/obj/screen/radial/center/MouseEntered(location, control, params) +/atom/movable/screen/radial/center/MouseEntered(location, control, params) . = ..() icon_state = "radial_center_focus" -/obj/screen/radial/center/MouseExited(location, control, params) +/atom/movable/screen/radial/center/MouseExited(location, control, params) . = ..() icon_state = "radial_center" -/obj/screen/radial/center/Click(location, control, params) +/atom/movable/screen/radial/center/Click(location, control, params) if(usr.client == parent.current_user) parent.finished = TRUE @@ -57,8 +57,8 @@ GLOBAL_LIST_EMPTY(radial_menus) var/selected_choice - var/list/obj/screen/elements = list() - var/obj/screen/radial/center/close_button + var/list/atom/movable/screen/elements = list() + var/atom/movable/screen/radial/center/close_button var/client/current_user var/atom/anchor var/image/menu_holder @@ -120,7 +120,7 @@ GLOBAL_LIST_EMPTY(radial_menus) if(elements.len < max_elements) var/elements_to_add = max_elements - elements.len for(var/i in 1 to elements_to_add) //Create all elements - var/obj/screen/radial/slice/new_element = new /obj/screen/radial/slice + var/atom/movable/screen/radial/slice/new_element = new /atom/movable/screen/radial/slice new_element.tooltips = use_tooltips new_element.parent = src elements += new_element @@ -152,14 +152,14 @@ GLOBAL_LIST_EMPTY(radial_menus) var/list/page_choices = page_data[current_page] var/angle_per_element = round(zone / page_choices.len) for(var/i in 1 to elements.len) - var/obj/screen/radial/E = elements[i] + var/atom/movable/screen/radial/E = elements[i] var/angle = WRAP(starting_angle + (i - 1) * angle_per_element,0,360) if(i > page_choices.len) HideElement(E) else SetElement(E,page_choices[i],angle,anim = anim,anim_order = i) -/datum/radial_menu/proc/HideElement(obj/screen/radial/slice/E) +/datum/radial_menu/proc/HideElement(atom/movable/screen/radial/slice/E) E.cut_overlays() E.alpha = 0 E.name = "None" @@ -168,7 +168,7 @@ GLOBAL_LIST_EMPTY(radial_menus) E.choice = null E.next_page = FALSE -/datum/radial_menu/proc/SetElement(obj/screen/radial/slice/E,choice_id,angle,anim,anim_order) +/datum/radial_menu/proc/SetElement(atom/movable/screen/radial/slice/E,choice_id,angle,anim,anim_order) //Position var/py = round(cos(angle) * radius) + py_shift var/px = round(sin(angle) * radius) diff --git a/code/_onclick/hud/radial_persistent.dm b/code/_onclick/hud/radial_persistent.dm index 0b5e8dc356..e7f7c664ad 100644 --- a/code/_onclick/hud/radial_persistent.dm +++ b/code/_onclick/hud/radial_persistent.dm @@ -2,19 +2,19 @@ A derivative of radial menu which persists onscreen until closed and invokes a callback each time an element is clicked */ -/obj/screen/radial/persistent/center +/atom/movable/screen/radial/persistent/center name = "Close Menu" icon_state = "radial_center" -/obj/screen/radial/persistent/center/Click(location, control, params) +/atom/movable/screen/radial/persistent/center/Click(location, control, params) if(usr.client == parent.current_user) parent.element_chosen(null,usr) -/obj/screen/radial/persistent/center/MouseEntered(location, control, params) +/atom/movable/screen/radial/persistent/center/MouseEntered(location, control, params) . = ..() icon_state = "radial_center_focus" -/obj/screen/radial/persistent/center/MouseExited(location, control, params) +/atom/movable/screen/radial/persistent/center/MouseExited(location, control, params) . = ..() icon_state = "radial_center" @@ -25,7 +25,7 @@ var/datum/callback/select_proc_callback /datum/radial_menu/persistent/New() - close_button = new /obj/screen/radial/persistent/center + close_button = new /atom/movable/screen/radial/persistent/center close_button.parent = src diff --git a/code/_onclick/hud/revenanthud.dm b/code/_onclick/hud/revenanthud.dm index 9369313941..708b1d4915 100644 --- a/code/_onclick/hud/revenanthud.dm +++ b/code/_onclick/hud/revenanthud.dm @@ -2,6 +2,6 @@ /datum/hud/revenant/New(mob/owner) ..() - healths = new /obj/screen/healths/revenant() + healths = new /atom/movable/screen/healths/revenant() healths.hud = src infodisplay += healths diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 33a9cec80c..03ad1b1821 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -1,15 +1,15 @@ -/obj/screen/robot +/atom/movable/screen/robot icon = 'icons/mob/screen_cyborg.dmi' -/obj/screen/robot/module +/atom/movable/screen/robot/module name = "cyborg module" icon_state = "nomod" -/obj/screen/robot/Click() +/atom/movable/screen/robot/Click() if(isobserver(usr)) return 1 -/obj/screen/robot/module/Click() +/atom/movable/screen/robot/module/Click() if(..()) return var/mob/living/silicon/robot/R = usr @@ -18,51 +18,51 @@ return 1 R.pick_module() -/obj/screen/robot/module1 +/atom/movable/screen/robot/module1 name = "module1" icon_state = "inv1" -/obj/screen/robot/module1/Click() +/atom/movable/screen/robot/module1/Click() if(..()) return var/mob/living/silicon/robot/R = usr R.toggle_module(1) -/obj/screen/robot/module2 +/atom/movable/screen/robot/module2 name = "module2" icon_state = "inv2" -/obj/screen/robot/module2/Click() +/atom/movable/screen/robot/module2/Click() if(..()) return var/mob/living/silicon/robot/R = usr R.toggle_module(2) -/obj/screen/robot/module3 +/atom/movable/screen/robot/module3 name = "module3" icon_state = "inv3" -/obj/screen/robot/module3/Click() +/atom/movable/screen/robot/module3/Click() if(..()) return var/mob/living/silicon/robot/R = usr R.toggle_module(3) -/obj/screen/robot/radio +/atom/movable/screen/robot/radio name = "radio" icon_state = "radio" -/obj/screen/robot/radio/Click() +/atom/movable/screen/robot/radio/Click() if(..()) return var/mob/living/silicon/robot/R = usr R.radio.interact(R) -/obj/screen/robot/store +/atom/movable/screen/robot/store name = "store" icon_state = "store" -/obj/screen/robot/store/Click() +/atom/movable/screen/robot/store/Click() if(..()) return var/mob/living/silicon/robot/R = usr @@ -75,35 +75,35 @@ ..() // i, Robit var/mob/living/silicon/robot/robit = mymob - var/obj/screen/using + var/atom/movable/screen/using - using = new/obj/screen/language_menu + using = new/atom/movable/screen/language_menu using.screen_loc = ui_borg_language_menu static_inventory += using //Radio - using = new /obj/screen/robot/radio() + using = new /atom/movable/screen/robot/radio() using.screen_loc = ui_borg_radio using.hud = src static_inventory += using //Module select if(!robit.inv1) - robit.inv1 = new /obj/screen/robot/module1() + robit.inv1 = new /atom/movable/screen/robot/module1() robit.inv1.screen_loc = ui_inv1 robit.inv1.hud = src static_inventory += robit.inv1 if(!robit.inv2) - robit.inv2 = new /obj/screen/robot/module2() + robit.inv2 = new /atom/movable/screen/robot/module2() robit.inv2.screen_loc = ui_inv2 robit.inv2.hud = src static_inventory += robit.inv2 if(!robit.inv3) - robit.inv3 = new /obj/screen/robot/module3() + robit.inv3 = new /atom/movable/screen/robot/module3() robit.inv3.screen_loc = ui_inv3 robit.inv3.hud = src @@ -111,73 +111,73 @@ //End of module select - using = new /obj/screen/robot/lamp() + using = new /atom/movable/screen/robot/lamp() using.screen_loc = ui_borg_lamp using.hud = src static_inventory += using robit.lampButton = using - var/obj/screen/robot/lamp/lampscreen = using + var/atom/movable/screen/robot/lamp/lampscreen = using lampscreen.robot = robit //Photography stuff - using = new /obj/screen/ai/image_take() + using = new /atom/movable/screen/ai/image_take() using.screen_loc = ui_borg_camera using.hud = src static_inventory += using //Sec/Med HUDs - using = new /obj/screen/robot/sensors() + using = new /atom/movable/screen/robot/sensors() using.screen_loc = ui_borg_sensor using.hud = src static_inventory += using //Borg Integrated Tablet - using = new /obj/screen/robot/modPC() + using = new /atom/movable/screen/robot/modPC() using.screen_loc = ui_borg_tablet using.hud = src static_inventory += using robit.interfaceButton = using if(robit.modularInterface) using.vis_contents += robit.modularInterface - var/obj/screen/robot/modPC/tabletbutton = using + var/atom/movable/screen/robot/modPC/tabletbutton = using tabletbutton.robot = robit //Alerts - using = new /obj/screen/robot/alerts() + using = new /atom/movable/screen/robot/alerts() using.screen_loc = ui_borg_alerts using.hud = src static_inventory += using //Thrusters - using = new /obj/screen/robot/thrusters() + using = new /atom/movable/screen/robot/thrusters() using.screen_loc = ui_borg_thrusters using.hud = src static_inventory += using robit.thruster_button = using //Intent - action_intent = new /obj/screen/act_intent/robot() + action_intent = new /atom/movable/screen/act_intent/robot() action_intent.icon_state = mymob.a_intent action_intent.hud = src static_inventory += action_intent //Health - healths = new /obj/screen/healths/robot() + healths = new /atom/movable/screen/healths/robot() healths.hud = src infodisplay += healths //Installed Module - robit.hands = new /obj/screen/robot/module() + robit.hands = new /atom/movable/screen/robot/module() robit.hands.screen_loc = ui_borg_module robit.hands.hud = src static_inventory += robit.hands //Store - module_store_icon = new /obj/screen/robot/store() + module_store_icon = new /atom/movable/screen/robot/store() module_store_icon.screen_loc = ui_borg_store module_store_icon.hud = src - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = 'icons/mob/screen_cyborg.dmi' pull_icon.screen_loc = ui_borg_pull pull_icon.hud = src @@ -185,7 +185,7 @@ hotkeybuttons += pull_icon - zone_select = new /obj/screen/zone_sel/robot() + zone_select = new /atom/movable/screen/zone_sel/robot() zone_select.hud = src zone_select.update_icon() static_inventory += zone_select @@ -283,61 +283,61 @@ for(var/obj/item/I in R.held_items) screenmob.client.screen -= I -/obj/screen/robot/lamp +/atom/movable/screen/robot/lamp name = "headlamp" icon_state = "lamp_off" var/mob/living/silicon/robot/robot -/obj/screen/robot/lamp/Click() +/atom/movable/screen/robot/lamp/Click() . = ..() if(.) return robot?.toggle_headlamp() update_icon() -/obj/screen/robot/lamp/update_icon() +/atom/movable/screen/robot/lamp/update_icon() if(robot?.lamp_enabled) icon_state = "lamp_on" else icon_state = "lamp_off" -/obj/screen/robot/alerts +/atom/movable/screen/robot/alerts name = "Alert Panel" icon = 'icons/mob/screen_ai.dmi' icon_state = "alerts" -/obj/screen/robot/alerts/Click() +/atom/movable/screen/robot/alerts/Click() . = ..() if(.) return var/mob/living/silicon/robot/borgo = usr borgo.robot_alerts() -/obj/screen/robot/thrusters +/atom/movable/screen/robot/thrusters name = "ion thrusters" icon_state = "ionpulse0" -/obj/screen/robot/thrusters/Click() +/atom/movable/screen/robot/thrusters/Click() if(..()) return var/mob/living/silicon/robot/R = usr R.toggle_ionpulse() -/obj/screen/robot/sensors +/atom/movable/screen/robot/sensors name = "Sensor Augmentation" icon_state = "cyborg_sensor" -/obj/screen/robot/sensors/Click() +/atom/movable/screen/robot/sensors/Click() if(..()) return var/mob/living/silicon/S = usr S.toggle_sensors() -/obj/screen/robot/modPC +/atom/movable/screen/robot/modPC name = "Modular Interface" icon_state = "template" var/mob/living/silicon/robot/robot -/obj/screen/robot/modPC/Click() +/atom/movable/screen/robot/modPC/Click() . = ..() if(.) return diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index b27abad841..2f5f4a3dd4 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -6,12 +6,11 @@ They are used with the client/screen list and the screen_loc var. For more information, see the byond documentation on the screen_loc and screen vars. */ -/obj/screen +/atom/movable/screen name = "" icon = 'icons/mob/screen_gen.dmi' layer = HUD_LAYER plane = HUD_PLANE - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF animate_movement = SLIDE_STEPS speech_span = SPAN_ROBOT vis_flags = VIS_INHERIT_PLANE @@ -34,24 +33,21 @@ */ var/del_on_map_removal = TRUE -/obj/screen/take_damage() - return - -/obj/screen/Destroy() +/atom/movable/screen/Destroy() master = null hud = null return ..() -/obj/screen/examine(mob/user) +/atom/movable/screen/examine(mob/user) return list() -/obj/screen/orbit() +/atom/movable/screen/orbit() return -/obj/screen/proc/component_click(obj/screen/component_button/component, params) +/atom/movable/screen/proc/component_click(atom/movable/screen/component_button/component, params) return -/obj/screen/text +/atom/movable/screen/text icon = null icon_state = null mouse_opacity = MOUSE_OPACITY_TRANSPARENT @@ -59,12 +55,12 @@ maptext_height = 480 maptext_width = 480 -/obj/screen/swap_hand +/atom/movable/screen/swap_hand layer = HUD_LAYER plane = HUD_PLANE name = "swap hand" -/obj/screen/swap_hand/Click() +/atom/movable/screen/swap_hand/Click() // At this point in client Click() code we have passed the 1/10 sec check and little else // We don't even know if it's a middle click // if(world.time <= usr.next_move) @@ -78,19 +74,19 @@ M.swap_hand() return 1 -/obj/screen/craft +/atom/movable/screen/craft name = "crafting menu" icon = 'icons/mob/screen_midnight.dmi' icon_state = "craft" screen_loc = ui_crafting -/obj/screen/area_creator +/atom/movable/screen/area_creator name = "create new area" icon = 'icons/mob/screen_midnight.dmi' icon_state = "area_edit" screen_loc = ui_building -/obj/screen/area_creator/Click() +/atom/movable/screen/area_creator/Click() if(usr.incapacitated() || (isobserver(usr) && !IsAdminGhost(usr))) return TRUE var/area/A = get_area(usr) @@ -99,18 +95,18 @@ return TRUE create_area(usr) -/obj/screen/language_menu +/atom/movable/screen/language_menu name = "language menu" icon = 'icons/mob/screen_midnight.dmi' icon_state = "talk_wheel" screen_loc = ui_language_menu -/obj/screen/language_menu/Click() +/atom/movable/screen/language_menu/Click() var/mob/M = usr var/datum/language_holder/H = M.get_language_holder() H.open_language_menu(usr) -/obj/screen/inventory +/atom/movable/screen/inventory /// The identifier for the slot. It has nothing to do with ID cards. var/slot_id /// Icon when empty. For now used only by humans. @@ -122,7 +118,7 @@ layer = HUD_LAYER plane = HUD_PLANE -/obj/screen/inventory/Click(location, control, params) +/atom/movable/screen/inventory/Click(location, control, params) // At this point in client Click() code we have passed the 1/10 sec check and little else // We don't even know if it's a middle click // if(world.time <= usr.next_move) @@ -142,16 +138,34 @@ usr.update_inv_hands() return TRUE -/obj/screen/inventory/MouseEntered() +/atom/movable/screen/inventory/MouseEntered() ..() add_overlays() + //Apply the outline affect + add_stored_outline() -/obj/screen/inventory/MouseExited() +/atom/movable/screen/inventory/MouseExited() ..() cut_overlay(object_overlays) object_overlays.Cut() + remove_stored_outline() -/obj/screen/inventory/update_icon_state() +/atom/movable/screen/inventory/proc/add_stored_outline() + if(hud?.mymob && slot_id) + var/obj/item/inv_item = hud.mymob.get_item_by_slot(slot_id) + if(inv_item) + if(hud?.mymob.incapacitated() || (slot_id in hud?.mymob.check_obscured_slots()) || !hud?.mymob.canUnEquip(inv_item)) + inv_item.apply_outline(_size = 3) + else + inv_item.apply_outline() + +/atom/movable/screen/inventory/proc/remove_stored_outline() + if(hud?.mymob && slot_id) + var/obj/item/inv_item = hud.mymob.get_item_by_slot(slot_id) + if(inv_item) + inv_item.remove_outline() + +/atom/movable/screen/inventory/update_icon_state() if(!icon_empty) icon_empty = icon_state @@ -161,7 +175,7 @@ else icon_state = icon_empty -/obj/screen/inventory/proc/add_overlays() +/atom/movable/screen/inventory/proc/add_overlays() var/mob/user = hud?.mymob if(!user || !slot_id) @@ -184,12 +198,12 @@ // object_overlay = item_overlay add_overlay(object_overlays) -/obj/screen/inventory/hand +/atom/movable/screen/inventory/hand var/mutable_appearance/handcuff_overlay var/static/mutable_appearance/blocked_overlay = mutable_appearance('icons/mob/screen_gen.dmi', "blocked") var/held_index = 0 -/obj/screen/inventory/hand/update_overlays() +/atom/movable/screen/inventory/hand/update_overlays() . = ..() if(!handcuff_overlay) @@ -212,7 +226,7 @@ . += "hand_active" -/obj/screen/inventory/hand/Click(location, control, params) +/atom/movable/screen/inventory/hand/Click(location, control, params) // At this point in client Click() code we have passed the 1/10 sec check and little else // We don't even know if it's a middle click var/mob/user = hud?.mymob @@ -234,26 +248,26 @@ return TRUE -/obj/screen/drop +/atom/movable/screen/drop name = "drop" icon = 'icons/mob/screen_midnight.dmi' icon_state = "act_drop" layer = HUD_LAYER plane = HUD_PLANE -/obj/screen/drop/Click() +/atom/movable/screen/drop/Click() if(usr.stat == CONSCIOUS) usr.dropItemToGround(usr.get_active_held_item()) -/obj/screen/act_intent +/atom/movable/screen/act_intent name = "intent" icon_state = "help" screen_loc = ui_acti -/obj/screen/act_intent/Click(location, control, params) +/atom/movable/screen/act_intent/Click(location, control, params) usr.a_intent_change(INTENT_HOTKEY_RIGHT) -/obj/screen/act_intent/segmented/Click(location, control, params) +/atom/movable/screen/act_intent/segmented/Click(location, control, params) if(usr.client.prefs.toggles & INTENT_STYLE) var/_x = text2num(params2list(params)["icon-x"]) var/_y = text2num(params2list(params)["icon-y"]) @@ -272,20 +286,20 @@ else return ..() -/obj/screen/act_intent/alien +/atom/movable/screen/act_intent/alien icon = 'icons/mob/screen_alien.dmi' screen_loc = ui_movi -/obj/screen/act_intent/robot +/atom/movable/screen/act_intent/robot icon = 'icons/mob/screen_cyborg.dmi' screen_loc = ui_borg_intents -/obj/screen/internals +/atom/movable/screen/internals name = "toggle internals" icon_state = "internal0" screen_loc = ui_internal -/obj/screen/internals/Click() +/atom/movable/screen/internals/Click() if(!iscarbon(usr)) return var/mob/living/carbon/C = usr @@ -346,71 +360,71 @@ return C.update_action_buttons_icon() -/obj/screen/mov_intent +/atom/movable/screen/mov_intent name = "run/walk toggle" icon = 'icons/mob/screen_midnight.dmi' icon_state = "running" -/obj/screen/mov_intent/Initialize(mapload) +/atom/movable/screen/mov_intent/Initialize(mapload) . = ..() update_icon() -/obj/screen/mov_intent/Click() +/atom/movable/screen/mov_intent/Click() toggle(usr) -/obj/screen/mov_intent/update_icon_state() +/atom/movable/screen/mov_intent/update_icon_state() switch(hud?.mymob?.m_intent) if(MOVE_INTENT_WALK) icon_state = CONFIG_GET(flag/sprint_enabled)? "walking" : "walking_nosprint" if(MOVE_INTENT_RUN) icon_state = CONFIG_GET(flag/sprint_enabled)? "running" : "running_nosprint" -/obj/screen/mov_intent/proc/toggle(mob/user) +/atom/movable/screen/mov_intent/proc/toggle(mob/user) if(isobserver(user)) return user.toggle_move_intent(user) -/obj/screen/pull +/atom/movable/screen/pull name = "stop pulling" icon = 'icons/mob/screen_midnight.dmi' icon_state = "pull" -/obj/screen/pull/Click() +/atom/movable/screen/pull/Click() if(isobserver(usr)) return usr.stop_pulling() -/obj/screen/pull/update_icon_state() +/atom/movable/screen/pull/update_icon_state() if(hud?.mymob?.pulling) icon_state = "pull" else icon_state = "pull0" -/obj/screen/resist +/atom/movable/screen/resist name = "resist" icon = 'icons/mob/screen_midnight.dmi' icon_state = "act_resist" layer = HUD_LAYER plane = HUD_PLANE -/obj/screen/resist/Click() +/atom/movable/screen/resist/Click() if(isliving(usr)) var/mob/living/L = usr L.resist() -/obj/screen/rest +/atom/movable/screen/rest name = "rest" icon = 'icons/mob/screen_midnight.dmi' icon_state = "act_rest" layer = HUD_LAYER plane = HUD_PLANE -/obj/screen/rest/Click() +/atom/movable/screen/rest/Click() if(isliving(usr)) var/mob/living/L = usr L.lay_down() -/obj/screen/rest/update_icon_state() +/atom/movable/screen/rest/update_icon_state() var/mob/living/user = hud?.mymob if(!istype(user)) return @@ -419,17 +433,17 @@ else icon_state = "act_rest0" -/obj/screen/throw_catch +/atom/movable/screen/throw_catch name = "throw/catch" icon = 'icons/mob/screen_midnight.dmi' icon_state = "act_throw_off" -/obj/screen/throw_catch/Click() +/atom/movable/screen/throw_catch/Click() if(iscarbon(usr)) var/mob/living/carbon/C = usr C.toggle_throw_mode() -/obj/screen/zone_sel +/atom/movable/screen/zone_sel name = "damage zone" icon_state = "zone_sel" screen_loc = ui_zonesel @@ -437,7 +451,7 @@ var/static/list/hover_overlays_cache = list() var/hovering -/obj/screen/zone_sel/Click(location, control,params) +/atom/movable/screen/zone_sel/Click(location, control,params) if(isobserver(usr)) return @@ -450,10 +464,10 @@ return set_selected_zone(choice, usr) -/obj/screen/zone_sel/MouseEntered(location, control, params) +/atom/movable/screen/zone_sel/MouseEntered(location, control, params) MouseMove(location, control, params) -/obj/screen/zone_sel/MouseMove(location, control, params) +/atom/movable/screen/zone_sel/MouseMove(location, control, params) if(isobserver(usr)) return @@ -482,12 +496,12 @@ layer = ABOVE_HUD_LAYER plane = ABOVE_HUD_PLANE -/obj/screen/zone_sel/MouseExited(location, control, params) +/atom/movable/screen/zone_sel/MouseExited(location, control, params) if(!isobserver(usr) && hovering) vis_contents -= hover_overlays_cache[hovering] hovering = null -/obj/screen/zone_sel/proc/get_zone_at(icon_x, icon_y) +/atom/movable/screen/zone_sel/proc/get_zone_at(icon_x, icon_y) switch(icon_y) if(1 to 9) //Legs switch(icon_x) @@ -525,7 +539,7 @@ return BODY_ZONE_PRECISE_EYES return BODY_ZONE_HEAD -/obj/screen/zone_sel/proc/set_selected_zone(choice, mob/user) +/atom/movable/screen/zone_sel/proc/set_selected_zone(choice, mob/user) if(user != hud?.mymob) return @@ -535,21 +549,21 @@ return TRUE -/obj/screen/zone_sel/update_overlays() +/atom/movable/screen/zone_sel/update_overlays() . = ..() if(!hud?.mymob) return . += mutable_appearance(overlay_icon, "[hud.mymob.zone_selected]") -/obj/screen/zone_sel/alien +/atom/movable/screen/zone_sel/alien icon = 'icons/mob/screen_alien.dmi' overlay_icon = 'icons/mob/screen_alien.dmi' -/obj/screen/zone_sel/robot +/atom/movable/screen/zone_sel/robot icon = 'icons/mob/screen_cyborg.dmi' -/obj/screen/flash +/atom/movable/screen/flash name = "flash" icon_state = "blank" blend_mode = BLEND_ADD @@ -557,7 +571,7 @@ layer = FLASH_LAYER plane = FULLSCREEN_PLANE -/obj/screen/damageoverlay +/atom/movable/screen/damageoverlay icon = 'icons/mob/screen_full.dmi' icon_state = "oxydamageoverlay0" name = "dmg" @@ -567,87 +581,87 @@ layer = UI_DAMAGE_LAYER plane = FULLSCREEN_PLANE -/obj/screen/healths +/atom/movable/screen/healths name = "health" icon_state = "health0" screen_loc = ui_health -/obj/screen/healths/alien +/atom/movable/screen/healths/alien icon = 'icons/mob/screen_alien.dmi' screen_loc = ui_alien_health -/obj/screen/healths/robot +/atom/movable/screen/healths/robot icon = 'icons/mob/screen_cyborg.dmi' screen_loc = ui_borg_health -/obj/screen/healths/blob +/atom/movable/screen/healths/blob name = "blob health" icon_state = "block" screen_loc = ui_internal mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/healths/blob/naut +/atom/movable/screen/healths/blob/naut name = "health" icon = 'icons/mob/blob.dmi' icon_state = "nauthealth" -/obj/screen/healths/blob/naut/core +/atom/movable/screen/healths/blob/naut/core name = "overmind health" screen_loc = ui_health icon_state = "corehealth" -/obj/screen/healths/guardian +/atom/movable/screen/healths/guardian name = "summoner health" icon = 'icons/mob/guardian.dmi' icon_state = "base" screen_loc = ui_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/healths/clock +/atom/movable/screen/healths/clock icon = 'icons/mob/actions.dmi' icon_state = "bg_clock" screen_loc = ui_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/healths/clock/gear +/atom/movable/screen/healths/clock/gear icon = 'icons/mob/clockwork_mobs.dmi' icon_state = "bg_gear" screen_loc = ui_internal -/obj/screen/healths/revenant +/atom/movable/screen/healths/revenant name = "essence" icon = 'icons/mob/actions.dmi' icon_state = "bg_revenant" screen_loc = ui_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/healths/construct +/atom/movable/screen/healths/construct icon = 'icons/mob/screen_construct.dmi' icon_state = "artificer_health0" screen_loc = ui_construct_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/healths/lavaland_elite +/atom/movable/screen/healths/lavaland_elite icon = 'icons/mob/screen_elite.dmi' icon_state = "elite_health0" screen_loc = ui_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/healthdoll +/atom/movable/screen/healthdoll name = "health doll" screen_loc = ui_healthdoll -/obj/screen/healthdoll/living +/atom/movable/screen/healthdoll/living icon_state = "fullhealth0" screen_loc = ui_living_healthdoll var/filtered = FALSE //so we don't repeatedly create the mask of the mob every update -/obj/screen/mood +/atom/movable/screen/mood name = "mood" icon_state = "mood5" screen_loc = ui_mood -/obj/screen/splash +/atom/movable/screen/splash icon = 'icons/blank_title.png' icon_state = "" screen_loc = "1,1" @@ -655,7 +669,7 @@ plane = SPLASHSCREEN_PLANE var/client/holder -/obj/screen/splash/New(client/C, visible, use_previous_title) //TODO: Make this use INITIALIZE_IMMEDIATE, except its not easy +/atom/movable/screen/splash/New(client/C, visible, use_previous_title) //TODO: Make this use INITIALIZE_IMMEDIATE, except its not easy . = ..() holder = C @@ -674,7 +688,7 @@ holder.screen += src -/obj/screen/splash/proc/Fade(out, qdel_after = TRUE) +/atom/movable/screen/splash/proc/Fade(out, qdel_after = TRUE) if(QDELETED(src)) return if(out) @@ -685,20 +699,20 @@ if(qdel_after) QDEL_IN(src, 30) -/obj/screen/splash/Destroy() +/atom/movable/screen/splash/Destroy() if(holder) holder.screen -= src holder = null return ..() -/obj/screen/component_button - var/obj/screen/parent +/atom/movable/screen/component_button + var/atom/movable/screen/parent -/obj/screen/component_button/Initialize(mapload, obj/screen/parent) +/atom/movable/screen/component_button/Initialize(mapload, atom/movable/screen/parent) . = ..() src.parent = parent -/obj/screen/component_button/Click(params) +/atom/movable/screen/component_button/Click(params) if(parent) parent.component_click(src, params) diff --git a/code/_onclick/hud/screen_objects/clickdelay.dm b/code/_onclick/hud/screen_objects/clickdelay.dm index e0ad039cdf..c62f051c1a 100644 --- a/code/_onclick/hud/screen_objects/clickdelay.dm +++ b/code/_onclick/hud/screen_objects/clickdelay.dm @@ -1,37 +1,37 @@ -/obj/screen/action_bar +/atom/movable/screen/action_bar -/obj/screen/action_bar/Destroy() +/atom/movable/screen/action_bar/Destroy() STOP_PROCESSING(SShuds, src) return ..() -/obj/screen/action_bar/proc/mark_dirty() +/atom/movable/screen/action_bar/proc/mark_dirty() var/mob/living/L = hud?.mymob if(L?.client && update_to_mob(L)) START_PROCESSING(SShuds, src) -/obj/screen/action_bar/process() +/atom/movable/screen/action_bar/process() var/mob/living/L = hud?.mymob if(!L?.client || !update_to_mob(L)) return PROCESS_KILL -/obj/screen/action_bar/proc/update_to_mob(mob/living/L) +/atom/movable/screen/action_bar/proc/update_to_mob(mob/living/L) return FALSE -/datum/hud/var/obj/screen/action_bar/clickdelay/clickdelay +/datum/hud/var/atom/movable/screen/action_bar/clickdelay/clickdelay -/obj/screen/action_bar/clickdelay +/atom/movable/screen/action_bar/clickdelay name = "click delay" icon = 'icons/effects/progessbar.dmi' icon_state = "prog_bar_100" layer = 20 // under hand buttons -/obj/screen/action_bar/clickdelay/Initialize() +/atom/movable/screen/action_bar/clickdelay/Initialize() . = ..() var/matrix/M = new M.Scale(2, 1) transform = M -/obj/screen/action_bar/clickdelay/update_to_mob(mob/living/L) +/atom/movable/screen/action_bar/clickdelay/update_to_mob(mob/living/L) var/estimated = L.EstimatedNextActionTime() var/diff = estimated - L.last_action var/left = estimated - world.time @@ -41,14 +41,14 @@ icon_state = "prog_bar_[round(clamp(((diff - left)/diff) * 100, 0, 100), 5)]" return TRUE -/datum/hud/var/obj/screen/action_bar/resistdelay/resistdelay +/datum/hud/var/atom/movable/screen/action_bar/resistdelay/resistdelay -/obj/screen/action_bar/resistdelay +/atom/movable/screen/action_bar/resistdelay name = "resist delay" icon = 'icons/effects/progessbar.dmi' icon_state = "prog_bar_100" -/obj/screen/action_bar/resistdelay/update_to_mob(mob/living/L) +/atom/movable/screen/action_bar/resistdelay/update_to_mob(mob/living/L) var/diff = L.next_resist - L.last_resist var/left = L.next_resist - world.time if(left < 0 || diff < 0) diff --git a/code/_onclick/hud/screen_objects/sprint.dm b/code/_onclick/hud/screen_objects/sprint.dm index 326bb81745..f8760ddd85 100644 --- a/code/_onclick/hud/screen_objects/sprint.dm +++ b/code/_onclick/hud/screen_objects/sprint.dm @@ -1,19 +1,19 @@ -/obj/screen/mov_intent +/atom/movable/screen/mov_intent icon = 'modular_citadel/icons/ui/screen_midnight.dmi' -/obj/screen/sprintbutton +/atom/movable/screen/sprintbutton name = "toggle sprint" icon = 'modular_citadel/icons/ui/screen_midnight.dmi' icon_state = "act_sprint" layer = ABOVE_HUD_LAYER - 0.1 var/mutable_appearance/flashy -/obj/screen/sprintbutton/Click() +/atom/movable/screen/sprintbutton/Click() if(ishuman(usr)) var/mob/living/carbon/human/H = usr H.default_toggle_sprint() -/obj/screen/sprintbutton/update_icon_state() +/atom/movable/screen/sprintbutton/update_icon_state() var/mob/living/user = hud?.mymob if(!istype(user)) return @@ -24,7 +24,7 @@ else icon_state = "act_sprint" -/obj/screen/sprintbutton/update_overlays() +/atom/movable/screen/sprintbutton/update_overlays() . = ..() var/mob/living/carbon/user = hud?.mymob if(!istype(user) || !user.client) @@ -38,20 +38,20 @@ . += flashy //Sprint buffer onscreen code. -/datum/hud/var/obj/screen/sprint_buffer/sprint_buffer +/datum/hud/var/atom/movable/screen/sprint_buffer/sprint_buffer -/obj/screen/sprint_buffer +/atom/movable/screen/sprint_buffer name = "sprint buffer" icon = 'icons/effects/progessbar.dmi' icon_state = "prog_bar_100" -/obj/screen/sprint_buffer/Click() +/atom/movable/screen/sprint_buffer/Click() if(isliving(usr)) var/mob/living/L = usr to_chat(L, "Your sprint buffer's maximum capacity is [L.sprint_buffer_max]. It is currently at [L.sprint_buffer], regenerating at [L.sprint_buffer_regen_ds * 10] per second. \ Sprinting while this is empty will incur a [L.sprint_stamina_cost] stamina cost per tile.") -/obj/screen/sprint_buffer/proc/update_to_mob(mob/living/L) +/atom/movable/screen/sprint_buffer/proc/update_to_mob(mob/living/L) var/amount = 0 if(L.sprint_buffer_max > 0) amount = round(clamp((L.sprint_buffer / L.sprint_buffer_max) * 100, 0, 100), 5) diff --git a/code/_onclick/hud/screen_objects/stamina.dm b/code/_onclick/hud/screen_objects/stamina.dm index 98a387d32d..b4c4807ec8 100644 --- a/code/_onclick/hud/screen_objects/stamina.dm +++ b/code/_onclick/hud/screen_objects/stamina.dm @@ -1,21 +1,21 @@ -/datum/hud/var/obj/screen/staminas/staminas -/datum/hud/var/obj/screen/staminabuffer/staminabuffer +/datum/hud/var/atom/movable/screen/staminas/staminas +/datum/hud/var/atom/movable/screen/staminabuffer/staminabuffer -/obj/screen/staminas +/atom/movable/screen/staminas icon = 'modular_citadel/icons/ui/screen_gen.dmi' name = "stamina" icon_state = "stamina0" screen_loc = ui_stamina mouse_opacity = 1 -/obj/screen/staminas/Click(location,control,params) +/atom/movable/screen/staminas/Click(location,control,params) if(isliving(usr)) var/mob/living/L = usr CONFIG_CACHE_ENTRY_AND_FETCH_VALUE(number/stamina_combat/buffer_max, buffer_max) to_chat(L, "You have [L.getStaminaLoss()] stamina loss.
\
Your stamina buffer is [round((L.stamina_buffer / buffer_max) * 100, 0.1)]% full.
") -/obj/screen/staminas/update_icon_state() +/atom/movable/screen/staminas/update_icon_state() var/mob/living/carbon/user = hud?.mymob if(!user) return @@ -26,21 +26,21 @@ else icon_state = "stamina[clamp(FLOOR(user.getStaminaLoss() /20, 1), 0, 6)]" -/obj/screen/staminas/update_overlays() +/atom/movable/screen/staminas/update_overlays() . = ..() var/mob/living/carbon/user = hud?.mymob if(!user) return var/percent = user.getStaminaLoss() / STAMINA_CRIT if((user.stat == DEAD) || (user.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || (user.hal_screwyhud in 1 to 2)) - . += list("stamina_alert3") + . += list("stamina_alert3") else if(percent >= 0.85) . += list("stamina_alert2") else if(percent >= 0.7) . += list("stamina_alert1") //stam buffer -/obj/screen/staminabuffer +/atom/movable/screen/staminabuffer icon = 'modular_citadel/icons/ui/screen_gen.dmi' name = "stamina buffer" icon_state = "stambuffer0" @@ -48,19 +48,19 @@ layer = ABOVE_HUD_LAYER + 0.1 mouse_opacity = 0 -/obj/screen/staminabuffer/proc/mark_dirty() +/atom/movable/screen/staminabuffer/proc/mark_dirty() if(update_to_mob()) START_PROCESSING(SShuds, src) -/obj/screen/staminabuffer/process() +/atom/movable/screen/staminabuffer/process() if(!update_to_mob()) return PROCESS_KILL -/obj/screen/staminabuffer/Destroy() +/atom/movable/screen/staminabuffer/Destroy() STOP_PROCESSING(SShuds, src) return ..() -/obj/screen/staminabuffer/proc/update_to_mob() +/atom/movable/screen/staminabuffer/proc/update_to_mob() var/mob/living/carbon/user = hud?.mymob user.UpdateStaminaBuffer(FALSE) CONFIG_CACHE_ENTRY_AND_FETCH_VALUE(number/stamina_combat/buffer_max, buffer_max) diff --git a/code/_onclick/hud/screen_objects/storage.dm b/code/_onclick/hud/screen_objects/storage.dm index 1ce1df24c6..55156d9b0d 100644 --- a/code/_onclick/hud/screen_objects/storage.dm +++ b/code/_onclick/hud/screen_objects/storage.dm @@ -1,12 +1,12 @@ -/obj/screen/storage +/atom/movable/screen/storage name = "storage" var/insertion_click = FALSE -/obj/screen/storage/Initialize(mapload, new_master) +/atom/movable/screen/storage/Initialize(mapload, new_master) . = ..() master = new_master -/obj/screen/storage/Click(location, control, params) +/atom/movable/screen/storage/Click(location, control, params) if(!insertion_click) return ..() if(hud?.mymob && (hud.mymob != usr)) @@ -18,7 +18,7 @@ master.attackby(null, I, usr, params) return TRUE -/obj/screen/storage/boxes +/atom/movable/screen/storage/boxes name = "storage" icon_state = "block" screen_loc = "7,7 to 10,8" @@ -26,83 +26,83 @@ plane = HUD_PLANE insertion_click = TRUE -/obj/screen/storage/close +/atom/movable/screen/storage/close name = "close" layer = ABOVE_HUD_LAYER plane = ABOVE_HUD_PLANE icon_state = "backpack_close" -/obj/screen/storage/close/Click() +/atom/movable/screen/storage/close/Click() var/datum/component/storage/S = master S.close(usr) return TRUE -/obj/screen/storage/left +/atom/movable/screen/storage/left icon_state = "storage_start" insertion_click = TRUE -/obj/screen/storage/right +/atom/movable/screen/storage/right icon_state = "storage_end" insertion_click = TRUE -/obj/screen/storage/continuous +/atom/movable/screen/storage/continuous icon_state = "storage_continue" insertion_click = TRUE -/obj/screen/storage/volumetric_box +/atom/movable/screen/storage/volumetric_box icon_state = "stored_continue" layer = VOLUMETRIC_STORAGE_BOX_LAYER plane = VOLUMETRIC_STORAGE_BOX_PLANE var/obj/item/our_item -/obj/screen/storage/volumetric_box/Initialize(mapload, new_master, obj/item/our_item) +/atom/movable/screen/storage/volumetric_box/Initialize(mapload, new_master, obj/item/our_item) src.our_item = our_item RegisterSignal(our_item, COMSIG_ITEM_MOUSE_ENTER, .proc/on_item_mouse_enter) RegisterSignal(our_item, COMSIG_ITEM_MOUSE_EXIT, .proc/on_item_mouse_exit) return ..() -/obj/screen/storage/volumetric_box/Destroy() +/atom/movable/screen/storage/volumetric_box/Destroy() makeItemInactive() our_item = null return ..() -/obj/screen/storage/volumetric_box/Click(location, control, params) +/atom/movable/screen/storage/volumetric_box/Click(location, control, params) return our_item.Click(location, control, params) -/obj/screen/storage/volumetric_box/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) +/atom/movable/screen/storage/volumetric_box/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) return our_item.MouseDrop(over, src_location, over_location, src_control, over_control, params) -/obj/screen/storage/volumetric_box/MouseExited(location, control, params) +/atom/movable/screen/storage/volumetric_box/MouseExited(location, control, params) makeItemInactive() -/obj/screen/storage/volumetric_box/MouseEntered(location, control, params) +/atom/movable/screen/storage/volumetric_box/MouseEntered(location, control, params) makeItemActive() -/obj/screen/storage/volumetric_box/proc/on_item_mouse_enter() +/atom/movable/screen/storage/volumetric_box/proc/on_item_mouse_enter() makeItemActive() -/obj/screen/storage/volumetric_box/proc/on_item_mouse_exit() +/atom/movable/screen/storage/volumetric_box/proc/on_item_mouse_exit() makeItemInactive() -/obj/screen/storage/volumetric_box/proc/makeItemInactive() +/atom/movable/screen/storage/volumetric_box/proc/makeItemInactive() return -/obj/screen/storage/volumetric_box/proc/makeItemActive() +/atom/movable/screen/storage/volumetric_box/proc/makeItemActive() return -/obj/screen/storage/volumetric_box/center +/atom/movable/screen/storage/volumetric_box/center icon_state = "stored_continue" - var/obj/screen/storage/volumetric_edge/stored_left/left - var/obj/screen/storage/volumetric_edge/stored_right/right - var/obj/screen/storage/item_holder/holder + var/atom/movable/screen/storage/volumetric_edge/stored_left/left + var/atom/movable/screen/storage/volumetric_edge/stored_right/right + var/atom/movable/screen/storage/item_holder/holder var/pixel_size -/obj/screen/storage/volumetric_box/center/Initialize(mapload, new_master, our_item) +/atom/movable/screen/storage/volumetric_box/center/Initialize(mapload, new_master, our_item) left = new(null, src, our_item) right = new(null, src, our_item) return ..() -/obj/screen/storage/volumetric_box/center/Destroy() +/atom/movable/screen/storage/volumetric_box/center/Destroy() QDEL_NULL(left) QDEL_NULL(right) vis_contents.Cut() @@ -110,13 +110,13 @@ QDEL_NULL(holder) return ..() -/obj/screen/storage/volumetric_box/center/proc/on_screen_objects() +/atom/movable/screen/storage/volumetric_box/center/proc/on_screen_objects() return list(src) /** * Sets the size of this box screen object and regenerates its left/right borders. This includes the actual border's size! */ -/obj/screen/storage/volumetric_box/center/proc/set_pixel_size(pixels) +/atom/movable/screen/storage/volumetric_box/center/proc/set_pixel_size(pixels) if(pixel_size == pixels) return pixel_size = pixels @@ -139,59 +139,59 @@ add_overlay(left) add_overlay(right) -/obj/screen/storage/volumetric_box/center/makeItemInactive() +/atom/movable/screen/storage/volumetric_box/center/makeItemInactive() if(!holder) return holder.layer = VOLUMETRIC_STORAGE_ITEM_LAYER holder.plane = VOLUMETRIC_STORAGE_ITEM_PLANE -/obj/screen/storage/volumetric_box/center/makeItemActive() +/atom/movable/screen/storage/volumetric_box/center/makeItemActive() if(!holder) return holder.our_item.layer = VOLUMETRIC_STORAGE_ACTIVE_ITEM_LAYER //make sure we display infront of the others! holder.our_item.plane = VOLUMETRIC_STORAGE_ACTIVE_ITEM_PLANE -/obj/screen/storage/volumetric_edge +/atom/movable/screen/storage/volumetric_edge layer = VOLUMETRIC_STORAGE_BOX_LAYER plane = VOLUMETRIC_STORAGE_BOX_PLANE -/obj/screen/storage/volumetric_edge/Initialize(mapload, master, our_item) +/atom/movable/screen/storage/volumetric_edge/Initialize(mapload, master, our_item) src.master = master return ..() -/obj/screen/storage/volumetric_edge/Click(location, control, params) +/atom/movable/screen/storage/volumetric_edge/Click(location, control, params) return master.Click(location, control, params) -/obj/screen/storage/volumetric_edge/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) +/atom/movable/screen/storage/volumetric_edge/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) return master.MouseDrop(over, src_location, over_location, src_control, over_control, params) -/obj/screen/storage/volumetric_edge/MouseExited(location, control, params) +/atom/movable/screen/storage/volumetric_edge/MouseExited(location, control, params) return master.MouseExited(location, control, params) -/obj/screen/storage/volumetric_edge/MouseEntered(location, control, params) +/atom/movable/screen/storage/volumetric_edge/MouseEntered(location, control, params) return master.MouseEntered(location, control, params) -/obj/screen/storage/volumetric_edge/stored_left +/atom/movable/screen/storage/volumetric_edge/stored_left icon_state = "stored_start" appearance_flags = APPEARANCE_UI | KEEP_APART | RESET_TRANSFORM // Yes I know RESET_TRANSFORM is in APPEARANCE_UI but we're hard-asserting this incase someone changes it. -/obj/screen/storage/volumetric_edge/stored_right +/atom/movable/screen/storage/volumetric_edge/stored_right icon_state = "stored_end" appearance_flags = APPEARANCE_UI | KEEP_APART | RESET_TRANSFORM -/obj/screen/storage/item_holder +/atom/movable/screen/storage/item_holder var/obj/item/our_item vis_flags = NONE -/obj/screen/storage/item_holder/Initialize(mapload, new_master, obj/item/I) +/atom/movable/screen/storage/item_holder/Initialize(mapload, new_master, obj/item/I) . = ..() our_item = I vis_contents += I -/obj/screen/storage/item_holder/Destroy() +/atom/movable/screen/storage/item_holder/Destroy() vis_contents.Cut() our_item = null return ..() -/obj/screen/storage/item_holder/Click(location, control, params) +/atom/movable/screen/storage/item_holder/Click(location, control, params) return our_item.Click(location, control, params) diff --git a/code/_onclick/hud/screen_objects/vore.dm b/code/_onclick/hud/screen_objects/vore.dm index 017f7f3485..91aa8f318c 100644 --- a/code/_onclick/hud/screen_objects/vore.dm +++ b/code/_onclick/hud/screen_objects/vore.dm @@ -1,9 +1,9 @@ -/obj/screen/voretoggle +/atom/movable/screen/voretoggle name = "toggle vore mode" icon = 'modular_citadel/icons/ui/screen_midnight.dmi' icon_state = "nom_off" -/obj/screen/voretoggle/Click() +/atom/movable/screen/voretoggle/Click() if(usr != hud.mymob) return var/mob/living/carbon/C = usr @@ -12,7 +12,7 @@ return C.toggle_vore_mode() -/obj/screen/voretoggle/update_icon_state() +/atom/movable/screen/voretoggle/update_icon_state() var/mob/living/carbon/user = hud?.mymob if(!istype(user)) return diff --git a/code/_onclick/hud/simple_animal.dm b/code/_onclick/hud/simple_animal.dm index ef46c0d66e..2f7902c965 100644 --- a/code/_onclick/hud/simple_animal.dm +++ b/code/_onclick/hud/simple_animal.dm @@ -2,7 +2,7 @@ ui_style = 'icons/mob/screen_gen.dmi' /datum/hud/living/simple_animal/New(mob/living/owner) ..() - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = ui_style pull_icon.update_icon() pull_icon.screen_loc = ui_living_pull @@ -10,6 +10,6 @@ static_inventory += pull_icon //mob health doll! assumes whatever sprite the mob is - healthdoll = new /obj/screen/healthdoll/living() + healthdoll = new /atom/movable/screen/healthdoll/living() healthdoll.hud = src infodisplay += healthdoll diff --git a/code/_onclick/hud/swarmer.dm b/code/_onclick/hud/swarmer.dm index 80cc01c3b3..6aba23fab5 100644 --- a/code/_onclick/hud/swarmer.dm +++ b/code/_onclick/hud/swarmer.dm @@ -1,98 +1,98 @@ -/obj/screen/swarmer +/atom/movable/screen/swarmer icon = 'icons/mob/swarmer.dmi' -/obj/screen/swarmer/FabricateTrap +/atom/movable/screen/swarmer/FabricateTrap icon_state = "ui_trap" name = "Create trap (Costs 5 Resources)" desc = "Creates a trap that will nonlethally shock any non-swarmer that attempts to cross it. (Costs 5 resources)" -/obj/screen/swarmer/FabricateTrap/Click() +/atom/movable/screen/swarmer/FabricateTrap/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr S.CreateTrap() -/obj/screen/swarmer/Barricade +/atom/movable/screen/swarmer/Barricade icon_state = "ui_barricade" name = "Create barricade (Costs 5 Resources)" desc = "Creates a destructible barricade that will stop any non swarmer from passing it. Also allows disabler beams to pass through. (Costs 5 resources)" -/obj/screen/swarmer/Barricade/Click() +/atom/movable/screen/swarmer/Barricade/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr S.CreateBarricade() -/obj/screen/swarmer/Replicate +/atom/movable/screen/swarmer/Replicate icon_state = "ui_replicate" name = "Replicate (Costs 50 Resources)" desc = "Creates another of our kind." -/obj/screen/swarmer/Replicate/Click() +/atom/movable/screen/swarmer/Replicate/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr S.CreateSwarmer() -/obj/screen/swarmer/RepairSelf +/atom/movable/screen/swarmer/RepairSelf icon_state = "ui_self_repair" name = "Repair self" desc = "Repairs damage to our body." -/obj/screen/swarmer/RepairSelf/Click() +/atom/movable/screen/swarmer/RepairSelf/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr S.RepairSelf() -/obj/screen/swarmer/ToggleLight +/atom/movable/screen/swarmer/ToggleLight icon_state = "ui_light" name = "Toggle light" desc = "Toggles our inbuilt light on or off." -/obj/screen/swarmer/ToggleLight/Click() +/atom/movable/screen/swarmer/ToggleLight/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr S.ToggleLight() -/obj/screen/swarmer/ContactSwarmers +/atom/movable/screen/swarmer/ContactSwarmers icon_state = "ui_contact_swarmers" name = "Contact swarmers" desc = "Sends a message to all other swarmers, should they exist." -/obj/screen/swarmer/ContactSwarmers/Click() +/atom/movable/screen/swarmer/ContactSwarmers/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr S.ContactSwarmers() /datum/hud/swarmer/New(mob/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using - using = new /obj/screen/swarmer/FabricateTrap() + using = new /atom/movable/screen/swarmer/FabricateTrap() using.screen_loc = ui_hand_position(2) using.hud = src static_inventory += using - using = new /obj/screen/swarmer/Barricade() + using = new /atom/movable/screen/swarmer/Barricade() using.screen_loc = ui_hand_position(1) using.hud = src static_inventory += using - using = new /obj/screen/swarmer/Replicate() + using = new /atom/movable/screen/swarmer/Replicate() using.screen_loc = ui_zonesel using.hud = src static_inventory += using - using = new /obj/screen/swarmer/RepairSelf() + using = new /atom/movable/screen/swarmer/RepairSelf() using.screen_loc = ui_storage1 using.hud = src static_inventory += using - using = new /obj/screen/swarmer/ToggleLight() + using = new /atom/movable/screen/swarmer/ToggleLight() using.screen_loc = ui_back using.hud = src static_inventory += using - using = new /obj/screen/swarmer/ContactSwarmers() + using = new /atom/movable/screen/swarmer/ContactSwarmers() using.screen_loc = ui_inventory using.hud = src static_inventory += using diff --git a/code/controllers/admin.dm b/code/controllers/admin.dm index 19fef28597..5c767ecb1b 100644 --- a/code/controllers/admin.dm +++ b/code/controllers/admin.dm @@ -1,14 +1,25 @@ // Clickable stat() button. /obj/effect/statclick name = "Initializing..." + // blocks_emissive = NONE var/target INITIALIZE_IMMEDIATE(/obj/effect/statclick) -/obj/effect/statclick/Initialize(mapload, text, target) //Don't port this to Initialize it's too critical +/obj/effect/statclick/Initialize(mapload, text, target) . = ..() name = text src.target = target + if(istype(target, /datum)) //Harddel man bad + RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/cleanup) + +/obj/effect/statclick/Destroy() + target = null + return ..() + +/obj/effect/statclick/proc/cleanup() + SIGNAL_HANDLER + qdel(src) /obj/effect/statclick/proc/update(text) name = text @@ -51,3 +62,30 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick) SSblackbox.record_feedback("tally", "admin_verb", 1, "Restart Failsafe Controller") message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.") + +/client/proc/debug_controller() + set category = "Debug" + set name = "Debug Controller" + set desc = "Debug the various periodic loop controllers for the game (be careful!)" + + if(!holder) + return + + var/list/controllers = list() + var/list/controller_choices = list() + + for (var/datum/controller/controller in world) + if (istype(controller, /datum/controller/subsystem)) + continue + controllers["[controller] (controller.type)"] = controller //we use an associated list to ensure clients can't hold references to controllers + controller_choices += "[controller] (controller.type)" + + var/datum/controller/controller_string = input("Select controller to debug", "Debug Controller") as null|anything in controller_choices + var/datum/controller/controller = controllers[controller_string] + + if (!istype(controller)) + return + debug_variables(controller) + + SSblackbox.record_feedback("tally", "admin_verb", 1, "Restart Failsafe Controller") + message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.") diff --git a/code/controllers/configuration/entries/admin.dm b/code/controllers/configuration/entries/admin.dm new file mode 100644 index 0000000000..1f9b5d460f --- /dev/null +++ b/code/controllers/configuration/entries/admin.dm @@ -0,0 +1,66 @@ +/datum/config_entry/flag/admin_legacy_system //Defines whether the server uses the legacy admin system with admins.txt or the SQL system + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/protect_legacy_admins //Stops any admins loaded by the legacy system from having their rank edited by the permissions panel + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/protect_legacy_ranks //Stops any ranks loaded by the legacy system from having their flags edited by the permissions panel + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/enable_localhost_rank //Gives the !localhost! rank to any client connecting from 127.0.0.1 or ::1 + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/load_legacy_ranks_only //Loads admin ranks only from legacy admin_ranks.txt, while enabled ranks are mirrored to the database + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/mentors_mobname_only + +/datum/config_entry/flag/mentor_legacy_system //Defines whether the server uses the legacy mentor system with mentors.txt or the SQL system + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/forbid_singulo_possession + +/datum/config_entry/flag/see_own_notes //Can players see their own admin notes + +/datum/config_entry/number/note_fresh_days + config_entry_value = null + min_val = 0 + integer = FALSE + +/datum/config_entry/number/note_stale_days + config_entry_value = null + min_val = 0 + integer = FALSE + +/datum/config_entry/flag/autoconvert_notes //if all connecting player's notes should attempt to be converted to the database + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/announce_admin_logout + +/datum/config_entry/flag/announce_admin_login + +/datum/config_entry/string/centcom_ban_db // URL for the CentCom Galactic Ban DB API + +/datum/config_entry/string/centcom_source_whitelist + +/datum/config_entry/flag/autoadmin // if autoadmin is enabled + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/string/autoadmin_rank // the rank for autoadmins + config_entry_value = "Game Master" + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/allow_admin_ooccolor // Allows admins with relevant permissions to have their own ooc colour + +/datum/config_entry/flag/popup_admin_pm // adminPMs to non-admins show in a pop-up 'reply' window when set + +/datum/config_entry/flag/guest_jobban + +/datum/config_entry/flag/ban_legacy_system //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/guest_ban + +/datum/config_entry/flag/automute_on //enables automuting/spam prevention + +/datum/config_entry/flag/debug_admin_hrefs diff --git a/code/controllers/configuration/entries/alert.dm b/code/controllers/configuration/entries/alert.dm new file mode 100644 index 0000000000..6177c602db --- /dev/null +++ b/code/controllers/configuration/entries/alert.dm @@ -0,0 +1,26 @@ +/datum/config_entry/string/alert_green + config_entry_value = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." + +/datum/config_entry/string/alert_blue_upto + config_entry_value = "The station has received reliable information about potential threats to the station. Security staff may have weapons visible, random searches are permitted." + +/datum/config_entry/string/alert_blue_downto + config_entry_value = "Significant confirmed threats have been neutralized. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still permitted." + +/datum/config_entry/string/alert_amber_upto + config_entry_value = "There are significant confirmed threats to the station. Security staff may have weapons unholstered at all times. Random searches are allowed and advised." + +/datum/config_entry/string/alert_amber_downto + config_entry_value = "The immediate threat has passed. Security is no longer authorized to use lethal force, but may continue to have weapons drawn. Access requirements have been restored." + +/datum/config_entry/string/alert_red_upto + config_entry_value = "There is an immediate serious threat to the station. Security is now authorized to use lethal force. Additionally, access requirements on some machines have been lifted." + +/datum/config_entry/string/alert_red_downto + config_entry_value = "The station's destruction has been averted. There is still however an immediate serious threat to the station. Security is still authorized to use lethal force." + +/datum/config_entry/string/alert_delta + config_entry_value = "Destruction of the station is imminent. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill." + +/datum/config_entry/number/minimum_secborg_alert //Minimum alert level for secborgs to be chosen. + config_entry_value = 3 diff --git a/code/controllers/configuration/entries/antag_rep.dm b/code/controllers/configuration/entries/antag_rep.dm new file mode 100644 index 0000000000..c34eef4159 --- /dev/null +++ b/code/controllers/configuration/entries/antag_rep.dm @@ -0,0 +1,17 @@ +/datum/config_entry/flag/use_antag_rep // see game_options.txt for details + +/datum/config_entry/number/antag_rep_maximum + config_entry_value = 200 + min_val = 0 + +/datum/config_entry/number/default_antag_tickets + config_entry_value = 100 + min_val = 0 + +/datum/config_entry/number/max_tickets_per_roll + config_entry_value = 100 + min_val = 0 + +/datum/config_entry/keyed_list/antag_rep + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM diff --git a/code/controllers/configuration/entries/connections.dm b/code/controllers/configuration/entries/connections.dm new file mode 100644 index 0000000000..acdf588e5a --- /dev/null +++ b/code/controllers/configuration/entries/connections.dm @@ -0,0 +1,106 @@ +/datum/config_entry/flag/panic_bunker // prevents people the server hasn't seen before from connecting + +/datum/config_entry/number/panic_bunker_living // living time in minutes that a player needs to pass the panic bunker + +/datum/config_entry/string/panic_bunker_message + config_entry_value = "Sorry but the server is currently not accepting connections from never before seen players." + +/datum/config_entry/string/panic_server_name + +/datum/config_entry/string/panic_server_name/ValidateAndSet(str_val) + return str_val != "\[Put the name here\]" && ..() + +/datum/config_entry/string/panic_server_address //Reconnect a player this linked server if this server isn't accepting new players + +/datum/config_entry/string/panic_server_address/ValidateAndSet(str_val) + return str_val != "byond://address:port" && ..() + +/datum/config_entry/number/max_bunker_days + config_entry_value = 7 + min_val = 1 + +/datum/config_entry/number/notify_new_player_age // how long do we notify admins of a new player + min_val = -1 + +/datum/config_entry/number/notify_new_player_account_age // how long do we notify admins of a new byond account + min_val = 0 + +/datum/config_entry/flag/age_verification //are we using the automated age verification which asks users if they're 18+? + config_entry_value = TRUE + +/datum/config_entry/flag/irc_first_connection_alert // do we notify the irc channel when somebody is connecting for the first time? + +/datum/config_entry/flag/check_randomizer + +/datum/config_entry/string/ipintel_email + +/datum/config_entry/string/ipintel_email/ValidateAndSet(str_val) + return str_val != "ch@nge.me" && ..() + +/datum/config_entry/number/ipintel_rating_bad + config_entry_value = 1 + integer = FALSE + min_val = 0 + max_val = 1 + +/datum/config_entry/number/ipintel_save_good + config_entry_value = 12 + min_val = 0 + +/datum/config_entry/number/ipintel_save_bad + config_entry_value = 1 + min_val = 0 + +/datum/config_entry/string/ipintel_domain + config_entry_value = "check.getipintel.net" + +/datum/config_entry/flag/aggressive_changelog + +/datum/config_entry/flag/allow_webclient + +/datum/config_entry/flag/webclient_only_byond_members + +/datum/config_entry/number/client_warn_version + config_entry_value = null + min_val = 500 + +/datum/config_entry/number/client_warn_version + config_entry_value = null + min_val = 500 + +/datum/config_entry/string/client_warn_message + config_entry_value = "Your version of byond may have issues or be blocked from accessing this server in the future." + +/datum/config_entry/flag/client_warn_popup + +/datum/config_entry/number/client_error_version + config_entry_value = null + min_val = 500 + +/datum/config_entry/string/client_error_message + config_entry_value = "Your version of byond is too old, may have issues, and is blocked from accessing this server." + +/datum/config_entry/number/client_error_build + config_entry_value = null + min_val = 0 + +/datum/config_entry/number/soft_popcap + config_entry_value = null + min_val = 0 + +/datum/config_entry/number/hard_popcap + config_entry_value = null + min_val = 0 + +/datum/config_entry/number/extreme_popcap + config_entry_value = null + min_val = 0 + +/datum/config_entry/string/soft_popcap_message + config_entry_value = "Be warned that the server is currently serving a high number of users, consider using alternative game servers." + +/datum/config_entry/string/hard_popcap_message + config_entry_value = "The server is currently serving a high number of users, You cannot currently join. You may wait for the number of living crew to decline, observe, or find alternative servers." + +/datum/config_entry/string/extreme_popcap_message + config_entry_value = "The server is currently serving a high number of users, find alternative servers." diff --git a/code/controllers/configuration/entries/debris.dm b/code/controllers/configuration/entries/debris.dm new file mode 100644 index 0000000000..1cc2c2d7b7 --- /dev/null +++ b/code/controllers/configuration/entries/debris.dm @@ -0,0 +1,16 @@ +/// Amount of dirtyness tiles need to spawn dirt. +/datum/config_entry/number/turf_dirt_threshold + config_entry_value = 100 + min_val = 1 + integer = TRUE + +/// Alpha dirt starts at +/datum/config_entry/number/dirt_alpha_starting + config_entry_value = 127 + max_val = 255 + min_val = 0 + integer = TRUE + +/// Dirtyness multiplier for making turfs dirty +/datum/config_entry/number/turf_dirty_multiplier + config_entry_value = 1 diff --git a/code/controllers/configuration/entries/fetish_content.dm b/code/controllers/configuration/entries/fetish_content.dm new file mode 100644 index 0000000000..1de796a11d --- /dev/null +++ b/code/controllers/configuration/entries/fetish_content.dm @@ -0,0 +1,45 @@ +/datum/config_entry/keyed_list/breasts_cups_prefs + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_FLAG + config_entry_value = list("a", "b", "c", "d", "e") //keep these lowercase + +/datum/config_entry/number/penis_min_inches_prefs + config_entry_value = 1 + min_val = 0 + +/datum/config_entry/number/penis_max_inches_prefs + config_entry_value = 20 + min_val = 0 + +/datum/config_entry/keyed_list/safe_visibility_toggles + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_FLAG + config_entry_value = list(GEN_VISIBLE_NO_CLOTHES, GEN_VISIBLE_NO_UNDIES, GEN_VISIBLE_NEVER) //refer to cit_helpers for all toggles. + +//Body size configs, the feature will be disabled if both min and max have the same value. +/datum/config_entry/number/body_size_min + config_entry_value = 0.9 + min_val = 0.1 //to avoid issues with zeros and negative values. + max_val = RESIZE_DEFAULT_SIZE + integer = FALSE + +/datum/config_entry/number/body_size_max + config_entry_value = 1.25 + min_val = RESIZE_DEFAULT_SIZE + integer = FALSE + +//Penalties given to characters with a body size smaller than this value, +//to compensate for their smaller hitbox. +//To disable, just make sure the value is lower than 'body_size_min' +/datum/config_entry/number/threshold_body_size_penalty + config_entry_value = RESIZE_DEFAULT_SIZE + min_val = 0 + max_val = RESIZE_DEFAULT_SIZE + integer = FALSE + +//multiplicative slowdown multiplier. See 'dna.update_body_size' for the operation. +//doesn't apply to floating or crawling mobs +/datum/config_entry/number/body_size_slowdown_multiplier + config_entry_value = 0 + min_val = 0 + integer = FALSE diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm deleted file mode 100644 index 08989469f5..0000000000 --- a/code/controllers/configuration/entries/game_options.dm +++ /dev/null @@ -1,619 +0,0 @@ -/datum/config_entry/number_list/repeated_mode_adjust - -/datum/config_entry/keyed_list/probability - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_NUM - -/datum/config_entry/keyed_list/probability/ValidateListEntry(key_name) - return key_name in config.modes - -/datum/config_entry/keyed_list/chaos_level - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_NUM - -/datum/config_entry/keyed_list/chaos_level/ValidateListEntry(key_name) - return key_name in config.modes - -/datum/config_entry/keyed_list/max_pop - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_NUM - -/datum/config_entry/keyed_list/max_pop/ValidateListEntry(key_name) - return key_name in config.modes - -/datum/config_entry/keyed_list/min_pop - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_NUM - -/datum/config_entry/keyed_list/min_pop/ValidateListEntry(key_name, key_value) - return key_name in config.modes - -/datum/config_entry/keyed_list/continuous // which roundtypes continue if all antagonists die - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_FLAG - -/datum/config_entry/keyed_list/continuous/ValidateListEntry(key_name, key_value) - return key_name in config.modes - -/datum/config_entry/keyed_list/midround_antag // which roundtypes use the midround antagonist system - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_FLAG - -/datum/config_entry/keyed_list/midround_antag/ValidateListEntry(key_name, key_value) - return key_name in config.modes - -/datum/config_entry/keyed_list/force_antag_count - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_FLAG - -/datum/config_entry/keyed_list/force_antag_count/ValidateListEntry(key_name, key_value) - return key_name in config.modes - -/datum/config_entry/keyed_list/policy - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_TEXT - -/datum/config_entry/number/damage_multiplier - config_entry_value = 1 - integer = FALSE - -/datum/config_entry/number/minimal_access_threshold //If the number of players is larger than this threshold, minimal access will be turned on. - min_val = 0 - -/datum/config_entry/flag/jobs_have_minimal_access //determines whether jobs use minimal access or expanded access. - -/datum/config_entry/flag/assistants_have_maint_access - -/datum/config_entry/flag/security_has_maint_access - -/datum/config_entry/flag/everyone_has_maint_access - -/datum/config_entry/flag/sec_start_brig //makes sec start in brig instead of dept sec posts - -/datum/config_entry/flag/force_random_names - -/datum/config_entry/flag/humans_need_surnames - -/datum/config_entry/flag/allow_ai // allow ai job - -/datum/config_entry/flag/allow_ai_multicam //whether the AI can use their multicam - -/datum/config_entry/flag/disable_human_mood - -/datum/config_entry/flag/disable_borg_flash_knockdown //Should borg flashes be capable of knocking humanoid entities down? - -/datum/config_entry/flag/weaken_secborg //Brings secborgs and k9s back in-line with the other borg modules - -/datum/config_entry/flag/disable_secborg // disallow secborg module to be chosen. - -/datum/config_entry/flag/disable_peaceborg - -/datum/config_entry/flag/economy //money money money money money money money money money money money money - -/datum/config_entry/number/minimum_secborg_alert //Minimum alert level for secborgs to be chosen. - config_entry_value = 3 - -/datum/config_entry/number/traitor_scaling_coeff //how much does the amount of players get divided by to determine traitors - config_entry_value = 6 - min_val = 1 - -/datum/config_entry/number/brother_scaling_coeff //how many players per brother team - config_entry_value = 25 - min_val = 1 - -/datum/config_entry/number/changeling_scaling_coeff //how much does the amount of players get divided by to determine changelings - config_entry_value = 6 - min_val = 1 - -/datum/config_entry/number/ecult_scaling_coeff //how much does the amount of players get divided by to determine e_cult - config_entry_value = 6 - integer = FALSE - min_val = 1 - -/datum/config_entry/number/security_scaling_coeff //how much does the amount of players get divided by to determine open security officer positions - config_entry_value = 8 - min_val = 1 - -/datum/config_entry/number/abductor_scaling_coeff //how many players per abductor team - config_entry_value = 15 - min_val = 1 - -/datum/config_entry/number/traitor_objectives_amount - config_entry_value = 2 - min_val = 0 - -/datum/config_entry/number/brother_objectives_amount - config_entry_value = 2 - min_val = 0 - -/datum/config_entry/flag/reactionary_explosions //If we use reactionary explosions, explosions that react to walls and doors - -/datum/config_entry/flag/protect_roles_from_antagonist //If security and such can be traitor/cult/other - -/datum/config_entry/flag/protect_assistant_from_antagonist //If assistants can be traitor/cult/other - -/datum/config_entry/flag/enforce_human_authority //If non-human species are barred from joining as a head of staff - -/datum/config_entry/flag/allow_latejoin_antagonists // If late-joining players can be traitor/changeling - -/datum/config_entry/flag/use_antag_rep // see game_options.txt for details - -/datum/config_entry/number/antag_rep_maximum - config_entry_value = 200 - min_val = 0 - -/datum/config_entry/number/default_antag_tickets - config_entry_value = 100 - min_val = 0 - -/datum/config_entry/number/max_tickets_per_roll - config_entry_value = 100 - min_val = 0 - -/datum/config_entry/number/midround_antag_time_check // How late (in minutes you want the midround antag system to stay on, setting this to 0 will disable the system) - config_entry_value = 60 - min_val = 0 - -/datum/config_entry/number/midround_antag_life_check // A ratio of how many people need to be alive in order for the round not to immediately end in midround antagonist - config_entry_value = 0.7 - integer = FALSE - min_val = 0 - max_val = 1 - -/datum/config_entry/number/suicide_reenter_round_timer - config_entry_value = 30 - min_val = 0 - -/datum/config_entry/number/roundstart_suicide_time_limit - config_entry_value = 30 - min_val = 0 - -/datum/config_entry/number/shuttle_refuel_delay - config_entry_value = 12000 - min_val = 0 - -/datum/config_entry/flag/show_game_type_odds //if set this allows players to see the odds of each roundtype on the get revision screen - -/datum/config_entry/keyed_list/roundstart_races //races you can play as from the get go. - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_FLAG - -/datum/config_entry/flag/join_with_mutant_humans //players can pick mutant bodyparts for humans before joining the game - -/datum/config_entry/flag/no_summon_guns //No - -/datum/config_entry/flag/no_summon_magic //Fun - -/datum/config_entry/flag/no_summon_events //Allowed - -/datum/config_entry/flag/no_summon_traumas //! - -/datum/config_entry/flag/no_intercept_report //Whether or not to send a communications intercept report roundstart. This may be overridden by gamemodes. - -/datum/config_entry/number/arrivals_shuttle_dock_window //Time from when a player late joins on the arrivals shuttle to when the shuttle docks on the station - config_entry_value = 55 - min_val = 30 - -/datum/config_entry/flag/arrivals_shuttle_require_undocked //Require the arrivals shuttle to be undocked before latejoiners can join - -/datum/config_entry/flag/arrivals_shuttle_require_safe_latejoin //Require the arrivals shuttle to be operational in order for latejoiners to join - -/datum/config_entry/string/alert_green - config_entry_value = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." - -/datum/config_entry/string/alert_blue_upto - config_entry_value = "The station has received reliable information about potential threats to the station. Security staff may have weapons visible, random searches are permitted." - -/datum/config_entry/string/alert_blue_downto - config_entry_value = "Significant confirmed threats have been neutralized. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still permitted." - -/datum/config_entry/string/alert_amber_upto - config_entry_value = "There are significant confirmed threats to the station. Security staff may have weapons unholstered at all times. Random searches are allowed and advised." - -/datum/config_entry/string/alert_amber_downto - config_entry_value = "The immediate threat has passed. Security is no longer authorized to use lethal force, but may continue to have weapons drawn. Access requirements have been restored." - -/datum/config_entry/string/alert_red_upto - config_entry_value = "There is an immediate serious threat to the station. Security is now authorized to use lethal force. Additionally, access requirements on some machines have been lifted." - -/datum/config_entry/string/alert_red_downto - config_entry_value = "The station's destruction has been averted. There is still however an immediate serious threat to the station. Security is still authorized to use lethal force." - -/datum/config_entry/string/alert_delta - config_entry_value = "Destruction of the station is imminent. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill." - -/datum/config_entry/flag/revival_pod_plants - -/datum/config_entry/flag/revival_cloning - -/datum/config_entry/number/revival_brain_life - config_entry_value = -1 - min_val = -1 - -/datum/config_entry/flag/ooc_during_round - -/datum/config_entry/flag/emojis - -/datum/config_entry/keyed_list/multiplicative_movespeed - key_mode = KEY_MODE_TYPE - value_mode = VALUE_MODE_NUM - abstract_type = /datum/config_entry/keyed_list/multiplicative_movespeed - -/datum/config_entry/keyed_list/multiplicative_movespeed/ValidateAndSet() - . = ..() - if(.) - update_config_movespeed_type_lookup(TRUE) - -/datum/config_entry/keyed_list/multiplicative_movespeed/vv_edit_var(var_name, var_value) - . = ..() - if(. && (var_name == NAMEOF(src, config_entry_value))) - update_config_movespeed_type_lookup(TRUE) - -/datum/config_entry/keyed_list/multiplicative_movespeed/normal - name = "multiplicative_movespeed" - config_entry_value = list( //DEFAULTS - /mob/living/simple_animal = 1, - /mob/living/silicon/pai = 1, - /mob/living/carbon/alien/humanoid/sentinel = 0.25, - /mob/living/carbon/alien/humanoid/drone = 0.5, - /mob/living/carbon/alien/humanoid/royal/praetorian = 1, - /mob/living/carbon/alien/humanoid/royal/queen = 3 - ) - -/datum/config_entry/keyed_list/multiplicative_movespeed/floating - name = "multiplicative_movespeed_floating" - config_entry_value = list( - /mob/living = 0, - /mob/living/carbon/alien/humanoid = 0, - /mob/living/carbon/alien/humanoid/royal/praetorian = 0, - /mob/living/carbon/alien/humanoid/royal/queen = 2 - ) - -/datum/config_entry/number/sprintless_stagger_slowdown - config_entry_value = 0 - -/datum/config_entry/number/melee_stagger_factor - config_entry_value = 1 - -/datum/config_entry/number/sprintless_off_balance_slowdown - config_entry_value = 0.85 - -/datum/config_entry/number/movedelay //Used for modifying movement speed for mobs. - abstract_type = /datum/config_entry/number/movedelay - integer = FALSE - -/datum/config_entry/number/movedelay/ValidateAndSet() - . = ..() - if(.) - update_mob_config_movespeeds() - -/datum/config_entry/number/movedelay/vv_edit_var(var_name, var_value) - . = ..() - if(. && (var_name == NAMEOF(src, config_entry_value))) - update_mob_config_movespeeds() - -/datum/config_entry/number/movedelay/run_delay - -/datum/config_entry/number/movedelay/run_delay/ValidateAndSet() - . = ..() - var/datum/movespeed_modifier/config_walk_run/M = get_cached_movespeed_modifier(/datum/movespeed_modifier/config_walk_run/run) - M.sync() - -/datum/config_entry/number/movedelay/walk_delay - -/datum/config_entry/number/movedelay/walk_delay/ValidateAndSet() - . = ..() - var/datum/movespeed_modifier/config_walk_run/M = get_cached_movespeed_modifier(/datum/movespeed_modifier/config_walk_run/walk) - M.sync() - -/datum/config_entry/flag/sprint_enabled - config_entry_value = TRUE - -/datum/config_entry/flag/sprint_enabled/ValidateAndSet(str_val) - . = ..() - for(var/datum/hud/human/H) - H.assert_move_intent_ui() - if(!config_entry_value) // disabled - for(var/mob/living/L in world) - L.disable_intentional_sprint_mode() - -/datum/config_entry/number/movedelay/sprint_speed_increase - config_entry_value = 1 - -/datum/config_entry/number/movedelay/sprint_max_tiles_increase - config_entry_value = 5 - -/datum/config_entry/number/movedelay/sprint_absolute_max_tiles - config_entry_value = 13 - -/datum/config_entry/number/movedelay/sprint_buffer_max - config_entry_value = 24 - -/datum/config_entry/number/movedelay/sprint_stamina_cost - config_entry_value = 1.4 - -/datum/config_entry/number/movedelay/sprint_buffer_regen_per_ds - config_entry_value = 0.4 - -/////////////////////////////////////////////////Outdated move delay -/datum/config_entry/number/outdated_movedelay - deprecated_by = /datum/config_entry/keyed_list/multiplicative_movespeed/normal - abstract_type = /datum/config_entry/number/outdated_movedelay - - var/movedelay_type - -/datum/config_entry/number/outdated_movedelay/DeprecationUpdate(value) - return "[movedelay_type] [value]" - -/datum/config_entry/number/outdated_movedelay/human_delay - movedelay_type = /mob/living/carbon/human -/datum/config_entry/number/outdated_movedelay/robot_delay - movedelay_type = /mob/living/silicon/robot -/datum/config_entry/number/outdated_movedelay/monkey_delay - movedelay_type = /mob/living/carbon/monkey -/datum/config_entry/number/outdated_movedelay/alien_delay - movedelay_type = /mob/living/carbon/alien -/datum/config_entry/number/outdated_movedelay/slime_delay - movedelay_type = /mob/living/simple_animal/slime -/datum/config_entry/number/outdated_movedelay/animal_delay - movedelay_type = /mob/living/simple_animal -///////////////////////////////////////////////// - -/datum/config_entry/flag/roundstart_away //Will random away mission be loaded. - -/datum/config_entry/flag/roundstart_vr //Will virtual reality missions be loaded? - -/datum/config_entry/number/gateway_delay //How long the gateway takes before it activates. Default is half an hour. Only matters if roundstart_away is enabled. - config_entry_value = 18000 - min_val = 0 - -/datum/config_entry/flag/ghost_interaction - -/datum/config_entry/flag/silent_ai -/datum/config_entry/flag/silent_borg - -/datum/config_entry/flag/sandbox_autoclose // close the sandbox panel after spawning an item, potentially reducing griff - -/datum/config_entry/number/default_laws //Controls what laws the AI spawns with. - config_entry_value = 0 - min_val = 0 - max_val = 3 - -/datum/config_entry/number/silicon_max_law_amount - config_entry_value = 12 - min_val = 0 - -/datum/config_entry/keyed_list/random_laws - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_FLAG - -/datum/config_entry/keyed_list/law_weight - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_NUM - splitter = "," - -/datum/config_entry/number/overflow_cap - config_entry_value = -1 - min_val = -1 - -/datum/config_entry/string/overflow_job - config_entry_value = "Assistant" - -/datum/config_entry/flag/starlight -/datum/config_entry/flag/grey_assistants - -/datum/config_entry/number/lavaland_budget - config_entry_value = 60 - min_val = 0 - -/datum/config_entry/number/space_budget - config_entry_value = 16 - min_val = 0 - -/datum/config_entry/number/icemoon_budget - config_entry_value = 90 - integer = FALSE - min_val = 0 - -/datum/config_entry/number/station_space_budget - config_entry_value = 10 - min_val = 0 - -/datum/config_entry/flag/allow_random_events // Enables random events mid-round when set - -/datum/config_entry/number/events_min_time_mul // Multipliers for random events minimal starting time and minimal players amounts - config_entry_value = 1 - min_val = 0 - integer = FALSE - -/datum/config_entry/number/events_min_players_mul - config_entry_value = 1 - min_val = 0 - integer = FALSE - -/datum/config_entry/number/mice_roundstart - config_entry_value = 10 - min_val = 0 - -/datum/config_entry/number/bombcap - config_entry_value = 14 - min_val = 4 - -/datum/config_entry/number/bombcap/ValidateAndSet(str_val) - . = ..() - if(.) - GLOB.MAX_EX_DEVESTATION_RANGE = round(config_entry_value / 4) - GLOB.MAX_EX_HEAVY_RANGE = round(config_entry_value / 2) - GLOB.MAX_EX_LIGHT_RANGE = config_entry_value - GLOB.MAX_EX_FLASH_RANGE = config_entry_value - GLOB.MAX_EX_FLAME_RANGE = config_entry_value - -/datum/config_entry/number/emergency_shuttle_autocall_threshold - min_val = 0 - max_val = 1 - integer = FALSE - -/datum/config_entry/flag/ic_printing - -/datum/config_entry/flag/roundstart_traits - -/datum/config_entry/flag/enable_night_shifts - -/datum/config_entry/number/night_shift_public_areas_only - config_entry_value = NIGHTSHIFT_AREA_PUBLIC - -/datum/config_entry/flag/nightshift_toggle_requires_auth - config_entry_value = FALSE - -/datum/config_entry/flag/nightshift_toggle_public_requires_auth - config_entry_value = TRUE - -/datum/config_entry/flag/randomize_shift_time - -/datum/config_entry/flag/shift_time_realtime - -/datum/config_entry/keyed_list/antag_rep - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_NUM - -/datum/config_entry/keyed_list/job_threat - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_NUM - -/datum/config_entry/keyed_list/antag_threat - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_NUM - -/datum/config_entry/number/monkeycap - config_entry_value = 64 - min_val = 0 - -/datum/config_entry/number/ratcap - config_entry_value = 64 - min_val = 0 - -/datum/config_entry/flag/disable_stambuffer - -/datum/config_entry/keyed_list/box_random_engine - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_NUM - lowercase = FALSE - splitter = "," - -/datum/config_entry/flag/pai_custom_holoforms - -/datum/config_entry/number/marauder_delay_non_reebe - config_entry_value = 1800 - min_val = 0 - -/datum/config_entry/flag/allow_clockwork_marauder_on_station - config_entry_value = TRUE - -/datum/config_entry/flag/modetier_voting - -/datum/config_entry/flag/must_be_readied_to_vote_gamemode - -/datum/config_entry/number/dropped_modes - config_entry_value = 3 - -/datum/config_entry/flag/suicide_allowed - -/datum/config_entry/keyed_list/breasts_cups_prefs - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_FLAG - config_entry_value = list("a", "b", "c", "d", "e") //keep these lowercase - -/datum/config_entry/number/penis_min_inches_prefs - config_entry_value = 1 - min_val = 0 - -/datum/config_entry/number/penis_max_inches_prefs - config_entry_value = 20 - min_val = 0 - -/datum/config_entry/keyed_list/safe_visibility_toggles - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_FLAG - config_entry_value = list(GEN_VISIBLE_NO_CLOTHES, GEN_VISIBLE_NO_UNDIES, GEN_VISIBLE_NEVER) //refer to cit_helpers for all toggles. - -//Body size configs, the feature will be disabled if both min and max have the same value. -/datum/config_entry/number/body_size_min - config_entry_value = 0.9 - min_val = 0.1 //to avoid issues with zeros and negative values. - max_val = RESIZE_DEFAULT_SIZE - integer = FALSE - -/datum/config_entry/number/body_size_max - config_entry_value = 1.25 - min_val = RESIZE_DEFAULT_SIZE - integer = FALSE - -//Penalties given to characters with a body size smaller than this value, -//to compensate for their smaller hitbox. -//To disable, just make sure the value is lower than 'body_size_min' -/datum/config_entry/number/threshold_body_size_penalty - config_entry_value = RESIZE_DEFAULT_SIZE - min_val = 0 - max_val = RESIZE_DEFAULT_SIZE - integer = FALSE - -//multiplicative slowdown multiplier. See 'dna.update_body_size' for the operation. -//doesn't apply to floating or crawling mobs -/datum/config_entry/number/body_size_slowdown_multiplier - config_entry_value = 0 - min_val = 0 - integer = FALSE - -//Allows players to set a hexadecimal color of their choice as skin tone, on top of the standard ones. -/datum/config_entry/flag/allow_custom_skintones - -///Initial loadout points -/datum/config_entry/number/initial_gear_points - config_entry_value = 10 - -/** - * Enables the FoV component, which hides objects and mobs behind the parent from their sight, unless they turn around, duh. - * Camera mobs, AIs, ghosts and some other are of course exempt from this. This also doesn't influence simplemob AI, for the best. - */ -/datum/config_entry/flag/use_field_of_vision - -//Shuttle size limiter -/datum/config_entry/number/max_shuttle_count - config_entry_value = 6 - -/datum/config_entry/number/max_shuttle_size - config_entry_value = 500 - -//wound config stuff (increases the max injury roll, making injuries more likely) -/datum/config_entry/number/wound_exponent - config_entry_value = WOUND_DAMAGE_EXPONENT - min_val = 0 - integer = FALSE - -//adds a set amount to any injury rolls on a limb using get_damage() multiplied by this number -/datum/config_entry/number/wound_damage_multiplier - config_entry_value = 0.333 - min_val = 0 - integer = FALSE - -/// Amount of dirtyness tiles need to spawn dirt. -/datum/config_entry/number/turf_dirt_threshold - config_entry_value = 100 - min_val = 1 - integer = TRUE - -/// Alpha dirt starts at -/datum/config_entry/number/dirt_alpha_starting - config_entry_value = 127 - max_val = 255 - min_val = 0 - integer = TRUE - -/// Dirtyness multiplier for making turfs dirty -/datum/config_entry/number/turf_dirty_multiplier - config_entry_value = 1 - -/datum/config_entry/flag/weigh_by_recent_chaos - -/datum/config_entry/number/chaos_exponent - config_entry_value = 1 diff --git a/code/controllers/configuration/entries/gamemodes.dm b/code/controllers/configuration/entries/gamemodes.dm new file mode 100644 index 0000000000..f11c6dd5f5 --- /dev/null +++ b/code/controllers/configuration/entries/gamemodes.dm @@ -0,0 +1,94 @@ +/datum/config_entry/number_list/repeated_mode_adjust + +/datum/config_entry/flag/weigh_by_recent_chaos + +/datum/config_entry/number/chaos_exponent + config_entry_value = 1 + +/datum/config_entry/keyed_list/probability + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + +/datum/config_entry/keyed_list/probability/ValidateListEntry(key_name) + return key_name in config.modes + +/datum/config_entry/keyed_list/chaos_level + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + +/datum/config_entry/keyed_list/chaos_level/ValidateListEntry(key_name) + return key_name in config.modes + +/datum/config_entry/keyed_list/max_pop + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + +/datum/config_entry/keyed_list/max_pop/ValidateListEntry(key_name) + return key_name in config.modes + +/datum/config_entry/keyed_list/min_pop + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + +/datum/config_entry/keyed_list/min_pop/ValidateListEntry(key_name, key_value) + return key_name in config.modes + +/datum/config_entry/keyed_list/continuous // which roundtypes continue if all antagonists die + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_FLAG + +/datum/config_entry/keyed_list/continuous/ValidateListEntry(key_name, key_value) + return key_name in config.modes + +/datum/config_entry/keyed_list/midround_antag // which roundtypes use the midround antagonist system + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_FLAG + +/datum/config_entry/keyed_list/midround_antag/ValidateListEntry(key_name, key_value) + return key_name in config.modes + +/datum/config_entry/keyed_list/force_antag_count + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_FLAG + +/datum/config_entry/keyed_list/force_antag_count/ValidateListEntry(key_name, key_value) + return key_name in config.modes + +/datum/config_entry/number/traitor_scaling_coeff //how much does the amount of players get divided by to determine traitors + config_entry_value = 6 + min_val = 1 + +/datum/config_entry/number/brother_scaling_coeff //how many players per brother team + config_entry_value = 25 + min_val = 1 + +/datum/config_entry/number/changeling_scaling_coeff //how much does the amount of players get divided by to determine changelings + config_entry_value = 6 + min_val = 1 + +/datum/config_entry/number/ecult_scaling_coeff //how much does the amount of players get divided by to determine e_cult + config_entry_value = 6 + integer = FALSE + min_val = 1 + +/datum/config_entry/number/security_scaling_coeff //how much does the amount of players get divided by to determine open security officer positions + config_entry_value = 8 + min_val = 1 + +/datum/config_entry/number/abductor_scaling_coeff //how many players per abductor team + config_entry_value = 15 + min_val = 1 + +/datum/config_entry/number/traitor_objectives_amount + config_entry_value = 2 + min_val = 0 + +/datum/config_entry/number/brother_objectives_amount + config_entry_value = 2 + min_val = 0 + +/datum/config_entry/flag/protect_roles_from_antagonist //If security and such can be traitor/cult/other + +/datum/config_entry/flag/protect_assistant_from_antagonist //If assistants can be traitor/cult/other + +/datum/config_entry/flag/allow_latejoin_antagonists // If late-joining players can be traitor/changeling diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 63da60d7b5..182394bfa4 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -1,21 +1,3 @@ -/datum/config_entry/flag/auto_profile // Automatically start profiler on server start - -/datum/config_entry/flag/autoadmin // if autoadmin is enabled - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/string/autoadmin_rank // the rank for autoadmins - config_entry_value = "Game Master" - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/string/servername // server name (the name of the game window) - -/datum/config_entry/string/servertagline - config_entry_value = "We forgot to set the server's tagline in config.txt" - -/datum/config_entry/string/serversqlname // short form server name used for the DB - -/datum/config_entry/string/stationname // station name (the name of the station in-game) - /datum/config_entry/number/lobby_countdown // In between round countdown. config_entry_value = 120 min_val = 0 @@ -24,164 +6,11 @@ config_entry_value = 25 min_val = 0 -/datum/config_entry/flag/hub // if the game appears on the hub or not - -/datum/config_entry/flag/allow_admin_ooccolor // Allows admins with relevant permissions to have their own ooc colour - -/datum/config_entry/flag/allow_vote_restart // allow votes to restart - -/datum/config_entry/flag/allow_vote_mode // allow votes to change mode - -/datum/config_entry/number/vote_delay // minimum time between voting sessions (deciseconds, 10 minute default) - config_entry_value = 6000 - min_val = 0 - -/datum/config_entry/number/vote_period // length of voting period (deciseconds, default 1 minute) - config_entry_value = 600 - min_val = 0 - -/// Length of time before the first autotransfer vote is called (deciseconds, default 2 hours) -/// Set to 0 to disable the subsystem altogether. -/datum/config_entry/number/vote_autotransfer_initial - config_entry_value = 72000 - min_val = 0 - -///length of time to wait before subsequent autotransfer votes (deciseconds, default 30 minutes) -/datum/config_entry/number/vote_autotransfer_interval - config_entry_value = 18000 - min_val = 0 - -/// maximum extensions until the round autoends. -/// Set to 0 to force automatic crew transfer after the 'vote_autotransfer_initial' elapsed. -/// Set to -1 to disable the maximum extensions cap. -/datum/config_entry/number/vote_autotransfer_maximum - config_entry_value = 4 - min_val = -1 - -/datum/config_entry/flag/default_no_vote // vote does not default to nochange/norestart - -/datum/config_entry/flag/no_dead_vote // dead people can't vote /datum/config_entry/flag/allow_metadata // Metadata is supported. -/datum/config_entry/flag/popup_admin_pm // adminPMs to non-admins show in a pop-up 'reply' window when set - -/datum/config_entry/number/fps - config_entry_value = 20 - min_val = 1 - max_val = 100 //byond will start crapping out at 50, so this is just ridic - var/sync_validate = FALSE - -/datum/config_entry/number/fps/ValidateAndSet(str_val) - . = ..() - if(.) - sync_validate = TRUE - var/datum/config_entry/number/ticklag/TL = config.entries_by_type[/datum/config_entry/number/ticklag] - if(!TL.sync_validate) - TL.ValidateAndSet(10 / config_entry_value) - sync_validate = FALSE - -/datum/config_entry/number/ticklag - integer = FALSE - var/sync_validate = FALSE - -/datum/config_entry/number/ticklag/New() //ticklag weirdly just mirrors fps - var/datum/config_entry/CE = /datum/config_entry/number/fps - config_entry_value = 10 / initial(CE.config_entry_value) - ..() - -/datum/config_entry/number/ticklag/ValidateAndSet(str_val) - . = text2num(str_val) > 0 && ..() - if(.) - sync_validate = TRUE - var/datum/config_entry/number/fps/FPS = config.entries_by_type[/datum/config_entry/number/fps] - if(!FPS.sync_validate) - FPS.ValidateAndSet(10 / config_entry_value) - sync_validate = FALSE - /datum/config_entry/flag/allow_holidays -/datum/config_entry/number/tick_limit_mc_init //SSinitialization throttling - config_entry_value = TICK_LIMIT_MC_INIT_DEFAULT - min_val = 0 //oranges warned us - integer = FALSE - -/datum/config_entry/flag/admin_legacy_system //Defines whether the server uses the legacy admin system with admins.txt or the SQL system - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/flag/protect_legacy_admins //Stops any admins loaded by the legacy system from having their rank edited by the permissions panel - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/flag/protect_legacy_ranks //Stops any ranks loaded by the legacy system from having their flags edited by the permissions panel - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/flag/enable_localhost_rank //Gives the !localhost! rank to any client connecting from 127.0.0.1 or ::1 - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/flag/load_legacy_ranks_only //Loads admin ranks only from legacy admin_ranks.txt, while enabled ranks are mirrored to the database - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/flag/mentors_mobname_only - -/datum/config_entry/flag/mentor_legacy_system //Defines whether the server uses the legacy mentor system with mentors.txt or the SQL system - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/string/hostedby - -/datum/config_entry/flag/guest_jobban - -/datum/config_entry/flag/usewhitelist - -/datum/config_entry/flag/ban_legacy_system //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/flag/use_age_restriction_for_jobs //Do jobs use account age restrictions? --requires database - -/datum/config_entry/flag/use_account_age_for_jobs //Uses the time they made the account for the job restriction stuff. New player joining alerts should be unaffected. - -/datum/config_entry/flag/use_exp_tracking - -/datum/config_entry/flag/use_exp_restrictions_heads - -/datum/config_entry/number/use_exp_restrictions_heads_hours - config_entry_value = 0 - min_val = 0 - -/datum/config_entry/flag/use_exp_restrictions_heads_department - -/datum/config_entry/flag/use_exp_restrictions_other - -/datum/config_entry/flag/use_exp_restrictions_admin_bypass - -/datum/config_entry/string/server - -/datum/config_entry/string/banappeals - -/datum/config_entry/string/wikiurl - config_entry_value = "https://katlin.dog/citadel-wiki" - -/datum/config_entry/string/wikiurltg - config_entry_value = "http://www.tgstation13.org/wiki" - -/datum/config_entry/string/forumurl - config_entry_value = "http://tgstation13.org/phpBB/index.php" - -/datum/config_entry/string/rulesurl - config_entry_value = "http://www.tgstation13.org/wiki/Rules" - -/datum/config_entry/string/githuburl - config_entry_value = "https://www.github.com/tgstation/-tg-station" - -/datum/config_entry/string/roundstatsurl - -/datum/config_entry/string/gamelogurl - -/datum/config_entry/number/githubrepoid - config_entry_value = null - min_val = 0 - -/datum/config_entry/flag/guest_ban - /datum/config_entry/number/id_console_jobslot_delay config_entry_value = 30 min_val = 0 @@ -208,181 +37,8 @@ /datum/config_entry/flag/load_jobs_from_txt -/datum/config_entry/flag/forbid_singulo_possession - -/datum/config_entry/flag/automute_on //enables automuting/spam prevention - -/datum/config_entry/string/panic_server_name - -/datum/config_entry/string/panic_server_name/ValidateAndSet(str_val) - return str_val != "\[Put the name here\]" && ..() - -/datum/config_entry/string/panic_server_address //Reconnect a player this linked server if this server isn't accepting new players - -/datum/config_entry/string/panic_server_address/ValidateAndSet(str_val) - return str_val != "byond://address:port" && ..() - -/datum/config_entry/string/invoke_youtubedl - protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN - /datum/config_entry/flag/show_irc_name -/datum/config_entry/flag/see_own_notes //Can players see their own admin notes - -/datum/config_entry/number/note_fresh_days - config_entry_value = null - min_val = 0 - integer = FALSE - -/datum/config_entry/number/note_stale_days - config_entry_value = null - min_val = 0 - integer = FALSE - -/datum/config_entry/flag/maprotation - -/datum/config_entry/flag/tgstyle_maprotation - -/datum/config_entry/string/map_vote_type - config_entry_value = APPROVAL_VOTING - -/datum/config_entry/number/maprotatechancedelta - config_entry_value = 0.75 - min_val = 0 - max_val = 1 - integer = FALSE - -/datum/config_entry/number/soft_popcap - config_entry_value = null - min_val = 0 - -/datum/config_entry/number/hard_popcap - config_entry_value = null - min_val = 0 - -/datum/config_entry/number/extreme_popcap - config_entry_value = null - min_val = 0 - -/datum/config_entry/string/soft_popcap_message - config_entry_value = "Be warned that the server is currently serving a high number of users, consider using alternative game servers." - -/datum/config_entry/string/hard_popcap_message - config_entry_value = "The server is currently serving a high number of users, You cannot currently join. You may wait for the number of living crew to decline, observe, or find alternative servers." - -/datum/config_entry/string/extreme_popcap_message - config_entry_value = "The server is currently serving a high number of users, find alternative servers." - -/datum/config_entry/flag/panic_bunker // prevents people the server hasn't seen before from connecting - -/datum/config_entry/number/panic_bunker_living // living time in minutes that a player needs to pass the panic bunker - -/datum/config_entry/string/panic_bunker_message - config_entry_value = "Sorry but the server is currently not accepting connections from never before seen players." - -/datum/config_entry/number/notify_new_player_age // how long do we notify admins of a new player - min_val = -1 - -/datum/config_entry/number/notify_new_player_account_age // how long do we notify admins of a new byond account - min_val = 0 - -/datum/config_entry/flag/age_verification //are we using the automated age verification which asks users if they're 18+? - config_entry_value = TRUE - -/datum/config_entry/flag/irc_first_connection_alert // do we notify the irc channel when somebody is connecting for the first time? - -/datum/config_entry/flag/check_randomizer - -/datum/config_entry/string/ipintel_email - -/datum/config_entry/string/ipintel_email/ValidateAndSet(str_val) - return str_val != "ch@nge.me" && ..() - -/datum/config_entry/number/ipintel_rating_bad - config_entry_value = 1 - integer = FALSE - min_val = 0 - max_val = 1 - -/datum/config_entry/number/ipintel_save_good - config_entry_value = 12 - min_val = 0 - -/datum/config_entry/number/ipintel_save_bad - config_entry_value = 1 - min_val = 0 - -/datum/config_entry/string/ipintel_domain - config_entry_value = "check.getipintel.net" - -/datum/config_entry/flag/aggressive_changelog - -/datum/config_entry/flag/autoconvert_notes //if all connecting player's notes should attempt to be converted to the database - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/flag/allow_webclient - -/datum/config_entry/flag/webclient_only_byond_members - -/datum/config_entry/flag/announce_admin_logout - -/datum/config_entry/flag/announce_admin_login - -/datum/config_entry/flag/allow_map_voting - -/datum/config_entry/number/client_warn_version - config_entry_value = null - min_val = 500 - -/datum/config_entry/number/client_warn_version - config_entry_value = null - min_val = 500 - -/datum/config_entry/string/client_warn_message - config_entry_value = "Your version of byond may have issues or be blocked from accessing this server in the future." - -/datum/config_entry/flag/client_warn_popup - -/datum/config_entry/number/client_error_version - config_entry_value = null - min_val = 500 - -/datum/config_entry/string/client_error_message - config_entry_value = "Your version of byond is too old, may have issues, and is blocked from accessing this server." - -/datum/config_entry/number/client_error_build - config_entry_value = null - min_val = 0 - -/datum/config_entry/number/minute_topic_limit - config_entry_value = null - min_val = 0 - -/datum/config_entry/number/second_topic_limit - config_entry_value = null - min_val = 0 - -/datum/config_entry/number/minute_click_limit - config_entry_value = 400 - min_val = 0 - -/datum/config_entry/number/second_click_limit - config_entry_value = 15 - min_val = 0 - -/datum/config_entry/number/error_cooldown // The "cooldown" time for each occurrence of a unique error - config_entry_value = 600 - min_val = 0 - -/datum/config_entry/number/error_limit // How many occurrences before the next will silence them - config_entry_value = 50 - -/datum/config_entry/number/error_silence_time // How long a unique error will be silenced for - config_entry_value = 6000 - -/datum/config_entry/number/error_msg_delay // How long to wait between messaging admins about occurrences of a unique error - config_entry_value = 50 - /datum/config_entry/flag/irc_announce_new_game deprecated_by = /datum/config_entry/string/chat_announce_new_game @@ -390,54 +46,302 @@ return "" //default broadcast /datum/config_entry/string/chat_announce_new_game + config_entry_value = null -/datum/config_entry/flag/debug_admin_hrefs - -/datum/config_entry/number/mc_tick_rate/base_mc_tick_rate - integer = FALSE - config_entry_value = 1 - -/datum/config_entry/number/mc_tick_rate/high_pop_mc_tick_rate - integer = FALSE - config_entry_value = 1.1 - -/datum/config_entry/number/mc_tick_rate/high_pop_mc_mode_amount - config_entry_value = 65 - -/datum/config_entry/number/mc_tick_rate/disable_high_pop_mc_mode_amount - config_entry_value = 60 - -/datum/config_entry/number/mc_tick_rate - abstract_type = /datum/config_entry/number/mc_tick_rate - -/datum/config_entry/number/mc_tick_rate/ValidateAndSet(str_val) - . = ..() - if (.) - Master.UpdateTickRate() - -/datum/config_entry/flag/resume_after_initializations - -/datum/config_entry/flag/resume_after_initializations/ValidateAndSet(str_val) - . = ..() - if(. && Master.current_runlevel) - world.sleep_offline = !config_entry_value - -/datum/config_entry/number/rounds_until_hard_restart - config_entry_value = -1 - min_val = 0 - /datum/config_entry/string/default_view config_entry_value = "15x15" /datum/config_entry/string/default_view_square config_entry_value = "15x15" -/datum/config_entry/number/max_bunker_days - config_entry_value = 7 - min_val = 1 /datum/config_entry/flag/minimaps_enabled config_entry_value = TRUE -/datum/config_entry/string/centcom_ban_db // URL for the CentCom Galactic Ban DB API + + +/datum/config_entry/number/damage_multiplier + config_entry_value = 1 + integer = FALSE + +/datum/config_entry/number/minimal_access_threshold //If the number of players is larger than this threshold, minimal access will be turned on. + min_val = 0 + +/datum/config_entry/flag/jobs_have_minimal_access //determines whether jobs use minimal access or expanded access. + +/datum/config_entry/flag/assistants_have_maint_access + +/datum/config_entry/flag/security_has_maint_access + +/datum/config_entry/flag/everyone_has_maint_access + +/datum/config_entry/flag/sec_start_brig //makes sec start in brig instead of dept sec posts + +/datum/config_entry/flag/force_random_names + +/datum/config_entry/flag/humans_need_surnames + +/datum/config_entry/flag/allow_ai // allow ai job + +/datum/config_entry/flag/allow_ai_multicam //whether the AI can use their multicam + +/datum/config_entry/flag/disable_human_mood + +/datum/config_entry/flag/disable_borg_flash_knockdown //Should borg flashes be capable of knocking humanoid entities down? + +/datum/config_entry/flag/weaken_secborg //Brings secborgs and k9s back in-line with the other borg modules + +/datum/config_entry/flag/disable_secborg // disallow secborg module to be chosen. + +/datum/config_entry/flag/disable_peaceborg + +/datum/config_entry/flag/economy //money money money money money money money money money money money money + +/datum/config_entry/flag/reactionary_explosions //If we use reactionary explosions, explosions that react to walls and doors + +/datum/config_entry/flag/enforce_human_authority //If non-human species are barred from joining as a head of staff + +/datum/config_entry/number/midround_antag_time_check // How late (in minutes you want the midround antag system to stay on, setting this to 0 will disable the system) + config_entry_value = 60 + min_val = 0 + +/datum/config_entry/number/midround_antag_life_check // A ratio of how many people need to be alive in order for the round not to immediately end in midround antagonist + config_entry_value = 0.7 + integer = FALSE + min_val = 0 + max_val = 1 + +/datum/config_entry/number/suicide_reenter_round_timer + config_entry_value = 30 + min_val = 0 + +/datum/config_entry/number/roundstart_suicide_time_limit + config_entry_value = 30 + min_val = 0 + +/datum/config_entry/number/shuttle_refuel_delay + config_entry_value = 12000 + min_val = 0 + +/datum/config_entry/flag/show_game_type_odds //if set this allows players to see the odds of each roundtype on the get revision screen + +/datum/config_entry/keyed_list/roundstart_races //races you can play as from the get go. + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_FLAG + +/datum/config_entry/flag/join_with_mutant_humans //players can pick mutant bodyparts for humans before joining the game + +/datum/config_entry/flag/no_summon_guns //No + +/datum/config_entry/flag/no_summon_magic //Fun + +/datum/config_entry/flag/no_summon_events //Allowed + +/datum/config_entry/flag/no_summon_traumas //! + +/datum/config_entry/flag/no_intercept_report //Whether or not to send a communications intercept report roundstart. This may be overridden by gamemodes. + +/datum/config_entry/number/arrivals_shuttle_dock_window //Time from when a player late joins on the arrivals shuttle to when the shuttle docks on the station + config_entry_value = 55 + min_val = 30 + +/datum/config_entry/flag/arrivals_shuttle_require_undocked //Require the arrivals shuttle to be undocked before latejoiners can join + +/datum/config_entry/flag/arrivals_shuttle_require_safe_latejoin //Require the arrivals shuttle to be operational in order for latejoiners to join + + +/datum/config_entry/flag/revival_pod_plants + +/datum/config_entry/flag/revival_cloning + +/datum/config_entry/number/revival_brain_life + config_entry_value = -1 + min_val = -1 + +/datum/config_entry/flag/ooc_during_round + +/datum/config_entry/flag/emojis + +/datum/config_entry/flag/roundstart_away //Will random away mission be loaded. + +/datum/config_entry/flag/roundstart_vr //Will virtual reality missions be loaded? + +/datum/config_entry/number/gateway_delay //How long the gateway takes before it activates. Default is half an hour. Only matters if roundstart_away is enabled. + config_entry_value = 18000 + min_val = 0 + +/datum/config_entry/flag/ghost_interaction + +/datum/config_entry/flag/silent_ai +/datum/config_entry/flag/silent_borg + +/datum/config_entry/flag/sandbox_autoclose // close the sandbox panel after spawning an item, potentially reducing griff + +/datum/config_entry/number/default_laws //Controls what laws the AI spawns with. + config_entry_value = 0 + min_val = 0 + max_val = 3 + +/datum/config_entry/number/silicon_max_law_amount + config_entry_value = 12 + min_val = 0 + +/datum/config_entry/keyed_list/random_laws + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_FLAG + +/datum/config_entry/keyed_list/law_weight + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + splitter = "," + +/datum/config_entry/number/overflow_cap + config_entry_value = -1 + min_val = -1 + +/datum/config_entry/string/overflow_job + config_entry_value = "Assistant" + +/datum/config_entry/flag/starlight +/datum/config_entry/flag/grey_assistants + +/datum/config_entry/number/lavaland_budget + config_entry_value = 60 + min_val = 0 + +/datum/config_entry/number/space_budget + config_entry_value = 16 + min_val = 0 + +/datum/config_entry/number/icemoon_budget + config_entry_value = 90 + integer = FALSE + min_val = 0 + +/datum/config_entry/number/station_space_budget + config_entry_value = 10 + min_val = 0 + +/datum/config_entry/flag/allow_random_events // Enables random events mid-round when set + +/datum/config_entry/number/events_min_time_mul // Multipliers for random events minimal starting time and minimal players amounts + config_entry_value = 1 + min_val = 0 + integer = FALSE + +/datum/config_entry/number/events_min_players_mul + config_entry_value = 1 + min_val = 0 + integer = FALSE + +/datum/config_entry/number/mice_roundstart + config_entry_value = 10 + min_val = 0 + +/datum/config_entry/number/bombcap + config_entry_value = 14 + min_val = 4 + +/datum/config_entry/number/bombcap/ValidateAndSet(str_val) + . = ..() + if(.) + GLOB.MAX_EX_DEVESTATION_RANGE = round(config_entry_value / 4) + GLOB.MAX_EX_HEAVY_RANGE = round(config_entry_value / 2) + GLOB.MAX_EX_LIGHT_RANGE = config_entry_value + GLOB.MAX_EX_FLASH_RANGE = config_entry_value + GLOB.MAX_EX_FLAME_RANGE = config_entry_value + +/datum/config_entry/number/emergency_shuttle_autocall_threshold + min_val = 0 + max_val = 1 + integer = FALSE + +/datum/config_entry/flag/ic_printing + +/datum/config_entry/flag/roundstart_traits + +/datum/config_entry/flag/enable_night_shifts + +/datum/config_entry/number/night_shift_public_areas_only + config_entry_value = NIGHTSHIFT_AREA_PUBLIC + +/datum/config_entry/flag/nightshift_toggle_requires_auth + config_entry_value = FALSE + +/datum/config_entry/flag/nightshift_toggle_public_requires_auth + config_entry_value = TRUE + +/datum/config_entry/flag/randomize_shift_time + +/datum/config_entry/flag/shift_time_realtime + +/datum/config_entry/number/monkeycap + config_entry_value = 64 + min_val = 0 + +/datum/config_entry/number/ratcap + config_entry_value = 64 + min_val = 0 + +/datum/config_entry/keyed_list/box_random_engine + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + lowercase = FALSE + splitter = "," + +/datum/config_entry/flag/pai_custom_holoforms + +/datum/config_entry/number/marauder_delay_non_reebe + config_entry_value = 1800 + min_val = 0 + +/datum/config_entry/flag/allow_clockwork_marauder_on_station + config_entry_value = TRUE + +/datum/config_entry/flag/suicide_allowed + + +//Allows players to set a hexadecimal color of their choice as skin tone, on top of the standard ones. +/datum/config_entry/flag/allow_custom_skintones + +///Initial loadout points +/datum/config_entry/number/initial_gear_points + config_entry_value = 10 + +/** + * Enables the FoV component, which hides objects and mobs behind the parent from their sight, unless they turn around, duh. + * Camera mobs, AIs, ghosts and some other are of course exempt from this. This also doesn't influence simplemob AI, for the best. + */ +/datum/config_entry/flag/use_field_of_vision + +//Shuttle size limiter +/datum/config_entry/number/max_shuttle_count + config_entry_value = 6 + +/datum/config_entry/number/max_shuttle_size + config_entry_value = 500 + +//wound config stuff (increases the max injury roll, making injuries more likely) +/datum/config_entry/number/wound_exponent + config_entry_value = WOUND_DAMAGE_EXPONENT + min_val = 0 + integer = FALSE + +//adds a set amount to any injury rolls on a limb using get_damage() multiplied by this number +/datum/config_entry/number/wound_damage_multiplier + config_entry_value = 0.333 + min_val = 0 + integer = FALSE + +/datum/config_entry/number/hard_deletes_overrun_threshold + integer = FALSE + min_val = 0 + default = 0.5 + +/datum/config_entry/number/hard_deletes_overrun_limit + default = 0 + min_val = 0 + +/datum/config_entry/flag/atmos_equalize_enabled + default = FALSE diff --git a/code/controllers/configuration/entries/jexp.dm b/code/controllers/configuration/entries/jexp.dm new file mode 100644 index 0000000000..3d9754b4a6 --- /dev/null +++ b/code/controllers/configuration/entries/jexp.dm @@ -0,0 +1,17 @@ +/datum/config_entry/flag/use_age_restriction_for_jobs //Do jobs use account age restrictions? --requires database + +/datum/config_entry/flag/use_account_age_for_jobs //Uses the time they made the account for the job restriction stuff. New player joining alerts should be unaffected. + +/datum/config_entry/flag/use_exp_tracking + +/datum/config_entry/flag/use_exp_restrictions_heads + +/datum/config_entry/number/use_exp_restrictions_heads_hours + config_entry_value = 0 + min_val = 0 + +/datum/config_entry/flag/use_exp_restrictions_heads_department + +/datum/config_entry/flag/use_exp_restrictions_other + +/datum/config_entry/flag/use_exp_restrictions_admin_bypass diff --git a/code/controllers/configuration/entries/logging.dm b/code/controllers/configuration/entries/logging.dm index 1cb47d6ab7..25ca145939 100644 --- a/code/controllers/configuration/entries/logging.dm +++ b/code/controllers/configuration/entries/logging.dm @@ -9,6 +9,7 @@ /datum/config_entry/flag/log_admin // log admin actions protection = CONFIG_ENTRY_LOCKED + config_entry_value = TRUE /datum/config_entry/flag/log_prayer // log prayers config_entry_value = TRUE @@ -68,3 +69,16 @@ /// forces log_href for tgui /datum/config_entry/flag/emergency_tgui_logging config_entry_value = FALSE + +/datum/config_entry/number/error_cooldown // The "cooldown" time for each occurrence of a unique error + config_entry_value = 600 + min_val = 0 + +/datum/config_entry/number/error_limit // How many occurrences before the next will silence them + config_entry_value = 50 + +/datum/config_entry/number/error_silence_time // How long a unique error will be silenced for + config_entry_value = 6000 + +/datum/config_entry/number/error_msg_delay // How long to wait between messaging admins about occurrences of a unique error + config_entry_value = 50 diff --git a/code/controllers/configuration/entries/movespeed.dm b/code/controllers/configuration/entries/movespeed.dm new file mode 100644 index 0000000000..b1c3818cd3 --- /dev/null +++ b/code/controllers/configuration/entries/movespeed.dm @@ -0,0 +1,124 @@ +/datum/config_entry/keyed_list/multiplicative_movespeed + key_mode = KEY_MODE_TYPE + value_mode = VALUE_MODE_NUM + abstract_type = /datum/config_entry/keyed_list/multiplicative_movespeed + +/datum/config_entry/keyed_list/multiplicative_movespeed/ValidateAndSet() + . = ..() + if(.) + update_config_movespeed_type_lookup(TRUE) + +/datum/config_entry/keyed_list/multiplicative_movespeed/vv_edit_var(var_name, var_value) + . = ..() + if(. && (var_name == NAMEOF(src, config_entry_value))) + update_config_movespeed_type_lookup(TRUE) + +/datum/config_entry/keyed_list/multiplicative_movespeed/normal + name = "multiplicative_movespeed" + config_entry_value = list( //DEFAULTS + /mob/living/simple_animal = 1, + /mob/living/silicon/pai = 1, + /mob/living/carbon/alien/humanoid/sentinel = 0.25, + /mob/living/carbon/alien/humanoid/drone = 0.5, + /mob/living/carbon/alien/humanoid/royal/praetorian = 1, + /mob/living/carbon/alien/humanoid/royal/queen = 3 + ) + +/datum/config_entry/keyed_list/multiplicative_movespeed/floating + name = "multiplicative_movespeed_floating" + config_entry_value = list( + /mob/living = 0, + /mob/living/carbon/alien/humanoid = 0, + /mob/living/carbon/alien/humanoid/royal/praetorian = 0, + /mob/living/carbon/alien/humanoid/royal/queen = 2 + ) + +/datum/config_entry/number/movedelay //Used for modifying movement speed for mobs. + abstract_type = /datum/config_entry/number/movedelay + integer = FALSE + +/datum/config_entry/number/movedelay/ValidateAndSet() + . = ..() + if(.) + update_mob_config_movespeeds() + +/datum/config_entry/number/movedelay/vv_edit_var(var_name, var_value) + . = ..() + if(. && (var_name == NAMEOF(src, config_entry_value))) + update_mob_config_movespeeds() + +/datum/config_entry/number/movedelay/run_delay + +/datum/config_entry/number/movedelay/run_delay/ValidateAndSet() + . = ..() + var/datum/movespeed_modifier/config_walk_run/M = get_cached_movespeed_modifier(/datum/movespeed_modifier/config_walk_run/run) + M.sync() + +/datum/config_entry/number/movedelay/walk_delay + +/datum/config_entry/number/movedelay/walk_delay/ValidateAndSet() + . = ..() + var/datum/movespeed_modifier/config_walk_run/M = get_cached_movespeed_modifier(/datum/movespeed_modifier/config_walk_run/walk) + M.sync() + +/datum/config_entry/flag/sprint_enabled + config_entry_value = TRUE + +/datum/config_entry/flag/sprint_enabled/ValidateAndSet(str_val) + . = ..() + for(var/datum/hud/human/H) + H.assert_move_intent_ui() + if(!config_entry_value) // disabled + for(var/mob/living/L in world) + L.disable_intentional_sprint_mode() + +/datum/config_entry/number/sprintless_stagger_slowdown + config_entry_value = 0 + +/datum/config_entry/number/sprintless_off_balance_slowdown + config_entry_value = 0.85 + +/datum/config_entry/number/melee_stagger_factor + config_entry_value = 1 + +/datum/config_entry/number/movedelay/sprint_speed_increase + config_entry_value = 1 + +/datum/config_entry/number/movedelay/sprint_max_tiles_increase + config_entry_value = 5 + +/datum/config_entry/number/movedelay/sprint_absolute_max_tiles + config_entry_value = 13 + +/datum/config_entry/number/movedelay/sprint_buffer_max + config_entry_value = 24 + +/datum/config_entry/number/movedelay/sprint_stamina_cost + config_entry_value = 1.4 + +/datum/config_entry/number/movedelay/sprint_buffer_regen_per_ds + config_entry_value = 0.4 + +/////////////////////////////////////////////////Outdated move delay +/datum/config_entry/number/outdated_movedelay + deprecated_by = /datum/config_entry/keyed_list/multiplicative_movespeed/normal + abstract_type = /datum/config_entry/number/outdated_movedelay + + var/movedelay_type + +/datum/config_entry/number/outdated_movedelay/DeprecationUpdate(value) + return "[movedelay_type] [value]" + +/datum/config_entry/number/outdated_movedelay/human_delay + movedelay_type = /mob/living/carbon/human +/datum/config_entry/number/outdated_movedelay/robot_delay + movedelay_type = /mob/living/silicon/robot +/datum/config_entry/number/outdated_movedelay/monkey_delay + movedelay_type = /mob/living/carbon/monkey +/datum/config_entry/number/outdated_movedelay/alien_delay + movedelay_type = /mob/living/carbon/alien +/datum/config_entry/number/outdated_movedelay/slime_delay + movedelay_type = /mob/living/simple_animal/slime +/datum/config_entry/number/outdated_movedelay/animal_delay + movedelay_type = /mob/living/simple_animal +///////////////////////////////////////////////// diff --git a/code/controllers/configuration/entries/policy.dm b/code/controllers/configuration/entries/policy.dm index de611e1813..ea8973a4ce 100644 --- a/code/controllers/configuration/entries/policy.dm +++ b/code/controllers/configuration/entries/policy.dm @@ -3,9 +3,9 @@ config_entry_value = 300 integer = TRUE -/datum/config_entry/keyed_list/policyconfig +/datum/config_entry/keyed_list/policy key_mode = KEY_MODE_TEXT value_mode = VALUE_MODE_TEXT -/datum/config_entry/keyed_list/policyconfig/preprocess_key(key) +/datum/config_entry/keyed_list/policy/preprocess_key(key) return uppertext(..()) diff --git a/code/controllers/configuration/entries/fail2topic.dm b/code/controllers/configuration/entries/security.dm similarity index 62% rename from code/controllers/configuration/entries/fail2topic.dm rename to code/controllers/configuration/entries/security.dm index 7ed09b378a..3a49c97d70 100644 --- a/code/controllers/configuration/entries/fail2topic.dm +++ b/code/controllers/configuration/entries/security.dm @@ -9,7 +9,6 @@ protection = CONFIG_ENTRY_LOCKED //affects physical server configuration, no touchies!! /datum/config_entry/flag/fail2topic_enabled - config_entry_value = TRUE /datum/config_entry/number/topic_max_size config_entry_value = 8192 @@ -17,3 +16,19 @@ /datum/config_entry/keyed_list/topic_rate_limit_whitelist key_mode = KEY_MODE_TEXT value_mode = VALUE_MODE_FLAG + +/datum/config_entry/number/minute_topic_limit + config_entry_value = null + min_val = 0 + +/datum/config_entry/number/second_topic_limit + config_entry_value = null + min_val = 0 + +/datum/config_entry/number/minute_click_limit + config_entry_value = 400 + min_val = 0 + +/datum/config_entry/number/second_click_limit + config_entry_value = 15 + min_val = 0 diff --git a/code/controllers/configuration/entries/server.dm b/code/controllers/configuration/entries/server.dm new file mode 100644 index 0000000000..1acf8a11ca --- /dev/null +++ b/code/controllers/configuration/entries/server.dm @@ -0,0 +1,90 @@ +/datum/config_entry/flag/auto_profile // Automatically start profiler on server start + +/datum/config_entry/string/servername // server name (the name of the game window) + +/datum/config_entry/string/servertagline + config_entry_value = "We forgot to set the server's tagline in config.txt" + +/datum/config_entry/string/serversqlname // short form server name used for the DB + +/datum/config_entry/string/stationname // station name (the name of the station in-game) + +/datum/config_entry/number/fps + config_entry_value = 20 + min_val = 1 + max_val = 100 //byond will start crapping out at 50, so this is just ridic + var/sync_validate = FALSE + +/datum/config_entry/number/fps/ValidateAndSet(str_val) + . = ..() + if(.) + sync_validate = TRUE + var/datum/config_entry/number/ticklag/TL = config.entries_by_type[/datum/config_entry/number/ticklag] + if(!TL.sync_validate) + TL.ValidateAndSet(10 / config_entry_value) + sync_validate = FALSE + +/datum/config_entry/number/ticklag + integer = FALSE + var/sync_validate = FALSE + +/datum/config_entry/number/ticklag/New() //ticklag weirdly just mirrors fps + var/datum/config_entry/CE = /datum/config_entry/number/fps + config_entry_value = 10 / initial(CE.config_entry_value) + ..() + +/datum/config_entry/number/ticklag/ValidateAndSet(str_val) + . = text2num(str_val) > 0 && ..() + if(.) + sync_validate = TRUE + var/datum/config_entry/number/fps/FPS = config.entries_by_type[/datum/config_entry/number/fps] + if(!FPS.sync_validate) + FPS.ValidateAndSet(10 / config_entry_value) + sync_validate = FALSE + +/datum/config_entry/number/tick_limit_mc_init //SSinitialization throttling + config_entry_value = TICK_LIMIT_MC_INIT_DEFAULT + min_val = 0 //oranges warned us + integer = FALSE + +/datum/config_entry/flag/usewhitelist + +/datum/config_entry/string/hostedby + +/datum/config_entry/flag/hub // if the game appears on the hub or not + +/datum/config_entry/string/invoke_youtubedl + protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN + +/datum/config_entry/number/mc_tick_rate/base_mc_tick_rate + integer = FALSE + config_entry_value = 1 + +/datum/config_entry/number/mc_tick_rate/high_pop_mc_tick_rate + integer = FALSE + config_entry_value = 1.1 + +/datum/config_entry/number/mc_tick_rate/high_pop_mc_mode_amount + config_entry_value = 65 + +/datum/config_entry/number/mc_tick_rate/disable_high_pop_mc_mode_amount + config_entry_value = 60 + +/datum/config_entry/number/mc_tick_rate + abstract_type = /datum/config_entry/number/mc_tick_rate + +/datum/config_entry/number/mc_tick_rate/ValidateAndSet(str_val) + . = ..() + if (.) + Master.UpdateTickRate() + +/datum/config_entry/flag/resume_after_initializations + +/datum/config_entry/flag/resume_after_initializations/ValidateAndSet(str_val) + . = ..() + if(. && Master.current_runlevel) + world.sleep_offline = !config_entry_value + +/datum/config_entry/number/rounds_until_hard_restart + config_entry_value = -1 + min_val = 0 diff --git a/code/controllers/configuration/entries/stamina_combat.dm b/code/controllers/configuration/entries/stamina_combat.dm index 5c2c9d7ec5..681b903286 100644 --- a/code/controllers/configuration/entries/stamina_combat.dm +++ b/code/controllers/configuration/entries/stamina_combat.dm @@ -29,3 +29,5 @@ /// Factor to multiply by for stamina usage past buffer into health /datum/config_entry/number/stamina_combat/overdraw_penalty_factor config_entry_value = 1.5 + +/datum/config_entry/flag/disable_stambuffer diff --git a/code/controllers/configuration/entries/threat.dm b/code/controllers/configuration/entries/threat.dm new file mode 100644 index 0000000000..3a3e03e149 --- /dev/null +++ b/code/controllers/configuration/entries/threat.dm @@ -0,0 +1,7 @@ +/datum/config_entry/keyed_list/job_threat + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + +/datum/config_entry/keyed_list/antag_threat + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM diff --git a/code/controllers/configuration/entries/urls.dm b/code/controllers/configuration/entries/urls.dm new file mode 100644 index 0000000000..fe82574da0 --- /dev/null +++ b/code/controllers/configuration/entries/urls.dm @@ -0,0 +1,26 @@ +/datum/config_entry/string/server + +/datum/config_entry/string/banappeals + +/datum/config_entry/string/wikiurl + config_entry_value = "https://katlin.dog/citadel-wiki" + +/datum/config_entry/string/wikiurltg + config_entry_value = "http://www.tgstation13.org/wiki" + +/datum/config_entry/string/forumurl + config_entry_value = "http://tgstation13.org/phpBB/index.php" + +/datum/config_entry/string/rulesurl + config_entry_value = "http://www.tgstation13.org/wiki/Rules" + +/datum/config_entry/string/githuburl + config_entry_value = "https://www.github.com/tgstation/-tg-station" + +/datum/config_entry/string/roundstatsurl + +/datum/config_entry/string/gamelogurl + +/datum/config_entry/number/githubrepoid + config_entry_value = null + min_val = 0 diff --git a/code/controllers/configuration/entries/vote.dm b/code/controllers/configuration/entries/vote.dm new file mode 100644 index 0000000000..545fd01e3c --- /dev/null +++ b/code/controllers/configuration/entries/vote.dm @@ -0,0 +1,55 @@ +/datum/config_entry/flag/allow_vote_restart // allow votes to restart + +/datum/config_entry/flag/allow_vote_mode // allow votes to change mode + +/datum/config_entry/number/vote_delay // minimum time between voting sessions (deciseconds, 10 minute default) + config_entry_value = 6000 + min_val = 0 + +/datum/config_entry/number/vote_period // length of voting period (deciseconds, default 1 minute) + config_entry_value = 600 + min_val = 0 + +/// Length of time before the first autotransfer vote is called (deciseconds, default 2 hours) +/// Set to 0 to disable the subsystem altogether. +/datum/config_entry/number/vote_autotransfer_initial + config_entry_value = 72000 + min_val = 0 + +///length of time to wait before subsequent autotransfer votes (deciseconds, default 30 minutes) +/datum/config_entry/number/vote_autotransfer_interval + config_entry_value = 18000 + min_val = 0 + +/// maximum extensions until the round autoends. +/// Set to 0 to force automatic crew transfer after the 'vote_autotransfer_initial' elapsed. +/// Set to -1 to disable the maximum extensions cap. +/datum/config_entry/number/vote_autotransfer_maximum + config_entry_value = 4 + min_val = -1 + +/datum/config_entry/flag/default_no_vote // vote does not default to nochange/norestart + +/datum/config_entry/flag/no_dead_vote // dead people can't vote + +/datum/config_entry/flag/maprotation + +/datum/config_entry/flag/tgstyle_maprotation + +/datum/config_entry/string/map_vote_type + config_entry_value = APPROVAL_VOTING + +/datum/config_entry/number/maprotatechancedelta + config_entry_value = 0.75 + min_val = 0 + max_val = 1 + integer = FALSE + +/datum/config_entry/flag/allow_map_voting + +/datum/config_entry/flag/modetier_voting + +/datum/config_entry/number/dropped_modes + config_entry_value = 3 + +/datum/config_entry/flag/must_be_readied_to_vote_gamemode diff --git a/code/controllers/failsafe.dm b/code/controllers/failsafe.dm index a15056e442..04b88eb3be 100644 --- a/code/controllers/failsafe.dm +++ b/code/controllers/failsafe.dm @@ -15,7 +15,7 @@ GLOBAL_REAL(Failsafe, /datum/controller/failsafe) // The alert level. For every failed poke, we drop a DEFCON level. Once we hit DEFCON 1, restart the MC. var/defcon = 5 //the world.time of the last check, so the mc can restart US if we hang. - // (Real friends look out for *eachother*) + // (Real friends look out for *eachother*) var/lasttick = 0 // Track the MC iteration to make sure its still on track. @@ -33,6 +33,22 @@ GLOBAL_REAL(Failsafe, /datum/controller/failsafe) /datum/controller/failsafe/Initialize() set waitfor = FALSE Failsafe.Loop() + if (!Master || defcon == 0) //Master is gone/not responding and Failsafe just exited its loop + defcon = 3 //Reset defcon level as its used inside the emergency loop + while (defcon > 0) + var/recovery_result = emergency_loop() + if (recovery_result == 1) //Exit emergency loop and delete self if it was able to recover MC + break + else if (defcon == 1) //Exit Failsafe if we weren't able to recover the MC in the last stage + log_game("FailSafe: Failed to recover MC while in emergency state. Failsafe exiting.") + message_admins(span_boldannounce("Failsafe failed criticaly while trying to recreate broken MC. Please manually fix the MC or reboot the server. Failsafe exiting now.")) + message_admins(span_boldannounce("You can try manually calling these two procs:.")) + message_admins(span_boldannounce("/proc/recover_all_SS_and_recreate_master: Most stuff should still function but expect instability/runtimes/broken stuff.")) + message_admins(span_boldannounce("/proc/delete_all_SS_and_recreate_master: Most stuff will be broken but basic stuff like movement and chat should still work.")) + else if (recovery_result == -1) //Failed to recreate MC + defcon-- + sleep(initial(processing_interval)) //Wait a bit until the next try + if(!QDELETED(src)) qdel(src) //when Loop() returns, we delete ourselves and let the mc recreate us @@ -45,42 +61,56 @@ GLOBAL_REAL(Failsafe, /datum/controller/failsafe) while(running) lasttick = world.time if(!Master) - // Replace the missing Master! This should never, ever happen. - new /datum/controller/master() + // Break out of the main loop so we go into emergency state + break // Only poke it if overrides are not in effect. if(processing_interval > 0) if(Master.processing && Master.iteration) + if (defcon > 1 && (!Master.stack_end_detector || !Master.stack_end_detector.check())) + + to_chat(GLOB.admins, span_boldannounce("ERROR: The Master Controller code stack has exited unexpectedly, Restarting...")) + defcon = 0 + var/rtn = Recreate_MC() + if(rtn > 0) + master_iteration = 0 + to_chat(GLOB.admins, span_adminnotice("MC restarted successfully")) + else if(rtn < 0) + log_game("FailSafe: Could not restart MC, runtime encountered. Entering defcon 0") + to_chat(GLOB.admins, span_boldannounce("ERROR: DEFCON [defcon_pretty()]. Could not restart MC, runtime encountered. I will silently keep retrying.")) // Check if processing is done yet. if(Master.iteration == master_iteration) switch(defcon) if(4,5) --defcon - if(3) - message_admins("Notice: DEFCON [defcon_pretty()]. The Master Controller has not fired in the last [(5-defcon) * processing_interval] ticks.") - --defcon - if(2) - to_chat(GLOB.admins, "Warning: DEFCON [defcon_pretty()]. The Master Controller has not fired in the last [(5-defcon) * processing_interval] ticks. Automatic restart in [processing_interval] ticks.") - --defcon - if(1) - to_chat(GLOB.admins, "Warning: DEFCON [defcon_pretty()]. The Master Controller has still not fired within the last [(5-defcon) * processing_interval] ticks. Killing and restarting...") + if(3) + message_admins(span_adminnotice("Notice: DEFCON [defcon_pretty()]. The Master Controller has not fired in the last [(5-defcon) * processing_interval] ticks.")) + --defcon + + if(2) + to_chat(GLOB.admins, span_boldannounce("Warning: DEFCON [defcon_pretty()]. The Master Controller has not fired in the last [(5-defcon) * processing_interval] ticks. Automatic restart in [processing_interval] ticks.")) + --defcon + + if(1) + to_chat(GLOB.admins, span_boldannounce("Warning: DEFCON [defcon_pretty()]. The Master Controller has still not fired within the last [(5-defcon) * processing_interval] ticks. Killing and restarting...")) --defcon var/rtn = Recreate_MC() if(rtn > 0) defcon = 4 master_iteration = 0 - to_chat(GLOB.admins, "MC restarted successfully") + to_chat(GLOB.admins, span_adminnotice("MC restarted successfully")) else if(rtn < 0) log_game("FailSafe: Could not restart MC, runtime encountered. Entering defcon 0") - to_chat(GLOB.admins, "ERROR: DEFCON [defcon_pretty()]. Could not restart MC, runtime encountered. I will silently keep retrying.") + to_chat(GLOB.admins, span_boldannounce("ERROR: DEFCON [defcon_pretty()]. Could not restart MC, runtime encountered. I will silently keep retrying.")) //if the return number was 0, it just means the mc was restarted too recently, and it just needs some time before we try again //no need to handle that specially when defcon 0 can handle it + if(0) //DEFCON 0! (mc failed to restart) var/rtn = Recreate_MC() if(rtn > 0) defcon = 4 master_iteration = 0 - to_chat(GLOB.admins, "MC restarted successfully") + to_chat(GLOB.admins, span_adminnotice("MC restarted successfully")) else defcon = min(defcon + 1,5) master_iteration = Master.iteration @@ -92,6 +122,57 @@ GLOBAL_REAL(Failsafe, /datum/controller/failsafe) defcon = 5 sleep(initial(processing_interval)) +//Emergency loop used when Master got deleted or the main loop exited while Defcon == 0 +//Loop is driven externally so runtimes only cancel the current recovery attempt +/datum/controller/failsafe/proc/emergency_loop() + //The code in this proc should be kept as simple as possible, anything complicated like to_chat might rely on master existing and runtime + //The goal should always be to get a new Master up and running before anything else + . = -1 + switch (defcon) //The lower defcon goes the harder we try to fix the MC + if (2 to 3) //Try to normally recreate the MC two times + . = Recreate_MC() + if (1) //Delete the old MC first so we don't transfer any info, in case that caused any issues + del(Master) + . = Recreate_MC() + + if (. == 1) //We were able to create a new master + master_iteration = 0 + SSticker.Recover(); //Recover the ticket system so the Masters runlevel gets set + Master.Initialize(10, FALSE, TRUE) //Need to manually start the MC, normally world.new would do this + to_chat(GLOB.admins, span_adminnotice("Failsafe recovered MC while in emergency state [defcon_pretty()]")) + else + log_game("FailSafe: Failsafe in emergency state and was unable to recreate MC while in defcon state [defcon_pretty()].") + message_admins(span_boldannounce("Failsafe in emergency state and master down, trying to recreate MC while in defcon level [defcon_pretty()] failed.")) + +///Recreate all SSs which will still cause data survive due to Recover(), the new Master will then find and take them from global.vars +/proc/recover_all_SS_and_recreate_master() + del(Master) + var/list/subsytem_types = subtypesof(/datum/controller/subsystem) + sortTim(subsytem_types, /proc/cmp_subsystem_init) + for(var/I in subsytem_types) + new I + . = Recreate_MC() + if (. == 1) //We were able to create a new master + SSticker.Recover(); //Recover the ticket system so the Masters runlevel gets set + Master.Initialize(10, FALSE, TRUE) //Need to manually start the MC, normally world.new would do this + to_chat(GLOB.admins, span_adminnotice("MC successfully recreated after recovering all subsystems!")) + else + message_admins(span_boldannounce("Failed to create new MC!")) + +///Delete all existing SS to basically start over +/proc/delete_all_SS_and_recreate_master() + del(Master) + for(var/global_var in global.vars) + if (istype(global.vars[global_var], /datum/controller/subsystem)) + del(global.vars[global_var]) + . = Recreate_MC() + if (. == 1) //We were able to create a new master + SSticker.Recover(); //Recover the ticket system so the Masters runlevel gets set + Master.Initialize(10, FALSE, TRUE) //Need to manually start the MC, normally world.new would do this + to_chat(GLOB.admins, span_adminnotice("MC successfully recreated after deleting and recreating all subsystems!")) + else + message_admins(span_boldannounce("Failed to create new MC!")) + /datum/controller/failsafe/proc/defcon_pretty() return defcon diff --git a/code/controllers/globals.dm b/code/controllers/globals.dm index 21f022acfd..7b5cc94d36 100644 --- a/code/controllers/globals.dm +++ b/code/controllers/globals.dm @@ -14,7 +14,7 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) var/datum/controller/exclude_these = new gvars_datum_in_built_vars = exclude_these.vars + list(NAMEOF(src, gvars_datum_protected_varlist), NAMEOF(src, gvars_datum_in_built_vars), NAMEOF(src, gvars_datum_init_order)) - QDEL_IN(exclude_these, 0) //signal logging isn't ready + QDEL_IN(exclude_these, 0) //signal logging isn't ready log_world("[vars.len - gvars_datum_in_built_vars.len] global variables") diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 59ac68960c..055271fd86 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -18,15 +18,17 @@ GLOBAL_REAL(Master, /datum/controller/master) = new /datum/controller/master name = "Master" - // Are we processing (higher values increase the processing delay by n ticks) + /// Are we processing (higher values increase the processing delay by n ticks) var/processing = TRUE - // How many times have we ran + /// How many times have we ran var/iteration = 0 + /// Stack end detector to detect stack overflows that kill the mc's main loop + var/datum/stack_end_detector/stack_end_detector - // world.time of last fire, for tracking lag outside of the mc + /// world.time of last fire, for tracking lag outside of the mc var/last_run - // List of subsystems to process(). + /// List of subsystems to process(). var/list/subsystems // Vars for keeping track of tick drift. @@ -34,25 +36,27 @@ GLOBAL_REAL(Master, /datum/controller/master) = new var/init_time var/tickdrift = 0 + /// How long is the MC sleeping between runs, read only (set by Loop() based off of anti-tick-contention heuristics) var/sleep_delta = 1 - ///Only run ticker subsystems for the next n ticks. + /// Only run ticker subsystems for the next n ticks. var/skip_ticks = 0 + /// makes the mc main loop runtime var/make_runtime = FALSE - var/initializations_finished_with_no_players_logged_in //I wonder what this could be? + var/initializations_finished_with_no_players_logged_in //I wonder what this could be? - // The type of the last subsystem to be process()'d. + /// The type of the last subsystem to be fire()'d. var/last_type_processed - var/datum/controller/subsystem/queue_head //Start of queue linked list - var/datum/controller/subsystem/queue_tail //End of queue linked list (used for appending to the list) + var/datum/controller/subsystem/queue_head //!Start of queue linked list + var/datum/controller/subsystem/queue_tail //!End of queue linked list (used for appending to the list) var/queue_priority_count = 0 //Running total so that we don't have to loop thru the queue each run to split up the tick var/queue_priority_count_bg = 0 //Same, but for background subsystems - var/map_loading = FALSE //Are we loading in a new map? + var/map_loading = FALSE //!Are we loading in a new map? - var/current_runlevel //for scheduling different subsystems for different stages of the round + var/current_runlevel //!for scheduling different subsystems for different stages of the round var/sleep_offline_after_initializations = TRUE var/static/restart_clear = 0 @@ -61,8 +65,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new var/static/random_seed - //current tick limit, assigned before running a subsystem. - //used by CHECK_TICK as well so that the procs subsystems call can obey that SS's tick limits + ///current tick limit, assigned before running a subsystem. + ///used by CHECK_TICK as well so that the procs subsystems call can obey that SS's tick limits var/static/current_ticklimit = TICK_LIMIT_RUNNING /datum/controller/master/New() @@ -81,15 +85,27 @@ GLOBAL_REAL(Master, /datum/controller/master) = new var/list/_subsystems = list() subsystems = _subsystems if (Master != src) - if (istype(Master)) + if (istype(Master)) //If there is an existing MC take over his stuff and delete it Recover() qdel(Master) + Master = src else + //Code used for first master on game boot or if existing master got deleted + Master = src var/list/subsytem_types = subtypesof(/datum/controller/subsystem) sortTim(subsytem_types, /proc/cmp_subsystem_init) + //Find any abandoned subsystem from the previous master (if there was any) + var/list/existing_subsystems = list() + for(var/global_var in global.vars) + if (istype(global.vars[global_var], /datum/controller/subsystem)) + existing_subsystems += global.vars[global_var] + //Either init a new SS or if an existing one was found use that for(var/I in subsytem_types) - _subsystems += new I - Master = src + var/datum/controller/subsystem/existing_subsystem = locate(I) in existing_subsystems + if (istype(existing_subsystem)) + _subsystems += existing_subsystem + else + _subsystems += new I if(!GLOB) new /datum/controller/global_vars @@ -109,7 +125,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new log_world("Shutdown complete") // Returns 1 if we created a new mc, 0 if we couldn't due to a recent restart, -// -1 if we encountered a runtime trying to recreate it +// -1 if we encountered a runtime trying to recreate it /proc/Recreate_MC() . = -1 //so if we runtime, things know we failed if (world.time < Master.restart_timeout) @@ -120,7 +136,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new var/delay = 50 * ++Master.restart_count Master.restart_timeout = world.time + delay Master.restart_clear = world.time + (delay * 2) - Master.processing = FALSE //stop ticking this one + if (Master) //Can only do this if master hasn't been deleted + Master.processing = FALSE //stop ticking this one try new/datum/controller/master() catch @@ -156,22 +173,22 @@ GLOBAL_REAL(Master, /datum/controller/master) = new msg = "The [BadBoy.name] subsystem seems to be destabilizing the MC and will be offlined." BadBoy.flags |= SS_NO_FIRE if(msg) - to_chat(GLOB.admins, "[msg]") + to_chat(GLOB.admins, span_boldannounce("[msg]")) log_world(msg) if (istype(Master.subsystems)) if(FireHim) - Master.subsystems += new BadBoy.type //NEW_SS_GLOBAL will remove the old one + Master.subsystems += new BadBoy.type //NEW_SS_GLOBAL will remove the old one subsystems = Master.subsystems current_runlevel = Master.current_runlevel StartProcessing(10) else - to_chat(world, "The Master Controller is having some issues, we will need to re-initialize EVERYTHING") + to_chat(world, span_boldannounce("The Master Controller is having some issues, we will need to re-initialize EVERYTHING")) Initialize(20, TRUE) // Please don't stuff random bullshit here, -// Make a subsystem, give it the SS_NO_FIRE flag, and do your work in it's Initialize() +// Make a subsystem, give it the SS_NO_FIRE flag, and do your work in it's Initialize() /datum/controller/master/Initialize(delay, init_sss, tgs_prime) set waitfor = 0 @@ -181,7 +198,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new if(init_sss) init_subtypes(/datum/controller/subsystem, subsystems) - to_chat(world, "Initializing subsystems...") + to_chat(world, span_boldannounce("Initializing subsystems...")) // Sort subsystems by init_order, so they initialize in the correct order. sortTim(subsystems, /proc/cmp_subsystem_init) @@ -190,7 +207,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new // Initialize subsystems. current_ticklimit = CONFIG_GET(number/tick_limit_mc_init) for (var/datum/controller/subsystem/SS in subsystems) - if (SS.flags & SS_NO_INIT) + if (SS.flags & SS_NO_INIT || SS.initialized) //Don't init SSs with the correspondig flag or if they already are initialzized continue SS.Initialize(REALTIMEOFDAY) CHECK_TICK @@ -198,7 +215,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new var/time = (REALTIMEOFDAY - start_timeofday) / 10 var/msg = "Initializations complete within [time] second[time == 1 ? "" : "s"]!" - to_chat(world, "[msg]") + to_chat(world, span_boldannounce("[msg]")) log_world(msg) if (!current_runlevel) @@ -255,11 +272,11 @@ GLOBAL_REAL(Master, /datum/controller/master) = new /datum/controller/master/proc/Loop() . = -1 //Prep the loop (most of this is because we want MC restarts to reset as much state as we can, and because - // local vars rock + // local vars rock //all this shit is here so that flag edits can be refreshed by restarting the MC. (and for speed) var/list/tickersubsystems = list() - var/list/runlevel_sorted_subsystems = list(list()) //ensure we always have at least one runlevel + var/list/runlevel_sorted_subsystems = list(list()) //ensure we always have at least one runlevel var/timer = world.time for (var/thing in subsystems) var/datum/controller/subsystem/SS = thing @@ -305,8 +322,12 @@ GLOBAL_REAL(Master, /datum/controller/master) = new var/error_level = 0 var/sleep_delta = 1 var/list/subsystems_to_check - //the actual loop. + //setup the stack overflow detector + stack_end_detector = new() + var/datum/stack_canary/canary = stack_end_detector.prime_canary() + canary.use_variable() + //the actual loop. while (1) tickdrift = max(0, MC_AVERAGE_FAST(tickdrift, (((REALTIMEOFDAY - init_timeofday) - (world.time - init_time)) / world.tick_lag))) var/starting_tick_usage = TICK_USAGE @@ -317,7 +338,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new //Anti-tick-contention heuristics: //if there are mutiple sleeping procs running before us hogging the cpu, we have to run later. - // (because sleeps are processed in the order received, longer sleeps are more likely to run first) + // (because sleeps are processed in the order received, longer sleeps are more likely to run first) if (starting_tick_usage > TICK_LIMIT_MC) //if there isn't enough time to bother doing anything this tick, sleep a bit. sleep_delta *= 2 current_ticklimit = TICK_LIMIT_RUNNING * 0.5 @@ -423,6 +444,10 @@ GLOBAL_REAL(Master, /datum/controller/master) = new continue if ((SS_flags & (SS_TICKER|SS_KEEP_TIMING)) == SS_KEEP_TIMING && SS.last_fire + (SS.wait * 0.75) > world.time) continue + if (SS.postponed_fires >= 1) + SS.postponed_fires-- + SS.update_nextfire() + continue SS.enqueue() . = 1 @@ -439,12 +464,11 @@ GLOBAL_REAL(Master, /datum/controller/master) = new var/tick_precentage var/tick_remaining var/ran = TRUE //this is right - var/ran_non_ticker = FALSE var/bg_calc //have we swtiched current_tick_budget to background mode yet? var/tick_usage //keep running while we have stuff to run and we haven't gone over a tick - // this is so subsystems paused eariler can use tick time that later subsystems never used + // this is so subsystems paused eariler can use tick time that later subsystems never used while (ran && queue_head && TICK_USAGE < TICK_LIMIT_MC) ran = FALSE bg_calc = FALSE @@ -459,20 +483,6 @@ GLOBAL_REAL(Master, /datum/controller/master) = new if (!(queue_node_flags & SS_TICKER) && skip_ticks) queue_node = queue_node.queue_next continue - //super special case, subsystems where we can't make them pause mid way through - //if we can't run them this tick (without going over a tick) - //we bump up their priority and attempt to run them next tick - //(unless we haven't even ran anything this tick, since its unlikely they will ever be able run - // in those cases, so we just let them run) - if (queue_node_flags & SS_NO_TICK_CHECK) - if (queue_node.tick_usage > TICK_LIMIT_RUNNING - TICK_USAGE && ran_non_ticker) - if (!(queue_node_flags & SS_BACKGROUND)) - queue_node.queued_priority += queue_priority_count * 0.1 - queue_priority_count -= queue_node_priority - queue_priority_count += queue_node.queued_priority - current_tick_budget -= queue_node_priority - queue_node = queue_node.queue_next - continue if (!bg_calc && (queue_node_flags & SS_BACKGROUND)) current_tick_budget = queue_priority_count_bg @@ -481,7 +491,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new tick_remaining = TICK_LIMIT_RUNNING - TICK_USAGE if (current_tick_budget > 0 && queue_node_priority > 0) - tick_precentage = tick_remaining / (current_tick_budget / queue_node_priority) + //Give the subsystem a precentage of the remaining tick based on the remaning priority + tick_precentage = tick_remaining * (queue_node_priority / current_tick_budget) else tick_precentage = tick_remaining @@ -489,8 +500,6 @@ GLOBAL_REAL(Master, /datum/controller/master) = new current_ticklimit = round(TICK_USAGE + tick_precentage) - if (!(queue_node_flags & SS_TICKER)) - ran_non_ticker = TRUE ran = TRUE queue_node_paused = (queue_node.state == SS_PAUSED || queue_node.state == SS_PAUSING) @@ -535,14 +544,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new queue_node.last_fire = world.time queue_node.times_fired++ - if (queue_node_flags & SS_TICKER) - queue_node.next_fire = world.time + (world.tick_lag * queue_node.wait) - else if (queue_node_flags & SS_POST_FIRE_TIMING) - queue_node.next_fire = world.time + queue_node.wait + (world.tick_lag * (queue_node.tick_overrun/100)) - else if (queue_node_flags & SS_KEEP_TIMING) - queue_node.next_fire += queue_node.wait - else - queue_node.next_fire = queue_node.queued_time + queue_node.wait + (world.tick_lag * (queue_node.tick_overrun/100)) + queue_node.update_nextfire() queue_node.queued_time = 0 @@ -554,7 +556,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new . = 1 //resets the queue, and all subsystems, while filtering out the subsystem lists -// called if any mc's queue procs runtime or exit improperly. +// called if any mc's queue procs runtime or exit improperly. /datum/controller/master/proc/SoftReset(list/ticker_SS, list/runlevel_SS) . = 0 log_world("MC: SoftReset called, resetting MC queue state.") diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index 12798f3863..db780ca05b 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -29,11 +29,11 @@ var/initialized = FALSE /// Set to 0 to prevent fire() calls, mostly for admin use or subsystems that may be resumed later - /// use the [SS_NO_FIRE] flag instead for systems that never fire to keep it from even being added to list that is checked every tick + /// use the [SS_NO_FIRE] flag instead for systems that never fire to keep it from even being added to list that is checked every tick var/can_fire = TRUE ///Bitmap of what game states can this subsystem fire at. See [RUNLEVELS_DEFAULT] for more details. - var/runlevels = RUNLEVELS_DEFAULT //points of the game at which the SS can fire + var/runlevels = RUNLEVELS_DEFAULT //points of the game at which the SS can fire /* * The following variables are managed by the MC and should not be modified directly. @@ -69,6 +69,9 @@ /// Tracks the amount of completed runs for the subsystem var/times_fired = 0 + /// How many fires have we been requested to postpone + var/postponed_fires = 0 + /// Time the subsystem entered the queue, (for timing and priority reasons) var/queued_time = 0 @@ -122,12 +125,38 @@ dequeue() can_fire = 0 flags |= SS_NO_FIRE - Master.subsystems -= src + if (Master) + Master.subsystems -= src return ..() + +/** Update next_fire for the next run. + * reset_time (bool) - Ignore things that would normally alter the next fire, like tick_overrun, and last_fire. (also resets postpone) + */ +/datum/controller/subsystem/proc/update_nextfire(reset_time = FALSE) + var/queue_node_flags = flags + + if (reset_time) + postponed_fires = 0 + if (queue_node_flags & SS_TICKER) + next_fire = world.time + (world.tick_lag * wait) + else + next_fire = world.time + wait + return + + if (queue_node_flags & SS_TICKER) + next_fire = world.time + (world.tick_lag * wait) + else if (queue_node_flags & SS_POST_FIRE_TIMING) + next_fire = world.time + wait + (world.tick_lag * (tick_overrun/100)) + else if (queue_node_flags & SS_KEEP_TIMING) + next_fire += wait + else + next_fire = queued_time + wait + (world.tick_lag * (tick_overrun/100)) + + //Queue it to run. -// (we loop thru a linked list until we get to the end or find the right point) -// (this lets us sort our run order correctly without having to re-sort the entire already sorted list) +// (we loop thru a linked list until we get to the end or find the right point) +// (this lets us sort our run order correctly without having to re-sort the entire already sorted list) /datum/controller/subsystem/proc/enqueue() var/SS_priority = priority var/SS_flags = flags @@ -191,9 +220,9 @@ queue_next.queue_prev = queue_prev if (queue_prev) queue_prev.queue_next = queue_next - if (src == Master.queue_tail) + if (Master && (src == Master.queue_tail)) Master.queue_tail = queue_prev - if (src == Master.queue_head) + if (Master && (src == Master.queue_head)) Master.queue_head = queue_next queued_time = 0 if (state == SS_QUEUED) @@ -217,10 +246,11 @@ //used to initialize the subsystem AFTER the map has loaded /datum/controller/subsystem/Initialize(start_timeofday) initialized = TRUE + // SEND_SIGNAL(src, COMSIG_SUBSYSTEM_POST_INITIALIZE, start_timeofday) var/time = (REALTIMEOFDAY - start_timeofday) / 10 var/msg = "Initialized [name] subsystem within [time] second[time == 1 ? "" : "s"]!" - to_chat(world, "[msg]") - log_subsystem("INIT", msg) + to_chat(world, span_boldannounce("[msg]")) + log_subsystem(msg) return time /datum/controller/subsystem/stat_entry(msg) @@ -243,11 +273,10 @@ if (SS_IDLE) . = " " -//could be used to postpone a costly subsystem for (default one) var/cycles, cycles -//for instance, during cpu intensive operations like explosions +/// Causes the next "cycle" fires to be missed. Effect is accumulative but can reset by calling update_nextfire(reset_time = TRUE) /datum/controller/subsystem/proc/postpone(cycles = 1) - if(next_fire - world.time < wait) - next_fire += (wait*cycles) + if (can_fire && cycles >= 1) + postponed_fires += cycles //usually called via datum/controller/subsystem/New() when replacing a subsystem (i.e. due to a recurring crash) //should attempt to salvage what it can from the old instance of subsystem @@ -258,7 +287,7 @@ if (NAMEOF(src, can_fire)) //this is so the subsystem doesn't rapid fire to make up missed ticks causing more lag if (var_value) - next_fire = world.time + wait + update_nextfire(reset_time = TRUE) if (NAMEOF(src, queued_priority)) //editing this breaks things. return FALSE . = ..() diff --git a/code/controllers/subsystem/activity.dm b/code/controllers/subsystem/activity.dm index 0a8d248e58..d10e67f210 100644 --- a/code/controllers/subsystem/activity.dm +++ b/code/controllers/subsystem/activity.dm @@ -11,6 +11,7 @@ SUBSYSTEM_DEF(activity) /datum/controller/subsystem/activity/Initialize(timeofday) RegisterSignal(SSdcs,COMSIG_GLOB_EXPLOSION,.proc/on_explosion) RegisterSignal(SSdcs,COMSIG_GLOB_MOB_DEATH,.proc/on_death) + return ..() /datum/controller/subsystem/activity/fire(resumed = 0) calculate_threat() @@ -54,7 +55,10 @@ SUBSYSTEM_DEF(activity) var/weight = (text2num(threat_history[i+1])-text2num(threat_history[i])) total_weight += weight total_amt += weight * (threat_history[threat_history[i]]) - return round(total_amt / total_weight,0.1) + if(total_weight == 0) + return total_amt + else + return round(total_amt / total_weight,0.1) /datum/controller/subsystem/activity/proc/get_max_threat() . = 0 diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 3351b37407..c79f9523c0 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -30,6 +30,7 @@ SUBSYSTEM_DEF(air) var/list/networks = list() var/list/pipenets_needing_rebuilt = list() var/list/deferred_airs = list() + var/cur_deferred_airs = 0 var/max_deferred_airs = 0 var/list/obj/machinery/atmos_machinery = list() var/list/obj/machinery/atmos_air_machinery = list() @@ -37,7 +38,8 @@ SUBSYSTEM_DEF(air) //atmos singletons var/list/gas_reactions = list() - + var/list/atmos_gen + var/list/planetary = list() //auxmos already caches static planetary mixes but could be convenient to do so here too //Special functions lists var/list/turf/open/high_pressure_delta = list() @@ -53,14 +55,24 @@ SUBSYSTEM_DEF(air) var/equalize_turf_limit = 10 // Max number of turfs to look for a space turf, and max number of turfs that will be decompressed. var/equalize_hard_turf_limit = 2000 - // Whether equalization should be enabled at all. - var/equalize_enabled = FALSE + // Whether equalization is enabled. Can be disabled for performance reasons. + var/equalize_enabled = TRUE + // Whether equalization should be enabled. + var/should_do_equalization = TRUE + // When above 0, won't equalize; performance handling + var/eq_cooldown = 0 // Whether turf-to-turf heat exchanging should be enabled. var/heat_enabled = FALSE // Max number of times process_turfs will share in a tick. - var/share_max_steps = 1 + var/share_max_steps = 3 + // Target for share_max_steps; can go below this, if it determines the thread is taking too long. + var/share_max_steps_target = 3 // Excited group processing will try to equalize groups with total pressure difference less than this amount. - var/excited_group_pressure_goal = 0.25 + var/excited_group_pressure_goal = 1 + // Target for excited_group_pressure_goal; can go below this, if it determines the thread is taking too long. + var/excited_group_pressure_goal_target = 1 + // If this is set to 0, monstermos won't process planet atmos + var/planet_equalize_enabled = 0 /datum/controller/subsystem/air/stat_entry(msg) msg += "C:{" @@ -96,6 +108,7 @@ SUBSYSTEM_DEF(air) setup_atmos_machinery() setup_pipenets() gas_reactions = init_gas_reactions() + should_do_equalization = CONFIG_GET(flag/atmos_equalize_enabled) auxtools_update_reactions() return ..() @@ -218,6 +231,7 @@ SUBSYSTEM_DEF(air) // This also happens to do all the commented out stuff below, all in a single separate thread. This is mostly so that the // waiting is consistent. if(currentpart == SSAIR_ACTIVETURFS) + run_delay_heuristics() timer = TICK_USAGE_REAL process_turfs(resumed) cost_turfs = MC_AVERAGE(cost_turfs, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) @@ -275,7 +289,8 @@ SUBSYSTEM_DEF(air) pipenets_needing_rebuilt += atmos_machine /datum/controller/subsystem/air/proc/process_deferred_airs(resumed = 0) - max_deferred_airs = max(deferred_airs.len,max_deferred_airs) + cur_deferred_airs = deferred_airs.len + max_deferred_airs = max(cur_deferred_airs,max_deferred_airs) while(deferred_airs.len) var/list/cur_op = deferred_airs[deferred_airs.len] deferred_airs.len-- @@ -375,6 +390,24 @@ SUBSYSTEM_DEF(air) return */ +/datum/controller/subsystem/air/proc/run_delay_heuristics() + if(!equalize_enabled) + cost_equalize = 0 + if(should_do_equalization) + eq_cooldown-- + if(eq_cooldown <= 0) + equalize_enabled = TRUE + var/total_thread_time = cost_turfs + cost_equalize + cost_groups + cost_post_process + if(total_thread_time) + var/wait_ms = wait * 100 + var/delay_threshold = 1-(total_thread_time/wait_ms + cur_deferred_airs / 50) + share_max_steps = max(1,round(share_max_steps_target * delay_threshold, 1)) + eq_cooldown += (1-delay_threshold) * (cost_equalize / total_thread_time) * 2 + if(eq_cooldown > 0.5) + equalize_enabled = FALSE + excited_group_pressure_goal = max(0,excited_group_pressure_goal_target * (1 - delay_threshold)) + + /datum/controller/subsystem/air/proc/process_turfs(resumed = 0) if(process_turfs_auxtools(resumed,TICK_REMAINING_MS)) pause() @@ -399,7 +432,7 @@ SUBSYSTEM_DEF(air) pause() /datum/controller/subsystem/air/proc/finish_turf_processing(resumed = 0) - if(finish_turf_processing_auxtools(TICK_REMAINING_MS)) + if(finish_turf_processing_auxtools(TICK_REMAINING_MS) || thread_running()) pause() /datum/controller/subsystem/air/proc/post_process_turfs(resumed = 0) @@ -473,6 +506,20 @@ SUBSYSTEM_DEF(air) return pipe_init_dirs_cache[type]["[dir]"] +/datum/controller/subsystem/air/proc/generate_atmos() + atmos_gen = list() + for(var/T in subtypesof(/datum/atmosphere)) + var/datum/atmosphere/atmostype = T + atmos_gen[initial(atmostype.id)] = new atmostype + +/datum/controller/subsystem/air/proc/preprocess_gas_string(gas_string) + if(!atmos_gen) + generate_atmos() + if(!atmos_gen[gas_string]) + return gas_string + var/datum/atmosphere/mix = atmos_gen[gas_string] + return mix.gas_string + #undef SSAIR_PIPENETS #undef SSAIR_ATMOSMACHINERY #undef SSAIR_EXCITEDGROUPS diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 2d2fac1d13..7f7d301a1d 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -29,37 +29,35 @@ SUBSYSTEM_DEF(garbage) runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY init_order = INIT_ORDER_GARBAGE - var/list/collection_timeout = list(2 MINUTES, 10 SECONDS) // deciseconds to wait before moving something up in the queue to the next level + var/list/collection_timeout = list(GC_FILTER_QUEUE, GC_DEL_QUEUE) // deciseconds to wait before moving something up in the queue to the next level //Stat tracking - var/delslasttick = 0 // number of del()'s we've done this tick - var/gcedlasttick = 0 // number of things that gc'ed last tick + var/delslasttick = 0 // number of del()'s we've done this tick + var/gcedlasttick = 0 // number of things that gc'ed last tick var/totaldels = 0 var/totalgcs = 0 - var/highest_del_time = 0 - var/highest_del_tickusage = 0 + var/highest_del_ms = 0 + var/highest_del_type_string = "" var/list/pass_counts var/list/fail_counts - var/list/items = list() // Holds our qdel_item statistics datums + var/list/items = list() // Holds our qdel_item statistics datums //Queue var/list/queues - #ifdef LEGACY_REFERENCE_TRACKING + #ifdef REFERENCE_TRACKING var/list/reference_find_on_fail = list() + #ifdef REFERENCE_TRACKING_DEBUG + //Should we save found refs. Used for unit testing + var/should_save_refs = FALSE + #endif #endif /datum/controller/subsystem/garbage/PreInit() - queues = new(GC_QUEUE_COUNT) - pass_counts = new(GC_QUEUE_COUNT) - fail_counts = new(GC_QUEUE_COUNT) - for(var/i in 1 to GC_QUEUE_COUNT) - queues[i] = list() - pass_counts[i] = 0 - fail_counts[i] = 0 + InitQueues() /datum/controller/subsystem/garbage/stat_entry(msg) var/list/counts = list() @@ -90,13 +88,18 @@ SUBSYSTEM_DEF(garbage) for(var/path in items) var/datum/qdel_item/I = items[path] dellog += "Path: [path]" + if (I.qdel_flags & QDEL_ITEM_SUSPENDED_FOR_LAG) + dellog += "\tSUSPENDED FOR LAG" if (I.failures) dellog += "\tFailures: [I.failures]" dellog += "\tqdel() Count: [I.qdels]" dellog += "\tDestroy() Cost: [I.destroy_time]ms" if (I.hard_deletes) - dellog += "\tTotal Hard Deletes [I.hard_deletes]" + dellog += "\tTotal Hard Deletes: [I.hard_deletes]" dellog += "\tTime Spent Hard Deleting: [I.hard_delete_time]ms" + dellog += "\tHighest Time Spent Hard Deleting: [I.hard_delete_max]ms" + if (I.hard_deletes_over_threshold) + dellog += "\tHard Deletes Over Threshold: [I.hard_deletes_over_threshold]" if (I.slept_destroy) dellog += "\tSleeps: [I.slept_destroy]" if (I.no_respect_force) @@ -122,6 +125,15 @@ SUBSYSTEM_DEF(garbage) +/datum/controller/subsystem/garbage/proc/InitQueues() + if (isnull(queues)) // Only init the queues if they don't already exist, prevents overriding of recovered lists + queues = new(GC_QUEUE_COUNT) + pass_counts = new(GC_QUEUE_COUNT) + fail_counts = new(GC_QUEUE_COUNT) + for(var/i in 1 to GC_QUEUE_COUNT) + queues[i] = list() + pass_counts[i] = 0 + fail_counts[i] = 0 /datum/controller/subsystem/garbage/proc/HandleQueue(level = GC_QUEUE_CHECK) if (level == GC_QUEUE_CHECK) @@ -153,7 +165,6 @@ SUBSYSTEM_DEF(garbage) if(GCd_at_time > cut_off_time) break // Everything else is newer, skip them count++ - var/refID = L[2] var/datum/D D = locate(refID) @@ -162,8 +173,8 @@ SUBSYSTEM_DEF(garbage) ++gcedlasttick ++totalgcs pass_counts[level]++ - #ifdef LEGACY_REFERENCE_TRACKING - reference_find_on_fail -= refID //It's deleted we don't care anymore. + #ifdef REFERENCE_TRACKING + reference_find_on_fail -= refID //It's deleted we don't care anymore. #endif if (MC_TICK_CHECK) return @@ -171,35 +182,43 @@ SUBSYSTEM_DEF(garbage) // Something's still referring to the qdel'd object. fail_counts[level]++ + + #ifdef REFERENCE_TRACKING + var/ref_searching = FALSE + #endif + switch (level) if (GC_QUEUE_CHECK) #ifdef REFERENCE_TRACKING - D.find_references() - #elif defined(LEGACY_REFERENCE_TRACKING) if(reference_find_on_fail[refID]) - D.find_references_legacy() + INVOKE_ASYNC(D, /datum/proc/find_references) + ref_searching = TRUE #ifdef GC_FAILURE_HARD_LOOKUP else - D.find_references_legacy() + INVOKE_ASYNC(D, /datum/proc/find_references) + ref_searching = TRUE #endif reference_find_on_fail -= refID #endif var/type = D.type var/datum/qdel_item/I = items[type] - #ifdef TESTING + log_world("## TESTING: GC: -- \ref[D] | [type] was unable to be GC'd --") + #ifdef TESTING for(var/c in GLOB.admins) //Using testing() here would fill the logs with ADMIN_VV garbage var/client/admin = c if(!check_rights_for(admin, R_ADMIN)) continue to_chat(admin, "## TESTING: GC: -- [ADMIN_VV(D)] | [type] was unable to be GC'd --") - testing("GC: -- \ref[src] | [type] was unable to be GC'd --") - #endif - #ifdef REFERENCE_TRACKING - GLOB.deletion_failures += D //It should no longer be bothered by the GC, manual deletion only. - continue #endif I.failures++ + + if (I.qdel_flags & QDEL_ITEM_SUSPENDED_FOR_LAG) + #ifdef REFERENCE_TRACKING + if(ref_searching) + return //ref searching intentionally cancels all further fires while running so things that hold references don't end up getting deleted, so we want to return here instead of continue + #endif + continue if (GC_QUEUE_HARDDELETE) HardDelete(D) if (MC_TICK_CHECK) @@ -208,27 +227,17 @@ SUBSYSTEM_DEF(garbage) Queue(D, level+1) + #ifdef REFERENCE_TRACKING + if(ref_searching) + return + #endif + if (MC_TICK_CHECK) return if (count) queue.Cut(1,count+1) count = 0 -#ifdef LEGACY_REFERENCE_TRACKING -/datum/controller/subsystem/garbage/proc/add_type_to_findref(type) - if(!ispath(type)) - return "NOT A VAILD PATH" - reference_find_on_fail_types |= typecacheof(type) - -/datum/controller/subsystem/garbage/proc/remove_type_from_findref(type) - if(!ispath(type)) - return "NOT A VALID PATH" - reference_find_on_fail_types -= typesof(type) - -/datum/controller/subsystem/garbage/proc/clear_findref_types() - reference_find_on_fail_types = list() -#endif - /datum/controller/subsystem/garbage/proc/Queue(datum/D, level = GC_QUEUE_CHECK) if (isnull(D)) return @@ -238,63 +247,66 @@ SUBSYSTEM_DEF(garbage) var/gctime = world.time var/refid = "\ref[D]" -#ifdef LEGACY_REFERENCE_TRACKING - if(reference_find_on_fail_types[D.type]) - SSgarbage.reference_find_on_fail[REF(D)] = TRUE -#endif - D.gc_destroyed = gctime var/list/queue = queues[level] + queue[++queue.len] = list(gctime, refid) // not += for byond reasons //this is mainly to separate things profile wise. /datum/controller/subsystem/garbage/proc/HardDelete(datum/D) - var/time = world.timeofday - var/tick = TICK_USAGE - var/ticktime = world.time ++delslasttick ++totaldels var/type = D.type var/refID = "\ref[D]" + var/tick_usage = TICK_USAGE del(D) - - tick = (TICK_USAGE-tick+((world.time-ticktime)/world.tick_lag*100)) + tick_usage = TICK_USAGE_TO_MS(tick_usage) var/datum/qdel_item/I = items[type] - I.hard_deletes++ - I.hard_delete_time += TICK_DELTA_TO_MS(tick) + I.hard_delete_time += tick_usage + if (tick_usage > I.hard_delete_max) + I.hard_delete_max = tick_usage + if (tick_usage > highest_del_ms) + highest_del_ms = tick_usage + highest_del_type_string = "[type]" + var/time = MS2DS(tick_usage) - if (tick > highest_del_tickusage) - highest_del_tickusage = tick - time = world.timeofday - time - if (!time && TICK_DELTA_TO_MS(tick) > 1) - time = TICK_DELTA_TO_MS(tick)/100 - if (time > highest_del_time) - highest_del_time = time - if (time > 10) - log_game("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete)") - message_admins("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete).") + if (time > 0.1 SECONDS) postpone(time) + var/threshold = CONFIG_GET(number/hard_deletes_overrun_threshold) + if (threshold && (time > threshold SECONDS)) + if (!(I.qdel_flags & QDEL_ITEM_ADMINS_WARNED)) + log_game("Error: [type]([refID]) took longer than [threshold] seconds to delete (took [round(time/10, 0.1)] seconds to delete)") + message_admins("Error: [type]([refID]) took longer than [threshold] seconds to delete (took [round(time/10, 0.1)] seconds to delete).") + I.qdel_flags |= QDEL_ITEM_ADMINS_WARNED + I.hard_deletes_over_threshold++ + var/overrun_limit = CONFIG_GET(number/hard_deletes_overrun_limit) + if (overrun_limit && I.hard_deletes_over_threshold >= overrun_limit) + I.qdel_flags |= QDEL_ITEM_SUSPENDED_FOR_LAG /datum/controller/subsystem/garbage/Recover() + InitQueues() //We first need to create the queues before recovering data if (istype(SSgarbage.queues)) for (var/i in 1 to SSgarbage.queues.len) queues[i] |= SSgarbage.queues[i] - +/// Qdel Item: Holds statistics on each type that passes thru qdel /datum/qdel_item - var/name = "" - var/qdels = 0 //Total number of times it's passed thru qdel. - var/destroy_time = 0 //Total amount of milliseconds spent processing this type's Destroy() - var/failures = 0 //Times it was queued for soft deletion but failed to soft delete. - var/hard_deletes = 0 //Different from failures because it also includes QDEL_HINT_HARDDEL deletions - var/hard_delete_time = 0//Total amount of milliseconds spent hard deleting this type. - var/no_respect_force = 0//Number of times it's not respected force=TRUE - var/no_hint = 0 //Number of times it's not even bother to give a qdel hint - var/slept_destroy = 0 //Number of times it's slept in its destroy + var/name = "" //!Holds the type as a string for this type + var/qdels = 0 //!Total number of times it's passed thru qdel. + var/destroy_time = 0 //!Total amount of milliseconds spent processing this type's Destroy() + var/failures = 0 //!Times it was queued for soft deletion but failed to soft delete. + var/hard_deletes = 0 //!Different from failures because it also includes QDEL_HINT_HARDDEL deletions + var/hard_delete_time = 0 //!Total amount of milliseconds spent hard deleting this type. + var/hard_delete_max = 0 //!Highest time spent hard_deleting this in ms. + var/hard_deletes_over_threshold = 0 //!Number of times hard deletes took longer than the configured threshold + var/no_respect_force = 0 //!Number of times it's not respected force=TRUE + var/no_hint = 0 //!Number of times it's not even bother to give a qdel hint + var/slept_destroy = 0 //!Number of times it's slept in its destroy + var/qdel_flags = 0 //!Flags related to this type's trip thru qdel. /datum/qdel_item/New(mytype) name = "[mytype]" @@ -307,12 +319,12 @@ SUBSYSTEM_DEF(garbage) if(!istype(D)) del(D) return + var/datum/qdel_item/I = SSgarbage.items[D.type] if (!I) I = SSgarbage.items[D.type] = new /datum/qdel_item(D.type) I.qdels++ - if(isnull(D.gc_destroyed)) if (SEND_SIGNAL(D, COMSIG_PARENT_PREQDELETED, force)) // Give the components a chance to prevent their parent from being deleted return @@ -328,12 +340,12 @@ SUBSYSTEM_DEF(garbage) if(!D) return switch(hint) - if (QDEL_HINT_QUEUE) //qdel should queue the object for deletion. + if (QDEL_HINT_QUEUE) //qdel should queue the object for deletion. SSgarbage.Queue(D) if (QDEL_HINT_IWILLGC) D.gc_destroyed = world.time return - if (QDEL_HINT_LETMELIVE) //qdel should let the object live after calling destory. + if (QDEL_HINT_LETMELIVE) //qdel should let the object live after calling destory. if(!force) D.gc_destroyed = null //clear the gc variable (important!) return @@ -350,17 +362,17 @@ SUBSYSTEM_DEF(garbage) I.no_respect_force++ SSgarbage.Queue(D) - if (QDEL_HINT_HARDDEL) //qdel should assume this object won't gc, and queue a hard delete + if (QDEL_HINT_HARDDEL) //qdel should assume this object won't gc, and queue a hard delete SSgarbage.Queue(D, GC_QUEUE_HARDDELETE) - if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste. + if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste. SSgarbage.HardDelete(D) - #ifdef LEGACY_REFERENCE_TRACKING - if (QDEL_HINT_FINDREFERENCE) //qdel will, if LEGACY_REFERENCE_TRACKING is enabled, display all references to this object, then queue the object for deletion. + #ifdef REFERENCE_TRACKING + if (QDEL_HINT_FINDREFERENCE) //qdel will, if REFERENCE_TRACKING is enabled, display all references to this object, then queue the object for deletion. SSgarbage.Queue(D) - D.find_references_legacy() - if (QDEL_HINT_IFFAIL_FINDREFERENCE) + D.find_references() + if (QDEL_HINT_IFFAIL_FINDREFERENCE) //qdel will, if REFERENCE_TRACKING is enabled and the object fails to collect, display all references to this object. SSgarbage.Queue(D) - SSgarbage.reference_find_on_fail[REF(D)] = TRUE + SSgarbage.reference_find_on_fail["\ref[D]"] = TRUE #endif else #ifdef TESTING @@ -371,18 +383,3 @@ SUBSYSTEM_DEF(garbage) SSgarbage.Queue(D) else if(D.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) CRASH("[D.type] destroy proc was called multiple times, likely due to a qdel loop in the Destroy logic") - -#ifdef TESTING -/proc/writeDatumCount() - var/list/datums = list() - for(var/datum/D in world) - datums[D.type] += 1 - for(var/datum/D) - datums[D.type] += 1 - datums = sortTim(datums, /proc/cmp_numeric_dsc, associative = TRUE) - if(fexists("data/DATUMCOUNT.txt")) - fdel("data/DATUMCOUNT.txt") - var/outfile = file("data/DATUMCOUNT.txt") - for(var/path in datums) - outfile << "[datums[path]]\t\t\t\t\t[path]" -#endif diff --git a/code/controllers/subsystem/parallax.dm b/code/controllers/subsystem/parallax.dm index 7096c667e1..86bd517602 100644 --- a/code/controllers/subsystem/parallax.dm +++ b/code/controllers/subsystem/parallax.dm @@ -15,7 +15,7 @@ SUBSYSTEM_DEF(parallax) /datum/controller/subsystem/parallax/PreInit() . = ..() if(prob(70)) //70% chance to pick a special extra layer - random_layer = pick(/obj/screen/parallax_layer/random/space_gas, /obj/screen/parallax_layer/random/asteroids) + random_layer = pick(/atom/movable/screen/parallax_layer/random/space_gas, /atom/movable/screen/parallax_layer/random/asteroids) random_parallax_color = pick(COLOR_TEAL, COLOR_GREEN, COLOR_YELLOW, COLOR_CYAN, COLOR_ORANGE, COLOR_PURPLE)//Special color for random_layer1. Has to be done here so everyone sees the same color. [COLOR_SILVER] planet_y_offset = rand(100, 160) planet_x_offset = rand(100, 160) diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index ac9db60ccc..410e21d419 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -366,10 +366,16 @@ SUBSYSTEM_DEF(research) techweb_categories[I.category] = list(I.id = TRUE) /datum/controller/subsystem/research/proc/techweb_node_by_id(id) - return techweb_nodes[id] || error_node + if(techweb_nodes[id]) + return techweb_nodes[id] + stack_trace("Attempted to access node ID [id] which didn't exist") + return error_node /datum/controller/subsystem/research/proc/techweb_design_by_id(id) - return techweb_designs[id] || error_design + if(techweb_designs[id]) + return techweb_designs[id] + stack_trace("Attempted to access design ID [id] which didn't exist") + return error_design /datum/controller/subsystem/research/proc/on_design_deletion(datum/design/D) for(var/i in techweb_nodes) @@ -409,8 +415,7 @@ SUBSYSTEM_DEF(research) var/datum/techweb_node/TN = techweb_nodes[id] TN.Initialize() techweb_nodes = returned - if (!verify_techweb_nodes()) //Verify all nodes have ids and such. - stack_trace("Invalid techweb nodes detected") + verify_techweb_nodes() calculate_techweb_nodes() calculate_techweb_boost_list() if (!verify_techweb_nodes()) //Verify nodes and designs have been crosslinked properly. @@ -442,52 +447,52 @@ SUBSYSTEM_DEF(research) for(var/n in techweb_nodes) var/datum/techweb_node/N = techweb_nodes[n] if(!istype(N)) - WARNING("Invalid research node with ID [n] detected and removed.") + stack_trace("Invalid research node with ID [n] detected and removed.") techweb_nodes -= n research_node_id_error(n) . = FALSE for(var/p in N.prereq_ids) var/datum/techweb_node/P = techweb_nodes[p] if(!istype(P)) - WARNING("Invalid research prerequisite node with ID [p] detected in node [N.display_name]\[[N.id]\] removed.") + stack_trace("Invalid research prerequisite node with ID [p] detected in node [N.display_name]\[[N.id]\] removed.") N.prereq_ids -= p research_node_id_error(p) . = FALSE for(var/d in N.design_ids) var/datum/design/D = techweb_designs[d] if(!istype(D)) - WARNING("Invalid research design with ID [d] detected in node [N.display_name]\[[N.id]\] removed.") + stack_trace("Invalid research design with ID [d] detected in node [N.display_name]\[[N.id]\] removed.") N.design_ids -= d design_id_error(d) . = FALSE for(var/u in N.unlock_ids) var/datum/techweb_node/U = techweb_nodes[u] if(!istype(U)) - WARNING("Invalid research unlock node with ID [u] detected in node [N.display_name]\[[N.id]\] removed.") + stack_trace("Invalid research unlock node with ID [u] detected in node [N.display_name]\[[N.id]\] removed.") N.unlock_ids -= u research_node_id_error(u) . = FALSE for(var/p in N.boost_item_paths) if(!ispath(p)) N.boost_item_paths -= p - WARNING("[p] is not a valid path.") + stack_trace("[p] is not a valid path.") node_boost_error(N.id, "[p] is not a valid path.") . = FALSE var/list/points = N.boost_item_paths[p] if(islist(points)) for(var/i in points) if(!isnum(points[i])) - WARNING("[points[i]] is not a valid number.") + stack_trace("[points[i]] is not a valid number.") node_boost_error(N.id, "[points[i]] is not a valid number.") . = FALSE else if(!point_types[i]) - WARNING("[i] is not a valid point type.") + stack_trace("[i] is not a valid point type.") node_boost_error(N.id, "[i] is not a valid point type.") . = FALSE else if(!isnull(points)) N.boost_item_paths -= p node_boost_error(N.id, "No valid list.") - WARNING("No valid list.") + stack_trace("No valid list.") . = FALSE CHECK_TICK diff --git a/code/controllers/subsystem/sun.dm b/code/controllers/subsystem/sun.dm index 746b1be7a9..dba9adac98 100644 --- a/code/controllers/subsystem/sun.dm +++ b/code/controllers/subsystem/sun.dm @@ -59,5 +59,3 @@ SUBSYSTEM_DEF(sun) /datum/controller/subsystem/sun/proc/complete_movement() SEND_SIGNAL(src, COMSIG_SUN_MOVED, primary_sun, suns) - -#undef OCCLUSION_DISTANCE diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index a7a3e87672..dfee659080 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -421,7 +421,7 @@ SUBSYSTEM_DEF(ticker) if (living.client.prefs && living.client.prefs.auto_ooc) if (living.client.prefs.chat_toggles & CHAT_OOC) living.client.prefs.chat_toggles ^= CHAT_OOC - var/obj/screen/splash/S = new(living.client, TRUE) + var/atom/movable/screen/splash/S = new(living.client, TRUE) S.Fade(TRUE) living.client.init_verbs() livings += living diff --git a/code/controllers/subsystem/title.dm b/code/controllers/subsystem/title.dm index 996f73ccf6..3cc3d9dd99 100644 --- a/code/controllers/subsystem/title.dm +++ b/code/controllers/subsystem/title.dm @@ -10,7 +10,7 @@ SUBSYSTEM_DEF(title) /datum/controller/subsystem/title/Initialize() if(file_path && icon) - return + return ..() if(fexists("data/previous_title.dat")) var/previous_path = file2text("data/previous_title.dat") @@ -31,15 +31,13 @@ SUBSYSTEM_DEF(title) if(length(title_screens)) file_path = "[global.config.directory]/title_screens/images/[pick(title_screens)]" - if(!file_path) + if(!file_path || !fexists(file_path)) file_path = "icons/default_title.dmi" - ASSERT(fexists(file_path)) - - icon = new(fcopy_rsc(file_path)) - - if(splash_turf) - splash_turf.icon = icon + if(fexists(file_path)) + icon = new(fcopy_rsc(file_path)) + if(splash_turf) + splash_turf.icon = icon return ..() @@ -59,7 +57,7 @@ SUBSYSTEM_DEF(title) for(var/thing in GLOB.clients) if(!thing) continue - var/obj/screen/splash/S = new(thing, FALSE) + var/atom/movable/screen/splash/S = new(thing, FALSE) S.Fade(FALSE,FALSE) /datum/controller/subsystem/title/Recover() diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 2474a6f272..1153088a91 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -68,7 +68,7 @@ SUBSYSTEM_DEF(vote) //get the highest number of votes var/greatest_votes = 0 var/total_votes = 0 - if(mode == "gamemode" && CONFIG_GET(flag/must_be_readied_to_vote_gamemode)) + if((mode == "gamemode" || mode == "roundtype") && CONFIG_GET(flag/must_be_readied_to_vote_gamemode)) for(var/mob/dead/new_player/P in GLOB.player_list) if(P.ready != PLAYER_READY_TO_PLAY && voted[P.ckey]) choices[choices[voted[P.ckey]]]-- @@ -105,7 +105,7 @@ SUBSYSTEM_DEF(vote) /datum/controller/subsystem/vote/proc/calculate_condorcet_votes(var/blackbox_text) // https://en.wikipedia.org/wiki/Schulze_method#Implementation - if((mode == "gamemode" || mode == "dynamic") && CONFIG_GET(flag/must_be_readied_to_vote_gamemode)) + if((mode == "gamemode" || mode == "dynamic" || mode == "roundtype") && CONFIG_GET(flag/must_be_readied_to_vote_gamemode)) for(var/mob/dead/new_player/P in GLOB.player_list) if(P.ready != PLAYER_READY_TO_PLAY && voted[P.ckey]) voted -= P.ckey @@ -155,7 +155,7 @@ SUBSYSTEM_DEF(vote) for(var/choice in choices) scores_by_choice += "[choice]" scores_by_choice["[choice]"] = list() - if((mode == "gamemode" || mode == "dynamic") && CONFIG_GET(flag/must_be_readied_to_vote_gamemode)) + if((mode == "gamemode" || mode == "dynamic" || mode == "roundtype") && CONFIG_GET(flag/must_be_readied_to_vote_gamemode)) for(var/mob/dead/new_player/P in GLOB.player_list) if(P.ready != PLAYER_READY_TO_PLAY && voted[P.ckey]) voted -= P.ckey diff --git a/code/datums/action.dm b/code/datums/action.dm index 064829f0df..1a8ea7a60f 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -11,7 +11,7 @@ var/check_flags = 0 var/required_mobility_flags = MOBILITY_USE var/processing = FALSE - var/obj/screen/movable/action_button/button = null + var/atom/movable/screen/movable/action_button/button = null var/buttontooltipstyle = "" var/transparent_when_unavailable = TRUE var/use_target_appearance = FALSE @@ -159,7 +159,7 @@ button.color = rgb(255,255,255,255) return 1 -/datum/action/proc/ApplyIcon(obj/screen/movable/action_button/current_button, force = FALSE) +/datum/action/proc/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force = FALSE) if(icon_icon && button_icon_state && ((current_button.button_icon_state != button_icon_state) || force)) current_button.cut_overlays() current_button.add_overlay(mutable_appearance(icon_icon, button_icon_state)) @@ -821,7 +821,7 @@ icon_icon = 'icons/mob/actions/actions_items.dmi' button_icon_state = "storage_gather_switch" -/datum/action/item_action/storage_gather_mode/ApplyIcon(obj/screen/movable/action_button/current_button) +/datum/action/item_action/storage_gather_mode/ApplyIcon(atom/movable/screen/movable/action_button/current_button) . = ..() var/old_layer = target.layer var/old_plane = target.plane diff --git a/code/datums/atmosphere/_atmosphere.dm b/code/datums/atmosphere/_atmosphere.dm new file mode 100644 index 0000000000..5323b070cd --- /dev/null +++ b/code/datums/atmosphere/_atmosphere.dm @@ -0,0 +1,60 @@ +/datum/atmosphere + var/gas_string + var/id + + var/list/base_gases // A list of gases to always have + var/list/normal_gases // A list of allowed gases:base_amount + var/list/restricted_gases // A list of allowed gases like normal_gases but each can only be selected a maximum of one time + var/restricted_chance = 10 // Chance per iteration to take from restricted gases + + var/minimum_pressure + var/maximum_pressure + + var/minimum_temp + var/maximum_temp + +/datum/atmosphere/New() + generate_gas_string() + +/datum/atmosphere/proc/generate_gas_string() + var/list/spicy_gas = restricted_gases.Copy() + var/target_pressure = rand(minimum_pressure, maximum_pressure) + var/pressure_scale = target_pressure / maximum_pressure + + // First let's set up the gasmix and base gases for this template + // We make the string from a gasmix in this proc because gases need to calculate their pressure + var/datum/gas_mixture/gasmix = new + gasmix.set_temperature(rand(minimum_temp, maximum_temp)) + for(var/i in base_gases) + gasmix.set_moles(i, base_gases[i]) + + // Now let the random choices begin + var/gastype + var/amount + while(gasmix.return_pressure() < target_pressure) + if(!prob(restricted_chance) || !length(spicy_gas)) + gastype = pick(normal_gases) + amount = normal_gases[gastype] + else + gastype = pick(spicy_gas) + amount = spicy_gas[gastype] + spicy_gas -= gastype //You can only pick each restricted gas once + + amount *= rand(50, 200) / 100 // Randomly modifes the amount from half to double the base for some variety + amount *= pressure_scale // If we pick a really small target pressure we want roughly the same mix but less of it all + amount = CEILING(amount, 0.1) + + gasmix.adjust_moles(gastype, amount) + + // That last one put us over the limit, remove some of it + if(gasmix.return_pressure() > target_pressure) + var/moles_to_remove = (1 - target_pressure / gasmix.return_pressure()) * gasmix.total_moles() + gasmix.adjust_moles(gastype, -moles_to_remove) + gasmix.set_moles(gastype, FLOOR(gasmix.get_moles(gastype), 0.1)) + + // Now finally lets make that string + var/list/gas_string_builder = list() + for(var/id in gasmix.get_gases()) + gas_string_builder += "[id]=[gasmix.get_moles(id)]" + gas_string_builder += "TEMP=[gasmix.return_temperature()]" + gas_string = gas_string_builder.Join(";") diff --git a/code/datums/atmosphere/planetary.dm b/code/datums/atmosphere/planetary.dm new file mode 100644 index 0000000000..a8b77f7394 --- /dev/null +++ b/code/datums/atmosphere/planetary.dm @@ -0,0 +1,48 @@ +// Atmos types used for planetary airs +/datum/atmosphere/lavaland + id = LAVALAND_DEFAULT_ATMOS + + base_gases = list( + GAS_O2=5, + GAS_N2=10, + ) + normal_gases = list( + GAS_O2=10, + GAS_N2=10, + GAS_CO2=10, + ) + restricted_gases = list( + GAS_BZ=0.1, + GAS_METHYL_BROMIDE=0.1, + ) + restricted_chance = 30 + + minimum_pressure = HAZARD_LOW_PRESSURE + 10 + maximum_pressure = LAVALAND_EQUIPMENT_EFFECT_PRESSURE - 1 + + minimum_temp = BODYTEMP_COLD_DAMAGE_LIMIT + 1 + maximum_temp = 320 + +/datum/atmosphere/icemoon + id = ICEMOON_DEFAULT_ATMOS + + base_gases = list( + GAS_O2=5, + GAS_N2=10, + ) + normal_gases = list( + GAS_O2=10, + GAS_N2=10, + GAS_CO2=10, + ) + restricted_gases = list( + GAS_METHYL_BROMIDE=0.1, + ) + restricted_chance = 10 + + minimum_pressure = HAZARD_LOW_PRESSURE + 10 + maximum_pressure = LAVALAND_EQUIPMENT_EFFECT_PRESSURE - 1 + + minimum_temp = 180 + maximum_temp = 180 + diff --git a/code/datums/brain_damage/hypnosis.dm b/code/datums/brain_damage/hypnosis.dm index f4c4541db9..de5311943c 100644 --- a/code/datums/brain_damage/hypnosis.dm +++ b/code/datums/brain_damage/hypnosis.dm @@ -47,7 +47,7 @@ "These words keep echoing in your mind. You find yourself completely fascinated by them.")]") to_chat(owner, "You've been hypnotized by this sentence. You must follow these words. If it isn't a clear order, you can freely interpret how to do so,\ as long as you act like the words are your highest priority.") - var/obj/screen/alert/hypnosis/hypno_alert = owner.throw_alert("hypnosis", /obj/screen/alert/hypnosis) + var/atom/movable/screen/alert/hypnosis/hypno_alert = owner.throw_alert("hypnosis", /atom/movable/screen/alert/hypnosis) hypno_alert.desc = "\"[hypnotic_phrase]\"... your mind seems to be fixated on this concept." ..() diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm index 92c4e55699..eb5e3c0735 100644 --- a/code/datums/brain_damage/mild.dm +++ b/code/datums/brain_damage/mild.dm @@ -264,3 +264,36 @@ speak_dejavu += speech_args[SPEECH_MESSAGE] else speak_dejavu += speech_args[SPEECH_MESSAGE] + +/datum/brain_trauma/mild/redacted + name = "Confidentiality Trauma" + desc = "Patient's language neurons seem to be warped in a strange manner, resulting in them being unable to speak properly." + scan_desc = "\[REDACTED]" + gain_text = "You feel the need to \[REDACTED]" + lose_text = "You no longer feel the need to \[REDACTED]." + +/datum/brain_trauma/mild/redacted/handle_speech(datum/source, list/speech_args) + var/message = speech_args[SPEECH_MESSAGE] + if(message) + var/list/message_split = splittext(message, " ") + var/list/new_message = list() + + for(var/word in message_split) + var/suffix = "" + var/suffix_foundon = 0 + for(var/potential_suffix in list("." , "," , ";" , "!" , ":" , "?")) + suffix_foundon = findtext(word, potential_suffix, -length(potential_suffix)) + if(suffix_foundon) + suffix = potential_suffix + break + + if(suffix_foundon) + word = copytext(word, 1, suffix_foundon) + + word = html_decode(word) + + if(prob(25)) + word = pick(list("\[REDACTED]", "\[CLASSIFIED]", "\[EXPUNGED]")) + new_message += word + suffix + message = jointext(new_message, " ") + speech_args[SPEECH_MESSAGE] = trim(message) diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index 3ba00d305b..ed0a9fbab8 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -164,7 +164,7 @@ /datum/brain_trauma/severe/monophobia/on_life() ..() if(check_alone()) - stress = min(stress + 0.5, 100) + stress = min(stress + 0.25, 100) if(stress > 10 && (prob(5))) stress_reaction() else diff --git a/code/datums/cinematic.dm b/code/datums/cinematic.dm index 2648ae1eab..2a8a0ea98a 100644 --- a/code/datums/cinematic.dm +++ b/code/datums/cinematic.dm @@ -18,7 +18,7 @@ playing.play(watcher) qdel(playing) -/obj/screen/cinematic +/atom/movable/screen/cinematic icon = 'icons/effects/station_explosion.dmi' icon_state = "station_intact" plane = SPLASHSCREEN_PLANE @@ -32,7 +32,7 @@ var/list/watching = list() //List of clients watching this var/list/locked = list() //Who had mob_transforming set during the cinematic var/is_global = FALSE //Global cinematics will override mob-specific ones - var/obj/screen/cinematic/screen + var/atom/movable/screen/cinematic/screen var/datum/callback/special_callback //For special effects synced with animation (explosions after the countdown etc) var/cleanup_time = 300 //How long for the final screen to remain var/stop_ooc = TRUE //Turns off ooc when played globally. @@ -74,7 +74,7 @@ ooc_toggled = TRUE toggle_ooc(FALSE) - //Place /obj/screen/cinematic into everyone's screens, prevent them from moving + //Place /atom/movable/screen/cinematic into everyone's screens, prevent them from moving for(var/MM in watchers) var/mob/M = MM show_to(M, M.client) @@ -101,7 +101,7 @@ if(!C) return watching += C - M.overlay_fullscreen("cinematic",/obj/screen/fullscreen/cinematic_backdrop) + M.overlay_fullscreen("cinematic",/atom/movable/screen/fullscreen/cinematic_backdrop) C.screen += screen //Sound helper diff --git a/code/datums/components/armor_plate.dm b/code/datums/components/armor_plate.dm index f026c89c60..763aef6a70 100644 --- a/code/datums/components/armor_plate.dm +++ b/code/datums/components/armor_plate.dm @@ -71,6 +71,7 @@ R.update_icon() to_chat(user, "You strengthen [R], improving its resistance against melee, bullet and laser damage.") else + SEND_SIGNAL(O, COMSIG_ARMOR_PLATED, amount, maxamount) to_chat(user, "You strengthen [O], improving its resistance against melee attacks.") diff --git a/code/datums/components/combat_mode.dm b/code/datums/components/combat_mode.dm index ac18becb67..b61ca33fb8 100644 --- a/code/datums/components/combat_mode.dm +++ b/code/datums/components/combat_mode.dm @@ -7,7 +7,7 @@ var/mode_flags = COMBAT_MODE_INACTIVE var/combatmessagecooldown var/lastmousedir - var/obj/screen/combattoggle/hud_icon + var/atom/movable/screen/combattoggle/hud_icon var/hud_loc /datum/component/combat_mode/Initialize(hud_loc = ui_combat_toggle) @@ -178,18 +178,18 @@ safe_disable_combat_mode(source) /// The screen button. -/obj/screen/combattoggle +/atom/movable/screen/combattoggle name = "toggle combat mode" icon = 'modular_citadel/icons/ui/screen_midnight.dmi' icon_state = "combat_off" var/mutable_appearance/flashy var/combat_on = FALSE ///Wheter combat mode is enabled or not, so we don't have to store a reference. -/obj/screen/combattoggle/Click() +/atom/movable/screen/combattoggle/Click() if(hud && usr == hud.mymob) SEND_SIGNAL(hud.mymob, COMSIG_TOGGLE_COMBAT_MODE) -/obj/screen/combattoggle/update_icon_state() +/atom/movable/screen/combattoggle/update_icon_state() var/mob/living/user = hud?.mymob if(!user) return @@ -200,7 +200,7 @@ else icon_state = "combat_off" -/obj/screen/combattoggle/update_overlays() +/atom/movable/screen/combattoggle/update_overlays() . = ..() var/mob/living/carbon/user = hud?.mymob if(!(user?.client)) diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index 147dd287ca..3ed3e521e4 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -5,10 +5,10 @@ /datum/component/personal_crafting/proc/create_mob_button(mob/user, client/CL) var/datum/hud/H = user.hud_used for(var/huds in H.static_inventory) - if(istype(huds, /obj/screen/craft)) + if(istype(huds, /atom/movable/screen/craft)) return //We don't want to be stacking multiple crafting huds on relogs - var/obj/screen/craft/C = new() + var/atom/movable/screen/craft/C = new() C.icon = H.ui_style H.static_inventory += C CL.screen += C @@ -323,7 +323,7 @@ Deletion.Cut(Deletion.len) qdel(DL) -/datum/component/personal_crafting/proc/component_ui_interact(obj/screen/craft/image, location, control, params, user) +/datum/component/personal_crafting/proc/component_ui_interact(atom/movable/screen/craft/image, location, control, params, user) if(user == parent) ui_interact(user) diff --git a/code/datums/components/crafting/glassware/glassware.dm b/code/datums/components/crafting/glassware/glassware.dm index 88f52d6b01..50137733ee 100644 --- a/code/datums/components/crafting/glassware/glassware.dm +++ b/code/datums/components/crafting/glassware/glassware.dm @@ -1,8 +1,8 @@ //This file is for glass working types of things! /obj/item/glasswork - name = "This is a bug report it!" - desc = "Failer to code. Contact your local bug remover..." + name = "this is a bug!" + desc = "Uh oh, the coders did a fucky wucky! Contact your local code monkey and tell them about this!" icon = 'icons/obj/glassworks.dmi' w_class = WEIGHT_CLASS_SMALL force = 1 @@ -11,45 +11,45 @@ tool_behaviour = null /obj/item/glasswork/glasskit - name = "Glass working tools" - desc = "A lovely belt of most the tools you will need to shape, mold, and refine glass into more advanced shapes." + name = "glasswork tools" + desc = "A set of most the tools you will need to shape, mold, and refine glass into more advanced shapes." icon_state = "glass_tools" tool_behaviour = TOOL_GLASS_CUT //Cutting takes 20 ticks /obj/item/glasswork/blowing_rod - name = "Glass working blow rod" - desc = "A hollow metal stick made for glass blowing." + name = "glassblowing rod" + desc = "A hollow metal rod made for blowing glass." icon_state = "blowing_rods_unused" tool_behaviour = TOOL_BLOW //Rods take 5 ticks /obj/item/glasswork/glass_base //Welding takes 30 ticks - name = "Glass fodder sheet" - desc = "A sheet of glass set aside for glass working" + name = "glass fodder sheet" + desc = "A sheet of glass set aside for glass working." icon_state = "glass_base" var/next_step = null var/rod = /obj/item/glasswork/blowing_rod /obj/item/tea_plate - name = "Tea Plate" + name = "tea saucer" desc = "A polished plate for a tea cup. How fancy!" icon = 'icons/obj/glass_ware.dmi' icon_state = "tea_plate" /obj/item/tea_cup - name = "Tea Cup" - desc = "A glass cup made for fake tea!" + name = "tea cup" + desc = "A glass cup made for sipping tea!" icon = 'icons/obj/glass_ware.dmi' icon_state = "tea_plate" //////////////////////Chem Disk///////////////////// //Two Steps // //Sells for 300 cr, takes 10 glass shets // -//Usefull for chem spliting // +//Useful for chem spliting // //////////////////////////////////////////////////// /obj/item/glasswork/glass_base/dish - name = "Glass fodder sheet" - desc = "A set of glass sheets set aside for glass working, this one is ideal for a small glass dish. Needs to be cut with some tools." + name = "glass fodder sheet (dish)" + desc = "A set of glass sheets set aside for glass working. This one is ideal for a small glass dish. It needs to be cut with some glassworking tools." next_step = /obj/item/glasswork/glass_base/dish_part1 /obj/item/glasswork/glass_base/dish/attackby(obj/item/I, mob/user, params) @@ -60,8 +60,8 @@ qdel(src) /obj/item/glasswork/glass_base/dish_part1 - name = "Half chem dish sheet" - desc = "A sheet of glass cut in half, looks like it still needs some more cutting down" + name = "half glass fodder sheet (dish)" + desc = "A sheet of glass cut in half. It looks like it still needs some more cutting down." icon_state = "glass_base_half" next_step = /obj/item/reagent_containers/glass/beaker/glass_dish @@ -75,12 +75,12 @@ //////////////////////Lens////////////////////////// //Six Steps // //Sells for 1600 cr, takes 15 glass shets // -//Usefull for selling and later crafting // +//Useful for selling and later crafting // //////////////////////////////////////////////////// /obj/item/glasswork/glass_base/glass_lens - name = "Glass fodder sheet" - desc = "A set of glass sheets set aside for glass working, this one is ideal for a small glass lens. Needs to be cut with some tools." + name = "glass fodder sheet (lens)" + desc = "A set of glass sheets set aside for glass working. This one is ideal for a glass lens. It needs to be cut with some glassworking tools." next_step = /obj/item/glasswork/glass_base/glass_lens_part1 /obj/item/glasswork/glass_base/glass_lens/attackby(obj/item/I, mob/user, params) @@ -91,8 +91,8 @@ qdel(src) /obj/item/glasswork/glass_base/glass_lens_part1 - name = "Glass fodder sheet" - desc = "Cut glass ready to be heated. Needs to be heated with some tools." + name = "half glass fodder sheet (lens)" + desc = "Cut glass ready to be heated with something very hot." icon_state = "glass_base_half" next_step = /obj/item/glasswork/glass_base/glass_lens_part2 @@ -104,8 +104,8 @@ qdel(src) /obj/item/glasswork/glass_base/glass_lens_part2 - name = "Glass fodder sheet" - desc = "Cut glass that has been heated. Needs to be heated more with some tools." + name = "heated half glass fodder sheet (lens)" + desc = "Cut glass that has been heated once already and is ready to be heated again." icon_state = "glass_base_heat" next_step = /obj/item/glasswork/glass_base/glass_lens_part3 @@ -117,8 +117,8 @@ qdel(src) /obj/item/glasswork/glass_base/glass_lens_part3 - name = "Glass fodder sheet" - desc = "Cut glass that has been heated into a blob of hot glass. Needs to be placed onto a blow tube." + name = "heated glass blob (lens)" + desc = "Cut glass that has been heated into a blob. It needs to be attached to a glassblowing rod." icon_state = "glass_base_molding" next_step = /obj/item/glasswork/glass_base/glass_lens_part4 @@ -131,8 +131,8 @@ qdel(I) /obj/item/glasswork/glass_base/glass_lens_part4 - name = "Glass fodder sheet" - desc = "Cut glass that has been heated into a blob of hot glass. Needs to be cut off onto a blow tube." + name = "glassblowing rod (lens)" + desc = "A hollow metal rod made for blowing glass. There is a blob of shapen glass at the end of it that needs to be cut off with some glassworking tools." icon_state = "blowing_rods_inuse" next_step = /obj/item/glasswork/glass_base/glass_lens_part5 @@ -145,8 +145,8 @@ qdel(src) /obj/item/glasswork/glass_base/glass_lens_part5 - name = "Unpolished glass lens" - desc = "A small unpolished glass lens. Could be polished with some cloth." + name = "unpolished glass lens" + desc = "An unpolished glass lens. It needs to be polished with some dry cloth." icon = 'icons/obj/glass_ware.dmi' icon_state = "glass_optics" next_step = /obj/item/glasswork/glass_base/glass_lens_part6 @@ -159,8 +159,8 @@ qdel(src) /obj/item/glasswork/glass_base/glass_lens_part6 - name = "Unrefined glass lens" - desc = "A small polished glass lens. Just needs to be refined with some sandstone." + name = "unrefined glass lens" + desc = "A polished glass lens. It needs to be refined with some sandstone." icon = 'icons/obj/glass_ware.dmi' icon_state = "glass_optics" next_step = /obj/item/glasswork/glass_base/lens @@ -174,12 +174,12 @@ //////////////////////Spouty Flask////////////////// //Four Steps // //Sells for 1200 cr, takes 20 glass shets // -//Usefull for selling and chemical things // +//Useful for selling and chemical things // //////////////////////////////////////////////////// /obj/item/glasswork/glass_base/spouty - name = "Glass fodder sheet" - desc = "A set of glass sheets set aside for glass working, this one is ideal for a spout beaker. Needs to be cut with some tools." + name = "Glass fodder sheet (spout)" + desc = "A set of glass sheets set aside for glass working. This one is ideal for a spouty flask. It needs to heated with something very hot." next_step = /obj/item/glasswork/glass_base/spouty_part2 /obj/item/glasswork/glass_base/spouty/attackby(obj/item/I, mob/user, params) @@ -190,8 +190,8 @@ qdel(src) /obj/item/glasswork/glass_base/spouty_part2 - name = "Glass fodder sheet" - desc = "Cut glass that has been heated. Needs to be heated with some tools." + name = "glass fodder sheet (spout)" + desc = "Cut glass ready to be heated with something very hot." icon_state = "glass_base_half" next_step = /obj/item/glasswork/glass_base/spouty_part3 @@ -203,8 +203,8 @@ qdel(src) /obj/item/glasswork/glass_base/spouty_part3 - name = "Glass fodder sheet" - desc = "Cut glass that has been heated into a blob of hot glass. Needs to be placed onto a blow tube." + name = "heated glass blob (spout)" + desc = "Cut glass that has been heated into a blob. It needs to be attached to a glassblowing rod." icon_state = "glass_base_molding" next_step = /obj/item/glasswork/glass_base/spouty_part4 @@ -217,8 +217,8 @@ qdel(I) /obj/item/glasswork/glass_base/spouty_part4 - name = "Glass fodder sheet" - desc = "Cut glass that has been heated into a blob of hot glass. Needs to be cut off onto a blow tube." + name = "glassblowing rod (spout)" + desc = "A hollow metal rod made for blowing glass. There is a blob of shapen glass at the end of it that needs to be cut off with some glassworking tools." icon_state = "blowing_rods_inuse" next_step = /obj/item/reagent_containers/glass/beaker/flask/spouty @@ -233,12 +233,12 @@ //////////////////////Small Bulb Flask////////////// //Two Steps // //Sells for 600 cr, takes 5 glass shets // -//Usefull for selling and chemical things // +//Useful for selling and chemical things // //////////////////////////////////////////////////// /obj/item/glasswork/glass_base/flask_small - name = "Glass fodder sheet" - desc = "A set of glass sheets set aside for glass working, this one is ideal for a small flask. Needs to be heated with some tools." + name = "glass fodder sheet (small flask)" + desc = "A set of glass sheets set aside for glass working. This one is ideal for a small flask. It needs to heated with something very hot." next_step = /obj/item/glasswork/glass_base/flask_small_part1 /obj/item/glasswork/glass_base/flask_small/attackby(obj/item/I, mob/user, params) @@ -249,8 +249,8 @@ qdel(src) /obj/item/glasswork/glass_base/flask_small_part1 - name = "Metled glass" - desc = "A blob of metled glass, this one is ideal for a small flask. Needs to be blown with some tools." + name = "heated glass blob (small flask)" + desc = "Glass that has been heated into a blob. It needs to be attached to a glassblowing rod." icon_state = "glass_base_molding" next_step = /obj/item/glasswork/glass_base/flask_small_part2 @@ -263,8 +263,8 @@ qdel(I) /obj/item/glasswork/glass_base/flask_small_part2 - name = "Metled glass" - desc = "A blob of metled glass on the end of a blowing rod. Needs to be cut off with some tools." + name = "glassblowing rod (small flask)" + desc = "A hollow metal rod made for blowing glass. There is a blob of shapen glass at the end of it that needs to be cut off with some glassworking tools." icon_state = "blowing_rods_inuse" next_step = /obj/item/reagent_containers/glass/beaker/flask @@ -279,12 +279,12 @@ //////////////////////Large Bulb Flask////////////// //Two Steps // //Sells for 1000 cr, takes 15 glass shets // -//Usefull for selling and chemical things // +//Useful for selling and chemical things // //////////////////////////////////////////////////// /obj/item/glasswork/glass_base/flask_large - name = "Glass fodder sheet" - desc = "A set of glass sheets set aside for glass working, this one is ideal for a large flask. Needs to be heated with some tools." + name = "glass fodder sheet (large flask)" + desc = "A set of glass sheets set aside for glass working. This one is ideal for a large flask. It needs to heated with something very hot." next_step = /obj/item/glasswork/glass_base/flask_large_part1 /obj/item/glasswork/glass_base/flask_large/attackby(obj/item/I, mob/user, params) @@ -295,8 +295,8 @@ qdel(src) /obj/item/glasswork/glass_base/flask_large_part1 - name = "Metled glass" - desc = "A blob of metled glass, this one is ideal for a large flask. Needs to be blown with some tools." + name = "heated glass blob (large flask)" + desc = "Glass that has been heated into a blob. It needs to be attached to a glassblowing rod." icon_state = "glass_base_molding" next_step = /obj/item/glasswork/glass_base/flask_large_part2 @@ -309,8 +309,8 @@ qdel(I) /obj/item/glasswork/glass_base/flask_large_part2 - name = "Metled glass" - desc = "A blob of metled glass on the end of a blowing rod. Needs to be cut off with some tools." + name = "glassblowing rod (small flask)" + desc = "A hollow metal rod made for blowing glass. There is a blob of shapen glass at the end of it that needs to be cut off with some glassworking tools." icon_state = "blowing_rods_inuse" next_step = /obj/item/reagent_containers/glass/beaker/flask/large @@ -325,12 +325,12 @@ //////////////////////Tea Plates//////////////////// //Three Steps // //Sells for 1000 cr, takes 5 glass shets // -//Usefull for selling and chemical things // +//Useful for selling and chemical things // //////////////////////////////////////////////////// /obj/item/glasswork/glass_base/tea_plate - name = "Glass fodder sheet" - desc = "A set of glass sheets set aside for glass working, this one is ideal for a tea plate, how fancy! Needs to be heated with some tools." + name = "glass fodder sheet (tea saucer)" + desc = "A set of glass sheets set aside for glass working. This one is ideal for a tea saucer. It needs to heated with something very hot." next_step = /obj/item/glasswork/glass_base/tea_plate1 /obj/item/glasswork/glass_base/tea_plate/attackby(obj/item/I, mob/user, params) @@ -341,8 +341,8 @@ qdel(src) /obj/item/glasswork/glass_base/tea_plate1 - name = "Metled glass" - desc = "A blob of metled glass, this one is ideal for a tea plate. Needs to be blown with some tools." + name = "heated glass blob (tea saucer)" + desc = "Glass that has been heated into a blob. It needs to be attached to a glassblowing rod." icon_state = "glass_base_molding" next_step = /obj/item/glasswork/glass_base/tea_plate2 @@ -355,8 +355,8 @@ qdel(I) /obj/item/glasswork/glass_base/tea_plate2 - name = "Metled glass" - desc = "A blob of metled glass on the end of a blowing rod. Needs to be cut off with some tools." + name = "glassblowing rod (tea saucer)" + desc = "A hollow metal rod made for blowing glass. There is a blob of shapen glass at the end of it that needs to be cut off with some glassworking tools." icon_state = "blowing_rods_inuse" next_step = /obj/item/glasswork/glass_base/tea_plate3 @@ -369,8 +369,8 @@ qdel(src) /obj/item/glasswork/glass_base/tea_plate3 - name = "Disk of glass" - desc = "A disk of glass that can be cant be used for much. Needs to be polished with some cloth." + name = "unpolished glass saucer (tea saucer)" + desc = "An unpolished glass saucer. It needs to be polished with some dry cloth." icon_state = "glass_base_half" next_step = /obj/item/tea_plate @@ -384,12 +384,12 @@ //////////////////////Tea Cup/////////////////////// //Four Steps // //Sells for 1600 cr, takes 6 glass shets // -//Usefull for selling and chemical things // +//Useful for selling and chemical things // //////////////////////////////////////////////////// /obj/item/glasswork/glass_base/tea_cup - name = "Glass fodder sheet" - desc = "A set of glass sheets set aside for glass working, this one is ideal for a tea cup, how fancy! Needs to be heated with some tools." + name = "glass fodder sheet (tea cup)" + desc = "A set of glass sheets set aside for glass working. This one is ideal for a tea cup. It needs to heated with something very hot." next_step = /obj/item/glasswork/glass_base/tea_cup1 /obj/item/glasswork/glass_base/tea_cup/attackby(obj/item/I, mob/user, params) @@ -400,8 +400,8 @@ qdel(src) /obj/item/glasswork/glass_base/tea_cup1 - name = "Metled glass" - desc = "A blob of metled glass, this one is ideal for a tea cup. Needs to be blown with some tools." + name = "heated glass blob (tea cup)" + desc = "Glass that has been heated into a blob. It needs to be attached to a glassblowing rod." icon_state = "glass_base_molding" next_step = /obj/item/glasswork/glass_base/tea_cup2 @@ -414,8 +414,8 @@ qdel(I) /obj/item/glasswork/glass_base/tea_cupe2 - name = "Metled glass" - desc = "A blob of metled glass on the end of a blowing rod. Needs to be cut off with some tools." + name = "glassblowing rod (tea cup)" + desc = "A hollow metal rod made for blowing glass. There is a blob of shapen glass at the end of it that needs to be cut off with some glassworking tools." icon_state = "blowing_rods_inuse" next_step = /obj/item/glasswork/glass_base/tea_cup3 @@ -428,8 +428,8 @@ qdel(src) /obj/item/glasswork/glass_base/tea_cup3 - name = "Disk of glass" - desc = "A bowl of glass that can be cant be used for much. Needs to be polished with some cloth." + name = "unpolished glass cup (tea cup)" + desc = "An unpolished glass cup. It needs to be polished with some dry cloth." icon_state = "glass_base_half" next_step = /obj/item/glasswork/glass_base/tea_cup4 @@ -441,8 +441,8 @@ qdel(src) /obj/item/glasswork/glass_base/tea_cup4 - name = "Disk of glass" - desc = "A bowl of polished glass that can be cant be used for much. Needs some more glass to make a handle." + name = "polished glass cup (tea cup)" + desc = "A polished glass cup. It needs some extra glass to form a handle." icon_state = "glass_base_half" next_step = /obj/item/tea_cup diff --git a/code/datums/components/crafting/glassware/lens_crafting.dm b/code/datums/components/crafting/glassware/lens_crafting.dm index 8907522946..7b650989a8 100644 --- a/code/datums/components/crafting/glassware/lens_crafting.dm +++ b/code/datums/components/crafting/glassware/lens_crafting.dm @@ -1,15 +1,15 @@ //This file is for crafting using a lens! /obj/item/glasswork/glass_base/lens - name = "Optical lens" - desc = "Good for selling or crafting, by itself its useless" + name = "optical lens" + desc = "A glass lens. Useless by itself, but may prove useful in making something with a focus." icon = 'icons/obj/glass_ware.dmi' icon_state = "glass_optics" //Laser pointers - 2600 /obj/item/glasswork/glass_base/laserpointer_shell - name = "Laser pointer assembly" - desc = "Good for selling or crafting, by itself its useless. Needs a power capactor." + name = "laser pointer assembly" + desc = "An empty hull of a laser pointer. It's missing a capacitor." icon_state = "laser_case" icon = 'icons/obj/glass_ware.dmi' next_step = /obj/item/glasswork/glass_base/laserpointer_shell_1 @@ -21,8 +21,8 @@ qdel(src) /obj/item/glasswork/glass_base/laserpointer_shell_1 - name = "Laser pointer assembly" - desc = "Good for selling or crafting, by itself its useless. Needs a glass lens." + name = "powered laser pointer assembly" + desc = "A laser pointer hull with a capacitor inside of it. It's missing a lens." icon_state = "laser_wire" icon_state = "laser_case" next_step = /obj/item/glasswork/glass_base/laserpointer_shell_2 @@ -34,8 +34,8 @@ qdel(src) /obj/item/glasswork/glass_base/laserpointer_shell_2 - name = "Laser pointer assembly" - desc = "Good for selling or crafting, by itself its useless. Needs to be screwed together." + name = "near-complete laser pointer assembly" + desc = "A laser pointer hull with a capacitor and a lens inside of it. It needs to be screwed together." icon_state = "laser_wire" icon_state = "laser_case" next_step = /obj/item/laser_pointer/blue/handmade @@ -50,8 +50,8 @@ //NERD SHIT - 5000 /obj/item/glasswork/glass_base/glasses_frame - name = "Glasses Frame" - desc = "Good for crafting a pare of glasses, by itself its useless. Just add a pare of lens." + name = "glasses frame" + desc = "A pair of glasses without the lenses. You could probably add them yourself, though." icon = 'icons/obj/glass_ware.dmi' icon_state = "frames" next_step = /obj/item/glasswork/glass_base/glasses_frame_1 @@ -64,8 +64,8 @@ qdel(src) /obj/item/glasswork/glass_base/glasses_frame_1 - name = "Glasses Frame" - desc = "Good for crafting a pare of glasses, by itself its useless. Just add a the other lens." + name = "glasses frame" + desc = "A pair of shoddily-assembled glasses with only one lens. You could probably add the second one yourself, though." icon = 'icons/obj/glass_ware.dmi' icon_state = "frames_1" next_step = /obj/item/glasswork/glass_base/glasses_frame_2 @@ -78,8 +78,8 @@ qdel(src) /obj/item/glasswork/glass_base/glasses_frame_2 - name = "Glasses Frame" - desc = "Good for crafting a pare of glasses, by itself its useless. Just adjust the pices into the frame with a screwdriver." + name = "glasses frame" + desc = "A pair of hastily-assembled unfitted glasses with both lenses intact. Use a screwdriver to fit them." icon = 'icons/obj/glass_ware.dmi' icon_state = "frames_2" next_step = /obj/item/glasswork/glasses @@ -92,7 +92,7 @@ qdel(src) /obj/item/glasswork/glasses - name = "Handmade Glasses" - desc = "Handmade glasses that have not been polished at all making them useless. Selling them could still be worth a few credits." + name = "handmade glasses" + desc = "A pair of poorly-assembled glasses clearly produced by someone with no qualifications in making glasses. They're smudged, ugly, and don't even fit you. They might be worth some money, though." icon = 'icons/obj/glass_ware.dmi' icon_state = "frames_2" diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm index eca38fee34..dcbf40a16b 100644 --- a/code/datums/components/embedded.dm +++ b/code/datums/components/embedded.dm @@ -142,7 +142,7 @@ if(harmful) victim.visible_message("[weapon] embeds itself in [victim]'s [limb.name]!",ignored_mobs=victim) to_chat(victim, "[weapon] embeds itself in your [limb.name]!") - victim.throw_alert("embeddedobject", /obj/screen/alert/embeddedobject) + victim.throw_alert("embeddedobject", /atom/movable/screen/alert/embeddedobject) playsound(victim,'sound/weapons/bladeslice.ogg', 40) weapon.add_mob_blood(victim)//it embedded itself in you, of course it's bloody! damage = weapon.w_class * impact_pain_mult diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 359c97c507..e100326f7b 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -13,7 +13,7 @@ var/mood_modifier = 1 //Modifier to allow certain mobs to be less affected by moodlets var/list/datum/mood_event/mood_events = list() var/insanity_effect = 0 //is the owner being punished for low mood? If so, how much? - var/obj/screen/mood/screen_obj + var/atom/movable/screen/mood/screen_obj var/datum/skill_modifier/bad_mood/malus var/datum/skill_modifier/great_mood/bonus var/static/malus_id = 0 diff --git a/code/datums/components/orbiter.dm b/code/datums/components/orbiter.dm index 26f52f6ba5..c34d56982a 100644 --- a/code/datums/components/orbiter.dm +++ b/code/datums/components/orbiter.dm @@ -90,7 +90,7 @@ return SEND_SIGNAL(parent, COMSIG_ATOM_ORBIT_END, orbiter, refreshing) UnregisterSignal(orbiter, COMSIG_MOVABLE_MOVED) - orbiter.SpinAnimation(0, 0) + orbiter.SpinAnimation(0, 0, parallel = FALSE) if(istype(orbiters[orbiter],/matrix)) //This is ugly. orbiter.transform = orbiters[orbiter] orbiters -= orbiter diff --git a/code/datums/components/storage/concrete/_concrete.dm b/code/datums/components/storage/concrete/_concrete.dm index 55c3e1d083..bb226bbfdf 100644 --- a/code/datums/components/storage/concrete/_concrete.dm +++ b/code/datums/components/storage/concrete/_concrete.dm @@ -135,6 +135,8 @@ var/obj/item/I = AM var/mob/M = parent.loc I.dropped(M) + I.item_flags &= ~IN_STORAGE + I.remove_outline() if(new_location) AM.forceMove(new_location) // exited comsig will handle removal reset. //We don't want to call this if the item is being destroyed @@ -180,6 +182,7 @@ I.forceMove(parent.drop_location()) return FALSE I.on_enter_storage(master) + I.item_flags |= IN_STORAGE refresh_mob_views() I.mouse_opacity = MOUSE_OPACITY_OPAQUE //So you can click on the area around the item to equip it, instead of having to pixel hunt if(M) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index cf0b3d6920..97d6748dc7 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -423,6 +423,9 @@ var/atom/A = parent if(ismob(M)) //all the check for item manipulation are in other places, you can safely open any storages as anything and its not buggy, i checked A.add_fingerprint(M) + if(istype(A, /obj/item)) + var/obj/item/I = A + I.remove_outline() //Removes the outline when we drag if(!over_object) return FALSE if(ismecha(M.loc)) // stops inventory actions in a mech @@ -435,15 +438,15 @@ RevenantThrow(over_object, M, source) return if(!M.incapacitated()) - if(!istype(over_object, /obj/screen)) + if(!istype(over_object, /atom/movable/screen)) dump_content_at(over_object, M) return if(A.loc != M) return playsound(A, "rustle", 50, 1, -5) A.do_jiggle() - if(istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + if(istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(A, H.held_index) return A.add_fingerprint(M) diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm index 044afa2850..820d7067d4 100644 --- a/code/datums/components/storage/ui.dm +++ b/code/datums/components/storage/ui.dm @@ -20,8 +20,8 @@ . = list() var/list/accessible_contents = accessible_items() var/adjusted_contents = length(accessible_contents) - var/obj/screen/storage/close/ui_close - var/obj/screen/storage/boxes/ui_boxes + var/atom/movable/screen/storage/close/ui_close + var/atom/movable/screen/storage/boxes/ui_boxes //Numbered contents display var/list/datum/numbered_display/numbered_contents @@ -62,7 +62,7 @@ for(var/obj/O in accessible_items()) if(QDELETED(O)) continue - var/obj/screen/storage/item_holder/D = new(null, src, O) + var/atom/movable/screen/storage/item_holder/D = new(null, src, O) D.mouse_opacity = MOUSE_OPACITY_OPAQUE //This is here so storage items that spawn with contents correctly have the "click around item to equip" D.screen_loc = "[cx]:[screen_pixel_x],[cy]:[screen_pixel_y]" O.maptext = "" @@ -81,9 +81,9 @@ */ /datum/component/storage/proc/orient2hud_volumetric(mob/user, maxcolumns) . = list() - var/obj/screen/storage/left/ui_left - var/obj/screen/storage/continuous/ui_continuous - var/obj/screen/storage/close/ui_close + var/atom/movable/screen/storage/left/ui_left + var/atom/movable/screen/storage/continuous/ui_continuous + var/atom/movable/screen/storage/close/ui_close // Generate ui_item_blocks for missing ones and render+orient. var/list/atom/contents = accessible_items() @@ -137,7 +137,7 @@ for(var/i in percentage_by_item) I = i var/percent = percentage_by_item[I] - var/obj/screen/storage/volumetric_box/center/B = new /obj/screen/storage/volumetric_box/center(null, src, I) + var/atom/movable/screen/storage/volumetric_box/center/B = new /atom/movable/screen/storage/volumetric_box/center(null, src, I) var/pixels_to_use = overrun? MINIMUM_PIXELS_PER_ITEM : max(using_horizontal_pixels * percent, MINIMUM_PIXELS_PER_ITEM) var/addrow = FALSE if(CEILING(pixels_to_use, 1) >= FLOOR(horizontal_pixels - current_pixel - VOLUMETRIC_STORAGE_EDGE_PADDING, 1)) @@ -255,22 +255,22 @@ * Gets our ui_boxes, making it if it doesn't exist. */ /datum/component/storage/proc/get_ui_boxes() - return new /obj/screen/storage/boxes(null, src) + return new /atom/movable/screen/storage/boxes(null, src) /** * Gets our ui_left, making it if it doesn't exist. */ /datum/component/storage/proc/get_ui_left() - return new /obj/screen/storage/left(null, src) + return new /atom/movable/screen/storage/left(null, src) /** * Gets our ui_close, making it if it doesn't exist. */ /datum/component/storage/proc/get_ui_close() - return new /obj/screen/storage/close(null, src) + return new /atom/movable/screen/storage/close(null, src) /** * Gets our ui_continuous, making it if it doesn't exist. */ /datum/component/storage/proc/get_ui_continuous() - return new /obj/screen/storage/continuous(null, src) + return new /atom/movable/screen/storage/continuous(null, src) diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index 10ff5bda3d..911ca7ecbe 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -370,7 +370,7 @@ user.emote("scream") user.gain_trauma(/datum/brain_trauma/severe/paralysis/spinesnapped) // oopsie indeed! shake_camera(user, 7, 7) - user.overlay_fullscreen("flash", /obj/screen/fullscreen/flash) + user.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash) user.clear_fullscreen("flash", 4.5) if(94 to 98) @@ -381,7 +381,7 @@ user.gain_trauma_type(BRAIN_TRAUMA_MILD) user.playsound_local(get_turf(user), 'sound/weapons/flashbang.ogg', 100, TRUE, 8, 0.9) shake_camera(user, 6, 6) - user.overlay_fullscreen("flash", /obj/screen/fullscreen/flash) + user.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash) user.clear_fullscreen("flash", 3.5) if(84 to 93) @@ -394,7 +394,7 @@ user.playsound_local(get_turf(user), 'sound/weapons/flashbang.ogg', 100, TRUE, 8, 0.9) user.DefaultCombatKnockdown(40) shake_camera(user, 5, 5) - user.overlay_fullscreen("flash", /obj/screen/fullscreen/flash) + user.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash) user.clear_fullscreen("flash", 2.5) if(64 to 83) diff --git a/code/datums/components/waddling.dm b/code/datums/components/waddling.dm index f09a92c91c..7b94a14285 100644 --- a/code/datums/components/waddling.dm +++ b/code/datums/components/waddling.dm @@ -10,6 +10,7 @@ var/mob/living/L = parent if(L.incapacitated() || L.lying) return + var/matrix/otransform = matrix(L.transform) //make a copy of the current transform animate(L, pixel_z = 4, time = 0) - animate(pixel_z = 0, transform = turn(matrix(), pick(-12, 0, 12)), time=2) - animate(pixel_z = 0, transform = matrix(), time = 0) + animate(pixel_z = 0, transform = turn(L.transform, pick(-12, 0, 12)), time=2) //waddle. + animate(pixel_z = 0, transform = otransform, time = 0) //return to previous transform. diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 42580425ce..164cda63e0 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -57,9 +57,13 @@ */ var/list/cooldowns -#ifdef TESTING +#ifdef REFERENCE_TRACKING var/running_find_references var/last_find_references = 0 + #ifdef REFERENCE_TRACKING_DEBUG + ///Stores info about where refs are found, used for sanity checks and testing + var/list/found_refs + #endif #endif #ifdef DATUMVAR_DEBUGGING_MODE diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 2439ef4d53..0b4b3ef2dd 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -159,9 +159,9 @@ /datum/symptom/heal/metabolism/Heal(mob/living/carbon/C, datum/disease/advance/A, actual_power) if(!istype(C)) return - C.reagents.metabolize(C, can_overdose=TRUE) //this works even without a liver; it's intentional since the virus is metabolizing by itself + C.reagents.metabolize(C, SSMOBS_DT, 0, can_overdose=TRUE) //this works even without a liver; it's intentional since the virus is metabolizing by itself if(triple_metabolism) - C.reagents.metabolize(C, can_overdose=TRUE) + C.reagents.metabolize(C, SSMOBS_DT, 0, can_overdose=TRUE) C.overeatduration = max(C.overeatduration - 2, 0) var/lost_nutrition = 9 - (reduced_hunger * 5) C.adjust_nutrition(-lost_nutrition * HUNGER_FACTOR) //Hunger depletes at 10x the normal speed diff --git a/code/datums/diseases/advance/symptoms/oxygen.dm b/code/datums/diseases/advance/symptoms/oxygen.dm index 24e01dbbaf..67e2a8c588 100644 --- a/code/datums/diseases/advance/symptoms/oxygen.dm +++ b/code/datums/diseases/advance/symptoms/oxygen.dm @@ -47,7 +47,7 @@ Bonus M.adjustOxyLoss(-7, 0) M.losebreath = max(0, M.losebreath - 4) if(regenerate_blood && M.blood_volume < (BLOOD_VOLUME_NORMAL * M.blood_ratio)) - M.blood_volume += 1 + M.adjust_integration_blood(1) else if(prob(base_message_chance)) to_chat(M, "[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]") diff --git a/code/datums/diseases/advance/symptoms/skin.dm b/code/datums/diseases/advance/symptoms/skin.dm index d7a457aec1..1593d108a6 100644 --- a/code/datums/diseases/advance/symptoms/skin.dm +++ b/code/datums/diseases/advance/symptoms/skin.dm @@ -32,10 +32,8 @@ BONUS var/mob/living/M = A.affected_mob switch(A.stage) if(5) - var/static/list/banned_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/invisible, /datum/reagent/colorful_reagent/crayonpowder/white) - var/color = pick(subtypesof(/datum/reagent/colorful_reagent/crayonpowder) - banned_reagents) if(M.reagents.total_volume <= (M.reagents.maximum_volume/10)) // no flooding humans with 1000 units of colorful reagent - M.reagents.add_reagent(color, 5) + M.reagents.add_reagent(/datum/reagent/colorful_reagent, 5) else if (prob(50)) // spam M.visible_message("[M] looks rather vibrant...", "The colors, man, the colors...") diff --git a/code/datums/dna.dm b/code/datums/dna.dm index a2982a3caf..43dad6cef8 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -386,6 +386,14 @@ qdel(language_holder) var/species_holder = initial(mrace.species_language_holder) language_holder = new species_holder(src) + + var/mob/living/carbon/human/H = src + //provide the user's additional language to the new language holder even if they change species + if(H.additional_language && H.additional_language != "None") + var/language_entry = GLOB.roundstart_languages[H.additional_language] + if(language_entry) + grant_language(language_entry, TRUE, TRUE) + update_atom_languages() /mob/living/carbon/human/set_species(datum/species/mrace, icon_update = TRUE, pref_load = FALSE) diff --git a/code/datums/elements/trash.dm b/code/datums/elements/trash.dm index 3a4d5b0150..a83889c6ca 100644 --- a/code/datums/elements/trash.dm +++ b/code/datums/elements/trash.dm @@ -1,5 +1,5 @@ /datum/element/trash - element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + element_flags = ELEMENT_DETACH /datum/element/trash/Attach(datum/target) . = ..() diff --git a/code/datums/helper_datums/stack_end_detector.dm b/code/datums/helper_datums/stack_end_detector.dm new file mode 100644 index 0000000000..0d621f51b3 --- /dev/null +++ b/code/datums/helper_datums/stack_end_detector.dm @@ -0,0 +1,32 @@ +/** + Stack End Detector. + Can detect if a given code stack has exited, used by the mc for stack overflow detection. + + **/ +/datum/stack_end_detector + var/datum/weakref/_WF + var/datum/stack_canary/_canary + +/datum/stack_end_detector/New() + _canary = new() + _WF = WEAKREF(_canary) + +/** Prime the stack overflow detector. + Store the return value of this proc call in a proc level var. + Can only be called once. +**/ +/datum/stack_end_detector/proc/prime_canary() + if (!_canary) + CRASH("Prime_canary called twice") + . = _canary + _canary = null + +/// Returns true if the stack is still going. Calling before the canary has been primed also returns true +/datum/stack_end_detector/proc/check() + return !!_WF.resolve() + +/// Stack canary. Will go away if the stack it was primed by is ended by byond for return or stack overflow reasons. +/datum/stack_canary + +/// empty proc to avoid warnings about unused variables. Call this proc on your canary in the stack it's watching. +/datum/stack_canary/proc/use_variable() diff --git a/code/datums/http.dm b/code/datums/http.dm index 2a9b53f131..49b183fde6 100644 --- a/code/datums/http.dm +++ b/code/datums/http.dm @@ -6,10 +6,12 @@ var/body var/headers var/url + /// If present response body will be saved to this file. + var/output_file var/_raw_response -/datum/http_request/proc/prepare(method, url, body = "", list/headers) +/datum/http_request/proc/prepare(method, url, body = "", list/headers, output_file) if (!length(headers)) headers = "" else @@ -19,15 +21,16 @@ src.url = url src.body = body src.headers = headers + src.output_file = output_file /datum/http_request/proc/execute_blocking() - _raw_response = rustg_http_request_blocking(method, url, body, headers) + _raw_response = rustg_http_request_blocking(method, url, body, headers, build_options()) /datum/http_request/proc/begin_async() if (in_progress) CRASH("Attempted to re-use a request object.") - id = rustg_http_request_async(method, url, body, headers) + id = rustg_http_request_async(method, url, body, headers, build_options()) if (isnull(text2num(id))) stack_trace("Proc error: [id]") @@ -35,6 +38,11 @@ else in_progress = TRUE +/datum/http_request/proc/build_options() + if(output_file) + return json_encode(list("output_filename"=output_file,"body_filename"=null)) + return null + /datum/http_request/proc/is_complete() if (isnull(id)) return TRUE diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm index 31023b3fc7..968809747b 100644 --- a/code/datums/mutable_appearance.dm +++ b/code/datums/mutable_appearance.dm @@ -10,11 +10,14 @@ // And yes this does have to be in the constructor, BYOND ignores it if you set it as a normal var // Helper similar to image() -/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE, color = "#FFFFFF") +/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE, alpha = 255, appearance_flags = NONE, color = "#FFFFFF") var/mutable_appearance/MA = new() MA.icon = icon MA.icon_state = icon_state MA.layer = layer MA.plane = plane + MA.alpha = alpha + MA.appearance_flags |= appearance_flags MA.color = color return MA + diff --git a/code/datums/numbered_display.dm b/code/datums/numbered_display.dm index fc2035b39f..b714be23fb 100644 --- a/code/datums/numbered_display.dm +++ b/code/datums/numbered_display.dm @@ -6,5 +6,5 @@ /datum/numbered_display/New(obj/item/sample, _number = 1, datum/component/storage/parent) if(!istype(sample)) qdel(src) - sample_object = new /obj/screen/storage/item_holder(null, parent, sample) + sample_object = new /atom/movable/screen/storage/item_holder(null, parent, sample) number = _number diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index a08b535aff..5d97448d69 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -35,6 +35,14 @@ cost = 10 allow_duplicates = FALSE +/datum/map_template/ruin/lavaland/library + name = "Lavaland Library" + id = "llibrary" + description = "A once grand library, now lost to the confines of lavaland." + suffix = "lavaland_surface_library.dmm" + cost = 5 + allow_duplicates = FALSE + /datum/map_template/ruin/lavaland/seed_vault name = "Seed Vault" id = "seed-vault" @@ -79,6 +87,20 @@ suffix = "lavaland_surface_animal_hospital.dmm" allow_duplicates = FALSE +/datum/map_template/ruin/lavaland/hotsprings + name = "Hot Springs" + id = "lhotsprings" + description = "Just relax and take a dip! Lavaland's finest hot springs await!" + suffix = "lavaland_surface_hotsprings.dmm" + +/datum/map_template/ruin/lavaland/engioutpost + name = "Engineer Outpost" + id = "lengioutpost" + description = "Blown up by an unfortunate accident." + suffix = "lavaland_surface_engioutpost.dmm" + cost = 10 + allow_duplicates = FALSE + /datum/map_template/ruin/lavaland/sin cost = 10 allow_duplicates = FALSE @@ -115,6 +137,24 @@ suffix = "lavaland_surface_sloth.dmm" // Generates nothing but atmos runtimes and salt +/datum/map_template/ruin/lavaland/sin/lust + name = "Ruin of Lust" + id = "llust" + description = "Not exactly what you expected." + suffix = "lavaland_surface_lust.dmm" + +/datum/map_template/ruin/lavaland/sin/wrath + name = "Ruin of Wrath" + id = "lwrath" + description = "You'll fight and fight and just keep fighting." + suffix = "lavaland_surface_wrath.dmm" + +/datum/map_template/ruin/lavaland/bathhouse + name = "Bath House" + id = "lbathhouse" + description = "A taste of paradise, locked in the hell of Lavaland." + suffix = "lavaland_surface_bathhouse.dmm" + /datum/map_template/ruin/lavaland/ratvar name = "Dead God" id = "ratvar" @@ -132,19 +172,20 @@ /datum/map_template/ruin/lavaland/blood_drunk_miner name = "Blood-Drunk Miner" - id = "blooddrunk" - description = "A strange arrangement of stone tiles and an insane, beastly miner contemplating them." - suffix = "lavaland_surface_blooddrunk1.dmm" + description = "An insane, beastly miner contemplating stone tiles..." always_place = TRUE - allow_duplicates = FALSE //will only spawn one variant of the ruin - -/datum/map_template/ruin/lavaland/blood_drunk_miner/guidance - name = "Blood-Drunk Miner (Guidance)" - suffix = "lavaland_surface_blooddrunk2.dmm" - -/datum/map_template/ruin/lavaland/blood_drunk_miner/hunter - name = "Blood-Drunk Miner (Hunter)" - suffix = "lavaland_surface_blooddrunk3.dmm" + allow_duplicates = FALSE + id = "blooddrunk" +/datum/map_template/ruin/lavaland/blood_drunk_miner/New() + if(prob(25)) + suffix = "lavaland_surface_blooddrunk1.dmm" + else if(prob(34)) + suffix = "lavaland_surface_blooddrunk2.dmm" + else if(prob(50)) + suffix = "lavaland_surface_blooddrunk3.dmm" + else + suffix = "lavaland_surface_mining_site.dmm" + . = ..() /datum/map_template/ruin/lavaland/ufo_crash name = "UFO Crash" diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index bf910b3944..ae05134b56 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -3,9 +3,9 @@ /datum/status_effect/shadow_mend id = "shadow_mend" duration = 30 - alert_type = /obj/screen/alert/status_effect/shadow_mend + alert_type = /atom/movable/screen/alert/status_effect/shadow_mend -/obj/screen/alert/status_effect/shadow_mend +/atom/movable/screen/alert/status_effect/shadow_mend name = "Shadow Mend" desc = "Shadowy energies wrap around your wounds, sealing them at a price. After healing, you will slowly lose health every three seconds for thirty seconds." icon_state = "shadow_mend" @@ -29,9 +29,9 @@ id = "void_price" duration = 300 tick_interval = 30 - alert_type = /obj/screen/alert/status_effect/void_price + alert_type = /atom/movable/screen/alert/status_effect/void_price -/obj/screen/alert/status_effect/void_price +/atom/movable/screen/alert/status_effect/void_price name = "Void Price" desc = "Black tendrils cinch tightly against you, digging wicked barbs into your flesh." icon_state = "shadow_mend" @@ -46,17 +46,17 @@ duration = 200 tick_interval = 0 //tick as fast as possible status_type = STATUS_EFFECT_REPLACE - alert_type = /obj/screen/alert/status_effect/vanguard + alert_type = /atom/movable/screen/alert/status_effect/vanguard var/datum/progressbar/progbar var/stamhealed = 0 //How much stamina did we regenerate? -/obj/screen/alert/status_effect/vanguard +/atom/movable/screen/alert/status_effect/vanguard name = "Vanguard" desc = "You're absorbing stuns aswell as quickly regenerating stamina, but be careful: 50% of stamina restored and 25% of stuns absorbed will affect you after this effect ends." icon_state = "vanguard" alerttooltipstyle = "clockcult" -/obj/screen/alert/status_effect/vanguard/MouseEntered(location,control,params) +/atom/movable/screen/alert/status_effect/vanguard/MouseEntered(location,control,params) var/mob/living/L = usr var/datum/status_effect/vanguard_shield/E = attached_effect if(istype(L)) //this is probably more safety than actually needed @@ -118,9 +118,9 @@ /datum/status_effect/inathneqs_endowment id = "inathneqs_endowment" duration = 150 - alert_type = /obj/screen/alert/status_effect/inathneqs_endowment + alert_type = /atom/movable/screen/alert/status_effect/inathneqs_endowment -/obj/screen/alert/status_effect/inathneqs_endowment +/atom/movable/screen/alert/status_effect/inathneqs_endowment name = "Inath-neq's Endowment" desc = "Adrenaline courses through you as the Resonant Cogwheel's energy shields you from all harm!" icon_state = "inathneqs_endowment" @@ -149,7 +149,7 @@ /datum/status_effect/cyborg_power_regen id = "power_regen" duration = 100 - alert_type = /obj/screen/alert/status_effect/power_regen + alert_type = /atom/movable/screen/alert/status_effect/power_regen var/power_to_give = 0 //how much power is gained each tick /datum/status_effect/cyborg_power_regen/on_creation(mob/living/new_owner, new_power_per_tick) @@ -157,7 +157,7 @@ if(. && isnum(new_power_per_tick)) power_to_give = new_power_per_tick -/obj/screen/alert/status_effect/power_regen +/atom/movable/screen/alert/status_effect/power_regen name = "Power Regeneration" desc = "You are quickly regenerating power!" icon_state = "power_regen" @@ -174,16 +174,16 @@ id = "his_grace" duration = -1 tick_interval = 4 - alert_type = /obj/screen/alert/status_effect/his_grace + alert_type = /atom/movable/screen/alert/status_effect/his_grace var/bloodlust = 0 -/obj/screen/alert/status_effect/his_grace +/atom/movable/screen/alert/status_effect/his_grace name = "His Grace" desc = "His Grace hungers, and you must feed Him." icon_state = "his_grace" alerttooltipstyle = "hisgrace" -/obj/screen/alert/status_effect/his_grace/MouseEntered(location,control,params) +/atom/movable/screen/alert/status_effect/his_grace/MouseEntered(location,control,params) desc = initial(desc) var/datum/status_effect/his_grace/HG = attached_effect desc += "
Current Bloodthirst: [HG.bloodlust]\ @@ -225,7 +225,7 @@ /datum/status_effect/wish_granters_gift //Fully revives after ten seconds. id = "wish_granters_gift" duration = 50 - alert_type = /obj/screen/alert/status_effect/wish_granters_gift + alert_type = /atom/movable/screen/alert/status_effect/wish_granters_gift /datum/status_effect/wish_granters_gift/on_apply() to_chat(owner, "Death is not your end! The Wish Granter's energy suffuses you, and you begin to rise...") @@ -236,7 +236,7 @@ owner.revive(full_heal = TRUE, admin_revive = TRUE) owner.visible_message("[owner] appears to wake from the dead, having healed all wounds!", "You have regenerated.") -/obj/screen/alert/status_effect/wish_granters_gift +/atom/movable/screen/alert/status_effect/wish_granters_gift name = "Wish Granter's Immortality" desc = "You are being resurrected!" icon_state = "wish_granter" @@ -274,7 +274,7 @@ id = "blooddrunk" duration = 10 tick_interval = 0 - alert_type = /obj/screen/alert/status_effect/blooddrunk + alert_type = /atom/movable/screen/alert/status_effect/blooddrunk var/last_health = 0 var/last_bruteloss = 0 var/last_fireloss = 0 @@ -283,7 +283,7 @@ var/last_cloneloss = 0 var/last_staminaloss = 0 -/obj/screen/alert/status_effect/blooddrunk +/atom/movable/screen/alert/status_effect/blooddrunk name = "Blood-Drunk" desc = "You are drunk on blood! Your pulse thunders in your ears! Nothing can harm you!" //not true, and the item description mentions its actual effect icon_state = "blooddrunk" @@ -430,7 +430,7 @@ /datum/status_effect/fleshmend id = "fleshmend" duration = 100 - alert_type = /obj/screen/alert/status_effect/fleshmend + alert_type = /atom/movable/screen/alert/status_effect/fleshmend /datum/status_effect/fleshmend/tick() if(owner.on_fire) @@ -453,7 +453,7 @@ QDEL_LIST(C.all_scars) -/obj/screen/alert/status_effect/fleshmend +/atom/movable/screen/alert/status_effect/fleshmend name = "Fleshmend" desc = "Our wounds are rapidly healing. This effect is prevented if we are on fire." icon_state = "fleshmend" @@ -562,7 +562,7 @@ var/mob/living/simple_animal/SM = L SM.adjustHealth(-3.5, forced = TRUE) -/obj/screen/alert/status_effect/regenerative_core +/atom/movable/screen/alert/status_effect/regenerative_core name = "Reinforcing Tendrils" desc = "You can move faster than your broken body could normally handle!" icon_state = "regenerative_core" @@ -572,7 +572,7 @@ id = "Regenerative Core" duration = 1 MINUTES status_type = STATUS_EFFECT_REPLACE - alert_type = /obj/screen/alert/status_effect/regenerative_core + alert_type = /atom/movable/screen/alert/status_effect/regenerative_core var/heal_amount = 25 /datum/status_effect/regenerative_core/on_apply() @@ -597,9 +597,9 @@ id = "Anatomic Panacea" duration = 100 tick_interval = 10 - alert_type = /obj/screen/alert/status_effect/panacea + alert_type = /atom/movable/screen/alert/status_effect/panacea -/obj/screen/alert/status_effect/panacea +/atom/movable/screen/alert/status_effect/panacea name = "Panacea" desc = "We purge the impurities from our body." icon_state = "panacea" @@ -774,7 +774,7 @@ status_type = STATUS_EFFECT_REFRESH duration = 15 SECONDS examine_text = "They don't seem to be all here." - alert_type = /obj/screen/alert/status_effect/crucible_soul + alert_type = /atom/movable/screen/alert/status_effect/crucible_soul var/turf/location /datum/status_effect/crucible_soul/on_apply() @@ -796,7 +796,7 @@ id = "Blessing of Dusk and Dawn" status_type = STATUS_EFFECT_REFRESH duration = 60 SECONDS - alert_type =/obj/screen/alert/status_effect/duskndawn + alert_type =/atom/movable/screen/alert/status_effect/duskndawn /datum/status_effect/duskndawn/on_apply() . = ..() @@ -813,7 +813,7 @@ status_type = STATUS_EFFECT_REFRESH duration = 60 SECONDS tick_interval = 1 SECONDS - alert_type = /obj/screen/alert/status_effect/marshal + alert_type = /atom/movable/screen/alert/status_effect/marshal /datum/status_effect/marshal/on_apply() . = ..() @@ -849,17 +849,17 @@ carbie.blood_volume += carbie.blood_volume >= BLOOD_VOLUME_NORMAL ? 0 : heal_amt*3 -/obj/screen/alert/status_effect/crucible_soul +/atom/movable/screen/alert/status_effect/crucible_soul name = "Blessing of Crucible Soul" desc = "You phased through the reality, you are halfway to your final destination..." icon_state = "crucible" -/obj/screen/alert/status_effect/duskndawn +/atom/movable/screen/alert/status_effect/duskndawn name = "Blessing of Dusk and Dawn" desc = "Many things hide beyond the horizon, with Owl's help i managed to slip past sun's guard and moon's watch." icon_state = "duskndawn" -/obj/screen/alert/status_effect/marshal +/atom/movable/screen/alert/status_effect/marshal name = "Blessing of Wounded Soldier" desc = "Some people seek power through redemption, one thing many people don't know is that battle is the ultimate redemption and wounds let you bask in eternal glory." icon_state = "wounded_soldier" diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 7fc7da2ef7..d6cde67198 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -58,7 +58,7 @@ //SLEEPING /datum/status_effect/incapacitating/sleeping id = "sleeping" - alert_type = /obj/screen/alert/status_effect/asleep + alert_type = /atom/movable/screen/alert/status_effect/asleep needs_update_stat = TRUE var/mob/living/carbon/carbon_owner var/mob/living/carbon/human/human_owner @@ -122,7 +122,7 @@ owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/off_balance) return ..() -/obj/screen/alert/status_effect/asleep +/atom/movable/screen/alert/status_effect/asleep name = "Asleep" desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are." icon_state = "asleep" @@ -139,7 +139,7 @@ /datum/status_effect/mesmerize id = "Mesmerize" - alert_type = /obj/screen/alert/status_effect/mesmerized + alert_type = /atom/movable/screen/alert/status_effect/mesmerized /datum/status_effect/mesmerize/on_creation(mob/living/new_owner, set_duration) . = ..() @@ -156,7 +156,7 @@ duration = set_duration . = ..() -/obj/screen/alert/status_effect/mesmerized +/atom/movable/screen/alert/status_effect/mesmerized name = "Mesmerized" desc = "You can't tear your sight from who is in front of you... their gaze is simply too enthralling.." icon = 'icons/mob/actions/bloodsucker.dmi' @@ -199,15 +199,32 @@ movespeed_mod = /datum/movespeed_modifier/status_effect/tased/no_combat_mode stamdmg_per_ds = 1 +/datum/status_effect/vtec_disabled + id = "vtec_disable" + tick = FALSE + +/datum/status_effect/vtec_disabled/on_creation(mob/living/new_owner, set_duration) + if(isnum(set_duration)) + duration = set_duration + . = ..() + if(iscyborg(owner)) + var/mob/living/silicon/robot/R = owner + R.vtec_disabled = TRUE + +/datum/status_effect/vtec_disabled/on_remove() + if(iscyborg(owner)) + var/mob/living/silicon/robot/R = owner + R.vtec_disabled = FALSE + return ..() //OTHER DEBUFFS /datum/status_effect/his_wrath //does minor damage over time unless holding His Grace id = "his_wrath" duration = -1 tick_interval = 4 - alert_type = /obj/screen/alert/status_effect/his_wrath + alert_type = /atom/movable/screen/alert/status_effect/his_wrath -/obj/screen/alert/status_effect/his_wrath +/atom/movable/screen/alert/status_effect/his_wrath name = "His Wrath" desc = "You fled from His Grace instead of feeding Him, and now you suffer." icon_state = "his_grace" @@ -226,11 +243,11 @@ duration = 70 tick_interval = 0 //tick as fast as possible status_type = STATUS_EFFECT_REPLACE - alert_type = /obj/screen/alert/status_effect/belligerent + alert_type = /atom/movable/screen/alert/status_effect/belligerent var/leg_damage_on_toggle = 2 //damage on initial application and when the owner tries to toggle to run var/cultist_damage_on_toggle = 10 //damage on initial application and when the owner tries to toggle to run, but to cultists -/obj/screen/alert/status_effect/belligerent +/atom/movable/screen/alert/status_effect/belligerent name = "Belligerent" desc = "Kneel, her-eti'c." icon_state = "belligerent" @@ -751,7 +768,7 @@ /datum/status_effect/necropolis_curse/proc/apply_curse(set_curse) curse_flags |= set_curse if(curse_flags & CURSE_BLINDING) - owner.overlay_fullscreen("curse", /obj/screen/fullscreen/curse, 1) + owner.overlay_fullscreen("curse", /atom/movable/screen/fullscreen/curse, 1) /datum/status_effect/necropolis_curse/proc/remove_curse(remove_curse) if(remove_curse & CURSE_BLINDING) @@ -810,7 +827,7 @@ status_type = STATUS_EFFECT_UNIQUE tick_interval = 5 duration = 100 - alert_type = /obj/screen/alert/status_effect/kindle + alert_type = /atom/movable/screen/alert/status_effect/kindle var/old_health var/old_oxyloss @@ -839,7 +856,7 @@ owner.visible_message("The light in [owner]'s eyes fades!", \ "You snap out of your daze!") -/obj/screen/alert/status_effect/kindle +/atom/movable/screen/alert/status_effect/kindle name = "Dazzling Lights" desc = "Blinding light dances in your vision, stunning and silencing you. Any damage taken will shorten the light's effects!" icon_state = "kindle" @@ -852,7 +869,7 @@ status_type = STATUS_EFFECT_UNIQUE duration = 600 examine_text = "SUBJECTPRONOUN is drenched in thick, blue ichor!" - alert_type = /obj/screen/alert/status_effect/ichorial_stain + alert_type = /atom/movable/screen/alert/status_effect/ichorial_stain /datum/status_effect/ichorial_stain/on_apply() . = ..() @@ -865,7 +882,7 @@ owner.visible_message("The blue ichor on [owner]'s body dries out!", \ "The ichor on your body is dry - you can now be revived by vitality matrices again!") -/obj/screen/alert/status_effect/ichorial_stain +/atom/movable/screen/alert/status_effect/ichorial_stain name = "Ichorial Stain" desc = "Your body is covered in blue ichor! You can't be revived by vitality matrices." icon_state = "ichorial_stain" @@ -891,7 +908,7 @@ /datum/status_effect/strandling //get it, strand as in durathread strand + strangling = strandling hahahahahahahahahahhahahaha i want to die id = "strandling" status_type = STATUS_EFFECT_UNIQUE - alert_type = /obj/screen/alert/status_effect/strandling + alert_type = /atom/movable/screen/alert/status_effect/strandling /datum/status_effect/strandling/on_apply() ADD_TRAIT(owner, TRAIT_MAGIC_CHOKE, "dumbmoron") @@ -901,13 +918,13 @@ REMOVE_TRAIT(owner, TRAIT_MAGIC_CHOKE, "dumbmoron") return ..() -/obj/screen/alert/status_effect/strandling +/atom/movable/screen/alert/status_effect/strandling name = "Choking strand" desc = "A magical strand of Durathread is wrapped around your neck, preventing you from breathing! Click this icon to remove the strand." icon_state = "his_grace" alerttooltipstyle = "hisgrace" -/obj/screen/alert/status_effect/strandling/Click(location, control, params) +/atom/movable/screen/alert/status_effect/strandling/Click(location, control, params) . = ..() to_chat(mob_viewer, "You attempt to remove the durathread strand from around your neck.") if(do_after(mob_viewer, 35, null, mob_viewer)) @@ -944,9 +961,9 @@ tick_interval = 10 examine_text = "SUBJECTPRONOUN seems slow and unfocused." var/stun = TRUE - alert_type = /obj/screen/alert/status_effect/trance + alert_type = /atom/movable/screen/alert/status_effect/trance -/obj/screen/alert/status_effect/trance +/atom/movable/screen/alert/status_effect/trance name = "Trance" desc = "Everything feels so distant, and you can feel your thoughts forming loops inside your head..." icon_state = "high" @@ -1052,7 +1069,7 @@ id = "dna_melt" duration = 600 status_type = STATUS_EFFECT_REPLACE - alert_type = /obj/screen/alert/status_effect/dna_melt + alert_type = /atom/movable/screen/alert/status_effect/dna_melt var/kill_either_way = FALSE //no amount of removing mutations is gonna save you now /datum/status_effect/dna_melt/on_creation(mob/living/new_owner, set_duration, updating_canmove) @@ -1067,7 +1084,7 @@ H.something_horrible(kill_either_way) return ..() -/obj/screen/alert/status_effect/dna_melt +/atom/movable/screen/alert/status_effect/dna_melt name = "Genetic Breakdown" desc = "I don't feel so good. Your body can't handle the mutations! You have one minute to remove your mutations, or you will be met with a horrible fate." icon_state = "dna_melt" diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm index d3d39e625a..26881fe94c 100644 --- a/code/datums/status_effects/gas.dm +++ b/code/datums/status_effects/gas.dm @@ -2,11 +2,11 @@ id = "frozen" duration = 100 status_type = STATUS_EFFECT_UNIQUE - alert_type = /obj/screen/alert/status_effect/freon + alert_type = /atom/movable/screen/alert/status_effect/freon var/icon/cube var/can_melt = TRUE -/obj/screen/alert/status_effect/freon +/atom/movable/screen/alert/status_effect/freon name = "Frozen Solid" desc = "You're frozen inside an ice cube, and cannot move! You can still do stuff, like shooting. Resist out of the cube!" icon_state = "frozen" diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index 5f59359193..2c274802b4 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -48,7 +48,7 @@ get_kill() return ..() -/obj/screen/alert/status_effect/in_love +/atom/movable/screen/alert/status_effect/in_love name = "In Love" desc = "You feel so wonderfully in love!" icon_state = "in_love" @@ -57,7 +57,7 @@ id = "in_love" duration = -1 status_type = STATUS_EFFECT_UNIQUE - alert_type = /obj/screen/alert/status_effect/in_love + alert_type = /atom/movable/screen/alert/status_effect/in_love var/mob/living/date /datum/status_effect/in_love/on_creation(mob/living/new_owner, mob/living/love_interest) diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index b38b755f28..fe605ba4a6 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -5,15 +5,17 @@ /datum/status_effect var/id = "effect" //Used for screen alerts. var/duration = -1 //How long the status effect lasts in DECISECONDS. Enter -1 for an effect that never ends unless removed through some means. + /// do we tick()? + var/tick = TRUE var/tick_interval = 10 //How many deciseconds between ticks, approximately. Leave at 10 for every second. var/next_tick //The scheduled time for the next tick. var/mob/living/owner //The mob affected by the status effect. var/on_remove_on_mob_delete = FALSE //if we call on_remove() when the mob is deleted var/examine_text //If defined, this text will appear when the mob is examined - to use he, she etc. use "SUBJECTPRONOUN" and replace it in the examines themselves - var/alert_type = /obj/screen/alert/status_effect //the alert thrown by the status effect, contains name and description + var/alert_type = /atom/movable/screen/alert/status_effect //the alert thrown by the status effect, contains name and description /// If this is TRUE, the user will have sprint forcefully disabled while this is active. var/blocks_sprint = FALSE - var/obj/screen/alert/status_effect/linked_alert = null //the alert itself, if it exists + var/atom/movable/screen/alert/status_effect/linked_alert = null //the alert itself, if it exists /// How many of the effect can be on one mob, and what happens when you try to add another var/status_type = STATUS_EFFECT_UNIQUE @@ -32,7 +34,7 @@ duration = world.time + duration next_tick = world.time + tick_interval if(alert_type) - var/obj/screen/alert/status_effect/A = owner.throw_alert(id, alert_type) + var/atom/movable/screen/alert/status_effect/A = owner.throw_alert(id, alert_type) A.attached_effect = src //so the alert can reference us, if it needs to linked_alert = A //so we can reference the alert, if we need to START_PROCESSING(SSstatus_effects, src) @@ -98,7 +100,7 @@ // ALERT HOOK // //////////////// -/obj/screen/alert/status_effect +/atom/movable/screen/alert/status_effect name = "Curse of Mundanity" desc = "You don't feel any different..." var/datum/status_effect/attached_effect diff --git a/code/datums/status_effects/wound_effects.dm b/code/datums/status_effects/wound_effects.dm index 2ead3e6e19..74fc55e95b 100644 --- a/code/datums/status_effects/wound_effects.dm +++ b/code/datums/status_effects/wound_effects.dm @@ -1,13 +1,13 @@ // The shattered remnants of your broken limbs fill you with determination! -/obj/screen/alert/status_effect/determined +/atom/movable/screen/alert/status_effect/determined name = "Determined" desc = "The serious wounds you've sustained have put your body into fight-or-flight mode! Now's the time to look for an exit!" icon_state = "regenerative_core" /datum/status_effect/determined id = "determined" - alert_type = /obj/screen/alert/status_effect/determined + alert_type = /atom/movable/screen/alert/status_effect/determined /datum/status_effect/determined/on_apply() . = ..() @@ -21,7 +21,7 @@ id = "limp" status_type = STATUS_EFFECT_REPLACE tick_interval = 10 - alert_type = /obj/screen/alert/status_effect/limp + alert_type = /atom/movable/screen/alert/status_effect/limp var/msg_stage = 0//so you dont get the most intense messages immediately /// The left leg of the limping person var/obj/item/bodypart/l_leg/left @@ -49,7 +49,7 @@ UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_LOSE_WOUND, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB)) return ..() -/obj/screen/alert/status_effect/limp +/atom/movable/screen/alert/status_effect/limp name = "Limping" desc = "One or more of your legs has been wounded, slowing down steps with that leg! Get it fixed, or at least splinted!" @@ -99,11 +99,11 @@ ///////////////////////// // wound alert -/obj/screen/alert/status_effect/wound +/atom/movable/screen/alert/status_effect/wound name = "Wounded" desc = "Your body has sustained serious damage, click here to inspect yourself." -/obj/screen/alert/status_effect/wound/Click() +/atom/movable/screen/alert/status_effect/wound/Click() var/mob/living/carbon/C = usr C.check_self_for_injuries() diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index 2f0667d942..36712ea6bb 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -162,3 +162,20 @@ gain_text = "You feel like munching on a can of soda." lose_text = "You no longer feel like you should be eating trash." mob_trait = TRAIT_TRASHCAN + +/datum/quirk/colorist + name = "Colorist" + desc = "You like carrying around a hair dye spray to quickly apply color patterns to your hair." + value = 0 + medical_record_text = "Patient enjoys dyeing their hair with pretty colors." + +/datum/quirk/colorist/on_spawn() + var/mob/living/carbon/human/H = quirk_holder + var/obj/item/dyespray/spraycan = new(get_turf(quirk_holder)) + H.equip_to_slot(spraycan, SLOT_IN_BACKPACK) + H.regenerate_icons() + +/datum/quirk/colorist/post_add() + var/mob/living/carbon/human/H = quirk_holder + SEND_SIGNAL(H.back, COMSIG_TRY_STORAGE_SHOW, H) + to_chat(quirk_holder, "You brought some extra dye with you! It's in your bag if you forgot.") diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm index ed58ee512d..35e5a9a360 100644 --- a/code/datums/weather/weather_types/radiation_storm.dm +++ b/code/datums/weather/weather_types/radiation_storm.dm @@ -18,7 +18,7 @@ area_type = /area protected_areas = list(/area/maintenance, /area/ai_monitored/turret_protected/ai_upload, /area/ai_monitored/turret_protected/ai_upload_foyer, - /area/ai_monitored/turret_protected/ai, /area/commons/storage/emergency/starboard, /area/commons/storage/emergency/port, /area/shuttle, /area/security/prison/safe, /area/security/prison/toilet) + /area/ai_monitored/turret_protected/ai, /area/commons/storage/emergency/starboard, /area/commons/storage/emergency/port, /area/shuttle) target_trait = ZTRAIT_STATION immunity_type = "rad" diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index 81f99cfa69..abee5ada06 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -329,3 +329,15 @@ to_chat(L, "You need an attachable assembly!") #undef MAXIMUM_EMP_WIRES + +//gremlins +/datum/wires/proc/npc_tamper(mob/living/L) + if(!wires.len) + return + + var/wire_to_screw = pick(wires) + + if(is_color_cut(wire_to_screw) || prob(50)) //CutWireColour() proc handles both cutting and mending wires. If the wire is already cut, always mend it back. Otherwise, 50% to cut it and 50% to pulse it + cut(wire_to_screw) + else + pulse(wire_to_screw, L) diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm index 6b8d1c9ce5..679d2faf11 100644 --- a/code/datums/world_topic.dm +++ b/code/datums/world_topic.dm @@ -124,7 +124,7 @@ for(var/mob/dead/observer/O in GLOB.player_list) if(O.key == expected_key) if(O.client?.address == addr) - new /obj/screen/splash(O.client, TRUE) + new /atom/movable/screen/splash(O.client, TRUE) break /datum/world_topic/adminmsg diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm index 9c5a41de5d..6cab8818ee 100644 --- a/code/datums/wounds/_wounds.dm +++ b/code/datums/wounds/_wounds.dm @@ -136,7 +136,7 @@ SEND_SIGNAL(victim, COMSIG_CARBON_GAIN_WOUND, src, limb) victim.emote("pain") if(!victim.alerts["wound"]) // only one alert is shared between all of the wounds - victim.throw_alert("wound", /obj/screen/alert/status_effect/wound) + victim.throw_alert("wound", /atom/movable/screen/alert/status_effect/wound) var/demoted if(old_wound) diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm index 57f4fdb8de..caf8fda213 100644 --- a/code/game/area/Space_Station_13_areas.dm +++ b/code/game/area/Space_Station_13_areas.dm @@ -37,7 +37,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/ai_monitored/turret_protected/AIsatextAP name = "AI Sat Ext" icon_state = "storage" - + /area/arrival requires_power = FALSE @@ -296,6 +296,28 @@ NOTE: there are two lists of areas in the end of this file: centcom and station icon_state = "xenomaint" area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA | XENOBIOLOGY_COMPATIBLE | CULT_PERMITTED +//Maintenance - Prison + +/area/maintenance/prison + name = "Prison Maintenance" + icon_state = "prison_maintenance" + +/area/maintenance/prison/fore + name = "Prison Fore Maintenance" + icon_state = "prison_maintenance" + +/area/maintenance/prison/starboard + name = "Prison Starboard Maintenance" + icon_state = "prison_maintenance" + +/area/maintenance/prison/aft + name = "Prison Aft Maintenance" + icon_state = "prison_maintenance" + +/area/maintenance/prison/port + name = "Prison Port Maintenance" + icon_state = "prison_maintenance" + //Maintenance - Generic /area/maintenance/arrivals/north @@ -1393,13 +1415,9 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Prison Wing" icon_state = "sec_prison" -/area/security/prison/toilet //radproof - name = "Prison Toilet" - icon_state = "sec_prison_safe" - -/area/security/prison/safe //radproof +/area/security/prison/cells name = "Prison Wing Cells" - icon_state = "sec_prison_safe" + icon_state = "prison_cells" /area/security/prison/upper name = "Upper Prison Wing" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 2a21d72119..a28d558454 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -553,7 +553,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) A.power_equip = power_equip A.power_environ = power_environ INVOKE_ASYNC(A, .proc/power_change) - update_icon() + update_appearance() /area/proc/usage(chan) switch(chan) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index e9957fdae2..48213279f1 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -103,6 +103,9 @@ /// A luminescence-shifted value of the last color calculated for chatmessage overlays var/chat_color_darkened + ///Used for changing icon states for different base sprites. + var/base_icon_state + ///Mobs that are currently do_after'ing this atom, to be cleared from on Destroy() var/list/targeted_by @@ -169,7 +172,7 @@ * * [/turf/open/space/proc/Initialize] */ /atom/proc/Initialize(mapload, ...) - // SHOULD_NOT_SLEEP(TRUE) + SHOULD_NOT_SLEEP(TRUE) SHOULD_CALL_PARENT(TRUE) if(flags_1 & INITIALIZED_1) stack_trace("Warning: [src]([type]) initialized multiple times!") @@ -531,37 +534,75 @@ if(!LAZYLEN(.)) // lol ..length return list("You examine [src] closer, but find nothing of interest...") +/** + * Updates the appearence of the icon + * + * Mostly delegates to update_name, update_desc, and update_icon + * + * Arguments: + * - updates: A set of bitflags dictating what should be updated. Defaults to [ALL] + */ +/atom/proc/update_appearance(updates=ALL) + //SHOULD_NOT_SLEEP(TRUE) + //SHOULD_CALL_PARENT(TRUE) + + . = NONE + updates &= ~SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_APPEARANCE, updates) + if(updates & UPDATE_NAME) + . |= update_name(updates) + if(updates & UPDATE_DESC) + . |= update_desc(updates) + if(updates & UPDATE_ICON) + . |= update_icon(updates) + +/// Updates the name of the atom +/atom/proc/update_name(updates=ALL) + //SHOULD_CALL_PARENT(TRUE) + return SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_NAME, updates) + +/// Updates the description of the atom +/atom/proc/update_desc(updates=ALL) + //SHOULD_CALL_PARENT(TRUE) + return SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_DESC, updates) + /// Updates the icon of the atom -/atom/proc/update_icon() - // I expect we're going to need more return flags and options in this proc - var/signalOut = SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON) - . = FALSE +/atom/proc/update_icon(updates=ALL) + SIGNAL_HANDLER + //SHOULD_CALL_PARENT(TRUE) - if(!(signalOut & COMSIG_ATOM_NO_UPDATE_ICON_STATE)) + . = NONE + updates &= ~SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON, updates) + if(updates & UPDATE_ICON_STATE) update_icon_state() - . = TRUE + . |= UPDATE_ICON_STATE - if(!(signalOut & COMSIG_ATOM_NO_UPDATE_OVERLAYS)) - var/list/new_overlays = update_overlays() + if(updates & UPDATE_OVERLAYS) + if(LAZYLEN(managed_vis_overlays)) + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) + + var/list/new_overlays = update_overlays(updates) if(managed_overlays) cut_overlay(managed_overlays) managed_overlays = null if(length(new_overlays)) managed_overlays = new_overlays add_overlay(new_overlays) - . = TRUE + . |= UPDATE_OVERLAYS - SEND_SIGNAL(src, COMSIG_ATOM_UPDATED_ICON, signalOut, .) + . |= SEND_SIGNAL(src, COMSIG_ATOM_UPDATED_ICON, updates, .) /// Updates the icon state of the atom /atom/proc/update_icon_state() + //SHOULD_CALL_PARENT(TRUE) + return SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON_STATE) /// Updates the overlays of the atom /atom/proc/update_overlays() - SHOULD_CALL_PARENT(TRUE) + //SHOULD_CALL_PARENT(TRUE) . = list() SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_OVERLAYS, .) + /atom/proc/relaymove(mob/living/user) if(!istype(user)) return //why are you buckling nonliving mobs to atoms? diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 155a462295..391d3b467d 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -66,7 +66,11 @@ . = ..() switch(blocks_emissive) if(EMISSIVE_BLOCK_GENERIC) - update_emissive_block() + var/mutable_appearance/gen_emissive_blocker = mutable_appearance(icon, icon_state, plane = EMISSIVE_PLANE, alpha = src.alpha) + gen_emissive_blocker.color = GLOB.em_block_color + gen_emissive_blocker.dir = dir + gen_emissive_blocker.appearance_flags |= appearance_flags + add_overlay(list(gen_emissive_blocker)) if(EMISSIVE_BLOCK_UNIQUE) render_target = ref(src) em_block = new(src, render_target) @@ -111,13 +115,23 @@ /atom/movable/proc/update_emissive_block() if(blocks_emissive != EMISSIVE_BLOCK_GENERIC) return - if(length(managed_vis_overlays)) - for(var/a in managed_vis_overlays) - var/obj/effect/overlay/vis/vs - if(vs.plane == EMISSIVE_BLOCKER_PLANE) - SSvis_overlays.remove_vis_overlay(src, list(vs)) - break - SSvis_overlays.add_vis_overlay(src, icon, icon_state, EMISSIVE_BLOCKER_LAYER, EMISSIVE_BLOCKER_PLANE, dir) + else if (blocks_emissive == EMISSIVE_BLOCK_GENERIC) + var/mutable_appearance/gen_emissive_blocker = mutable_appearance(icon, icon_state, plane = EMISSIVE_PLANE, alpha = src.alpha) + gen_emissive_blocker.color = GLOB.em_block_color + gen_emissive_blocker.dir = dir + gen_emissive_blocker.appearance_flags |= appearance_flags + return gen_emissive_blocker + else if(blocks_emissive == EMISSIVE_BLOCK_UNIQUE) + if(!em_block) + render_target = ref(src) + em_block = new(src, render_target) + return em_block + +/atom/movable/update_overlays() + . = ..() + var/emissive_block = update_emissive_block() + if(emissive_block) + . += emissive_block /atom/movable/proc/can_zFall(turf/source, levels = 1, turf/target, direction) if(!direction) diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm index 65321f5820..aa8edeaa72 100644 --- a/code/game/gamemodes/bloodsucker/bloodsucker.dm +++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm @@ -25,7 +25,7 @@ antag_flag = ROLE_BLOODSUCKER false_report_weight = 1 chaos = 4 - restricted_jobs = list("AI","Cyborg") + restricted_jobs = list("Prisoner", "AI","Cyborg") protected_jobs = list("Chaplain", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") required_players = 20 required_enemies = 2 diff --git a/code/game/gamemodes/brother/traitor_bro.dm b/code/game/gamemodes/brother/traitor_bro.dm index eda6b5f9e2..6da31e41bb 100644 --- a/code/game/gamemodes/brother/traitor_bro.dm +++ b/code/game/gamemodes/brother/traitor_bro.dm @@ -7,7 +7,7 @@ config_tag = "traitorbro" required_players = 25 chaos = 5 - restricted_jobs = list("AI", "Cyborg") + restricted_jobs = list("Prisoner", "AI", "Cyborg") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") announce_span = "danger" diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 20ef83a54c..83c1eec598 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -11,7 +11,7 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th antag_flag = ROLE_CHANGELING false_report_weight = 10 chaos = 5 - restricted_jobs = list("AI", "Cyborg") + restricted_jobs = list("Prisoner", "AI", "Cyborg") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") //citadel change - adds HoP, CE, CMO, and RD to ling role blacklist required_players = 15 required_enemies = 1 diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm index 88a1cde8ce..691111031d 100644 --- a/code/game/gamemodes/changeling/traitor_chan.dm +++ b/code/game/gamemodes/changeling/traitor_chan.dm @@ -4,7 +4,7 @@ false_report_weight = 10 chaos = 6 traitors_possible = 3 //hard limit on traitors if scaling is turned off - restricted_jobs = list("AI", "Cyborg") + restricted_jobs = list("Prisoner", "AI", "Cyborg") required_players = 25 required_enemies = 1 // how many of each type are required recommended_enemies = 3 diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index d8ebf6f20c..8ff26d5125 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -139,7 +139,7 @@ Credit where due: required_enemies = 3 recommended_enemies = 5 enemy_minimum_age = 7 - protected_jobs = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") //Silicons can eventually be converted + protected_jobs = list("Prisoner", "AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") //Silicons can eventually be converted restricted_jobs = list("Chaplain", "Captain") announce_span = "brass" announce_text = "Servants of Ratvar are trying to summon the Justiciar!\n\ @@ -151,14 +151,14 @@ Credit where due: var/datum/team/clockcult/main_clockcult /datum/game_mode/clockwork_cult/pre_setup() //Gamemode and job code is pain. Have fun codediving all of that stuff, whoever works on this next - Delta - /*var/list/errorList = list() + var/list/errorList = list() var/list/reebes = SSmapping.LoadGroup(errorList, "Reebe", "map_files/generic", "City_of_Cogs.dmm", default_traits = ZTRAITS_REEBE, silent = TRUE) if(errorList.len) // reebe failed to load message_admins("Reebe failed to load!") log_game("Reebe failed to load!") return FALSE for(var/datum/parsed_map/PM in reebes) //Temporarily commented because of z-level loading reliably segfaulting the server. - PM.initTemplateBounds()*/ + PM.initTemplateBounds() if(CONFIG_GET(flag/protect_roles_from_antagonist)) restricted_jobs += protected_jobs if(CONFIG_GET(flag/protect_assistant_from_antagonist)) @@ -275,7 +275,7 @@ Credit where due: ears = /obj/item/radio/headset gloves = /obj/item/clothing/gloves/color/yellow belt = /obj/item/storage/belt/utility/servant - backpack_contents = list(/obj/item/storage/box/engineer = 1, \ + backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\ /obj/item/clockwork/replica_fabricator = 1, /obj/item/stack/tile/brass/fifty = 1, /obj/item/reagent_containers/food/drinks/bottle/holyoil = 1) id = /obj/item/pda var/plasmaman //We use this to determine if we should activate internals in post_equip() diff --git a/code/game/gamemodes/clown_ops/clown_ops.dm b/code/game/gamemodes/clown_ops/clown_ops.dm index 659d2de105..fa73e2cca9 100644 --- a/code/game/gamemodes/clown_ops/clown_ops.dm +++ b/code/game/gamemodes/clown_ops/clown_ops.dm @@ -43,7 +43,7 @@ l_pocket = /obj/item/pinpointer/nuke/syndicate r_pocket = /obj/item/bikehorn id = /obj/item/card/id/syndicate - backpack_contents = list(/obj/item/storage/box/syndie=1,\ + backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\ /obj/item/kitchen/knife/combat/survival, /obj/item/reagent_containers/spray/waterflower/lube) implants = list(/obj/item/implant/sad_trombone) diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index ba9fad7a84..9a49c05739 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -39,7 +39,7 @@ antag_flag = ROLE_CULTIST false_report_weight = 10 chaos = 8 - restricted_jobs = list("AI", "Cyborg") + restricted_jobs = list("Prisoner", "AI", "Cyborg") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") required_players = 30 required_enemies = 3 diff --git a/code/game/gamemodes/devil/devil_game_mode.dm b/code/game/gamemodes/devil/devil_game_mode.dm index 9bf7fc0e82..7fe2f91714 100644 --- a/code/game/gamemodes/devil/devil_game_mode.dm +++ b/code/game/gamemodes/devil/devil_game_mode.dm @@ -4,7 +4,7 @@ antag_flag = ROLE_DEVIL false_report_weight = 1 chaos = 3 - protected_jobs = list("Lawyer", "Curator", "Chaplain", "Head of Security", "Captain", "AI") + protected_jobs = list("Prisoner", "Lawyer", "Curator", "Chaplain", "Head of Security", "Captain", "AI") required_players = 0 required_enemies = 1 recommended_enemies = 4 diff --git a/code/game/gamemodes/eldritch_cult/eldritch_cult.dm b/code/game/gamemodes/eldritch_cult/eldritch_cult.dm index 1693163fa2..2086653012 100644 --- a/code/game/gamemodes/eldritch_cult/eldritch_cult.dm +++ b/code/game/gamemodes/eldritch_cult/eldritch_cult.dm @@ -4,7 +4,7 @@ antag_flag = ROLE_HERETIC false_report_weight = 5 chaos = 5 - restricted_jobs = list("AI", "Cyborg") + restricted_jobs = list("Prisoner", "AI", "Cyborg") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") //citadel change - adds HoP, CE, CMO, and RD to heretic role blacklist required_players = 15 required_enemies = 1 diff --git a/code/game/gamemodes/gangs/gangs.dm b/code/game/gamemodes/gangs/gangs.dm index 100669c487..1352e9340d 100644 --- a/code/game/gamemodes/gangs/gangs.dm +++ b/code/game/gamemodes/gangs/gangs.dm @@ -7,7 +7,7 @@ GLOBAL_LIST_EMPTY(gangs) config_tag = "gang" antag_flag = ROLE_GANG chaos = 9 - restricted_jobs = list("AI", "Cyborg") + restricted_jobs = list("Prisoner", "AI", "Cyborg") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") required_players = 15 required_enemies = 0 diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index dcf84e84db..a82abe9b3d 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -127,7 +127,7 @@ l_pocket = /obj/item/pinpointer/nuke/syndicate id = /obj/item/card/id/syndicate belt = /obj/item/gun/ballistic/automatic/pistol - backpack_contents = list(/obj/item/storage/box/syndie=1,\ + backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\ /obj/item/kitchen/knife/combat/survival) var/tc = 25 @@ -173,7 +173,7 @@ internals_slot = SLOT_R_STORE belt = /obj/item/storage/belt/military r_hand = /obj/item/gun/ballistic/automatic/shotgun/bulldog - backpack_contents = list(/obj/item/storage/box/syndie=1,\ + backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\ /obj/item/tank/jetpack/oxygen/harness=1,\ /obj/item/gun/ballistic/automatic/pistol=1,\ /obj/item/kitchen/knife/combat/survival) @@ -188,7 +188,7 @@ r_pocket = /obj/item/tank/internals/emergency_oxygen/engi internals_slot = SLOT_R_STORE belt = /obj/item/storage/belt/military - backpack_contents = list(/obj/item/storage/box/syndie=1,\ + backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\ /obj/item/tank/jetpack/oxygen/harness=1,\ /obj/item/gun/ballistic/automatic/pistol=1,\ /obj/item/kitchen/knife/combat/survival) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index fcfddb2788..1c6c444fb4 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -160,12 +160,14 @@ If not set, defaults to check_completion instead. Set it. It's used by cryo. /datum/objective/proc/give_special_equipment(special_equipment) var/datum/mind/receiver = pick(get_owners()) + . = list() if(receiver && receiver.current) if(ishuman(receiver.current)) var/mob/living/carbon/human/H = receiver.current var/list/slots = list("backpack" = SLOT_IN_BACKPACK) for(var/eq_path in special_equipment) var/obj/O = new eq_path + . += O H.equip_in_one_of_slots(O, slots, critical = TRUE) /datum/objective/assassinate @@ -560,6 +562,7 @@ GLOBAL_LIST_EMPTY(possible_items) name = "steal" var/datum/objective_item/targetinfo = null //Save the chosen item datum so we can access it later. var/obj/item/steal_target = null //Needed for custom objectives (they're just items, not datums). + var/list/special_items_given = list() martyr_compatible = 0 /datum/objective/steal/get_target() @@ -571,6 +574,11 @@ GLOBAL_LIST_EMPTY(possible_items) for(var/I in subtypesof(/datum/objective_item/steal)) new I +/datum/objective/steal/Destroy(force, ...) + if(length(special_items_given)) + QDEL_LIST(special_items_given) + . = ..() + /datum/objective/steal/find_target(dupe_search_range, blacklist) var/list/datum/mind/owners = get_owners() var/approved_targets = list() @@ -589,7 +597,7 @@ GLOBAL_LIST_EMPTY(possible_items) targetinfo = item steal_target = targetinfo.targetitem explanation_text = "Steal [targetinfo.name]" - give_special_equipment(targetinfo.special_equipment) + special_items_given = give_special_equipment(targetinfo.special_equipment) return steal_target else explanation_text = "Free objective" @@ -1180,6 +1188,7 @@ GLOBAL_LIST_EMPTY(possible_sabotages) /datum/objective/sabotage name = "sabotage" var/datum/sabotage_objective/targetinfo = null //composition > inheritance. + var/list/special_items_given = list() /datum/objective/sabotage/get_target() return targetinfo.sabotage_type @@ -1190,6 +1199,11 @@ GLOBAL_LIST_EMPTY(possible_sabotages) for(var/I in subtypesof(/datum/sabotage_objective)) new I +/datum/objective/sabotage/Destroy() + if(length(special_items_given)) + QDEL_LIST(special_items_given) + . = ..() + /datum/objective/sabotage/find_target(dupe_search_range, blacklist) var/list/datum/mind/owners = get_owners() var/approved_targets = list() @@ -1207,7 +1221,7 @@ GLOBAL_LIST_EMPTY(possible_sabotages) if(sabo) targetinfo = sabo explanation_text = "[targetinfo.name]" - give_special_equipment(targetinfo.special_equipment) + special_items_given = give_special_equipment(targetinfo.special_equipment) return sabo else explanation_text = "Free objective" diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 419a74d616..5b3e742336 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -13,7 +13,7 @@ antag_flag = ROLE_REV false_report_weight = 10 chaos = 8 - restricted_jobs = list("AI", "Cyborg") + restricted_jobs = list("Prisoner", "AI", "Cyborg") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") required_players = 20 required_enemies = 1 diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index d42fe615cd..220fbe9978 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -10,7 +10,7 @@ config_tag = "traitor" antag_flag = ROLE_TRAITOR false_report_weight = 20 //Reports of traitors are pretty common. - restricted_jobs = list("Cyborg")//They are part of the AI if he is traitor so are they, they use to get double chances + restricted_jobs = list("Prisoner", "Cyborg")//They are part of the AI if he is traitor so are they, they use to get double chances protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") //citadel change - adds HoP, CE, CMO, and RD to ling role blacklist required_players = 0 required_enemies = 1 diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 2ccf7d317d..133fec28b3 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -148,11 +148,15 @@ Class Procs: START_PROCESSING(SSmachines, src) else START_PROCESSING(SSfastprocess, src) - power_change() RegisterSignal(src, COMSIG_ENTER_AREA, .proc/power_change) if (occupant_typecache) occupant_typecache = typecacheof(occupant_typecache) + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/LateInitialize() + . = ..() + power_change() /obj/machinery/Destroy() GLOB.machines.Remove(src) @@ -176,6 +180,17 @@ Class Procs: /obj/machinery/proc/process_atmos()//If you dont use process why are you here return PROCESS_KILL +///Called when we want to change the value of the stat variable. Holds bitflags. +/obj/machinery/proc/set_machine_stat(new_value) + if(new_value == stat) + return + . = stat + stat = new_value + on_machine_stat_update(stat) + +/obj/machinery/proc/on_machine_stat_update(stat) + return + /obj/machinery/emp_act(severity) . = ..() if(use_power && !stat && !(. & EMP_PROTECT_SELF)) @@ -383,8 +398,11 @@ Class Procs: M.icon_state = "box_1" /obj/machinery/obj_break(damage_flag) - if(!(flags_1 & NODECONSTRUCT_1)) + . = ..() + if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1)) stat |= BROKEN + SEND_SIGNAL(src, COMSIG_MACHINERY_BROKEN, damage_flag) + update_appearance() return TRUE /obj/machinery/contents_explosion(severity, target) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 7950d54ad3..35aa822a23 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -407,7 +407,7 @@ /obj/machinery/camera/get_remote_view_fullscreens(mob/user) if(view_range == short_range) //unfocused - user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 2) + user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 2) /obj/machinery/camera/update_remote_sight(mob/living/user) user.see_invisible = SEE_INVISIBLE_LIVING //can't see ghosts through cameras diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index a3bdfe4243..75c84bd2a8 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -388,7 +388,7 @@ to_chat(occupant, "There is a bright flash!
You feel like a new being.
") mob_occupant.flash_act() - var/list/policies = CONFIG_GET(keyed_list/policyconfig) + var/list/policies = CONFIG_GET(keyed_list/policy) var/policy = policies[POLICYCONFIG_ON_CLONE] if(policy) to_chat(occupant, policy) diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index 0c628ba43e..a2d32e0d4f 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -57,8 +57,8 @@ var/overlay_state = icon_screen if(stat & BROKEN) overlay_state = "[icon_state]_broken" - SSvis_overlays.add_vis_overlay(src, icon, overlay_state, layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, overlay_state, EMISSIVE_LAYER, EMISSIVE_PLANE, dir, alpha=128) + . += mutable_appearance(icon, overlay_state) + . += emissive_appearance(icon, overlay_state) /obj/machinery/computer/power_change() ..() diff --git a/code/game/machinery/computer/arcade/minesweeper.dm b/code/game/machinery/computer/arcade/minesweeper.dm index dbd9890c81..cd6ff2359c 100644 --- a/code/game/machinery/computer/arcade/minesweeper.dm +++ b/code/game/machinery/computer/arcade/minesweeper.dm @@ -191,6 +191,7 @@ var/x2 = x1 work_squares(y2, x2) //Work squares while in this loop so there's less load reset_board = FALSE + CHECK_TICK web += "" //Start setting up the html table web += "" @@ -235,6 +236,7 @@ web += "" if(19) web += "" + CHECK_TICK web += "" web += "
[MINESWEEPERIMG(7)][MINESWEEPERIMG(8)]
" web += "" diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index a62d2cd102..a6b774523c 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -16,10 +16,10 @@ // Stuff needed to render the map var/map_name - var/obj/screen/map_view/cam_screen + var/atom/movable/screen/map_view/cam_screen /// All the plane masters that need to be applied. var/list/cam_plane_masters - var/obj/screen/background/cam_background + var/atom/movable/screen/background/cam_background interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_SET_MACHINE //| INTERACT_MACHINE_REQUIRES_SIGHT @@ -40,8 +40,8 @@ cam_screen.del_on_map_removal = FALSE cam_screen.screen_loc = "[map_name]:1,1" cam_plane_masters = list() - for(var/plane in subtypesof(/obj/screen/plane_master)) - var/obj/screen/instance = new plane() + for(var/plane in subtypesof(/atom/movable/screen/plane_master)) + var/atom/movable/screen/instance = new plane() instance.assigned_map = map_name instance.del_on_map_removal = FALSE instance.screen_loc = "[map_name]:CENTER" diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 7d2c851206..9d675bc5dd 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -275,7 +275,7 @@ if(final) playsound(origin, 'sound/machines/terminal_prompt_confirm.ogg', 25, 0) remote_eye.setLoc(get_turf(final)) - C.overlay_fullscreen("flash", /obj/screen/fullscreen/flash/static) + C.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash/static) C.clear_fullscreen("flash", 3) //Shorter flash than normal since it's an ~~advanced~~ console! else playsound(origin, 'sound/machines/terminal_prompt_deny.ogg', 25, 0) diff --git a/code/game/machinery/computer/mechlaunchpad.dm b/code/game/machinery/computer/mechlaunchpad.dm index 3489ee5d35..86c4a35799 100644 --- a/code/game/machinery/computer/mechlaunchpad.dm +++ b/code/game/machinery/computer/mechlaunchpad.dm @@ -123,7 +123,7 @@ var/list/this_pad = list() this_pad["name"] = pad.display_name this_pad["id"] = i - if(pad.machine_stat & NOPOWER) + if(pad.stat & NOPOWER) this_pad["inactive"] = TRUE pad_list += list(this_pad) else @@ -135,7 +135,7 @@ var/obj/machinery/mechpad/current_pad = mechpads[selected_id] data["pad_name"] = current_pad.display_name data["selected_pad"] = current_pad - if(QDELETED(current_pad) || (current_pad.machine_stat & NOPOWER)) + if(QDELETED(current_pad) || (current_pad.stat & NOPOWER)) data["pad_active"] = FALSE return data data["pad_active"] = TRUE diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 477f72ee3b..982e40a79b 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -102,6 +102,9 @@ rad_insulation = RAD_MEDIUM_INSULATION var/static/list/airlock_overlays = list() + + /// sigh + var/unelectrify_timerid /obj/machinery/door/airlock/Initialize() . = ..() @@ -791,21 +794,6 @@ return WIRE_INTERACTION_FAIL return ..() -/obj/machinery/door/airlock/proc/electrified_loop() - while (secondsElectrified > NOT_ELECTRIFIED) - sleep(10) - if(QDELETED(src)) - return - - secondsElectrified-- - updateDialog() - // This is to protect against changing to permanent, mid loop. - if(secondsElectrified == NOT_ELECTRIFIED) - set_electrified(NOT_ELECTRIFIED) - else - set_electrified(ELECTRIFIED_PERMANENT) - updateDialog() - /obj/machinery/door/airlock/Topic(href, href_list, var/nowindow = 0) // If you add an if(..()) check you must first remove the var/nowindow parameter. // Otherwise it will runtime with this kind of error: null.Topic() @@ -1365,11 +1353,18 @@ wires.cut_all() update_icon() +/obj/machinery/door/airlock/proc/remove_electrify() + secondsElectrified = NOT_ELECTRIFIED + unelectrify_timerid = null + /obj/machinery/door/airlock/proc/set_electrified(seconds, mob/user) secondsElectrified = seconds + if(unelectrify_timerid) + deltimer(unelectrify_timerid) + unelectrify_timerid = null + if(secondsElectrified != ELECTRIFIED_PERMANENT) + unelectrify_timerid = addtimer(CALLBACK(src, .proc/remove_electrify), secondsElectrified SECONDS, TIMER_STOPPABLE) diag_hud_set_electrified() - if(secondsElectrified > NOT_ELECTRIFIED) - INVOKE_ASYNC(src, .proc/electrified_loop) if(user) var/message diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index e874a2713c..9ff03cd387 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -9,6 +9,7 @@ layer = OPEN_DOOR_LAYER power_channel = ENVIRON max_integrity = 350 + damage_deflection = 10 armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 70) CanAtmosPass = ATMOS_PASS_DENSITY flags_1 = PREVENT_CLICK_UNDER_1|DEFAULT_RICOCHET_1 @@ -38,7 +39,7 @@ var/locked = FALSE //whether the door is bolted or not. var/assemblytype //the type of door frame to drop during deconstruction var/datum/effect_system/spark_spread/spark_system - var/damage_deflection = 10 + var/real_explosion_block //ignore this, just use explosion_block var/red_alert_access = FALSE //if TRUE, this door will always open on red alert var/poddoor = FALSE @@ -223,11 +224,6 @@ return 1 return ..() -/obj/machinery/door/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) - if(damage_flag == "melee" && damage_amount < damage_deflection) - return 0 - . = ..() - /obj/machinery/door/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) . = ..() if(. && obj_integrity > 0) diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 2066e88f85..3ff75495e6 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -197,10 +197,8 @@ GLOBAL_LIST_EMPTY(doppler_arrays) if(orig_light < 10) say("Explosion not large enough for research calculations.") return - else if(orig_light < 4500) - point_gain = (83300 * orig_light) / (orig_light + 3000) else - point_gain = TECHWEB_BOMB_POINTCAP + point_gain = (100000 * orig_light) / (orig_light + 5000) /*****The Point Capper*****/ if(point_gain > linked_techweb.largest_bomb_value) diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index c6b29cf54c..229a2d98d8 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -79,23 +79,33 @@ if(is_station_level(z)) . += "fire_[GLOB.security_level]" - SSvis_overlays.add_vis_overlay(src, icon, "fire_[GLOB.security_level]", EMISSIVE_LAYER, EMISSIVE_PLANE, dir) + . += mutable_appearance(icon, "fire_[GLOB.security_level]") + . += emissive_appearance(icon, "fire_[GLOB.security_level]") else . += "fire_[SEC_LEVEL_GREEN]" - SSvis_overlays.add_vis_overlay(src, icon, "fire_[SEC_LEVEL_GREEN]", EMISSIVE_LAYER, EMISSIVE_PLANE, dir) + . += mutable_appearance(icon, "fire_[SEC_LEVEL_GREEN]") + . += emissive_appearance(icon, "fire_[SEC_LEVEL_GREEN]") var/area/A = src.loc A = A.loc if(!detecting || !A.fire) . += "fire_off" - SSvis_overlays.add_vis_overlay(src, icon, "fire_off", EMISSIVE_LAYER, EMISSIVE_PLANE, dir) + . += mutable_appearance(icon, "fire_off") + . += emissive_appearance(icon, "fire_off") else if(obj_flags & EMAGGED) . += "fire_emagged" - SSvis_overlays.add_vis_overlay(src, icon, "fire_emagged", EMISSIVE_LAYER, EMISSIVE_PLANE, dir) + . += mutable_appearance(icon, "fire_emagged") + . += emissive_appearance(icon, "fire_emagged") else . += "fire_on" - SSvis_overlays.add_vis_overlay(src, icon, "fire_on", EMISSIVE_LAYER, EMISSIVE_PLANE, dir) + . += mutable_appearance(icon, "fire_on") + . += emissive_appearance(icon, "fire_on") + + if(!panel_open && detecting) //It just looks horrible with the panel open + . += "fire_detected" + . += mutable_appearance(icon, "fire_detected") + . += emissive_appearance(icon, "fire_detected") //Pain /obj/machinery/firealarm/emp_act(severity) . = ..() diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 421e3433ca..03d9dcee4b 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -1,52 +1,70 @@ -// the light switch -// can have multiple per area -// can also operate on non-loc area through "otherarea" var +/// The light switch. Can have multiple per area. /obj/machinery/light_switch name = "light switch" icon = 'icons/obj/power.dmi' icon_state = "light1" - plane = ABOVE_WALL_PLANE + base_icon_state = "light" desc = "Make dark." - var/on = TRUE var/area/area = null var/otherarea = null +/obj/machinery/light_switch/directional/north + dir = SOUTH + pixel_y = 26 + +/obj/machinery/light_switch/directional/south + dir = NORTH + pixel_y = -26 + +/obj/machinery/light_switch/directional/east + dir = WEST + pixel_x = 26 + +/obj/machinery/light_switch/directional/west + dir = EAST + pixel_x = -26 + /obj/machinery/light_switch/Initialize() . = ..() - area = get_area(src) - + if(istext(area)) + area = text2path(area) + if(ispath(area)) + area = GLOB.areas_by_type[area] if(otherarea) area = locate(text2path("/area/[otherarea]")) + if(!area) + area = get_area(src) if(!name) name = "light switch ([area.name])" - on = area.lightswitch - update_icon() +/obj/machinery/light_switch/update_appearance(updates=ALL) + . = ..() + luminosity = (stat & NOPOWER) ? 0 : 1 /obj/machinery/light_switch/update_icon_state() if(stat & NOPOWER) - icon_state = "light-p" - else - if(on) - icon_state = "light1" - else - icon_state = "light0" + icon_state = "[base_icon_state]-p" + return ..() + icon_state = "[base_icon_state][area.lightswitch ? 1 : 0]" + return ..() + +/obj/machinery/light_switch/update_overlays() + . = ..() + if(!(stat & NOPOWER)) + . += emissive_appearance(icon, "[base_icon_state]-glow", alpha = src.alpha) /obj/machinery/light_switch/examine(mob/user) . = ..() - . += "It is [on? "on" : "off"]." - + . += "It is [area.lightswitch ? "on" : "off"]." /obj/machinery/light_switch/interact(mob/user) . = ..() - on = !on - area.lightswitch = on - area.update_icon() + area.lightswitch = !area.lightswitch + area.update_appearance() for(var/obj/machinery/light_switch/L in area) - L.on = on - L.update_icon() + L.update_appearance() area.power_change() @@ -58,7 +76,7 @@ else stat |= NOPOWER - update_icon() + update_appearance() /obj/machinery/light_switch/emp_act(severity) . = ..() diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 231075a27d..e346439e03 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -30,7 +30,7 @@ integrity_failure = 0.5 armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) /// Base turret icon state - var/base_icon_state = "standard" + base_icon_state = "standard" /// Scan range of the turret for locating targets var/scan_range = 7 /// For turrets inside other objects diff --git a/code/game/machinery/prisonlabor.dm b/code/game/machinery/prisonlabor.dm new file mode 100644 index 0000000000..b76a62a6be --- /dev/null +++ b/code/game/machinery/prisonlabor.dm @@ -0,0 +1,66 @@ +/obj/machinery/plate_press + name = "license plate press" + desc = "You know, we're making a lot of license plates for a station with literaly no cars in it." + icon = 'icons/obj/machines/prison.dmi' + icon_state = "offline" + use_power = IDLE_POWER_USE + idle_power_usage = 2 + active_power_usage = 50 + var/obj/item/stack/license_plates/empty/current_plate + var/pressing = FALSE + +/obj/machinery/plate_press/update_icon() + . = ..() + if(!is_operational()) + icon_state = "offline" + else if(pressing) + icon_state = "loop" + else if(current_plate) + icon_state = "online_loaded" + else + icon_state = "online" + +/obj/machinery/plate_press/Destroy() + QDEL_NULL(current_plate) + . = ..() + +/obj/machinery/plate_press/attackby(obj/item/I, mob/living/user, params) + if(!is_operational()) + to_chat(user, "[src] has to be on to do this!") + return FALSE + if(pressing) + to_chat(user, "[src] already has a plate in it!") + return FALSE + if(istype(I, /obj/item/stack/license_plates/empty)) + var/obj/item/stack/license_plates/empty/plate = I + plate.use(1) + current_plate = new plate.type(src, 1) //Spawn a new single sheet in the machine + update_icon() + else + return ..() + +/obj/machinery/plate_press/attack_hand(mob/living/user) + . = ..() + if(!pressing && current_plate) + work_press(user) + +///This proc attempts to create a plate. User cannot move during this process. +/obj/machinery/plate_press/proc/work_press(mob/living/user) + + pressing = TRUE + update_icon() + to_chat(user, "You start pressing a new license plate!") + + if(!do_after(user, 40, target = src)) + pressing = FALSE + update_icon() + return FALSE + + use_power(100) + to_chat(user, "You finish pressing a new license plate!") + + pressing = FALSE + QDEL_NULL(current_plate) + update_icon() + + new /obj/item/stack/license_plates/filled(drop_location(), 1) diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index aad011119f..d58edbd025 100755 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -1,7 +1,8 @@ /obj/machinery/recharger name = "recharger" icon = 'icons/obj/stationobjs.dmi' - icon_state = "recharger0" + icon_state = "recharger" + base_icon_state = "recharger" desc = "A charging dock for energy based weaponry." use_power = IDLE_POWER_USE idle_power_usage = 4 @@ -11,6 +12,8 @@ var/obj/item/charging = null var/recharge_coeff = 1 var/using_power = FALSE //Did we put power into "charging" last process()? + ///Did we finish recharging the currently inserted item? + var/finished_recharging = FALSE var/static/list/allowed_devices = typecacheof(list( /obj/item/gun/energy, @@ -47,13 +50,14 @@ charging = new_charging if (new_charging) START_PROCESSING(SSmachines, src) + finished_recharging = FALSE use_power = ACTIVE_POWER_USE using_power = TRUE - update_icon() + update_appearance() else use_power = IDLE_POWER_USE using_power = FALSE - update_icon() + update_appearance() /obj/machinery/recharger/Exited(atom/movable/M, atom/newloc) . = ..() @@ -99,7 +103,8 @@ return 1 if(anchored && !charging) - if(default_deconstruction_screwdriver(user, "rechargeropen", "recharger0", G)) + if(default_deconstruction_screwdriver(user, "recharger", "recharger", G)) + update_appearance() return if(panel_open && G.tool_behaviour == TOOL_CROWBAR) @@ -132,7 +137,7 @@ C.give(C.chargerate * recharge_coeff) use_power(250 * recharge_coeff) using_power = TRUE - update_icon() + update_appearance() if(istype(charging, /obj/item/ammo_box/magazine/recharge)) var/obj/item/ammo_box/magazine/recharge/R = charging @@ -140,7 +145,7 @@ R.stored_ammo += new R.ammo_type(R) use_power(200 * recharge_coeff) using_power = TRUE - update_icon() + update_appearance() return if(istype(charging, /obj/item/ammo_casing/mws_batt)) @@ -151,7 +156,7 @@ using_power = 1 if(R.BB == null) R.chargeshot() - update_icon(using_power) + update_appearance() if(istype(charging, /obj/item/ammo_box/magazine/mws_mag)) var/obj/item/ammo_box/magazine/mws_mag/R = charging @@ -163,14 +168,19 @@ using_power = 1 if(batt.BB == null) batt.chargeshot() - update_icon(using_power) + update_appearance() + + if(!using_power && !finished_recharging) //Inserted thing is at max charge/ammo, notify those around us + finished_recharging = TRUE + playsound(src, 'sound/machines/ping.ogg', 30, TRUE) + say("[charging] has finished recharging!") else return PROCESS_KILL /obj/machinery/recharger/power_change() ..() - update_icon() + update_appearance() /obj/machinery/recharger/emp_act(severity) . = ..() @@ -187,16 +197,29 @@ if(B.cell) B.cell.charge = 0 +/obj/machinery/recharger/update_appearance(updates) + . = ..() + if((stat & (NOPOWER|BROKEN)) || panel_open || !anchored) + luminosity = 0 + return + luminosity = 1 -/obj/machinery/recharger/update_icon_state() +/obj/machinery/recharger/update_overlays() + . = ..() if(stat & (NOPOWER|BROKEN) || !anchored) - icon_state = "rechargeroff" - else if(panel_open) - icon_state = "rechargeropen" - else if(charging) - if(using_power) - icon_state = "recharger1" - else - icon_state = "recharger2" - else - icon_state = "recharger0" + return + if(panel_open) + . += mutable_appearance(icon, "[base_icon_state]-open", alpha = src.alpha) + return + + if(!charging) + . += mutable_appearance(icon, "[base_icon_state]-empty", alpha = src.alpha) + . += emissive_appearance(icon, "[base_icon_state]-empty", alpha = src.alpha) + return + if(using_power) + . += mutable_appearance(icon, "[base_icon_state]-charging", alpha = src.alpha) + . += emissive_appearance(icon, "[base_icon_state]-charging", alpha = src.alpha) + return + + . += mutable_appearance(icon, "[base_icon_state]-full", alpha = src.alpha) + . += emissive_appearance(icon, "[base_icon_state]-full", alpha = src.alpha) diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 2ffd556dc1..21ef8e2dcf 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -110,7 +110,7 @@ var/list/to_eat = AM0.GetAllContents() - var/living_detected = FALSE //technically includes silicons as well but eh + var/mob/living/living_detected //technically includes silicons as well but eh var/list/nom = list() var/list/crunchy_nom = list() //Mobs have to be handled differently so they get a different list instead of checking them multiple times. @@ -120,10 +120,10 @@ var/obj/item/bodypart/head/as_head = AM var/obj/item/mmi/as_mmi = AM if(istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(AM, /obj/item/dullahan_relay)) - living_detected = TRUE + living_detected = living_detected || AM nom += AM else if(isliving(AM)) - living_detected = TRUE + living_detected = living_detected || TRUE crunchy_nom += AM var/not_eaten = to_eat.len - nom.len - crunchy_nom.len if(living_detected) // First, check if we have any living beings detected. @@ -132,7 +132,7 @@ if(isliving(CRUNCH)) // MMIs and brains will get eaten like normal items crush_living(CRUNCH) else // Stop processing right now without eating anything. - emergency_stop() + emergency_stop(living_detected) return for(var/nommed in nom) recycle_item(nommed) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 0a529cd395..17e58f2a49 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -6,6 +6,7 @@ anchored = FALSE density = TRUE interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN + use_power = NO_POWER_USE icon = 'icons/obj/atmos.dmi' icon_state = "sheater-off" name = "space heater" @@ -72,7 +73,7 @@ on = FALSE return PROCESS_KILL - if(cell && cell.charge > 0) + if(cell && cell.charge > 1 / efficiency) var/turf/L = loc PerformHeating(L) @@ -112,7 +113,9 @@ var/requiredPower = abs(env.return_temperature() - targetTemperature) * heat_capacity requiredPower = min(requiredPower, heatingPower) - if(requiredPower < 1) + if(requiredPower < 1 || !cell.use(requiredPower / efficiency)) + on = FALSE + update_icon() return var/deltaTemperature = requiredPower / heat_capacity @@ -121,7 +124,6 @@ if(deltaTemperature) env.set_temperature(env.return_temperature() + deltaTemperature) air_update_turf() - cell.use(requiredPower / efficiency) /obj/machinery/space_heater/RefreshParts() var/laser = 2 diff --git a/code/game/mecha/equipment/weapons/mecha_ammo.dm b/code/game/mecha/equipment/weapons/mecha_ammo.dm index 83a85ffcba..3253e6cbd6 100644 --- a/code/game/mecha/equipment/weapons/mecha_ammo.dm +++ b/code/game/mecha/equipment/weapons/mecha_ammo.dm @@ -12,7 +12,7 @@ var/load_audio = "sound/weapons/gun_magazine_insert_empty_1.ogg" var/ammo_type -/obj/item/mecha_ammo/proc/update_name() +/obj/item/mecha_ammo/update_name() if(!rounds) name = "empty ammo box" desc = "An exosuit ammuniton box that has since been emptied. Please recycle." diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index f8b462961b..86bbf81dd2 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -357,22 +357,22 @@ if(0.75 to INFINITY) occupant.clear_alert("charge") if(0.5 to 0.75) - occupant.throw_alert("charge", /obj/screen/alert/lowcell, 1) + occupant.throw_alert("charge", /atom/movable/screen/alert/lowcell, 1) if(0.25 to 0.5) - occupant.throw_alert("charge", /obj/screen/alert/lowcell, 2) + occupant.throw_alert("charge", /atom/movable/screen/alert/lowcell, 2) if(0.01 to 0.25) - occupant.throw_alert("charge", /obj/screen/alert/lowcell, 3) + occupant.throw_alert("charge", /atom/movable/screen/alert/lowcell, 3) else - occupant.throw_alert("charge", /obj/screen/alert/emptycell) + occupant.throw_alert("charge", /atom/movable/screen/alert/emptycell) var/integrity = obj_integrity/max_integrity*100 switch(integrity) if(30 to 45) - occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 1) + occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 1) if(15 to 35) - occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 2) + occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 2) if(-INFINITY to 15) - occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 3) + occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 3) else occupant.clear_alert("mech damage") var/atom/checking = occupant.loc diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 27b0aa4e66..afc4312779 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -73,7 +73,7 @@ M.setDir(dir) buckled_mobs |= M M.update_mobility() - M.throw_alert("buckled", /obj/screen/alert/restrained/buckled) + M.throw_alert("buckled", /atom/movable/screen/alert/restrained/buckled) post_buckle_mob(M) SEND_SIGNAL(src, COMSIG_MOVABLE_BUCKLE, M, force) diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 8f8b83bfde..66579c90f3 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -296,7 +296,7 @@ var/mob/C = pick(candidates) message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(S)])") C.transfer_ckey(S, FALSE) - var/list/policies = CONFIG_GET(keyed_list/policyconfig) + var/list/policies = CONFIG_GET(keyed_list/policy) var/policy = policies[POLICYCONFIG_ON_PYROCLASTIC_SENTIENT] if(policy) to_chat(S,policy) diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index bd32ddadf3..e5ccd9f21a 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -53,7 +53,7 @@ bloodiness = 0 /obj/effect/decal/cleanable/blood/old/Initialize(mapload, list/datum/disease/diseases) - ..() + . = ..() icon_state += "-old" add_blood_DNA(list("Non-human DNA" = "A+")) diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 6910bb1db0..a484f78b41 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -64,6 +64,10 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) name = "Assistant" icon_state = "Assistant" +/obj/effect/landmark/start/prisoner + name = "Prisoner" + icon_state = "Prisoner" + /obj/effect/landmark/start/assistant/override jobspawn_override = TRUE delete_after_roundstart = FALSE diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 5a0e1790a9..920af875d5 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -60,6 +60,48 @@ /obj/item/gun/ballistic/automatic/pistol/deagle, /obj/item/storage/box/syndie_kit/throwing_weapons = 3) +/obj/effect/spawner/lootdrop/prison_contraband + name = "prison contraband loot spawner" + loot = list(/obj/item/clothing/mask/cigarette/space_cigarette = 4, + /obj/item/clothing/mask/cigarette/robust = 2, + /obj/item/clothing/mask/cigarette/carp = 3, + /obj/item/clothing/mask/cigarette/uplift = 2, + /obj/item/clothing/mask/cigarette/dromedary = 3, + /obj/item/clothing/mask/cigarette/robustgold = 1, + /obj/item/storage/fancy/cigarettes/cigpack_uplift = 3, + /obj/item/storage/fancy/cigarettes = 3, + /obj/item/clothing/mask/cigarette/rollie/cannabis = 4, + /obj/item/toy/crayon/spraycan = 2, + /obj/item/crowbar = 1, + /obj/item/assembly/flash/handheld = 1, + /obj/item/restraints/handcuffs/cable/zipties = 1, + /obj/item/restraints/handcuffs = 1, + /obj/item/radio/off = 1, + /obj/item/lighter = 3, + /obj/item/storage/box/matches = 3, + /obj/item/reagent_containers/syringe/contraband/space_drugs = 1, + /obj/item/reagent_containers/syringe/contraband/krokodil = 1, + /obj/item/reagent_containers/syringe/contraband/crank = 1, + /obj/item/reagent_containers/syringe/contraband/methamphetamine = 1, + /obj/item/reagent_containers/syringe/contraband/bath_salts = 1, + /obj/item/reagent_containers/syringe/contraband/fentanyl = 1, + /obj/item/reagent_containers/syringe/contraband/morphine = 1, + /obj/item/storage/pill_bottle/happy = 1, + /obj/item/storage/pill_bottle/lsd = 1, + /obj/item/storage/pill_bottle/psicodine = 1, + /obj/item/reagent_containers/food/drinks/beer = 4, + /obj/item/reagent_containers/food/drinks/bottle/whiskey = 1, + /obj/item/paper/fluff/jobs/prisoner/letter = 1, + /obj/item/grenade/smokebomb = 1, + /obj/item/flashlight/seclite = 1, + /obj/item/tailclub = 1, //want to buy makeshift wooden club sprite + /obj/item/kitchen/knife/shiv = 4, + /obj/item/kitchen/knife/shiv/carrot = 1, + /obj/item/kitchen/knife = 1, + /obj/item/storage/wallet/random = 1, + /obj/item/pda = 1 + ) + /obj/effect/spawner/lootdrop/gambling name = "gambling valuables spawner" loot = list( diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index cd486ccf6b..0d6b1231fc 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -146,6 +146,9 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb var/list/grind_results //A reagent list containing the reagents this item produces when ground up in a grinder - this can be an empty list to allow for reagent transferring only var/list/juice_results //A reagent list containing blah blah... but when JUICED in a grinder! + //the outline filter on hover + var/outline_filter + /* Our block parry data. Should be set in init, or something if you are using it. * This won't be accessed without ITEM_CAN_BLOCK or ITEM_CAN_PARRY so do not set it unless you have to to save memory. * If you decide it's a good idea to leave this unset while turning the flags on, you will runtime. Enjoy. @@ -175,6 +178,12 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb if(force_string) item_flags |= FORCE_STRING_OVERRIDE + if(istype(loc, /obj/item/storage)) + item_flags |= IN_STORAGE + + if(istype(loc, /obj/item/robot_module)) + item_flags |= IN_INVENTORY + if(!hitsound) if(damtype == "fire") hitsound = 'sound/items/welder.ogg' @@ -373,6 +382,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(src)) return + remove_outline() pickup(user) add_fingerprint(user) if(!user.put_in_active_hand(src, FALSE, FALSE)) @@ -443,6 +453,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb qdel(src) item_flags &= ~IN_INVENTORY SEND_SIGNAL(src, COMSIG_ITEM_DROPPED,user) + remove_outline() // if(!silent) // playsound(src, drop_sound, DROP_SOUND_VOLUME, ignore_walls = FALSE) user?.update_equipment_speed_mods() @@ -557,6 +568,12 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb if(usr.incapacitated() || !Adjacent(usr) || usr.lying) return + if(iscyborg(usr)) + var/obj/item/gripper/gripper = usr.get_active_held_item(TRUE) + if(istype(gripper)) + gripper.pre_attack(src, usr, get_dist(src, usr)) + return + if(usr.get_active_held_item() == null) // Let me know if this has any problems -Yota usr.UnarmedAttack(src) @@ -867,18 +884,49 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb openToolTip(user,src,params,title = name,content = "[desc]
Force: [force_string]",theme = "") /obj/item/MouseEntered(location, control, params) - if((item_flags & IN_INVENTORY) && usr.client.prefs.enable_tips && !QDELETED(src)) + SEND_SIGNAL(src, COMSIG_ITEM_MOUSE_ENTER, location, control, params) + if((item_flags & IN_INVENTORY || item_flags & IN_STORAGE) && usr.client.prefs.enable_tips && !QDELETED(src)) var/timedelay = usr.client.prefs.tip_delay/100 var/user = usr tip_timer = addtimer(CALLBACK(src, .proc/openTip, location, control, params, user), timedelay, TIMER_STOPPABLE)//timer takes delay in deciseconds, but the pref is in milliseconds. dividing by 100 converts it. + var/mob/living/L = usr + if(istype(L) && (L.incapacitated() || (current_equipped_slot in L.check_obscured_slots()) || !L.canUnEquip(src))) + apply_outline(_size = 3) + else + apply_outline() + +/obj/item/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) + . = ..() + remove_outline() /obj/item/MouseExited(location,control,params) SEND_SIGNAL(src, COMSIG_ITEM_MOUSE_EXIT, location, control, params) deltimer(tip_timer)//delete any in-progress timer if the mouse is moved off the item before it finishes closeToolTip(usr) + remove_outline() -/obj/item/MouseEntered(location,control,params) - SEND_SIGNAL(src, COMSIG_ITEM_MOUSE_ENTER, location, control, params) +/obj/item/proc/apply_outline(colour = null, _size=1) + if(!(item_flags & IN_INVENTORY || item_flags & IN_STORAGE) || QDELETED(src) || isobserver(usr)) + return + if(usr.client) + if(!usr.client.prefs.outline_enabled) + return + if(!colour) + if(usr.client) + colour = usr.client.prefs.outline_color + if(!colour) + colour = COLOR_BLUE_GRAY + else + colour = COLOR_BLUE_GRAY + if(outline_filter) + filters -= outline_filter + outline_filter = filter(type="outline", size=_size, color=colour) + filters += outline_filter + +/obj/item/proc/remove_outline() + if(outline_filter) + filters -= outline_filter + outline_filter = null // Called when a mob tries to use the item as a tool. // Handles most checks. diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index c601624072..0570de6bcf 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -99,8 +99,8 @@ . = ..() if(!. && ismob(loc) && loc == usr) var/mob/M = loc - if(!M.incapacitated() && istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + if(!M.incapacitated() && istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) /obj/item/defibrillator/attackby(obj/item/W, mob/user, params) @@ -283,7 +283,7 @@ var/combat = FALSE //If it penetrates armor and gives additional functionality var/grab_ghost = FALSE var/tlimit = DEFIB_TIME_LIMIT * 10 - var/base_icon_state = "defibpaddles" + base_icon_state = "defibpaddles" var/disarm_shock_time = 10 var/wielded = FALSE // track wielded status on item @@ -620,7 +620,7 @@ if(req_defib) if(defib.healdisk) H.heal_overall_damage(25, 25) - var/list/policies = CONFIG_GET(keyed_list/policyconfig) + var/list/policies = CONFIG_GET(keyed_list/policy) var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) * 10 //the config is in seconds, not deciseconds var/late = timelimit && (tplus > timelimit) var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT] diff --git a/code/game/objects/items/devices/dogborg_sleeper.dm b/code/game/objects/items/devices/dogborg_sleeper.dm index 01970ccdbd..977029cca3 100644 --- a/code/game/objects/items/devices/dogborg_sleeper.dm +++ b/code/game/objects/items/devices/dogborg_sleeper.dm @@ -172,7 +172,7 @@ /obj/item/dogborg/sleeper/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "dogborg_sleeper", name, 375, 550) //UI DOES NOT EXIST + ui = new(user, src, "Sleeper", name) ui.open() /obj/item/dogborg/sleeper/ui_data() diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 5177224835..1e43f0f883 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -184,7 +184,7 @@ /obj/item/multitool/ai_detect/proc/show_hud(mob/user) if(user && hud_type) - var/obj/screen/plane_master/camera_static/PM = user.hud_used.plane_masters["[CAMERA_STATIC_PLANE]"] + var/atom/movable/screen/plane_master/camera_static/PM = user.hud_used.plane_masters["[CAMERA_STATIC_PLANE]"] PM.alpha = 150 var/datum/atom_hud/H = GLOB.huds[hud_type] if(!H.hudusers[user]) @@ -194,7 +194,7 @@ /obj/item/multitool/ai_detect/proc/remove_hud(mob/user) if(user && hud_type) - var/obj/screen/plane_master/camera_static/PM = user.hud_used.plane_masters["[CAMERA_STATIC_PLANE]"] + var/atom/movable/screen/plane_master/camera_static/PM = user.hud_used.plane_masters["[CAMERA_STATIC_PLANE]"] PM.alpha = 255 var/datum/atom_hud/H = GLOB.huds[hud_type] H.remove_hud_from(user) diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index e7a9d51ebe..d54911528d 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -122,7 +122,7 @@ /obj/item/paicard/proc/setPersonality(mob/living/silicon/pai/personality) src.pai = personality src.add_overlay("pai-null") - var/list/policies = CONFIG_GET(keyed_list/policyconfig) + var/list/policies = CONFIG_GET(keyed_list/policy) var/policy = policies[POLICYCONFIG_PAI] if(policy) to_chat(personality, policy) diff --git a/code/game/objects/items/devices/portable_chem_mixer.dm b/code/game/objects/items/devices/portable_chem_mixer.dm index 3e1b20cfc2..c773699b1d 100644 --- a/code/game/objects/items/devices/portable_chem_mixer.dm +++ b/code/game/objects/items/devices/portable_chem_mixer.dm @@ -130,8 +130,8 @@ . = ..() if(ismob(loc)) var/mob/M = loc - if(!M.incapacitated() && istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + if(!M.incapacitated() && istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) /obj/item/storage/portable_chem_mixer/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 54556c20b6..3ef4cb0307 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -105,6 +105,12 @@ GLOBAL_LIST_INIT(channel_tokens, list( keyslot = new /obj/item/encryptionkey/binary recalculateChannels() +/obj/item/radio/headset/headset_prisoner + name = "prison radio headset" + desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast." + icon_state = "prisoner_headset" + prison_radio = TRUE + /obj/item/radio/headset/headset_sec name = "security radio headset" desc = "This is used by your elite security force." diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index bf38bb7c6c..0bf7b13646 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -426,18 +426,21 @@ GENETICS SCANNER if(ishuman(C)) if(H.is_bleeding()) msg += "Subject is bleeding!\n" - var/blood_percent = round((C.scan_blood_volume() / (BLOOD_VOLUME_NORMAL * C.blood_ratio))*100) + var/blood_percent = round((C.scan_blood_volume() / (BLOOD_VOLUME_NORMAL * C.blood_ratio))*100) + var/integrated_blood_percent = round((C.integrating_blood / (BLOOD_VOLUME_NORMAL * C.blood_ratio))*100) var/blood_type = C.dna.blood_type if(!(blood_typepath in GLOB.blood_reagent_types)) var/datum/reagent/R = GLOB.chemical_reagents_list[blood_typepath] if(R) blood_type = R.name - if(C.scan_blood_volume() <= (BLOOD_VOLUME_SAFE*C.blood_ratio) && C.scan_blood_volume() > (BLOOD_VOLUME_OKAY*C.blood_ratio)) - msg += "LOW blood level [blood_percent] %, [C.scan_blood_volume()] cl, type: [blood_type]\n" - else if(C.scan_blood_volume() <= (BLOOD_VOLUME_OKAY*C.blood_ratio)) - msg += "CRITICAL blood level [blood_percent] %, [C.scan_blood_volume()] cl, type: [blood_type]\n" + + if((C.scan_blood_volume() + C.integrating_blood) <= (BLOOD_VOLUME_SAFE * C.blood_ratio) && (C.scan_blood_volume() + C.integrating_blood) > (BLOOD_VOLUME_OKAY*C.blood_ratio)) + msg += "LOW blood level [blood_percent] %, [C.scan_blood_volume()] cl[C.integrating_blood? ", with [integrated_blood_percent] % of it integrating, [C.integrating_blood] cl " : ""]. type: [blood_type]\n" + else if((C.scan_blood_volume() + C.integrating_blood) <= (BLOOD_VOLUME_OKAY * C.blood_ratio)) + msg += "CRITICAL blood level [blood_percent] %, [C.scan_blood_volume()] cl[C.integrating_blood? ", with [integrated_blood_percent] % of it integrating, [C.integrating_blood] cl " : ""]. type: [blood_type]\n" else - msg += "Blood level [blood_percent] %, [C.scan_blood_volume()] cl, type: [blood_type]\n" + msg += "Blood level [blood_percent] %, [C.scan_blood_volume()] cl[C.integrating_blood? ", with [integrated_blood_percent] % of it integrating, [C.integrating_blood] cl " : ""]. type: [blood_type]\n" + var/cyberimp_detect for(var/obj/item/organ/cyberimp/CI in C.internal_organs) diff --git a/code/game/objects/items/dyekit.dm b/code/game/objects/items/dyekit.dm new file mode 100644 index 0000000000..43a05c7939 --- /dev/null +++ b/code/game/objects/items/dyekit.dm @@ -0,0 +1,40 @@ +/obj/item/dyespray + name = "hair dye spray" + desc = "A spray to dye your hair any gradients you'd like." + icon = 'icons/obj/dyespray.dmi' + icon_state = "dyespray" + +/obj/item/dyespray/attack_self(mob/user) + dye(user) + +/obj/item/dyespray/pre_attack(atom/target, mob/living/user, params) + dye(target) + return ..() + +/** + * Applies a gradient and a gradient color to a mob. + * + * Arguments: + * * target - The mob who we will apply the gradient and gradient color to. + */ + +/obj/item/dyespray/proc/dye(mob/target) + if(!ishuman(target)) + return + var/mob/living/carbon/human/human_target = target + + var/new_grad_style = input(usr, "Choose a color pattern:", "Character Preference") as null|anything in GLOB.hair_gradients_list + if(!new_grad_style) + return + + var/new_grad_color = input(usr, "Choose a secondary hair color:", "Character Preference","#"+human_target.grad_color) as color|null + if(!new_grad_color) + return + + human_target.grad_style = new_grad_style + human_target.grad_color = sanitize_hexcolor(new_grad_color) + to_chat(human_target, "You start applying the hair dye...") + if(!do_after(usr, 30, target = human_target)) + return + playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 5) + human_target.update_hair() diff --git a/code/game/objects/items/gift.dm b/code/game/objects/items/gift.dm index a9ed94aae9..9f9db64873 100644 --- a/code/game/objects/items/gift.dm +++ b/code/game/objects/items/gift.dm @@ -14,7 +14,7 @@ GLOBAL_LIST_INIT(gift_item_blacklist, typecacheof(list( /obj/mafia_game_board, /obj/docking_port, /obj/shapeshift_holder, - /obj/screen + /atom/movable/screen ))) GLOBAL_LIST_EMPTY(possible_gifts) diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm index 2e7cef2c9f..5a16c24b8e 100644 --- a/code/game/objects/items/kitchen.dm +++ b/code/game/objects/items/kitchen.dm @@ -255,18 +255,31 @@ icon_state = "knife" desc = "A cyborg-mounted plasteel knife. Extremely sharp and durable." -/obj/item/kitchen/knife/carrotshiv +/obj/item/kitchen/knife/shiv + name = "glass shiv" + icon = 'icons/obj/shards.dmi' + icon_state = "shiv" + item_state = "shiv" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + desc = "A makeshift glass shiv." + force = 8 + throwforce = 12//fuck git + attack_verb = list("shanked", "shivved") + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + custom_materials = list(/datum/material/glass=400) + +/obj/item/kitchen/knife/shiv/carrot name = "carrot shiv" icon_state = "carrotshiv" item_state = "carrotshiv" - lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + icon = 'icons/obj/kitchen.dmi' desc = "Unlike other carrots, you should probably keep this far away from your eyes." - force = 8 - throwforce = 12//fuck git custom_materials = null - attack_verb = list("shanked", "shivved") - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + +/obj/item/kitchen/knife/shiv/carrot/suicide_act(mob/living/carbon/user) + user.visible_message("[user] forcefully drives \the [src] into [user.p_their()] eye! It looks like [user.p_theyre()] trying to commit suicide!") + return BRUTELOSS /obj/item/kitchen/rollingpin name = "rolling pin" diff --git a/code/game/objects/items/manuals.dm b/code/game/objects/items/manuals.dm index 0673e1d489..05b7ef4802 100644 --- a/code/game/objects/items/manuals.dm +++ b/code/game/objects/items/manuals.dm @@ -337,7 +337,7 @@ page_link = "Guide_to_chemistry" /obj/item/book/manual/wiki/chemistry/Initialize() - ..() + . = ..() new /obj/item/book/manual/wiki/cit/chemistry(loc) new /obj/item/book/manual/wiki/cit/chem_recipies(loc) diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 1be570b62b..275536d370 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -184,7 +184,7 @@ hitcost = 75 //Costs more than a standard cyborg esword w_class = WEIGHT_CLASS_NORMAL sharpness = SHARP_EDGED - light_color = "#40ceff" + light_color = LIGHT_COLOR_RED tool_behaviour = TOOL_SAW toolspeed = 0.7 diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index a04bfb365b..dbfeb9d08f 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -73,14 +73,14 @@ /datum/block_parry_data/captain_saber parry_time_windup = 0 - parry_time_active = 6 + parry_time_active = 10 parry_time_spindown = 0 parry_time_perfect = 0.75 - parry_time_perfect_leeway = 0.75 + parry_time_perfect_leeway = 1.5 parry_imperfect_falloff_percent = 30 parry_efficiency_perfect = 100 parry_failed_stagger_duration = 3 SECONDS - parry_failed_clickcd_duration = 1 SECONDS + parry_failed_clickcd_duration = 0 parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK parry_automatic_enabled = TRUE @@ -179,19 +179,23 @@ // Fast, efficient parry. /datum/block_parry_data/traitor_rapier parry_time_windup = 0 - parry_time_active = 6 + parry_time_active = 10 parry_time_spindown = 0 parry_time_active_visual_override = 3 parry_time_spindown_visual_override = 2 parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK | PARRY_LOCK_ATTACKING - parry_time_perfect = 1 - parry_time_perfect_leeway = 1 + parry_time_perfect = 2 + parry_time_perfect_leeway = 2 parry_time_perfect_leeway_override = list( TEXT_ATTACK_TYPE_PROJECTILE = 1 ) parry_imperfect_falloff_percent = 30 - parry_efficiency_to_counterattack = INFINITY + parry_efficiency_to_counterattack = 100 parry_efficiency_considered_successful = 1 + parry_data = list( + PARRY_KNOCKDOWN_ATTACKER = 10, + PARRY_DISARM_ATTACKER = TRUE + ) parry_efficiency_perfect = 100 parry_stamina_cost = 5 parry_failed_stagger_duration = 2 SECONDS diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 31481f58cf..59464d25a7 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -446,7 +446,7 @@ mood_message = null cheer_up() -/obj/item/toy/plush/proc/update_desc() +/obj/item/toy/plush/update_desc() desc = normal_desc if(mood_message) desc += mood_message @@ -466,7 +466,7 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) can_random_spawn = FALSE /obj/item/toy/plush/random/Initialize() - SHOULD_CALL_PARENT(FALSE) + ..() var/newtype var/list/snowflake_list = CONFIG_GET(keyed_list/snowflake_plushies) diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 6513b53e1d..cbfdc85f6d 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -745,9 +745,9 @@ Grippers oh god oh fuck ***********************************************************************/ -/obj/item/weapon/gripper +/obj/item/gripper name = "engineering gripper" - desc = "A simple grasping tool for interacting with various engineering related items, such as circuits, gas tanks, conveyer belts and more. Alt click to drop instead of use." + desc = "A simple grasping tool for interacting with various engineering related items, such as circuits, gas tanks, conveyer belts and more." icon = 'icons/obj/device.dmi' icon_state = "gripper" @@ -776,18 +776,29 @@ var/obj/item/wrapped = null // Item currently being held. -//Used to interact with UI's of held items, such as gas tanks and airlock electronics. -/obj/item/weapon/gripper/AltClick(mob/user) +// Used to drop whatever's in the gripper. +/obj/item/gripper/proc/drop_held(silent = FALSE) if(wrapped) wrapped.forceMove(get_turf(wrapped)) - to_chat(user, "You drop the [wrapped].") + if(!silent) + to_chat(usr, "You drop the [wrapped].") + modify_appearance(wrapped, FALSE) wrapped = null - return ..() + update_appearance() + return TRUE + return FALSE -/obj/item/weapon/gripper/pre_attack(var/atom/target, var/mob/living/silicon/robot/user, proximity, params) +/obj/item/gripper/proc/takeitem(obj/item/item, silent = FALSE) + if(!silent) + to_chat(usr, "You collect \the [item].") + item.loc = src + wrapped = item + update_appearance() - if(!proximity) - return +/obj/item/gripper/pre_attack(atom/target, mob/living/silicon/robot/user, params) + var/proximity = get_dist(user, target) + if(proximity > 1) + return STOP_ATTACK_PROC_CHAIN if(!wrapped) for(var/obj/item/thing in src.contents) @@ -795,21 +806,24 @@ break if(wrapped) //Already have an item. + var/obj/item/item = wrapped + drop_held(TRUE) //Temporary put wrapped into user so target's attackby() checks pass. - wrapped.loc = user + item.loc = user //Pass the attack on to the target. This might delete/relocate wrapped. - var/resolved = target.attackby(wrapped,user) - if(!resolved && wrapped && target) - wrapped.afterattack(target,user,1) + var/resolved = target.attackby(item, user, params) + if(!resolved && item && target) + item.afterattack(target, user, proximity, params) //If wrapped was neither deleted nor put into target, put it back into the gripper. - if(wrapped && user && (wrapped.loc == user)) - wrapped.loc = src - else - wrapped = null + if(item && user && (item.loc == user)) + takeitem(item, TRUE) return + else + item = null + return STOP_ATTACK_PROC_CHAIN - else if(istype(target,/obj/item)) + else if(isitem(target)) var/obj/item/I = target var/grab = 0 @@ -824,24 +838,94 @@ //We can grab the item, finally. if(grab) - to_chat(user, "You collect \the [I].") - I.loc = src - wrapped = I + takeitem(I) return else to_chat(user, "Your gripper cannot hold \the [target].") -/obj/item/weapon/gripper/mining +// Rare cases - meant to be handled by code\modules\mob\living\silicon\robot\robot.dm:584 and the weirdness of get_active_held_item() of borgs. +/obj/item/gripper/attack_self(mob/user) + if(wrapped) + wrapped.attack_self(user) + return + . = ..() + +// Splitable items +/obj/item/gripper/AltClick(mob/user) + if(wrapped) + wrapped.AltClick(user) + return + . = ..() + +// Even rarer cases +/obj/item/gripper/CtrlClick(mob/user) + if(wrapped) + wrapped.CtrlClick(user) + return + . = ..() + +// At this point you're just kidding me, but have this one as well. +/obj/item/gripper/CtrlShiftClick(mob/user) + if(wrapped) + wrapped.CtrlShiftClick(user) + return + . = ..() + +// Make it clear what we can do with it. +/obj/item/gripper/examine(mob/user) + . = ..() + if(wrapped) + . += "It is holding [icon2html(wrapped, user)] [wrapped]." + . += "Examine the little preview to examine it." + . += "Attempting to drop the gripper will only drop [wrapped]." + +// Resets vis_contents and if holding something, add it to vis_contents. +/obj/item/gripper/update_appearance(updates) + . = ..() + vis_contents = list() + if(wrapped) + modify_appearance(wrapped, TRUE) + vis_contents += wrapped + +// Generates the "minified" version of the item being held and adjust it's position. +/obj/item/gripper/proc/modify_appearance(obj/item, minify = FALSE) + if(minify) + var/matrix/new_transform = new + new_transform.Scale(0.5, 0.5) + item.transform = new_transform + item.pixel_x = 8 + item.pixel_y = -8 + else + item.pixel_x = initial(pixel_x) + item.pixel_y = initial(pixel_y) + item.transform = new + +// I kind of wanted the item to be held in the gripper when stored as well, but i realized "store" is just drop as well, so i'll do this for now. +// This will handle cases where the borg runs out of power or is damaged enough so the module is forcefully stored. +/obj/item/gripper/cyborg_unequip(mob/user) + . = ..() + if(wrapped) + drop_held() + +// Clear references on being destroyed +/obj/item/Destroy() + for(var/obj/item/gripper/gripper in vis_locs) + if(gripper.wrapped == src) + gripper.wrapped = null + gripper.update_appearance() + . = ..() + +/obj/item/gripper/mining name = "shelter capsule deployer" - desc = "A simple grasping tool for carrying and deploying shelter capsules. Alt click to drop instead of use." + desc = "A simple grasping tool for carrying and deploying shelter capsules." icon_state = "gripper_mining" can_hold = list( /obj/item/survivalcapsule ) -/obj/item/weapon/gripper/medical +/obj/item/gripper/medical name = "medical gripper" - desc = "A simple grasping tool for interacting with medical equipment, such as beakers, blood bags, chem bags and more. Alt click to drop instead of use." + desc = "A simple grasping tool for interacting with medical equipment, such as beakers, blood bags, chem bags and more." icon_state = "gripper_medical" can_hold = list( /obj/item/storage/bag/bio, diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index ed92623a37..88648bcbb7 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -90,7 +90,7 @@ as performing this in action() will cause the upgrade to end up in the borg inst to_chat(user, "There's no room for another VTEC unit!") return FALSE - //R.speed = -2 // Gotta go fast. + //R.vtec = -2 // Gotta go fast. //Citadel change - makes vtecs give an ability rather than reducing the borg's speed instantly VC = new /obj/effect/proc_holder/silicon/cyborg/vtecControl R.AddAbility(VC) @@ -100,7 +100,7 @@ as performing this in action() will cause the upgrade to end up in the borg inst . = ..() if (.) R.RemoveAbility(VC) - R.speed = initial(R.speed) + R.vtec = initial(R.vtec) R.cansprint = 1 /obj/item/borg/upgrade/disablercooler @@ -690,11 +690,11 @@ as performing this in action() will cause the upgrade to end up in the borg inst if(istype(user)) switch(currentState) if (0) - user.speed = initial(user.speed) + user.vtec = initial(user.vtec) if (1) - user.speed = initial(user.speed) - maxReduction * 0.5 + user.vtec = initial(user.vtec) - maxReduction * 0.5 if (2) - user.speed = initial(user.speed) - maxReduction * 1 + user.vtec = initial(user.vtec) - maxReduction * 1 action.button_icon_state = "Chevron_State_[currentState]" action.UpdateButtonIcon() diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index 9aed545509..74efe3a196 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -548,7 +548,7 @@ force = 3 throwforce = 3 throw_speed = 3 - var/base_icon_state = "eshield" // [base_icon_state]1 for expanded, [base_icon_state]0 for contracted + base_icon_state = "eshield" // [base_icon_state]1 for expanded, [base_icon_state]0 for contracted var/on_force = 10 var/on_throwforce = 8 var/on_throw_speed = 2 diff --git a/code/game/objects/items/stacks/cash.dm b/code/game/objects/items/stacks/cash.dm index 68762a63c7..382e361e8a 100644 --- a/code/game/objects/items/stacks/cash.dm +++ b/code/game/objects/items/stacks/cash.dm @@ -18,7 +18,7 @@ . = ..() update_desc() -/obj/item/stack/spacecash/proc/update_desc() +/obj/item/stack/spacecash/update_desc() var/total_worth = get_item_credit_value() desc = "It's worth [total_worth] credit[( total_worth > 1 ) ? "s" : ""]" diff --git a/code/game/objects/items/stacks/license_plates.dm b/code/game/objects/items/stacks/license_plates.dm new file mode 100644 index 0000000000..06dc86ee61 --- /dev/null +++ b/code/game/objects/items/stacks/license_plates.dm @@ -0,0 +1,30 @@ +/obj/item/stack/license_plates + name = "invalid plate" + desc = "someone fucked up" + icon = 'icons/obj/machines/prison.dmi' + icon_state = "empty_plate" + novariants = FALSE + max_amount = 50 + +/obj/item/stack/license_plates/empty + name = "empty license plate" + desc = "Instead of a license plate number, this could contain a quote like \"Live laugh love\"." + +/obj/item/stack/license_plates/empty/fifty + amount = 50 + +/obj/item/stack/license_plates/filled + name = "license plate" + desc = "Prison labor paying off." + icon_state = "filled_plate_1_1" + +///Override to allow for variations +/obj/item/stack/license_plates/filled/update_icon_state() + if(novariants) + return + if(amount <= (max_amount * (1/3))) + icon_state = "filled_plate_[rand(1,6)]_1" + else if (amount <= (max_amount * (2/3))) + icon_state = "filled_plate_[rand(1,6)]_2" + else + icon_state = "filled_plate_[rand(1,6)]_3" diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index c6763092ca..08f0a6fb7f 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -3,6 +3,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ new/datum/stack_recipe("table frame", /obj/structure/table_frame, 2, time = 10, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("scooter frame", /obj/item/scooter_frame, 10, time = 25, one_per_turf = 0), \ new/datum/stack_recipe("railing", /obj/structure/railing, 3, time = 18, window_checks = TRUE), \ + new/datum/stack_recipe("catwalk tile", /obj/item/stack/tile/catwalk, 1, 4, 20), \ )) /obj/item/stack/rods diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 6b1220743f..1f19821df6 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -13,8 +13,8 @@ * Glass sheets */ GLOBAL_LIST_INIT(glass_recipes, list ( \ - new/datum/stack_recipe("directional window", /obj/structure/window/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe("fulltile window", /obj/structure/window/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe("directional window", /obj/structure/window/unanchored, time = 10, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe("fulltile window", /obj/structure/window/fulltile/unanchored, 2, time = 20, on_floor = TRUE, window_checks = TRUE), \ null, \ new/datum/stack_recipe_list("glass working bases", list( \ new/datum/stack_recipe("chem dish", /obj/item/glasswork/glass_base/dish, 10), \ @@ -95,8 +95,8 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ GLOBAL_LIST_INIT(pglass_recipes, list ( \ - new/datum/stack_recipe("directional window", /obj/structure/window/plasma/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe("fulltile window", /obj/structure/window/plasma/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \ + new/datum/stack_recipe("directional window", /obj/structure/window/plasma/unanchored, time = 10, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe("fulltile window", /obj/structure/window/plasma/fulltile/unanchored, 2, time = 20, on_floor = TRUE, window_checks = TRUE) \ )) /obj/item/stack/sheet/plasmaglass @@ -147,10 +147,10 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ * Reinforced glass sheets */ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ - new/datum/stack_recipe("windoor frame", /obj/structure/windoor_assembly, 5, time = 0, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe("windoor frame", /obj/structure/windoor_assembly, 5, time = 20, on_floor = TRUE, window_checks = TRUE), \ null, \ - new/datum/stack_recipe("directional reinforced window", /obj/structure/window/reinforced/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/reinforced/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \ + new/datum/stack_recipe("directional reinforced window", /obj/structure/window/reinforced/unanchored, time = 10, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/reinforced/fulltile/unanchored, 2, time = 20, on_floor = TRUE, window_checks = TRUE) \ )) @@ -198,8 +198,8 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ . += GLOB.reinforced_glass_recipes GLOBAL_LIST_INIT(prglass_recipes, list ( \ - new/datum/stack_recipe("directional reinforced window", /obj/structure/window/plasma/reinforced/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/plasma/reinforced/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \ + new/datum/stack_recipe("directional reinforced window", /obj/structure/window/plasma/reinforced/unanchored, time = 10, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/plasma/reinforced/fulltile/unanchored, 2, time = 20, on_floor = TRUE, window_checks = TRUE) \ )) /obj/item/stack/sheet/plasmarglass @@ -226,7 +226,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ S.efficiency *= 1.2 GLOBAL_LIST_INIT(titaniumglass_recipes, list( - new/datum/stack_recipe("shuttle window", /obj/structure/window/shuttle/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE) + new/datum/stack_recipe("shuttle window", /obj/structure/window/shuttle/unanchored, 2, time = 20, on_floor = TRUE, window_checks = TRUE) )) /obj/item/stack/sheet/titaniumglass @@ -250,7 +250,7 @@ GLOBAL_LIST_INIT(titaniumglass_recipes, list( S.efficiency *= 1.5 GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( - new/datum/stack_recipe("plastitanium window", /obj/structure/window/plastitanium/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE) + new/datum/stack_recipe("plastitanium window", /obj/structure/window/plastitanium/unanchored, 2, time = 20, on_floor = TRUE, window_checks = TRUE) )) /obj/item/stack/sheet/plastitaniumglass @@ -355,7 +355,19 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( /obj/item/shard/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/lightreplacer)) - I.attackby(src, user) + var/obj/item/lightreplacer/L = I + L.attackby(src, user) + else if(istype(I, /obj/item/stack/sheet/cloth)) + var/obj/item/stack/sheet/cloth/C = I + to_chat(user, "You begin to wrap the [C] around the [src]...") + if(do_after(user, 35, target = src)) + var/obj/item/kitchen/knife/shiv/S = new /obj/item/kitchen/knife/shiv + C.use(1) + to_chat(user, "You wrap the [C] around the [src] forming a makeshift weapon.") + remove_item_from_storage(src) + qdel(src) + user.put_in_hands(S) + else return ..() diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 15153521ed..504bff9e29 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -502,6 +502,8 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ new /datum/stack_recipe("sterile masks box", /obj/item/storage/box/masks), \ new /datum/stack_recipe("body bag box", /obj/item/storage/box/bodybags), \ new /datum/stack_recipe("prescription glasses box", /obj/item/storage/box/rxglasses), \ + new /datum/stack_recipe("oxygen tank box", /obj/item/storage/box/emergencytank), \ + new /datum/stack_recipe("extended oxygen tank box", /obj/item/storage/box/engitank), \ null, \ new /datum/stack_recipe("disk box", /obj/item/storage/box/disks), \ new /datum/stack_recipe("light tubes box", /obj/item/storage/box/lights/tubes), \ diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index d126e39873..266d8b7b86 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -48,7 +48,7 @@ amount -= max_amount new type(loc, max_amount, FALSE) if(!merge_type) - merge_type = type + merge_type = src.type if(LAZYLEN(mats_per_unit)) set_mats_per_unit(mats_per_unit, 1) diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 8b272f98b4..6eac04b976 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -555,3 +555,10 @@ color = "#92661A" turf_type = /turf/open/floor/bronze custom_materials = list(/datum/material/bronze = 250) + +/obj/item/stack/tile/catwalk + name = "catwalk tile" + singular_name = "catwalk floor tile" + desc = "Flooring that shows its contents underneath. Engineers love it!" + icon_state = "catwalk_tile" + turf_type = /turf/open/floor/plating/catwalk_floor diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index f10167890a..8a3eedca4b 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -259,8 +259,8 @@ /obj/item/storage/backpack/satchel/bone name = "bone satchel" desc = "A grotesque satchel made of sinews and bones." - icon = 'icons/obj/mining.dmi' - icon_state = "goliath_saddle" + icon_state = "satchel-bone" + item_state = "satchel-bone" slot_flags = ITEM_SLOT_BACK /obj/item/storage/backpack/satchel/bone/ComponentInitialize() diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index cb619a711b..6bb501807d 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -317,7 +317,7 @@ * Trays - Agouri */ /obj/item/storage/bag/tray - name = "tray" + name = "serving tray" icon = 'icons/obj/food/containers.dmi' icon_state = "tray" desc = "A metal tray to lay food on." @@ -377,6 +377,12 @@ . = ..() update_icon() +/obj/item/storage/bag/tray/cafeteria + name = "cafeteria tray" + icon = 'icons/obj/food/containers.dmi' + icon_state = "foodtray" + desc = "A cheap metal tray to pile today's meal onto." + //bluespace tray, holds more items /obj/item/storage/bag/tray/bluespace name = "bluespace tray" diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index ea40b49c5f..8b897cb6e5 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -102,12 +102,22 @@ new /obj/item/disk/nanite_program(src) // Ordinary survival box +/obj/item/storage/box/survival + name = "survival box" + desc = "A box with the bare essentials of ensuring the survival of you and others." + icon_state = "internals" + illustration = "emergencytank" + var/mask_type = /obj/item/clothing/mask/breath + var/internal_type = /obj/item/tank/internals/emergency_oxygen + var/medipen_type = /obj/item/reagent_containers/hypospray/medipen + /obj/item/storage/box/survival/PopulateContents() - new /obj/item/clothing/mask/breath(src) - new /obj/item/reagent_containers/hypospray/medipen(src) + new mask_type(src) + if(!isnull(medipen_type)) + new medipen_type(src) if(!isplasmaman(loc)) - new /obj/item/tank/internals/emergency_oxygen(src) + new internal_type(src) else new /obj/item/tank/internals/plasmaman/belt(src) @@ -115,10 +125,13 @@ ..() // we want the survival stuff too. new /obj/item/radio/off(src) -/obj/item/storage/box/survival_mining/PopulateContents() - new /obj/item/clothing/mask/gas/explorer(src) +// Mining survival box +/obj/item/storage/box/survival/mining + mask_type = /obj/item/clothing/mask/gas/explorer + +/obj/item/storage/box/survival/mining/PopulateContents() + ..() new /obj/item/crowbar/red(src) - new /obj/item/reagent_containers/hypospray/medipen(src) if(!isplasmaman(loc)) new /obj/item/tank/internals/emergency_oxygen(src) @@ -126,39 +139,30 @@ new /obj/item/tank/internals/plasmaman/belt(src) // Engineer survival box -/obj/item/storage/box/engineer/PopulateContents() - new /obj/item/clothing/mask/breath(src) - new /obj/item/reagent_containers/hypospray/medipen(src) +/obj/item/storage/box/survival/engineer + name = "extended-capacity survival box" + desc = "A box with the bare essentials of ensuring the survival of you and others. This one is labelled to contain an extended-capacity tank." + illustration = "extendedtank" + internal_type = /obj/item/tank/internals/emergency_oxygen/engi - if(!isplasmaman(loc)) - new /obj/item/tank/internals/emergency_oxygen/engi(src) - else - new /obj/item/tank/internals/plasmaman/belt(src) - -/obj/item/storage/box/engineer/radio/PopulateContents() +/obj/item/storage/box/survival/engineer/radio/PopulateContents() ..() // we want the regular items too. new /obj/item/radio/off(src) // Syndie survival box -/obj/item/storage/box/syndie/PopulateContents() - new /obj/item/clothing/mask/gas/syndicate(src) - - if(!isplasmaman(loc)) - new /obj/item/tank/internals/emergency_oxygen/engi(src) - else - new /obj/item/tank/internals/plasmaman/belt(src) +/obj/item/storage/box/survival/syndie //why is this its own thing if it's just the engi box with a syndie mask and medipen? + name = "extended-capacity survival box" + desc = "A box with the bare essentials of ensuring the survival of you and others. This one is labelled to contain an extended-capacity tank." + illustration = "extendedtank" + mask_type = /obj/item/clothing/mask/gas/syndicate + internal_type = /obj/item/tank/internals/emergency_oxygen/engi + medipen_type = null // Security survival box -/obj/item/storage/box/security/PopulateContents() - new /obj/item/clothing/mask/gas/sechailer(src) - new /obj/item/reagent_containers/hypospray/medipen(src) +/obj/item/storage/box/survival/security + mask_type = /obj/item/clothing/mask/gas/sechailer - if(!isplasmaman(loc)) - new /obj/item/tank/internals/emergency_oxygen(src) - else - new /obj/item/tank/internals/plasmaman/belt(src) - -/obj/item/storage/box/security/radio/PopulateContents() +/obj/item/storage/box/survival/security/radio/PopulateContents() ..() // we want the regular stuff too new /obj/item/radio/off(src) @@ -1244,6 +1248,26 @@ icon_state = "box_pink" illustration = null +/obj/item/storage/box/emergencytank + name = "emergency oxygen tank box" + desc = "A box of emergency oxygen tanks." + illustration = "emergencytank" + +/obj/item/storage/box/emergencytank/PopulateContents() + ..() + for(var/i in 1 to 7) + new /obj/item/tank/internals/emergency_oxygen(src) //in case anyone ever wants to do anything with spawning them, apart from crafting the box + +/obj/item/storage/box/engitank + name = "extended-capacity emergency oxygen tank box" + desc = "A box of extended-capacity emergency oxygen tanks." + illustration = "extendedtank" + +/obj/item/storage/box/engitank/PopulateContents() + ..() + for(var/i in 1 to 7) + new /obj/item/tank/internals/emergency_oxygen/engi(src) //in case anyone ever wants to do anything with spawning them, apart from crafting the box + /obj/item/storage/box/mre //base MRE type. name = "Nanotrasen MRE Ration Kit Menu 0" desc = "A package containing food suspended in an outdated bluespace pocket which lasts for centuries. If you're lucky you may even be able to enjoy the meal without getting food poisoning." diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index a733c282c6..62bde0e4e6 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -16,7 +16,7 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) attack_speed = CLICK_CD_MELEE - var/stamina_loss_amount = 35 + var/stamina_loss_amount = 40 var/turned_on = FALSE var/knockdown = TRUE /// block percent needed to prevent knockdown/disarm @@ -25,7 +25,7 @@ var/hitcost = 750 var/throw_hit_chance = 35 var/preload_cell_type //if not empty the baton starts with this type of cell - var/cooldown_duration = 5 SECONDS //How long our baton rightclick goes on cooldown for after applying a knockdown + var/cooldown_duration = 3.5 SECONDS //How long our baton rightclick goes on cooldown for after applying a knockdown var/status_duration = 5 SECONDS //how long our status effects last for otherwise COOLDOWN_DECLARE(shove_cooldown) diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index 16a91b6358..ad9c8edf8f 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -80,8 +80,8 @@ /obj/item/watertank/MouseDrop(obj/over_object) var/mob/M = loc - if(istype(M) && istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + if(istype(M) && istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) return ..() diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 454016d9e7..547217366b 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -889,8 +889,8 @@ M.put_in_hands(src) to_chat(usr, "You pick up the deck.") - else if(istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + else if(istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object if(M.putItemFromInventoryInHandIfPossible(src, H.held_index)) to_chat(usr, "You pick up the deck.") diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index cc2e6412eb..78a5c9ece9 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -22,6 +22,8 @@ //returns the damage value of the attack after processing the obj's various armor protections /obj/proc/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir, armour_penetration = 0) + if(damage_flag == MELEE && damage_amount < damage_deflection) + return 0 switch(damage_type) if(BRUTE) if(BURN) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index ca4428db57..58c571d9e6 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -20,6 +20,9 @@ var/max_integrity = 500 var/integrity_failure = 0 //0 if we have no special broken behavior, otherwise is a percentage of at what point the obj breaks. 0.5 being 50% + ///Damage under this value will be completely ignored + var/damage_deflection = 0 + var/resistance_flags = NONE // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF var/persistence_replacement //have something WAY too amazing to live to the next round? Set a new path here. Overuse of this var will make me upset. diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 00c4b1f7db..4e57a2f717 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -86,7 +86,7 @@ . += "off" . += "sparking" //Overlay is similar enough for both that we can use the same mask for both - SSvis_overlays.add_vis_overlay(src, icon, "locked", EMISSIVE_LAYER, EMISSIVE_PLANE, dir, alpha) + . += emissive_appearance(icon, "locked", alpha = src.alpha) . += locked ? "locked" : "unlocked" @@ -356,7 +356,7 @@ return /obj/structure/closet/MouseDrop_T(atom/movable/O, mob/living/user) - if(!istype(O) || O.anchored || istype(O, /obj/screen)) + if(!istype(O) || O.anchored || istype(O, /atom/movable/screen)) return if(!istype(user) || user.incapacitated() || user.lying) return @@ -531,7 +531,7 @@ /obj/structure/closet/get_remote_view_fullscreens(mob/user) if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS))) - user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1) + user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 1) /obj/structure/closet/emp_act(severity) . = ..() diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 1d23903d03..02ee466376 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -7,7 +7,7 @@ new /obj/item/clothing/neck/petcollar(src) //I considered removing the pet stuff too but eh, who knows. We might get Renault back. Plus I guess you could use that collar for... other means. Aren't you supposed to be guarding the disk? new /obj/item/pet_carrier(src) new /obj/item/clothing/suit/armor/vest/capcarapace(src) - new /obj/item/clothing/suit/armor/vest/capcarapace/alt(src) + new /obj/item/clothing/suit/toggle/captains_parade(src) new /obj/item/clothing/head/crown/fancy(src) new /obj/item/cartridge/captain(src) new /obj/item/storage/box/silver_ids(src) @@ -56,6 +56,7 @@ /obj/structure/closet/secure_closet/hos/PopulateContents() ..() new /obj/item/clothing/neck/cloak/hos(src) + new /obj/item/clothing/suit/toggle/armor/hos/hos_formal(src) new /obj/item/cartridge/hos(src) new /obj/item/radio/headset/heads/hos(src) new /obj/item/clothing/under/rank/security/head_of_security/parade/female(src) @@ -191,6 +192,7 @@ new /obj/item/clothing/under/rank/prisoner( src ) new /obj/item/clothing/under/rank/prisoner/skirt( src ) new /obj/item/clothing/shoes/sneakers/orange( src ) + new /obj/item/radio/headset/headset_prisoner( src ) /obj/structure/closet/secure_closet/courtroom name = "courtroom locker" diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 030f7f4edf..f6153330e4 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -106,6 +106,16 @@ name = "trash cart" icon_state = "trashcart" +/obj/structure/closet/crate/trashcart/Moved() + . = ..() + if(has_gravity()) + playsound(src, 'sound/effects/roll.ogg', 100, TRUE) + +/obj/structure/closet/crate/trashcart/laundry + name = "laundry cart" + desc = "A large cart for hauling around large amounts of laundry." + icon_state = "laundry" + /obj/structure/closet/crate/medical desc = "A medical crate." name = "medical crate" diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index aba3b743bb..d03e0fd57e 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -269,7 +269,7 @@ . += get_airlock_overlay("glass_construction", overlays_file) . += get_airlock_overlay("panel_c[state+1]", overlays_file) -/obj/structure/door_assembly/proc/update_name() +/obj/structure/door_assembly/update_name() name = "" switch(state) if(AIRLOCK_ASSEMBLY_NEEDS_WIRES) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 82ca59161c..4980981574 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -139,7 +139,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an /obj/structure/bodycontainer/get_remote_view_fullscreens(mob/user) if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS))) - user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 2) + user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 2) /* * Morgue */ diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 6356424aaf..065c0d2f28 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -243,6 +243,32 @@ new framestack(T, framestackamount) qdel(src) + +/** + * Gets all connected tables + * Cardinals only + */ +/obj/structure/table/proc/connected_floodfill(max = 25) + . = list() + connected_floodfill_internal(., list()) + +/obj/structure/table/proc/connected_floodfill_internal(list/out = list(), list/processed = list()) + if(processed[src]) + return + processed[src] = TRUE + out += src + var/obj/structure/table/other +#define RUN_TABLE(dir) \ + other = locate(/obj/structure/table) in get_step(src, dir); \ + if(other) { \ + other.connected_floodfill_internal(out, processed); \ + } + RUN_TABLE(NORTH) + RUN_TABLE(SOUTH) + RUN_TABLE(EAST) + RUN_TABLE(WEST) +#undef RUN_TABLE + /obj/structure/table/greyscale icon = 'icons/obj/smooth_structures/table_greyscale.dmi' icon_state = "table" diff --git a/code/game/turfs/open/floor/catwalk_plating.dm b/code/game/turfs/open/floor/catwalk_plating.dm new file mode 100644 index 0000000000..c6bfdc0448 --- /dev/null +++ b/code/game/turfs/open/floor/catwalk_plating.dm @@ -0,0 +1,44 @@ +/** + * ## catwalk flooring + * + * They show what's underneath their catwalk flooring (pipes and the like) + * you can crowbar it to interact with the underneath stuff without destroying the tile... + * unless you want to! + */ +/turf/open/floor/plating/catwalk_floor + icon = 'icons/turf/floors/catwalk_plating.dmi' + icon_state = "catwalk_below" + floor_tile = /obj/item/stack/tile/catwalk + name = "catwalk floor" + desc = "Flooring that shows its contents underneath. Engineers love it!" + baseturfs = /turf/open/floor/plating + footstep = FOOTSTEP_CATWALK + barefootstep = FOOTSTEP_CATWALK + clawfootstep = FOOTSTEP_CATWALK + heavyfootstep = FOOTSTEP_CATWALK + var/covered = TRUE + +/turf/open/floor/plating/catwalk_floor/Initialize() + . = ..() + layer = CATWALK_LAYER + update_icon(UPDATE_OVERLAYS) + +/turf/open/floor/plating/catwalk_floor/update_overlays() + . = ..() + var/static/catwalk_overlay + if(isnull(catwalk_overlay)) + catwalk_overlay = iconstate2appearance(icon, "catwalk_above") + if(covered) + . += catwalk_overlay + +/turf/open/floor/plating/catwalk_floor/screwdriver_act(mob/living/user, obj/item/tool) + . = ..() + covered = !covered + to_chat(user, span_notice("[!covered ? "You removed the cover!" : "You added the cover!"]")) + update_icon(UPDATE_OVERLAYS) + +/turf/open/floor/plating/catwalk_floor/pry_tile(obj/item/crowbar, mob/user, silent) + if(covered) + to_chat(user, span_notice("You need to remove the cover first!")) + return FALSE + . = ..() diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index 82e60ed8f6..11f2918bcf 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -263,7 +263,7 @@ /turf/open/floor/padded name = "padded floor" - desc = "Keeps crazy people from hurting themselves. It's soft, plush, and very nice to get shoved agaisnt." + desc = "Keeps crazy people from hurting themselves. It's soft, plush, and very nice to get shoved against." icon = 'icons/turf/floors.dmi' icon_state = "floor_padded" floor_tile = /obj/item/stack/tile/padded diff --git a/code/game/turfs/simulated/water.dm b/code/game/turfs/simulated/water.dm index 708ca230b1..72612f82ff 100644 --- a/code/game/turfs/simulated/water.dm +++ b/code/game/turfs/simulated/water.dm @@ -15,3 +15,7 @@ barefootstep = FOOTSTEP_WATER clawfootstep = FOOTSTEP_WATER heavyfootstep = FOOTSTEP_WATER + +/turf/open/water/decorative + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + planetary_atmos = FALSE diff --git a/code/game/world.dm b/code/game/world.dm index f466913346..14a85bb619 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -16,7 +16,7 @@ GLOBAL_LIST(topic_status_cache) call(debug_server, "auxtools_init")() enable_debugging() AUXTOOLS_CHECK(AUXMOS) -#ifdef REFERENCE_TRACKING +#ifdef EXTOOLS_REFERENCE_TRACKING enable_reference_tracking() #endif world.Profile(PROFILE_START) diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm index cc59fe10ab..a5e31e595c 100644 --- a/code/modules/VR/vr_sleeper.dm +++ b/code/modules/VR/vr_sleeper.dm @@ -75,6 +75,9 @@ /obj/machinery/vr_sleeper/MouseDrop_T(mob/target, mob/user) if(user.lying || !iscarbon(target) || !Adjacent(target) || !user.canUseTopic(src, BE_CLOSE, TRUE, NO_TK)) return + if(occupant) + to_chat(user, "The VR Sleeper is already occupied!") + return close_machine(target) ui_interact(user) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 22bbf03014..437c74991c 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -195,7 +195,7 @@ GLOBAL_PROTECT(admin_verbs_debug) // #endif /datum/admins/proc/create_or_modify_area, /datum/admins/proc/fixcorruption, -#ifdef REFERENCE_TRACKING +#ifdef EXTOOLS_REFERENCE_TRACKING /datum/admins/proc/view_refs, /datum/admins/proc/view_del_failures, #endif diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 953835bff0..4224b406b3 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2862,7 +2862,7 @@ return if(!CONFIG_GET(string/centcom_ban_db)) - to_chat(usr, "Centcom Galactic Ban DB is disabled!") + to_chat(usr, span_warning("Centcom Galactic Ban DB is disabled!")) return var/ckey = href_list["centcomlookup"] @@ -2889,8 +2889,19 @@ dat += "
0 bans detected for [ckey]
" else bans = json_decode(response["body"]) - dat += "
[bans.len] ban\s detected for [ckey]
" + + //Ignore bans from non-whitelisted sources, if a whitelist exists + var/list/valid_sources + if(CONFIG_GET(string/centcom_source_whitelist)) + valid_sources = splittext(CONFIG_GET(string/centcom_source_whitelist), ",") + dat += "
Bans detected for [ckey]
" + else + //Ban count is potentially inaccurate if they're using a whitelist + dat += "
[bans.len] ban\s detected for [ckey]
" + for(var/list/ban in bans) + if(valid_sources && !(ban["sourceName"] in valid_sources)) + continue dat += "Server: [sanitize(ban["sourceName"])]
" dat += "RP Level: [sanitize(ban["sourceRoleplayLevel"])]
" dat += "Type: [sanitize(ban["type"])]
" diff --git a/code/modules/admin/view_variables/reference_tracking.dm b/code/modules/admin/view_variables/reference_tracking.dm index 279654eec1..714b54cd45 100644 --- a/code/modules/admin/view_variables/reference_tracking.dm +++ b/code/modules/admin/view_variables/reference_tracking.dm @@ -1,4 +1,4 @@ -#ifdef REFERENCE_TRACKING +#ifdef EXTOOLS_REFERENCE_TRACKING GLOBAL_LIST_EMPTY(deletion_failures) @@ -102,29 +102,21 @@ GLOBAL_LIST_EMPTY(deletion_failures) #endif -#ifdef LEGACY_REFERENCE_TRACKING +#ifdef REFERENCE_TRACKING -/datum/verb/legacy_find_refs() - set category = "Debug" - set name = "Find References" - set src in world - - find_references_legacy(FALSE) - - -/datum/proc/find_references_legacy(skip_alert) +/datum/proc/find_references(skip_alert) running_find_references = type if(usr?.client) if(usr.client.running_find_references) - testing("CANCELLED search for references to a [usr.client.running_find_references].") + log_reftracker("CANCELLED search for references to a [usr.client.running_find_references].") usr.client.running_find_references = null running_find_references = null //restart the garbage collector SSgarbage.can_fire = TRUE - SSgarbage.next_fire = world.time + world.tick_lag + SSgarbage.update_nextfire(reset_time = TRUE) return - if(!skip_alert && alert("Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", "Yes", "No") != "Yes") + if(!skip_alert && tgui_alert(usr,"Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", list("Yes", "No")) != "Yes") running_find_references = null return @@ -134,92 +126,122 @@ GLOBAL_LIST_EMPTY(deletion_failures) if(usr?.client) usr.client.running_find_references = type - testing("Beginning search for references to a [type].") - last_find_references = world.time + log_reftracker("Beginning search for references to a [type].") + + var/starting_time = world.time + + //Time to search the whole game for our ref + DoSearchVar(GLOB, "GLOB") //globals + log_reftracker("Finished searching globals") - DoSearchVar(GLOB) //globals for(var/datum/thing in world) //atoms (don't beleive its lies) - DoSearchVar(thing, "World -> [thing]") + DoSearchVar(thing, "World -> [thing.type]", search_time = starting_time) + log_reftracker("Finished searching atoms") for(var/datum/thing) //datums - DoSearchVar(thing, "World -> [thing]") + DoSearchVar(thing, "Datums -> [thing.type]", search_time = starting_time) + log_reftracker("Finished searching datums") + //Warning, attempting to search clients like this will cause crashes if done on live. Watch yourself for(var/client/thing) //clients - DoSearchVar(thing, "World -> [thing]") + DoSearchVar(thing, "Clients -> [thing.type]", search_time = starting_time) + log_reftracker("Finished searching clients") + + log_reftracker("Completed search for references to a [type].") - testing("Completed search for references to a [type].") if(usr?.client) usr.client.running_find_references = null running_find_references = null //restart the garbage collector SSgarbage.can_fire = TRUE - SSgarbage.next_fire = world.time + world.tick_lag + SSgarbage.update_nextfire(reset_time = TRUE) +/datum/proc/DoSearchVar(potential_container, container_name, recursive_limit = 64, search_time = world.time) + #ifdef REFERENCE_TRACKING_DEBUG + if(!found_refs && SSgarbage.should_save_refs) + found_refs = list() + #endif -/datum/verb/qdel_then_find_references() - set category = "Debug" - set name = "qdel() then Find References" - set src in world - - qdel(src, TRUE) //force a qdel - if(!running_find_references) - find_references_legacy(TRUE) - - -/datum/verb/qdel_then_if_fail_find_references() - set category = "Debug" - set name = "qdel() then Find References if GC failure" - set src in world - - qdel_and_find_ref_if_fail(src, TRUE) - - -/datum/proc/DoSearchVar(potential_container, container_name, recursive_limit = 64) if(usr?.client && !usr.client.running_find_references) return if(!recursive_limit) + log_reftracker("Recursion limit reached. [container_name]") return - if(istype(potential_container, /datum)) - var/datum/datum_container = potential_container - if(datum_container.last_find_references == last_find_references) - return - - datum_container.last_find_references = last_find_references - var/list/vars_list = datum_container.vars - - for(var/varname in vars_list) - if (varname == "vars") - continue - var/variable = vars_list[varname] - - if(variable == src) - testing("Found [type] \ref[src] in [datum_container.type]'s [varname] var. [container_name]") - - else if(islist(variable)) - DoSearchVar(variable, "[container_name] -> list", recursive_limit - 1) - - else if(islist(potential_container)) - var/normal = IS_NORMAL_LIST(potential_container) - for(var/element_in_list in potential_container) - if(element_in_list == src) - testing("Found [type] \ref[src] in list [container_name].") - - else if(element_in_list && !isnum(element_in_list) && normal && potential_container[element_in_list] == src) - testing("Found [type] \ref[src] in list [container_name]\[[element_in_list]\]") - - else if(islist(element_in_list)) - DoSearchVar(element_in_list, "[container_name] -> list", recursive_limit - 1) - + //Check each time you go down a layer. This makes it a bit slow, but it won't effect the rest of the game at all #ifndef FIND_REF_NO_CHECK_TICK CHECK_TICK #endif + if(istype(potential_container, /datum)) + var/datum/datum_container = potential_container + if(datum_container.last_find_references == search_time) + return + + datum_container.last_find_references = search_time + var/list/vars_list = datum_container.vars + + for(var/varname in vars_list) + #ifndef FIND_REF_NO_CHECK_TICK + CHECK_TICK + #endif + if (varname == "vars" || varname == "vis_locs") //Fun fact, vis_locs don't count for references + continue + var/variable = vars_list[varname] + + if(variable == src) + #ifdef REFERENCE_TRACKING_DEBUG + if(SSgarbage.should_save_refs) + found_refs[varname] = TRUE + #endif + log_reftracker("Found [type] \ref[src] in [datum_container.type]'s \ref[datum_container] [varname] var. [container_name]") + continue + + if(islist(variable)) + DoSearchVar(variable, "[container_name] \ref[datum_container] -> [varname] (list)", recursive_limit - 1, search_time) + + else if(islist(potential_container)) + var/normal = IS_NORMAL_LIST(potential_container) + var/list/potential_cache = potential_container + for(var/element_in_list in potential_cache) + #ifndef FIND_REF_NO_CHECK_TICK + CHECK_TICK + #endif + //Check normal entrys + if(element_in_list == src) + #ifdef REFERENCE_TRACKING_DEBUG + if(SSgarbage.should_save_refs) + found_refs[potential_cache] = TRUE + #endif + log_reftracker("Found [type] \ref[src] in list [container_name].") + continue + + var/assoc_val = null + if(!isnum(element_in_list) && normal) + assoc_val = potential_cache[element_in_list] + //Check assoc entrys + if(assoc_val == src) + #ifdef REFERENCE_TRACKING_DEBUG + if(SSgarbage.should_save_refs) + found_refs[potential_cache] = TRUE + #endif + log_reftracker("Found [type] \ref[src] in list [container_name]\[[element_in_list]\]") + continue + //We need to run both of these checks, since our object could be hiding in either of them + //Check normal sublists + if(islist(element_in_list)) + DoSearchVar(element_in_list, "[container_name] -> [element_in_list] (list)", recursive_limit - 1, search_time) + //Check assoc sublists + if(islist(assoc_val)) + DoSearchVar(potential_container[element_in_list], "[container_name]\[[element_in_list]\] -> [assoc_val] (list)", recursive_limit - 1, search_time) /proc/qdel_and_find_ref_if_fail(datum/thing_to_del, force = FALSE) - SSgarbage.reference_find_on_fail[REF(thing_to_del)] = TRUE - qdel(thing_to_del, force) + thing_to_del.qdel_and_find_ref_if_fail(force) + +/datum/proc/qdel_and_find_ref_if_fail(force = FALSE) + SSgarbage.reference_find_on_fail["\ref[src]"] = TRUE + qdel(src, force) #endif diff --git a/code/modules/admin/view_variables/topic_basic.dm b/code/modules/admin/view_variables/topic_basic.dm index 01b5536948..043c50173d 100644 --- a/code/modules/admin/view_variables/topic_basic.dm +++ b/code/modules/admin/view_variables/topic_basic.dm @@ -47,7 +47,7 @@ usr.client.debug_variables(src) return - #ifdef REFERENCE_TRACKING + #ifdef EXTOOLS_REFERENCE_TRACKING if(href_list[VV_HK_VIEW_REFERENCES]) var/datum/D = locate(href_list[VV_HK_TARGET]) if(!D) diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm index aed096e9df..d0002d1f4a 100644 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ b/code/modules/antagonists/abductor/equipment/gland.dm @@ -61,7 +61,7 @@ active_mind_control = TRUE message_admins("[key_name(user)] sent an abductor mind control message to [key_name(owner)]: [command]") update_gland_hud() - var/obj/screen/alert/mind_control/mind_alert = owner.throw_alert("mind_control", /obj/screen/alert/mind_control) + var/atom/movable/screen/alert/mind_control/mind_alert = owner.throw_alert("mind_control", /atom/movable/screen/alert/mind_control) mind_alert.command = command addtimer(CALLBACK(src, .proc/clear_mind_control), mind_control_duration) return TRUE diff --git a/code/modules/antagonists/abductor/equipment/glands/heal.dm b/code/modules/antagonists/abductor/equipment/glands/heal.dm index 5ea8f77d6c..8917e1661e 100644 --- a/code/modules/antagonists/abductor/equipment/glands/heal.dm +++ b/code/modules/antagonists/abductor/equipment/glands/heal.dm @@ -144,7 +144,7 @@ owner.Stun(15) owner.adjustToxLoss(-15, TRUE, TRUE) - owner.blood_volume = min(BLOOD_VOLUME_NORMAL, owner.blood_volume + 20) + owner.adjust_integration_blood(20) if(owner.blood_volume < BLOOD_VOLUME_NORMAL) keep_going = TRUE diff --git a/code/modules/antagonists/abductor/equipment/glands/mindshock.dm b/code/modules/antagonists/abductor/equipment/glands/mindshock.dm index fa63e2c82a..cb3bb50b1e 100644 --- a/code/modules/antagonists/abductor/equipment/glands/mindshock.dm +++ b/code/modules/antagonists/abductor/equipment/glands/mindshock.dm @@ -43,7 +43,7 @@ message_admins("[key_name(user)] broadcasted an abductor mind control message from [key_name(owner)] to [key_name(H)]: [command]") - var/obj/screen/alert/mind_control/mind_alert = H.throw_alert("mind_control", /obj/screen/alert/mind_control) + var/atom/movable/screen/alert/mind_control/mind_alert = H.throw_alert("mind_control", /atom/movable/screen/alert/mind_control) mind_alert.command = command if(LAZYLEN(broadcasted_mobs)) diff --git a/code/modules/antagonists/abductor/equipment/glands/quantum.dm b/code/modules/antagonists/abductor/equipment/glands/quantum.dm index fc1ddae030..eade62b1bb 100644 --- a/code/modules/antagonists/abductor/equipment/glands/quantum.dm +++ b/code/modules/antagonists/abductor/equipment/glands/quantum.dm @@ -35,7 +35,7 @@ if(entangled_mob && ishuman(entangled_mob) && (entangled_mob.stat < DEAD)) to_chat(entangled_mob, "You suddenly feel an irresistible compulsion to follow an order...") to_chat(entangled_mob, "[command]") - var/obj/screen/alert/mind_control/mind_alert = entangled_mob.throw_alert("mind_control", /obj/screen/alert/mind_control) + var/atom/movable/screen/alert/mind_control/mind_alert = entangled_mob.throw_alert("mind_control", /atom/movable/screen/alert/mind_control) mind_alert.command = command message_admins("[key_name(owner)] mirrored an abductor mind control message to [key_name(entangled_mob)]: [command]") update_gland_hud() diff --git a/code/modules/antagonists/blob/blob/blobs/factory.dm b/code/modules/antagonists/blob/blob/blobs/factory.dm index 284a43562e..dfb3c6d71b 100644 --- a/code/modules/antagonists/blob/blob/blobs/factory.dm +++ b/code/modules/antagonists/blob/blob/blobs/factory.dm @@ -26,7 +26,7 @@ if(naut) naut.factory = null to_chat(naut, "Your factory was destroyed! You feel yourself dying!") - naut.throw_alert("nofactory", /obj/screen/alert/nofactory) + naut.throw_alert("nofactory", /atom/movable/screen/alert/nofactory) spores = null return ..() diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index 3e358cd795..29e64a4913 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -89,6 +89,7 @@ owner.current.adjustStaminaLoss(-1.5 + (actual_regen * -7) * mult, 0) // Humans lose stamina damage really quickly. Vamps should heal more. owner.current.adjustCloneLoss(-0.1 * (actual_regen * 2) * mult, 0) owner.current.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * (actual_regen * 4) * mult) + owner.current.integrating_blood = 0 // No Bleeding /*if(ishuman(owner.current)) //NOTE Current bleeding is horrible, not to count the amount of blood ballistics delete. var/mob/living/carbon/human/H = owner.current diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index 5af2a49b1b..07c92bfd97 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -670,9 +670,9 @@ #define ui_vamprank_display "WEST:6,CENTER-2:-5" // 2 tiles down /datum/hud - var/obj/screen/bloodsucker/blood_counter/blood_display - var/obj/screen/bloodsucker/rank_counter/vamprank_display - var/obj/screen/bloodsucker/sunlight_counter/sunlight_display + var/atom/movable/screen/bloodsucker/blood_counter/blood_display + var/atom/movable/screen/bloodsucker/rank_counter/vamprank_display + var/atom/movable/screen/bloodsucker/sunlight_counter/sunlight_display /datum/antagonist/bloodsucker/proc/add_hud() return @@ -708,36 +708,36 @@ owner.current.hud_used.vamprank_display.icon_state = (bloodsucker_level_unspent > 0) ? "rank_up" : "rank" -/obj/screen/bloodsucker +/atom/movable/screen/bloodsucker invisibility = INVISIBILITY_ABSTRACT -/obj/screen/bloodsucker/proc/clear() +/atom/movable/screen/bloodsucker/proc/clear() invisibility = INVISIBILITY_ABSTRACT -/obj/screen/bloodsucker/proc/update_counter(value, valuecolor) +/atom/movable/screen/bloodsucker/proc/update_counter(value, valuecolor) invisibility = 0 -/obj/screen/bloodsucker/blood_counter +/atom/movable/screen/bloodsucker/blood_counter icon = 'icons/mob/actions/bloodsucker.dmi' name = "Blood Consumed" icon_state = "blood_display" screen_loc = ui_blood_display -/obj/screen/bloodsucker/blood_counter/update_counter(value, valuecolor) +/atom/movable/screen/bloodsucker/blood_counter/update_counter(value, valuecolor) ..() maptext = "
[round(value,1)]
" -/obj/screen/bloodsucker/rank_counter +/atom/movable/screen/bloodsucker/rank_counter name = "Bloodsucker Rank" icon = 'icons/mob/actions/bloodsucker.dmi' icon_state = "rank" screen_loc = ui_vamprank_display -/obj/screen/bloodsucker/rank_counter/update_counter(value, valuecolor) +/atom/movable/screen/bloodsucker/rank_counter/update_counter(value, valuecolor) ..() maptext = "
[round(value,1)]
" -/obj/screen/bloodsucker/sunlight_counter +/atom/movable/screen/bloodsucker/sunlight_counter icon = 'icons/mob/actions/bloodsucker.dmi' name = "Solar Flare Timer" icon_state = "sunlight_night" @@ -761,7 +761,7 @@ owner.current.hud_used.sunlight_display.icon_state = "sunlight_" + (amDay ? "day":"night") -/obj/screen/bloodsucker/sunlight_counter/update_counter(value, valuecolor) +/atom/movable/screen/bloodsucker/sunlight_counter/update_counter(value, valuecolor) ..() maptext = "
[value]
" diff --git a/code/modules/antagonists/bloodsucker/datum_hunter.dm b/code/modules/antagonists/bloodsucker/datum_hunter.dm index c0933d8a3c..b221a83a60 100644 --- a/code/modules/antagonists/bloodsucker/datum_hunter.dm +++ b/code/modules/antagonists/bloodsucker/datum_hunter.dm @@ -109,13 +109,13 @@ /datum/status_effect/agent_pinpointer/hunter_edition - alert_type = /obj/screen/alert/status_effect/agent_pinpointer/hunter_edition + alert_type = /atom/movable/screen/alert/status_effect/agent_pinpointer/hunter_edition minimum_range = HUNTER_SCAN_MIN_DISTANCE tick_interval = HUNTER_SCAN_PING_TIME duration = 160 // Lasts 10s range_fuzz_factor = 5//PINPOINTER_EXTRA_RANDOM_RANGE -/obj/screen/alert/status_effect/agent_pinpointer/hunter_edition +/atom/movable/screen/alert/status_effect/agent_pinpointer/hunter_edition name = "Monster Tracking" desc = "You always know where the hellspawn are." diff --git a/code/modules/antagonists/bloodsucker/datum_vassal.dm b/code/modules/antagonists/bloodsucker/datum_vassal.dm index 91e89e71e6..5162897d60 100644 --- a/code/modules/antagonists/bloodsucker/datum_vassal.dm +++ b/code/modules/antagonists/bloodsucker/datum_vassal.dm @@ -110,13 +110,13 @@ /datum/status_effect/agent_pinpointer/vassal_edition id = "agent_pinpointer" - alert_type = /obj/screen/alert/status_effect/agent_pinpointer/vassal_edition + alert_type = /atom/movable/screen/alert/status_effect/agent_pinpointer/vassal_edition minimum_range = VASSAL_SCAN_MIN_DISTANCE tick_interval = VASSAL_SCAN_PING_TIME duration = -1 // runs out fast range_fuzz_factor = 0 -/obj/screen/alert/status_effect/agent_pinpointer/vassal_edition +/atom/movable/screen/alert/status_effect/agent_pinpointer/vassal_edition name = "Blood Bond" desc = "You always know where your master is." //icon = 'icons/obj/device.dmi' diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index 843e5c6db2..8e6b5c9060 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -297,8 +297,14 @@ prof.socks = H.socks prof.socks_color = H.socks_color - var/list/slots = list("head", "wear_mask", "back", "wear_suit", "w_uniform", "shoes", "belt", "gloves", "glasses", "ears", "wear_id", "s_store") - for(var/slot in slots) + var/datum/icon_snapshot/entry = new + entry.name = H.name + entry.icon = H.icon + entry.icon_state = H.icon_state + entry.overlays = H.get_overlays_copy(list(HANDS_LAYER, HANDCUFF_LAYER, LEGCUFF_LAYER)) + prof.profile_snapshot = entry + + for(var/slot in GLOB.slots) if(slot in H.vars) var/obj/item/I = H.vars[slot] if(!I) @@ -518,6 +524,9 @@ var/socks var/socks_color + /// Icon snapshot of the profile + var/datum/icon_snapshot/profile_snapshot + /datum/changelingprofile/Destroy() qdel(dna) . = ..() @@ -535,13 +544,14 @@ newprofile.underwear = underwear newprofile.undershirt = undershirt newprofile.socks = socks - + newprofile.profile_snapshot = profile_snapshot /datum/antagonist/changeling/xenobio name = "Xenobio Changeling" give_objectives = FALSE show_in_roundend = FALSE //These are here for admin tracking purposes only you_are_greet = FALSE + antag_moodlet = FALSE /datum/antagonist/changeling/roundend_report() var/list/parts = list() diff --git a/code/modules/antagonists/changeling/powers/adrenaline.dm b/code/modules/antagonists/changeling/powers/adrenaline.dm index 32171a036a..643458d05a 100644 --- a/code/modules/antagonists/changeling/powers/adrenaline.dm +++ b/code/modules/antagonists/changeling/powers/adrenaline.dm @@ -13,5 +13,5 @@ //Recover from stuns. /obj/effect/proc_holder/changeling/adrenaline/sting_action(mob/living/user) - user.do_adrenaline(0, FALSE, 70, 0, TRUE, list(/datum/reagent/medicine/epinephrine = 3, /datum/reagent/drug/methamphetamine/changeling = 10, /datum/reagent/medicine/changelingadrenaline = 5), "Energy rushes through us.", 0, 0.75, 0) + user.do_adrenaline(0, FALSE, 70, 0, TRUE, list(/datum/reagent/medicine/epinephrine = 3, /datum/reagent/medicine/changelinghaste = 10, /datum/reagent/medicine/changelingadrenaline = 5), "Energy rushes through us.", 0, 0.75, 0) return TRUE diff --git a/code/modules/antagonists/changeling/powers/humanform.dm b/code/modules/antagonists/changeling/powers/humanform.dm index c38bfe3b5b..c9edc12eeb 100644 --- a/code/modules/antagonists/changeling/powers/humanform.dm +++ b/code/modules/antagonists/changeling/powers/humanform.dm @@ -10,15 +10,8 @@ //Transform into a human. /obj/effect/proc_holder/changeling/humanform/sting_action(mob/living/carbon/user) var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) - var/list/names = list() - for(var/datum/changelingprofile/prof in changeling.stored_profiles) - names += "[prof.name]" - var/chosen_name = input("Select the target DNA: ", "Target DNA", null) as null|anything in names - if(!chosen_name) - return - - var/datum/changelingprofile/chosen_prof = changeling.get_dna(chosen_name) + var/datum/changelingprofile/chosen_prof = changeling.select_dna() if(!chosen_prof) return if(!user || user.mob_transforming) diff --git a/code/modules/antagonists/changeling/powers/pheromone_receptors.dm b/code/modules/antagonists/changeling/powers/pheromone_receptors.dm index 3d54c19350..3bda7335a1 100644 --- a/code/modules/antagonists/changeling/powers/pheromone_receptors.dm +++ b/code/modules/antagonists/changeling/powers/pheromone_receptors.dm @@ -30,7 +30,7 @@ //Modified IA pinpointer - Points to the NEAREST changeling, but will only get you within a few tiles of the target. //You'll still have to rely on intuition and observation to make the identification. Lings can 'hide' in public places. /datum/status_effect/agent_pinpointer/changeling - alert_type = /obj/screen/alert/status_effect/agent_pinpointer/changeling + alert_type = /atom/movable/screen/alert/status_effect/agent_pinpointer/changeling minimum_range = CHANGELING_PHEROMONE_MIN_DISTANCE tick_interval = CHANGELING_PHEROMONE_PING_TIME range_fuzz_factor = 0 @@ -55,6 +55,6 @@ scan_target = null -/obj/screen/alert/status_effect/agent_pinpointer/changeling +/atom/movable/screen/alert/status_effect/agent_pinpointer/changeling name = "Pheromone Scent" desc = "The nose always knows." diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index a8fe56aae7..9bda1bf5b9 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -78,7 +78,7 @@ if(changeling.chosen_sting) unset_sting(user) return - selected_dna = changeling.select_dna("Select the target DNA: ", "Target DNA") + selected_dna = changeling.select_dna() if(!selected_dna) return if(NOTRANSSTING in selected_dna.dna.species.species_traits) diff --git a/code/modules/antagonists/changeling/powers/transform.dm b/code/modules/antagonists/changeling/powers/transform.dm index 8e3a36740b..cfd42f05cf 100644 --- a/code/modules/antagonists/changeling/powers/transform.dm +++ b/code/modules/antagonists/changeling/powers/transform.dm @@ -134,7 +134,7 @@ //Change our DNA to that of somebody we've absorbed. /obj/effect/proc_holder/changeling/transform/sting_action(mob/living/carbon/human/user) var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) - var/datum/changelingprofile/chosen_prof = changeling.select_dna("Select the target DNA: ", "Target DNA") + var/datum/changelingprofile/chosen_prof = changeling.select_dna() if(!chosen_prof) return @@ -142,15 +142,21 @@ changeling_transform(user, chosen_prof) return TRUE -/datum/antagonist/changeling/proc/select_dna(var/prompt, var/title) +/** + * Gives a changeling a list of all possible dnas in their profiles to choose from and returns profile containing their chosen dna + */ +/datum/antagonist/changeling/proc/select_dna() var/mob/living/carbon/user = owner.current if(!istype(user)) return - var/list/names = list("Drop Flesh Disguise") - for(var/datum/changelingprofile/prof in stored_profiles) - names += "[prof.name]" + var/list/disguises = list("Drop Flesh Disguise" = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_drop")) + for(var/datum/changelingprofile/current_profile in stored_profiles) + var/datum/icon_snapshot/snap = current_profile.profile_snapshot + var/image/disguise_image = image(icon = snap.icon, icon_state = snap.icon_state) + disguise_image.overlays = snap.overlays + disguises[current_profile.name] = disguise_image - var/chosen_name = input(prompt, title, null) as null|anything in names + var/chosen_name = show_radial_menu(user, user, disguises, custom_check = CALLBACK(src, .proc/check_menu, user), radius = 40, require_near = TRUE, tooltips = TRUE) if(!chosen_name) return @@ -158,6 +164,21 @@ for(var/slot in GLOB.slots) if(istype(user.vars[slot], GLOB.slot2type[slot])) qdel(user.vars[slot]) + return var/datum/changelingprofile/prof = get_dna(chosen_name) return prof + +/** + * Checks if we are allowed to interact with a radial menu + * + * Arguments: + * * user The carbon mob interacting with the menu + */ +/datum/antagonist/changeling/proc/check_menu(mob/living/carbon/user) + if(!istype(user)) + return FALSE + var/datum/antagonist/changeling/changeling_datum = user.mind.has_antag_datum(/datum/antagonist/changeling) + if(!changeling_datum) + return FALSE + return TRUE diff --git a/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm b/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm index 1da49efe3c..3609037f58 100644 --- a/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm +++ b/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm @@ -69,7 +69,7 @@ do_sparks(5, TRUE, AM) if(isliving(AM)) var/mob/living/L = AM - L.overlay_fullscreen("flash", /obj/screen/fullscreen/flash/static) + L.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash/static) L.clear_fullscreen("flash", 5) var/obj/item/transfer_valve/TTV = locate() in L.GetAllContents() if(TTV) diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index 4b88d203d6..1e8c7242ad 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -111,6 +111,19 @@ sigil_name = "Sigil of Submission" var/glow_type = /obj/effect/temp_visual/ratvar/sigil/submission +/obj/effect/clockwork/sigil/submission/Crossed(atom/movable/AM) + . = ..() + if(istype(AM, /obj/item/aicard)) + var/obj/item/aicard/cardy = AM + if(!cardy.AI) + return + var/mob/living/silicon/ai/aiconvert = cardy.AI + if(aiconvert.stat > stat_affected) + return + if(is_servant_of_ratvar(aiconvert) || !(aiconvert.mind || aiconvert.has_status_effect(STATUS_EFFECT_SIGILMARK))) + return + sigil_effects(aiconvert) + /obj/effect/clockwork/sigil/submission/sigil_effects(mob/living/L) var/turf/T = get_turf(src) var/has_sigil = FALSE diff --git a/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm index 2a916c7a2f..5e25b8de82 100644 --- a/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm +++ b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm @@ -97,18 +97,18 @@ id = "wraith_spectacles" duration = -1 //remains until eye damage done reaches 0 while the glasses are not worn tick_interval = 20 - alert_type = /obj/screen/alert/status_effect/wraith_spectacles + alert_type = /atom/movable/screen/alert/status_effect/wraith_spectacles var/eye_damage_done = 0 var/nearsight_breakpoint = 30 var/blind_breakpoint = 45 -/obj/screen/alert/status_effect/wraith_spectacles +/atom/movable/screen/alert/status_effect/wraith_spectacles name = "Wraith Spectacles" desc = "You shouldn't actually see this, as it should be procedurally generated." icon_state = "wraithspecs" alerttooltipstyle = "clockcult" -/obj/screen/alert/status_effect/wraith_spectacles/MouseEntered(location,control,params) +/atom/movable/screen/alert/status_effect/wraith_spectacles/MouseEntered(location,control,params) var/mob/living/carbon/human/L = usr if(istype(L)) //this is probably more safety than actually needed var/datum/status_effect/wraith_spectacles/W = attached_effect diff --git a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm index 8fcc36a456..6204871a77 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm @@ -141,7 +141,7 @@ if(isliving(M.current) && M.current.stat != DEAD) var/turf/t_turf = isAI(M.current) ? get_step(get_step(src, NORTH),NORTH) : get_turf(src) // AI too fat, must make sure it always ends up a 2 tiles north instead of on the ark. do_teleport(M.current, t_turf, channel = TELEPORT_CHANNEL_CULT, forced = TRUE) - M.current.overlay_fullscreen("flash", /obj/screen/fullscreen/flash) + M.current.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash) M.current.clear_fullscreen("flash", 5) playsound(src, 'sound/magic/clockwork/invoke_general.ogg', 50, FALSE) recalls_remaining-- @@ -253,7 +253,7 @@ purpose_fulfilled = TRUE make_glow() animate(glow, transform = matrix() * 1.5, alpha = 255, time = 125) - sound_to_playing_players(volume = 100, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/ratvar_rises.ogg')) //End the sounds + sound_to_playing_players('sound/effects/ratvar_rises.ogg', 90, FALSE, channel = CHANNEL_JUSTICAR_ARK) sleep(125) make_glow() animate(glow, transform = matrix() * 3, alpha = 0, time = 5) @@ -311,26 +311,26 @@ var/turf/T = get_turf(M) if(is_servant_of_ratvar(M) && (!T || T.z != z)) M.forceMove(get_step(src, SOUTH)) - M.overlay_fullscreen("flash", /obj/screen/fullscreen/flash) + M.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash) M.clear_fullscreen("flash", 5) progress_in_seconds += GATEWAY_SUMMON_RATE switch(progress_in_seconds) if(-INFINITY to GATEWAY_REEBE_FOUND) if(!second_sound_played) sound_to_playing_players('sound/magic/clockwork/invoke_general.ogg', 30, FALSE) - sound_to_playing_players(volume = 10, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_charging.ogg', TRUE)) + sound_to_playing_players('sound/effects/clockcult_gateway_charging.ogg', 10, FALSE, channel = CHANNEL_JUSTICAR_ARK) second_sound_played = TRUE make_glow() glow.icon_state = "clockwork_gateway_charging" if(GATEWAY_REEBE_FOUND to GATEWAY_RATVAR_COMING) if(!third_sound_played) - sound_to_playing_players(volume = 30, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_active.ogg', TRUE)) + sound_to_playing_players('sound/effects/clockcult_gateway_active.ogg', 30, FALSE, channel = CHANNEL_JUSTICAR_ARK) third_sound_played = TRUE make_glow() glow.icon_state = "clockwork_gateway_active" if(GATEWAY_RATVAR_COMING to GATEWAY_RATVAR_ARRIVAL) if(!fourth_sound_played) - sound_to_playing_players(volume = 70, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_closing.ogg', TRUE)) + sound_to_playing_players('sound/effects/clockcult_gateway_closing.ogg', 70, FALSE, channel = CHANNEL_JUSTICAR_ARK) fourth_sound_played = TRUE make_glow() glow.icon_state = "clockwork_gateway_closing" diff --git a/code/modules/antagonists/clockcult/clockcult.dm b/code/modules/antagonists/clockcult/clockcult.dm index 6f91299cdb..8bf26d6397 100644 --- a/code/modules/antagonists/clockcult/clockcult.dm +++ b/code/modules/antagonists/clockcult/clockcult.dm @@ -136,7 +136,7 @@ hierophant_network.span_for_name = "nezbere" hierophant_network.span_for_message = "brass" hierophant_network.Grant(current) - current.throw_alert("clockinfo", /obj/screen/alert/clockwork/infodump) + current.throw_alert("clockinfo", /atom/movable/screen/alert/clockwork/infodump) var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.ark_of_the_clockwork_justiciar if(G && G.active && ishuman(current)) current.add_overlay(mutable_appearance('icons/effects/genetics.dmi', "servitude", -ANTAG_LAYER)) diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 568f01ab83..9bd1030685 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -687,10 +687,10 @@ if(H.stat == DEAD) to_chat(user,"Only a revive rune can bring back the dead!") return - if(H.blood_volume < (BLOOD_VOLUME_SAFE*H.blood_ratio)) + if(H.functional_blood() < (BLOOD_VOLUME_SAFE*H.blood_ratio)) var/restore_blood = (BLOOD_VOLUME_SAFE*H.blood_ratio) - H.blood_volume - if(uses*2 < restore_blood) - H.blood_volume += uses*2 + if(uses * 2 < restore_blood) + H.adjust_integration_blood(uses * 2) to_chat(user,"You use the last of your blood rites to restore what blood you could!") uses = 0 return ..() diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index 0cc0ed133e..a18523069e 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -124,7 +124,7 @@ communion.Grant(current) if(ishuman(current)) magic.Grant(current) - current.throw_alert("bloodsense", /obj/screen/alert/bloodsense) + current.throw_alert("bloodsense", /atom/movable/screen/alert/bloodsense) if(cult_team?.cult_risen) cult_team.rise(current) if(cult_team.cult_ascendent) diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index a0093e4da1..a2f283ec67 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -219,7 +219,7 @@ if(M.health < M.maxHealth) M.adjustHealth(-3) if(ishuman(L) && L.blood_volume < (BLOOD_VOLUME_NORMAL * L.blood_ratio)) - L.blood_volume += 1.0 + L.adjust_integration_blood(1.0) CHECK_TICK diff --git a/code/modules/antagonists/devil/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm index 069080170e..ac1e5630da 100644 --- a/code/modules/antagonists/devil/true_devil/_true_devil.dm +++ b/code/modules/antagonists/devil/true_devil/_true_devil.dm @@ -104,7 +104,7 @@ /mob/living/carbon/true_devil/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) return 666 -/mob/living/carbon/true_devil/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash, override_protection = 0) +/mob/living/carbon/true_devil/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/flash, override_protection = 0) if(mind && has_bane(BANE_LIGHT)) mind.disrupt_spells(-500) return ..() //flashes don't stop devils UNLESS it's their bane. diff --git a/code/modules/antagonists/eldritch_cult/eldritch_items.dm b/code/modules/antagonists/eldritch_cult/eldritch_items.dm index 87a4ddf7eb..28228aedd6 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_items.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_items.dm @@ -260,7 +260,7 @@ if((IS_HERETIC(local_user) || IS_HERETIC_MONSTER(local_user)) && HAS_TRAIT(src,TRAIT_NODROP)) REMOVE_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT) - for(var/mob/living/carbon/human/human_in_range in spiral_range(9,local_user)) + for(var/mob/living/carbon/human/human_in_range in viewers(9,local_user)) if(IS_HERETIC(human_in_range) || IS_HERETIC_MONSTER(human_in_range)) continue diff --git a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm index 4d6576ee92..158acc0071 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm @@ -147,7 +147,7 @@ carbon_target.blood_volume -= 20 if(carbon_user.blood_volume < BLOOD_VOLUME_MAXIMUM) //we dont want to explode after all - carbon_user.blood_volume += 20 + carbon_user.adjust_integration_blood(20) return /obj/effect/proc_holder/spell/pointed/blood_siphon/can_target(atom/target, mob/user, silent) diff --git a/code/modules/antagonists/fugitive/fugitive_outfits.dm b/code/modules/antagonists/fugitive/fugitive_outfits.dm index 242a7cc7fd..7648196f3e 100644 --- a/code/modules/antagonists/fugitive/fugitive_outfits.dm +++ b/code/modules/antagonists/fugitive/fugitive_outfits.dm @@ -2,7 +2,7 @@ name = "Prison Escapee" uniform = /obj/item/clothing/under/rank/prisoner shoes = /obj/item/clothing/shoes/sneakers/orange - r_pocket = /obj/item/kitchen/knife + r_pocket = /obj/item/kitchen/knife/shiv /datum/outfit/prisoner/post_equip(mob/living/carbon/human/H, visualsOnly=FALSE) if(visualsOnly) diff --git a/code/modules/antagonists/morph/morph.dm b/code/modules/antagonists/morph/morph.dm index 077c380ef0..8352b8f238 100644 --- a/code/modules/antagonists/morph/morph.dm +++ b/code/modules/antagonists/morph/morph.dm @@ -38,7 +38,7 @@ var/atom/movable/form = null var/morph_time = 0 var/static/list/blacklist_typecache = typecacheof(list( - /obj/screen, + /atom/movable/screen, /obj/singularity, /mob/living/simple_animal/hostile/morph, /obj/effect, diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index f616f2c848..09e97fba06 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -35,9 +35,9 @@ healable = 0 environment_smash = ENVIRONMENT_SMASH_STRUCTURES obj_damage = 50 - melee_damage_lower = 22.5 // reduced from 30 to 22.5 with wounds since they get big buffs to slicing wounds - melee_damage_upper = 22.5 - wound_bonus = -10 + melee_damage_lower = 30 // buffed back to 30, the wounds don't do much + melee_damage_upper = 30 + wound_bonus = 0 bare_wound_bonus = 0 sharpness = SHARP_EDGED see_in_dark = 8 @@ -49,17 +49,13 @@ Pulling a dead or unconscious mob while you enter a pool will pull them in with you, allowing you to feast and regain your health. \ You move quickly upon leaving a pool of blood, but the material world will soon sap your strength and leave you sluggish. \ You gain strength the more attacks you land on live humanoids, though this resets when you return to the blood zone. You can also \ - launch a devastating slam attack with ctrl+shift+click, capable of smashing bones in one strike." + launch a devastating slam attack, capable of smashing bones in one strike." loot = list(/obj/effect/decal/cleanable/blood, \ /obj/effect/decal/cleanable/blood/innards, \ /obj/item/organ/heart/demon) del_on_death = 1 deathmessage = "screams in anger as it collapses into a puddle of viscera!" - // How long it takes for the alt-click slam attack to come off cooldown - var/slam_cooldown_time = 45 SECONDS - // The actual instance var for the cooldown - var/slam_cooldown = 0 // How many times we have hit humanoid targets since we last bloodcrawled, scaling wounding power var/current_hitstreak = 0 // How much both our wound_bonus and bare_wound_bonus go up per hitstreak hit @@ -70,37 +66,56 @@ var/list/consumed_mobs = list() //buffs only happen when hearts are eaten, so this needs to be kept track separately var/consumed_buff = 0 + //slam mode for action button + var/slam_mode = FALSE + var/datum/action/cooldown/slam /mob/living/simple_animal/slaughter/Initialize() ..() var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new AddSpell(bloodspell) + slam = new /datum/action/cooldown/slam + slam.Grant(src) if(istype(loc, /obj/effect/dummy/phased_mob/slaughter)) bloodspell.phased = TRUE -/mob/living/simple_animal/slaughter/CtrlShiftClickOn(atom/A) - if(!isliving(A)) - return ..() - if(slam_cooldown + slam_cooldown_time > world.time) - to_chat(src, "Your slam ability is still on cooldown!") - return - if(!isopenturf(loc)) - to_chat(src, "You need to be on open flooring to do that!") - return +/datum/action/cooldown/slam + name = "Slaughter Slam" + desc = "Launch enemies and break bones in one strike." + icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' + background_icon_state = "bg_demon" + button_icon_state = "slam" + cooldown_time = 45 SECONDS - face_atom(A) - var/mob/living/victim = A - victim.take_bodypart_damage(brute=20, wound_bonus=wound_bonus) // don't worry, there's more punishment when they hit something - visible_message("[src] slams into [victim] with monstrous strength!", "You slam into [victim] with monstrous strength!", ignored_mobs=victim) - to_chat(victim, "[src] slams into you with monstrous strength, sending you flying like a ragdoll!") - var/turf/yeet_target = get_edge_target_turf(victim, dir) - victim.throw_at(yeet_target, 10, 5, src) - slam_cooldown = world.time - log_combat(src, victim, "slaughter slammed") +/datum/action/cooldown/slam/Trigger() + . = ..() + if(!.) + return + var/mob/living/simple_animal/slaughter/user = owner + user.slam_mode = !user.slam_mode + to_chat(user, user.slam_mode ? "Ready to slam!" : "Maybe not now.") /mob/living/simple_animal/slaughter/UnarmedAttack(atom/A, proximity) if(iscarbon(A)) var/mob/living/carbon/target = A + if(slam_mode) + if(!isopenturf(loc)) + to_chat(src, "You need to be on open flooring to do that!") + return + face_atom(A) + var/mob/living/victim = A + var/body_pick = pick(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_ARM, BODY_ZONE_R_LEG) + var/datum/wound/blunt/critical/wound_major = new + var/obj/item/bodypart/body_wound = victim.get_bodypart(body_pick) + wound_major.apply_wound(body_wound) + visible_message("[src] slams into [victim] with monstrous strength!", "You slam into [victim] with monstrous strength!", ignored_mobs=victim) + to_chat(victim, "[src] slams into you with monstrous strength, sending you flying like a ragdoll!") + var/turf/yeet_target = get_edge_target_turf(victim, dir) + victim.throw_at(yeet_target, 10, 14, src) + slam_mode = FALSE + slam.StartCooldown() + log_combat(src, victim, "slaughter slammed") + if(target.stat != DEAD && target.mind && current_hitstreak < wound_bonus_hitstreak_max) current_hitstreak++ wound_bonus += wound_bonus_per_hit @@ -129,13 +144,12 @@ /mob/living/simple_animal/slaughter/proc/release_victims() if(!consumed_mobs) return - + var/turf/T = get_turf(src) + if(!T) + T = find_safe_turf() for(var/mob/living/M in consumed_mobs) if(!M) continue - var/turf/T = find_safe_turf() - if(!T) - T = get_turf(src) M.forceMove(T) /mob/living/simple_animal/slaughter/proc/refresh_consumed_buff() @@ -263,12 +277,12 @@ if(!consumed_mobs) return + var/turf/T = get_turf(src) + if(!T) + T = find_safe_turf() for(var/mob/living/M in consumed_mobs) if(!M) - continue - var/turf/T = find_safe_turf() - if(!T) - T = get_turf(src) + continue M.forceMove(T) if(M.revive(full_heal = TRUE, admin_revive = TRUE)) M.grab_ghost(force = TRUE) diff --git a/code/modules/antagonists/traitor/IAA/internal_affairs.dm b/code/modules/antagonists/traitor/IAA/internal_affairs.dm index ff012e556a..4414fe8257 100644 --- a/code/modules/antagonists/traitor/IAA/internal_affairs.dm +++ b/code/modules/antagonists/traitor/IAA/internal_affairs.dm @@ -42,12 +42,12 @@ id = "agent_pinpointer" duration = -1 tick_interval = PINPOINTER_PING_TIME - alert_type = /obj/screen/alert/status_effect/agent_pinpointer + alert_type = /atom/movable/screen/alert/status_effect/agent_pinpointer var/minimum_range = PINPOINTER_MINIMUM_RANGE var/range_fuzz_factor = PINPOINTER_EXTRA_RANDOM_RANGE var/mob/scan_target = null -/obj/screen/alert/status_effect/agent_pinpointer +/atom/movable/screen/alert/status_effect/agent_pinpointer name = "Internal Affairs Integrated Pinpointer" desc = "Even stealthier than a normal implant." icon = 'icons/obj/device.dmi' diff --git a/code/modules/antagonists/traitor/classes/traitor_class.dm b/code/modules/antagonists/traitor/classes/traitor_class.dm index 6aaa0b41c8..bcc6fc18dd 100644 --- a/code/modules/antagonists/traitor/classes/traitor_class.dm +++ b/code/modules/antagonists/traitor/classes/traitor_class.dm @@ -45,5 +45,5 @@ GLOBAL_LIST_EMPTY(traitor_classes) /datum/traitor_class/proc/clean_up_traitor(datum/antagonist/traitor/T) // Any effects that need to be cleaned up if traitor class is being swapped. -/datum/traitor_class/proc/on_process(/datum/antagonist/traitor/T) +/datum/traitor_class/proc/on_process(datum/antagonist/traitor/T) // only for processing traitor classes; runs once an SSprocessing tick diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index c328fa232d..d4d70cd053 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -224,7 +224,7 @@ if(target.type == /mob/living/simple_animal/hostile/construct/shade) //Make sure we remember which body belonged to the shade var/mob/living/simple_animal/hostile/construct/shade/shade = target newstruct.original_mind = shade.original_mind - var/obj/screen/alert/bloodsense/BS + var/atom/movable/screen/alert/bloodsense/BS if(newstruct.mind && ((stoner && iscultist(stoner)) || cultoverride) && SSticker?.mode) SSticker.mode.add_cultist(newstruct.mind, 0) if(iscultist(stoner) || cultoverride) @@ -232,7 +232,7 @@ else if(stoner) to_chat(newstruct, "You are still bound to serve your creator, [stoner], follow [stoner.p_their()] orders and help [stoner.p_them()] complete [stoner.p_their()] goals at all costs.") newstruct.clear_alert("bloodsense") - BS = newstruct.throw_alert("bloodsense", /obj/screen/alert/bloodsense) + BS = newstruct.throw_alert("bloodsense", /atom/movable/screen/alert/bloodsense) if(BS) BS.Cviewer = newstruct newstruct.cancel_camera() diff --git a/code/modules/arousal/genitals.dm b/code/modules/arousal/genitals.dm index 723049a784..bfcaff7d56 100644 --- a/code/modules/arousal/genitals.dm +++ b/code/modules/arousal/genitals.dm @@ -27,6 +27,12 @@ if(do_update) update() +/obj/item/organ/genital/Destroy() + if(linked_organ?.linked_organ == src) + linked_organ.linked_organ = null + linked_organ = null + . = ..() + /obj/item/organ/genital/proc/set_aroused_state(new_state,cause = "manual toggle") if(!(genital_flags & GENITAL_CAN_AROUSE)) return FALSE @@ -150,7 +156,7 @@ /obj/item/organ/genital/proc/update_size() return -/obj/item/organ/genital/proc/update_appearance() +/obj/item/organ/genital/proc/update_appearance_genitals() if(!owner || owner.stat == DEAD) aroused_state = FALSE @@ -187,7 +193,7 @@ . = ..() if(.) update() - RegisterSignal(owner, COMSIG_MOB_DEATH, .proc/update_appearance) + RegisterSignal(owner, COMSIG_MOB_DEATH, .proc/update_appearance_genitals) if(genital_flags & GENITAL_THROUGH_CLOTHES) owner.exposed_genitals += src diff --git a/code/modules/arousal/toys/dildos.dm b/code/modules/arousal/toys/dildos.dm index 2482b93300..4de6877915 100644 --- a/code/modules/arousal/toys/dildos.dm +++ b/code/modules/arousal/toys/dildos.dm @@ -20,7 +20,7 @@ var/is_knotted = FALSE //Lists moved to _cit_helpers.dm as globals so they're not instanced individually -/obj/item/dildo/proc/update_appearance() +/obj/item/dildo/update_appearance() icon_state = "[dildo_type]_[dildo_shape]_[dildo_size]" var/sizeword = "" switch(dildo_size) diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index 6a49addc13..0af024985e 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -3,21 +3,21 @@ /datum/asset/simple/tgui_common keep_local_name = TRUE assets = list( - "tgui-common.bundle.js" = 'tgui/public/tgui-common.bundle.js', + "tgui-common.bundle.js" = file("tgui/public/tgui-common.bundle.js"), ) /datum/asset/simple/tgui keep_local_name = TRUE assets = list( - "tgui.bundle.js" = 'tgui/public/tgui.bundle.js', - "tgui.bundle.css" = 'tgui/public/tgui.bundle.css', + "tgui.bundle.js" = file("tgui/public/tgui.bundle.js"), + "tgui.bundle.css" = file("tgui/public/tgui.bundle.css"), ) /datum/asset/simple/tgui_panel keep_local_name = TRUE assets = list( - "tgui-panel.bundle.js" = 'tgui/public/tgui-panel.bundle.js', - "tgui-panel.bundle.css" = 'tgui/public/tgui-panel.bundle.css', + "tgui-panel.bundle.js" = file("tgui/public/tgui-panel.bundle.js"), + "tgui-panel.bundle.css" = file("tgui/public/tgui-panel.bundle.css"), ) /datum/asset/simple/headers @@ -168,10 +168,12 @@ /datum/asset/simple/namespaced/tgfont assets = list( - "tgfont.eot" = 'tgui/packages/tgfont/dist/tgfont.eot', - "tgfont.woff2" = 'tgui/packages/tgfont/dist/tgfont.woff2', + "tgfont.eot" = file("tgui/packages/tgfont/dist/tgfont.eot"), + "tgfont.woff2" = file("tgui/packages/tgfont/dist/tgfont.woff2"), + ) + parents = list( + "tgfont.css" = file("tgui/packages/tgfont/dist/tgfont.css"), ) - parents = list("tgfont.css" = 'tgui/packages/tgfont/dist/tgfont.css') /datum/asset/spritesheet/chat name = "chat" diff --git a/code/modules/atmospherics/auxgm/breathing_classes.dm b/code/modules/atmospherics/auxgm/breathing_classes.dm index f04f89a419..4abfab58ee 100644 --- a/code/modules/atmospherics/auxgm/breathing_classes.dm +++ b/code/modules/atmospherics/auxgm/breathing_classes.dm @@ -10,9 +10,9 @@ var/list/products = null var/danger_reagent = null var/low_alert_category = "not_enough_oxy" - var/low_alert_datum = /obj/screen/alert/not_enough_oxy + var/low_alert_datum = /atom/movable/screen/alert/not_enough_oxy var/high_alert_category = "too_much_oxy" - var/high_alert_datum = /obj/screen/alert/too_much_oxy + var/high_alert_datum = /atom/movable/screen/alert/too_much_oxy /datum/breathing_class/oxygen gases = list( @@ -32,6 +32,6 @@ GAS_CO2 = 1 ) low_alert_category = "not_enough_tox" - low_alert_datum = /obj/screen/alert/not_enough_tox + low_alert_datum = /atom/movable/screen/alert/not_enough_tox high_alert_category = "too_much_tox" - high_alert_datum = /obj/screen/alert/too_much_tox + high_alert_datum = /atom/movable/screen/alert/too_much_tox diff --git a/code/modules/atmospherics/auxgm/gas_types.dm b/code/modules/atmospherics/auxgm/gas_types.dm index 0da2527b3b..6faa3d55d6 100644 --- a/code/modules/atmospherics/auxgm/gas_types.dm +++ b/code/modules/atmospherics/auxgm/gas_types.dm @@ -3,35 +3,43 @@ specific_heat = 20 name = "Oxygen" oxidation_temperature = T0C - 100 // it checks max of this and fire temperature, so rarely will things spontaneously combust + powermix = 1 + heat_penalty = 1 + transmit_modifier = 1.5 /datum/gas/nitrogen id = GAS_N2 specific_heat = 20 + name = "Nitrogen" + powermix = -1 + heat_penalty = -1.5 breath_alert_info = list( not_enough_alert = list( alert_category = "not_enough_nitro", - alert_type = /obj/screen/alert/not_enough_nitro + alert_type = /atom/movable/screen/alert/not_enough_nitro ), too_much_alert = list( alert_category = "too_much_nitro", - alert_type = /obj/screen/alert/too_much_nitro + alert_type = /atom/movable/screen/alert/too_much_nitro ) ) - name = "Nitrogen" /datum/gas/carbon_dioxide //what the fuck is this? id = GAS_CO2 specific_heat = 30 name = "Carbon Dioxide" + powermix = 1 + heat_penalty = 0.1 + powerloss_inhibition = 1 breath_results = GAS_O2 breath_alert_info = list( not_enough_alert = list( alert_category = "not_enough_co2", - alert_type = /obj/screen/alert/not_enough_co2 + alert_type = /atom/movable/screen/alert/not_enough_co2 ), too_much_alert = list( alert_category = "too_much_co2", - alert_type = /obj/screen/alert/too_much_co2 + alert_type = /atom/movable/screen/alert/too_much_co2 ) ) fusion_power = 3 @@ -43,6 +51,9 @@ gas_overlay = "plasma" moles_visible = MOLES_GAS_VISIBLE flags = GAS_FLAG_DANGEROUS + heat_penalty = 15 + transmit_modifier = 4 + powermix = 1 // no fire info cause it has its own bespoke reaction for trit generation reasons /datum/gas/water_vapor @@ -52,6 +63,8 @@ gas_overlay = "water_vapor" moles_visible = MOLES_GAS_VISIBLE fusion_power = 8 + heat_penalty = 8 + powermix = 1 breath_reagent = /datum/reagent/water /datum/gas/hypernoblium @@ -71,6 +84,7 @@ fire_products = list(GAS_N2 = 1) oxidation_rate = 0.5 oxidation_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST + 100 + heat_resistance = 6 /datum/gas/nitryl id = GAS_NITRYL @@ -91,6 +105,9 @@ moles_visible = MOLES_GAS_VISIBLE flags = GAS_FLAG_DANGEROUS fusion_power = 1 + powermix = 1 + heat_penalty = 10 + transmit_modifier = 30 /* these are for when we add hydrogen, trit gets to keep its hardcoded fire for legacy reasons fire_provides = list(GAS_H2O = 2) @@ -105,6 +122,10 @@ name = "BZ" flags = GAS_FLAG_DANGEROUS fusion_power = 8 + powermix = 1 + heat_penalty = 5 + transmit_modifier = -2 + radioactivity_modifier = 5 /datum/gas/stimulum id = GAS_STIMULUM @@ -119,6 +140,10 @@ fusion_power = 10 oxidation_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST * 1000 // it is VERY stable oxidation_rate = 8 + powermix = -1 + heat_penalty = -1 + transmit_modifier = -5 + heat_resistance = 3 /datum/gas/miasma id = GAS_MIASMA @@ -132,17 +157,19 @@ id = GAS_METHANE specific_heat = 30 name = "Methane" + powerloss_inhibition = 1 + heat_resistance = 3 breath_results = GAS_METHYL_BROMIDE fire_products = list(GAS_CO2 = 1, GAS_H2O = 2) fire_burn_rate = 0.5 breath_alert_info = list( not_enough_alert = list( alert_category = "not_enough_ch4", - alert_type = /obj/screen/alert/not_enough_ch4 + alert_type = /atom/movable/screen/alert/not_enough_ch4 ), too_much_alert = list( alert_category = "too_much_ch4", - alert_type = /obj/screen/alert/too_much_ch4 + alert_type = /atom/movable/screen/alert/too_much_ch4 ) ) fire_energy_released = FIRE_CARBON_ENERGY_RELEASED @@ -152,15 +179,17 @@ id = GAS_METHYL_BROMIDE specific_heat = 42 name = "Methyl Bromide" + powermix = 1 + heat_penalty = -1 flags = GAS_FLAG_DANGEROUS breath_alert_info = list( not_enough_alert = list( alert_category = "not_enough_ch3br", - alert_type = /obj/screen/alert/not_enough_ch3br + alert_type = /atom/movable/screen/alert/not_enough_ch3br ), too_much_alert = list( alert_category = "too_much_ch3br", - alert_type = /obj/screen/alert/too_much_ch3br + alert_type = /atom/movable/screen/alert/too_much_ch3br ) ) fire_products = list(GAS_CO2 = 1, GAS_H2O = 1.5, GAS_BZ = 0.5) diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 3a3ba555de..a0665707ff 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -32,6 +32,11 @@ if(!blocks_air) air = new(2500,src) air.copy_from_turf(src) + if(planetary_atmos && !(initial_gas_mix in SSair.planetary)) + var/datum/gas_mixture/mix = new + mix.parse_gas_string(initial_gas_mix) + mix.mark_immutable() + SSair.planetary[initial_gas_mix] = mix update_air_ref(planetary_atmos ? 1 : 2) . = ..() diff --git a/code/modules/atmospherics/gasmixtures/auxgm.dm b/code/modules/atmospherics/gasmixtures/auxgm.dm index 6c7bc0cc49..4aa68aa710 100644 --- a/code/modules/atmospherics/gasmixtures/auxgm.dm +++ b/code/modules/atmospherics/gasmixtures/auxgm.dm @@ -35,6 +35,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(GAS_O2, GAS_N2, GAS_CO2, GA var/list/fire_enthalpies = list() var/list/fire_products = list() var/list/fire_burn_rates = list() + var/list/supermatter = list() /datum/gas @@ -55,6 +56,12 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(GAS_O2, GAS_N2, GAS_CO2, GA var/list/fire_products = null // what results when this gas is burned (oxidizer or fuel); null for none var/fire_energy_released = 0 // how much energy is released per mole of fuel burned var/fire_burn_rate = 1 // how many moles are burned per product released + var/powermix = 0 // how much this gas contributes to the supermatter's powermix ratio + var/heat_penalty = 0 // heat and waste penalty from having the supermatter crystal surrounded by this gas; negative numbers reduce + var/transmit_modifier = 0 // bonus to supermatter power generation (multiplicative, since it's % based, and divided by 10) + var/radioactivity_modifier = 0 // improves effect of transmit modifiers, must be from -10 to 10 + var/heat_resistance = 0 // makes the crystal more resistant against heat damage. + var/powerloss_inhibition = 0 // Reduces how much power the supermatter loses each tick /datum/gas/proc/breath(partial_pressure, light_threshold, heavy_threshold, moles, mob/living/carbon/C, obj/item/organ/lungs/lungs) // This is only called on gases with the GAS_FLAG_BREATH_PROC flag. When possible, do NOT use this-- @@ -100,12 +107,20 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(GAS_O2, GAS_N2, GAS_CO2, GA if(gas.fire_products) fire_products[g] = gas.fire_products fire_enthalpies[g] = gas.fire_energy_released - + add_supermatter_properties(gas) _auxtools_register_gas(gas) /proc/finalize_gas_refs() /datum/auxgm/New() + src.supermatter[HEAT_PENALTY] = list() + src.supermatter[TRANSMIT_MODIFIER] = list() + src.supermatter[RADIOACTIVITY_MODIFIER] = list() + src.supermatter[HEAT_RESISTANCE] = list() + src.supermatter[POWERLOSS_INHIBITION] = list() + src.supermatter[POWER_MIX] = list() + src.supermatter[ALL_SUPERMATTER_GASES] = list() + for(var/gas_path in subtypesof(/datum/gas)) var/datum/gas/gas = new gas_path add_gas(gas) diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index ed4b1f63c2..b670baaae7 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -261,6 +261,8 @@ we use a hook instead return 1 /datum/gas_mixture/parse_gas_string(gas_string) + gas_string = SSair.preprocess_gas_string(gas_string) + var/list/gas = params2list(gas_string) if(gas["TEMP"]) var/temp = text2num(gas["TEMP"]) diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index b523d333df..19cd865bd0 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -648,7 +648,7 @@ //Replace miasma with oxygen var/cleaned_air = min(air.get_moles(GAS_MIASMA), 20 + (air.return_temperature() - FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 70) / 20) air.adjust_moles(GAS_MIASMA, -cleaned_air) - air.adjust_moles(GAS_O2, cleaned_air) + air.adjust_moles(GAS_METHANE, cleaned_air) //Possibly burning a bit of organic matter through maillard reaction, so a *tiny* bit more heat would be understandable air.set_temperature(air.return_temperature() + cleaned_air * 0.002) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index eacb7ed392..efafc1c9a8 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -439,7 +439,7 @@ return // we don't see the pipe network while inside cryo. /obj/machinery/atmospherics/components/unary/cryo_cell/get_remote_view_fullscreens(mob/user) - user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1) + user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 1) /obj/machinery/atmospherics/components/unary/cryo_cell/can_crawl_through() return // can't ventcrawl in or out of cryo. diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm index bd2ca07134..5fdedd5be7 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm @@ -1,6 +1,6 @@ /obj/machinery/atmospherics/pipe/heat_exchanging level = 2 - var/minimum_temperature_difference = 20 + var/minimum_temperature_difference = 0.01 var/thermal_conductivity = WINDOW_HEAT_TRANSFER_COEFFICIENT color = "#404040" buckle_lying = 1 diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index e05502dbad..e286cbbe7f 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -75,6 +75,9 @@ /obj/machinery/atmospherics/pipe/setPipenet(datum/pipeline/P) parent = P +/obj/machinery/atmospherics/pipe/zap_act(power, zap_flags) + return 0 // they're not really machines in the normal sense, probably shouldn't explode + /obj/machinery/atmospherics/pipe/Destroy() QDEL_NULL(parent) diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index cf4456789a..15c6475033 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -433,7 +433,7 @@ var/list/danger = list() for(var/id in air_contents.get_gases()) var/gas = air_contents.get_moles(id) - if(!GLOB.gas_data.flags[id] & GAS_FLAG_DANGEROUS) + if(!(GLOB.gas_data.flags[id] & GAS_FLAG_DANGEROUS)) continue if(gas > (GLOB.gas_data.visibility[id] || MOLES_GAS_VISIBLE)) //if moles_visible is undefined, default to default visibility danger[GLOB.gas_data.names[id]] = gas //ex. "plasma" = 20 diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index 551c1c5536..8aa265d39f 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -172,15 +172,13 @@ GLOBAL_LIST_EMPTY(gateway_destinations) /// bumper object, the thing that starts actual teleport var/obj/effect/gateway_portal_bumper/portal /// Visual object for handling the viscontents - /// DISABLED DUE TO BYOND BUG CAUSING STACK OVERFLOWS OF ANY HUMAN INSTANTIATION NEAR AN ACTIVATED GATEWAY. - /// Probably due to it referencing each other through the gateway (there's a deep loop, maybe BYOND isn't catching something when it usually would) - // var/obj/effect/gateway_portal_effect/portal_visuals + var/obj/effect/gateway_portal_effect/portal_visuals /obj/machinery/gateway/Initialize() generate_destination() update_icon() - // portal_visuals = new - // vis_contents += portal_visuals + portal_visuals = new + vis_contents += portal_visuals return ..() /obj/machinery/gateway/proc/generate_destination() @@ -197,7 +195,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations) if(use_power == ACTIVE_POWER_USE) use_power = IDLE_POWER_USE update_icon() - // portal_visuals.reset_visuals() + portal_visuals.reset_visuals() /obj/machinery/gateway/process() if((stat & (NOPOWER)) && use_power) @@ -217,7 +215,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations) return target = D target.activate(destination) - // portal_visuals.setup_visuals(target) + portal_visuals.setup_visuals(target) generate_bumper() use_power = ACTIVE_POWER_USE update_icon() @@ -359,6 +357,8 @@ GLOBAL_LIST_EMPTY(gateway_destinations) animate(get_filter("portal_ripple"), time = 1.3 SECONDS, loop = -1, easing = LINEAR_EASING, radius = 32) - var/turf/center_turf = our_destination.get_target_turf() + /// DISABLED DUE TO BYOND BUG CAUSING STACK OVERFLOWS OF ANY HUMAN INSTANTIATION NEAR AN ACTIVATED GATEWAY. + /// Probably due to it referencing each other through the gateway (there's a deep loop, maybe BYOND isn't catching something when it usually would) + //var/turf/center_turf = our_destination.get_target_turf() - vis_contents += block(locate(center_turf.x - 1, center_turf.y - 1, center_turf.z), locate(center_turf.x + 1, center_turf.y + 1, center_turf.z)) + //vis_contents += block(locate(center_turf.x - 1, center_turf.y - 1, center_turf.z), locate(center_turf.x + 1, center_turf.y + 1, center_turf.z)) diff --git a/code/modules/buildmode/buildmode.dm b/code/modules/buildmode/buildmode.dm index 4a56257882..e0703201a1 100644 --- a/code/modules/buildmode/buildmode.dm +++ b/code/modules/buildmode/buildmode.dm @@ -17,10 +17,10 @@ var/switch_state = BM_SWITCHSTATE_NONE var/switch_width = 5 // modeswitch UI - var/obj/screen/buildmode/mode/modebutton + var/atom/movable/screen/buildmode/mode/modebutton var/list/modeswitch_buttons = list() // dirswitch UI - var/obj/screen/buildmode/bdir/dirbutton + var/atom/movable/screen/buildmode/bdir/dirbutton var/list/dirswitch_buttons = list() /datum/buildmode/New(client/c) @@ -34,7 +34,7 @@ holder.screen += buttons holder.click_intercept = src mode.enter_mode(src) - + /datum/buildmode/proc/quit() mode.exit_mode(src) holder.screen -= buttons @@ -63,16 +63,16 @@ /datum/buildmode/proc/create_buttons() // keep a reference so we can update it upon mode switch - modebutton = new /obj/screen/buildmode/mode(src) + modebutton = new /atom/movable/screen/buildmode/mode(src) buttons += modebutton - buttons += new /obj/screen/buildmode/help(src) + buttons += new /atom/movable/screen/buildmode/help(src) // keep a reference so we can update it upon dir switch - dirbutton = new /obj/screen/buildmode/bdir(src) + dirbutton = new /atom/movable/screen/buildmode/bdir(src) buttons += dirbutton - buttons += new /obj/screen/buildmode/quit(src) + buttons += new /atom/movable/screen/buildmode/quit(src) // build the lists of switching buttons - build_options_grid(subtypesof(/datum/buildmode_mode), modeswitch_buttons, /obj/screen/buildmode/modeswitch) - build_options_grid(list(SOUTH,EAST,WEST,NORTH,NORTHWEST), dirswitch_buttons, /obj/screen/buildmode/dirswitch) + build_options_grid(subtypesof(/datum/buildmode_mode), modeswitch_buttons, /atom/movable/screen/buildmode/modeswitch) + build_options_grid(list(SOUTH,EAST,WEST,NORTH,NORTHWEST), dirswitch_buttons, /atom/movable/screen/buildmode/dirswitch) // this creates a nice offset grid for choosing between buildmode options, // because going "click click click ah hell" sucks. @@ -81,7 +81,7 @@ for(var/thing in elements) var/x = pos_idx % switch_width var/y = FLOOR(pos_idx / switch_width, 1) - var/obj/screen/buildmode/B = new buttontype(src, thing) + var/atom/movable/screen/buildmode/B = new buttontype(src, thing) // extra .5 for a nice offset look B.screen_loc = "NORTH-[(1 + 0.5 + y*1.5)],WEST+[0.5 + x*1.5]" buttonslist += B @@ -100,7 +100,7 @@ else close_switchstates() open_modeswitch() - + /datum/buildmode/proc/open_modeswitch() switch_state = BM_SWITCHSTATE_MODE holder.screen += modeswitch_buttons @@ -115,7 +115,7 @@ else close_switchstates() open_dirswitch() - + /datum/buildmode/proc/open_dirswitch() switch_state = BM_SWITCHSTATE_DIR holder.screen += dirswitch_buttons @@ -155,7 +155,7 @@ new /datum/buildmode(M.client) message_admins("[key_name_admin(usr)] has entered build mode.") log_admin("[key_name(usr)] has entered build mode.") - + #undef BM_SWITCHSTATE_NONE #undef BM_SWITCHSTATE_MODE #undef BM_SWITCHSTATE_DIR diff --git a/code/modules/buildmode/buttons.dm b/code/modules/buildmode/buttons.dm index 6901a0e42e..5c5c0000d1 100644 --- a/code/modules/buildmode/buttons.dm +++ b/code/modules/buildmode/buttons.dm @@ -1,23 +1,23 @@ -/obj/screen/buildmode +/atom/movable/screen/buildmode icon = 'icons/misc/buildmode.dmi' var/datum/buildmode/bd // If we don't do this, we get occluded by item action buttons layer = ABOVE_HUD_LAYER -/obj/screen/buildmode/New(bld) +/atom/movable/screen/buildmode/New(bld) bd = bld return ..() -/obj/screen/buildmode/Destroy() +/atom/movable/screen/buildmode/Destroy() bd = null return ..() -/obj/screen/buildmode/mode +/atom/movable/screen/buildmode/mode name = "Toggle Mode" icon_state = "buildmode_basic" screen_loc = "NORTH,WEST" -/obj/screen/buildmode/mode/Click(location, control, params) +/atom/movable/screen/buildmode/mode/Click(location, control, params) var/list/pa = params2list(params) if(pa.Find("left")) @@ -27,63 +27,63 @@ update_icon() return 1 -/obj/screen/buildmode/mode/update_icon_state() +/atom/movable/screen/buildmode/mode/update_icon_state() icon_state = bd.mode.get_button_iconstate() -/obj/screen/buildmode/help +/atom/movable/screen/buildmode/help icon_state = "buildhelp" screen_loc = "NORTH,WEST+1" name = "Buildmode Help" -/obj/screen/buildmode/help/Click(location, control, params) +/atom/movable/screen/buildmode/help/Click(location, control, params) bd.mode.show_help(usr.client) return 1 -/obj/screen/buildmode/bdir +/atom/movable/screen/buildmode/bdir icon_state = "build" screen_loc = "NORTH,WEST+2" name = "Change Dir" -/obj/screen/buildmode/bdir/update_icon_state() +/atom/movable/screen/buildmode/bdir/update_icon_state() dir = bd.build_dir -/obj/screen/buildmode/bdir/Click() +/atom/movable/screen/buildmode/bdir/Click() bd.toggle_dirswitch() update_icon() return 1 // used to switch between modes -/obj/screen/buildmode/modeswitch +/atom/movable/screen/buildmode/modeswitch var/datum/buildmode_mode/modetype -/obj/screen/buildmode/modeswitch/New(bld, mt) +/atom/movable/screen/buildmode/modeswitch/New(bld, mt) modetype = mt icon_state = "buildmode_[initial(modetype.key)]" name = initial(modetype.key) return ..(bld) -/obj/screen/buildmode/modeswitch/Click() +/atom/movable/screen/buildmode/modeswitch/Click() bd.change_mode(modetype) return 1 // used to switch between dirs -/obj/screen/buildmode/dirswitch +/atom/movable/screen/buildmode/dirswitch icon_state = "build" -/obj/screen/buildmode/dirswitch/New(bld, dir) +/atom/movable/screen/buildmode/dirswitch/New(bld, dir) src.dir = dir name = dir2text(dir) return ..(bld) -/obj/screen/buildmode/dirswitch/Click() +/atom/movable/screen/buildmode/dirswitch/Click() bd.change_dir(dir) return 1 -/obj/screen/buildmode/quit +/atom/movable/screen/buildmode/quit icon_state = "buildquit" screen_loc = "NORTH,WEST+3" name = "Quit Buildmode" -/obj/screen/buildmode/quit/Click() +/atom/movable/screen/buildmode/quit/Click() bd.quit() return 1 diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm index 05a9eef4f2..e4060de1a2 100644 --- a/code/modules/cargo/centcom_podlauncher.dm +++ b/code/modules/cargo/centcom_podlauncher.dm @@ -51,9 +51,9 @@ var/obj/structure/closet/supplypod/centcompod/temp_pod //The temporary pod that is modified by this datum, then cloned. The buildObject() clone of this pod is what is launched // Stuff needed to render the map var/map_name - var/obj/screen/map_view/cam_screen + var/atom/movable/screen/map_view/cam_screen var/list/cam_plane_masters - var/obj/screen/background/cam_background + var/atom/movable/screen/background/cam_background var/tabIndex = 1 var/renderLighting = FALSE @@ -92,8 +92,8 @@ cam_screen.del_on_map_removal = TRUE cam_screen.screen_loc = "[map_name]:1,1" cam_plane_masters = list() - for(var/plane in subtypesof(/obj/screen/plane_master)) - var/obj/screen/instance = new plane() + for(var/plane in subtypesof(/atom/movable/screen/plane_master)) + var/atom/movable/screen/instance = new plane() if (!renderLighting && instance.plane == LIGHTING_PLANE) instance.alpha = 100 instance.assigned_map = map_name @@ -581,7 +581,7 @@ var/left_click = pa.Find("left") if (launcherActivated) //Clicking on UI elements shouldn't launch a pod - if(istype(target,/obj/screen)) + if(istype(target,/atom/movable/screen)) return FALSE . = TRUE @@ -616,7 +616,7 @@ sleep(rand()*2) //looks cooler than them all appearing at once. Gives the impression of burst fire. else if (picking_dropoff_turf) //Clicking on UI elements shouldn't pick a dropoff turf - if(istype(target,/obj/screen)) + if(istype(target,/atom/movable/screen)) return FALSE . = TRUE diff --git a/code/modules/cargo/exports/sheets.dm b/code/modules/cargo/exports/sheets.dm index b0676fbde2..058e0cc892 100644 --- a/code/modules/cargo/exports/sheets.dm +++ b/code/modules/cargo/exports/sheets.dm @@ -59,6 +59,11 @@ unit_name = "alien hide" export_types = list(/obj/item/stack/sheet/animalhide/xeno) +/datum/export/stack/licenseplate + cost = 25 + unit_name = "license plate" + export_types = list(/obj/item/stack/license_plates/filled) + // Common materials. // For base materials, see materials.dm diff --git a/code/modules/cargo/packs/goodies.dm b/code/modules/cargo/packs/goodies.dm index 5d4598fd58..5151845221 100644 --- a/code/modules/cargo/packs/goodies.dm +++ b/code/modules/cargo/packs/goodies.dm @@ -70,6 +70,12 @@ cost = 1500 contains = list(/obj/item/toy/plush/beeplushie) +/datum/supply_pack/goody/dyespray + name = "Hair Dye Spray" + desc = "A cool spray to dye your hair with awesome colors!" + cost = PAYCHECK_EASY * 2 + contains = list(/obj/item/dyespray) + /datum/supply_pack/goody/beach_ball name = "Beach Ball" desc = "The simple beach ball is one of Nanotrasen's most popular products. 'Why do we make beach balls? Because we can! (TM)' - Nanotrasen" diff --git a/code/modules/cargo/packs/materials.dm b/code/modules/cargo/packs/materials.dm index 90629706b5..8b74b0fbe9 100644 --- a/code/modules/cargo/packs/materials.dm +++ b/code/modules/cargo/packs/materials.dm @@ -20,6 +20,13 @@ cost = 300 //thrice their export value contains = list(/obj/item/stack/sheet/cardboard/fifty) +/datum/supply_pack/materials/license50 + name = "50 Empty License Plates" + desc = "Create a bunch of boxes." + cost = 1000 // 50 * 25 + 700 - 1000 = 950 credits profit + contains = list(/obj/item/stack/license_plates/empty/fifty) + crate_name = "empty license plate crate" + /datum/supply_pack/materials/glass50 crate_type = /obj/structure/closet/secure_closet/cargo name = "50 Glass Sheets" diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index a4d94e994c..99f24107c7 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -60,7 +60,7 @@ preload_rsc = PRELOAD_RSC - var/obj/screen/click_catcher/void + var/atom/movable/screen/click_catcher/void //These two vars are used to make a special mouse cursor, with a unique icon for clicking var/mouse_up_icon = null @@ -88,7 +88,7 @@ var/datum/player_details/player_details //these persist between logins/logouts during the same round. - var/list/char_render_holders //Should only be a key-value list of north/south/east/west = obj/screen. + var/list/char_render_holders //Should only be a key-value list of north/south/east/west = atom/movable/screen. /// Last time they used fix macros var/last_macro_fix = 0 @@ -168,7 +168,7 @@ * Assoc list with all the active maps - when a screen obj is added to * a map, it's put in here as well. * - * Format: list( = list(/obj/screen)) + * Format: list( = list(/atom/movable/screen)) */ var/list/screen_maps = list() diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 8add693d48..571adb406b 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -1029,7 +1029,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( var/pos = 0 for(var/D in GLOB.cardinals) pos++ - var/obj/screen/O = LAZYACCESS(char_render_holders, "[D]") + var/atom/movable/screen/O = LAZYACCESS(char_render_holders, "[D]") if(!O) O = new LAZYSET(char_render_holders, "[D]", O) @@ -1040,7 +1040,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( /client/proc/clear_character_previews() for(var/index in char_render_holders) - var/obj/screen/S = char_render_holders[index] + var/atom/movable/screen/S = char_render_holders[index] screen -= S qdel(S) char_render_holders = null diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 0f0bf6a62c..cb262e57f3 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -60,6 +60,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) //autocorrected this round, not that you'd need to check that. var/UI_style = null + var/outline_enabled = TRUE + var/outline_color = COLOR_BLUE_GRAY var/buttons_locked = FALSE var/hotkeys = FALSE @@ -117,6 +119,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/hair_color = "000000" //Hair color var/facial_hair_style = "Shaved" //Face hair type var/facial_hair_color = "000000" //Facial hair color + var/grad_style //Hair gradient style + var/grad_color = "FFFFFF" //Hair gradient color var/skin_tone = "caucasian1" //Skin color var/use_custom_skin_tone = FALSE var/left_eye_color = "000000" //Eye color @@ -503,6 +507,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "< >
" dat += "    Change
" + dat += "

Hair Gradient

" + + dat += "[grad_style]" + dat += "< >
" + dat += "    Change
" + dat += "" //Mutant stuff var/mutant_category = 0 @@ -774,6 +784,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "
" dat += "

General Settings

" dat += "UI Style: [UI_style]
" + dat += "Outline: [outline_enabled ? "Enabled" : "Disabled"]
" + dat += "Outline Color:     Change
" dat += "tgui Monitors: [(tgui_lock) ? "Primary" : "All"]
" dat += "tgui Style: [(tgui_fancy) ? "Fancy" : "No Frills"]
" dat += "Show Runechat Chat Bubbles: [chat_on_map ? "Enabled" : "Disabled"]
" @@ -1707,6 +1719,23 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("previous_facehair_style") facial_hair_style = previous_list_item(facial_hair_style, GLOB.facial_hair_styles_list) + if("grad_color") + var/new_grad_color = input(user, "Choose your character's gradient colour:", "Character Preference","#"+grad_color) as color|null + if(new_grad_color) + grad_color = sanitize_hexcolor(new_grad_color, 6) + + if("grad_style") + var/new_grad_style + new_grad_style = input(user, "Choose your character's hair gradient style:", "Character Preference") as null|anything in GLOB.hair_gradients_list + if(new_grad_style) + grad_style = new_grad_style + + if("next_grad_style") + grad_style = next_list_item(grad_style, GLOB.hair_gradients_list) + + if("previous_grad_style") + grad_style = previous_list_item(grad_style, GLOB.hair_gradients_list) + if("cycle_bg") bgstate = next_list_item(bgstate, bgstate_options) @@ -2706,6 +2735,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) buttons_locked = !buttons_locked if("tgui_fancy") tgui_fancy = !tgui_fancy + if("outline_enabled") + outline_enabled = !outline_enabled + if("outline_color") + var/pickedOutlineColor = input(user, "Choose your outline color.", "General Preference", outline_color) as color|null + if(pickedOutlineColor) + outline_color = pickedOutlineColor if("tgui_lock") tgui_lock = !tgui_lock if("winflash") @@ -2840,9 +2875,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("ambientocclusion") ambientocclusion = !ambientocclusion if(parent && parent.screen && parent.screen.len) - var/obj/screen/plane_master/game_world/G = parent.mob.hud_used.plane_masters["[GAME_PLANE]"] - var/obj/screen/plane_master/above_wall/A = parent.mob.hud_used.plane_masters["[ABOVE_WALL_PLANE]"] - var/obj/screen/plane_master/wall/W = parent.mob.hud_used.plane_masters["[WALL_PLANE]"] + var/atom/movable/screen/plane_master/game_world/G = parent.mob.hud_used.plane_masters["[GAME_PLANE]"] + var/atom/movable/screen/plane_master/above_wall/A = parent.mob.hud_used.plane_masters["[ABOVE_WALL_PLANE]"] + var/atom/movable/screen/plane_master/wall/W = parent.mob.hud_used.plane_masters["[WALL_PLANE]"] G.backdrop(parent.mob) A.backdrop(parent.mob) W.backdrop(parent.mob) @@ -3006,6 +3041,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.dna.skin_tone_override = use_custom_skin_tone ? skin_tone : null character.hair_style = hair_style character.facial_hair_style = facial_hair_style + character.grad_style = grad_style + character.grad_color = grad_color character.underwear = underwear character.saved_underwear = underwear @@ -3070,6 +3107,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(additional_language && additional_language != "None") var/language_entry = GLOB.roundstart_languages[additional_language] if(language_entry) + character.additional_language = language_entry character.grant_language(language_entry, TRUE, TRUE) //limb stuff, only done when initially spawning in diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index d4d13dc40f..96ffd09af8 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -45,6 +45,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(current_version < 46) //If you remove this, remove force_reset_keybindings() too. force_reset_keybindings_direct(TRUE) addtimer(CALLBACK(src, .proc/force_reset_keybindings), 30) //No mob available when this is run, timer allows user choice. + if(current_version < 30) + outline_enabled = TRUE + outline_color = COLOR_BLUE_GRAY /datum/preferences/proc/update_character(current_version, savefile/S) if(current_version < 19) @@ -377,6 +380,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["ooccolor"] >> ooccolor S["lastchangelog"] >> lastchangelog S["UI_style"] >> UI_style + S["outline_color"] >> outline_color + S["outline_enabled"] >> outline_enabled S["hotkeys"] >> hotkeys S["chat_on_map"] >> chat_on_map S["max_chat_length"] >> max_chat_length @@ -555,6 +560,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["ooccolor"], ooccolor) WRITE_FILE(S["lastchangelog"], lastchangelog) WRITE_FILE(S["UI_style"], UI_style) + WRITE_FILE(S["outline_enabled"], outline_enabled) + WRITE_FILE(S["outline_color"], outline_color) WRITE_FILE(S["hotkeys"], hotkeys) WRITE_FILE(S["chat_on_map"], chat_on_map) WRITE_FILE(S["max_chat_length"], max_chat_length) @@ -676,6 +683,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["skin_tone"] >> skin_tone S["hair_style_name"] >> hair_style S["facial_style_name"] >> facial_hair_style + S["grad_style"] >> grad_style + S["grad_color"] >> grad_color S["underwear"] >> underwear S["undie_color"] >> undie_color S["undershirt"] >> undershirt @@ -868,6 +877,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age)) hair_color = sanitize_hexcolor(hair_color, 6, FALSE) facial_hair_color = sanitize_hexcolor(facial_hair_color, 6, FALSE) + grad_style = sanitize_inlist(grad_style, GLOB.hair_gradients_list, "None") + grad_color = sanitize_hexcolor(grad_color, 6, FALSE) eye_type = sanitize_inlist(eye_type, GLOB.eye_types, DEFAULT_EYES_TYPE) left_eye_color = sanitize_hexcolor(left_eye_color, 6, FALSE) right_eye_color = sanitize_hexcolor(right_eye_color, 6, FALSE) @@ -1037,6 +1048,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["skin_tone"] , skin_tone) WRITE_FILE(S["hair_style_name"] , hair_style) WRITE_FILE(S["facial_style_name"] , facial_hair_style) + WRITE_FILE(S["grad_style"] , grad_style) + WRITE_FILE(S["grad_color"] , grad_color) WRITE_FILE(S["underwear"] , underwear) WRITE_FILE(S["undie_color"] , undie_color) WRITE_FILE(S["undershirt"] , undershirt) diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index cae9a54484..453c22e7f2 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -207,6 +207,10 @@ message_admins("[key_name(src)] (job: [src.job ? "[src.job]" : "None"]) [is_special_character(src) ? "(ANTAG!) " : ""][ghosting ? "ghosted" : "committed suicide"] at [AREACOORD(src)].") /mob/living/proc/canSuicide() + var/area/A = get_area(src) + if(A.area_flags & BLOCK_SUICIDE) + to_chat(src, span_warning("You can't commit suicide here! You can ghost if you'd like.")) + return FALSE if(!CONFIG_GET(flag/suicide_allowed)) to_chat(src, "Suicide is not enabled in the config.") return FALSE @@ -214,11 +218,11 @@ if(CONSCIOUS) return TRUE if(SOFT_CRIT) - to_chat(src, "You can't commit suicide while in a critical condition!") + to_chat(src, span_warning("You can't commit suicide while in a critical condition!")) if(UNCONSCIOUS) - to_chat(src, "You need to be conscious to commit suicide!") + to_chat(src, span_warning("You need to be conscious to commit suicide!")) if(DEAD) - to_chat(src, "You're already dead!") + to_chat(src, span_warning("You're already dead!")) return /mob/living/carbon/canSuicide() diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 416c6309d4..56ddb5f5f1 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -79,8 +79,8 @@ if(ismecha(M.loc)) // stops inventory actions in a mech return - if(!. && !M.incapacitated() && loc == M && istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + if(!. && !M.incapacitated() && loc == M && istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object if(M.putItemFromInventoryInHandIfPossible(src, H.held_index)) add_fingerprint(usr) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 525db577e0..2e3c544d08 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -83,6 +83,7 @@ icon_state = "clown" item_state = "clown_hat" dye_color = "clown" + w_class = WEIGHT_CLASS_SMALL flags_cover = MASKCOVERSEYES resistance_flags = FLAMMABLE actions_types = list(/datum/action/item_action/adjust) @@ -131,6 +132,7 @@ clothing_flags = ALLOWINTERNALS icon_state = "mime" item_state = "mime" + w_class = WEIGHT_CLASS_SMALL flags_cover = MASKCOVERSEYES resistance_flags = FLAMMABLE actions_types = list(/datum/action/item_action/adjust) diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index 7cd2e9b394..86aa0748df 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -30,7 +30,7 @@ glasses = /obj/item/clothing/glasses/hud/security/sunglasses back = /obj/item/storage/backpack/captain belt = /obj/item/storage/belt/security/full - backpack_contents = list(/obj/item/storage/box/engineer=1,\ + backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\ /obj/item/melee/baton/loaded=1,\ /obj/item/clothing/mask/gas/sechailer=1,\ /obj/item/gun/energy/e_gun=1) @@ -50,7 +50,7 @@ suit = /obj/item/clothing/suit/space/hardsuit/ert/alert glasses = /obj/item/clothing/glasses/thermal/eyepatch - backpack_contents = list(/obj/item/storage/box/engineer=1,\ + backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\ /obj/item/melee/baton/loaded=1,\ /obj/item/clothing/mask/gas/sechailer/swat=1,\ /obj/item/gun/energy/e_gun=1) @@ -58,7 +58,7 @@ /datum/outfit/ert/commander/alert/red name = "ERT Commander - Red Alert" - backpack_contents = list(/obj/item/storage/box/engineer=1,\ + backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\ /obj/item/melee/baton/loaded=1,\ /obj/item/clothing/mask/gas/sechailer/swat=1,\ /obj/item/gun/energy/pulse/pistol/loyalpin=1) @@ -71,7 +71,7 @@ glasses = /obj/item/clothing/glasses/hud/security/sunglasses belt = /obj/item/storage/belt/security/full back = /obj/item/storage/backpack/security - backpack_contents = list(/obj/item/storage/box/engineer=1,\ + backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\ /obj/item/storage/box/handcuffs=1,\ /obj/item/clothing/mask/gas/sechailer=1,\ /obj/item/gun/energy/e_gun/stun=1,\ @@ -91,7 +91,7 @@ name = "ERT Security - Amber Alert" suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/sec - backpack_contents = list(/obj/item/storage/box/engineer=1,\ + backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\ /obj/item/storage/box/handcuffs=1,\ /obj/item/clothing/mask/gas/sechailer/swat=1,\ /obj/item/melee/baton/loaded=1,\ @@ -99,7 +99,7 @@ /datum/outfit/ert/security/alert/red name = "ERT Security - Red Alert" - backpack_contents = list(/obj/item/storage/box/engineer=1,\ + backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\ /obj/item/storage/box/handcuffs=1,\ /obj/item/clothing/mask/gas/sechailer/swat=1,\ /obj/item/melee/baton/loaded=1,\ @@ -114,7 +114,7 @@ back = /obj/item/storage/backpack/satchel/med belt = /obj/item/storage/belt/medical r_hand = /obj/item/storage/firstaid/regular - backpack_contents = list(/obj/item/storage/box/engineer=1,\ + backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\ /obj/item/melee/baton/loaded=1,\ /obj/item/clothing/mask/gas/sechailer=1,\ /obj/item/gun/energy/e_gun=1,\ @@ -135,7 +135,7 @@ name = "ERT Medic - Amber Alert" suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/med - backpack_contents = list(/obj/item/storage/box/engineer=1,\ + backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\ /obj/item/melee/baton/loaded=1,\ /obj/item/clothing/mask/gas/sechailer/swat=1,\ /obj/item/gun/energy/e_gun=1,\ @@ -144,7 +144,7 @@ /datum/outfit/ert/medic/alert/red name = "ERT Medic - Red Alert" - backpack_contents = list(/obj/item/storage/box/engineer=1,\ + backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\ /obj/item/melee/baton/loaded=1,\ /obj/item/clothing/mask/gas/sechailer/swat=1,\ /obj/item/gun/energy/pulse/pistol/loyalpin=1,\ @@ -161,7 +161,7 @@ belt = /obj/item/storage/belt/utility/full l_pocket = /obj/item/rcd_ammo/large r_hand = /obj/item/storage/firstaid/regular - backpack_contents = list(/obj/item/storage/box/engineer=1,\ + backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\ /obj/item/melee/baton/loaded=1,\ /obj/item/clothing/mask/gas/sechailer=1,\ /obj/item/gun/energy/e_gun=1,\ @@ -181,7 +181,7 @@ name = "ERT Engineer - Amber Alert" suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/engi - backpack_contents = list(/obj/item/storage/box/engineer=1,\ + backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\ /obj/item/melee/baton/loaded=1,\ /obj/item/clothing/mask/gas/sechailer/swat=1,\ /obj/item/gun/energy/e_gun=1,\ @@ -189,7 +189,7 @@ /datum/outfit/ert/engineer/alert/red name = "ERT Engineer - Red Alert" - backpack_contents = list(/obj/item/storage/box/engineer=1,\ + backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\ /obj/item/melee/baton/loaded=1,\ /obj/item/clothing/mask/gas/sechailer/swat=1,\ /obj/item/gun/energy/pulse/pistol/loyalpin=1,\ @@ -260,7 +260,7 @@ name = "Inquisition Commander" r_hand = /obj/item/nullrod/scythe/talking/chainsword suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal - backpack_contents = list(/obj/item/storage/box/engineer=1, + backpack_contents = list(/obj/item/storage/box/survival/engineer=1, /obj/item/clothing/mask/gas/sechailer=1, /obj/item/gun/energy/e_gun=1) @@ -269,7 +269,7 @@ suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor - backpack_contents = list(/obj/item/storage/box/engineer=1, + backpack_contents = list(/obj/item/storage/box/survival/engineer=1, /obj/item/storage/box/handcuffs=1, /obj/item/clothing/mask/gas/sechailer=1, /obj/item/gun/energy/e_gun/stun=1, @@ -281,7 +281,7 @@ suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor - backpack_contents = list(/obj/item/storage/box/engineer=1, + backpack_contents = list(/obj/item/storage/box/survival/engineer=1, /obj/item/melee/baton/loaded=1, /obj/item/clothing/mask/gas/sechailer=1, /obj/item/gun/energy/e_gun=1, @@ -307,7 +307,7 @@ glasses = /obj/item/clothing/glasses/hud/health back = /obj/item/storage/backpack/cultpack belt = /obj/item/storage/belt/soulstone - backpack_contents = list(/obj/item/storage/box/engineer=1, + backpack_contents = list(/obj/item/storage/box/survival/engineer=1, /obj/item/nullrod=1, /obj/item/clothing/mask/gas/sechailer=1, /obj/item/gun/energy/e_gun=1, @@ -319,7 +319,7 @@ suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor belt = /obj/item/storage/belt/soulstone/full/chappy - backpack_contents = list(/obj/item/storage/box/engineer=1, + backpack_contents = list(/obj/item/storage/box/survival/engineer=1, /obj/item/grenade/chem_grenade/holy=1, /obj/item/nullrod=1, /obj/item/clothing/mask/gas/sechailer=1, diff --git a/code/modules/clothing/outfits/plasmaman.dm b/code/modules/clothing/outfits/plasmaman.dm index bd2c2b612d..5809cb8f50 100644 --- a/code/modules/clothing/outfits/plasmaman.dm +++ b/code/modules/clothing/outfits/plasmaman.dm @@ -71,6 +71,12 @@ head = /obj/item/clothing/head/helmet/space/plasmaman/security/hos uniform = /obj/item/clothing/under/plasmaman/security/hos +/datum/outfit/plasmaman/prisoner + name = "Prisoner Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/prisoner + uniform = /obj/item/clothing/under/plasmaman/prisoner + /datum/outfit/plasmaman/cargo name = "Cargo Plasmaman" diff --git a/code/modules/clothing/outfits/vr.dm b/code/modules/clothing/outfits/vr.dm index acf015c845..ac852a35a8 100644 --- a/code/modules/clothing/outfits/vr.dm +++ b/code/modules/clothing/outfits/vr.dm @@ -28,7 +28,7 @@ id = /obj/item/card/id/syndicate/locked_banking belt = /obj/item/gun/ballistic/automatic/pistol l_pocket = /obj/item/paper/fluff/vr/fluke_ops - backpack_contents = list(/obj/item/storage/box/syndie=1,\ + backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\ /obj/item/kitchen/knife/combat/survival) starting_funds = 0 //Should be operating, not shopping. diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 49256b490d..7a1e6b14f3 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -27,7 +27,7 @@ ///How long it takes to lace/unlace these shoes var/lace_time = 5 SECONDS ///any alerts we have active - var/obj/screen/alert/our_alert + var/atom/movable/screen/alert/our_alert /obj/item/clothing/shoes/ComponentInitialize() . = ..() @@ -93,7 +93,7 @@ user.update_inv_shoes() equipped_before_drop = TRUE if(can_be_tied && tied == SHOES_UNTIED) - our_alert = user.throw_alert("shoealert", /obj/screen/alert/shoes/untied) + our_alert = user.throw_alert("shoealert", /atom/movable/screen/alert/shoes/untied) RegisterSignal(src, COMSIG_SHOES_STEP_ACTION, .proc/check_trip, override=TRUE) /obj/item/clothing/shoes/proc/restore_offsets(mob/user) @@ -150,7 +150,7 @@ UnregisterSignal(src, COMSIG_SHOES_STEP_ACTION) else if(tied == SHOES_UNTIED && our_guy && user == our_guy) - our_alert = our_guy.throw_alert("shoealert", /obj/screen/alert/shoes/untied) // if we're the ones unknotting our own laces, of course we know they're untied + our_alert = our_guy.throw_alert("shoealert", /atom/movable/screen/alert/shoes/untied) // if we're the ones unknotting our own laces, of course we know they're untied RegisterSignal(src, COMSIG_SHOES_STEP_ACTION, .proc/check_trip, override=TRUE) /** @@ -233,7 +233,7 @@ our_guy.Knockdown(10) our_guy.visible_message("[our_guy] trips on [our_guy.p_their()] knotted shoelaces and falls! What a klutz!", "You trip on your knotted shoelaces and fall over!") SEND_SIGNAL(our_guy, COMSIG_ADD_MOOD_EVENT, "trip", /datum/mood_event/tripped) // well we realized they're knotted now! - our_alert = our_guy.throw_alert("shoealert", /obj/screen/alert/shoes/knotted) + our_alert = our_guy.throw_alert("shoealert", /atom/movable/screen/alert/shoes/knotted) else if(tied == SHOES_UNTIED) var/wiser = TRUE // did we stumble and realize our laces are undone? @@ -263,7 +263,7 @@ wiser = FALSE if(wiser) SEND_SIGNAL(our_guy, COMSIG_ADD_MOOD_EVENT, "untied", /datum/mood_event/untied) // well we realized they're untied now! - our_alert = our_guy.throw_alert("shoealert", /obj/screen/alert/shoes/untied) + our_alert = our_guy.throw_alert("shoealert", /atom/movable/screen/alert/shoes/untied) /obj/item/clothing/shoes/on_attack_hand(mob/living/user, act_intent, unarmed_attack_flags) diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 57659a70c4..6642731d8b 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -238,7 +238,7 @@ var/mob/holder = null var/phase_time = 0 var/phase_time_length = 3 - var/obj/screen/chronos_target/target_ui = null + var/atom/movable/screen/chronos_target/target_ui = null var/obj/item/clothing/suit/space/chronos/chronosuit /obj/effect/chronos_cam/singularity_act() @@ -299,13 +299,13 @@ holder.unset_machine() return ..() -/obj/screen/chronos_target +/atom/movable/screen/chronos_target name = "target display" screen_loc = "CENTER,CENTER" color = "#ff3311" blend_mode = BLEND_SUBTRACT -/obj/screen/chronos_target/New(loc, var/mob/living/carbon/human/user) +/atom/movable/screen/chronos_target/New(loc, var/mob/living/carbon/human/user) if(user) var/icon/user_icon = getFlatIcon(user) icon = user_icon diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 4af9e7387d..cd48a81350 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -237,12 +237,28 @@ /obj/item/clothing/head/helmet/space/hardsuit/mining/Initialize() . = ..() AddComponent(/datum/component/armor_plate) + RegisterSignal(src, COMSIG_ARMOR_PLATED, .proc/upgrade_icon) + +/obj/item/clothing/head/helmet/space/hardsuit/mining/proc/upgrade_icon(datum/source, amount, maxamount) + SIGNAL_HANDLER + + if(amount) + name = "reinforced [initial(name)]" + hardsuit_type = "mining_goliath" + if(amount == maxamount) + hardsuit_type = "mining_goliath_full" + icon_state = "hardsuit[on]-[hardsuit_type]" + if(ishuman(loc)) + var/mob/living/carbon/human/wearer = loc + if(wearer.head == src) + wearer.update_inv_head() /obj/item/clothing/suit/space/hardsuit/mining icon_state = "hardsuit-mining" name = "mining hardsuit" desc = "A special suit that protects against hazardous, low pressure environments. Has reinforced plating for wildlife encounters." item_state = "mining_hardsuit" + hardsuit_type = "mining" max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 75, "wound" = 15) @@ -254,6 +270,21 @@ /obj/item/clothing/suit/space/hardsuit/mining/Initialize() . = ..() AddComponent(/datum/component/armor_plate) + RegisterSignal(src, COMSIG_ARMOR_PLATED, .proc/upgrade_icon) + +/obj/item/clothing/suit/space/hardsuit/mining/proc/upgrade_icon(datum/source, amount, maxamount) + SIGNAL_HANDLER + + if(amount) + name = "reinforced [initial(name)]" + hardsuit_type = "mining_goliath" + if(amount == maxamount) + hardsuit_type = "mining_goliath_full" + icon_state = "hardsuit-[hardsuit_type]" + if(ishuman(loc)) + var/mob/living/carbon/human/wearer = loc + if(wearer.wear_suit == src) + wearer.update_inv_wear_suit() //Syndicate hardsuit /obj/item/clothing/head/helmet/space/hardsuit/syndi diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index b50c2b45db..25ad19eee4 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -169,6 +169,10 @@ icon_state = "hos_envirohelm" item_state = "hos_envirohelm" +/obj/item/clothing/head/helmet/space/plasmaman/prisoner + name = "prisoner's plasma envirosuit helmet" + desc = "A plasmaman containment helmet for prisoners." + /obj/item/clothing/head/helmet/space/plasmaman/medical name = "medical's plasma envirosuit helmet" desc = "An envriohelmet designed for plasmaman medical doctors, having two stripes down it's length to denote as much." diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 254ed60c03..90fd0b2812 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -136,17 +136,24 @@ icon_state = "syndievest" mutantrace_variation = STYLE_DIGITIGRADE -/obj/item/clothing/suit/armor/vest/capcarapace/alt +/obj/item/clothing/suit/toggle/captains_parade name = "captain's parade jacket" desc = "For when an armoured vest isn't fashionable enough." icon_state = "capformal" item_state = "capspacesuit" + body_parts_covered = CHEST|GROIN|ARMS + armor = list("melee" = 50, "bullet" = 40, "laser" = 50, "energy" = 50, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 90, "wound" = 10) + togglename = "buttons" + +/obj/item/clothing/suit/toggle/captains_parade/Initialize() + . = ..() + allowed = GLOB.security_wintercoat_allowed /obj/item/clothing/suit/armor/riot name = "riot suit" desc = "A suit of semi-flexible polycarbonate body armor with heavy padding to protect against melee attacks. Helps the wearer resist shoving in close quarters." - icon_state = "swat" - item_state = "swat_suit" + icon_state = "riot" + item_state = "riot" body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS @@ -319,3 +326,29 @@ cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT armor = list("melee" = 25, "bullet" = 20, "laser" = 20, "energy" = 10, "bomb" = 20, "bio" = 50, "rad" = 20, "fire" = -10, "acid" = 50, "wound" = 10) + +/obj/item/clothing/suit/toggle/armor/vest/centcom_formal + name = "\improper CentCom formal coat" + desc = "A stylish coat given to CentCom Commanders. Perfect for sending ERTs to suicide missions with style!" + icon_state = "centcom_formal" + item_state = "centcom" + body_parts_covered = CHEST|GROIN|ARMS + armor = list("melee" = 35, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 35, "bio" = 10, "rad" = 10, "fire" = 10, "acid" = 60) + togglename = "buttons" + +/obj/item/clothing/suit/toggle/armor/vest/centcom_formal/Initialize() + . = ..() + allowed = GLOB.security_wintercoat_allowed + +/obj/item/clothing/suit/toggle/armor/hos/hos_formal + name = "\improper Head of Security's parade jacket" + desc = "For when an armoured vest isn't fashionable enough." + icon_state = "hosformal" + item_state = "hostrench" + body_parts_covered = CHEST|GROIN|ARMS + armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90, "wound" = 10) + togglename = "buttons" + +/obj/item/clothing/suit/toggle/armor/hos/hos_formal/Initialize() + . = ..() + allowed = GLOB.security_wintercoat_allowed diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index b56f689979..a58b218c1a 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -103,14 +103,14 @@ . = ..() AddElement(/datum/element/polychromic, poly_colors, 3) -/obj/item/clothing/neck/cancloak/polychromic +/obj/item/clothing/neck/cloak/cancloak/polychromic name = "canvas cloak" desc = "A rugged cloak made of canvas." icon_state = "cancloak" item_state = "cloak" var/list/poly_colors = list("#585858", "#373737", "#BEBEBE") -/obj/item/clothing/neck/cancloak/polychromic/ComponentInitialize() +/obj/item/clothing/neck/cloak/cancloak/polychromic/ComponentInitialize() . = ..() AddElement(/datum/element/polychromic, poly_colors, 3) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 354d488703..35cb2fa1e5 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -446,6 +446,42 @@ icon_state = "flannel_brown" item_state = "flannel_brown" +/obj/item/clothing/suit/jacket/purplehoodie + name = "purple hoodie" + desc = "A soft purple hoodie with a TailorCo brand on the tag." + icon_state = "purplehoodie" + item_state = "purplehoodie" + +/obj/item/clothing/suit/jacket/bluehoodie + name = "blue hoodie" + desc = "A soft blue hoodie with a TailorCo brand on the tag." + icon_state = "bluehoodie" + item_state = "bluehoodie" + +/obj/item/clothing/suit/jacket/heartcoat + name = "heart coat" + desc = "A soft winter coat with a TailorCo brand on the tag." + icon_state = "heartcoat" + item_state = "heartcoat" + +/obj/item/clothing/suit/jacket/gothiccoat + name = "long black jacket" + desc = "A rugged looking coat with a TailorCo brand on the tag." + icon_state = "gothic_coat" + item_state = "gothic_coat" + +/obj/item/clothing/suit/jacket/gothicshirt + name = "black shirt with cuffs" + desc = "A black shirt with a collar and cuffs in a gothic style. A TailorCo brand is listed on the tag." + icon_state = "gothic_shirt" + item_state = "gothic_shirt" + +/obj/item/clothing/suit/jacket/gothicshirtcross + name = "elegant black shirt" + desc = "A black shirt with finely woven cross on the back. A TailorCo brand is listed on the tag." + icon_state = "gothic_shirtcross" + item_state = "gothic_shirtcross" + /obj/item/clothing/suit/jacket/leather name = "leather jacket" desc = "Pompadour not included." diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 4e29483846..78708f54bb 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -6,6 +6,7 @@ var/hoodtype = /obj/item/clothing/head/hooded/winterhood //so the chaplain hoodie or other hoodies can override this ///Alternative mode for hiding the hood, instead of storing the hood in the suit it qdels it, useful for when you deal with hooded suit with storage. var/alternative_mode = FALSE + var/no_t //do not update sprites when pulling up hood so we can avoid oddities with certain mechanics /obj/item/clothing/suit/hooded/Initialize() . = ..() @@ -51,6 +52,8 @@ update_icon() /obj/item/clothing/suit/hooded/update_icon_state() + if(no_t) + return icon_state = "[initial(icon_state)]" if(ishuman(hood?.loc)) var/mob/living/carbon/human/H = hood.loc diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm index 60d82292ef..4e5be1306c 100644 --- a/code/modules/clothing/under/costume.dm +++ b/code/modules/clothing/under/costume.dm @@ -280,23 +280,21 @@ item_state = "qipao" body_parts_covered = CHEST|GROIN can_adjust = FALSE + fitted = FEMALE_UNIFORM_TOP mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON + /obj/item/clothing/under/costume/qipao/white name = "White Qipao" desc = "A Qipao, traditionally worn in ancient Earth China by women during social events and lunar new years. This one is white." icon_state = "qipao_white" item_state = "qipao_white" - body_parts_covered = CHEST|GROIN - can_adjust = FALSE /obj/item/clothing/under/costume/qipao/red name = "Red Qipao" desc = "A Qipao, traditionally worn in ancient Earth China by women during social events and lunar new years. This one is red." icon_state = "qipao_red" item_state = "qipao_red" - body_parts_covered = CHEST|GROIN - can_adjust = FALSE /obj/item/clothing/under/costume/cheongsam name = "Black Cheongsam" @@ -332,9 +330,11 @@ /obj/item/clothing/under/costume/kimono name = "Kimono" - desc = "A traditional piece of clothing from japan" + desc = "A traditional piece of clothing from Japan." icon_state = "kimono" item_state = "kimono" + fitted = FEMALE_UNIFORM_TOP + can_adjust = FALSE /obj/item/clothing/under/costume/kimono/black name = "Black Kimono" diff --git a/code/modules/clothing/under/jobs/Plasmaman/security.dm b/code/modules/clothing/under/jobs/Plasmaman/security.dm index c9b7b494a3..262b336011 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/security.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/security.dm @@ -18,3 +18,9 @@ desc = "A slick black and red plasmaman containment suit designed for the head of security, also called the LAW." icon_state = "hos_envirosuit" item_state = "hos_envirosuit" + +/obj/item/clothing/under/plasmaman/prisoner + name = "prisoner envirosuit" + desc = "An orange envirosuit identifying and protecting a criminal plasmaman." + icon_state = "prisoner_envirosuit" + item_state = "prisoner_envirosuit" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index e01ceba0bf..4dac5f1961 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -319,37 +319,46 @@ /obj/item/clothing/under/misc/black_dress name = "little black dress" - desc = "A small black dress" + desc = "A small black dress." icon_state = "littleblackdress_s" item_state = "littleblackdress_s" + fitted = FEMALE_UNIFORM_TOP + can_adjust = FALSE /obj/item/clothing/under/misc/pinktutu name = "pink tutu" - desc = "A pink tutu" + desc = "A pink tutu." icon_state = "pinktutu_s" item_state = "pinktutu_s" + fitted = FEMALE_UNIFORM_TOP + can_adjust = FALSE /obj/item/clothing/under/misc/bathrobe name = "bathrobe" desc = "A blue bathrobe." icon_state = "bathrobe" item_state = "bathrobe" + fitted = FEMALE_UNIFORM_TOP + can_adjust = FALSE /obj/item/clothing/under/misc/mechsuitred name = "red mech suit" desc = "What are you, stupid?" icon_state = "red_mech_suit" item_state = "red_mech_suit" + can_adjust = FALSE /obj/item/clothing/under/misc/mechsuitwhite name = "white mech suit" desc = "...Mom?" icon_state = "white_mech_suit" item_state = "white_mech_suit" + can_adjust = FALSE /obj/item/clothing/under/misc/mechsuitblue name = "blue mech suit" desc = "Get in the damn robot already!" icon_state = "blue_mech_suit" item_state = "blue_mech_suit" + can_adjust = FALSE diff --git a/code/modules/events/cat_surgeon.dm b/code/modules/events/cat_surgeon.dm index 2d5651b9b1..76c72a7ec2 100644 --- a/code/modules/events/cat_surgeon.dm +++ b/code/modules/events/cat_surgeon.dm @@ -10,8 +10,28 @@ /datum/round_event/cat_surgeon/start() var/list/spawn_locs = list() + var/list/unsafe_spawn_locs = list() for(var/X in GLOB.xeno_spawn) - spawn_locs += X + if(!isfloorturf(X)) + unsafe_spawn_locs += X + continue + var/turf/open/floor/F = X + var/datum/gas_mixture/A = F.air + var/oxy_moles = A.get_moles(GAS_O2) + if((oxy_moles < 16 || oxy_moles > 50) || A.get_moles(GAS_PLASMA) || A.get_moles(GAS_CO2) >= 10) + unsafe_spawn_locs += F + continue + if((A.return_temperature() <= 270) || (A.return_temperature() >= 360)) + unsafe_spawn_locs += F + continue + var/pressure = A.return_pressure() + if((pressure <= 20) || (pressure >= 550)) + unsafe_spawn_locs += F + continue + spawn_locs += F + + if(!spawn_locs.len) + spawn_locs += unsafe_spawn_locs if(!spawn_locs.len) message_admins("No valid spawn locations found, aborting...") diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm index dc0b07b464..0801e38507 100644 --- a/code/modules/events/mass_hallucination.dm +++ b/code/modules/events/mass_hallucination.dm @@ -9,7 +9,7 @@ /datum/round_event_control/mass_hallucination/admin_setup() if(!check_rights(R_FUN)) return - + forced_hallucination = input(usr, "Choose the hallucination to apply","Send Hallucination") as null|anything in subtypesof(/datum/hallucination) /datum/round_event/mass_hallucination @@ -26,7 +26,7 @@ switch(rand(1,4)) if(1) //same sound for everyone - var/sound = pick("airlock","airlock_pry","console","explosion","far_explosion","mech","glass","alarm","beepsky","mech","wall_decon","door_hack","tesla") + var/sound = pick("airlock","airlock_pry","console","explosion","far_explosion","mech","glass","alarm","beepsky","mech","wall_decon","door_hack","tesla","seth") for(var/mob/living/carbon/C in GLOB.alive_mob_list) new /datum/hallucination/sounds(C, TRUE, sound) if(2) diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm index ba14a5307f..d90792c88f 100644 --- a/code/modules/events/sentience.dm +++ b/code/modules/events/sentience.dm @@ -37,7 +37,7 @@ continue if(L.mob_biotypes & blacklisted_biotypes) //hey can you don't continue - if(!(L in GLOB.player_list) && !L.mind) + if(!(L in GLOB.player_list) && !L.mind && !L.incapacitated()) potential += L if(!potential.len) diff --git a/code/modules/events/supermatter_surge.dm b/code/modules/events/supermatter_surge.dm index 6b0a093440..78b5c9e70c 100644 --- a/code/modules/events/supermatter_surge.dm +++ b/code/modules/events/supermatter_surge.dm @@ -27,13 +27,27 @@ if(prob(low_threat_perc)) severity = "low; the supermatter should return to normal operation shortly." else - severity = "medium; the supermatter should return to normal operation, but check NT CIMS to ensure this." + severity = "medium; the supermatter should return to normal operation, but regardless, check if the emitters may need to be turned off temporarily." else - severity = "high; if the supermatter's cooling is not fortified, coolant may need to be added." + severity = "high; the emitters likely need to be turned off, and if the supermatter's cooling loop is not fortified, pre-cooled gas may need to be added." if(100000 to INFINITY) - severity = "extreme; emergency action is likely to be required even if coolant loop is fine." + severity = "extreme; emergency action is likely to be required even if coolant loop is fine. Turn off the emitters and make sure the loop is properly cooling gases." if(power > 20000 || prob(round(power/200))) priority_announce("Supermatter surge detected. Estimated severity is [severity]", "Anomaly Alert") /datum/round_event/supermatter_surge/start() - GLOB.main_supermatter_engine.matter_power += power + var/obj/machinery/power/supermatter_crystal/supermatter = GLOB.main_supermatter_engine + var/power_proportion = supermatter.powerloss_inhibitor/2 // what % of the power goes into matter power, at most 50% + // we reduce the proportion that goes into actual matter power based on powerloss inhibitor + // primarily so the supermatter doesn't tesla the instant these happen + supermatter.matter_power += power * power_proportion + var/datum/gas_mixture/methane_puff = new + var/selected_gas = pick(4;GAS_CO2, 10;GAS_METHANE, 4;GAS_H2O, 1;GAS_BZ, 1;GAS_METHYL_BROMIDE) + methane_puff.set_moles(selected_gas, 500) + methane_puff.set_temperature(500) + var/energy_ratio = (power * 500 * (1-power_proportion)) / methane_puff.thermal_energy() + if(energy_ratio < 1) // energy output we want is lower than current energy, reduce the amount of gas we puff out + methane_puff.set_moles(GAS_METHANE, energy_ratio * 500) + else // energy output we want is higher than current energy, increase its actual heat + methane_puff.set_temperature(energy_ratio * 500) + supermatter.assume_air(methane_puff) diff --git a/code/modules/events/supernova.dm b/code/modules/events/supernova.dm index ca64984cde..e1d6991c89 100644 --- a/code/modules/events/supernova.dm +++ b/code/modules/events/supernova.dm @@ -12,6 +12,7 @@ var/power = 1 var/datum/sun/supernova var/storm_count = 0 + var/announced = FALSE /datum/round_event/supernova/setup() announceWhen = rand(4, 60) @@ -30,9 +31,10 @@ supernova.power_mod = 0 /datum/round_event/supernova/announce() - var/message = "[station_name()]: Our tachyon-doppler array has detected a supernova in your vicinity. Peak flux from the supernova estimated to be [round(power,0.1)] times current solar flux; if the supernova is close to your sun in the sky, your solars may receive this as a power boost.[power > 1 ? " Short burts of radiation may be possible, so please prepare accordingly." : ""] We hope you enjoy the light." + var/message = "[station_name()]: Our tachyon-doppler array has detected a supernova in your vicinity. Peak flux from the supernova estimated to be [round(power,0.1)] times current solar flux; if the supernova is close to your sun in the sky, your solars may receive this as a power boost.[power > 1 ? " Short burts of radiation may be possible, so please prepare accordingly." : "We expect no radiation bursts from this one."] We hope you enjoy the light." if(prob(power * 25)) priority_announce(message, sender_override = "Nanotrasen Meteorology Division") + announced = TRUE else print_command_report(message) @@ -56,15 +58,16 @@ supernova.power_mod = min(supernova.power_mod*1.2, power) if(activeFor > endWhen-10) supernova.power_mod /= 4 - if(prob(round(supernova.power_mod*2)) && prob(3) && storm_count < 5 && !SSweather.get_weather_by_type(/datum/weather/rad_storm)) + if(prob(round(supernova.power_mod)) && prob(3) && storm_count < 5 && !SSweather.get_weather_by_type(/datum/weather/rad_storm)) SSweather.run_weather(/datum/weather/rad_storm/supernova) storm_count++ /datum/round_event/supernova/end() SSsun.suns -= supernova qdel(supernova) - priority_announce("The supernova's flux is now negligible. Radiation storms have ceased. Have a pleasant shift, [station_name()], and thank you for bearing with nature.", - sender_override = "Nanotrasen Meteorology Division") + if(announced) + priority_announce("The supernova's flux is now negligible. Radiation storms have ceased. Have a pleasant shift, [station_name()], and thank you for bearing with nature.", + sender_override = "Nanotrasen Meteorology Division") /datum/weather/rad_storm/supernova weather_duration_lower = 50 diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index cc18207a29..5d84901e7f 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -31,7 +31,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( if(!hallucination) return - hallucination-- + hallucination = max(hallucination-1, 0) if(world.time < next_hallucination) return @@ -778,7 +778,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( ..() var/turf/source = random_far_turf() if(!sound_type) - sound_type = pick("airlock","airlock pry","console","flash","explosion","far explosion","mech","glass","alarm","beepsky","mech","wall decon","door hack") + sound_type = pick("airlock","airlock pry","console","flash","explosion","far explosion","mech","glass","alarm","beepsky","mech","wall decon","door hack","seth") feedback_details += "Type: [sound_type]" //Strange audio switch(sound_type) @@ -827,6 +827,9 @@ GLOBAL_LIST_INIT(hallucination_list, list( target.playsound_local(source, 'sound/items/screwdriver.ogg', 50, 1) sleep(rand(40,80)) target.playsound_local(source, 'sound/machines/airlockforced.ogg', 30, 1) + //funny announcement man + if("seth") + target.playsound_local(source,'sound/misc/seth.ogg', 50, 1) qdel(src) /datum/hallucination/weird_sounds @@ -933,46 +936,46 @@ GLOBAL_LIST_INIT(hallucination_list, list( feedback_details += "Type: [alert_type]" switch(alert_type) if("not_enough_oxy") - target.throw_alert(alert_type, /obj/screen/alert/not_enough_oxy, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/not_enough_oxy, override = TRUE) if("not_enough_tox") - target.throw_alert(alert_type, /obj/screen/alert/not_enough_tox, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/not_enough_tox, override = TRUE) if("not_enough_co2") - target.throw_alert(alert_type, /obj/screen/alert/not_enough_co2, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/not_enough_co2, override = TRUE) if("too_much_oxy") - target.throw_alert(alert_type, /obj/screen/alert/too_much_oxy, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/too_much_oxy, override = TRUE) if("too_much_co2") - target.throw_alert(alert_type, /obj/screen/alert/too_much_co2, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/too_much_co2, override = TRUE) if("too_much_tox") - target.throw_alert(alert_type, /obj/screen/alert/too_much_tox, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/too_much_tox, override = TRUE) if("nutrition") if(prob(50)) - target.throw_alert(alert_type, /obj/screen/alert/fat, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/fat, override = TRUE) else - target.throw_alert(alert_type, /obj/screen/alert/starving, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/starving, override = TRUE) if("gravity") - target.throw_alert(alert_type, /obj/screen/alert/weightless, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/weightless, override = TRUE) if("fire") - target.throw_alert(alert_type, /obj/screen/alert/fire, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/fire, override = TRUE) if("temphot") alert_type = "temp" - target.throw_alert(alert_type, /obj/screen/alert/hot, 3, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/hot, 3, override = TRUE) if("tempcold") alert_type = "temp" - target.throw_alert(alert_type, /obj/screen/alert/cold, 3, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/cold, 3, override = TRUE) if("pressure") if(prob(50)) - target.throw_alert(alert_type, /obj/screen/alert/highpressure, 2, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/highpressure, 2, override = TRUE) else - target.throw_alert(alert_type, /obj/screen/alert/lowpressure, 2, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/lowpressure, 2, override = TRUE) //BEEP BOOP I AM A ROBOT if("newlaw") - target.throw_alert(alert_type, /obj/screen/alert/newlaw, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/newlaw, override = TRUE) if("locked") - target.throw_alert(alert_type, /obj/screen/alert/locked, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/locked, override = TRUE) if("hacked") - target.throw_alert(alert_type, /obj/screen/alert/hacked, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/hacked, override = TRUE) if("charge") - target.throw_alert(alert_type, /obj/screen/alert/emptycell, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/emptycell, override = TRUE) sleep(duration) target.clear_alert(alert_type, clear_override = TRUE) qdel(src) @@ -1181,7 +1184,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( if(target.client) target.client.images += fire_overlay to_chat(target, "You're set on fire!") - target.throw_alert("fire", /obj/screen/alert/fire, override = TRUE) + target.throw_alert("fire", /atom/movable/screen/alert/fire, override = TRUE) sleep(20) for(var/i in 1 to 3) if(target.fire_stacks <= 0) @@ -1203,7 +1206,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( target.clear_alert("temp", clear_override = TRUE) else target.clear_alert("temp", clear_override = TRUE) - target.throw_alert("temp", /obj/screen/alert/hot, stage, override = TRUE) + target.throw_alert("temp", /atom/movable/screen/alert/hot, stage, override = TRUE) /datum/hallucination/fire/proc/clear_fire() if(!active) diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 7377913c15..f650a935ea 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -497,6 +497,72 @@ /obj/item/reagent_containers/food/drinks/bottle/grenadine/empty list_reagents = null +/obj/item/reagent_containers/food/drinks/bottle/blank //Don't let players print these from a lathe, bottles should be obtained in mass from the bar only. + name = "glass bottle" + desc = "This blank bottle is unyieldingly anonymous, offering no clues to it's contents." + icon_state = "glassbottle" + volume = 90 + spillable = TRUE + obj_flags = UNIQUE_RENAME + +/obj/item/reagent_containers/food/drinks/bottle/blank/update_icon() + ..() + add_overlay("[initial(icon_state)]shine") + +/obj/item/reagent_containers/food/drinks/bottle/blank/Initialize() + . = ..() + update_icon() + +/obj/item/reagent_containers/food/drinks/bottle/blank/get_part_rating() + return reagents.maximum_volume + +/obj/item/reagent_containers/food/drinks/bottle/blank/on_reagent_change(changetype) + update_icon() + +/obj/item/reagent_containers/food/drinks/bottle/blank/update_overlays() + . = ..() + if(!cached_icon) + cached_icon = icon_state + + if(reagents.total_volume) + var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "[cached_icon]10", color = mix_color_from_reagents(reagents.reagent_list)) + + var/percent = round((reagents.total_volume / volume) * 100) + switch(percent) + if(0 to 9) + filling.icon_state = "[cached_icon]0" + if(10 to 19) + filling.icon_state = "[cached_icon]10" + if(20 to 29) + filling.icon_state = "[cached_icon]20" + if(30 to 39) + filling.icon_state = "[cached_icon]30" + if(40 to 49) + filling.icon_state = "[cached_icon]40" + if(50 to 59) + filling.icon_state = "[cached_icon]50" + if(60 to 69) + filling.icon_state = "[cached_icon]60" + if(70 to 79) + filling.icon_state = "[cached_icon]70" + if(80 to 89) + filling.icon_state = "[cached_icon]80" + if(90 to INFINITY) + filling.icon_state = "[cached_icon]90" + . += filling + +/obj/item/reagent_containers/food/drinks/bottle/blank/small + name = "small glass bottle" + desc = "This small bottle is unyieldingly anonymous, offering no clues to it's contents." + icon_state = "glassbottlesmall" + volume = 60 + +/obj/item/reagent_containers/food/drinks/bottle/blank/pitcher + name = "glass pitcher" + desc = "This is a pitcher for large amounts of liquid of any kind." + icon_state = "unipitcher" + volume = 120 + ////////////////////////// MOLOTOV /////////////////////// /obj/item/reagent_containers/food/drinks/bottle/molotov name = "molotov cocktail" diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm index 0e2bdc63c8..42f536c4f3 100644 --- a/code/modules/food_and_drinks/food/customizables.dm +++ b/code/modules/food_and_drinks/food/customizables.dm @@ -66,7 +66,7 @@ . = ..() -/obj/item/reagent_containers/food/snacks/customizable/proc/update_name(obj/item/reagent_containers/food/snacks/S) +/obj/item/reagent_containers/food/snacks/customizable/update_name(obj/item/reagent_containers/food/snacks/S) for(var/obj/item/I in ingredients) if(!istype(S, I.type)) customname = "custom" diff --git a/code/modules/food_and_drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm index f30d955b00..b11d2b83b9 100644 --- a/code/modules/food_and_drinks/food/snacks_bread.dm +++ b/code/modules/food_and_drinks/food/snacks_bread.dm @@ -19,7 +19,7 @@ custom_food_type = /obj/item/reagent_containers/food/snacks/customizable/sandwich filling_color = "#FFA500" list_reagents = list(/datum/reagent/consumable/nutriment = 2) - slot_flags = ITEM_SLOT_HEAD + slot_flags = ITEM_SLOT_MASK customfoodfilling = 0 //to avoid infinite bread-ception foodtype = GRAIN dunkable = TRUE diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm index 4fc55ba4c3..303d18b4a4 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm @@ -8,8 +8,6 @@ #define CONE_WAFFLE 8 #define CONE_CHOC 9 - - /obj/machinery/icecream_vat name = "ice cream vat" desc = "Ding-aling ding dong. Get your Nanotrasen-approved ice cream!" @@ -35,6 +33,8 @@ /datum/reagent/consumable/ethanol/singulo = 6, /datum/reagent/consumable/peachjuice = 6, /datum/reagent/consumable/grapejuice = 6) + var/custom_taste + var/custom_color /obj/machinery/icecream_vat/proc/get_ingredient_list(type) switch(type) @@ -99,7 +99,10 @@ dat += "Peach ice cream: Select Make x5 [product_types[ICECREAM_PEACH]] dollops left. (Ingredients: milk, ice, peach juice)
" dat += "Grape ice cream: Select Make x5 [product_types[ICECREAM_GRAPE]] dollops left. (Ingredients: milk, ice, grape juice)
" dat += "Blue ice cream: Select Make x5 [product_types[ICECREAM_BLUE]] dollops left. (Ingredients: milk, ice, singulo)
" - dat += "Custom ice cream: Select Make x5 [product_types[ICECREAM_CUSTOM]] dollops left. (Ingredients: milk, ice, optional flavoring)
" + dat += "Custom ice cream: Select Make x5 [product_types[ICECREAM_CUSTOM]] dollops left. (Ingredients: milk, ice, optional flavoring)
" + dat += "Change custom taste: [custom_taste ? custom_taste : "Default"]" + dat += "
Change custom color: [custom_color ? custom_color : "Default"]" + dat += "
Reset custom ice cream taste and color to defaults" dat += "
CONES
" dat += "Waffle cones: Dispense Make x5 [product_types[CONE_WAFFLE]] cones left. (Ingredients: flour, sugar)
" dat += "Chocolate cones: Dispense Make x5 [product_types[CONE_CHOC]] cones left. (Ingredients: flour, sugar, coco powder)
" @@ -128,7 +131,7 @@ visible_message("[icon2html(src, viewers(src))] [user] scoops delicious [flavour_name] ice cream into [I].") product_types[dispense_flavour] -= 1 if(beaker && beaker.reagents.total_volume) - I.add_ice_cream(flavour_name, beaker.reagents) + I.add_ice_cream(flavour_name, beaker.reagents, custom_color, custom_taste) else I.add_ice_cream(flavour_name) if(I.reagents.total_volume < 10) @@ -213,14 +216,25 @@ if(href_list["refill"]) RefillFromBeaker() - updateDialog() - if(href_list["refresh"]) updateDialog() if(href_list["close"]) usr.unset_machine() usr << browse(null,"window=icecreamvat") + + if(href_list["custom_taste"]) + custom_taste = stripped_input(usr, "Set a custom taste for the custom icecream. 50 characters max, leave blank to go back to the default option.", max_length = 50) + + if(href_list["custom_color"]) + custom_color = input(usr, "Choose a color for the custom icecream. Cancel to go back to the default option.") as color|null + + if(href_list["reset_custom"]) + custom_taste = null + custom_color = null + + updateDialog() // i have no clue why we even have refresh when this is a thing but sure + return /obj/item/reagent_containers/food/snacks/icecream @@ -251,7 +265,7 @@ desc = "Delicious [cone_name] cone, but no ice cream." -/obj/item/reagent_containers/food/snacks/icecream/proc/add_ice_cream(flavour_name, datum/reagents/R) +/obj/item/reagent_containers/food/snacks/icecream/proc/add_ice_cream(flavour_name, datum/reagents/R, custom_color, custom_taste) name = "[flavour_name] icecream" switch (flavour_name) // adding the actual reagents advertised in the ingredient list if ("vanilla") @@ -286,8 +300,11 @@ if(R && R.total_volume >= 4) //consumable reagents have stronger taste so higher volume will allow non-food flavourings to break through better. var/mutable_appearance/flavoring = mutable_appearance(icon,"icecream_custom") var/datum/reagent/master = R.get_master_reagent() - flavoring.color = master.color - filling_color = master.color + flavoring.color = custom_color ? custom_color : master.color + filling_color = custom_color ? custom_color : master.color + if(custom_taste) + tastes = list("[custom_taste]" = 1) + reagents.force_alt_taste = TRUE name = "[master.name] icecream" desc = "A delicious [cone_type] cone filled with artisanal icecream. Made with real [master.name]. Ain't that something." R.trans_to(src, 4) diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index f97ef17364..58769cebf1 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -59,6 +59,10 @@ else icon_state = "[initial(icon_state)]-off" +/obj/machinery/smartfridge/update_overlays() + . = ..() + if(!stat) + . += emissive_appearance(icon, "smartfridge-light-mask", alpha = src.alpha) /******************* @@ -468,7 +472,7 @@ /obj/item/reagent_containers/medspray/sterilizine = 1) /obj/machinery/smartfridge/organ/preloaded/Initialize() - ..() + . = ..() var/list = list(/obj/item/organ/tongue, /obj/item/organ/brain, /obj/item/organ/heart, /obj/item/organ/liver, /obj/item/organ/ears, /obj/item/organ/eyes, /obj/item/organ/tail, /obj/item/organ/stomach) var/newtype = pick(list) load(new newtype(src.loc)) diff --git a/code/modules/holiday/halloween/jacqueen.dm b/code/modules/holiday/halloween/jacqueen.dm index 11bd330112..ed7453ad3e 100644 --- a/code/modules/holiday/halloween/jacqueen.dm +++ b/code/modules/holiday/halloween/jacqueen.dm @@ -57,7 +57,7 @@ /obj/mafia_game_board, /obj/docking_port, /obj/shapeshift_holder, - /obj/screen + /atom/movable/screen )) /mob/living/simple_animal/jacq/Initialize() diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index e3f5264568..239246cd59 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -641,6 +641,18 @@ Since Ramadan is an entire month that lasts 29.5 days on average, the start and /datum/holiday/easter/getStationPrefix() return pick("Fluffy","Bunny","Easter","Egg") +/datum/holiday/ianbirthday + name = "Ian's Birthday" //github.com/tgstation/tgstation/commit/de7e4f0de0d568cd6e1f0d7bcc3fd34700598acb + begin_month = SEPTEMBER + begin_day = 9 + end_day = 10 + +/datum/holiday/ianbirthday/greet() + return "Happy birthday, Ian!" + +/datum/holiday/ianbirthday/getStationPrefix() + return pick("Ian", "Corgi", "Erro") + //Random citadel thing for halloween species /proc/force_enable_halloween_species() var/list/oldlist = SSevents.holidays diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index a0c273613f..a6ba5ec461 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -430,7 +430,7 @@ src.pixel_x = rand(-5, 5) src.pixel_y = rand(-5, 5) -/obj/item/disk/plantgene/proc/update_name() +/obj/item/disk/plantgene/update_name() if(gene) name = "[gene.get_name()] (plant data disk)" else diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm index 5f9b55b881..843688b5a0 100644 --- a/code/modules/hydroponics/grown/root.dm +++ b/code/modules/hydroponics/grown/root.dm @@ -29,7 +29,7 @@ /obj/item/reagent_containers/food/snacks/grown/carrot/attackby(obj/item/I, mob/user, params) if(I.get_sharpness()) to_chat(user, "You sharpen the carrot into a shiv with [I].") - var/obj/item/kitchen/knife/carrotshiv/Shiv = new /obj/item/kitchen/knife/carrotshiv + var/obj/item/kitchen/knife/shiv/carrot/Shiv = new /obj/item/kitchen/knife/shiv/carrot remove_item_from_storage(user) qdel(src) user.put_in_hands(Shiv) diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 9c82cf34d3..38e4fcc6ff 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -226,7 +226,7 @@ var/turf/open/O = loc if(O.air) var/datum/gas_mixture/loc_air = O.air - if(loc_air.get_moles(GAS_O2) > 13) + if(loc_air.get_moles(GAS_O2) > 3) return TRUE return FALSE diff --git a/code/modules/integrated_electronics/subtypes/access.dm b/code/modules/integrated_electronics/subtypes/access.dm index 5e03ea1394..ddfed3753b 100644 --- a/code/modules/integrated_electronics/subtypes/access.dm +++ b/code/modules/integrated_electronics/subtypes/access.dm @@ -8,7 +8,6 @@ outputs = list( "registered name" = IC_PINTYPE_STRING, "assignment" = IC_PINTYPE_STRING, - "passkey" = IC_PINTYPE_STRING ) activators = list( "on read" = IC_PINTYPE_PULSE_OUT @@ -17,7 +16,6 @@ /obj/item/integrated_circuit/input/card_reader/attackby_react(obj/item/I, mob/living/user, intent) var/obj/item/card/id/card = I.GetID() var/list/access = I.GetAccess() - var/passkey = strtohex(XorEncrypt(json_encode(access), SScircuit.cipherkey)) if(assembly) assembly.access_card.access |= access @@ -33,8 +31,6 @@ else return FALSE - set_pin_data(IC_OUTPUT, 3, passkey) - push_data() activate_pin(1) return TRUE diff --git a/code/modules/integrated_electronics/subtypes/atmospherics.dm b/code/modules/integrated_electronics/subtypes/atmospherics.dm index 600f5113e1..b3056d46cf 100644 --- a/code/modules/integrated_electronics/subtypes/atmospherics.dm +++ b/code/modules/integrated_electronics/subtypes/atmospherics.dm @@ -19,7 +19,7 @@ /obj/item/integrated_circuit/atmospherics/Initialize() air_contents = new(volume) - ..() + return ..() /obj/item/integrated_circuit/atmospherics/return_air() return air_contents diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index 06e1863bc9..35a89b46db 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -355,7 +355,7 @@ return list("Assistant", "Captain", "Head of Personnel", "Bartender", "Cook", "Botanist", "Quartermaster", "Cargo Technician", "Shaft Miner", "Clown", "Mime", "Janitor", "Curator", "Lawyer", "Chaplain", "Chief Engineer", "Station Engineer", "Atmospheric Technician", "Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist", "Paramedic", - "Research Director", "Scientist", "Roboticist", "Head of Security", "Warden", "Detective", "Security Officer") + "Research Director", "Scientist", "Roboticist", "Head of Security", "Warden", "Detective", "Security Officer", "Prisoner") /proc/get_all_job_icons() //For all existing HUD icons return get_all_jobs() + list("Prisoner") diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index bff56d1d16..de66c32138 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -39,7 +39,7 @@ backpack = /obj/item/storage/backpack/industrial satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering - box = /obj/item/storage/box/engineer + box = /obj/item/storage/box/survival/engineer pda_slot = SLOT_L_STORE backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1) diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index 902be0bdc8..804952dbb2 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -54,7 +54,7 @@ backpack = /obj/item/storage/backpack/industrial satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering - box = /obj/item/storage/box/engineer + box = /obj/item/storage/box/survival/engineer pda_slot = SLOT_L_STORE chameleon_extras = /obj/item/stamp/ce diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index c772a8acae..d612b6a56d 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -58,7 +58,7 @@ backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec duffelbag = /obj/item/storage/backpack/duffelbag/sec - box = /obj/item/storage/box/security + box = /obj/item/storage/box/survival/security implants = list(/obj/item/implant/mindshield) diff --git a/code/modules/jobs/job_types/prisoner.dm b/code/modules/jobs/job_types/prisoner.dm new file mode 100644 index 0000000000..2ad2f32537 --- /dev/null +++ b/code/modules/jobs/job_types/prisoner.dm @@ -0,0 +1,24 @@ +datum/job/prisoner + title = "Prisoner" + flag = PRISONER + department_head = list("The Security Team") + department_flag = CIVILIAN + faction = "Station" + total_positions = 0 + spawn_positions = 2 + supervisors = "the security team" + + outfit = /datum/outfit/job/prisoner + plasma_outfit = /datum/outfit/plasmaman/prisoner + + display_order = JOB_DISPLAY_ORDER_PRISONER + +/datum/outfit/job/prisoner + name = "Prisoner" + jobtype = /datum/job/prisoner + + uniform = /obj/item/clothing/under/rank/prisoner + shoes = /obj/item/clothing/shoes/sneakers/orange + id = /obj/item/card/id/prisoner + ears = /obj/item/radio/headset/headset_prisoner + belt = null diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index bdae7fe028..3462fb96c9 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -133,7 +133,7 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec duffelbag = /obj/item/storage/backpack/duffelbag/sec - box = /obj/item/storage/box/security + box = /obj/item/storage/box/survival/security implants = list(/obj/item/implant/mindshield) diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index 04d3fb53b8..0c04380afe 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -45,7 +45,7 @@ backpack = /obj/item/storage/backpack/explorer satchel = /obj/item/storage/backpack/satchel/explorer duffelbag = /obj/item/storage/backpack/duffelbag - box = /obj/item/storage/box/survival_mining + box = /obj/item/storage/box/survival/mining chameleon_extras = /obj/item/gun/energy/kinetic_accelerator diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm index 2396728ad8..25bd2196a0 100644 --- a/code/modules/jobs/job_types/station_engineer.dm +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -42,7 +42,7 @@ backpack = /obj/item/storage/backpack/industrial satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering - box = /obj/item/storage/box/engineer + box = /obj/item/storage/box/survival/engineer pda_slot = SLOT_L_STORE backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1) diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index dae3094ebe..074ccac09f 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -54,7 +54,7 @@ backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec duffelbag = /obj/item/storage/backpack/duffelbag/sec - box = /obj/item/storage/box/security + box = /obj/item/storage/box/survival/security implants = list(/obj/item/implant/mindshield) diff --git a/code/modules/jobs/jobs.dm b/code/modules/jobs/jobs.dm index 78b7dd3964..d91b102599 100644 --- a/code/modules/jobs/jobs.dm +++ b/code/modules/jobs/jobs.dm @@ -43,6 +43,7 @@ GLOBAL_LIST_INIT(civilian_positions, list( "Chaplain", "Clown", "Mime", + "Prisoner", "Assistant")) GLOBAL_LIST_INIT(security_positions, list( diff --git a/code/modules/lighting/emissive_blocker.dm b/code/modules/lighting/emissive_blocker.dm index 04c1bb7302..46dc44792b 100644 --- a/code/modules/lighting/emissive_blocker.dm +++ b/code/modules/lighting/emissive_blocker.dm @@ -7,9 +7,9 @@ * almost guaranteed to be doing something wrong. */ /atom/movable/emissive_blocker - name = "" - plane = EMISSIVE_BLOCKER_PLANE - layer = EMISSIVE_BLOCKER_LAYER + name = "emissive blocker" + plane = EMISSIVE_PLANE + layer = FLOAT_LAYER mouse_opacity = MOUSE_OPACITY_TRANSPARENT rad_flags = RAD_NO_CONTAMINATE | RAD_PROTECT_CONTENTS //Why? @@ -23,6 +23,8 @@ verbs.Cut() //Cargo culting from lighting object, this maybe affects memory usage? render_source = source + color = GLOB.em_block_color + /atom/movable/emissive_blocker/ex_act(severity) return FALSE diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm index 71702bef12..f9df19d2ac 100644 --- a/code/modules/lighting/lighting_atom.dm +++ b/code/modules/lighting/lighting_atom.dm @@ -132,3 +132,54 @@ /mob/living/proc/mob_light(_color, _range, _power, _duration) var/obj/effect/dummy/lighting_obj/moblight/mob_light_obj = new (src, _color, _range, _power, _duration) return mob_light_obj + +// Setter for the light power of this atom. +/atom/proc/set_light_power(new_power) + if(new_power == light_power) + return + if(SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_POWER, new_power) & COMPONENT_BLOCK_LIGHT_UPDATE) + return + . = light_power + light_power = new_power + SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_LIGHT_POWER, .) + +/// Setter for the light range of this atom. +/atom/proc/set_light_range(new_range) + if(new_range == light_range) + return + if(SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_RANGE, new_range) & COMPONENT_BLOCK_LIGHT_UPDATE) + return + . = light_range + light_range = new_range + SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_LIGHT_RANGE, .) + +/// Setter for the light color of this atom. +/atom/proc/set_light_color(new_color) + if(new_color == light_color) + return + if(SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_COLOR, new_color) & COMPONENT_BLOCK_LIGHT_UPDATE) + return + . = light_color + light_color = new_color + SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_LIGHT_COLOR, .) +/* +/// Setter for whether or not this atom's light is on. +/atom/proc/set_light_on(new_value) + if(new_value == ) + return + if(SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_ON, new_value) & COMPONENT_BLOCK_LIGHT_UPDATE) + return + . = light_on + light_on = new_value + SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_LIGHT_ON, .) + +/// Setter for the light flags of this atom. +/atom/proc/set_light_flags(new_value) + if(new_value == light_flags) + return + if(SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_FLAGS, new_value) & COMPONENT_BLOCK_LIGHT_UPDATE) + return + . = light_flags + light_flags = new_value + SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_LIGHT_FLAGS, .) +*/ diff --git a/code/modules/mafia/_defines.dm b/code/modules/mafia/_defines.dm index 194851beed..6c0c73e0d0 100644 --- a/code/modules/mafia/_defines.dm +++ b/code/modules/mafia/_defines.dm @@ -6,14 +6,16 @@ #define MAFIA_TEAM_SOLO "solo" //types of town roles for random setup gen -/// assistants it's just assistants filling up the rest of the roles +/// Add this if you don't want a role to be a choice in the selection #define TOWN_OVERFLOW "overflow" /// roles that learn info about others in the game (chaplain, detective, psych) #define TOWN_INVEST "invest" -/// roles that keep other roles safe (doctor, and weirdly enough lawyer counts) +/// roles that keep other roles safe (doctor, sec officer, and weirdly enough lawyer counts) #define TOWN_PROTECT "protect" +/// roles that are only there to kill bad guys. +#define TOWN_KILLING "killing" /// roles that don't fit into anything else (hop) -#define TOWN_MISC "misc" +#define TOWN_SUPPORT "support" //other types (mafia team, neutrals) /// normal vote kill changelings @@ -25,6 +27,20 @@ /// role that upsets the game aka obsessed, usually worse for town than mafia but they can vote against mafia #define NEUTRAL_DISRUPT "disrupt" +//role flags (special status of roles like detection immune) +///to all forms of detection, shows themselves as an assistant. +#define ROLE_UNDETECTABLE (1<<0) +///has the ability to kill at night and thus, blocks the game from ending with other teams alive. +#define ROLE_CAN_KILL (1<<1) +///can only be one in a randomly generated game +#define ROLE_UNIQUE (1<<2) +///role is public to all other players in the game. +#define ROLE_REVEALED (1<<3) +///can not be defended, protected, or any other form of protection. all kills succeed no matter what. +#define ROLE_VULNERABLE (1<<4) +///cannot perform any actions that night, preselected actions fail +#define ROLE_ROLEBLOCKED (1<<5) + #define MAFIA_PHASE_SETUP 1 #define MAFIA_PHASE_DAY 2 #define MAFIA_PHASE_VOTING 3 @@ -35,12 +51,12 @@ #define MAFIA_ALIVE 1 #define MAFIA_DEAD 2 +#define COMSIG_MAFIA_ON_VISIT "mafia_onvisit" +#define MAFIA_VISIT_INTERRUPTED 1 + #define COMSIG_MAFIA_ON_KILL "mafia_onkill" #define MAFIA_PREVENT_KILL 1 -#define COMSIG_MAFIA_CAN_PERFORM_ACTION "mafia_can_perform_action" -#define MAFIA_PREVENT_ACTION 1 - //in order of events + game end /// when the shutters fall, before the 45 second wait and night event resolution diff --git a/code/modules/mafia/controller.dm b/code/modules/mafia/controller.dm index 54dcaebeec..43d15ebffe 100644 --- a/code/modules/mafia/controller.dm +++ b/code/modules/mafia/controller.dm @@ -15,6 +15,8 @@ var/phase = MAFIA_PHASE_SETUP ///how long the game has gone on for, changes with every sunrise. day one, night one, day two, etc. var/turn = 0 + ///if enabled, the game has fallen under half pop and is sped up + var/speed_up = FALSE ///for debugging and testing a full game, or adminbuse. If this is not empty, it will use this as a setup. clears when game is over var/list/custom_setup = list() ///first day has no voting, and thus is shorter @@ -187,8 +189,22 @@ turn += 1 phase = MAFIA_PHASE_DAY if(!check_victory()) + if(!speed_up)//lets check if the game should be sped up, if not already. + var/living_players = 0 + for(var/i in all_roles) + var/datum/mafia_role/player = i + if(player.game_status == MAFIA_ALIVE) + living_players += 1 + if(living_players < all_roles.len / 2) + speed_up = TRUE + send_message("With only [living_players] living players left, the game timers have been sped up.") + day_phase_period /= 2 + voting_phase_period /= 2 + judgement_phase_period /= 2 + judgement_lynch_period /= 2 + night_phase_period /= 2 if(turn == 1) - send_message("The selected map is [current_map.name]!
[current_map.description]
") + send_message(span_notice("The selected map is [current_map.name]!
[current_map.description]")) send_message("Day [turn] started! There is no voting on the first day. Say hello to everybody!") next_phase_timer = addtimer(CALLBACK(src,.proc/check_trial, FALSE),first_day_phase_period,TIMER_STOPPABLE) //no voting period = no votes = instant night else @@ -257,19 +273,19 @@ /datum/mafia_controller/proc/lynch() for(var/i in judgement_innocent_votes) var/datum/mafia_role/role = i - send_message("[role.body.real_name] voted innocent.") + send_message(span_green("[role.body.real_name] voted innocent.")) for(var/ii in judgement_abstain_votes) var/datum/mafia_role/role = ii - send_message("[role.body.real_name] abstained.") + send_message(span_comradio("[role.body.real_name] abstained.")) for(var/iii in judgement_guilty_votes) var/datum/mafia_role/role = iii - send_message("[role.body.real_name] voted guilty.") + send_message(span_red("[role.body.real_name] voted guilty.")) if(judgement_guilty_votes.len > judgement_innocent_votes.len) //strictly need majority guilty to lynch - send_message("Guilty wins majority, [on_trial.body.real_name] has been lynched.") - on_trial.kill(src, lynch = TRUE) + send_message(span_red("Guilty wins majority, [on_trial.body.real_name] has been lynched.")) + on_trial.kill(src,lynch = TRUE) addtimer(CALLBACK(src, .proc/send_home, on_trial),judgement_lynch_period) else - send_message("Innocent wins majority, [on_trial.body.real_name] has been spared.") + send_message(span_green("Innocent wins majority, [on_trial.body.real_name] has been spared.")) on_trial.body.forceMove(get_turf(on_trial.assigned_landmark)) on_trial = null //day votes are already cleared, so this will skip the trial and check victory/lockdown/whatever else @@ -300,11 +316,14 @@ var/list/total_town = list() var/list/total_mafia = list() - var/alive_town = 0 + //voting power of town + solos (since they don't want mafia to overpower) + var/anti_mafia_power = 0 + //voting power of mafia (greater than anti mafia power + team end not blocked = mafia victory) var/alive_mafia = 0 var/list/solos_to_ask = list() //need to ask after because first round is counting team sizes var/list/total_victors = list() //if this list gets filled with anyone, they win. list because side antags can with with people var/blocked_victory = FALSE //if a solo antagonist is stopping the town or mafia from finishing the game. + var/town_can_kill = FALSE //Town has a killing role and it cannot allow mafia to win ///PHASE ONE: TALLY UP ALL NUMBERS OF PEOPLE STILL ALIVE @@ -313,23 +332,24 @@ if(MAFIA_TEAM_MAFIA) total_mafia += R if(R.game_status == MAFIA_ALIVE) - alive_mafia += R.vote_power + alive_mafia += R.vote_potential if(MAFIA_TEAM_TOWN) total_town += R if(R.game_status == MAFIA_ALIVE) - alive_town += R.vote_power + anti_mafia_power += R.vote_potential + if(R.role_flags & ROLE_CAN_KILL) //the game cannot autoresolve with killing roles (unless a solo wins anyways, like traitors who are immune) + town_can_kill = TRUE if(MAFIA_TEAM_SOLO) if(R.game_status == MAFIA_ALIVE) - if(R.solo_counts_as_town) - alive_town += R.vote_power + anti_mafia_power += R.vote_potential solos_to_ask += R ///PHASE TWO: SEND STATS TO SOLO ANTAGS, SEE IF THEY WON OR TEAMS CANNOT WIN for(var/datum/mafia_role/solo in solos_to_ask) - if(solo.check_total_victory(alive_town, alive_mafia)) + if(solo.check_total_victory(anti_mafia_power, alive_mafia)) total_victors += solo - if(solo.block_team_victory(alive_town, alive_mafia)) + if(solo.block_team_victory(anti_mafia_power, alive_mafia)) blocked_victory = TRUE //solo victories! @@ -348,7 +368,7 @@ award_role(townie.winner_award, townie) start_the_end("!! TOWN VICTORY !!") return TRUE - else if(alive_mafia >= alive_town) //guess could change if town nightkill is added + else if(alive_mafia >= anti_mafia_power && !town_can_kill) start_the_end("!! MAFIA VICTORY !!") for(var/datum/mafia_role/changeling in total_mafia) award_role(changeling.winner_award, changeling) @@ -396,6 +416,13 @@ custom_setup = list() turn = 0 votes = list() + + day_phase_period = initial(day_phase_period) + voting_phase_period = initial(voting_phase_period) + judgement_phase_period = initial(judgement_phase_period) + judgement_lynch_period = initial(judgement_lynch_period) + night_phase_period = initial(night_phase_period) + //map gen does not deal with landmarks QDEL_LIST(landmarks) QDEL_NULL(town_center_landmark) @@ -451,14 +478,15 @@ SEND_SIGNAL(src,COMSIG_MAFIA_NIGHT_START) SEND_SIGNAL(src,COMSIG_MAFIA_NIGHT_ACTION_PHASE) //resolve mafia kill, todo unsnowflake this - var/datum/mafia_role/R = get_vote_winner("Mafia") - if(R) + var/datum/mafia_role/victim = get_vote_winner("Mafia") + if(victim) var/datum/mafia_role/killer = get_random_voter("Mafia") - if(SEND_SIGNAL(killer,COMSIG_MAFIA_CAN_PERFORM_ACTION,src,"mafia killing",R) & MAFIA_PREVENT_ACTION) - send_message("[killer.body.real_name] was unable to attack [R.body.real_name] tonight!",MAFIA_TEAM_MAFIA) + if(!victim.can_action(src, killer, "changeling murder")) + send_message(span_danger("[killer.body.real_name] was unable to attack [victim.body.real_name] tonight!"),MAFIA_TEAM_MAFIA) else - send_message("[killer.body.real_name] has attacked [R.body.real_name]!",MAFIA_TEAM_MAFIA) - R.kill(src) + send_message(span_danger("[killer.body.real_name] has attacked [victim.body.real_name]!"),MAFIA_TEAM_MAFIA) + if(victim.kill(src,killer,lynch=FALSE)) + to_chat(victim.body, span_userdanger("You have been killed by a Changeling!")) reset_votes("Mafia") SEND_SIGNAL(src,COMSIG_MAFIA_NIGHT_KILL_PHASE) SEND_SIGNAL(src,COMSIG_MAFIA_NIGHT_END) @@ -485,14 +513,14 @@ else votes[vote_type][voter] = target if(old_vote && old_vote == target) - send_message("[voter.body.real_name] retracts their vote for [target.body.real_name]!", team = teams) + send_message(span_notice("[voter.body.real_name] retracts their vote for [target.body.real_name]!"), team = teams) else - send_message("[voter.body.real_name] voted for [target.body.real_name]!",team = teams) + send_message(span_notice("[voter.body.real_name] voted for [target.body.real_name]!"),team = teams) if(!teams) - target.body.update_icon() //Update the vote display if it's a public vote + target.body.update_appearance() //Update the vote display if it's a public vote var/datum/mafia_role/old = old_vote if(old) - old.body.update_icon() + old.body.update_appearance() /** * Clears out the votes of a certain type (day votes, mafia kill votes) while leaving others untouched @@ -504,7 +532,7 @@ bodies_to_update += R.body votes[vote_type] = list() for(var/mob/M in bodies_to_update) - M.update_icon() + M.update_appearance() /** * Returns how many people voted for the role, in whatever vote (day vote, night kill vote) @@ -571,6 +599,9 @@ /datum/mafia_controller/proc/create_bodies() for(var/datum/mafia_role/role in all_roles) var/mob/living/carbon/human/H = new(get_turf(role.assigned_landmark)) + ADD_TRAIT(H, TRAIT_NOFIRE, MAFIA_TRAIT) + ADD_TRAIT(H, TRAIT_NOBREATH, MAFIA_TRAIT) + // ADD_TRAIT(H, TRAIT_CANNOT_CRYSTALIZE, MAFIA_TRAIT) freon tomfoolery H.equipOutfit(player_outfit) H.status_flags |= GODMODE RegisterSignal(H,COMSIG_ATOM_UPDATE_OVERLAYS,.proc/display_votes) @@ -707,6 +738,7 @@ if(role_count > 0) debug_setup[found_path] = role_count custom_setup = debug_setup + try_autostart()//don't worry, this fails if there's a game in progress if("cancel_setup") custom_setup = list() switch(action) //both living and dead @@ -723,28 +755,28 @@ switch(action) if("mf_signup") if(!SSticker.HasRoundStarted()) - to_chat(usr, "Wait for the round to start.") + to_chat(usr, span_warning("Wait for the round to start.")) return if(GLOB.mafia_signup[C.ckey]) GLOB.mafia_signup -= C.ckey - to_chat(usr, "You unregister from Mafia.") + to_chat(usr, span_notice("You unregister from Mafia.")) return TRUE else GLOB.mafia_signup[C.ckey] = C - to_chat(usr, "You sign up for Mafia.") + to_chat(usr, span_notice("You sign up for Mafia.")) if(phase == MAFIA_PHASE_SETUP) check_signups() try_autostart() return TRUE if("mf_spectate") if(C.ckey in spectators) - to_chat(usr, "You will no longer get messages from the game.") + to_chat(usr, span_notice("You will no longer get messages from the game.")) spectators -= C.ckey else - to_chat(usr, "You will now get messages from the game.") + to_chat(usr, span_notice("You will now get messages from the game.")) spectators += C.ckey return TRUE - if(user_role.game_status == MAFIA_DEAD) + if(user_role && user_role.game_status == MAFIA_DEAD) return //User actions (just living) switch(action) @@ -814,58 +846,59 @@ . += L[key] /** - * Returns a semirandom setup, with... - * Town, Two invest roles, one protect role, sometimes a misc role, and the rest assistants for town. - * Mafia, 2 normal mafia and one special. - * Neutral, two disruption roles, sometimes one is a killing. + * Returns a semirandom setup with 12 roles. balance not guaranteed! * - * See _defines.dm in the mafia folder for a rundown on what these groups of roles include. + * please check the variables at the top of the proc to see how much of each role types it picks */ /datum/mafia_controller/proc/generate_random_setup() var/invests_left = 2 - var/protects_left = 1 - var/miscs_left = prob(35) + var/protects_left = 2 + var/killings_left = 1 + var/supports_left = 2 + var/mafiareg_left = 2 var/mafiaspe_left = 1 - var/killing_role = prob(50) - var/disruptors = killing_role ? 1 : 2 //still required to calculate overflow - var/overflow_left = max_player - (invests_left + protects_left + miscs_left + mafiareg_left + mafiaspe_left + killing_role + disruptors) + + // if there is one killing role, there will be less disruptors + var/neutral_killing_role = prob(50) var/list/random_setup = list() + var/list/unique_roles_added = list() for(var/i in 1 to max_player) //should match the number of roles to add - if(overflow_left) - add_setup_role(random_setup, TOWN_OVERFLOW) - overflow_left-- - else if(invests_left) - add_setup_role(random_setup, TOWN_INVEST) + if(invests_left) + add_setup_role(random_setup, unique_roles_added, TOWN_INVEST) invests_left-- else if(protects_left) - add_setup_role(random_setup, TOWN_PROTECT) + add_setup_role(random_setup, unique_roles_added, TOWN_PROTECT) protects_left-- - else if(miscs_left) - add_setup_role(random_setup, TOWN_MISC) - miscs_left-- + else if(killings_left) + add_setup_role(random_setup, unique_roles_added, TOWN_KILLING) + killings_left-- + else if(supports_left) + add_setup_role(random_setup, unique_roles_added, TOWN_SUPPORT) + supports_left-- else if(mafiareg_left) - add_setup_role(random_setup, MAFIA_REGULAR) + add_setup_role(random_setup, unique_roles_added, MAFIA_REGULAR) mafiareg_left-- else if(mafiaspe_left) - add_setup_role(random_setup, MAFIA_SPECIAL) + add_setup_role(random_setup, unique_roles_added, MAFIA_SPECIAL) mafiaspe_left-- - else if(killing_role) - add_setup_role(random_setup, NEUTRAL_KILL) - killing_role-- + else if(neutral_killing_role) + add_setup_role(random_setup, unique_roles_added, NEUTRAL_KILL) + neutral_killing_role-- else - add_setup_role(random_setup, NEUTRAL_DISRUPT) + add_setup_role(random_setup, unique_roles_added, NEUTRAL_DISRUPT) + debug = random_setup return random_setup /** - * Helper proc that adds a random role of a type to a setup. if it doesn't exist in the setup, it adds the path to the list and otherwise bumps the path in the list up one + * Helper proc that adds a random role of a type to a setup. if it doesn't exist in the setup, it adds the path to the list and otherwise bumps the path in the list up one. unique roles can only get added once. */ -/datum/mafia_controller/proc/add_setup_role(setup_list, wanted_role_type) +/datum/mafia_controller/proc/add_setup_role(setup_list, banned_roles, wanted_role_type) var/list/role_type_paths = list() for(var/path in typesof(/datum/mafia_role)) var/datum/mafia_role/instance = path - if(initial(instance.role_type) == wanted_role_type) + if(initial(instance.role_type) == wanted_role_type && !(path in banned_roles)) role_type_paths += instance var/mafia_path = pick(role_type_paths) @@ -880,6 +913,8 @@ setup_list[found_role] += 1 return setup_list[mafia_path] = 1 + if(initial(mafia_path_type.role_flags) & ROLE_UNIQUE) //check to see if we should no longer consider this okay to add to the game + banned_roles += mafia_path /** * Called when enough players have signed up to fill a setup. DOESN'T NECESSARILY MEAN THE GAME WILL START. @@ -893,6 +928,8 @@ var/list/setup = custom_setup if(!setup.len) req_players = max_player //MAFIA_MAX_PLAYER_COUNT + else if(low_pop_mode) + req_players = required_player else req_players = assoc_value_sum(setup) @@ -909,10 +946,10 @@ GLOB.mafia_signup -= key //not valid to play when we checked so remove them from signups //if there were not enough players, don't start. we already trimmed the list to now hold only valid signups + if(length(possible_keys) < req_players) return - else //hacky implementation of max players - req_players = clamp(length(possible_keys), 1, max_player) + req_players = clamp(length(possible_keys), required_player, max_player) //if there were too many players, still start but only make filtered keys as big as it needs to be (cut excess) //also removes people who do get into final player list from the signup so they have to sign up again when game ends @@ -923,8 +960,8 @@ //small message about not getting into this game for clarity on why they didn't get in for(var/unpicked in possible_keys) var/client/unpicked_client = GLOB.directory[unpicked] - to_chat(unpicked_client, "Sorry, the starting mafia game has too many players and you were not picked.") - to_chat(unpicked_client, "You're still signed up, getting messages from the current round, and have another chance to join when the one starting now finishes.") + to_chat(unpicked_client, span_danger("Sorry, the starting mafia game has too many players and you were not picked.")) + to_chat(unpicked_client, span_warning("You're still signed up, getting messages from the current round, and have another chance to join when the one starting now finishes.")) if(!setup.len) //don't actually have one yet, so generate a max player random setup. it's good to do this here instead of above so it doesn't generate one every time a game could possibly start. setup = generate_random_setup() diff --git a/code/modules/mafia/map_pieces.dm b/code/modules/mafia/map_pieces.dm index 3339c596b4..61b8e5dd3e 100644 --- a/code/modules/mafia/map_pieces.dm +++ b/code/modules/mafia/map_pieces.dm @@ -33,7 +33,7 @@ requires_power = FALSE has_gravity = STANDARD_GRAVITY flags_1 = NONE - // block_suicide = TRUE + area_flags = BLOCK_SUICIDE | UNIQUE_AREA /datum/map_template/mafia var/description = "" @@ -75,5 +75,5 @@ /datum/map_template/mafia/reebe name = "Reebe" - description = "Trouble in Reebe station! Copypaste guranteed by ClockCo™" + description = "Based of the place known as reebee. Syndicate spies have infiltrated and everyone has to find out who's who before they destroy the ark!" mappath = "_maps/map_files/Mafia/mafia_reebe.dmm" diff --git a/code/modules/mafia/outfits.dm b/code/modules/mafia/outfits.dm index bbc72bd120..fad628e392 100644 --- a/code/modules/mafia/outfits.dm +++ b/code/modules/mafia/outfits.dm @@ -30,6 +30,11 @@ uniform = /obj/item/clothing/under/suit/black shoes = /obj/item/clothing/shoes/laceup +/datum/outfit/mafia/chaplain + name = "Mafia Chaplain" + + uniform = /obj/item/clothing/under/rank/civilian/chaplain + /datum/outfit/mafia/md name = "Mafia Medical Doctor" @@ -37,10 +42,14 @@ shoes = /obj/item/clothing/shoes/sneakers/white suit = /obj/item/clothing/suit/toggle/labcoat -/datum/outfit/mafia/chaplain - name = "Mafia Chaplain" +/datum/outfit/mafia/security + name = "Mafia Security Officer" - uniform = /obj/item/clothing/under/rank/civilian/chaplain + uniform = /obj/item/clothing/under/rank/security/officer + gloves = /obj/item/clothing/gloves/color/black + head = /obj/item/clothing/head/helmet/sec + suit = /obj/item/clothing/suit/armor/vest/alt + shoes = /obj/item/clothing/shoes/jackboots /datum/outfit/mafia/lawyer name = "Mafia Lawyer" @@ -58,6 +67,26 @@ head = /obj/item/clothing/head/hopcap glasses = /obj/item/clothing/glasses/sunglasses +/datum/outfit/mafia/hos + name = "Mafia Head of Security" + + uniform = /obj/item/clothing/under/rank/security/head_of_security + shoes = /obj/item/clothing/shoes/jackboots + suit = /obj/item/clothing/suit/armor/hos/trenchcoat + gloves = /obj/item/clothing/gloves/color/black + head = /obj/item/clothing/head/beret/sec + glasses = /obj/item/clothing/glasses/hud/security/sunglasses + +/datum/outfit/mafia/warden + name = "Mafia Warden" + + uniform = /obj/item/clothing/under/rank/security/warden + shoes = /obj/item/clothing/shoes/jackboots + suit = /obj/item/clothing/suit/armor/vest/warden/alt + gloves = /obj/item/clothing/gloves/color/black + head = /obj/item/clothing/head/warden + glasses = /obj/item/clothing/glasses/hud/security/sunglasses + //mafia /datum/outfit/mafia/changeling diff --git a/code/modules/mafia/roles.dm b/code/modules/mafia/roles.dm index a210c4994f..a48f890d10 100644 --- a/code/modules/mafia/roles.dm +++ b/code/modules/mafia/roles.dm @@ -10,19 +10,21 @@ var/mob/living/carbon/human/body var/obj/effect/landmark/mafia/assigned_landmark - ///how many votes submitted when you vote. + ///role flags (special status of roles like detection immune) + var/role_flags = NONE + ///how many votes submitted when you vote. used in voting, but not victory var/vote_power = 1 - var/detect_immune = FALSE - var/revealed = FALSE - var/datum/outfit/revealed_outfit = /datum/outfit/mafia/assistant //the assistants need a special path to call out they were in fact assistant, everything else can just use job equipment - //action = uses + ///how many votes your role COULD count for, now or later. used in checking victory + var/vote_potential = 1 + ///what they get equipped with when they are revealed + var/datum/outfit/revealed_outfit = /datum/outfit/mafia/assistant + ///action = uses var/list/actions = list() var/list/targeted_actions = list() - //what the role gets when it wins a game + ///what the role gets when it wins a game var/winner_award = /datum/award/achievement/mafia/assistant - //so mafia have to also kill them to have a majority - var/solo_counts_as_town = FALSE //(don't set this for town) + ///so mafia have to also kill them to have a majority var/game_status = MAFIA_ALIVE ///icon state in the mafia dmi of the hud of the role, used in the mafia ui @@ -38,8 +40,30 @@ /datum/mafia_role/New(datum/mafia_controller/game) . = ..() -/datum/mafia_role/proc/kill(datum/mafia_controller/game,lynch=FALSE) - if(SEND_SIGNAL(src,COMSIG_MAFIA_ON_KILL,game,lynch) & MAFIA_PREVENT_KILL) +/** + * Tests if a visitor can actually perform an action on this role. Verbose on purpose! + * + * Will return false if: Your visit is roleblocked, they have perished, or your visit was interrupted + */ +/datum/mafia_role/proc/can_action(datum/mafia_controller/game, datum/mafia_role/visitor, action) + if(role_flags & ROLE_ROLEBLOCKED) + to_chat(visitor,span_danger("Your [action] was blocked!")) + return FALSE + if(game_status != MAFIA_ALIVE) //They're already dead + to_chat(visitor,span_danger("[body.real_name] perished before you could visit!")) + return FALSE + if(SEND_SIGNAL(src,COMSIG_MAFIA_ON_VISIT,game,visitor) & MAFIA_VISIT_INTERRUPTED) //visited a warden. something that prevents you by visiting that person + to_chat(visitor,span_danger("Your [action] was interrupted!")) + return FALSE + return TRUE + +/** + * Tests kill immunities, if nothing prevents the kill, kills this role. + * + * Does not count as visiting, see visit proc. + */ +/datum/mafia_role/proc/kill(datum/mafia_controller/game, datum/mafia_role/attacker, lynch=FALSE) + if(SEND_SIGNAL(src,COMSIG_MAFIA_ON_KILL,game,attacker,lynch) & MAFIA_PREVENT_KILL) return FALSE game_status = MAFIA_DEAD body.death() @@ -55,19 +79,19 @@ /datum/mafia_role/proc/greet() SEND_SOUND(body, 'sound/ambience/ambifailure.ogg') - to_chat(body,"You are the [name].") - to_chat(body,"[desc]") + to_chat(body,span_danger("You are the [name].")) + to_chat(body,span_danger("[desc]")) switch(team) if(MAFIA_TEAM_MAFIA) - to_chat(body,"You and your co-conspirators win if you outnumber crewmembers.") + to_chat(body,span_danger("You and your co-conspirators win if you outnumber crewmembers.")) if(MAFIA_TEAM_TOWN) - to_chat(body,"You are a crewmember. Find out and lynch the changelings!") + to_chat(body,span_danger("You are a crewmember. Find out and lynch the changelings!")) if(MAFIA_TEAM_SOLO) - to_chat(body,"You are not aligned to town or mafia. Accomplish your own objectives!") - to_chat(body, "Be sure to read the wiki page to learn more, if you have no idea what's going on.") + to_chat(body,span_danger("You are not aligned to town or mafia. Accomplish your own objectives!")) + to_chat(body, "Be sure to read the wiki page to learn more, if you have no idea what's going on.") /datum/mafia_role/proc/reveal_role(datum/mafia_controller/game, verbose = FALSE) - if(revealed) + if((role_flags & ROLE_REVEALED)) return if(verbose) game.send_message("It is revealed that the true role of [body] [game_status == MAFIA_ALIVE ? "is" : "was"] [name]!") @@ -76,7 +100,7 @@ qdel(thing) special_reveal_equip(game) body.equipOutfit(revealed_outfit) - revealed = TRUE + role_flags |= ROLE_REVEALED /datum/mafia_role/proc/special_reveal_equip(datum/mafia_controller/game) return @@ -85,7 +109,7 @@ return /datum/mafia_role/proc/validate_action_target(datum/mafia_controller/game,action,datum/mafia_role/target) - if(SEND_SIGNAL(src,COMSIG_MAFIA_CAN_PERFORM_ACTION,game,action,target) & MAFIA_PREVENT_ACTION) + if((role_flags & ROLE_ROLEBLOCKED)) return FALSE return TRUE @@ -114,9 +138,9 @@ team_desc = "Nobody" team_span = "comradio" the = FALSE - result += "The [name] is aligned with [the ? "the " : ""][team_desc]" + result += span_notice("The [span_bold("[name]")] is aligned with [the ? "the " : ""][team_desc]") result += "\"[desc]\"" - result += "[name] wins when they [win_condition]" + result += span_notice("[name] wins when they [win_condition]") to_chat(clueless, result.Join("
")) /datum/mafia_role/detective @@ -145,35 +169,39 @@ /datum/mafia_role/detective/handle_action(datum/mafia_controller/game,action,datum/mafia_role/target) if(!target || target.game_status != MAFIA_ALIVE) - to_chat(body,"You can only investigate alive people.") + to_chat(body,span_warning("You can only investigate alive people.")) return - to_chat(body,"You will investigate [target.body.real_name] tonight.") + to_chat(body,span_warning("You will investigate [target.body.real_name] tonight.")) current_investigation = target /datum/mafia_role/detective/proc/investigate(datum/mafia_controller/game) SIGNAL_HANDLER + if(!current_investigation) + return + var/datum/mafia_role/target = current_investigation - if(target) - if(target.detect_immune) - to_chat(body,"Your investigations reveal that [target.body.real_name] is a true member of the station.") - add_note("N[game.turn] - [target.body.real_name] - Town") - else - var/team_text - var/fluff - switch(target.team) - if(MAFIA_TEAM_TOWN) - team_text = "Town" - fluff = "a true member of the station." - if(MAFIA_TEAM_MAFIA) - team_text = "Mafia" - fluff = "an unfeeling, hideous changeling!" - if(MAFIA_TEAM_SOLO) - team_text = "Solo" - fluff = "a rogue, with their own objectives..." - to_chat(body,"Your investigations reveal that [target.body.real_name] is [fluff]") - add_note("N[game.turn] - [target.body.real_name] - [team_text]") current_investigation = null + if(!target.can_action(game, src, "investigation")) + return + if((target.role_flags & ROLE_UNDETECTABLE)) + to_chat(body,span_warning("Your investigations reveal that [target.body.real_name] is a true member of the station.")) + add_note("N[game.turn] - [target.body.real_name] - Town") + else + var/team_text + var/fluff + switch(target.team) + if(MAFIA_TEAM_TOWN) + team_text = "Town" + fluff = "a true member of the station." + if(MAFIA_TEAM_MAFIA) + team_text = "Mafia" + fluff = "an unfeeling, hideous changeling!" + if(MAFIA_TEAM_SOLO) + team_text = "Solo" + fluff = "a rogue, with their own objectives..." + to_chat(body,span_warning("Your investigations reveal that [target.body.real_name] is [fluff]")) + add_note("N[game.turn] - [target.body.real_name] - [team_text]") /datum/mafia_role/psychologist name = "Psychologist" @@ -195,25 +223,27 @@ /datum/mafia_role/psychologist/validate_action_target(datum/mafia_controller/game, action, datum/mafia_role/target) . = ..() - if(!. || !can_use || game.phase == MAFIA_PHASE_NIGHT || target.game_status != MAFIA_ALIVE || target.revealed || target == src) + if(!. || !can_use || game.phase == MAFIA_PHASE_NIGHT || target.game_status != MAFIA_ALIVE || (target.role_flags & ROLE_REVEALED) || target == src) return FALSE /datum/mafia_role/psychologist/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target) . = ..() - to_chat(body,"You will reveal [target.body.real_name] tonight.") + to_chat(body,span_warning("You will reveal [target.body.real_name] tonight.")) current_target = target /datum/mafia_role/psychologist/proc/therapy_reveal(datum/mafia_controller/game) SIGNAL_HANDLER - if(SEND_SIGNAL(src,COMSIG_MAFIA_CAN_PERFORM_ACTION,game,"reveal",current_target) & MAFIA_PREVENT_ACTION || game_status != MAFIA_ALIVE) //Got lynched or roleblocked by a lawyer. - current_target = null - if(current_target) - add_note("N[game.turn] - [current_target.body.real_name] - Revealed true identity") - to_chat(body,"You have revealed the true nature of the [current_target]!") - current_target.reveal_role(game, verbose = TRUE) - current_target = null - can_use = FALSE + if(!current_target) + return + var/datum/mafia_role/target = current_target + current_target = null + if(!target.can_action(game, src, "role reveal")) + return + add_note("N[game.turn] - [target.body.real_name] - Revealed true identity") + to_chat(body,span_warning("You have revealed the true nature of the [target]!")) + target.reveal_role(game, verbose = TRUE) + can_use = FALSE /datum/mafia_role/chaplain name = "Chaplain" @@ -225,7 +255,7 @@ winner_award = /datum/award/achievement/mafia/chaplain targeted_actions = list("Pray") - var/current_target + var/datum/mafia_role/current_target /datum/mafia_role/chaplain/New(datum/mafia_controller/game) . = ..() @@ -235,25 +265,29 @@ . = ..() if(!.) return - return game.phase == MAFIA_PHASE_NIGHT && target.game_status == MAFIA_DEAD && target != src && !target.revealed + return game.phase == MAFIA_PHASE_NIGHT && target.game_status == MAFIA_DEAD && target != src && !(target.role_flags & ROLE_REVEALED) /datum/mafia_role/chaplain/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target) - to_chat(body,"You will commune with the spirit of [target.body.real_name] tonight.") + to_chat(body,span_warning("You will commune with the spirit of [target.body.real_name] tonight.")) current_target = target /datum/mafia_role/chaplain/proc/commune(datum/mafia_controller/game) SIGNAL_HANDLER + if(!current_target) + return var/datum/mafia_role/target = current_target + current_target = null + if(!target.can_action(game, src, "communion")) + return if(target) - to_chat(body,"You invoke spirit of [target.body.real_name] and learn their role was [target.name].") + to_chat(body,span_warning("You invoke spirit of [target.body.real_name] and learn their role was [target.name].")) add_note("N[game.turn] - [target.body.real_name] - [target.name]") - current_target = null /datum/mafia_role/md name = "Medical Doctor" desc = "You can protect a single person each night from killing." - revealed_outfit = /datum/outfit/mafia/md // /mafia <- outfit must be readded (just make a new mafia outfits file for all of these) + revealed_outfit = /datum/outfit/mafia/md role_type = TOWN_PROTECT hud_icon = "hudmedicaldoctor" revealed_icon = "medicaldoctor" @@ -271,29 +305,38 @@ . = ..() if(!.) return - if(target.name == "Head of Personnel" && target.revealed) + if((target.role_flags & ROLE_VULNERABLE) && (target.role_flags & ROLE_REVEALED)) //do not give the option to protect roles that your protection will fail on return FALSE return game.phase == MAFIA_PHASE_NIGHT && target.game_status == MAFIA_ALIVE && target != src /datum/mafia_role/md/handle_action(datum/mafia_controller/game,action,datum/mafia_role/target) if(!target || target.game_status != MAFIA_ALIVE) - to_chat(body,"You can only protect alive people.") + to_chat(body,span_warning("You can only protect alive people.")) return - to_chat(body,"You will protect [target.body.real_name] tonight.") + to_chat(body,span_warning("You will protect [target.body.real_name] tonight.")) current_protected = target /datum/mafia_role/md/proc/protect(datum/mafia_controller/game) SIGNAL_HANDLER - if(current_protected) - RegisterSignal(current_protected,COMSIG_MAFIA_ON_KILL,.proc/prevent_kill) - add_note("N[game.turn] - Protected [current_protected.body.real_name]") + if(!current_protected) + return + var/datum/mafia_role/target = current_protected + //current protected is unset at the end, as this action ends at a different phase + if(!target.can_action(game, src, "medical assistance")) + return -/datum/mafia_role/md/proc/prevent_kill(datum/source) + RegisterSignal(target,COMSIG_MAFIA_ON_KILL,.proc/prevent_kill) + add_note("N[game.turn] - Protected [target.body.real_name]") + +/datum/mafia_role/md/proc/prevent_kill(datum/source,datum/mafia_controller/game,datum/mafia_role/attacker,lynch) SIGNAL_HANDLER - to_chat(body,"The person you protected tonight was attacked!") - to_chat(current_protected.body,"You were attacked last night, but someone nursed you back to life!") + if((current_protected.role_flags & ROLE_VULNERABLE)) + to_chat(body,span_warning("The person you protected could not be saved.")) + return + to_chat(body,span_warning("The person you protected tonight was attacked!")) + to_chat(current_protected.body,span_greentext("You were attacked last night, but someone nursed you back to life!")) return MAFIA_PREVENT_KILL /datum/mafia_role/md/proc/end_protection(datum/mafia_controller/game) @@ -303,11 +346,77 @@ UnregisterSignal(current_protected,COMSIG_MAFIA_ON_KILL) current_protected = null +/datum/mafia_role/officer + name = "Security Officer" + desc = "You can protect a single person each night. If they are attacked, you will retaliate, killing yourself and the attacker." + revealed_outfit = /datum/outfit/mafia/security + revealed_icon = "securityofficer" + hud_icon = "hudsecurityofficer" + role_type = TOWN_PROTECT + role_flags = ROLE_CAN_KILL + winner_award = /datum/award/achievement/mafia/officer + + targeted_actions = list("Defend") + var/datum/mafia_role/current_defended + +/datum/mafia_role/officer/New(datum/mafia_controller/game) + . = ..() + RegisterSignal(game,COMSIG_MAFIA_NIGHT_ACTION_PHASE,.proc/defend) + RegisterSignal(game,COMSIG_MAFIA_NIGHT_END,.proc/end_defense) + +/datum/mafia_role/officer/validate_action_target(datum/mafia_controller/game,action,datum/mafia_role/target) + . = ..() + if(!.) + return + if((role_flags & ROLE_VULNERABLE) && (target.role_flags & ROLE_REVEALED)) //do not give the option to protect roles that your protection will fail on + return FALSE + return game.phase == MAFIA_PHASE_NIGHT && target.game_status == MAFIA_ALIVE && target != src + +/datum/mafia_role/officer/handle_action(datum/mafia_controller/game,action,datum/mafia_role/target) + if(!target || target.game_status != MAFIA_ALIVE) + to_chat(body,span_warning("You can only defend alive people.")) + return + to_chat(body,span_warning("You will defend [target.body.real_name] tonight.")) + current_defended = target + +/datum/mafia_role/officer/proc/defend(datum/mafia_controller/game) + SIGNAL_HANDLER + + if(!current_defended) + return + var/datum/mafia_role/target = current_defended + //current defended is unset at the end, as this action ends at a different phase + if(!target.can_action(game, src, "security patrol")) + return + if(target) + RegisterSignal(target,COMSIG_MAFIA_ON_KILL,.proc/retaliate) + add_note("N[game.turn] - Defended [target.body.real_name]") + +/datum/mafia_role/officer/proc/retaliate(datum/source,datum/mafia_controller/game,datum/mafia_role/attacker,lynch) + SIGNAL_HANDLER + + if((current_defended.role_flags & ROLE_VULNERABLE)) + to_chat(body,span_warning("The person you defended could not be saved. You could not attack the killer.")) + return + to_chat(body,span_userdanger("The person you defended tonight was attacked!")) + to_chat(current_defended.body,span_userdanger("You were attacked last night, but security fought off the attacker!")) + if(attacker.kill(game,src,FALSE)) //you attack the attacker + to_chat(attacker.body, span_userdanger("You have been ambushed by Security!")) + kill(game,attacker,FALSE) //the attacker attacks you, they were able to attack the target so they can attack you. + return MAFIA_PREVENT_KILL + +/datum/mafia_role/officer/proc/end_defense(datum/mafia_controller/game) + SIGNAL_HANDLER + + if(current_defended) + UnregisterSignal(current_defended,COMSIG_MAFIA_ON_KILL) + current_defended = null + /datum/mafia_role/lawyer name = "Lawyer" desc = "You can choose a person during the day to provide extensive legal advice to during the night, preventing night actions." revealed_outfit = /datum/outfit/mafia/lawyer - role_type = TOWN_PROTECT + role_type = TOWN_SUPPORT hud_icon = "hudlawyer" revealed_icon = "lawyer" winner_award = /datum/award/achievement/mafia/lawyer @@ -317,23 +426,30 @@ /datum/mafia_role/lawyer/New(datum/mafia_controller/game) . = ..() - RegisterSignal(game,COMSIG_MAFIA_SUNDOWN,.proc/roleblock_text) - RegisterSignal(game,COMSIG_MAFIA_NIGHT_START,.proc/try_to_roleblock) + RegisterSignal(game,COMSIG_MAFIA_SUNDOWN,.proc/roleblock) RegisterSignal(game,COMSIG_MAFIA_NIGHT_END,.proc/release) -/datum/mafia_role/lawyer/proc/roleblock_text(datum/mafia_controller/game) +/datum/mafia_role/lawyer/proc/roleblock(datum/mafia_controller/game) SIGNAL_HANDLER - if(SEND_SIGNAL(src,COMSIG_MAFIA_CAN_PERFORM_ACTION,game,"roleblock",current_target) & MAFIA_PREVENT_ACTION || game_status != MAFIA_ALIVE) //Got lynched or roleblocked by another lawyer. + if(!current_target) + return + + var/datum/mafia_role/target = current_target + if(!target.can_action(game, src, "roleblock")) //roleblocking a warden moment current_target = null - if(current_target) - to_chat(current_target.body,"YOU HAVE BEEN BLOCKED! YOU CANNOT PERFORM ANY ACTIONS TONIGHT.") - add_note("N[game.turn] - [current_target.body.real_name] - Blocked") + return + + to_chat(target.body,"YOU HAVE BEEN BLOCKED! YOU CANNOT PERFORM ANY ACTIONS TONIGHT.") + add_note("N[game.turn] - [target.body.real_name] - Blocked") + target.role_flags |= ROLE_ROLEBLOCKED /datum/mafia_role/lawyer/validate_action_target(datum/mafia_controller/game, action, datum/mafia_role/target) . = ..() if(!.) return FALSE + if(target == src) + return FALSE if(game.phase == MAFIA_PHASE_NIGHT) return FALSE if(target.game_status != MAFIA_ALIVE) @@ -343,53 +459,164 @@ . = ..() if(target == current_target) current_target = null - to_chat(body,"You have decided against blocking anyone tonight.") + to_chat(body,span_warning("You have decided against blocking anyone tonight.")) else current_target = target - to_chat(body,"You will block [target.body.real_name] tonight.") - -/datum/mafia_role/lawyer/proc/try_to_roleblock(datum/mafia_controller/game) - SIGNAL_HANDLER - - if(current_target) - RegisterSignal(current_target,COMSIG_MAFIA_CAN_PERFORM_ACTION, .proc/prevent_action) + to_chat(body,span_warning("You will block [target.body.real_name] tonight.")) /datum/mafia_role/lawyer/proc/release(datum/mafia_controller/game) SIGNAL_HANDLER . = ..() if(current_target) - UnregisterSignal(current_target, COMSIG_MAFIA_CAN_PERFORM_ACTION) + current_target.role_flags &= ~ROLE_ROLEBLOCKED current_target = null -/datum/mafia_role/lawyer/proc/prevent_action(datum/source) - SIGNAL_HANDLER - - if(game_status == MAFIA_ALIVE) //in case we got killed while imprisoning sk - bad luck edge - return MAFIA_PREVENT_ACTION - /datum/mafia_role/hop name = "Head of Personnel" desc = "You can reveal yourself once per game, tripling your vote power but becoming unable to be protected!" - revealed_outfit = /datum/outfit/mafia/hop - role_type = TOWN_MISC + role_type = TOWN_SUPPORT + role_flags = ROLE_UNIQUE hud_icon = "hudheadofpersonnel" revealed_icon = "headofpersonnel" + revealed_outfit = /datum/outfit/mafia/hop winner_award = /datum/award/achievement/mafia/hop targeted_actions = list("Reveal") + vote_potential = 3 /datum/mafia_role/hop/validate_action_target(datum/mafia_controller/game, action, datum/mafia_role/target) . = ..() - if(!. || game.phase == MAFIA_PHASE_NIGHT || game.turn == 1 || target.game_status != MAFIA_ALIVE || target != src || revealed) + if(!. || game.phase == MAFIA_PHASE_NIGHT || game.turn == 1 || target.game_status != MAFIA_ALIVE || target != src || (role_flags & ROLE_REVEALED)) return FALSE /datum/mafia_role/hop/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target) . = ..() reveal_role(game, TRUE) - vote_power = 2 + role_flags |= ROLE_VULNERABLE + vote_power = 3 -///MAFIA ROLES/// only one until i rework this to allow more, they're the "anti-town" working to kill off townies to win +/datum/mafia_role/hos + name = "Head of Security" + desc = "You can decide to execute during the night, visiting someone killing, and revealing them. If they are innocent, you will die at the start of the next night." + role_type = TOWN_KILLING + role_flags = ROLE_CAN_KILL | ROLE_UNIQUE + revealed_outfit = /datum/outfit/mafia/hos + revealed_icon = "headofsecurity" + hud_icon = "hudheadofsecurity" + winner_award = /datum/award/achievement/mafia/hos + + targeted_actions = list("Execute") + var/datum/mafia_role/execute_target + +/datum/mafia_role/hos/New(datum/mafia_controller/game) + . = ..() + RegisterSignal(game,COMSIG_MAFIA_NIGHT_ACTION_PHASE,.proc/execute) + +/datum/mafia_role/hos/validate_action_target(datum/mafia_controller/game,action,datum/mafia_role/target) + . = ..() + if(!.) + return + return game.phase == MAFIA_PHASE_NIGHT && target.game_status == MAFIA_ALIVE && target != src + +/datum/mafia_role/hos/handle_action(datum/mafia_controller/game,action,datum/mafia_role/target) + if(execute_target == target) + to_chat(body,span_warning("You have decided against executing tonight.")) + to_chat(body,span_warning("You have decided to execute [target.body.real_name] tonight.")) + execute_target = target + +/datum/mafia_role/hos/proc/execute(datum/mafia_controller/game) + SIGNAL_HANDLER + + if(!execute_target) + return + var/datum/mafia_role/target = execute_target + execute_target = null + if(!target.can_action(game, src, "execution")) //roleblocking a warden moment + return + if(!target.kill(game,src,FALSE))//protection + to_chat(body,span_danger("Your attempt at executing [target.body.real_name] was prevented, or [target.body.real_name] is immune!")) + else + to_chat(target.body, span_userdanger("You have been executed by the Head of Security!")) + target.reveal_role(game, verbose = TRUE) + if(target.team == MAFIA_TEAM_TOWN) + to_chat(body,span_userdanger("You have killed an innocent crewmember. You will die tomorrow night.")) + RegisterSignal(game,COMSIG_MAFIA_SUNDOWN,.proc/internal_affairs) + role_flags |= ROLE_VULNERABLE + +/datum/mafia_role/hos/proc/internal_affairs(datum/mafia_controller/game) + to_chat(body,span_userdanger("You have been killed by Nanotrasen Internal Affairs!")) + reveal_role(game, verbose = TRUE) + kill(game,src,FALSE) //you technically kill yourself but that shouldn't matter + + +//just helps read better +#define WARDEN_NOT_LOCKDOWN 0//will NOT kill visitors tonight +#define WARDEN_WILL_LOCKDOWN 1 //will kill visitors tonight + +/datum/mafia_role/warden + name = "Warden" + desc = "You can lockdown during the night once, killing any visitors. WARNING: This kills fellow town members, too!" + + role_type = TOWN_KILLING + role_flags = ROLE_CAN_KILL + revealed_outfit = /datum/outfit/mafia/warden + revealed_icon = "warden" + hud_icon = "hudwarden" + winner_award = /datum/award/achievement/mafia/warden + + actions = list("Lockdown") + var/charges = 1 + var/protection_status = WARDEN_NOT_LOCKDOWN + + +/datum/mafia_role/warden/New(datum/mafia_controller/game) + . = ..() + RegisterSignal(game,COMSIG_MAFIA_SUNDOWN,.proc/night_start) + RegisterSignal(game,COMSIG_MAFIA_NIGHT_END,.proc/night_end) + +/datum/mafia_role/warden/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target) + . = ..() + if(!charges) + to_chat(body,span_danger("You've already locked down this game!")) + return + if(game.phase == MAFIA_PHASE_NIGHT) + to_chat(body,span_danger("You don't have time to lockdown, night has already arrived.")) + return + if(protection_status == WARDEN_WILL_LOCKDOWN) + to_chat(body,span_danger("You decide to not lockdown tonight.")) + else + to_chat(body,span_danger("You decide to lockdown, killing any visitors.")) + protection_status = !protection_status + +/datum/mafia_role/warden/proc/night_start(datum/mafia_controller/game) + SIGNAL_HANDLER + + if(protection_status == WARDEN_WILL_LOCKDOWN) + to_chat(body,span_danger("Any and all visitors are going to eat buckshot tonight.")) + RegisterSignal(src,COMSIG_MAFIA_ON_VISIT,.proc/self_defense) + +/datum/mafia_role/warden/proc/night_end(datum/mafia_controller/game) + SIGNAL_HANDLER + + if(protection_status == WARDEN_WILL_LOCKDOWN) + charges-- + UnregisterSignal(src,COMSIG_MAFIA_ON_KILL) + to_chat(body,span_danger("You are no longer protected. You have used up your power.")) + protection_status = WARDEN_NOT_LOCKDOWN + +/datum/mafia_role/warden/proc/self_defense(datum/source,datum/mafia_controller/game,datum/mafia_role/attacker,lynch) + SIGNAL_HANDLER + + to_chat(body,span_userdanger("You have shot a visitor!")) + to_chat(attacker,span_userdanger("You have visited the warden!")) + attacker.kill(game, src, lynch = FALSE) + return MAFIA_VISIT_INTERRUPTED + +#undef WARDEN_NOT_LOCKDOWN +#undef WARDEN_WILL_LOCKDOWN + +///MAFIA ROLES/// they're the "anti-town" working to kill off townies to win /datum/mafia_role/mafia name = "Changeling" @@ -436,7 +663,7 @@ return game.phase == MAFIA_PHASE_NIGHT && target.game_status == MAFIA_ALIVE && target != src /datum/mafia_role/mafia/thoughtfeeder/handle_action(datum/mafia_controller/game,action,datum/mafia_role/target) - to_chat(body,"You will feast on the memories of [target.body.real_name] tonight.") + to_chat(body,span_warning("You will feast on the memories of [target.body.real_name] tonight.")) current_investigation = target /datum/mafia_role/mafia/thoughtfeeder/proc/investigate(datum/mafia_controller/game) @@ -444,18 +671,15 @@ var/datum/mafia_role/target = current_investigation current_investigation = null - if(SEND_SIGNAL(src,COMSIG_MAFIA_CAN_PERFORM_ACTION,game,"thoughtfeed",target) & MAFIA_PREVENT_ACTION) - to_chat(body,"You were unable to investigate [target.body.real_name].") + if(!target.can_action(game, src, "thought feeding")) add_note("N[game.turn] - [target.body.real_name] - Unable to investigate") return - if(target) - if(target.detect_immune) - to_chat(body,"[target.body.real_name]'s memories reveal that they are the Assistant.") - add_note("N[game.turn] - [target.body.real_name] - Assistant") - else - to_chat(body,"[target.body.real_name]'s memories reveal that they are the [target.name].") - add_note("N[game.turn] - [target.body.real_name] - [target.name]") - + if((target.role_flags & ROLE_UNDETECTABLE)) + to_chat(body,span_warning("[target.body.real_name]'s memories reveal that they are the Assistant.")) + add_note("N[game.turn] - [target.body.real_name] - Assistant") + else + to_chat(body,span_warning("[target.body.real_name]'s memories reveal that they are the [target.name].")) + add_note("N[game.turn] - [target.body.real_name] - [target.name]") ///SOLO ROLES/// they range from anomalous factors to deranged killers that try to win alone. @@ -465,15 +689,14 @@ win_condition = "kill everyone." team = MAFIA_TEAM_SOLO role_type = NEUTRAL_KILL + role_flags = ROLE_CAN_KILL winner_award = /datum/award/achievement/mafia/traitor - - targeted_actions = list("Night Kill") revealed_outfit = /datum/outfit/mafia/traitor - - hud_icon = "hudtraitor" revealed_icon = "traitor" + hud_icon = "hudtraitor" special_theme = "neutral" + targeted_actions = list("Night Kill") var/datum/mafia_role/current_victim /datum/mafia_role/traitor/New(datum/mafia_controller/game) @@ -481,17 +704,17 @@ RegisterSignal(src,COMSIG_MAFIA_ON_KILL,.proc/nightkill_immunity) RegisterSignal(game,COMSIG_MAFIA_NIGHT_KILL_PHASE,.proc/try_to_kill) -/datum/mafia_role/traitor/check_total_victory(alive_town, alive_mafia) //serial killers just want teams dead +/datum/mafia_role/traitor/check_total_victory(alive_town, alive_mafia) //serial killers just want teams dead, they cannot be stopped by killing roles anyways return alive_town + alive_mafia <= 1 /datum/mafia_role/traitor/block_team_victory(alive_town, alive_mafia) //no team can win until they're dead return TRUE //while alive, town AND mafia cannot win (though since mafia know who is who it's pretty easy to win from that point) -/datum/mafia_role/traitor/proc/nightkill_immunity(datum/source,datum/mafia_controller/game,lynch) +/datum/mafia_role/traitor/proc/nightkill_immunity(datum/source,datum/mafia_controller/game,datum/mafia_role/attacker,lynch) SIGNAL_HANDLER if(game.phase == MAFIA_PHASE_NIGHT && !lynch) - to_chat(body,"You were attacked, but they'll have to try harder than that to put you down.") + to_chat(body,span_userdanger("You were attacked, but they'll have to try harder than that to put you down.")) return MAFIA_PREVENT_KILL /datum/mafia_role/traitor/validate_action_target(datum/mafia_controller/game, action, datum/mafia_role/target) @@ -504,25 +727,29 @@ /datum/mafia_role/traitor/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target) . = ..() current_victim = target - to_chat(body,"You will attempt to kill [target.body.real_name] tonight.") + to_chat(body,span_warning("You will attempt to kill [target.body.real_name] tonight.")) -/datum/mafia_role/traitor/proc/try_to_kill(datum/mafia_controller/source) - // SIGNAL_HANDLER +/datum/mafia_role/traitor/proc/try_to_kill(datum/mafia_controller/game) + SIGNAL_HANDLER + if(!current_victim) + return var/datum/mafia_role/target = current_victim current_victim = null - if(SEND_SIGNAL(src,COMSIG_MAFIA_CAN_PERFORM_ACTION,source,"traitor kill",target) & MAFIA_PREVENT_ACTION) + if(!target.can_action(game, src, "flickering")) //flickering a warden return - if(game_status == MAFIA_ALIVE && target && target.game_status == MAFIA_ALIVE) - if(!target.kill(source)) - to_chat(body,"Your attempt at killing [target.body] was prevented!") + if(game_status == MAFIA_ALIVE) + if(!target.kill(game,src,FALSE)) + to_chat(body,span_danger("Your attempt at killing [target.body.real_name] was prevented!")) + else + to_chat(target.body, span_userdanger("You have been killed by a Traitor!")) /datum/mafia_role/nightmare name = "Nightmare" - desc = "You're a solo monster that cannot be detected by detective roles. You can flicker lights of another room each night. You can instead decide to hunt, killing everyone in a flickering room. Kill everyone to win." + desc = "You're a solo monster that cannot be detected by detective roles. You can flicker lights of another room each night, becoming immune to attacks from those roles. You can instead decide to hunt, killing everyone in a flickering room. Kill everyone to win." win_condition = "kill everyone." revealed_outfit = /datum/outfit/mafia/nightmare - detect_immune = TRUE + role_flags = ROLE_UNDETECTABLE | ROLE_CAN_KILL team = MAFIA_TEAM_SOLO role_type = NEUTRAL_KILL special_theme = "neutral" @@ -536,6 +763,7 @@ /datum/mafia_role/nightmare/New(datum/mafia_controller/game) . = ..() + RegisterSignal(src,COMSIG_MAFIA_ON_KILL,.proc/flickering_immunity) RegisterSignal(game,COMSIG_MAFIA_NIGHT_KILL_PHASE,.proc/flicker_or_hunt) /datum/mafia_role/nightmare/check_total_victory(alive_town, alive_mafia) //nightmares just want teams dead @@ -562,33 +790,42 @@ /datum/mafia_role/nightmare/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target) . = ..() if(target == flicker_target) - to_chat(body,"You will do nothing tonight.") + to_chat(body,span_warning("You will do nothing tonight.")) flicker_target = null flicker_target = target if(action == "Flicker") - to_chat(body,"You will attempt to flicker [target.body.real_name]'s room tonight.") + to_chat(body,span_warning("You will attempt to flicker [target.body.real_name]'s room tonight.")) else - to_chat(body,"You will hunt everyone in a flickering room down tonight.") + to_chat(body,span_danger("You will hunt everyone in a flickering room down tonight.")) -/datum/mafia_role/nightmare/proc/flicker_or_hunt(datum/mafia_controller/source) - // SIGNAL_HANDLER +/datum/mafia_role/nightmare/proc/flickering_immunity(datum/source,datum/mafia_controller/game,datum/mafia_role/attacker,lynch) + SIGNAL_HANDLER + if(!attacker) + return //no chance man, that's a town lynch - if(game_status != MAFIA_ALIVE || !flicker_target) - return - if(SEND_SIGNAL(src,COMSIG_MAFIA_CAN_PERFORM_ACTION,source,"nightmare actions",flicker_target) & MAFIA_PREVENT_ACTION) - to_chat(flicker_target.body, "Your actions were prevented!") + if(attacker in flickering) + to_chat(body,span_userdanger("You were attacked by someone in a flickering room. You have danced in the shadows, evading them.")) + return MAFIA_PREVENT_KILL + +/datum/mafia_role/nightmare/proc/flicker_or_hunt(datum/mafia_controller/game) + SIGNAL_HANDLER + + if(!flicker_target) return var/datum/mafia_role/target = flicker_target flicker_target = null + if(!target.can_action(game, src, "flickering")) //flickering a warden + return + if(target != src) //flicker instead of hunt - to_chat(target.body, "The lights begin to flicker and dim. You're in danger.") + to_chat(target.body, span_userdanger("The lights begin to flicker and dim. You're in danger.")) flickering += target return for(var/r in flickering) var/datum/mafia_role/role = r if(role && role.game_status == MAFIA_ALIVE) - to_chat(role.body, "A shadowy monster appears out of the darkness!") - role.kill(source) + to_chat(role.body, span_userdanger("A shadowy figure appears out of the darkness!")) + role.kill(game,src,FALSE) flickering -= role //just helps read better @@ -599,7 +836,6 @@ name = "Fugitive" desc = "You're on the run. You can become immune to night kills exactly twice, and you win by surviving to the end of the game with anyone." win_condition = "survive to the end of the game, with anyone" - solo_counts_as_town = TRUE //should not count towards mafia victory, they should have the option to work with town revealed_outfit = /datum/outfit/mafia/fugitive team = MAFIA_TEAM_SOLO role_type = NEUTRAL_DISRUPT @@ -622,22 +858,22 @@ /datum/mafia_role/fugitive/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target) . = ..() if(!charges) - to_chat(body,"You're out of supplies and cannot protect yourself anymore.") + to_chat(body,span_danger("You're out of supplies and cannot protect yourself anymore.")) return if(game.phase == MAFIA_PHASE_NIGHT) - to_chat(body,"You don't have time to prepare, night has already arrived.") + to_chat(body,span_danger("You don't have time to prepare, night has already arrived.")) return if(protection_status == FUGITIVE_WILL_PRESERVE) - to_chat(body,"You decide to not prepare tonight.") + to_chat(body,span_danger("You decide to not prepare tonight.")) else - to_chat(body,"You decide to prepare for a horrible night.") + to_chat(body,span_danger("You decide to prepare for a horrible night.")) protection_status = !protection_status /datum/mafia_role/fugitive/proc/night_start(datum/mafia_controller/game) SIGNAL_HANDLER if(protection_status == FUGITIVE_WILL_PRESERVE) - to_chat(body,"Your preparations are complete. Nothing could kill you tonight!") + to_chat(body,span_danger("Your preparations are complete. Nothing could kill you tonight!")) RegisterSignal(src,COMSIG_MAFIA_ON_KILL,.proc/prevent_death) /datum/mafia_role/fugitive/proc/night_end(datum/mafia_controller/game) @@ -646,13 +882,13 @@ if(protection_status == FUGITIVE_WILL_PRESERVE) charges-- UnregisterSignal(src,COMSIG_MAFIA_ON_KILL) - to_chat(body,"You are no longer protected. You have [charges] use[charges == 1 ? "" : "s"] left of your power.") + to_chat(body,span_danger("You are no longer protected. You have [charges] use[charges == 1 ? "" : "s"] left of your power.")) protection_status = FUGITIVE_NOT_PRESERVING -/datum/mafia_role/fugitive/proc/prevent_death(datum/mafia_controller/game) +/datum/mafia_role/fugitive/proc/prevent_death(datum/source,datum/mafia_controller/game,datum/mafia_role/attacker,lynch) SIGNAL_HANDLER - to_chat(body,"You were attacked! Luckily, you were ready for this!") + to_chat(body,span_userdanger("You were attacked! Luckily, you were ready for this!")) return MAFIA_PREVENT_KILL /datum/mafia_role/fugitive/proc/survived(datum/mafia_controller/game) @@ -669,8 +905,7 @@ name = "Obsessed" desc = "You're completely lost in your own mind. You win by lynching your obsession before you get killed in this mess. Obsession assigned on the first night!" win_condition = "lynch their obsession." - revealed_outfit = /datum/outfit/mafia/obsessed // /mafia <- outfit must be readded (just make a new mafia outfits file for all of these) - solo_counts_as_town = TRUE //after winning or whatever, can side with whoever. they've already done their objective! + revealed_outfit = /datum/outfit/mafia/obsessed team = MAFIA_TEAM_SOLO role_type = NEUTRAL_DISRUPT special_theme = "neutral" @@ -678,9 +913,6 @@ revealed_icon = "obsessed" winner_award = /datum/award/achievement/mafia/obsessed - - revealed_outfit = /datum/outfit/mafia/obsessed // /mafia <- outfit must be readded (just make a new mafia outfits file for all of these) - solo_counts_as_town = TRUE //after winning or whatever, can side with whoever. they've already done their objective! var/datum/mafia_role/obsession var/lynched_target = FALSE @@ -700,12 +932,12 @@ if(!obsession) obsession = pick(all_roles_shuffle) //okay no town just pick anyone here //if you still don't have an obsession you're playing a single player game like i can't help your dumb ass - to_chat(body, "Your obsession is [obsession.body.real_name]! Get them lynched to win!") + to_chat(body, span_userdanger("Your obsession is [obsession.body.real_name]! Get them lynched to win!")) add_note("N[game.turn] - I vowed to watch my obsession, [obsession.body.real_name], hang!") //it'll always be N1 but whatever RegisterSignal(obsession,COMSIG_MAFIA_ON_KILL,.proc/check_victory) UnregisterSignal(game,COMSIG_MAFIA_SUNDOWN) -/datum/mafia_role/obsessed/proc/check_victory(datum/source,datum/mafia_controller/game,lynch) +/datum/mafia_role/obsessed/proc/check_victory(datum/source,datum/mafia_controller/game,datum/mafia_role/attacker,lynch) SIGNAL_HANDLER UnregisterSignal(source,COMSIG_MAFIA_ON_KILL) @@ -716,14 +948,13 @@ game.award_role(winner_award, src) reveal_role(game, FALSE) else - to_chat(body, "You have failed your objective to lynch [obsession.body]!") + to_chat(body, span_userdanger("You have failed your objective to lynch [obsession.body.real_name]!")) /datum/mafia_role/clown name = "Clown" desc = "If you are lynched you take down one of your voters (guilty or abstain) with you and win. HONK!" win_condition = "get themselves lynched!" revealed_outfit = /datum/outfit/mafia/clown - solo_counts_as_town = TRUE team = MAFIA_TEAM_SOLO role_type = NEUTRAL_DISRUPT special_theme = "neutral" @@ -735,8 +966,8 @@ . = ..() RegisterSignal(src,COMSIG_MAFIA_ON_KILL,.proc/prank) -/datum/mafia_role/clown/proc/prank(datum/source,datum/mafia_controller/game,lynch) - // SIGNAL_HANDLER +/datum/mafia_role/clown/proc/prank(datum/source,datum/mafia_controller/game,datum/mafia_role/attacker,lynch) + SIGNAL_HANDLER if(lynch) var/datum/mafia_role/victim = pick(game.judgement_guilty_votes + game.judgement_abstain_votes) diff --git a/code/modules/mapping/mapping_helpers/_mapping_helpers.dm b/code/modules/mapping/mapping_helpers/_mapping_helpers.dm index 4de16ba350..a96b81528f 100644 --- a/code/modules/mapping/mapping_helpers/_mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers/_mapping_helpers.dm @@ -8,61 +8,73 @@ ..() return late ? INITIALIZE_HINT_LATELOAD : INITIALIZE_HINT_QDEL + //airlock helpers /obj/effect/mapping_helpers/airlock layer = DOOR_HELPER_LAYER +/obj/effect/mapping_helpers/airlock/Initialize(mapload) + . = ..() + if(!mapload) + log_mapping("[src] spawned outside of mapload!") + return + var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in loc + if(!airlock) + log_mapping("[src] failed to find an airlock at [AREACOORD(src)]") + else + payload(airlock) + +/obj/effect/mapping_helpers/airlock/proc/payload(obj/machinery/door/airlock/payload) + return + /obj/effect/mapping_helpers/airlock/cyclelink_helper name = "airlock cyclelink helper" icon_state = "airlock_cyclelink_helper" -/obj/effect/mapping_helpers/airlock/cyclelink_helper/Initialize(mapload) - . = ..() - if(!mapload) - log_mapping("[src] spawned outside of mapload!") - return - var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in loc - if(airlock) - if(airlock.cyclelinkeddir) - log_mapping("[src] at [AREACOORD(src)] tried to set [airlock] cyclelinkeddir, but it's already set!") - else - airlock.cyclelinkeddir = dir +/obj/effect/mapping_helpers/airlock/cyclelink_helper/payload(obj/machinery/door/airlock/airlock) + if(airlock.cyclelinkeddir) + log_mapping("[src] at [AREACOORD(src)] tried to set [airlock] cyclelinkeddir, but it's already set!") else - log_mapping("[src] failed to find an airlock at [AREACOORD(src)]") + airlock.cyclelinkeddir = dir +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi + name = "airlock multi-cyclelink helper" + icon_state = "airlock_multicyclelink_helper" + var/cycle_id + +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi/payload(obj/machinery/door/airlock/airlock) + if(airlock.closeOtherId) + log_mapping("[src] at [AREACOORD(src)] tried to set [airlock] closeOtherId, but it's already set!") + else + airlock.closeOtherId = cycle_id /obj/effect/mapping_helpers/airlock/locked name = "airlock lock helper" icon_state = "airlock_locked_helper" -/obj/effect/mapping_helpers/airlock/locked/Initialize(mapload) - . = ..() - if(!mapload) - log_mapping("[src] spawned outside of mapload!") - return - var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in loc - if(airlock) - if(airlock.locked) - log_mapping("[src] at [AREACOORD(src)] tried to bolt [airlock] but it's already locked!") - else - airlock.locked = TRUE +/obj/effect/mapping_helpers/airlock/locked/payload(obj/machinery/door/airlock/airlock) + if(airlock.locked) + log_mapping("[src] at [AREACOORD(src)] tried to bolt [airlock] but it's already locked!") else - log_mapping("[src] failed to find an airlock at [AREACOORD(src)]") + airlock.locked = TRUE + /obj/effect/mapping_helpers/airlock/unres name = "airlock unresctricted side helper" icon_state = "airlock_unres_helper" -/obj/effect/mapping_helpers/airlock/unres/Initialize(mapload) - . = ..() - if(!mapload) - log_mapping("[src] spawned outside of mapload!") - return - var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in loc - if(airlock) - airlock.unres_sides ^= dir +/obj/effect/mapping_helpers/airlock/unres/payload(obj/machinery/door/airlock/airlock) + airlock.unres_sides ^= dir + +/obj/effect/mapping_helpers/airlock/abandoned + name = "airlock abandoned helper" + icon_state = "airlock_abandoned" + +/obj/effect/mapping_helpers/airlock/abandoned/payload(obj/machinery/door/airlock/airlock) + if(airlock.abandoned) + log_mapping("[src] at [AREACOORD(src)] tried to make [airlock] abandoned but it's already abandoned!") else - log_mapping("[src] failed to find an airlock at [AREACOORD(src)]") + airlock.abandoned = TRUE //needs to do its thing before spawn_rivers() is called @@ -79,9 +91,11 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) //This helper applies components to things on the map directly. /obj/effect/mapping_helpers/component_injector name = "Component Injector" + icon_state = "component" late = TRUE - var/target_type - var/target_name + var/all = FALSE //Will inject into all fitting the criteria if true, otherwise first found + var/target_type //Will inject into atoms of this type + var/target_name //Will inject into atoms with this name var/component_type //Late init so everything is likely ready and loaded (no warranty) @@ -98,8 +112,11 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) continue var/cargs = build_args() A._AddComponent(cargs) + if(!all) + qdel(src) + return + if(all) qdel(src) - return /obj/effect/mapping_helpers/component_injector/proc/build_args() return list(component_type) @@ -115,3 +132,276 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) CRASH("Wrong disease type passed in.") var/datum/disease/D = new disease_type() return list(component_type,D) + +// /obj/effect/mapping_helpers/component_injector/areabound +// name = "Areabound Injector" +// icon_state = "component_areabound" +// component_type = /datum/component/areabound +// target_type = /atom/movable + +/obj/effect/mapping_helpers/dead_body_placer + name = "Dead Body placer" + late = TRUE + icon_state = "deadbodyplacer" + var/bodycount = 2 //number of bodies to spawn + +/obj/effect/mapping_helpers/dead_body_placer/LateInitialize() + var/area/a = get_area(src) + var/list/trays = list() + for (var/i in a.contents) + if (istype(i, /obj/structure/bodycontainer/morgue)) + trays += i + if(!trays.len) + log_mapping("[src] at [x],[y] could not find any morgues.") + return + for (var/i = 1 to bodycount) + var/obj/structure/bodycontainer/morgue/j = pick(trays) + var/mob/living/carbon/human/h = new /mob/living/carbon/human(j, 1) + h.death() + for (var/part in h.internal_organs) //randomly remove organs from each body, set those we keep to be in stasis + if (prob(40)) + qdel(part) + else + var/obj/item/organ/O = part + O.organ_flags |= ORGAN_FROZEN + j.update_appearance() + qdel(src) + + +//On Ian's birthday, the hop's office is decorated. +/obj/effect/mapping_helpers/ianbirthday + name = "Ian's Bday Helper" + late = TRUE + icon_state = "iansbdayhelper" + var/balloon_clusters = 2 + +/obj/effect/mapping_helpers/ianbirthday/LateInitialize() + if(locate(/datum/holiday/ianbirthday) in SSevents.holidays) + birthday() + qdel(src) + +/obj/effect/mapping_helpers/ianbirthday/proc/birthday() + var/area/a = get_area(src) + var/list/table = list()//should only be one aka the front desk, but just in case... + var/list/openturfs = list() + + //confetti and a corgi balloon! (and some list stuff for more decorations) + for(var/thing in a.contents) + if(istype(thing, /obj/structure/table/reinforced)) + table += thing + if(isopenturf(thing)) + // new /obj/effect/decal/cleanable/confetti(thing) + // if(locate(/obj/structure/bed/dogbed/ian) in thing) + // new /obj/item/toy/balloon/corgi(thing) + // else + openturfs += thing + + //cake + knife to cut it! + if(length(table)) + var/turf/food_turf = get_turf(pick(table)) + new /obj/item/kitchen/knife(food_turf) + var/obj/item/reagent_containers/food/snacks/store/cake/birthday/iancake = new(food_turf) + iancake.desc = "Happy birthday, Ian!" + // remind me to give ian proper baloons! + //some balloons! this picks an open turf and pops a few balloons in and around that turf, yay. + // for(var/i in 1 to balloon_clusters) + // var/turf/clusterspot = pick_n_take(openturfs) + // new /obj/item/toy/balloon(clusterspot) + // var/balloons_left_to_give = 3 //the amount of balloons around the cluster + // var/list/dirs_to_balloon = GLOB.cardinals.Copy() + // while(balloons_left_to_give > 0) + // balloons_left_to_give-- + // var/chosen_dir = pick_n_take(dirs_to_balloon) + // var/turf/balloonstep = get_step(clusterspot, chosen_dir) + // var/placed = FALSE + // if(isopenturf(balloonstep)) + // var/obj/item/toy/balloon/B = new(balloonstep)//this clumps the cluster together + // placed = TRUE + // if(chosen_dir == NORTH) + // B.pixel_y -= 10 + // if(chosen_dir == SOUTH) + // B.pixel_y += 10 + // if(chosen_dir == EAST) + // B.pixel_x -= 10 + // if(chosen_dir == WEST) + // B.pixel_x += 10 + // if(!placed) + // new /obj/item/toy/balloon(clusterspot) + //remind me to add wall decor! + +/obj/effect/mapping_helpers/ianbirthday/admin//so admins may birthday any room + name = "generic birthday setup" + icon_state = "bdayhelper" + +/obj/effect/mapping_helpers/ianbirthday/admin/LateInitialize() + birthday() + qdel(src) + +//Ian, like most dogs, loves a good new years eve party. +/obj/effect/mapping_helpers/iannewyear + name = "Ian's New Years Helper" + late = TRUE + icon_state = "iansnewyrshelper" + +/obj/effect/mapping_helpers/iannewyear/LateInitialize() + if(SSevents.holidays && SSevents.holidays[NEW_YEAR]) + fireworks() + qdel(src) + +/obj/effect/mapping_helpers/iannewyear/proc/fireworks() + var/area/a = get_area(src) + var/list/table = list()//should only be one aka the front desk, but just in case... + var/list/openturfs = list() + + for(var/thing in a.contents) + if(istype(thing, /obj/structure/table/reinforced)) + table += thing + else if(isopenturf(thing)) + if(locate(/obj/structure/bed/dogbed/ian) in thing) + new /obj/item/clothing/head/festive(thing) + var/obj/item/reagent_containers/food/drinks/bottle/champagne/iandrink = new(thing) + iandrink.name = "dog champagne" + iandrink.pixel_y += 8 + iandrink.pixel_x += 8 + else + openturfs += thing + + var/turf/fireworks_turf = get_turf(pick(table)) + var/obj/item/storage/box/matches/matchbox = new(fireworks_turf) + matchbox.pixel_y += 8 + matchbox.pixel_x -= 3 + // new /obj/item/storage/box/fireworks/dangerous(fireworks_turf) //dangerous version for extra holiday memes. + +//lets mappers place notes on airlocks with custom info or a pre-made note from a path +/obj/effect/mapping_helpers/airlock_note_placer + name = "Airlock Note Placer" + late = TRUE + icon_state = "airlocknoteplacer" + var/note_info //for writing out custom notes without creating an extra paper subtype + var/note_name //custom note name + var/note_path //if you already have something wrote up in a paper subtype, put the path here + +/obj/effect/mapping_helpers/airlock_note_placer/LateInitialize() + var/turf/turf = get_turf(src) + if(note_path && !istype(note_path, /obj/item/paper)) //don't put non-paper in the paper slot thank you + log_mapping("[src] at [x],[y] had an improper note_path path, could not place paper note.") + qdel(src) + if(locate(/obj/machinery/door/airlock) in turf) + var/obj/machinery/door/airlock/found_airlock = locate(/obj/machinery/door/airlock) in turf + if(note_path) + found_airlock.note = note_path + found_airlock.update_appearance() + qdel(src) + if(note_info) + var/obj/item/paper/paper = new /obj/item/paper(src) + if(note_name) + paper.name = note_name + paper.info = "[note_info]" + found_airlock.note = paper + paper.forceMove(found_airlock) + found_airlock.update_appearance() + qdel(src) + log_mapping("[src] at [x],[y] had no note_path or note_info, cannot place paper note.") + qdel(src) + log_mapping("[src] at [x],[y] could not find an airlock on current turf, cannot place paper note.") + qdel(src) + +//This helper applies traits to things on the map directly. +/obj/effect/mapping_helpers/trait_injector + name = "Trait Injector" + icon_state = "trait" + late = TRUE + ///Will inject into all fitting the criteria if false, otherwise first found. + var/first_match_only = TRUE + ///Will inject into atoms of this type. + var/target_type + ///Will inject into atoms with this name. + var/target_name + ///Name of the trait, in the lower-case text (NOT the upper-case define) form. + var/trait_name + +//Late init so everything is likely ready and loaded (no warranty) +/obj/effect/mapping_helpers/trait_injector/LateInitialize() + if(!GLOB.trait_name_map) + GLOB.trait_name_map = generate_trait_name_map() + if(!GLOB.trait_name_map.Find(trait_name)) + CRASH("Wrong trait in [type] - [trait_name] is not a trait") + var/turf/target_turf = get_turf(src) + var/matches_found = 0 + for(var/a in target_turf.GetAllContents()) + var/atom/atom_on_turf = a + if(atom_on_turf == src) + continue + if(target_name && atom_on_turf.name != target_name) + continue + if(target_type && !istype(atom_on_turf,target_type)) + continue + ADD_TRAIT(atom_on_turf, trait_name, MAPPING_HELPER_TRAIT) + matches_found++ + if(first_match_only) + qdel(src) + return + if(!matches_found) + stack_trace("Trait mapper found no targets at ([x], [y], [z]). First Match Only: [first_match_only ? "true" : "false"] target type: [target_type] | target name: [target_name] | trait name: [trait_name]") + qdel(src) + +/// Fetches an external dmi and applies to the target object +/obj/effect/mapping_helpers/custom_icon + name = "Custom Icon Helper" + icon_state = "trait" + late = TRUE + ///Will inject into all fitting the criteria if false, otherwise first found. + var/first_match_only = TRUE + ///Will inject into atoms of this type. + var/target_type + ///Will inject into atoms with this name. + var/target_name + /// This is the var tha will be set with the fetched icon. In case you want to set some secondary icon sheets like inhands and such. + var/target_variable = "icon" + /// This should return raw dmi in response to http get request. For example: "https://github.com/tgstation/SS13-sprites/raw/master/mob/medu.dmi?raw=true" + var/icon_url + +/obj/effect/mapping_helpers/custom_icon/LateInitialize() + ///TODO put this injector stuff under common root + var/I = fetch_icon(icon_url) + var/turf/target_turf = get_turf(src) + var/matches_found = 0 + for(var/a in target_turf.GetAllContents()) + var/atom/atom_on_turf = a + if(atom_on_turf == src) + continue + if(target_name && atom_on_turf.name != target_name) + continue + if(target_type && !istype(atom_on_turf,target_type)) + continue + atom_on_turf.vars[target_variable] = I + matches_found++ + if(first_match_only) + qdel(src) + return + if(!matches_found) + stack_trace("[src] found no targets at ([x], [y], [z]). First Match Only: [first_match_only ? "true" : "false"] target type: [target_type] | target name: [target_name]") + qdel(src) + +/obj/effect/mapping_helpers/custom_icon/proc/fetch_icon(url) + var/static/icon_cache = list() + var/static/query_in_progress = FALSE //We're using a single tmp file so keep it linear. + if(query_in_progress) + UNTIL(!query_in_progress) + if(icon_cache[url]) + return icon_cache[url] + log_asset("Custom Icon Helper fetching dmi from: [url]") + var/datum/http_request/request = new() + var/file_name = "tmp/custom_map_icon.dmi" + request.prepare(RUSTG_HTTP_METHOD_GET, url , "", "", file_name) + query_in_progress = TRUE + request.begin_async() + UNTIL(request.is_complete()) + var/datum/http_response/response = request.into_response() + if(response.errored || response.status_code != 200) + query_in_progress = FALSE + CRASH("Failed to fetch mapped custom icon from url [url], code: [response.status_code], error: [response.error]") + var/icon/I = new(file_name) + icon_cache[url] = I + query_in_progress = FALSE + return I diff --git a/code/modules/mapping/mapping_helpers/baseturf.dm b/code/modules/mapping/mapping_helpers/baseturf.dm index f4bd0d7c7f..4d79d3dba5 100644 --- a/code/modules/mapping/mapping_helpers/baseturf.dm +++ b/code/modules/mapping/mapping_helpers/baseturf.dm @@ -30,8 +30,8 @@ qdel(src) /obj/effect/baseturf_helper/proc/replace_baseturf(turf/thing) - var/list/baseturf_cache = thing.baseturfs - if(length(baseturf_cache)) + if(length(thing.baseturfs)) + var/list/baseturf_cache = thing.baseturfs.Copy() for(var/i in baseturf_cache) if(baseturf_to_replace[i]) baseturf_cache -= i @@ -44,6 +44,8 @@ else thing.PlaceOnBottom(null, baseturf) + + /obj/effect/baseturf_helper/space name = "space baseturf editor" baseturf = /turf/open/space @@ -79,4 +81,3 @@ /obj/effect/baseturf_helper/lava_land/surface name = "lavaland baseturf editor" baseturf = /turf/open/lava/smooth/lava_land_surface - diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index cda38033c2..dc52fb7f20 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -2,8 +2,9 @@ /obj/item/clothing/suit/hooded/explorer name = "explorer suit" desc = "An armoured suit for exploring harsh environments." - icon_state = "explorer" - item_state = "explorer" + icon_state = "explorer-normal" + item_state = "explorer-normal" + var/suit_type = "normal" body_parts_covered = CHEST|GROIN|LEGS|ARMS cold_protection = CHEST|GROIN|LEGS|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT @@ -13,11 +14,15 @@ allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe) resistance_flags = FIRE_PROOF mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC|STYLE_PAW_TAURIC + no_t = TRUE /obj/item/clothing/head/hooded/explorer name = "explorer hood" desc = "An armoured hood for exploring harsh environments." - icon_state = "explorer" + icon_state = "explorer-normal" + item_state = "explorer-normal" + var/suit_type = "normal" + var/basestate = "normal" body_parts_covered = HEAD flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT @@ -33,10 +38,40 @@ /obj/item/clothing/suit/hooded/explorer/standard/Initialize() . = ..() AddComponent(/datum/component/armor_plate) + RegisterSignal(src, COMSIG_ARMOR_PLATED, .proc/upgrade_icon) + +/obj/item/clothing/suit/hooded/explorer/standard/proc/upgrade_icon(datum/source, amount, maxamount) + SIGNAL_HANDLER + + if(amount) + name = "reinforced [initial(name)]" + suit_type = "normal_goliath" + if(amount == maxamount) + suit_type = "normal_goliath_full" + icon_state = "explorer-[suit_type]" + if(ishuman(loc)) + var/mob/living/carbon/human/wearer = loc + if(wearer.wear_suit == src) + wearer.update_inv_wear_suit() /obj/item/clothing/head/hooded/explorer/standard/Initialize() . = ..() AddComponent(/datum/component/armor_plate) + RegisterSignal(src, COMSIG_ARMOR_PLATED, .proc/upgrade_icon) + +/obj/item/clothing/head/hooded/explorer/standard/proc/upgrade_icon(datum/source, amount, maxamount) + SIGNAL_HANDLER + + if(amount) + name = "reinforced [initial(name)]" + suit_type = "normal_goliath" + if(amount == maxamount) + suit_type = "normal_goliath_full" + icon_state = "explorer-[suit_type]" + if(ishuman(loc)) + var/mob/living/carbon/human/wearer = loc + if(wearer.head == src) + wearer.update_inv_head() /obj/item/clothing/mask/gas/explorer name = "explorer gas mask" diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 223366c7ab..5647bc2305 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -91,7 +91,7 @@ INITIALIZE_IMMEDIATE(/mob/dead) var/client/C = client to_chat(C, "Sending you to [pick].") - new /obj/screen/splash(C) + new /atom/movable/screen/splash(C) mob_transforming = TRUE sleep(29) //let the animation play diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 11f1d58c0c..f7f3450f6e 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -21,7 +21,7 @@ /mob/dead/new_player/Initialize() if(client && SSticker.state == GAME_STATE_STARTUP) - var/obj/screen/splash/S = new(client, TRUE, TRUE) + var/atom/movable/screen/splash/S = new(client, TRUE, TRUE) S.Fade(TRUE) if(length(GLOB.newplayer_start)) @@ -567,7 +567,7 @@ if(job && !job.override_latejoin_spawn(character)) SSjob.SendToLateJoin(character) if(!arrivals_docked) - var/obj/screen/splash/Spl = new(character.client, TRUE) + var/atom/movable/screen/splash/Spl = new(character.client, TRUE) Spl.Fade(TRUE) character.playsound_local(get_turf(character), 'sound/voice/ApproachingTG.ogg', 25) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm index 88dda923a0..e002fa369d 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm @@ -1058,3 +1058,58 @@ /datum/sprite_accessory/hair/zone name = "Zone" icon_state = "hair_zone" + +/datum/sprite_accessory/hair_gradient + icon = 'icons/mob/hair_gradients.dmi' + +/datum/sprite_accessory/hair_gradient/none + name = "None" + icon_state = "none" + +/datum/sprite_accessory/hair_gradient/fadeup + name = "Fade Up" + icon_state = "fadeup" + +/datum/sprite_accessory/hair_gradient/fadedown + name = "Fade Down" + icon_state = "fadedown" + +/datum/sprite_accessory/hair_gradient/vertical_split + name = "Vertical Split" + icon_state = "vsplit" + +/datum/sprite_accessory/hair_gradient/_split + name = "Horizontal Split" + icon_state = "bottomflat" + +/datum/sprite_accessory/hair_gradient/reflected + name = "Reflected" + icon_state = "reflected_high" + +/datum/sprite_accessory/hair_gradient/reflected_inverse + name = "Reflected Inverse" + icon_state = "reflected_inverse_high" + +/datum/sprite_accessory/hair_gradient/wavy + name = "Wavy" + icon_state = "wavy" + +/datum/sprite_accessory/hair_gradient/long_fade_up + name = "Long Fade Up" + icon_state = "long_fade_up" + +/datum/sprite_accessory/hair_gradient/long_fade_down + name = "Long Fade Down" + icon_state = "long_fade_down" + +/datum/sprite_accessory/hair_gradient/short_fade_up + name = "Short Fade Up" + icon_state = "short_fade_up" + +/datum/sprite_accessory/hair_gradient/short_fade_down + name = "Short Fade Down" + icon_state = "short_fade_down" + +/datum/sprite_accessory/hair_gradient/wavy_spike + name = "Spiked Wavy" + icon_state = "wavy_spiked" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm b/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm index c7cd699ec9..08897ade34 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm @@ -38,14 +38,14 @@ icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi' name = "Synthetic Lizard - Pecs Light" icon_state = "synthlizpecslight" - covered_limbs = list("Chest" = MATRIX_GREEN_BLUE) + covered_limbs = list("Chest" = MATRIX_GREEN_BLUE, "Left Arm" = MATRIX_BLUE, "Right Arm" = MATRIX_BLUE, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN) /datum/sprite_accessory/mam_body_markings/synthliz recommended_species = list("synthliz") icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi' name = "Synthetic Lizard - Plates" icon_state = "synthlizscutes" - covered_limbs = list("Chest" = MATRIX_GREEN) + covered_limbs = list("Chest" = MATRIX_GREEN, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN) //Synth tails /datum/sprite_accessory/tails/mam_tails/synthliz diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm index 3834eb9231..64a3c1a24c 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm @@ -436,13 +436,27 @@ /datum/sprite_accessory/tails/human/shark name = "Shark" - icon_state = "shark" + icon_state = "carp" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/human/shark name = "Shark" + icon_state = "carp" + color_src = MATRIXED + icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED + +/datum/sprite_accessory/tails/human/sharkalt + name = "Shark (alt)" + icon_state = "shark" + color_src = MATRIXED + icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED + +/datum/sprite_accessory/tails_animated/human/sharkalt + name = "Shark (alt)" icon_state = "shark" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' @@ -528,6 +542,20 @@ icon = 'modular_citadel/icons/mob/mam_tails.dmi' matrixed_sections = MATRIX_RED_GREEN +/datum/sprite_accessory/tails/human/takahiro_kitsune + name = "Takahiro Kitsune Tails" //takahiro had five tails i just wanted to follow the 'T' naming convention vs. tamamo and triple + icon_state = "7sune" + color_src = MATRIXED + icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED_GREEN + +/datum/sprite_accessory/tails_animated/human/takahiro_kitsune + name = "Takahiro Kitsune Tails" + icon_state = "7sune" + color_src = MATRIXED + icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED_GREEN + /datum/sprite_accessory/tails/human/tentacle name = "Tentacle" icon_state = "tentacle" @@ -897,11 +925,21 @@ /datum/sprite_accessory/tails/mam_tails/shark name = "Shark" - icon_state = "shark" + icon_state = "carp" matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/mam_tails_animated/shark name = "Shark" + icon_state = "carp" + matrixed_sections = MATRIX_RED + +/datum/sprite_accessory/tails/mam_tails/sharkalt + name = "Shark (alt)" + icon_state = "shark" + matrixed_sections = MATRIX_RED + +/datum/sprite_accessory/tails_animated/mam_tails_animated/sharkalt + name = "Shark (alt)" icon_state = "shark" matrixed_sections = MATRIX_RED diff --git a/code/modules/mob/dead/observer/login.dm b/code/modules/mob/dead/observer/login.dm index 8daf8ec052..ad71d49489 100644 --- a/code/modules/mob/dead/observer/login.dm +++ b/code/modules/mob/dead/observer/login.dm @@ -16,5 +16,5 @@ if (isturf(T)) update_z(T.z) - update_icon(preferred_form) + update_icon(null, preferred_form) updateghostimages() diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 6c464c3cd1..1aa2863eda 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -176,7 +176,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) * Hair will always update its dir, so if your sprite has no dirs the haircut will go all over the place. * |- Ricotez */ -/mob/dead/observer/update_icon(new_form) +/mob/dead/observer/update_icon(updates=ALL, new_form=null) . = ..() if(client) //We update our preferences in case they changed right before update_icon was called. ghost_accs = client.prefs.ghost_accs @@ -447,7 +447,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(message) to_chat(src, "[message]") if(source) - var/obj/screen/alert/A = throw_alert("[REF(source)]_notify_cloning", /obj/screen/alert/notify_cloning) + var/atom/movable/screen/alert/A = throw_alert("[REF(source)]_notify_cloning", /atom/movable/screen/alert/notify_cloning) if(A) if(client && client.prefs && client.prefs.UI_style) A.icon = ui_style2icon(client.prefs.UI_style) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index cf1a158fc5..7615792028 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -39,29 +39,35 @@ return if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_HUSK))) //cryosleep or husked people do not pump the blood. - - //Blood regeneration if there is some space - if(blood_volume < BLOOD_VOLUME_NORMAL && !HAS_TRAIT(src, TRAIT_NOHUNGER)) + if(integrating_blood > 0) + var/blood_integrated = max(integrating_blood - 1, 0) + var/blood_diff = integrating_blood - blood_integrated + integrating_blood = blood_integrated + if(blood_volume < BLOOD_VOLUME_MAXIMUM) + blood_volume += blood_diff + if(blood_volume < BLOOD_VOLUME_NORMAL) var/nutrition_ratio = 0 - switch(nutrition) - if(0 to NUTRITION_LEVEL_STARVING) - nutrition_ratio = 0.2 - if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) - nutrition_ratio = 0.4 - if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED) - nutrition_ratio = 0.6 - if(NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED) - nutrition_ratio = 0.8 - else - nutrition_ratio = 1 - if(satiety > 80) - nutrition_ratio *= 1.25 - adjust_nutrition(-nutrition_ratio * HUNGER_FACTOR) - blood_volume = min(BLOOD_VOLUME_NORMAL, blood_volume + 0.5 * nutrition_ratio) + if(!HAS_TRAIT(src, TRAIT_NOHUNGER)) + switch(nutrition) + if(0 to NUTRITION_LEVEL_STARVING) + nutrition_ratio = 0.2 + if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) + nutrition_ratio = 0.4 + if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED) + nutrition_ratio = 0.6 + if(NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED) + nutrition_ratio = 0.8 + else + nutrition_ratio = 1 + if(satiety > 80) + nutrition_ratio *= 1.25 + adjust_nutrition(-nutrition_ratio * HUNGER_FACTOR) + blood_volume = min(BLOOD_VOLUME_NORMAL, blood_volume + 0.5 * nutrition_ratio) //Effects of bloodloss var/word = pick("dizzy","woozy","faint") - switch(blood_volume) + var/blood_effect_volume = blood_volume + integrating_blood + switch(blood_effect_volume) if(BLOOD_VOLUME_MAXIMUM to BLOOD_VOLUME_EXCESS) if(prob(10)) to_chat(src, "You feel terribly bloated.") @@ -94,14 +100,22 @@ bleed(temp_bleed) //Makes a blood drop, leaking amt units of blood from the mob -/mob/living/carbon/proc/bleed(amt) - if(blood_volume) +/mob/living/carbon/proc/bleed(amt, force) + var/bled = FALSE //Have we bled amnt? + if(blood_volume > amt || force && blood_volume) blood_volume = max(blood_volume - amt, 0) - if(isturf(src.loc)) //Blood loss still happens in locker, floor stays clean - if(amt >= 10) - add_splatter_floor(src.loc) - else - add_splatter_floor(src.loc, 1) + bled = TRUE + if(integrating_blood > amt || force && integrating_blood) + integrating_blood = max(integrating_blood - amt, 0) + bled = TRUE + if(!bled && !force) //If we are already cycling back through, don't do this again + bleed(amt, TRUE) //we cycle back through to try to bleed SOMETHING, not neccesarily the required amount + return + if(isturf(src.loc)) //Blood loss still happens in locker, floor stays clean + if(amt >= 10) + add_splatter_floor(src.loc) + else + add_splatter_floor(src.loc, TRUE) /mob/living/carbon/human/bleed(amt) amt *= physiology.bleed_mod @@ -114,6 +128,7 @@ /mob/living/proc/restore_blood() blood_volume = initial(blood_volume) + integrating_blood = 0 /mob/living/carbon/restore_blood() blood_volume = (BLOOD_VOLUME_NORMAL * blood_ratio) @@ -368,10 +383,17 @@ return blood_ratio = 1 -/mob/living/proc/AdjustBloodVol(var/value) +/mob/living/proc/AdjustBloodVol(value) if(blood_ratio == value) return blood_ratio = value if(ishuman(src)) var/mob/living/carbon/human/H = src H.handle_blood() + +/mob/living/proc/adjust_integration_blood(value, remove_actual_blood, force) + if(integrating_blood + value < 0 && remove_actual_blood) + blood_volume += value + integrating_blood + blood_volume = max(blood_volume, 0) + integrating_blood += value + integrating_blood = clamp(integrating_blood, 0, force ? INFINITY : (BLOOD_VOLUME_MAXIMUM - (integrating_blood + blood_volume))) diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index f5970d9da2..e9a62d209b 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -78,7 +78,7 @@ if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT) //Body temperature is too hot. - throw_alert("alien_fire", /obj/screen/alert/alien_fire) + throw_alert("alien_fire", /atom/movable/screen/alert/alien_fire) switch(bodytemperature) if(360 to 400) apply_damage(HEAT_DAMAGE_LEVEL_1, BURN) diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index 0ce8482ca1..a7044174b0 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -7,7 +7,7 @@ meleeKnockdownPower = 75 meleeSlashHumanPower = 20 meleeSlashSAPower = 45 - var/obj/screen/leap_icon = null + var/atom/movable/screen/leap_icon = null /mob/living/carbon/alien/humanoid/hunter/create_internal_organs() internal_organs += new /obj/item/organ/alien/plasmavessel/small diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index cd994dfd10..530d2acd63 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -20,7 +20,7 @@ if(Toxins_pp > tox_detect_threshold) // Detect toxins in air adjustPlasma(breath.get_moles(GAS_PLASMA)*250) - throw_alert("alien_tox", /obj/screen/alert/alien_tox) + throw_alert("alien_tox", /atom/movable/screen/alert/alien_tox) toxins_used = breath.get_moles(GAS_PLASMA) diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index 8e3966eb03..41c3882de6 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -85,7 +85,7 @@ owner.adjustOxyLoss(-heal_amt) owner.adjustCloneLoss(-heal_amt) if(owner.blood_volume && (owner.blood_volume < BLOOD_VOLUME_NORMAL)) - owner.blood_volume += 5 + owner.adjust_integration_blood(5) else owner.adjustPlasma(plasma_rate * 0.1) @@ -141,7 +141,7 @@ owner.stuttering += 30 recent_queen_death = 1 - owner.throw_alert("alien_noqueen", /obj/screen/alert/alien_vulnerable) + owner.throw_alert("alien_noqueen", /atom/movable/screen/alert/alien_vulnerable) addtimer(CALLBACK(src, .proc/clear_queen_death), QUEEN_DEATH_DEBUFF_DURATION) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 44379660b6..f6ef8e8177 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -57,7 +57,7 @@ var/oindex = active_hand_index active_hand_index = held_index if(hud_used) - var/obj/screen/inventory/hand/H + var/atom/movable/screen/inventory/hand/H H = hud_used.hand_slots["[oindex]"] if(H) H.update_icon() @@ -158,7 +158,7 @@ throw_mode_off() if(!target || !isturf(loc)) return - if(istype(target, /obj/screen)) + if(istype(target, /atom/movable/screen)) return //CIT CHANGES - makes it impossible to throw while in stamina softcrit @@ -699,7 +699,7 @@ become_blind(EYES_COVERED) else if(tinttotal >= TINT_DARKENED) cure_blind(EYES_COVERED) - overlay_fullscreen("tint", /obj/screen/fullscreen/impaired, 2) + overlay_fullscreen("tint", /atom/movable/screen/fullscreen/impaired, 2) else cure_blind(EYES_COVERED) clear_fullscreen("tint", 0) @@ -775,10 +775,10 @@ visionseverity = 9 if(-INFINITY to -24) visionseverity = 10 - overlay_fullscreen("critvision", /obj/screen/fullscreen/crit/vision, visionseverity) + overlay_fullscreen("critvision", /atom/movable/screen/fullscreen/crit/vision, visionseverity) else clear_fullscreen("critvision") - overlay_fullscreen("crit", /obj/screen/fullscreen/crit, severity) + overlay_fullscreen("crit", /atom/movable/screen/fullscreen/crit, severity) else clear_fullscreen("crit") clear_fullscreen("critvision") @@ -802,7 +802,7 @@ severity = 6 if(45 to INFINITY) severity = 7 - overlay_fullscreen("oxy", /obj/screen/fullscreen/oxy, severity) + overlay_fullscreen("oxy", /atom/movable/screen/fullscreen/oxy, severity) else clear_fullscreen("oxy") @@ -823,7 +823,7 @@ severity = 5 if(85 to INFINITY) severity = 6 - overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + overlay_fullscreen("brute", /atom/movable/screen/fullscreen/brute, severity) else clear_fullscreen("brute") @@ -888,7 +888,7 @@ if(handcuffed) drop_all_held_items() stop_pulling() - throw_alert("handcuffed", /obj/screen/alert/restrained/handcuffed, new_master = src.handcuffed) + throw_alert("handcuffed", /atom/movable/screen/alert/restrained/handcuffed, new_master = src.handcuffed) if(handcuffed.demoralize_criminals) SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "handcuffed", /datum/mood_event/handcuffed) else @@ -1273,3 +1273,6 @@ var/mob/living/carbon/C = usr if(I.can_give()) C.give(src) + +/mob/living/carbon/proc/functional_blood() + return blood_volume + integrating_blood diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index b2c14c30fe..46ba9a5eb0 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -361,7 +361,7 @@ return embeds -/mob/living/carbon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash, override_protection = 0) +/mob/living/carbon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/flash, override_protection = 0) . = ..() var/damage = override_protection ? intensity : intensity - get_eye_protection() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 65bcddf0ad..e3af31ae96 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -825,6 +825,7 @@ dna.remove_mutation(HM.name) if(blood_volume < (BLOOD_VOLUME_NORMAL*blood_ratio)) blood_volume = (BLOOD_VOLUME_NORMAL*blood_ratio) + integrating_blood = 0 ..() /mob/living/carbon/human/check_weakness(obj/item/weapon, mob/living/attacker) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index de934318b3..6723d2d4a6 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -20,6 +20,11 @@ var/hair_color = "000" var/hair_style = "Bald" + ///Colour used for the hair gradient. + var/grad_color = "000" + ///Style used for the hair gradient. + var/grad_style + //Facial hair colour and style var/facial_hair_color = "000" var/facial_hair_style = "Shaved" @@ -81,6 +86,8 @@ tooltips = TRUE + var/additional_language //the additional language this human can speak from their preference selection + /// Unarmed parry data for human /datum/block_parry_data/unarmed/human parry_respect_clickdelay = TRUE diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 7e3b2ab015..2e530226c8 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -182,3 +182,8 @@ destination.underwear = underwear destination.undershirt = undershirt destination.socks = socks + +/mob/living/carbon/human/adjust_integration_blood(value, force) + if(NOBLOOD in dna.species.species_traits) //Can't lose blood if your species doesn't have any + return + . = ..() diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index c4d023da58..b135ae9cd8 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -209,7 +209,7 @@ update_tint() if(G.vision_correction) if(HAS_TRAIT(src, TRAIT_NEARSIGHT)) - overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1) + overlay_fullscreen("nearsighted", /atom/movable/screen/fullscreen/impaired, 1) if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view || !isnull(G.lighting_alpha)) update_sight() if(!QDELETED(src)) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 767250c863..b43cd266be 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -89,15 +89,15 @@ var/datum/species/S = dna.species if(S.breathid == "o2") - throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) + throw_alert("not_enough_oxy", /atom/movable/screen/alert/not_enough_oxy) else if(S.breathid == "tox") - throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox) + throw_alert("not_enough_tox", /atom/movable/screen/alert/not_enough_tox) else if(S.breathid == "co2") - throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2) + throw_alert("not_enough_co2", /atom/movable/screen/alert/not_enough_co2) else if(S.breathid == "n2") - throw_alert("not_enough_nitro", /obj/screen/alert/not_enough_nitro) + throw_alert("not_enough_nitro", /atom/movable/screen/alert/not_enough_nitro) else if(S.breathid == "ch3br") - throw_alert("not_enough_ch3br", /obj/screen/alert/not_enough_ch3br) + throw_alert("not_enough_ch3br", /atom/movable/screen/alert/not_enough_ch3br) return FALSE else diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 3eb7771025..8464e15328 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -52,6 +52,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/hair_color ///The alpha used by the hair. 255 is completely solid, 0 is invisible. var/hair_alpha = 255 + ///The gradient style used for the mob's hair. + var/grad_style + ///The gradient color used to color the gradient. + var/grad_color ///Does the species use skintones or not? As of now only used by humans. var/use_skintones = FALSE @@ -439,6 +443,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) * * pref_load - Preferences to be loaded from character setup, loads in preferred mutant things like bodyparts, digilegs, skin color, etc. */ /datum/species/proc/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) + set waitfor = FALSE // Drop the items the new species can't wear for(var/slot_id in no_equip) var/obj/item/thing = C.get_item_by_slot(slot_id) @@ -677,9 +682,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!hair_hidden || dynamic_hair_suffix) var/mutable_appearance/hair_overlay = mutable_appearance(layer = -HAIR_LAYER) + var/mutable_appearance/gradient_overlay = mutable_appearance(layer = -HAIR_LAYER) if(!hair_hidden && !H.getorgan(/obj/item/organ/brain)) //Applies the debrained overlay if there is no brain if(!(NOBLOOD in species_traits)) - hair_overlay.icon = 'icons/mob/hair.dmi' + hair_overlay.icon = 'icons/mob/human_parts.dmi' hair_overlay.icon_state = "debrained" else if(H.hair_style && (HAIR in species_traits)) @@ -712,8 +718,21 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) hair_overlay.color = "#" + hair_color else hair_overlay.color = "#" + H.hair_color + + //Gradients + grad_style = H.grad_style + grad_color = H.grad_color + if(grad_style) + var/datum/sprite_accessory/gradient = GLOB.hair_gradients_list[grad_style] + var/icon/temp = icon(gradient.icon, gradient.icon_state) + var/icon/temp_hair = icon(hair_file, hair_state) + temp.Blend(temp_hair, ICON_ADD) + gradient_overlay.icon = temp + gradient_overlay.color = "#" + grad_color + else hair_overlay.color = forced_colour + hair_overlay.alpha = hair_alpha if(OFFSET_HAIR in H.dna.species.offset_features) @@ -722,6 +741,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(hair_overlay.icon) standing += hair_overlay + standing += gradient_overlay if(standing.len) H.overlays_standing[HAIR_LAYER] = standing @@ -1364,7 +1384,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) /datum/species/proc/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) if(chem.type == exotic_blood && !istype(exotic_blood, /datum/reagent/blood)) - H.blood_volume = min(H.blood_volume + round(chem.volume, 0.1), BLOOD_VOLUME_MAXIMUM) + H.adjust_integration_blood(round(chem.volume, 0.1)) H.reagents.del_reagent(chem.type) return TRUE return FALSE @@ -1458,13 +1478,13 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) switch(H.nutrition) if(NUTRITION_LEVEL_FULL to INFINITY) - H.throw_alert("nutrition", /obj/screen/alert/fat) + H.throw_alert("nutrition", /atom/movable/screen/alert/fat) if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FULL) H.clear_alert("nutrition") if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) - H.throw_alert("nutrition", /obj/screen/alert/hungry) + H.throw_alert("nutrition", /atom/movable/screen/alert/hungry) if(0 to NUTRITION_LEVEL_STARVING) - H.throw_alert("nutrition", /obj/screen/alert/starving) + H.throw_alert("nutrition", /atom/movable/screen/alert/starving) /datum/species/proc/update_health_hud(mob/living/carbon/human/H) return 0 @@ -1979,7 +1999,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(CHECK_MOBILITY(target, MOBILITY_STAND)) target.adjustStaminaLoss(5) else - target.adjustStaminaLoss(target.getStaminaLoss() > 75? 5 : 75) + target.adjustStaminaLoss(IS_STAMCRIT(target)? 2 : 10) if(target.is_shove_knockdown_blocked()) return @@ -2168,19 +2188,19 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) H.adjust_bodytemperature(natural*(1/(thermal_protection+1)) + min(thermal_protection * (loc_temp - H.bodytemperature) / BODYTEMP_HEAT_DIVISOR, BODYTEMP_HEATING_MAX)) switch((loc_temp - H.bodytemperature)*thermal_protection) if(-INFINITY to -50) - H.throw_alert("tempfeel", /obj/screen/alert/cold, 3) + H.throw_alert("tempfeel", /atom/movable/screen/alert/cold, 3) if(-50 to -35) - H.throw_alert("tempfeel", /obj/screen/alert/cold, 2) + H.throw_alert("tempfeel", /atom/movable/screen/alert/cold, 2) if(-35 to -20) - H.throw_alert("tempfeel", /obj/screen/alert/cold, 1) + H.throw_alert("tempfeel", /atom/movable/screen/alert/cold, 1) if(-20 to 0) //This is the sweet spot where air is considered normal H.clear_alert("tempfeel") if(0 to 15) //When the air around you matches your body's temperature, you'll start to feel warm. - H.throw_alert("tempfeel", /obj/screen/alert/hot, 1) + H.throw_alert("tempfeel", /atom/movable/screen/alert/hot, 1) if(15 to 30) - H.throw_alert("tempfeel", /obj/screen/alert/hot, 2) + H.throw_alert("tempfeel", /atom/movable/screen/alert/hot, 2) if(30 to INFINITY) - H.throw_alert("tempfeel", /obj/screen/alert/hot, 3) + H.throw_alert("tempfeel", /atom/movable/screen/alert/hot, 3) // +/- 50 degrees from 310K is the 'safe' zone, where no damage is dealt. if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !HAS_TRAIT(H, TRAIT_RESISTHEAT)) @@ -2201,11 +2221,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if (burn_damage) switch(burn_damage) if(0 to 2) - H.throw_alert("temp", /obj/screen/alert/sweat, 1) + H.throw_alert("temp", /atom/movable/screen/alert/sweat, 1) if(2 to 4) - H.throw_alert("temp", /obj/screen/alert/sweat, 2) + H.throw_alert("temp", /atom/movable/screen/alert/sweat, 2) else - H.throw_alert("temp", /obj/screen/alert/sweat, 3) + H.throw_alert("temp", /atom/movable/screen/alert/sweat, 3) burn_damage = burn_damage * heatmod * H.physiology.heat_mod if (H.stat < UNCONSCIOUS && (prob(burn_damage) * 10) / 4) //40% for level 3 damage on humans H.emote("scream") @@ -2218,13 +2238,13 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/cold, multiplicative_slowdown = ((BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR)) switch(H.bodytemperature) if(200 to BODYTEMP_COLD_DAMAGE_LIMIT) - H.throw_alert("temp", /obj/screen/alert/shiver, 1) + H.throw_alert("temp", /atom/movable/screen/alert/shiver, 1) H.apply_damage(COLD_DAMAGE_LEVEL_1*coldmod*H.physiology.cold_mod, BURN) if(120 to 200) - H.throw_alert("temp", /obj/screen/alert/shiver, 2) + H.throw_alert("temp", /atom/movable/screen/alert/shiver, 2) H.apply_damage(COLD_DAMAGE_LEVEL_2*coldmod*H.physiology.cold_mod, BURN) else - H.throw_alert("temp", /obj/screen/alert/shiver, 3) + H.throw_alert("temp", /atom/movable/screen/alert/shiver, 3) H.apply_damage(COLD_DAMAGE_LEVEL_3*coldmod*H.physiology.cold_mod, BURN) else @@ -2239,21 +2259,21 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(HAZARD_HIGH_PRESSURE to INFINITY) if(!HAS_TRAIT(H, TRAIT_RESISTHIGHPRESSURE)) H.adjustBruteLoss(min(((adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 ) * PRESSURE_DAMAGE_COEFFICIENT, MAX_HIGH_PRESSURE_DAMAGE) * H.physiology.pressure_mod) - H.throw_alert("pressure", /obj/screen/alert/highpressure, 2) + H.throw_alert("pressure", /atom/movable/screen/alert/highpressure, 2) else H.clear_alert("pressure") if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE) - H.throw_alert("pressure", /obj/screen/alert/highpressure, 1) + H.throw_alert("pressure", /atom/movable/screen/alert/highpressure, 1) if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE) H.clear_alert("pressure") if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE) - H.throw_alert("pressure", /obj/screen/alert/lowpressure, 1) + H.throw_alert("pressure", /atom/movable/screen/alert/lowpressure, 1) else if(HAS_TRAIT(H, TRAIT_RESISTLOWPRESSURE)) H.clear_alert("pressure") else H.adjustBruteLoss(LOW_PRESSURE_DAMAGE * H.physiology.pressure_mod) - H.throw_alert("pressure", /obj/screen/alert/lowpressure, 2) + H.throw_alert("pressure", /atom/movable/screen/alert/lowpressure, 2) ////////// // FIRE // diff --git a/code/modules/mob/living/carbon/human/species_types/bugmen.dm b/code/modules/mob/living/carbon/human/species_types/bugmen.dm index c649339fe3..f87f425b5f 100644 --- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm @@ -6,7 +6,7 @@ species_traits = list(LIPS,EYECOLOR,HAIR,FACEHAIR,MUTCOLORS,HORNCOLOR,WINGCOLOR,HAS_FLESH,HAS_BONE) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_tail" = "None", "mam_ears" = "None", - "insect_wings" = "None", "insect_fluff" = "None", "mam_snouts" = "None", "taur" = "None", "insect_markings" = "None") + "insect_wings" = "None", "insect_fluff" = "None", "mam_snouts" = "None", "taur" = "None", "insect_markings" = "None", "mam_body_markings" = list()) attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm index d92f4ab14a..ae7a7546e1 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -124,21 +124,21 @@ brutemod = 1.25 switch(get_charge(H)) if(ETHEREAL_CHARGE_NONE) - H.throw_alert("ethereal_charge", /obj/screen/alert/etherealcharge, 3) + H.throw_alert("ethereal_charge", /atom/movable/screen/alert/etherealcharge, 3) if(ETHEREAL_CHARGE_NONE to ETHEREAL_CHARGE_LOWPOWER) - H.throw_alert("ethereal_charge", /obj/screen/alert/etherealcharge, 2) + H.throw_alert("ethereal_charge", /atom/movable/screen/alert/etherealcharge, 2) if(H.health > 10.5) apply_damage(0.65, TOX, null, null, H) brutemod = 1.75 if(ETHEREAL_CHARGE_LOWPOWER to ETHEREAL_CHARGE_NORMAL) - H.throw_alert("ethereal_charge", /obj/screen/alert/etherealcharge, 1) + H.throw_alert("ethereal_charge", /atom/movable/screen/alert/etherealcharge, 1) brutemod = 1.5 if(ETHEREAL_CHARGE_FULL to ETHEREAL_CHARGE_OVERLOAD) - H.throw_alert("ethereal_overcharge", /obj/screen/alert/ethereal_overcharge, 1) + H.throw_alert("ethereal_overcharge", /atom/movable/screen/alert/ethereal_overcharge, 1) apply_damage(0.2, TOX, null, null, H) brutemod = 1.5 if(ETHEREAL_CHARGE_OVERLOAD to ETHEREAL_CHARGE_DANGEROUS) - H.throw_alert("ethereal_overcharge", /obj/screen/alert/ethereal_overcharge, 2) + H.throw_alert("ethereal_overcharge", /atom/movable/screen/alert/ethereal_overcharge, 2) apply_damage(0.65, TOX, null, null, H) brutemod = 1.75 if(prob(10)) //10% each tick for ethereals to explosively release excess energy if it reaches dangerous levels diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm index 6327375bb5..eee5757b46 100644 --- a/code/modules/mob/living/carbon/human/species_types/felinid.dm +++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm @@ -4,7 +4,7 @@ id = SPECIES_FELINID limbs_id = SPECIES_HUMAN - mutant_bodyparts = list("mam_tail" = "Cat", "mam_ears" = "Cat", "deco_wings" = "None") + mutant_bodyparts = list("mam_tail" = "Cat", "mam_ears" = "Cat", "deco_wings" = "None", "mam_body_markings" = list()) mutantears = /obj/item/organ/ears/cat mutanttail = /obj/item/organ/tail/cat 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 fba6ecd40c..ac25c9e021 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -807,11 +807,11 @@ /datum/species/golem/plastic/on_species_gain(mob/living/carbon/C, datum/species/old_species) . = ..() - C.AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) + C.AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_NUDE) /datum/species/golem/plastic/on_species_loss(mob/living/carbon/C) . = ..() - C.RemoveElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) + C.RemoveElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_NUDE) /datum/species/golem/bronze name = "Bronze Golem" diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm index d0f6c64550..e0558e6533 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -4,7 +4,7 @@ default_color = "FFFFFF" species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS_PARTSONLY,WINGCOLOR,HAS_FLESH,HAS_BONE) - mutant_bodyparts = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF","mcolor3" = "FFFFFF","tail_human" = "None", "ears" = "None", "taur" = "None", "deco_wings" = "None", "legs" = "Plantigrade") + mutant_bodyparts = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF","mcolor3" = "FFFFFF","tail_human" = "None", "ears" = "None", "taur" = "None", "deco_wings" = "None", "legs" = "Plantigrade", "mam_body_markings" = list()) use_skintones = USE_SKINTONES_GRAYSCALE_CUSTOM skinned_type = /obj/item/stack/sheet/animalhide/human disliked_food = GROSS | RAW diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 2f463fa8bc..04c69a4138 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -53,16 +53,16 @@ exotic_blood_color = "#" + H.dna.features["mcolor"] /datum/species/jelly/spec_life(mob/living/carbon/human/H) - if(H.stat == DEAD || HAS_TRAIT(H, TRAIT_NOMARROW)) //can't farm slime jelly from a dead slime/jelly person indefinitely, and no regeneration for blooduskers + if(H.stat == DEAD || HAS_TRAIT(H, TRAIT_NOMARROW)) //can't farm slime jelly from a dead slime/jelly person indefinitely, and no regeneration for bloodsuckers return if(!H.blood_volume) - H.blood_volume += 5 + H.adjust_integration_blood(5) H.adjustBruteLoss(5) to_chat(H, "You feel empty!") if(H.blood_volume < (BLOOD_VOLUME_NORMAL * H.blood_ratio)) if(H.nutrition >= NUTRITION_LEVEL_STARVING) - H.blood_volume += 3 + H.adjust_integration_blood(3) H.nutrition -= 2.5 if(H.blood_volume < (BLOOD_VOLUME_OKAY*H.blood_ratio)) if(prob(5)) @@ -82,7 +82,7 @@ consumed_limb.drop_limb() to_chat(H, "Your [consumed_limb] is drawn back into your body, unable to maintain its shape!") qdel(consumed_limb) - H.blood_volume += 20 + H.adjust_integration_blood(20) ////////////////////////////////////////////////////////SLIMEPEOPLE/////////////////////////////////////////////////////////////////// @@ -151,7 +151,7 @@ if(prob(5)) to_chat(H, "You feel very bloated!") else if(H.nutrition >= NUTRITION_LEVEL_WELL_FED) - H.blood_volume += 3 + H.adjust_integration_blood(3) H.nutrition -= 2.5 ..() @@ -505,7 +505,7 @@ button_icon_state = "slimeeject" ..() -/datum/action/innate/integrate_extract/ApplyIcon(obj/screen/movable/action_button/current_button, force) +/datum/action/innate/integrate_extract/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force) ..(current_button, TRUE) if(species && species.current_extract) current_button.add_overlay(mutable_appearance(species.current_extract.icon, species.current_extract.icon_state)) @@ -559,7 +559,7 @@ return TRUE return FALSE -/datum/action/innate/use_extract/ApplyIcon(obj/screen/movable/action_button/current_button, force) +/datum/action/innate/use_extract/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force) ..(current_button, TRUE) if(species && species.current_extract) current_button.add_overlay(mutable_appearance(species.current_extract.icon, species.current_extract.icon_state)) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index f18d768df3..52d736f9ce 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -128,7 +128,7 @@ There are several things that need to be remembered: remove_overlay(UNIFORM_LAYER) if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_W_UNIFORM] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_W_UNIFORM] inv.update_icon() if(istype(w_uniform, /obj/item/clothing/under)) @@ -180,7 +180,7 @@ There are several things that need to be remembered: remove_overlay(ID_LAYER) if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_ID] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_ID] inv.update_icon() var/mutable_appearance/id_overlay = overlays_standing[ID_LAYER] @@ -205,7 +205,7 @@ There are several things that need to be remembered: remove_overlay(GLOVES_LAYER) if(client && hud_used && hud_used.inv_slots[SLOT_GLOVES]) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_GLOVES] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_GLOVES] inv.update_icon() if(!gloves && bloody_hands) @@ -242,7 +242,7 @@ There are several things that need to be remembered: return if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_GLASSES] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_GLASSES] inv.update_icon() if(glasses) @@ -269,7 +269,7 @@ There are several things that need to be remembered: return if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_EARS] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_EARS] inv.update_icon() if(ears) @@ -295,7 +295,7 @@ There are several things that need to be remembered: return if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_SHOES] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_SHOES] inv.update_icon() if(dna.species.mutant_bodyparts["taur"]) @@ -330,7 +330,7 @@ There are several things that need to be remembered: remove_overlay(SUIT_STORE_LAYER) if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_S_STORE] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_S_STORE] inv.update_icon() if(s_store) @@ -357,7 +357,7 @@ There are several things that need to be remembered: return if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_HEAD] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_HEAD] inv.update_icon() if(head) @@ -394,7 +394,7 @@ There are several things that need to be remembered: remove_overlay(BELT_LAYER) if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_BELT] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_BELT] inv.update_icon() if(belt) @@ -416,7 +416,7 @@ There are several things that need to be remembered: remove_overlay(SUIT_LAYER) if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_SUIT] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_SUIT] inv.update_icon() if(wear_suit) @@ -477,7 +477,7 @@ There are several things that need to be remembered: /mob/living/carbon/human/update_inv_pockets() if(client && hud_used) - var/obj/screen/inventory/inv + var/atom/movable/screen/inventory/inv inv = hud_used.inv_slots[SLOT_L_STORE] inv.update_icon() @@ -506,7 +506,7 @@ There are several things that need to be remembered: return if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_MASK] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_MASK] inv.update_icon() if(wear_mask) diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 0447de6064..fca7c1f72c 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -183,7 +183,7 @@ if(!targets) return for(var/mob/living/carbon/C in targets) - var/obj/screen/alert/give/G = C.throw_alert("[src]", /obj/screen/alert/give) + var/atom/movable/screen/alert/give/G = C.throw_alert("[src]", /atom/movable/screen/alert/give) if(!G) return G.setup(C, src, receiving) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 0b12f3884e..6f0f5453da 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -1,6 +1,6 @@ /mob/living/carbon/BiologicalLife(seconds, times_fired) //Reagent processing needs to come before breathing, to prevent edge cases. - handle_organs() + handle_organs(seconds, times_fired) . = ..() // if . is false, we are dead. if(stat == DEAD) stop_sound_channel(CHANNEL_HEARTBEAT) @@ -23,7 +23,7 @@ handle_brain_damage() if(stat != DEAD) - handle_liver() + handle_liver(seconds, times_fired) if(stat != DEAD) handle_corruption() @@ -155,7 +155,7 @@ adjustOxyLoss(1) failed_last_breath = 1 - throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) + throw_alert("not_enough_oxy", /atom/movable/screen/alert/not_enough_oxy) return 0 var/safe_oxy_min = 16 @@ -183,7 +183,7 @@ adjustOxyLoss(8) if(prob(20)) emote("cough") - throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy) + throw_alert("too_much_oxy", /atom/movable/screen/alert/too_much_oxy) SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "suffocation", /datum/mood_event/suffocation) if(O2_partialpressure < safe_oxy_min) //Not enough oxygen @@ -197,7 +197,7 @@ else adjustOxyLoss(3) failed_last_breath = 1 - throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) + throw_alert("not_enough_oxy", /atom/movable/screen/alert/not_enough_oxy) SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "suffocation", /datum/mood_event/suffocation) else //Enough oxygen @@ -231,7 +231,7 @@ if(Toxins_partialpressure > safe_tox_max) var/ratio = (breath.get_moles(GAS_PLASMA)/safe_tox_max) * 10 adjustToxLoss(clamp(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE)) - throw_alert("too_much_tox", /obj/screen/alert/too_much_tox) + throw_alert("too_much_tox", /atom/movable/screen/alert/too_much_tox) else clear_alert("too_much_tox") @@ -378,25 +378,25 @@ /mob/living/carbon/proc/handle_blood() return -/mob/living/carbon/proc/handle_bodyparts() +/mob/living/carbon/proc/handle_bodyparts(seconds, times_fired) for(var/I in bodyparts) var/obj/item/bodypart/BP = I if(BP.needs_processing) - . |= BP.on_life() + . |= BP.on_life(seconds, times_fired) -/mob/living/carbon/proc/handle_organs() +/mob/living/carbon/proc/handle_organs(seconds, times_fired) if(stat != DEAD) for(var/V in internal_organs) var/obj/item/organ/O = V if(O) - O.on_life() + O.on_life(seconds, times_fired) else if(reagents.has_reagent(/datum/reagent/toxin/formaldehyde, 1) || reagents.has_reagent(/datum/reagent/preservahyde, 1)) // No organ decay if the body contains formaldehyde. Or preservahyde. return for(var/V in internal_organs) var/obj/item/organ/O = V if(O) - O.on_death() //Needed so organs decay while inside the body. + O.on_death(seconds, times_fired) //Needed so organs decay while inside the body. /mob/living/carbon/handle_diseases() for(var/thing in diseases) @@ -687,16 +687,16 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put //LIVER// ///////// -/mob/living/carbon/proc/handle_liver() +/mob/living/carbon/proc/handle_liver(seconds, times_fired) var/obj/item/organ/liver/liver = getorganslot(ORGAN_SLOT_LIVER) if((!dna && !liver) || (NOLIVER in dna.species.species_traits)) return if(!liver || liver.organ_flags & ORGAN_FAILING) - liver_failure() + liver_failure(seconds, times_fired) -/mob/living/carbon/proc/liver_failure() +/mob/living/carbon/proc/liver_failure(seconds, times_fired) reagents.end_metabolization(src, keep_liverless = TRUE) //Stops trait-based effects on reagents, to prevent permanent buffs - reagents.metabolize(src, can_overdose=FALSE, liverless = TRUE) + reagents.metabolize(src, seconds, times_fired, can_overdose=FALSE, liverless = TRUE) if(HAS_TRAIT(src, TRAIT_STABLELIVER)) return adjustToxLoss(4, TRUE, TRUE) diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 9e6431985c..480cbebe11 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -80,13 +80,13 @@ if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !HAS_TRAIT(src, TRAIT_RESISTHEAT)) switch(bodytemperature) if(360 to 400) - throw_alert("temp", /obj/screen/alert/hot, 1) + throw_alert("temp", /atom/movable/screen/alert/hot, 1) apply_damage(HEAT_DAMAGE_LEVEL_1, BURN) if(400 to 460) - throw_alert("temp", /obj/screen/alert/hot, 2) + throw_alert("temp", /atom/movable/screen/alert/hot, 2) apply_damage(HEAT_DAMAGE_LEVEL_2, BURN) if(460 to INFINITY) - throw_alert("temp", /obj/screen/alert/hot, 3) + throw_alert("temp", /atom/movable/screen/alert/hot, 3) if(on_fire) apply_damage(HEAT_DAMAGE_LEVEL_3, BURN) else @@ -96,13 +96,13 @@ if(!istype(loc, /obj/machinery/atmospherics/components/unary/cryo_cell)) switch(bodytemperature) if(200 to 260) - throw_alert("temp", /obj/screen/alert/cold, 1) + throw_alert("temp", /atom/movable/screen/alert/cold, 1) apply_damage(COLD_DAMAGE_LEVEL_1, BURN) if(120 to 200) - throw_alert("temp", /obj/screen/alert/cold, 2) + throw_alert("temp", /atom/movable/screen/alert/cold, 2) apply_damage(COLD_DAMAGE_LEVEL_2, BURN) if(-INFINITY to 120) - throw_alert("temp", /obj/screen/alert/cold, 3) + throw_alert("temp", /atom/movable/screen/alert/cold, 3) apply_damage(COLD_DAMAGE_LEVEL_3, BURN) else clear_alert("temp") @@ -117,16 +117,16 @@ switch(adjusted_pressure) if(HAZARD_HIGH_PRESSURE to INFINITY) adjustBruteLoss( min( ( (adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) ) - throw_alert("pressure", /obj/screen/alert/highpressure, 2) + throw_alert("pressure", /atom/movable/screen/alert/highpressure, 2) if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE) - throw_alert("pressure", /obj/screen/alert/highpressure, 1) + throw_alert("pressure", /atom/movable/screen/alert/highpressure, 1) if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE) clear_alert("pressure") if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE) - throw_alert("pressure", /obj/screen/alert/lowpressure, 1) + throw_alert("pressure", /atom/movable/screen/alert/lowpressure, 1) else adjustBruteLoss( LOW_PRESSURE_DAMAGE ) - throw_alert("pressure", /obj/screen/alert/lowpressure, 2) + throw_alert("pressure", /atom/movable/screen/alert/lowpressure, 2) return diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index d49059f839..4ab24c31dd 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -173,4 +173,4 @@ if(prob(10)) var/obj/item/clothing/head/helmet/justice/escape/helmet = new(src) equip_to_slot_or_del(helmet,SLOT_HEAD) - helmet.attack_self(src) // todo encapsulate toggle + INVOKE_ASYNC(helmet, /obj/item.proc/attack_self, src) // todo encapsulate toggle diff --git a/code/modules/mob/living/carbon/monkey/update_icons.dm b/code/modules/mob/living/carbon/monkey/update_icons.dm index 43f57ea40d..cd1a5896eb 100644 --- a/code/modules/mob/living/carbon/monkey/update_icons.dm +++ b/code/modules/mob/living/carbon/monkey/update_icons.dm @@ -51,7 +51,7 @@ overlays_standing[HANDCUFF_LAYER] = legcuffs apply_overlay(LEGCUFF_LAYER) - throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed) + throw_alert("legcuffed", /atom/movable/screen/alert/restrained/legcuffed, new_master = legcuffed) //monkey HUD updates for items in our inventory diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index d602c25331..5b5aa9d5c0 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -5,8 +5,8 @@ /mob/living/carbon/adjust_drugginess(amount) druggy = max(druggy+amount, 0) if(druggy) - overlay_fullscreen("high", /obj/screen/fullscreen/high) - throw_alert("high", /obj/screen/alert/high) + overlay_fullscreen("high", /atom/movable/screen/fullscreen/high) + throw_alert("high", /atom/movable/screen/alert/high) SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "high", /datum/mood_event/high) sound_environment_override = SOUND_ENVIRONMENT_DRUGGED else @@ -18,8 +18,8 @@ /mob/living/carbon/set_drugginess(amount) druggy = max(amount, 0) if(druggy) - overlay_fullscreen("high", /obj/screen/fullscreen/high) - throw_alert("high", /obj/screen/alert/high) + overlay_fullscreen("high", /atom/movable/screen/fullscreen/high) + throw_alert("high", /atom/movable/screen/alert/high) else clear_fullscreen("high") clear_alert("high") diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index a1ea18a8b9..43e0db1f08 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -91,7 +91,7 @@ return if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_MASK] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_MASK] inv?.update_icon() if(wear_mask) @@ -105,7 +105,7 @@ remove_overlay(NECK_LAYER) if(client && hud_used && hud_used.inv_slots[SLOT_NECK]) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_NECK] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_NECK] inv.update_icon() if(wear_neck) @@ -119,7 +119,7 @@ remove_overlay(BACK_LAYER) if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_BACK] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_BACK] inv?.update_icon() if(back) @@ -135,7 +135,7 @@ return if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_HEAD] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_HEAD] inv?.update_icon() if(head) @@ -163,7 +163,7 @@ overlays_standing[LEGCUFF_LAYER] = legcuffs apply_overlay(LEGCUFF_LAYER) - throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed) + throw_alert("legcuffed", /atom/movable/screen/alert/restrained/legcuffed, new_master = legcuffed) //mob HUD updates for items in our inventory @@ -171,7 +171,7 @@ /mob/living/carbon/proc/update_hud_handcuffed() if(hud_used) for(var/hand in hud_used.hand_slots) - var/obj/screen/inventory/hand/H = hud_used.hand_slots[hand] + var/atom/movable/screen/inventory/hand/H = hud_used.hand_slots[hand] if(H) H.update_icon() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index a3e6b28fd6..5603801dce 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -548,7 +548,7 @@ var/severity = 0 var/healthpercent = (health/maxHealth) * 100 if(hud_used?.healthdoll) //to really put you in the boots of a simplemob - var/obj/screen/healthdoll/living/livingdoll = hud_used.healthdoll + var/atom/movable/screen/healthdoll/living/livingdoll = hud_used.healthdoll switch(healthpercent) if(100 to INFINITY) livingdoll.icon_state = "living0" @@ -579,7 +579,7 @@ UNLINT(livingdoll.filters += filter(type="alpha", icon = mob_mask)) livingdoll.filters += filter(type="drop_shadow", size = -1) if(severity > 0) - overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + overlay_fullscreen("brute", /atom/movable/screen/fullscreen/brute, severity) else clear_fullscreen("brute") @@ -869,11 +869,11 @@ clear_alert("gravity") else if(has_gravity >= GRAVITY_DAMAGE_TRESHOLD) - throw_alert("gravity", /obj/screen/alert/veryhighgravity) + throw_alert("gravity", /atom/movable/screen/alert/veryhighgravity) else - throw_alert("gravity", /obj/screen/alert/highgravity) + throw_alert("gravity", /atom/movable/screen/alert/highgravity) else - throw_alert("gravity", /obj/screen/alert/weightless) + throw_alert("gravity", /atom/movable/screen/alert/weightless) if(!override && !is_flying()) INVOKE_ASYNC(src, /atom/movable.proc/float, !has_gravity) @@ -1159,7 +1159,7 @@ visible_message("[src] catches fire!", \ "You're set on fire!") new/obj/effect/dummy/lighting_obj/moblight/fire(src) - throw_alert("fire", /obj/screen/alert/fire) + throw_alert("fire", /atom/movable/screen/alert/fire) update_fire() SEND_SIGNAL(src, COMSIG_LIVING_IGNITED,src) return TRUE diff --git a/code/modules/mob/living/living_active_parry.dm b/code/modules/mob/living/living_active_parry.dm index e34c5ce053..13240b2734 100644 --- a/code/modules/mob/living/living_active_parry.dm +++ b/code/modules/mob/living/living_active_parry.dm @@ -103,13 +103,16 @@ var/_method = override[thing] if(_method == ITEM_PARRY) using_item = thing + tool = using_item method = ITEM_PARRY data = using_item.block_parry_data else if(_method == UNARMED_PARRY) method = UNARMED_PARRY + tool = src data = thing if(!using_item && !method && length(other_items)) using_item = other_items[1] + tool = using_item method = ITEM_PARRY data = using_item.block_parry_data if(!method) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 4c6ede3904..7423a164a4 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -118,7 +118,7 @@ throwpower = I.throwforce var/impacting_zone = ran_zone(BODY_ZONE_CHEST, 65)//Hits a random part of the body, geared towards the chest var/list/block_return = list() - var/total_damage = I.throwforce + var/total_damage = AM.throwforce if(mob_run_block(AM, throwpower, "\the [AM.name]", ATTACK_TYPE_THROWN, 0, throwingdatum?.thrower, impacting_zone, block_return) & BLOCK_SUCCESS) hitpush = FALSE skipcatch = TRUE @@ -539,7 +539,7 @@ //called when the mob receives a bright flash -/mob/living/proc/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash, override_protection = 0) +/mob/living/proc/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/flash, override_protection = 0) if((override_protection || get_eye_protection() < intensity) && (override_blindness_check || !(HAS_TRAIT(src, TRAIT_BLIND)))) overlay_fullscreen("flash", type) addtimer(CALLBACK(src, .proc/clear_fullscreen, "flash", 25), 25) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index a76fbe4c4e..7b07dfb487 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -112,6 +112,7 @@ var/stun_absorption = null //converted to a list of stun absorption sources this mob has when one is added var/blood_volume = 0 //how much blood the mob has + var/integrating_blood = 0 //this is the variable you want to affect if you want to give the mob blood, this will slowly turn into normal blood, preventing some cheesyness, use adjust_integration_blood() instead of modifying directly var/blood_ratio = 1 //How much blood the mob needs, in terms of ratio (i.e 1.2 will require BLOOD_VOLUME_NORMAL of 672) DO NOT GO ABOVE 3.55 Well, actually you can but, then they can't get enough blood. var/obj/effect/proc_holder/ranged_ability //Any ranged ability the mob has, as a click override diff --git a/code/modules/mob/living/living_sprint.dm b/code/modules/mob/living/living_sprint.dm index 728645c3eb..3fbc229385 100644 --- a/code/modules/mob/living/living_sprint.dm +++ b/code/modules/mob/living/living_sprint.dm @@ -3,7 +3,7 @@ RegisterSignal(src, SIGNAL_TRAIT(TRAIT_SPRINT_LOCKED), .proc/update_sprint_lock) /mob/living/proc/update_sprint_icon() - var/obj/screen/sprintbutton/S = locate() in hud_used?.static_inventory + var/atom/movable/screen/sprintbutton/S = locate() in hud_used?.static_inventory S?.update_icon() /mob/living/proc/update_hud_sprint_bar() diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 1f582b68bf..b2b1d2fb5f 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -91,7 +91,7 @@ var/multicam_on = FALSE - var/obj/screen/movable/pic_in_pic/ai/master_multicam + var/atom/movable/screen/movable/pic_in_pic/ai/master_multicam var/list/multicam_screens = list() var/list/all_eyes = list() var/max_multicams = 6 diff --git a/code/modules/mob/living/silicon/ai/multicam.dm b/code/modules/mob/living/silicon/ai/multicam.dm index ba92932579..54713acac4 100644 --- a/code/modules/mob/living/silicon/ai/multicam.dm +++ b/code/modules/mob/living/silicon/ai/multicam.dm @@ -1,34 +1,34 @@ //Picture in picture -/obj/screen/movable/pic_in_pic/ai +/atom/movable/screen/movable/pic_in_pic/ai var/mob/living/silicon/ai/ai var/mutable_appearance/highlighted_background var/highlighted = FALSE var/mob/camera/aiEye/pic_in_pic/aiEye -/obj/screen/movable/pic_in_pic/ai/Initialize() +/atom/movable/screen/movable/pic_in_pic/ai/Initialize() . = ..() aiEye = new /mob/camera/aiEye/pic_in_pic() aiEye.screen = src -/obj/screen/movable/pic_in_pic/ai/Destroy() +/atom/movable/screen/movable/pic_in_pic/ai/Destroy() set_ai(null) QDEL_NULL(aiEye) return ..() -/obj/screen/movable/pic_in_pic/ai/Click() +/atom/movable/screen/movable/pic_in_pic/ai/Click() ..() if(ai) ai.select_main_multicam_window(src) -/obj/screen/movable/pic_in_pic/ai/make_backgrounds() +/atom/movable/screen/movable/pic_in_pic/ai/make_backgrounds() ..() highlighted_background = new /mutable_appearance() highlighted_background.icon = 'icons/misc/pic_in_pic.dmi' highlighted_background.icon_state = "background_highlight" highlighted_background.layer = SPACE_LAYER -/obj/screen/movable/pic_in_pic/ai/add_background() +/atom/movable/screen/movable/pic_in_pic/ai/add_background() if((width > 0) && (height > 0)) var/matrix/M = matrix() M.Scale(width + 0.5, height + 0.5) @@ -37,35 +37,35 @@ standard_background.transform = M add_overlay(highlighted ? highlighted_background : standard_background) -/obj/screen/movable/pic_in_pic/ai/set_view_size(width, height, do_refresh = TRUE) +/atom/movable/screen/movable/pic_in_pic/ai/set_view_size(width, height, do_refresh = TRUE) aiEye.static_visibility_range = (round(max(width, height) / 2) + 1) if(ai) ai.camera_visibility(aiEye) ..() -/obj/screen/movable/pic_in_pic/ai/set_view_center(atom/target, do_refresh = TRUE) +/atom/movable/screen/movable/pic_in_pic/ai/set_view_center(atom/target, do_refresh = TRUE) ..() aiEye.setLoc(get_turf(target)) -/obj/screen/movable/pic_in_pic/ai/refresh_view() +/atom/movable/screen/movable/pic_in_pic/ai/refresh_view() ..() aiEye.setLoc(get_turf(center)) -/obj/screen/movable/pic_in_pic/ai/proc/highlight() +/atom/movable/screen/movable/pic_in_pic/ai/proc/highlight() if(highlighted) return highlighted = TRUE cut_overlay(standard_background) add_overlay(highlighted_background) -/obj/screen/movable/pic_in_pic/ai/proc/unhighlight() +/atom/movable/screen/movable/pic_in_pic/ai/proc/unhighlight() if(!highlighted) return highlighted = FALSE cut_overlay(highlighted_background) add_overlay(standard_background) -/obj/screen/movable/pic_in_pic/ai/proc/set_ai(mob/living/silicon/ai/new_ai) +/atom/movable/screen/movable/pic_in_pic/ai/proc/set_ai(mob/living/silicon/ai/new_ai) if(ai) ai.multicam_screens -= src ai.all_eyes -= aiEye @@ -120,7 +120,7 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) invisibility = INVISIBILITY_OBSERVER mouse_opacity = MOUSE_OPACITY_ICON icon_state = "ai_pip_camera" - var/obj/screen/movable/pic_in_pic/ai/screen + var/atom/movable/screen/movable/pic_in_pic/ai/screen var/list/cameras_telegraphed = list() var/telegraph_cameras = TRUE var/telegraph_range = 7 @@ -204,7 +204,7 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) if(!silent) to_chat(src, "Cannot place more than [max_multicams] multicamera windows.") return - var/obj/screen/movable/pic_in_pic/ai/C = new /obj/screen/movable/pic_in_pic/ai() + var/atom/movable/screen/movable/pic_in_pic/ai/C = new /atom/movable/screen/movable/pic_in_pic/ai() C.set_view_size(3, 3, FALSE) C.set_view_center(get_turf(eyeobj)) C.set_ai(src) @@ -235,7 +235,7 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) reset_perspective(GLOB.ai_camera_room_landmark) if(client) for(var/V in multicam_screens) - var/obj/screen/movable/pic_in_pic/P = V + var/atom/movable/screen/movable/pic_in_pic/P = V P.show_to(client) /mob/living/silicon/ai/proc/end_multicam() @@ -245,13 +245,13 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) select_main_multicam_window(null) if(client) for(var/V in multicam_screens) - var/obj/screen/movable/pic_in_pic/P = V + var/atom/movable/screen/movable/pic_in_pic/P = V P.unshow_to(client) reset_perspective() to_chat(src, "Multiple-camera viewing mode deactivated.") -/mob/living/silicon/ai/proc/select_main_multicam_window(obj/screen/movable/pic_in_pic/ai/P) +/mob/living/silicon/ai/proc/select_main_multicam_window(atom/movable/screen/movable/pic_in_pic/ai/P) if(master_multicam == P) return diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm index acaee05cc6..d92f4a5999 100644 --- a/code/modules/mob/living/silicon/laws.dm +++ b/code/modules/mob/living/silicon/laws.dm @@ -6,7 +6,7 @@ make_laws() /mob/living/silicon/proc/post_lawchange(announce = TRUE) - throw_alert("newlaw", /obj/screen/alert/newlaw) + throw_alert("newlaw", /atom/movable/screen/alert/newlaw) if(announce && last_lawchange_announce != world.time) to_chat(src, "Your laws have been changed.") addtimer(CALLBACK(src, .proc/show_laws), 0) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 4e33fba208..d19ef4c16e 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -322,6 +322,17 @@ else to_chat(user, "Encryption Key ports not configured.") +/obj/item/paicard/emag_act(mob/user) // Emag to wipe the master DNA and supplemental directive + . = ..() + if(!pai) + return + to_chat(user, "You override [pai]'s directive system, clearing its master string and supplied directive.") + to_chat(pai, "Warning: System override detected, check directive sub-system for any changes.'") + log_game("[key_name(user)] emagged [key_name(pai)], wiping their master DNA and supplemental directive.") + pai.master = null + pai.master_dna = null + pai.laws.supplied[1] = "None." // Sets supplemental directive to this + /mob/living/silicon/pai/proc/short_radio() if(radio_short_timerid) deltimer(radio_short_timerid) diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index b11737659c..559ffbbc08 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -3,12 +3,15 @@ /** * Returns the thing in our active hand (whatever is in our active module-slot, in this case) + * + * Arguments + * * get_gripper - If the active module is a gripper, should we return the gripper or the contained item? (if the gripper contains nothing, returns the gripper anyways) */ -/mob/living/silicon/robot/get_active_held_item() +/mob/living/silicon/robot/get_active_held_item(get_gripper = FALSE) var/item = module_active // snowflake handler for the gripper - if(istype(item, /obj/item/weapon/gripper)) - var/obj/item/weapon/gripper/G = item + if(istype(item, /obj/item/gripper) && !get_gripper) + var/obj/item/gripper/G = item if(G.wrapped) if(G.wrapped.loc != G) G.wrapped = null @@ -284,9 +287,14 @@ /** * Unequips the active held item, if there is one. + * + * Will always consider dropping gripper contents first. */ /mob/living/silicon/robot/proc/uneq_active() if(module_active) + var/obj/item/gripper/gripper = get_active_held_item(TRUE) + if(istype(gripper) && gripper.drop_held()) + return unequip_module_from_slot(module_active, get_selected_module()) /** @@ -302,11 +310,12 @@ * Checks if the item is currently in a slot. * * If the item is found in a slot, this returns TRUE. Otherwise, it returns FALSE + * Modified to accept items inside of grippers, used for `code\modules\tgui\states\hands.dm:27` * Arguments * * item_module - the item being checked */ /mob/living/silicon/robot/proc/activated(obj/item/item_module) - if(item_module in held_items) + if(get_active_held_item() == item_module || (item_module in held_items)) return TRUE return FALSE diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 9075af2dbd..d1eaeeacc5 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -58,15 +58,15 @@ if(0.75 to INFINITY) clear_alert("charge") if(0.5 to 0.75) - throw_alert("charge", /obj/screen/alert/lowcell, 1) + throw_alert("charge", /atom/movable/screen/alert/lowcell, 1) if(0.25 to 0.5) - throw_alert("charge", /obj/screen/alert/lowcell, 2) + throw_alert("charge", /atom/movable/screen/alert/lowcell, 2) if(0.01 to 0.25) - throw_alert("charge", /obj/screen/alert/lowcell, 3) + throw_alert("charge", /atom/movable/screen/alert/lowcell, 3) else - throw_alert("charge", /obj/screen/alert/emptycell) + throw_alert("charge", /atom/movable/screen/alert/emptycell) else - throw_alert("charge", /obj/screen/alert/nocell) + throw_alert("charge", /atom/movable/screen/alert/nocell) //Robots on fire /mob/living/silicon/robot/handle_fire() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 47f9a794cf..9658247da3 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -23,9 +23,9 @@ robot_modules_background.layer = HUD_LAYER //Objects that appear on screen are on layer ABOVE_HUD_LAYER, UI should be just below it. robot_modules_background.plane = HUD_PLANE - inv1 = new /obj/screen/robot/module1() - inv2 = new /obj/screen/robot/module2() - inv3 = new /obj/screen/robot/module3() + inv1 = new /atom/movable/screen/robot/module1() + inv2 = new /atom/movable/screen/robot/module2() + inv3 = new /atom/movable/screen/robot/module3() previous_health = health @@ -598,7 +598,7 @@ if(wires.is_cut(WIRE_LOCKDOWN)) state = TRUE if(state) - throw_alert("locked", /obj/screen/alert/locked) + throw_alert("locked", /atom/movable/screen/alert/locked) else clear_alert("locked") locked_down = state @@ -611,7 +611,7 @@ module.rebuild_modules() update_icons() if(emagged) - throw_alert("hacked", /obj/screen/alert/hacked) + throw_alert("hacked", /atom/movable/screen/alert/hacked) else clear_alert("hacked") @@ -966,7 +966,8 @@ upgrades.Cut() - speed = 0 + vtec = 0 + vtec_disabled = FALSE ionpulse = FALSE revert_shell() diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 36f291bf36..5342638c03 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -82,6 +82,18 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real if(!opened) return ..() +/mob/living/silicon/robot/disarm_shove(mob/living/carbon/human/H) + visible_message(span_danger("[src]'s motors grind as they are shoved by [H]!")) + vtec_disable(10 SECONDS) + +/mob/living/silicon/robot/proc/vtec_disable(time) + var/datum/status_effect/vtec_disabled/V = has_status_effect(/datum/status_effect/vtec_disabled) + if(V) + V.duration = max(V.duration, world.time + time) + else + apply_status_effect(/datum/status_effect/vtec_disabled, time) + update_movespeed() + /mob/living/silicon/robot/fire_act() if(!on_fire) //Silicons don't gain stacks from hotspots, but hotspots can ignite them IgniteMob() diff --git a/code/modules/mob/living/silicon/robot/robot_defines.dm b/code/modules/mob/living/silicon/robot/robot_defines.dm index fe22ec1236..612298e526 100644 --- a/code/modules/mob/living/silicon/robot/robot_defines.dm +++ b/code/modules/mob/living/silicon/robot/robot_defines.dm @@ -26,15 +26,15 @@ var/previous_health //Hud stuff - var/obj/screen/inv1 = null - var/obj/screen/inv2 = null - var/obj/screen/inv3 = null - var/obj/screen/lamp_button = null - var/obj/screen/thruster_button = null - var/obj/screen/hands = null + var/atom/movable/screen/inv1 = null + var/atom/movable/screen/inv2 = null + var/atom/movable/screen/inv3 = null + var/atom/movable/screen/lamp_button = null + var/atom/movable/screen/thruster_button = null + var/atom/movable/screen/hands = null var/shown_robot_modules = 0 //Used to determine whether they have the module menu shown or not - var/obj/screen/robot_modules_background + var/atom/movable/screen/robot_modules_background //3 Modules can be activated at any one time. var/obj/item/robot_module/module = null @@ -61,7 +61,9 @@ var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list()) - var/speed = 0 // VTEC speed boost. + var/vtec = 0 // VTEC speed boost. + /// vtec shorted out + var/vtec_disabled = FALSE var/magpulse = FALSE // Magboot-like effect. var/ionpulse = FALSE // Jetpack-like effect. var/ionpulse_on = FALSE // Jetpack-like effect. @@ -88,14 +90,14 @@ ///Lamp brightness. Starts at 3, but can be 1 - 5. var/lamp_intensity = 3 ///Lamp button reference - var/obj/screen/robot/lamp/lampButton + var/atom/movable/screen/robot/lamp/lampButton var/sight_mode = 0 hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD, DIAG_TRACK_HUD) ///The reference to the built-in tablet that borgs carry. var/obj/item/modular_computer/tablet/integrated/modularInterface - var/obj/screen/robot/modPC/interfaceButton + var/atom/movable/screen/robot/modPC/interfaceButton var/list/upgrades = list() diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index d0c53508fa..7ecc714b56 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -328,7 +328,7 @@ /obj/item/crowbar/cyborg, /obj/item/healthanalyzer, /obj/item/reagent_containers/borghypo, - /obj/item/weapon/gripper/medical, + /obj/item/gripper/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/surgical_drapes, @@ -448,7 +448,7 @@ /obj/item/analyzer, /obj/item/storage/part_replacer/cyborg, /obj/item/holosign_creator/combifan, - /obj/item/weapon/gripper, + /obj/item/gripper, /obj/item/lightreplacer/cyborg, /obj/item/geiger_counter/cyborg, /obj/item/assembly/signaler/cyborg, @@ -923,7 +923,7 @@ /obj/item/gun/energy/kinetic_accelerator/cyborg, /obj/item/gun/energy/plasmacutter/cyborg, /obj/item/gps/cyborg, - /obj/item/weapon/gripper/mining, + /obj/item/gripper/mining, /obj/item/cyborg_clamp, /obj/item/stack/marker_beacon, /obj/item/destTagger, @@ -1075,7 +1075,7 @@ /obj/item/multitool/cyborg, /obj/item/storage/part_replacer/cyborg, /obj/item/holosign_creator/atmos, - /obj/item/weapon/gripper, + /obj/item/gripper, /obj/item/lightreplacer/cyborg, /obj/item/stack/sheet/metal/cyborg, /obj/item/stack/sheet/glass/cyborg, diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm index e3a640bca0..23500688ae 100644 --- a/code/modules/mob/living/silicon/robot/robot_movement.dm +++ b/code/modules/mob/living/silicon/robot/robot_movement.dm @@ -23,4 +23,4 @@ . = ..() if(!resting && !(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)) . += 1 - . += speed + . += vtec_disabled? 0 : vtec diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index 3377bf9601..6c9d508fd8 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -79,6 +79,8 @@ M.visible_message("[M] pets [src].", \ "You pet [src].", target = src, target_message = "[M] pets you.") + if(INTENT_DISARM) + disarm_shove(M) if(INTENT_GRAB) grabbedby(M) else @@ -88,6 +90,9 @@ "[M] punches you, but doesn't leave a dent.", null, COMBAT_MESSAGE_RANGE, null, M, "You punch [src], but don't leave a dent.") +/mob/living/silicon/proc/disarm_shove(mob/living/carbon/human/H) + visible_message(span_danger("[H] shoves [src], but doesn't manage to make much of an effect.")) + /mob/living/silicon/attack_drone(mob/living/simple_animal/drone/M) if(M.a_intent == INTENT_HARM) return @@ -139,6 +144,6 @@ P.on_hit(src, 0, def_zone) return BULLET_ACT_HIT -/mob/living/silicon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash/static) +/mob/living/silicon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/flash/static) if(affect_silicon) return ..() diff --git a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm index a5d36b5ba9..99048b4e9f 100644 --- a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm +++ b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm @@ -33,7 +33,7 @@ /mob/living/simple_animal/bot/secbot/grievous/Initialize() . = ..() weapon = new baton_type(src) - weapon.attack_self(src) + INVOKE_ASYNC(weapon, /obj/item.proc/attack_self, src) /mob/living/simple_animal/bot/secbot/grievous/Destroy() QDEL_NULL(weapon) diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index e3486a40e2..fb3d009a72 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -381,6 +381,7 @@ ..() /mob/living/simple_animal/pet/dog/corgi/Ian/proc/Read_Memory() + set waitfor = FALSE if(fexists("data/npc_saves/Ian.sav")) //legacy compatability to convert old format to new var/savefile/S = new /savefile("data/npc_saves/Ian.sav") S["age"] >> age diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 8348af43fa..66b4bd5e73 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -98,6 +98,18 @@ qdel(bigcheese) evolve() return + for(var/obj/item/trash/garbage in range(1, src)) + if(is_station_level(z)) + if(prob(2)) + qdel(garbage) + evolve_plague() + return + for(var/obj/effect/decal/cleanable/blood/gibs/leftovers in range(1, src)) + if(is_station_level(z)) + if(prob(2)) + qdel(leftovers) + evolve_plague() + return /** *Checks the mouse cap, if it's above the cap, doesn't spawn a mouse. If below, spawns a mouse and adds it to cheeserats. @@ -123,6 +135,17 @@ mind.transfer_to(regalrat) qdel(src) +/mob/living/simple_animal/mouse/proc/evolve_plague() + return + +/* + var/mob/living/simple_animal/hostile/plaguerat = new /mob/living/simple_animal/hostile/plaguerat(loc) + visible_message("[src] devours the food! He rots into something worse!") + if(mind) + mind.transfer_to(plaguerat) + qdel(src) +*/ + /* * Mouse types */ @@ -169,3 +192,17 @@ GLOBAL_VAR(tom_existed) /obj/item/reagent_containers/food/snacks/deadmouse/on_grind() reagents.clear_reagents() +/mob/living/simple_animal/mouse/proc/miasma(datum/gas_mixture/environment, check_temp = FALSE) + if(isturf(src.loc) && isopenturf(src.loc)) + var/turf/open/ST = src.loc + var/miasma_moles = ST.air.get_moles(GAS_MIASMA) + if(prob(5) && miasma_moles >= 5) + evolve_plague() + else if(miasma_moles >= 20) + evolve_plague() + return + +/mob/living/simple_animal/mouse/handle_environment(datum/gas_mixture/environment) + . = ..() + if(is_station_level(z)) + miasma() diff --git a/code/modules/mob/living/simple_animal/gremlin/gremlin.dm b/code/modules/mob/living/simple_animal/gremlin/gremlin.dm new file mode 100644 index 0000000000..61436cea1c --- /dev/null +++ b/code/modules/mob/living/simple_animal/gremlin/gremlin.dm @@ -0,0 +1,254 @@ +#define GREMLIN_VENT_CHANCE 1.75 + +//Gremlins +//Small monsters that don't attack humans or other animals. Instead they mess with electronics, computers and machinery + +//List of objects that gremlins can't tamper with (because nobody coded an interaction for it) +//List starts out empty. Whenever a gremlin finds a machine that it couldn't tamper with, the machine's type is added here, and all machines of such type are ignored from then on (NOT SUBTYPES) +GLOBAL_LIST(bad_gremlin_items) + +/mob/living/simple_animal/hostile/gremlin + name = "gremlin" + desc = "This tiny creature finds great joy in discovering and using technology. Nothing excites it more than pushing random buttons on a computer to see what it might do." + icon = 'icons/mob/mob.dmi' + icon_state = "gremlin" + icon_living = "gremlin" + icon_dead = "gremlin_dead" + + var/in_vent = FALSE + + health = 20 + maxHealth = 20 + search_objects = 3 //Completely ignore mobs + + //Tampering is handled by the 'npc_tamper()' obj proc + wanted_objects = list( + /obj/machinery, + /obj/item/reagent_containers/food, + /obj/structure/sink + ) + + var/obj/machinery/atmospherics/components/unary/vent_pump/entry_vent + var/obj/machinery/atmospherics/components/unary/vent_pump/exit_vent + + dextrous = TRUE + possible_a_intents = list(INTENT_HELP, INTENT_GRAB, INTENT_DISARM, INTENT_HARM) + faction = list("meme", "gremlin") + speed = 0.5 + gold_core_spawnable = 2 + unique_name = TRUE + + //Ensure gremlins don't attack other mobs + melee_damage_upper = 0 + melee_damage_lower = 0 + attack_sound = null + obj_damage = 0 + environment_smash = ENVIRONMENT_SMASH_NONE + + //List of objects that we don't even want to try to tamper with + //Subtypes of these are calculated too + var/list/unwanted_objects = list(/obj/machinery/atmospherics/pipe, /turf, /obj/structure) //ensure gremlins dont try to fuck with walls / normal pipes / glass / etc + + var/min_next_vent = 0 + + //Amount of ticks spent pathing to the target. If it gets above a certain amount, assume that the target is unreachable and stop + var/time_chasing_target = 0 + + //If you're going to make gremlins slower, increase this value - otherwise gremlins will abandon their targets too early + var/max_time_chasing_target = 2 + + var/next_eat = 0 + + //Last 20 heard messages are remembered by gremlins, and will be used to generate messages for comms console tampering, etc... + var/list/hear_memory = list() + var/const/max_hear_memory = 20 + +/mob/living/simple_animal/hostile/gremlin/Initialize() + . = ..() + AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) + access_card = new /obj/item/card/id(src) + var/datum/job/captain/C = new /datum/job/captain + access_card.access = C.get_access() + +/mob/living/simple_animal/hostile/gremlin/AttackingTarget() + var/is_hungry = world.time >= next_eat || prob(25) + if(istype(target, /obj/item/reagent_containers/food) && is_hungry) //eat food if we're hungry or bored + visible_message("[src] hungrily devours [target]!") + playsound(src, 'sound/items/eatfood.ogg', 50, 1) + qdel(target) + LoseTarget() + next_eat = world.time + rand(700, 3000) //anywhere from 70 seconds to 5 minutes until the gremlin is hungry again + return + if(istype(target, /obj)) + var/obj/M = target + tamper(M) + if(prob(50)) //50% chance to move to the next machine + LoseTarget() + +/mob/living/simple_animal/hostile/gremlin/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, message_mode) + . = ..() + if(message) + hear_memory.Insert(1, raw_message) + if(hear_memory.len > max_hear_memory) + hear_memory.Cut(hear_memory.len) + +/mob/living/simple_animal/hostile/gremlin/proc/generate_markov_input() + var/result = "" + + for(var/memory in hear_memory) + result += memory + " " + + return result + +/mob/living/simple_animal/hostile/gremlin/proc/generate_markov_chain() + return markov_chain(generate_markov_input(), rand(2,5), rand(100,700)) //The numbers are chosen arbitarily + +/mob/living/simple_animal/hostile/gremlin/proc/tamper(obj/M) + switch(M.npc_tamper_act(src)) + if(NPC_TAMPER_ACT_FORGET) + visible_message(pick( + "\The [src] plays around with \the [M], but finds it rather boring.", + "\The [src] tries to think of some more ways to screw \the [M] up, but fails miserably.", + "\The [src] decides to ignore \the [M], and starts looking for something more fun.")) + + LAZYADD(GLOB.bad_gremlin_items,M.type) + return FALSE + if(NPC_TAMPER_ACT_NOMSG) + //Don't create a visible message + return TRUE + + else + visible_message(pick( + "\The [src]'s eyes light up as \he tampers with \the [M].", + "\The [src] twists some knobs around on \the [M] and bursts into laughter!", + "\The [src] presses a few buttons on \the [M] and giggles mischievously.", + "\The [src] rubs its hands devilishly and starts messing with \the [M].", + "\The [src] turns a small valve on \the [M].")) + + //Add a clue for detectives to find. The clue is only added if no such clue already existed on that machine + return TRUE + +/mob/living/simple_animal/hostile/gremlin/CanAttack(atom/new_target) + if(LAZYFIND(GLOB.bad_gremlin_items,new_target.type)) + return FALSE + if(is_type_in_list(new_target, unwanted_objects)) + return FALSE + if(istype(new_target, /obj/machinery)) + var/obj/machinery/M = new_target + if(M.stat) //Unpowered or broken + return FALSE + else if(istype(new_target, /obj/machinery/door/firedoor)) + var/obj/machinery/door/firedoor/F = new_target + //Only tamper with firelocks that are closed, opening them! + if(!F.density) + return FALSE + + return ..() + +/mob/living/simple_animal/hostile/gremlin/death(gibbed) + walk(src,0) + QDEL_NULL(access_card) + return ..() + +/mob/living/simple_animal/hostile/gremlin/Life() + . = ..() + if(!health || stat == DEAD) + return + //Don't try to path to one target for too long. If it takes longer than a certain amount of time, assume it can't be reached and find a new one + if(!client) //don't do this shit if there's a client, they're capable of ventcrawling manually + if(in_vent) + target = null + if(entry_vent && get_dist(src, entry_vent) <= 1) + var/list/vents = list() + var/datum/pipeline/entry_vent_parent = entry_vent.parents[1] + for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent in entry_vent_parent.other_atmosmch) + vents += temp_vent + if(!vents.len) + entry_vent = null + in_vent = FALSE + return + exit_vent = pick(vents) + visible_message("[src] crawls into the ventilation ducts!") + + loc = exit_vent + var/travel_time = round(get_dist(loc, exit_vent.loc) / 2) + addtimer(CALLBACK(src, .proc/exit_vents), travel_time) //come out at exit vent in 2 to 20 seconds + + + if(world.time > min_next_vent && !entry_vent && !in_vent && prob(GREMLIN_VENT_CHANCE)) //small chance to go into a vent + for(var/obj/machinery/atmospherics/components/unary/vent_pump/v in view(7,src)) + if(!v.welded) + entry_vent = v + in_vent = TRUE + walk_to(src, entry_vent) + break + if(!target) + time_chasing_target = 0 + else + if(++time_chasing_target > max_time_chasing_target) + LoseTarget() + time_chasing_target = 0 + . = ..() + +/mob/living/simple_animal/hostile/gremlin/EscapeConfinement() + if(istype(loc, /obj) && CanAttack(loc)) //If we're inside a machine, screw with it + var/obj/M = loc + tamper(M) + + return ..() + +/mob/living/simple_animal/hostile/gremlin/proc/exit_vents() + if(!exit_vent || exit_vent.welded) + loc = entry_vent + entry_vent = null + return + loc = exit_vent.loc + entry_vent = null + exit_vent = null + in_vent = FALSE + var/area/new_area = get_area(loc) + message_admins("[src] came out at [new_area][ADMIN_JMP(loc)]!") + if(new_area) + new_area.Entered(src) + visible_message("[src] climbs out of the ventilation ducts!") + min_next_vent = world.time + 900 //90 seconds between ventcrawls + +//This allows player-controlled gremlins to tamper with machinery +/mob/living/simple_animal/hostile/gremlin/UnarmedAttack(var/atom/A) + if(istype(A, /obj/machinery) || istype(A, /obj/structure)) + tamper(A) + if(istype(target, /obj/item/reagent_containers/food)) //eat food + visible_message("[src] hungrily devours [target]!", "You hungrily devour [target]!") + playsound(src, 'sound/items/eatfood.ogg', 50, 1) + qdel(target) + LoseTarget() + next_eat = world.time + rand(700, 3000) //anywhere from 70 seconds to 5 minutes until the gremlin is hungry again + + return ..() + +/mob/living/simple_animal/hostile/gremlin/IsAdvancedToolUser() + return 1 + +/mob/living/simple_animal/hostile/gremlin/proc/divide() + //Health is halved and then reduced by 2. A new gremlin is spawned with the same health as the parent + //Need to have at least 6 health for this, otherwise resulting health would be less than 1 + if(health < 7.5) + return + + visible_message("\The [src] splits into two!") + var/mob/living/simple_animal/hostile/gremlin/G = new /mob/living/simple_animal/hostile/gremlin(get_turf(src)) + + if(mind) + mind.transfer_to(G) + + health = round(health * 0.5) - 2 + maxHealth = health + resize *= 0.9 + + G.health = health + G.maxHealth = maxHealth + +/mob/living/simple_animal/hostile/gremlin/traitor + health = 85 + maxHealth = 85 + gold_core_spawnable = 0 diff --git a/code/modules/mob/living/simple_animal/gremlin/gremlin_act.dm b/code/modules/mob/living/simple_animal/gremlin/gremlin_act.dm new file mode 100644 index 0000000000..ff0eb13dc7 --- /dev/null +++ b/code/modules/mob/living/simple_animal/gremlin/gremlin_act.dm @@ -0,0 +1,214 @@ +/obj/proc/npc_tamper_act(mob/living/L) + return NPC_TAMPER_ACT_FORGET + +/obj/machinery/atmospherics/components/binary/passive_gate/npc_tamper_act(mob/living/L) + if(prob(50)) //Turn on/off + on = !on + investigate_log("was turned [on ? "on" : "off"] by [key_name(L)]", INVESTIGATE_ATMOS) + else //Change pressure + target_pressure = rand(0, MAX_OUTPUT_PRESSURE) + investigate_log("was set to [target_pressure] kPa by [key_name(L)]", INVESTIGATE_ATMOS) + update_icon() + +/obj/machinery/atmospherics/components/binary/pump/npc_tamper_act(mob/living/L) + if(prob(50)) //Turn on/off + on = !on + investigate_log("was turned [on ? "on" : "off"] by [key_name(L)]", INVESTIGATE_ATMOS) + else //Change pressure + target_pressure = rand(0, MAX_OUTPUT_PRESSURE) + investigate_log("was set to [target_pressure] kPa by [key_name(L)]", INVESTIGATE_ATMOS) + update_icon() + +/obj/machinery/atmospherics/components/binary/volume_pump/npc_tamper_act(mob/living/L) + if(prob(50)) //Turn on/off + on = !on + investigate_log("was turned [on ? "on" : "off"] by [key_name(L)]", INVESTIGATE_ATMOS) + else //Change pressure + transfer_rate = rand(0, MAX_TRANSFER_RATE) + investigate_log("was set to [transfer_rate] L/s by [key_name(L)]", INVESTIGATE_ATMOS) + update_icon() + +/obj/machinery/atmospherics/components/binary/valve/npc_tamper_act(mob/living/L) + attack_hand(L) + +/obj/machinery/space_heater/npc_tamper_act(mob/living/L) + var/list/choose_modes = list("standby", "heat", "cool") + if(prob(50)) + choose_modes -= mode + mode = pick(choose_modes) + else + on = !on + update_icon() + +/obj/machinery/shield_gen/npc_tamper_act(mob/living/L) + attack_hand(L) + +/obj/machinery/firealarm/npc_tamper_act(mob/living/L) + alarm() + +/obj/machinery/airalarm/npc_tamper_act(mob/living/L) + if(panel_open) + wires.npc_tamper(L) + else + panel_open = !panel_open + +/obj/machinery/ignition_switch/npc_tamper_act(mob/living/L) + attack_hand(L) + +/obj/machinery/flasher_button/npc_tamper_act(mob/living/L) + attack_hand(L) + +/obj/machinery/crema_switch/npc_tamper_act(mob/living/L) + attack_hand(L) + +/obj/machinery/camera/npc_tamper_act(mob/living/L) + if(!panel_open) + panel_open = !panel_open + if(wires) + wires.npc_tamper(L) + +/obj/machinery/atmospherics/components/unary/cryo_cell/npc_tamper_act(mob/living/L) + if(prob(50)) + if(beaker) + beaker.forceMove(loc) + beaker = null + else + if(occupant) + if(state_open) + if (close_machine() == usr) + on = TRUE + else + open_machine() + +/obj/machinery/door_control/npc_tamper_act(mob/living/L) + attack_hand(L) + +/obj/machinery/door/airlock/npc_tamper_act(mob/living/L) + //Open the firelocks as well, otherwise they block the way for our gremlin which isn't fun + for(var/obj/machinery/door/firedoor/F in get_turf(src)) + if(F.density) + F.npc_tamper_act(L) + + if(prob(40)) //40% - mess with wires + if(!panel_open) + panel_open = !panel_open + if(wires) + wires.npc_tamper(L) + else //60% - just open it + open() + +/obj/machinery/gibber/npc_tamper_act(mob/living/L) + attack_hand(L) + +/obj/machinery/light_switch/npc_tamper_act(mob/living/L) + attack_hand(L) + +/obj/machinery/turretid/npc_tamper_act(mob/living/L) + enabled = rand(0, 1) + lethal = rand(0, 1) + updateTurrets() + +/obj/machinery/vending/npc_tamper_act(mob/living/L) + if(!panel_open) + panel_open = !panel_open + if(wires) + wires.npc_tamper(L) + +/obj/machinery/shower/npc_tamper_act(mob/living/L) + attack_hand(L) + + +/obj/machinery/deepfryer/npc_tamper_act(mob/living/L) + //Deepfry a random nearby item + var/list/pickable_items = list() + + for(var/obj/item/I in range(1, L)) + pickable_items.Add(I) + + if(!pickable_items.len) + return + + var/obj/item/I = pick(pickable_items) + + attackby(I, L) //shove the item in, even if it can't be deepfried normally + +/obj/machinery/power/apc/npc_tamper_act(mob/living/L) + if(!panel_open) + panel_open = !panel_open + if(wires) + wires.npc_tamper(L) + +/obj/machinery/power/rad_collector/npc_tamper_act(mob/living/L) + attack_hand(L) + +/obj/machinery/power/emitter/npc_tamper_act(mob/living/L) + attack_hand(L) + +/obj/machinery/particle_accelerator/control_box/npc_tamper_act(mob/living/L) + if(!panel_open) + panel_open = !panel_open + if(wires) + wires.npc_tamper(L) + +/obj/machinery/computer/communications/npc_tamper_act(mob/living/user) + if(!authenticated) + if(prob(20)) //20% chance to log in + authenticated = TRUE + + else //Already logged in + if(prob(50)) //50% chance to log off + authenticated = FALSE + else if(istype(user, /mob/living/simple_animal/hostile/gremlin)) //make a hilarious public message + var/mob/living/simple_animal/hostile/gremlin/G = user + var/result = G.generate_markov_chain() + + if(result) + if(prob(85)) + SScommunications.make_announcement(G, FALSE, result) + var/turf/T = get_turf(G) + log_say("[key_name(usr)] ([ADMIN_JMP(T)]) has made a captain announcement: [result]") + message_admins("[key_name_admin(G)] has made a captain announcement.", 1) + else + if(SSshuttle.emergency.mode == SHUTTLE_IDLE) + SSshuttle.requestEvac(G, result) + else if(SSshuttle.emergency.mode == SHUTTLE_ESCAPE) + SSshuttle.cancelEvac(G) + +/obj/machinery/button/door/npc_tamper_act(mob/living/L) + attack_hand(L) + +/obj/machinery/sleeper/npc_tamper_act(mob/living/L) + if(prob(75)) + inject_chem(pick(available_chems)) + else + if(state_open) + close_machine() + else + open_machine() + +/obj/machinery/power/smes/npc_tamper_act(mob/living/L) + if(prob(50)) //mess with input + input_level = rand(0, input_level_max) + else //mess with output + output_level = rand(0, output_level_max) + +/obj/machinery/syndicatebomb/npc_tamper_act(mob/living/L) //suicide bomber gremlins + if(!open_panel) + open_panel = !open_panel + if(wires) + wires.npc_tamper(L) + +/obj/machinery/computer/bank_machine/npc_tamper_act(mob/living/L) + siphoning = !siphoning + +/obj/machinery/computer/slot_machine/npc_tamper_act(mob/living/L) + spin(L) + +/obj/structure/sink/npc_tamper_act(mob/living/L) + if(istype(L, /mob/living/simple_animal/hostile/gremlin)) + visible_message("\The [L] climbs into \the [src] and turns the faucet on!") + + var/mob/living/simple_animal/hostile/gremlin/G = L + G.divide() + + return NPC_TAMPER_ACT_NOMSG diff --git a/code/modules/mob/living/simple_animal/gremlin/gremlin_event.dm b/code/modules/mob/living/simple_animal/gremlin/gremlin_event.dm new file mode 100644 index 0000000000..6f5f0e3dba --- /dev/null +++ b/code/modules/mob/living/simple_animal/gremlin/gremlin_event.dm @@ -0,0 +1,44 @@ +/datum/round_event_control/gremlin + name = "Spawn Gremlins" + typepath = /datum/round_event/gremlin + weight = 15 + max_occurrences = 2 + earliest_start = 20 MINUTES + min_players = 5 + + + +/datum/round_event/gremlin + var/static/list/acceptable_spawns = list("xeno_spawn", "generic event spawn", "blobstart", "Assistant") + +/datum/round_event/gremlin/announce() + priority_announce("Bioscans indicate that some gremlins entered through the vents. Deal with them!", "Gremlin Alert", 'sound/announcer/classic/attention.ogg') + +/datum/round_event/gremlin/start() + + var/list/spawn_locs = list() + + for(var/obj/effect/landmark/L in GLOB.landmarks_list) + if(isturf(L.loc) && !isspaceturf(L.loc)) + if(L.name in acceptable_spawns) + spawn_locs += L.loc + if(!spawn_locs.len) //If we can't find any gremlin spawns, try the xeno spawns + for(var/obj/effect/landmark/L in GLOB.landmarks_list) + if(isturf(L.loc)) + switch(L.name) + if("Assistant") + spawn_locs += L.loc + if(!spawn_locs.len) //If we can't find THAT, then just give up and cry + return MAP_ERROR + + var/gremlins_to_spawn = rand(2,5) + var/list/gremlin_areas = list() + for(var/i = 0, i <= gremlins_to_spawn, i++) + var/spawnat = pick(spawn_locs) + spawn_locs -= spawnat + gremlin_areas += get_area(spawnat) + new /mob/living/simple_animal/hostile/gremlin(spawnat) + var/grems = gremlin_areas.Join(", ") + message_admins("Gremlins have been spawned at the areas: [grems]") + log_game("Gremlins have been spawned at the areas: [grems]") + return SUCCESSFUL_SPAWN diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 7c7ff3779c..ec11a3e83e 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -55,11 +55,12 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians var/cooldown = 0 var/mob/living/carbon/summoner var/range = 13 //how far from the user the spirit can be - var/toggle_button_type = /obj/screen/guardian/ToggleMode/Inactive //what sort of toggle button the hud uses + var/toggle_button_type = /atom/movable/screen/guardian/ToggleMode/Inactive //what sort of toggle button the hud uses var/playstyle_string = "You are a standard Guardian. You shouldn't exist!" var/magic_fluff_string = "You draw the Coder, symbolizing bugs and errors. This shouldn't happen! Submit a bug report!" var/tech_fluff_string = "BOOT SEQUENCE COMPLETE. ERROR MODULE LOADED. THIS SHOULDN'T HAPPEN. Submit a bug report!" var/carp_fluff_string = "CARP CARP CARP SOME SORT OF HORRIFIC BUG BLAME THE CODERS CARP CARP CARP" + var/customized /// sigh, fine. var/datum/song/holoparasite/music_datum @@ -142,11 +143,13 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians to_chat(src, "You are capable of manifesting or recalling to your master with the buttons on your HUD. You will also find a button to communicate with [summoner.p_them()] privately there.") to_chat(src, "While personally invincible, you will die if [summoner.real_name] does, and any damage dealt to you will have a portion passed on to [summoner.p_them()] as you feed upon [summoner.p_them()] to sustain yourself.") to_chat(src, playstyle_string) - guardiancustomize() + if(!customized) + guardiancustomize() /mob/living/simple_animal/hostile/guardian/proc/guardiancustomize() guardianrecolor() guardianrename() + customized = TRUE /mob/living/simple_animal/hostile/guardian/proc/guardianrecolor() guardiancolor = input(src,"What would you like your color to be?","Choose Your Color","#ffffff") as color|null diff --git a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm index b5bb91d34f..7083f891b8 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm @@ -11,11 +11,11 @@ tech_fluff_string = "Boot sequence complete. Assassin modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! Caught one! It's an assassin carp! Just when you thought it was safe to go back to the water... which is unhelpful, because we're in space." - toggle_button_type = /obj/screen/guardian/ToggleMode/Assassin + toggle_button_type = /atom/movable/screen/guardian/ToggleMode/Assassin var/toggle = FALSE var/stealthcooldown = 100 - var/obj/screen/alert/canstealthalert - var/obj/screen/alert/instealthalert + var/atom/movable/screen/alert/canstealthalert + var/atom/movable/screen/alert/instealthalert /mob/living/simple_animal/hostile/guardian/assassin/Initialize() . = ..() @@ -86,12 +86,12 @@ if(stealthcooldown <= world.time) if(toggle) if(!instealthalert) - instealthalert = throw_alert("instealth", /obj/screen/alert/instealth) + instealthalert = throw_alert("instealth", /atom/movable/screen/alert/instealth) clear_alert("canstealth") canstealthalert = null else if(!canstealthalert) - canstealthalert = throw_alert("canstealth", /obj/screen/alert/canstealth) + canstealthalert = throw_alert("canstealth", /atom/movable/screen/alert/canstealth) clear_alert("instealth") instealthalert = null else diff --git a/code/modules/mob/living/simple_animal/guardian/types/charger.dm b/code/modules/mob/living/simple_animal/guardian/types/charger.dm index 9060350df4..ee5a648067 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/charger.dm @@ -12,14 +12,14 @@ tech_fluff_string = "Boot sequence complete. Charge modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! Caught one! It's a charger carp, that likes running at people. But it doesn't have any legs..." var/charging = 0 - var/obj/screen/alert/chargealert + var/atom/movable/screen/alert/chargealert /mob/living/simple_animal/hostile/guardian/charger/BiologicalLife(seconds, times_fired) if(!(. = ..())) return if(ranged_cooldown <= world.time) if(!chargealert) - chargealert = throw_alert("charge", /obj/screen/alert/cancharge) + chargealert = throw_alert("charge", /atom/movable/screen/alert/cancharge) else clear_alert("charge") chargealert = null diff --git a/code/modules/mob/living/simple_animal/guardian/types/protector.dm b/code/modules/mob/living/simple_animal/guardian/types/protector.dm index 99272a6d3f..b3d9f01ebb 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/protector.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/protector.dm @@ -8,7 +8,7 @@ magic_fluff_string = "..And draw the Guardian, a stalwart protector that never leaves the side of its charge." tech_fluff_string = "Boot sequence complete. Protector modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! You caught one! Wait, no... it caught you! The fisher has become the fishy." - toggle_button_type = /obj/screen/guardian/ToggleMode + toggle_button_type = /atom/movable/screen/guardian/ToggleMode var/toggle = FALSE /mob/living/simple_animal/hostile/guardian/protector/ex_act(severity) diff --git a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm index e2bcdd5684..5df446085a 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm @@ -23,7 +23,7 @@ carp_fluff_string = "CARP CARP CARP! Caught one, it's a ranged carp. This fishy can watch people pee in the ocean." see_invisible = SEE_INVISIBLE_LIVING see_in_dark = 8 - toggle_button_type = /obj/screen/guardian/ToggleMode + toggle_button_type = /atom/movable/screen/guardian/ToggleMode var/list/snares = list() var/toggle = FALSE diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm index b51552acd2..fc2912ec2f 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -10,7 +10,7 @@ magic_fluff_string = "..And draw the CMO, a potent force of life... and death." carp_fluff_string = "CARP CARP CARP! You caught a support carp. It's a kleptocarp!" tech_fluff_string = "Boot sequence complete. Support modules active. Holoparasite swarm online." - toggle_button_type = /obj/screen/guardian/ToggleMode + toggle_button_type = /atom/movable/screen/guardian/ToggleMode var/obj/structure/receiving_pad/beacon var/beacon_cooldown = 0 var/toggle = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm b/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm index 6950c6409f..78697cb4fe 100644 --- a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm +++ b/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm @@ -94,7 +94,7 @@ L.SetUnconscious(0, FALSE) L.adjustOxyLoss(-50)// do CPR first if(L.blood_volume <= 500) //bandage them up and give em some blood if they're bleeding - L.blood_volume += 30 + L.adjust_integration_blood(30) L.bleedsuppress = 0 if(L.getBruteLoss() >= 50)// first, did we beat them into crit? if so, heal that var/healing = min(L.getBruteLoss(), 120) 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 7565a686bf..0f25688b6a 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm @@ -69,7 +69,7 @@ status_type = STATUS_EFFECT_MULTIPLE alert_type = null tick_interval = 1 - var/obj/screen/seedling/seedling_screen_object + var/atom/movable/screen/seedling/seedling_screen_object var/atom/target @@ -81,7 +81,7 @@ /datum/status_effect/seedling_beam_indicator/on_apply() if(owner.client) - seedling_screen_object = new /obj/screen/seedling() + seedling_screen_object = new /atom/movable/screen/seedling() owner.client.screen += seedling_screen_object tick() return ..() @@ -98,7 +98,7 @@ final.Turn(target_angle) seedling_screen_object.transform = final -/obj/screen/seedling +/atom/movable/screen/seedling icon = 'icons/mob/jungle/arachnid.dmi' icon_state = "seedling_beam_indicator" screen_loc = "CENTER:-16,CENTER:-16" 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 5751512b19..7ca2f6c561 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -528,21 +528,7 @@ Difficulty: Very Hard /obj/machinery/anomalous_crystal/emitter/ActivationReaction(mob/user, method) if(..()) var/obj/item/projectile/P = new generated_projectile(get_turf(src)) - P.setDir(dir) - switch(dir) - if(NORTH) - P.yo = 20 - P.xo = 0 - if(EAST) - P.yo = 0 - P.xo = 20 - if(WEST) - P.yo = 0 - P.xo = -20 - else - P.yo = -20 - P.xo = 0 - P.fire() + P.fire(angle2dir(dir)) /obj/machinery/anomalous_crystal/dark_reprise //Revives anyone nearby, but turns them into shadowpeople and renders them uncloneable, so the crystal is your only hope of getting up again if you go down. observer_desc = "When activated, this crystal revives anyone nearby, but turns them into Shadowpeople and makes them unclonable, making the crystal their only hope of getting up again." diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm index 64e1399e19..1aa0957fee 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm @@ -339,11 +339,11 @@ Difficulty: Extremely Hard id = "ice_block_talisman" duration = 25 status_type = STATUS_EFFECT_REFRESH - alert_type = /obj/screen/alert/status_effect/ice_block_talisman + alert_type = /atom/movable/screen/alert/status_effect/ice_block_talisman /// Stored icon overlay for the hit mob, removed when effect is removed var/icon/cube -/obj/screen/alert/status_effect/ice_block_talisman +/atom/movable/screen/alert/status_effect/ice_block_talisman name = "Frozen Solid" desc = "You're frozen inside an ice cube, and cannot move!" icon_state = "frozen" 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 e347056924..d677f59440 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 @@ -113,7 +113,7 @@ While using this makes the system rely on OnFire, it still gives options for tim severity = 7 hud_used.healths.icon_state = "elite_health[severity]" if(severity > 0) - overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + overlay_fullscreen("brute", /atom/movable/screen/fullscreen/brute, severity) else clear_fullscreen("brute") diff --git a/code/modules/mob/living/simple_animal/hostile/plaguerat.dm b/code/modules/mob/living/simple_animal/hostile/plaguerat.dm new file mode 100644 index 0000000000..2b92894317 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/plaguerat.dm @@ -0,0 +1,188 @@ +#define RAT_VENT_CHANCE 1.75 +GLOBAL_LIST_EMPTY(plague_rats) + +/mob/living/simple_animal/hostile/plaguerat + name = "plague rat" + desc = "A large decaying rat. It spreads its filth and emits a putrid odor to create more of its kind." + icon_state = "plaguerat" + icon_living = "plaguerat" + icon_dead = "plaguerat_dead" + speak = list("Skree!","SKREEE!","Squeak?") + speak_emote = list("squeaks") + emote_hear = list("Hisses.") + emote_see = list("runs in a circle.", "stands on its hind legs.") + gender = NEUTER + speak_chance = 1 + turns_per_move = 5 + maxHealth = 100 + health = 100 + see_in_dark = 6 + obj_damage = 10 + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 1) + response_help_continuous = "glares at" + response_help_simple = "glare at" + response_disarm_continuous = "skoffs at" + response_disarm_simple = "skoff at" + response_harm_continuous = "slashes" + response_harm_simple = "slash" + melee_damage_lower = 6 + melee_damage_upper = 8 + attack_verb_continuous = "slashes" + attack_verb_simple = "slash" + attack_sound = 'sound/weapons/punch1.ogg' + faction = list("rat") + density = FALSE + pass_flags = PASSTABLE | PASSGRILLE | PASSMOB + mob_size = MOB_SIZE_TINY + mob_biotypes = MOB_ORGANIC|MOB_BEAST + var/datum/action/cooldown/scavenge + var/last_spawn_time = 0 + var/in_vent = FALSE + var/min_next_vent = 0 + var/obj/machinery/atmospherics/components/unary/entry_vent + var/obj/machinery/atmospherics/components/unary/exit_vent + +/mob/living/simple_animal/hostile/plaguerat/Initialize() + . = ..() + GLOB.plague_rats += src + AddComponent(/datum/component/swarming) + AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) + scavenge = new /datum/action/cooldown/scavenge + scavenge.Grant(src) + +/mob/living/simple_animal/hostile/plaguerat/Destroy() + GLOB.plague_rats -= src + return ..() + +/mob/living/simple_animal/hostile/plaguerat/Life(seconds, times_fired) + . = ..() + //Don't try to path to one target for too long. If it takes longer than a certain amount of time, assume it can't be reached and find a new one + //Literally only here to prevent farming and that's it. + if(!client) //don't do this shit if there's a client, they're capable of ventcrawling manually + if(in_vent) + target = null + if(entry_vent && get_dist(src, entry_vent) <= 1) + var/list/vents = list() + var/datum/pipeline/entry_vent_parent = entry_vent.parents[1] + for(var/obj/machinery/atmospherics/components/unary/temp_vent in entry_vent_parent.other_atmosmch) + vents += temp_vent + if(!vents.len) + entry_vent = null + in_vent = FALSE + return + exit_vent = pick(vents) + visible_message("[src] crawls into the ventilation ducts!") + + loc = exit_vent + var/travel_time = round(get_dist(loc, exit_vent.loc) / 2) + addtimer(CALLBACK(src, .proc/exit_vents), travel_time) //come out at exit vent in 2 to 20 seconds + + + if(world.time > min_next_vent && !entry_vent && !in_vent && prob(RAT_VENT_CHANCE)) //small chance to go into a vent + for(var/obj/machinery/atmospherics/components/unary/v in view(7,src)) + if(!v.welded) + entry_vent = v + in_vent = TRUE + walk_to(src, entry_vent) + break + +/mob/living/simple_animal/hostile/plaguerat/BiologicalLife(seconds, times_fired) + if(!(. = ..())) + return + if(isopenturf(loc)) + var/turf/open/T = src.loc + var/datum/gas_mixture/stank = new + var/miasma_moles = T.air.get_moles(GAS_MIASMA) + stank.set_moles(GAS_MIASMA,5) + stank.set_temperature(BODYTEMP_NORMAL) + if(T.air) + if(miasma_moles < 200) + T.assume_air(stank) + T.air_update_turf() + + if(prob(40)) + scavenge.Trigger() + if(prob(50)) + var/turf/open/floor/F = get_turf(src) + if(istype(F) && !F.intact) + var/obj/structure/cable/C = locate() in F + if(C && C.avail()) + visible_message("[src] chews through the [C]. It looks unharmed!") + playsound(src, 'sound/effects/sparks2.ogg', 100, TRUE) + C.deconstruct() + for(var/obj/O in range(1,src)) + if((world.time - last_spawn_time) > 10 SECONDS && istype(O, /obj/item/trash) || istype(O, /obj/effect/decal/cleanable/blood/gibs)) + qdel(O) + be_fruitful() + last_spawn_time = world.time + +/mob/living/simple_animal/hostile/plaguerat/CanAttack(atom/the_target) + if(istype(the_target,/mob/living/simple_animal)) + var/mob/living/A = the_target + if(istype(the_target, /mob/living/simple_animal/hostile/plaguerat) && A.stat == CONSCIOUS) + var/mob/living/simple_animal/hostile/plaguerat/R = the_target + if(R.faction_check_mob(src, TRUE)) + return FALSE + else + return TRUE + return ..() + +/** + *Checks the mouse cap, if it's above the cap, doesn't spawn a mouse. If below, spawns a mouse and adds it to cheeserats. + */ + +/mob/living/simple_animal/hostile/plaguerat/proc/be_fruitful() + var/cap = 10 + if(LAZYLEN(GLOB.plague_rats) >= cap) + visible_message("[src] gnaws into its food, [cap] rats are now on the station!") + return + var/mob/living/newmouse = new /mob/living/simple_animal/hostile/plaguerat(loc) + visible_message("[src] gnaws into its food, attracting another rat!") + +/mob/living/simple_animal/hostile/plaguerat/proc/exit_vents() + if(!exit_vent || exit_vent.welded) + loc = entry_vent + entry_vent = null + return + loc = exit_vent.loc + entry_vent = null + exit_vent = null + in_vent = FALSE + var/area/new_area = get_area(loc) + message_admins("[src] came out at [new_area][ADMIN_JMP(loc)]!") + if(new_area) + new_area.Entered(src) + visible_message("[src] climbs out of the ventilation ducts!") + min_next_vent = world.time + 900 //90 seconds between ventcrawls + +/** + *Creates a chance to spawn more trash or gibs to repopulate. Otherwise, spawns a corpse or dirt. + */ + +/datum/action/cooldown/scavenge + name = "Scavenge" + desc = "Spread the plague, scavenge for trash and fresh meat to reproduce." + icon_icon = 'icons/mob/actions/actions_animal.dmi' + background_icon_state = "bg_clock" + button_icon_state = "coffer" + cooldown_time = 50 + +/datum/action/cooldown/scavenge/Trigger() + . = ..() + if(!.) + return + var/turf/T = get_turf(owner) + var/loot = rand(1,100) + switch(loot) + if(1 to 3) + var/pickedtrash = pick(GLOB.ratking_trash) + to_chat(owner, "Excellent, you find more trash to spread your filth!") + new pickedtrash(T) + if(4 to 6) + to_chat(owner, "You find blood and gibs to feed your young!") + new /obj/effect/decal/cleanable/blood/gibs(T) + if(!locate(/obj/effect/decal/cleanable/blood) in T) + new /obj/effect/decal/cleanable/blood/(T) + if(7 to 100) + to_chat(owner, "Drat. Nothing.") + StartCooldown() diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm index 77731f0ea4..950da865f6 100644 --- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm +++ b/code/modules/mob/living/simple_animal/hostile/regalrat.dm @@ -35,14 +35,16 @@ coffer.Grant(src) riot = new /datum/action/cooldown/riot riot.Grant(src) + AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) + INVOKE_ASYNC(src, .proc/poll_for_player) + +/mob/living/simple_animal/hostile/regalrat/proc/poll_for_player() var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the Royal Rat, cheesey be his crown?", ROLE_SENTIENCE, null, FALSE, 100, POLL_IGNORE_SENTIENCE_POTION) if(LAZYLEN(candidates) && !mind) var/mob/dead/observer/C = pick(candidates) key = C.key notify_ghosts("All rise for the rat king, ascendant to the throne in \the [get_area(src)].", source = src, action = NOTIFY_ORBIT, flashwindow = FALSE) - AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) - /mob/living/simple_animal/hostile/regalrat/handle_automated_action() if(prob(20)) riot.Trigger() 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 5750d1ecb9..e2f83677d8 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -45,10 +45,10 @@ /mob/living/simple_animal/hostile/retaliate/clown/handle_temperature_damage() if(bodytemperature < minbodytemp) adjustBruteLoss(10) - throw_alert("temp", /obj/screen/alert/cold, 2) + throw_alert("temp", /atom/movable/screen/alert/cold, 2) else if(bodytemperature > maxbodytemp) adjustBruteLoss(15) - throw_alert("temp", /obj/screen/alert/hot, 3) + throw_alert("temp", /atom/movable/screen/alert/hot, 3) else clear_alert("temp") 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 5722cfda07..39e9e84ed2 100644 --- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm @@ -109,7 +109,7 @@ continue playsound(src, 'sound/effects/splat.ogg', 50, TRUE) visible_message("[src] vomits up [consumed_mob]!") - consumed_mob.forceMove(loc) + consumed_mob.forceMove(get_turf(src)) consumed_mob.Paralyze(50) if((rifts_charged == 3 || (SSshuttle.emergency.mode == SHUTTLE_DOCKED && rifts_charged > 0)) && !objective_complete) victory() @@ -123,6 +123,7 @@ to_chat(src, "You've failed to summon the rift in a timely manner! You're being pulled back from whence you came!") destroy_rifts() playsound(src, 'sound/magic/demon_dies.ogg', 100, TRUE) + empty_contents() QDEL_NULL(src) /mob/living/simple_animal/hostile/space_dragon/AttackingTarget() @@ -351,7 +352,7 @@ */ /mob/living/simple_animal/hostile/space_dragon/proc/empty_contents() for(var/atom/movable/AM in src) - AM.forceMove(loc) + AM.forceMove(get_turf(src)) if(prob(90)) step(AM, pick(GLOB.alldirs)) @@ -529,7 +530,7 @@ /obj/structure/carp_rift name = "carp rift" desc = "A rift akin to the ones space carp use to travel long distances." - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 100) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) max_integrity = 300 icon = 'icons/obj/carp_rift.dmi' icon_state = "carp_rift_carpspawn" @@ -636,7 +637,7 @@ icon_state = "carp_rift_charged" light_color = LIGHT_COLOR_YELLOW update_light() - armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100) + armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) resistance_flags = INDESTRUCTIBLE dragon.rifts_charged += 1 if(dragon.rifts_charged != 3 && !dragon.objective_complete) diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/zombie.dm index 1217084ce3..ecb5cd2290 100644 --- a/code/modules/mob/living/simple_animal/hostile/zombie.dm +++ b/code/modules/mob/living/simple_animal/hostile/zombie.dm @@ -30,6 +30,7 @@ setup_visuals() /mob/living/simple_animal/hostile/zombie/proc/setup_visuals() + set waitfor = FALSE var/datum/preferences/dummy_prefs = new dummy_prefs.pref_species = new /datum/species/zombie dummy_prefs.be_random_body = TRUE diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 58e0483f20..65c553b11d 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -554,7 +554,7 @@ var/oindex = active_hand_index active_hand_index = hand_index if(hud_used) - var/obj/screen/inventory/hand/H + var/atom/movable/screen/inventory/hand/H H = hud_used.hand_slots["[hand_index]"] if(H) H.update_icon() diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index f6169be902..68de074e07 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -129,7 +129,7 @@ coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]") regenerate_icons() -/mob/living/simple_animal/slime/proc/update_name() +/mob/living/simple_animal/slime/update_name() if(slime_name_regex.Find(name)) number = rand(1, 1000) name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 389f5ee5b5..02e88e3741 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -599,7 +599,7 @@ /mob/living/proc/become_nearsighted(source) if(!HAS_TRAIT(src, TRAIT_NEARSIGHT)) - overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1) + overlay_fullscreen("nearsighted", /atom/movable/screen/fullscreen/impaired, 1) ADD_TRAIT(src, TRAIT_NEARSIGHT, source) /mob/living/proc/cure_husk(source) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 9070c1e8fb..5ba4769f99 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -238,6 +238,7 @@ if(istype(W)) if(equip_to_slot_if_possible(W, slot, FALSE, FALSE, FALSE, FALSE, TRUE)) + W.apply_outline() return TRUE if(!W) @@ -884,7 +885,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) /mob/proc/sync_lighting_plane_alpha() if(hud_used) - var/obj/screen/plane_master/lighting/L = hud_used.plane_masters["[LIGHTING_PLANE]"] + var/atom/movable/screen/plane_master/lighting/L = hud_used.plane_masters["[LIGHTING_PLANE]"] if (L) L.alpha = lighting_alpha diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index ba2399b831..b77b9913ba 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -142,7 +142,7 @@ var/registered_z - var/list/alerts = list() // contains /obj/screen/alert only // On /mob so clientless mobs will throw alerts properly + var/list/alerts = list() // contains /atom/movable/screen/alert only // On /mob so clientless mobs will throw alerts properly var/list/screens = list() var/list/client_colours = list() var/hud_type = /datum/hud diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 4b0f505067..5bfc6fe652 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -362,7 +362,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp if(flashwindow) window_flash(O.client) if(source) - var/obj/screen/alert/notify_action/A = O.throw_alert("[REF(source)]_notify_action", /obj/screen/alert/notify_action) + var/atom/movable/screen/alert/notify_action/A = O.throw_alert("[REF(source)]_notify_action", /atom/movable/screen/alert/notify_action) if(A) if(O.client.prefs && O.client.prefs.UI_style) A.icon = ui_style2icon(O.client.prefs.UI_style) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index f7d8a810ce..bfd4cfcd29 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -267,7 +267,7 @@ //1: r-leg 2: groin 3: l-leg /client/proc/check_has_body_select() - return mob && mob.hud_used && mob.hud_used.zone_select && istype(mob.hud_used.zone_select, /obj/screen/zone_sel) + return mob && mob.hud_used && mob.hud_used.zone_select && istype(mob.hud_used.zone_select, /atom/movable/screen/zone_sel) /client/verb/body_toggle_head() set name = "body-toggle-head" @@ -285,7 +285,7 @@ else next_in_line = BODY_ZONE_HEAD - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + var/atom/movable/screen/zone_sel/selector = mob.hud_used.zone_select selector.set_selected_zone(next_in_line, mob) /client/verb/body_r_arm() @@ -295,7 +295,7 @@ if(!check_has_body_select()) return - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + var/atom/movable/screen/zone_sel/selector = mob.hud_used.zone_select selector.set_selected_zone(BODY_ZONE_R_ARM, mob) /client/verb/body_chest() @@ -305,7 +305,7 @@ if(!check_has_body_select()) return - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + var/atom/movable/screen/zone_sel/selector = mob.hud_used.zone_select selector.set_selected_zone(BODY_ZONE_CHEST, mob) /client/verb/body_l_arm() @@ -315,7 +315,7 @@ if(!check_has_body_select()) return - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + var/atom/movable/screen/zone_sel/selector = mob.hud_used.zone_select selector.set_selected_zone(BODY_ZONE_L_ARM, mob) /client/verb/body_r_leg() @@ -325,7 +325,7 @@ if(!check_has_body_select()) return - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + var/atom/movable/screen/zone_sel/selector = mob.hud_used.zone_select selector.set_selected_zone(BODY_ZONE_R_LEG, mob) /client/verb/body_groin() @@ -335,7 +335,7 @@ if(!check_has_body_select()) return - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + var/atom/movable/screen/zone_sel/selector = mob.hud_used.zone_select selector.set_selected_zone(BODY_ZONE_PRECISE_GROIN, mob) /client/verb/body_l_leg() @@ -345,7 +345,7 @@ if(!check_has_body_select()) return - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + var/atom/movable/screen/zone_sel/selector = mob.hud_used.zone_select selector.set_selected_zone(BODY_ZONE_L_LEG, mob) /client/verb/toggle_walk_run() @@ -364,7 +364,7 @@ return FALSE m_intent = MOVE_INTENT_RUN if(hud_used && hud_used.static_inventory) - for(var/obj/screen/mov_intent/selector in hud_used.static_inventory) + for(var/atom/movable/screen/mov_intent/selector in hud_used.static_inventory) selector.update_icon() /mob/verb/up() diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index 94bf45c1b0..88bb526188 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -144,33 +144,14 @@ message = "[user] [user.say_emphasis(message)]" var/list/show_to = list() - var/list/processing = list() - var/safety = 25 + var/list/processed = list() for(var/obj/structure/table/T in range(user, 1)) - processing |= T - for(var/i = 1; i <= processing.len; ++i) - var/obj/structure/table/T = processing[i] - if(safety-- <= 0) - to_chat(user, "Table scan aborted early, some people might have not received the message (max 25)") - break - if(get_dist(T, user) > 7) - continue // nah - processing |= T - for(var/mob/living/M in range(T, 1)) // no ghosts/cameramobs - show_to |= M - var/obj/structure/table/other - other = locate() in get_step(T, NORTH) - if(other) - processing |= other - other = locate() in get_step(T, SOUTH) - if(other) - processing |= other - other = locate() in get_step(T, WEST) - if(other) - processing |= other - other = locate() in get_step(T, EAST) - if(other) - processing |= other + if(processed[T]) + continue + for(var/obj/structure/table/T2 in T.connected_floodfill(25)) + processed[T2] = TRUE + for(var/mob/living/L in range(T2, 1)) + show_to |= L for(var/i in show_to) var/mob/M = i diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm index fbef8fd244..089484ea9f 100644 --- a/code/modules/mob/status_procs.dm +++ b/code/modules/mob/status_procs.dm @@ -52,8 +52,8 @@ /mob/proc/update_blindness() if(eye_blind) // UNCONSCIOUS or has blind trait, or has temporary blindness if(stat == CONSCIOUS || stat == SOFT_CRIT) - throw_alert("blind", /obj/screen/alert/blind) - overlay_fullscreen("blind", /obj/screen/fullscreen/blind) + throw_alert("blind", /atom/movable/screen/alert/blind) + overlay_fullscreen("blind", /atom/movable/screen/fullscreen/blind) // You are blind why should you be able to make out details like color, only shapes near you // add_client_colour(/datum/client_colour/monochrome/blind) else // CONSCIOUS no blind trait, no blindness @@ -91,7 +91,7 @@ var/list/screens = list(hud_used.plane_masters["[GAME_PLANE]"], hud_used.plane_masters["[FLOOR_PLANE]"], hud_used.plane_masters["[WALL_PLANE]"], hud_used.plane_masters["[ABOVE_WALL_PLANE]"]) for(var/A in screens) - var/obj/screen/plane_master/P = A + var/atom/movable/screen/plane_master/P = A P.add_filter("blurry_eyes", 2, EYE_BLUR(clamp(eye_blurry*0.1,0.6,3))) /mob/proc/remove_eyeblur() @@ -100,7 +100,7 @@ var/list/screens = list(hud_used.plane_masters["[GAME_PLANE]"], hud_used.plane_masters["[FLOOR_PLANE]"], hud_used.plane_masters["[WALL_PLANE]"], hud_used.plane_masters["[ABOVE_WALL_PLANE]"]) for(var/A in screens) - var/obj/screen/plane_master/P = A + var/atom/movable/screen/plane_master/P = A P.remove_filter("blurry_eyes") ///Adjust the drugginess of a mob diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 64c99e01bf..635ec2e54c 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -123,7 +123,7 @@ /obj/item/modular_computer/MouseDrop(obj/over_object, src_location, over_location) var/mob/M = usr - if((!istype(over_object, /obj/screen)) && usr.canUseTopic(src, BE_CLOSE)) + if((!istype(over_object, /atom/movable/screen)) && usr.canUseTopic(src, BE_CLOSE)) return attack_self(M) return ..() diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm index aee5dd4229..5686dec8d0 100644 --- a/code/modules/modular_computers/computers/item/laptop.dm +++ b/code/modules/modular_computers/computers/item/laptop.dm @@ -68,11 +68,11 @@ try_toggle_open(usr) /obj/item/modular_computer/laptop/MouseDrop(obj/over_object, src_location, over_location) - if(istype(over_object, /obj/screen/inventory/hand) || over_object == usr) - var/obj/screen/inventory/hand/H = over_object + if(istype(over_object, /atom/movable/screen/inventory/hand) || over_object == usr) + var/atom/movable/screen/inventory/hand/H = over_object var/mob/M = usr - if(!istype(over_object, /obj/screen/inventory/hand)) + if(!istype(over_object, /atom/movable/screen/inventory/hand)) M.put_in_active_hand(src) return diff --git a/code/modules/modular_computers/file_system/programs/budgetordering.dm b/code/modules/modular_computers/file_system/programs/budgetordering.dm index 162f480c02..4fda99864c 100644 --- a/code/modules/modular_computers/file_system/programs/budgetordering.dm +++ b/code/modules/modular_computers/file_system/programs/budgetordering.dm @@ -12,7 +12,7 @@ ///Are you actually placing orders with it? var/requestonly = TRUE ///Can the tablet see or buy illegal stuff? - var/contraband = FALSE + var/contraband_view = FALSE ///Is it being bought from a personal account, or is it being done via a budget/cargo? var/self_paid = FALSE ///Can this console approve purchase requests? @@ -27,10 +27,15 @@ /datum/computer_file/program/budgetorders/proc/get_export_categories() . = EXPORT_CARGO +/datum/computer_file/program/budgetorders/run_emag() + if(!contraband_view) + contraband_view = TRUE + return TRUE + /datum/computer_file/program/budgetorders/proc/is_visible_pack(mob/user, paccess_to_check, list/access, contraband) if(issilicon(user)) //Borgs can't buy things. return FALSE - if(computer.obj_flags & EMAGGED) + if((computer.obj_flags & EMAGGED) || contraband_view) return TRUE else if(contraband) //Hide contrband when non-emagged. return FALSE @@ -80,14 +85,14 @@ data["supplies"] = list() for(var/pack in SSshuttle.supply_packs) var/datum/supply_pack/P = SSshuttle.supply_packs[pack] - if(!is_visible_pack(usr, P.access , null, P.contraband) || P.hidden) + if(!is_visible_pack(usr, P.access , null, P.contraband)) continue if(!data["supplies"][P.group]) data["supplies"][P.group] = list( "name" = P.group, "packs" = list() ) - if((P.hidden && (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.DropPodOnly)) + if(((P.hidden || P.contraband) && !contraband_view) || (P.special && !P.special_enabled) || P.DropPodOnly) continue data["supplies"][P.group]["packs"] += list(list( "name" = P.name, @@ -179,7 +184,7 @@ var/datum/supply_pack/pack = SSshuttle.supply_packs[id] if(!istype(pack)) return - if((pack.hidden && (pack.contraband && !contraband) || pack.DropPodOnly)) + if(((pack.hidden || pack.contraband) && !contraband_view) || pack.DropPodOnly) return var/name = "*None Provided*" diff --git a/code/modules/modular_computers/file_system/programs/secureye.dm b/code/modules/modular_computers/file_system/programs/secureye.dm index 78e72640ed..92275b1e8b 100644 --- a/code/modules/modular_computers/file_system/programs/secureye.dm +++ b/code/modules/modular_computers/file_system/programs/secureye.dm @@ -21,10 +21,10 @@ // Stuff needed to render the map var/map_name - var/obj/screen/map_view/cam_screen + var/atom/movable/screen/map_view/cam_screen /// All the plane masters that need to be applied. var/list/cam_plane_masters - var/obj/screen/background/cam_background + var/atom/movable/screen/background/cam_background /datum/computer_file/program/secureye/New() . = ..() @@ -42,8 +42,8 @@ cam_screen.del_on_map_removal = FALSE cam_screen.screen_loc = "[map_name]:1,1" cam_plane_masters = list() - for(var/plane in subtypesof(/obj/screen/plane_master)) - var/obj/screen/instance = new plane() + for(var/plane in subtypesof(/atom/movable/screen/plane_master)) + var/atom/movable/screen/instance = new plane() instance.assigned_map = map_name instance.del_on_map_removal = FALSE instance.screen_loc = "[map_name]:CENTER" diff --git a/code/modules/movespeed/_movespeed_modifier.dm b/code/modules/movespeed/_movespeed_modifier.dm index 5c4bf2ed64..5fc415b2b6 100644 --- a/code/modules/movespeed/_movespeed_modifier.dm +++ b/code/modules/movespeed/_movespeed_modifier.dm @@ -32,7 +32,7 @@ Key procs /// Unique ID. You can never have different modifications with the same ID. By default, this SHOULD NOT be set. Only set it for cases where you're dynamically making modifiers/need to have two types overwrite each other. If unset, uses path (converted to text) as ID. var/id - /// Higher ones override lower priorities. This is NOT used for ID, ID must be unique, if it isn't unique the newer one overwrites automatically if overriding. + /// Determines order. Lower priorities are applied first. var/priority = 0 var/flags = NONE @@ -41,9 +41,9 @@ Key procs /// Next two variables depend on this: Should we do advanced calculations? var/complex_calculation = FALSE /// Absolute max tiles we can boost to - var/absolute_max_tiles_per_second + var/absolute_max_tiles_per_second = INFINITY /// Max tiles per second we can boost - var/max_tiles_per_second_boost + var/max_tiles_per_second_boost = INFINITY /// Movetypes this applies to var/movetypes = ALL @@ -54,6 +54,8 @@ Key procs /// Other modification datums this conflicts with. var/conflicts_with + + /datum/movespeed_modifier/New() . = ..() if(!id) @@ -66,8 +68,10 @@ Key procs if(!complex_calculation || (multiplicative_slowdown > 0)) // we aren't limiting how much things can slowdown.. yet. return existing + multiplicative_slowdown var/current_tiles = 10 / max(existing, world.tick_lag) - var/minimum_speed = 10 / min(current_tiles + max_tiles_per_second_boost, max(current_tiles, absolute_max_tiles_per_second)) - return max(minimum_speed, existing + multiplicative_slowdown) + // multiplicative_slowdown is negative due to our first check + var/max_buff_to = max(existing + multiplicative_slowdown, 10 / absolute_max_tiles_per_second, 10 / (current_tiles + max_tiles_per_second_boost)) + // never slow the user + return min(existing, max_buff_to) GLOBAL_LIST_EMPTY(movespeed_modification_cache) diff --git a/code/modules/movespeed/modifiers/reagents.dm b/code/modules/movespeed/modifiers/reagents.dm index 1a03e8a602..a6c3133c8b 100644 --- a/code/modules/movespeed/modifiers/reagents.dm +++ b/code/modules/movespeed/modifiers/reagents.dm @@ -2,17 +2,53 @@ blacklisted_movetypes = (FLYING|FLOATING) /datum/movespeed_modifier/reagent/stimulants - multiplicative_slowdown = -0.5 + multiplicative_slowdown = -0.55 + +/datum/movespeed_modifier/reagent/ephedrine + // strong painkiller effect that caps out at slightly above runspeed + multiplicative_slowdown = -1.5 + priority = 500 + complex_calculation = TRUE + absolute_max_tiles_per_second = 7 + +/datum/movespeed_modifier/reagent/pepperspray + multiplicative_slowdown = 0.25 + +/datum/movespeed_modifier/reagent/monkey_energy + multiplicative_slowdown = -0.35 /datum/movespeed_modifier/reagent/changelinghaste - multiplicative_slowdown = -2 + // extremely strong painkiller effect: allows user to run at old sprint speeds but not over by cancelling out slowdowns. + // however, will not make user go faster than that + multiplicative_slowdown = -4 + priority = 500 + complex_calculation = TRUE + absolute_max_tiles_per_second = 10 + +/datum/movespeed_modifier/reagent/methamphetamine + // very strong painkiller effect that caps out at slightly above runspeed + multiplicative_slowdown = -2.5 + priority = 500 + complex_calculation = TRUE + absolute_max_tiles_per_second = 7.5 + +/datum/movespeed_modifier/reagent/nitryl + multiplicative_slowdown = -0.65 + +/datum/movespeed_modifier/reagent/freon + multiplicative_slowdown = 1.6 + +/datum/movespeed_modifier/reagent/halon + multiplicative_slowdown = 1.8 + +/datum/movespeed_modifier/reagent/lenturi + multiplicative_slowdown = 1.5 + +/datum/movespeed_modifier/reagent/nuka_cola + multiplicative_slowdown = -0.35 + +/datum/movespeed_modifier/reagent/nooartrium + multiplicative_slowdown = 2 /datum/movespeed_modifier/reagent/skooma multiplicative_slowdown = -1 - -/datum/movespeed_modifier/reagent/nitryl - multiplicative_slowdown = -1 - -/datum/movespeed_modifier/reagent/meth - multiplicative_slowdown = -0.5 - absolute_max_tiles_per_second = 11 diff --git a/code/modules/movespeed/modifiers/status_effects.dm b/code/modules/movespeed/modifiers/status_effects.dm index 1adfe8b4be..ab1b12e5dc 100644 --- a/code/modules/movespeed/modifiers/status_effects.dm +++ b/code/modules/movespeed/modifiers/status_effects.dm @@ -19,14 +19,14 @@ /datum/movespeed_modifier/status_effect/tased multiplicative_slowdown = 1.5 - priority = 50 + priority = 1500 /datum/movespeed_modifier/status_effect/domain multiplicative_slowdown = 3 /datum/movespeed_modifier/status_effect/tased/no_combat_mode multiplicative_slowdown = 8 - priority = 100 + priority = 1500 /datum/movespeed_modifier/status_effect/electrostaff multiplicative_slowdown = 1 @@ -51,3 +51,11 @@ /datum/movespeed_modifier/status_effect/off_balance variable = TRUE + +/datum/movespeed_modifier/status_effect/slime/light_pink + // decently good painkiller + speedup effect + blacklisted_movetypes = FLYING | FLOATING + priority = 500 // someday we really need to make these defines lmao + multiplicative_slowdown = -2 + complex_calculation = TRUE + absolute_max_tiles_per_second = 7 diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index ed711771bf..15071a186f 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -77,6 +77,11 @@ Contents: cell.name = "black power cell" cell.icon_state = "bscell" +/obj/item/clothing/suit/space/space_ninja/Destroy() + if(affecting) + unlock_suit() + return ..() + //Simply deletes all the attachments and self, killing all related procs. /obj/item/clothing/suit/space/space_ninja/proc/terminate() qdel(n_hood) @@ -84,7 +89,6 @@ Contents: qdel(n_shoes) qdel(src) - //Randomizes suit parameters. /obj/item/clothing/suit/space/space_ninja/proc/randomize_param() s_cost = rand(1,20) @@ -93,7 +97,6 @@ Contents: s_bombs = rand(5,20) a_boost = rand(1,7) - //This proc prevents the suit from being taken off. /obj/item/clothing/suit/space/space_ninja/proc/lock_suit(mob/living/carbon/human/H) if(!istype(H)) @@ -113,14 +116,14 @@ Contents: return FALSE affecting = H ADD_TRAIT(src, TRAIT_NODROP, NINJA_SUIT_TRAIT) //colons make me go all |= - slowdown = 0 n_hood = H.head ADD_TRAIT(n_hood, TRAIT_NODROP, NINJA_SUIT_TRAIT) n_shoes = H.shoes ADD_TRAIT(n_shoes, TRAIT_NODROP, NINJA_SUIT_TRAIT) - n_shoes.slowdown -= 0.5 + n_shoes.slowdown = -0.25 n_gloves = H.gloves ADD_TRAIT(n_gloves, TRAIT_NODROP, NINJA_SUIT_TRAIT) + ADD_TRAIT(affecting, TRAIT_TASED_RESISTANCE, NINJA_SUIT_TRAIT) return TRUE /obj/item/clothing/suit/space/space_ninja/proc/lockIcons(mob/living/carbon/human/H) @@ -133,19 +136,19 @@ Contents: /obj/item/clothing/suit/space/space_ninja/proc/unlock_suit() affecting = null REMOVE_TRAIT(src, TRAIT_NODROP, NINJA_SUIT_TRAIT) - slowdown = 1 icon_state = "s-ninja" if(n_hood)//Should be attached, might not be attached. REMOVE_TRAIT(n_hood, TRAIT_NODROP, NINJA_SUIT_TRAIT) if(n_shoes) REMOVE_TRAIT(n_shoes, TRAIT_NODROP, NINJA_SUIT_TRAIT) - n_shoes.slowdown += 0.5 + n_shoes.slowdown = 0.25 if(n_gloves) n_gloves.icon_state = "s-ninja" n_gloves.item_state = "s-ninja" REMOVE_TRAIT(n_gloves, TRAIT_NODROP, NINJA_SUIT_TRAIT) n_gloves.candrain=0 n_gloves.draining=0 + REMOVE_TRAIT(affecting, TRAIT_TASED_RESISTANCE, NINJA_SUIT_TRAIT) /obj/item/clothing/suit/space/space_ninja/examine(mob/user) diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm index f5cb6e1a10..2bb743abbd 100644 --- a/code/modules/paperwork/paper_cutter.dm +++ b/code/modules/paperwork/paper_cutter.dm @@ -101,8 +101,8 @@ if(over_object == M) M.put_in_hands(src) - else if(istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + else if(istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) add_fingerprint(M) diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 16a9ed33ed..6775532614 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -52,8 +52,8 @@ if(over_object == M) M.put_in_hands(src) - else if(istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + else if(istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) add_fingerprint(M) diff --git a/code/modules/plumbing/plumbers/autohydro.dm b/code/modules/plumbing/plumbers/autohydro.dm index 9c358d8d6e..4e1dd88406 100644 --- a/code/modules/plumbing/plumbers/autohydro.dm +++ b/code/modules/plumbing/plumbers/autohydro.dm @@ -5,12 +5,6 @@ obj_flags = CAN_BE_HIT | UNIQUE_RENAME circuit = /obj/item/circuitboard/machine/hydroponics/automagic - -/obj/machinery/hydroponics/constructable/automagic/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/reagent_containers)) - return FALSE //avoid fucky wuckies - ..() - /obj/machinery/hydroponics/constructable/automagic/default_unfasten_wrench(mob/user, obj/item/I, time = 20) . = ..() if(. == SUCCESSFUL_UNFASTEN) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 9a201b7d9c..515349d666 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1,44 +1,104 @@ -//update_state -#define UPSTATE_CELL_IN (1<<0) -#define UPSTATE_OPENED1 (1<<1) -#define UPSTATE_OPENED2 (1<<2) -#define UPSTATE_MAINT (1<<3) -#define UPSTATE_BROKE (1<<4) -#define UPSTATE_BLUESCREEN (1<<5) -#define UPSTATE_WIREEXP (1<<6) -#define UPSTATE_ALLGOOD (1<<7) - -#define APC_RESET_EMP "emp" - -//update_overlay -#define APC_UPOVERLAY_CHARGEING0 (1<<0) -#define APC_UPOVERLAY_CHARGEING1 (1<<1) -#define APC_UPOVERLAY_CHARGEING2 (1<<2) -#define APC_UPOVERLAY_EQUIPMENT0 (1<<3) -#define APC_UPOVERLAY_EQUIPMENT1 (1<<4) -#define APC_UPOVERLAY_EQUIPMENT2 (1<<5) -#define APC_UPOVERLAY_LIGHTING0 (1<<6) -#define APC_UPOVERLAY_LIGHTING1 (1<<7) -#define APC_UPOVERLAY_LIGHTING2 (1<<8) -#define APC_UPOVERLAY_ENVIRON0 (1<<9) -#define APC_UPOVERLAY_ENVIRON1 (1<<10) -#define APC_UPOVERLAY_ENVIRON2 (1<<11) -#define APC_UPOVERLAY_LOCKED (1<<12) -#define APC_UPOVERLAY_OPERATING (1<<13) - -#define APC_ELECTRONICS_MISSING 0 // None -#define APC_ELECTRONICS_INSTALLED 1 // Installed but not secured -#define APC_ELECTRONICS_SECURED 2 // Installed and secured +// APC electronics status: +/// There are no electronics in the APC. +#define APC_ELECTRONICS_MISSING 0 +/// The electronics are installed but not secured. +#define APC_ELECTRONICS_INSTALLED 1 +/// The electronics are installed and secured. +#define APC_ELECTRONICS_SECURED 2 +// APC cover status: +/// The APCs cover is closed. #define APC_COVER_CLOSED 0 +/// The APCs cover is open. #define APC_COVER_OPENED 1 +/// The APCs cover is missing. #define APC_COVER_REMOVED 2 +// APC charging status: +/// The APC is not charging. #define APC_NOT_CHARGING 0 +/// The APC is charging. #define APC_CHARGING 1 +/// The APC is fully charged. #define APC_FULLY_CHARGED 2 #define MAXIMUM_COG_REGAIN 100 //How much charge drained by an integration cog can be priority-recharged in one processing-tick +// APC channel status: +/// The APCs power channel is manually set off. +#define APC_CHANNEL_OFF 0 +/// The APCs power channel is automatically off. +#define APC_CHANNEL_AUTO_OFF 1 +/// The APCs power channel is manually set on. +#define APC_CHANNEL_ON 2 +/// The APCs power channel is automatically on. +#define APC_CHANNEL_AUTO_ON 3 + + +// APC autoset enums: +/// The APC turns automated and manual power channels off. +#define AUTOSET_FORCE_OFF 0 +/// The APC turns automated power channels off. +#define AUTOSET_OFF 2 +/// The APC turns automated power channels on. +#define AUTOSET_ON 1 + +// External power status: +/// The APC either isn't attached to a powernet or there is no power on the external powernet. +#define APC_NO_POWER 0 +/// The APCs external powernet does not have enough power to charge the APC. +#define APC_LOW_POWER 1 +/// The APCs external powernet has enough power to charge the APC. +#define APC_HAS_POWER 2 + +// Ethereals: +/// How long it takes an ethereal to drain or charge APCs. Also used as a spam limiter. +#define APC_DRAIN_TIME (7.5 SECONDS) +/// How much power ethereals gain/drain from APCs. +#define APC_POWER_GAIN 200 + +// Wires & EMPs: +/// The wire value used to reset the APCs wires after one's EMPed. +#define APC_RESET_EMP "emp" + +// update_state +// Bitshifts: (If you change the status values to be something other than an int or able to exceed 3 you will need to change these too) +/// The bit shift for the APCs cover status. +#define UPSTATE_COVER_SHIFT (0) + /// The bitflag representing the APCs cover being open for icon purposes. + #define UPSTATE_OPENED1 (APC_COVER_OPENED << UPSTATE_COVER_SHIFT) + /// The bitflag representing the APCs cover being missing for icon purposes. + #define UPSTATE_OPENED2 (APC_COVER_REMOVED << UPSTATE_COVER_SHIFT) + +// Bitflags: +/// The APC has a power cell. +#define UPSTATE_CELL_IN (1<<2) +/// The APC is broken or damaged. +#define UPSTATE_BROKE (1<<3) +/// The APC is undergoing maintenance. +#define UPSTATE_MAINT (1<<4) +/// The APC is emagged or malfed. +#define UPSTATE_BLUESCREEN (1<<5) +/// The APCs wires are exposed. +#define UPSTATE_WIREEXP (1<<6) + +// update_overlay +// Bitflags: +/// Bitflag indicating that the APCs operating status overlay should be shown. +#define UPOVERLAY_OPERATING (1<<0) +/// Bitflag indicating that the APCs locked status overlay should be shown. +#define UPOVERLAY_LOCKED (1<<1) + +// Bitshifts: (If you change the status values to be something other than an int or able to exceed 3 you will need to change these too) +/// Bit shift for the charging status of the APC. +#define UPOVERLAY_CHARGING_SHIFT (2) +/// Bit shift for the equipment status of the APC. +#define UPOVERLAY_EQUIPMENT_SHIFT (4) +/// Bit shift for the lighting channel status of the APC. +#define UPOVERLAY_LIGHTING_SHIFT (6) +/// Bit shift for the environment channel status of the APC. +#define UPOVERLAY_ENVIRON_SHIFT (8) +///Update for hijack overlays +#define UPOVERLAY_HIJACKED (10) // the Area Power Controller (APC), formerly Power Distribution Unit (PDU) // one per area, needs wire connection to power network through a terminal @@ -51,12 +111,13 @@ name = "area power controller" desc = "A control terminal for the area's electrical systems." plane = ABOVE_WALL_PLANE + icon_state = "apc0" use_power = NO_POWER_USE req_access = null max_integrity = 300 integrity_failure = 0.17 - var/damage_deflection = 10 + damage_deflection = 10 resistance_flags = FIRE_PROOF armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 100, "bomb" = 30, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 50) req_access = list(ACCESS_ENGINE_EQUIP) @@ -66,29 +127,29 @@ var/area/area var/areastring = null var/obj/item/stock_parts/cell/cell - var/start_charge = 90 // initial cell charge % - var/cell_type = /obj/item/stock_parts/cell/upgraded //Base cell has 2500 capacity. Enter the path of a different cell you want to use. cell determines charge rates, max capacity, ect. These can also be changed with other APC vars, but isn't recommended to minimize the risk of accidental usage of dirty editted APCs + var/start_charge = 90 // initial cell charge % + var/cell_type = /obj/item/stock_parts/cell/upgraded //Base cell has 2500 capacity. Enter the path of a different cell you want to use. cell determines charge rates, max capacity, ect. These can also be changed with other APC vars, but isn't recommended to minimize the risk of accidental usage of dirty editted APCs var/opened = APC_COVER_CLOSED - var/shorted = 0 - var/lighting = 3 - var/equipment = 3 - var/environ = 3 + var/shorted = FALSE + var/lighting = APC_CHANNEL_AUTO_ON + var/equipment = APC_CHANNEL_AUTO_ON + var/environ = APC_CHANNEL_AUTO_ON var/operating = TRUE var/charging = APC_NOT_CHARGING var/chargemode = 1 var/chargecount = 0 var/locked = TRUE var/coverlocked = TRUE - var/aidisabled = 0 + var/aidisabled = FALSE var/tdir = null var/obj/machinery/power/terminal/terminal = null var/lastused_light = 0 var/lastused_equip = 0 var/lastused_environ = 0 var/lastused_total = 0 - var/main_status = 0 // Whether or not there's external power. 0 is "none", 1 is "insufficient", 2 is "charging". - powernet = 0 // set so that APCs aren't found as powernet nodes //Hackish, Horrible, was like this before I changed it :( - var/malfhack = 0 //New var for my changes to AI malf. --NeoFite + var/main_status = 0 + powernet = FALSE // set so that APCs aren't found as powernet nodes //Hackish, Horrible, was like this before I changed it :( + var/malfhack = FALSE //New var for my changes to AI malf. --NeoFite var/mob/living/silicon/ai/malfai = null //See above --NeoFite var/has_electronics = APC_ELECTRONICS_MISSING // 0 - none, 1 - plugged in, 2 - secured by screwdriver var/overload = 1 //used for the Blackout malf module @@ -98,9 +159,9 @@ var/obj/item/clockwork/integration_cog/integration_cog //Is there a cog siphoning power? var/cog_drained = 0 //How much of the cell's charge was drained by an integration cog, recovering this amount takes priority over the normal APC cell recharge calculations, but comes after powering Essentials. var/longtermpower = 10 - var/auto_name = 0 + var/auto_name = FALSE var/failure_timer = 0 - var/force_update = 0 + var/force_update = FALSE var/emergency_lights = FALSE var/nightshift_lights = FALSE var/nightshift_requires_auth = FALSE @@ -119,6 +180,9 @@ /obj/machinery/power/apc/syndicate //general syndicate access req_access = list(ACCESS_SYNDICATE) +/obj/machinery/power/apc/away //general away mission access + req_access = list(ACCESS_AWAY_GENERAL) + /obj/machinery/power/apc/highcap/five_k cell_type = /obj/item/stock_parts/cell/upgraded/plus @@ -177,7 +241,6 @@ area = A if(auto_name) name = "\improper [A.name] APC" - update_icon() make_terminal() update_nightshift_auth_requirement() @@ -187,8 +250,9 @@ opened = APC_COVER_OPENED operating = FALSE name = "\improper [A.name] APC" - stat |= MAINT - update_icon() + set_machine_stat(stat | MAINT) + + update_appearance() addtimer(CALLBACK(src, .proc/update), 5) GLOB.apcs_list += src @@ -196,21 +260,36 @@ wires = new /datum/wires/apc(src) // offset 24 pixels in direction of dir // this allows the APC to be embedded in a wall, yet still inside an area + if (building) + setDir(ndir) + tdir = dir // to fix Vars bug setDir(SOUTH) switch(tdir) if(NORTH) - pixel_x = 0 + if((pixel_y != initial(pixel_y)) && (pixel_y != 23)) + log_mapping("APC: ([src]) at [AREACOORD(src)] with dir ([tdir] | [uppertext(dir2text(tdir))]) has pixel_y value ([pixel_y] - should be 23.)") pixel_y = 23 if(SOUTH) - pixel_x = 0 + if((pixel_y != initial(pixel_y)) && (pixel_y != -23)) + log_mapping("APC: ([src]) at [AREACOORD(src)] with dir ([tdir] | [uppertext(dir2text(tdir))]) has pixel_y value ([pixel_y] - should be -23.)") pixel_y = -23 if(EAST) - pixel_y = 0 + if((pixel_y != initial(pixel_x)) && (pixel_x != 24)) + log_mapping("APC: ([src]) at [AREACOORD(src)] with dir ([tdir] | [uppertext(dir2text(tdir))]) has pixel_x value ([pixel_x] - should be 24.)") pixel_x = 24 if(WEST) - pixel_y = 0 + if((pixel_y != initial(pixel_x)) && (pixel_x != -25)) + log_mapping("APC: ([src]) at [AREACOORD(src)] with dir ([tdir] | [uppertext(dir2text(tdir))]) has pixel_x value ([pixel_x] - should be -25.)") pixel_x = -25 + if (building) + area = get_area(src) + opened = APC_COVER_OPENED + operating = FALSE + name = "\improper [get_area_name(area, TRUE)] APC" + set_machine_stat(stat | MAINT) + update_appearance() + addtimer(CALLBACK(src, .proc/update), 5) /obj/machinery/power/apc/Destroy() GLOB.apcs_list -= src @@ -221,6 +300,7 @@ area.power_equip = FALSE area.power_environ = FALSE area.power_change() + area.poweralert(FALSE, src) if(occupier) malfvacate(1) qdel(wires) @@ -234,7 +314,7 @@ /obj/machinery/power/apc/handle_atom_del(atom/A) if(A == cell) cell = null - update_icon() + update_appearance() updateUsrDialog() /obj/machinery/power/apc/proc/make_terminal() @@ -275,157 +355,130 @@ // update the APC icon to show the three base states // also add overlays for indicator lights -/obj/machinery/power/apc/update_icon() - var/update = check_updates() //returns 0 if no need to update icons. - // 1 if we need to update the icon_state - // 2 if we need to update the overlays - if(!update) - icon_update_needed = FALSE +/obj/machinery/power/apc/update_appearance(updates=check_updates()) + icon_update_needed = FALSE + if(!updates) return - if(update & 1) // Updating the icon state - if(update_state & UPSTATE_ALLGOOD) - icon_state = "apc0" - else if(update_state & (UPSTATE_OPENED1|UPSTATE_OPENED2)) - var/basestate = "apc[ cell ? "2" : "1" ]" - if(update_state & UPSTATE_OPENED1) - if(update_state & (UPSTATE_MAINT|UPSTATE_BROKE)) - icon_state = "apcmaint" //disabled APC cannot hold cell - else - icon_state = basestate - else if(update_state & UPSTATE_OPENED2) - if (update_state & UPSTATE_BROKE || malfhack) - icon_state = "[basestate]-b-nocover" - else - icon_state = "[basestate]-nocover" - else if(update_state & UPSTATE_BROKE) - icon_state = "apc-b" - else if(update_state & UPSTATE_BLUESCREEN) - icon_state = "apcemag" - else if(update_state & UPSTATE_WIREEXP) - icon_state = "apcewires" - else if(update_state & UPSTATE_MAINT) - icon_state = "apc0" - - if(!(update_state & UPSTATE_ALLGOOD)) - SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) - var/hijackerreturn - if (hijacker) - var/obj/item/implant/hijack/H = hijacker.getImplant(/obj/item/implant/hijack) - hijackerreturn = H && !H.stealthmode - if(update & 2) - SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) - if(!(stat & (BROKEN|MAINT)) && update_state & UPSTATE_ALLGOOD) - SSvis_overlays.add_vis_overlay(src, icon, "apcox-[locked]", layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apcox-[locked]", EMISSIVE_LAYER, EMISSIVE_PLANE, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco3-[hijackerreturn ? "3" : charging]", layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco3-[hijackerreturn ? "3" : charging]", EMISSIVE_LAYER, EMISSIVE_PLANE, dir) - if(operating) - SSvis_overlays.add_vis_overlay(src, icon, "apco0-[equipment]", layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco0-[equipment]", EMISSIVE_LAYER, EMISSIVE_PLANE, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco1-[lighting]", layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco1-[lighting]", EMISSIVE_LAYER, EMISSIVE_PLANE, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco2-[environ]", layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco2-[environ]", EMISSIVE_LAYER, EMISSIVE_PLANE, dir) - + . = ..() // And now, separately for cleanness, the lighting changing - if(update_state & UPSTATE_ALLGOOD) + if(!update_state) switch(charging) if(APC_NOT_CHARGING) - light_color = LIGHT_COLOR_RED + set_light_color(COLOR_SOFT_RED) if(APC_CHARGING) - light_color = LIGHT_COLOR_BLUE + set_light_color(LIGHT_COLOR_BLUE) if(APC_FULLY_CHARGED) - light_color = LIGHT_COLOR_GREEN - if (hijackerreturn) - light_color = LIGHT_COLOR_YELLOW + set_light_color(LIGHT_COLOR_GREEN) set_light(lon_range) - else if(update_state & UPSTATE_BLUESCREEN) - light_color = LIGHT_COLOR_BLUE + return + + if(update_state & UPSTATE_BLUESCREEN) + set_light_color(LIGHT_COLOR_BLUE) set_light(lon_range) - else - set_light(0) + return - icon_update_needed = FALSE + set_light(0) +// update the APC icon to show the three base states +// also add overlays for indicator lights +/obj/machinery/power/apc/update_icon_state() + if(!update_state) + icon_state = "apc0" + return ..() + if(update_state & (UPSTATE_OPENED1|UPSTATE_OPENED2)) + var/basestate = "apc[cell ? 2 : 1]" + if(update_state & UPSTATE_OPENED1) + icon_state = (update_state & (UPSTATE_MAINT|UPSTATE_BROKE)) ? "apcmaint" : basestate + else if(update_state & UPSTATE_OPENED2) + icon_state = "[basestate][((update_state & UPSTATE_BROKE) || malfhack) ? "-b" : null]-nocover" + return ..() + if(update_state & UPSTATE_BROKE) + icon_state = "apc-b" + return ..() + if(update_state & UPSTATE_BLUESCREEN) + icon_state = "apcemag" + return ..() + if(update_state & UPSTATE_WIREEXP) + icon_state = "apcewires" + return ..() + if(update_state & UPSTATE_MAINT) + icon_state = "apc0" + return ..() + +/obj/machinery/power/apc/update_overlays() + . = ..() + if((stat & (BROKEN|MAINT)) || update_state) + return + + . += mutable_appearance(icon, "apcox-[locked]") + . += emissive_appearance(icon, "apcox-[locked]") + . += mutable_appearance(icon, "apco3-[hijackerreturn() ? "3" : charging]") + . += emissive_appearance(icon, "apco3-[hijackerreturn() ? "3" : charging]") + if(!operating) + return + + . += mutable_appearance(icon, "apco0-[equipment]") + . += emissive_appearance(icon, "apco0-[equipment]") + . += mutable_appearance(icon, "apco1-[lighting]") + . += emissive_appearance(icon, "apco1-[lighting]") + . += mutable_appearance(icon, "apco2-[environ]") + . += emissive_appearance(icon, "apco2-[environ]") + +/// Checks for what icon updates we will need to handle /obj/machinery/power/apc/proc/check_updates() - var/last_update_state = update_state - var/last_update_overlay = update_overlay - update_state = 0 - update_overlay = 0 + SIGNAL_HANDLER + . = NONE - if(cell) - update_state |= UPSTATE_CELL_IN + // Handle icon status: + var/new_update_state = NONE if(stat & BROKEN) - update_state |= UPSTATE_BROKE + new_update_state |= UPSTATE_BROKE if(stat & MAINT) - update_state |= UPSTATE_MAINT + new_update_state |= UPSTATE_MAINT + if(opened) - if(opened==APC_COVER_OPENED) - update_state |= UPSTATE_OPENED1 - if(opened==APC_COVER_REMOVED) - update_state |= UPSTATE_OPENED2 + new_update_state |= (opened << UPSTATE_COVER_SHIFT) + if(cell) + new_update_state |= UPSTATE_CELL_IN + else if((obj_flags & EMAGGED) || malfai) - update_state |= UPSTATE_BLUESCREEN + new_update_state |= UPSTATE_BLUESCREEN else if(panel_open) - update_state |= UPSTATE_WIREEXP - if(update_state <= 1) - update_state |= UPSTATE_ALLGOOD + new_update_state |= UPSTATE_WIREEXP + if(new_update_state != update_state) + update_state = new_update_state + . |= UPDATE_ICON_STATE + + // Handle overlay status: + var/new_update_overlay = NONE if(operating) - update_overlay |= APC_UPOVERLAY_OPERATING - - if(update_state & UPSTATE_ALLGOOD) + new_update_overlay |= UPOVERLAY_OPERATING + if(!update_state) if(locked) - update_overlay |= APC_UPOVERLAY_LOCKED + new_update_overlay |= UPOVERLAY_LOCKED - if(!charging) - update_overlay |= APC_UPOVERLAY_CHARGEING0 - else if(charging == APC_CHARGING) - update_overlay |= APC_UPOVERLAY_CHARGEING1 - else if(charging == APC_FULLY_CHARGED) - update_overlay |= APC_UPOVERLAY_CHARGEING2 + new_update_overlay |= (charging << UPOVERLAY_CHARGING_SHIFT) + new_update_overlay |= (equipment << UPOVERLAY_EQUIPMENT_SHIFT) + new_update_overlay |= (lighting << UPOVERLAY_LIGHTING_SHIFT) + new_update_overlay |= (environ << UPOVERLAY_ENVIRON_SHIFT) + new_update_overlay |= (hijackerreturn() << UPOVERLAY_HIJACKED) - if (!equipment) - update_overlay |= APC_UPOVERLAY_EQUIPMENT0 - else if(equipment == 1) - update_overlay |= APC_UPOVERLAY_EQUIPMENT1 - else if(equipment == 2) - update_overlay |= APC_UPOVERLAY_EQUIPMENT2 - - if(!lighting) - update_overlay |= APC_UPOVERLAY_LIGHTING0 - else if(lighting == 1) - update_overlay |= APC_UPOVERLAY_LIGHTING1 - else if(lighting == 2) - update_overlay |= APC_UPOVERLAY_LIGHTING2 - - if(!environ) - update_overlay |= APC_UPOVERLAY_ENVIRON0 - else if(environ==1) - update_overlay |= APC_UPOVERLAY_ENVIRON1 - else if(environ==2) - update_overlay |= APC_UPOVERLAY_ENVIRON2 - - var/results = 0 - var/hijackerreturn - if (hijacker) - var/obj/item/implant/hijack/H = hijacker.getImplant(/obj/item/implant/hijack) - hijackerreturn = H && !H.stealthmode - if(last_update_state == update_state && last_update_overlay == update_overlay && hijackerreturn == hijackerlast) - return 0 - if(last_update_state != update_state) - results += 1 - if(last_update_overlay != update_overlay || hijackerreturn != hijackerlast) - results += 2 - if (hijackerreturn != hijackerlast) - hijackerlast = hijackerreturn - return results + if(new_update_overlay != update_overlay) + update_overlay = new_update_overlay + . |= UPDATE_OVERLAYS // Used in process so it doesn't update the icon too much /obj/machinery/power/apc/proc/queue_icon_update() icon_update_needed = TRUE +/obj/machinery/power/apc/proc/hijackerreturn() + if(!hijacker) + return FALSE + var/obj/item/implant/hijack/implant = hijacker.getImplant(/obj/item/implant/hijack) + if(implant && !implant.stealthmode) + return TRUE //attack with an item - open/close cover, insert cell, or (un)lock interface /obj/machinery/power/apc/crowbar_act(mob/user, obj/item/W) @@ -478,7 +531,7 @@ else if (opened!=APC_COVER_REMOVED) opened = APC_COVER_CLOSED coverlocked = TRUE //closing cover relocks it - update_icon() + update_appearance() return else if (!(stat & BROKEN)) if(coverlocked && !(stat & MAINT)) // locked... @@ -489,7 +542,7 @@ return else opened = APC_COVER_OPENED - update_icon() + update_appearance() return /obj/machinery/power/apc/screwdriver_act(mob/living/user, obj/item/W) @@ -501,11 +554,11 @@ user.visible_message("[user] removes \the [cell] from [src]!","You remove \the [cell].") var/turf/T = get_turf(user) cell.forceMove(T) - cell.update_icon() + cell.update_appearance() cell = null cog_drained = 0 //No more cell means no more averting celldrain charging = APC_NOT_CHARGING - update_icon() + update_appearance() return else switch (has_electronics) @@ -516,28 +569,30 @@ to_chat(user, "You screw the circuit electronics into place.") if (APC_ELECTRONICS_SECURED) has_electronics = APC_ELECTRONICS_INSTALLED - stat |= MAINT + set_machine_stat(stat | MAINT) W.play_tool_sound(src) to_chat(user, "You unfasten the electronics.") else to_chat(user, "There is nothing to secure!") return - update_icon() + update_appearance() else if(obj_flags & EMAGGED) to_chat(user, "The interface is broken!") return else panel_open = !panel_open to_chat(user, "The wires have been [panel_open ? "exposed" : "unexposed"]") - update_icon() + update_appearance() /obj/machinery/power/apc/wirecutter_act(mob/living/user, obj/item/W) + . = ..() if (terminal && opened) terminal.dismantle(user, W) return TRUE /obj/machinery/power/apc/welder_act(mob/living/user, obj/item/W) + . = ..() if (opened && !has_electronics && !terminal) if(!W.tool_start_check(user, amount=3)) return @@ -563,12 +618,12 @@ if(area.hasSiliconAccessInArea(user) && get_dist(src,user)>1) return attack_hand(user) - if (istype(W, /obj/item/stock_parts/cell) && opened) + if(istype(W, /obj/item/stock_parts/cell) && opened) if(cell) to_chat(user, "There is a power cell already installed!") return else - if (stat & MAINT) + if(stat & MAINT) to_chat(user, "There is no connector for your power cell!") return if(!user.transferItemToLoc(W, src)) @@ -578,7 +633,7 @@ "[user.name] has inserted the power cell to [src.name]!",\ "You insert the power cell.") chargecount = 0 - update_icon() + update_appearance() else if (W.GetID()) togglelock(user) else if (istype(W, /obj/item/stack/cable_coil) && opened) @@ -601,16 +656,20 @@ return user.visible_message("[user.name] adds cables to the APC frame.", \ "You start adding cables to the APC frame...") - playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) - if(C.use_tool(src, user, 20, 10) && !terminal && opened && has_electronics) - var/turf/T = get_turf(src) - var/obj/structure/cable/N = T.get_cable_node() - if (prob(50) && electrocute_mob(usr, N, N, 1, TRUE)) - do_sparks(5, TRUE, src) + playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE) + if(do_after(user, 20, target = src)) + if (C.get_amount() < 10 || !C) return - to_chat(user, "You add cables to the APC frame.") - make_terminal() - terminal.connect_to_network() + if (C.get_amount() >= 10 && !terminal && opened && has_electronics) + var/turf/T = get_turf(src) + var/obj/structure/cable/N = T.get_cable_node() + if (prob(50) && electrocute_mob(usr, N, N, 1, TRUE)) + do_sparks(5, TRUE, src) + return + C.use(10) + to_chat(user, "You add cables to the APC frame.") + make_terminal() + terminal.connect_to_network() else if (istype(W, /obj/item/electronics/apc) && opened) if (has_electronics) to_chat(user, "There is already a board inside the [src]!") @@ -621,7 +680,7 @@ user.visible_message("[user.name] inserts the power control board into [src].", \ "You start to insert the power control board into the frame...") - playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) + playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE) if(do_after(user, 10, target = src)) if(!has_electronics) has_electronics = APC_ELECTRONICS_INSTALLED @@ -652,7 +711,7 @@ chargecount = 0 user.visible_message("[user] fabricates a weak power cell and places it into [src].", \ "Your [P.name] whirrs with strain as you create a weak power cell and place it into [src]!") - update_icon() + update_appearance() else to_chat(user, "[src] has both electronics and a cell.") return @@ -667,7 +726,7 @@ to_chat(user, "You replace missing APC's cover.") qdel(W) opened = APC_COVER_OPENED - update_icon() + update_appearance() return if (has_electronics) to_chat(user, "You cannot repair this APC until you remove the electronics still inside!") @@ -681,7 +740,7 @@ obj_integrity = max_integrity if (opened==APC_COVER_REMOVED) opened = APC_COVER_OPENED - update_icon() + update_appearance() else if(istype(W, /obj/item/clockwork/integration_cog) && is_servant_of_ratvar(user)) if(integration_cog) to_chat(user, "This APC already has a cog.") @@ -690,7 +749,7 @@ user.visible_message("[user] slices [src]'s cover lock, and it swings wide open!", \ "You slice [src]'s cover lock apart with [W], and the cover swings open.") opened = APC_COVER_OPENED - update_icon() + update_appearance() else user.visible_message("[user] presses [W] into [src]!", \ "You hold [W] in place within [src], and it slowly begins to warm up...") @@ -707,7 +766,7 @@ playsound(src, 'sound/machines/clockcult/steam_whoosh.ogg', 50, FALSE) opened = APC_COVER_CLOSED locked = TRUE //Clockies get full APC access on cogged APCs, but they can't lock or unlock em unless they steal some ID to give all of them APC access, soo this is pretty much just QoL for them and makes cogs a tiny bit more stealthy - update_icon() + update_appearance() return else if(panel_open && !opened && is_wire_tool(W)) wires.interact(user) @@ -745,7 +804,7 @@ return TRUE else if(!cell) if(stat & MAINT) - to_chat(user, "There's no connector for a power cell.") + to_chat(user, span_warning("There's no connector for a power cell.")) return FALSE var/obj/item/stock_parts/cell/crap/empty/C = new(src) C.forceMove(src) @@ -753,7 +812,7 @@ chargecount = 0 user.visible_message("[user] fabricates a weak power cell and places it into [src].", \ "Your [the_rcd.name] whirrs with strain as you create a weak power cell and place it into [src]!") - update_icon() + update_appearance() return TRUE else to_chat(user, "[src] has both electronics and a cell.") @@ -777,10 +836,10 @@ else if(stat & (BROKEN|MAINT)) to_chat(user, "Nothing happens!") else - if((allowed(usr) || area.hasSiliconAccessInArea(usr)) && !wires.is_cut(WIRE_IDSCAN) && !malfhack) + if(allowed(usr) && !wires.is_cut(WIRE_IDSCAN) && !malfhack) locked = !locked to_chat(user, "You [ locked ? "lock" : "unlock"] the APC interface.") - update_icon() + update_appearance() updateUsrDialog() else to_chat(user, "Access denied.") @@ -799,13 +858,9 @@ /obj/machinery/power/apc/obj_break(damage_flag) - if(!(flags_1 & NODECONSTRUCT_1)) - set_broken() - -/obj/machinery/power/apc/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) - if(damage_flag == "melee" && damage_amount < damage_deflection) - return 0 . = ..() + if(.) + set_broken() /obj/machinery/power/apc/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) @@ -815,7 +870,7 @@ opened = APC_COVER_REMOVED coverlocked = FALSE visible_message("The APC cover is knocked down!") - update_icon() + update_appearance() /obj/machinery/power/apc/emag_act(mob/user) . = ..() @@ -833,7 +888,7 @@ obj_flags |= EMAGGED locked = FALSE to_chat(user, "You emag the APC interface.") - update_icon() + update_appearance() return TRUE // attack with hand - remove cell (if cover open) or interact with the APC @@ -883,10 +938,10 @@ if(cell) user.visible_message("[user] removes \the [cell] from [src]!","You remove \the [cell].") user.put_in_hands(cell) - cell.update_icon() + cell.update_appearance() src.cell = null charging = APC_NOT_CHARGING - src.update_icon() + src.update_appearance() return if((stat & MAINT) && !opened) //no board; no interface return @@ -975,19 +1030,15 @@ return "[area.name] : [equipment]/[lighting]/[environ] ([lastused_equip+lastused_light+lastused_environ]) : [cell? cell.percent() : "N/C"] ([charging])" /obj/machinery/power/apc/proc/update() - var/old_light = area.power_light - var/old_equip = area.power_equip - var/old_environ = area.power_environ if(operating && !shorted && !failure_timer) - area.power_light = (lighting > 1) - area.power_equip = (equipment > 1) - area.power_environ = (environ > 1) + area.power_light = (lighting > APC_CHANNEL_AUTO_OFF) + area.power_equip = (equipment > APC_CHANNEL_AUTO_OFF) + area.power_environ = (environ > APC_CHANNEL_AUTO_OFF) else area.power_light = FALSE area.power_equip = FALSE area.power_environ = FALSE - if(old_light != area.power_light || old_equip != area.power_equip || old_environ != area.power_environ) - area.power_change() + area.power_change() /obj/machinery/power/apc/proc/can_use(mob/user, loud = 0) //used by attack_hand() and Topic() if(IsAdminGhost(user)) @@ -1032,7 +1083,7 @@ to_chat(usr, "The APC does not respond to the command!") else locked = !locked - update_icon() + update_appearance() . = TRUE if("cover") coverlocked = !coverlocked @@ -1047,20 +1098,20 @@ chargemode = !chargemode if(!chargemode) charging = APC_NOT_CHARGING - update_icon() + update_appearance() . = TRUE if("channel") if(params["eqp"]) equipment = setsubsystem(text2num(params["eqp"])) - update_icon() + update_appearance() update() else if(params["lgt"]) lighting = setsubsystem(text2num(params["lgt"])) - update_icon() + update_appearance() update() else if(params["env"]) environ = setsubsystem(text2num(params["env"])) - update_icon() + update_appearance() update() . = TRUE if("overload") @@ -1075,7 +1126,7 @@ hijacker.toggleSiliconAccessArea(area) hijacker = null set_hijacked_lighting() - update_icon() + update_appearance() var/obj/item/implant/hijack/H = usr.getImplant(/obj/item/implant/hijack) H.stealthcooldown = world.time + 2 MINUTES energy_fail(30 SECONDS * (cell.charge / cell.maxcharge)) @@ -1098,7 +1149,7 @@ malfvacate() if("reboot") failure_timer = 0 - update_icon() + update_appearance() update() if("emergency_lighting") emergency_lights = !emergency_lights @@ -1116,7 +1167,7 @@ add_hiddenprint(user) //delete when runtime log_game("[key_name(user)] turned [operating ? "on" : "off"] the [src] in [AREACOORD(src)]") update() - update_icon() + update_appearance() /obj/machinery/power/apc/proc/hijack(mob/living/L) if (!istype(L)) @@ -1133,7 +1184,7 @@ hijacker.toggleSiliconAccessArea(area) if (L.toggleSiliconAccessArea(area)) hijacker = L - update_icon() + update_appearance() set_hijacked_lighting() H.hijacking = FALSE being_hijacked = FALSE @@ -1150,7 +1201,7 @@ if (do_after(L,H.stealthmode ? 12 SECONDS : 5 SECONDS,target=src)) if (L.toggleSiliconAccessArea(area)) hijacker = L - update_icon() + update_appearance() set_hijacked_lighting() H.hijacking = FALSE being_hijacked = FALSE @@ -1176,8 +1227,8 @@ malf.malfhack = src malf.malfhacking = addtimer(CALLBACK(malf, /mob/living/silicon/ai/.proc/malfhacked, src), 600, TIMER_STOPPABLE) - var/obj/screen/alert/hackingapc/A - A = malf.throw_alert("hackingapc", /obj/screen/alert/hackingapc) + var/atom/movable/screen/alert/hackingapc/A + A = malf.throw_alert("hackingapc", /atom/movable/screen/alert/hackingapc) A.target = src /obj/machinery/power/apc/proc/malfoccupy(mob/living/silicon/ai/malf) @@ -1207,7 +1258,6 @@ add_verb(occupier, /mob/living/silicon/ai/proc/corereturn) occupier.cancel_camera() - /obj/machinery/power/apc/proc/malfvacate(forced) if(!occupier) return @@ -1251,11 +1301,11 @@ return transfer_in_progress = TRUE user.visible_message("[user] slots [card] into [src]...", "Transfer process initiated. Sending request for AI approval...") - playsound(src, 'sound/machines/click.ogg', 50, 1) + playsound(src, 'sound/machines/click.ogg', 50, TRUE) SEND_SOUND(occupier, sound('sound/misc/notice2.ogg')) //To alert the AI that someone's trying to card them if they're tabbed out if(alert(occupier, "[user] is attempting to transfer you to \a [card.name]. Do you consent to this?", "APC Transfer", "Yes - Transfer Me", "No - Keep Me Here") == "No - Keep Me Here") to_chat(user, "AI denied transfer request. Process terminated.") - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1) + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) transfer_in_progress = FALSE return if(user.loc != T) @@ -1300,16 +1350,16 @@ /obj/machinery/power/apc/process() if(icon_update_needed) - update_icon() + update_appearance() if(stat & (BROKEN|MAINT)) return - if(!area.requires_power) + if(!area || !area.requires_power) return if(failure_timer) update() queue_icon_update() failure_timer-- - force_update = 1 + force_update = TRUE return lastused_light = area.usage(STATIC_LIGHT) @@ -1327,110 +1377,117 @@ var/last_eq = equipment var/last_en = environ var/last_ch = charging + var/excess = surplus() + if(!avail()) - main_status = 0 + main_status = APC_NO_POWER else if(excess < 0) - main_status = 1 + main_status = APC_LOW_POWER else - main_status = 2 + main_status = APC_HAS_POWER - var/cur_excess = excess - var/cur_used = lastused_total - - // first: if we have enough power, power the essentials DIRECTLY - - var/environ_satisfied = FALSE - var/equipment_satisfied = FALSE - var/lighting_satisfied = FALSE - - if(cur_excess >= lastused_environ) - autoset(environ, 1) - add_load(lastused_environ) - cur_excess -= lastused_environ - cur_used -= lastused_environ - environ_satisfied = TRUE - - if(cur_excess >= lastused_equip) - autoset(equipment, 1) - add_load(lastused_equip) - cur_excess -= lastused_equip - cur_used -= lastused_equip - equipment_satisfied = TRUE - - if(cur_excess >= lastused_light) - autoset(lighting, 1) - add_load(lastused_light) - cur_excess -= lastused_light - cur_used -= lastused_light - lighting_satisfied = TRUE - - //If drained by an integration cog: Forcefully avert as much of the powerdrain as possible, though a maximum of MAXIMUM_COG_REGAIN - if(cur_excess && cog_drained && cell) - var/cog_regain = cell.give(min(min(cog_drained, cur_excess), MAXIMUM_COG_REGAIN)) - cur_excess -= cog_regain - cog_drained = max(0, cog_drained - cog_regain) - - // next: take from or charge to the cell, depending on how much is left if(cell && !shorted) - if(cur_excess > 0) - var/charging_cell = min(min(cur_excess*GLOB.CELLRATE, cell.maxcharge * GLOB.CHARGELEVEL), cell.maxcharge - cell.charge) - cell.give(charging_cell) - add_load(charging_cell/GLOB.CELLRATE) - lastused_total += charging_cell - longtermpower = min(10,longtermpower + 1) - if(chargemode && !charging) - chargecount++ - if(chargecount == 10) + // draw power from cell as before to power the area + var/cellused = min(cell.charge, lastused_total JOULES) // clamp deduction to a max, amount left in cell + cell.use(cellused) + //If drained by an integration cog: Forcefully avert as much of the powerdrain as possible, though a maximum of MAXIMUM_COG_REGAIN + if(excess && cog_drained) + var/cog_regain = cell.give(min(min(cog_drained, excess), MAXIMUM_COG_REGAIN)) + excess -= cog_regain + cog_drained = max(0, cog_drained - cog_regain) - chargecount = 0 - charging = APC_CHARGING - else // not enough power available to run the last tick! - charging = APC_NOT_CHARGING - chargecount = 0 - longtermpower = max(-10,longtermpower - 2) - cell.use(min(GLOB.CELLRATE * cur_used, cell.charge)) + if(excess > lastused_total) // if power excess recharge the cell + // by the same amount just used + cell.give(cellused) + add_load(cellused WATTS) // add the load used to recharge the cell + else // no excess, and not enough per-apc + if((cell.charge WATTS + excess) >= lastused_total) // can we draw enough from cell+grid to cover last usage? + cell.charge = min(cell.maxcharge, cell.charge + excess JOULES) //recharge with what we can + add_load(excess) // so draw what we can from the grid + charging = APC_NOT_CHARGING - // set channels based on remaining charge + else // not enough power available to run the last tick! + charging = APC_NOT_CHARGING + chargecount = 0 + // This turns everything off in the case that there is still a charge left on the battery, just not enough to run the room. + equipment = autoset(equipment, AUTOSET_FORCE_OFF) + lighting = autoset(lighting, AUTOSET_FORCE_OFF) + environ = autoset(environ, AUTOSET_FORCE_OFF) - var/cell_percent = cell.percent() - if(cell.charge <= 0) // zero charge, turn all off - equipment = autoset(equipment, 0) - lighting = autoset(lighting, 0) - environ = autoset(environ, 0) - area.poweralert(0, src) + // set channels depending on how much charge we have left - else if(cell_percent < 15 && longtermpower < 0) // <15%, turn off lighting & equipment - equipment = autoset(equipment, 2) - lighting = autoset(lighting, 2) - environ = autoset(environ, 1) - area.poweralert(0, src) - else if(cell_percent < 30 && longtermpower < 0) // <30%, turn off lighting - equipment = autoset(equipment, 1) - lighting = autoset(lighting, 2) - environ = autoset(environ, 1) - area.poweralert(0, src) - else // otherwise all can be on - equipment = autoset(equipment, 1) - lighting = autoset(lighting, 1) - environ = autoset(environ, 1) - area.poweralert(1, src) - if(cell_percent > 75) - area.poweralert(1, src) + // Allow the APC to operate as normal if the cell can charge + if(charging && longtermpower < 10) + longtermpower += 1 + else if(longtermpower > -10) + longtermpower -= 2 + if(cell.charge <= 0) // zero charge, turn all off + equipment = autoset(equipment, AUTOSET_FORCE_OFF) + lighting = autoset(lighting, AUTOSET_FORCE_OFF) + environ = autoset(environ, AUTOSET_FORCE_OFF) + area.poweralert(TRUE, src) + else if(cell.percent() < 15 && longtermpower < 0) // <15%, turn off lighting & equipment + equipment = autoset(equipment, AUTOSET_OFF) + lighting = autoset(lighting, AUTOSET_OFF) + environ = autoset(environ, AUTOSET_ON) + area.poweralert(TRUE, src) + else if(cell.percent() < 30 && longtermpower < 0) // <30%, turn off equipment + equipment = autoset(equipment, AUTOSET_OFF) + lighting = autoset(lighting, AUTOSET_ON) + environ = autoset(environ, AUTOSET_ON) + area.poweralert(TRUE, src) + else // otherwise all can be on + equipment = autoset(equipment, AUTOSET_ON) + lighting = autoset(lighting, AUTOSET_ON) + environ = autoset(environ, AUTOSET_ON) + area.poweralert(FALSE, src) + if(cell.percent() > 75) + area.poweralert(FALSE, src) + + // now trickle-charge the cell + if(chargemode && charging == APC_CHARGING && operating) + if(excess > 0) // check to make sure we have enough to charge + // Max charge is capped to % per second constant + var/ch = min(excess JOULES, cell.maxcharge JOULES) + add_load(ch WATTS) // Removes the power we're taking from the grid + cell.give(ch) // actually recharge the cell + + else + charging = APC_NOT_CHARGING // stop charging + chargecount = 0 // show cell as fully charged if so if(cell.charge >= cell.maxcharge) cell.charge = cell.maxcharge charging = APC_FULLY_CHARGED - else // no cell, can still run but not very well + if(chargemode) + if(!charging) + if(excess > cell.maxcharge*GLOB.CHARGELEVEL) + chargecount++ + else + chargecount = 0 + + if(chargecount == 10) + + chargecount = 0 + charging = APC_CHARGING + + else // chargemode off + charging = APC_NOT_CHARGING + chargecount = 0 + + else // no cell, switch everything off + charging = APC_NOT_CHARGING chargecount = 0 - environ = autoset(environ, environ_satisfied) - equipment = autoset(equipment, equipment_satisfied) - lighting = autoset(lighting, lighting_satisfied) + equipment = autoset(equipment, AUTOSET_FORCE_OFF) + lighting = autoset(lighting, AUTOSET_FORCE_OFF) + environ = autoset(environ, AUTOSET_FORCE_OFF) + area.poweralert(TRUE, src) // update icon & area power if anything changed @@ -1441,19 +1498,54 @@ else if (last_ch != charging) queue_icon_update() -// val 0=off, 1=off(auto) 2=on 3=on(auto) -// on 0=off, 1=on, 2=autooff - +/** + * Returns the new status value for an APC channel. + * + * // val 0=off, 1=off(auto) 2=on 3=on(auto) + * // on 0=off, 1=on, 2=autooff + * TODO: Make this use bitflags instead. It should take at most three lines, but it's out of scope for now. + * + * Arguments: + * - val: The current status of the power channel. + * - [APC_CHANNEL_OFF]: The APCs channel has been manually set to off. This channel will not automatically change. + * - [APC_CHANNEL_AUTO_OFF]: The APCs channel is running on automatic and is currently off. Can be automatically set to [APC_CHANNEL_AUTO_ON]. + * - [APC_CHANNEL_ON]: The APCs channel has been manually set to on. This will be automatically changed only if the APC runs completely out of power or is disabled. + * - [APC_CHANNEL_AUTO_ON]: The APCs channel is running on automatic and is currently on. Can be automatically set to [APC_CHANNEL_AUTO_OFF]. + * - on: An enum dictating how to change the channel's status. + * - [AUTOSET_FORCE_OFF]: The APC forces the channel to turn off. This includes manually set channels. + * - [AUTOSET_ON]: The APC allows automatic channels to turn back on. + * - [AUTOSET_OFF]: The APC turns automatic channels off. + */ /obj/machinery/power/apc/proc/autoset(val, on) - if(val == 3 && (on == 2 || !on)) // if auto-on, return auto-off - return 1 - else if(val == 2 && !on) // if on, return off - return 0 - else if(on == 1 && val == 1) // if auto-off, return auto-on - return 3 - // no, i don't understand these comments either + if(on == AUTOSET_FORCE_OFF) + if(val == APC_CHANNEL_ON) // if on, return off + return APC_CHANNEL_OFF + else if(val == APC_CHANNEL_AUTO_ON) // if auto-on, return auto-off + return APC_CHANNEL_AUTO_OFF + else if(on == AUTOSET_ON) + if(val == APC_CHANNEL_AUTO_OFF) // if auto-off, return auto-on + return APC_CHANNEL_AUTO_ON + else if(on == AUTOSET_OFF) + if(val == APC_CHANNEL_AUTO_ON) // if auto-on, return auto-off + return APC_CHANNEL_AUTO_OFF return val +/** + * Used by external forces to set the APCs channel status's. + * + * Arguments: + * - val: The desired value of the subsystem: + * - 1: Manually sets the APCs channel to be [APC_CHANNEL_OFF]. + * - 2: Manually sets the APCs channel to be [APC_CHANNEL_AUTO_ON]. If the APC doesn't have any power this defaults to [APC_CHANNEL_OFF] instead. + * - 3: Sets the APCs channel to be [APC_CHANNEL_AUTO_ON]. If the APC doesn't have enough power this defaults to [APC_CHANNEL_AUTO_OFF] instead. + */ +/obj/machinery/power/apc/proc/setsubsystem(val) + if(cell && cell.charge > 0) + return (val == 1) ? APC_CHANNEL_OFF : val + if(val == 3) + return APC_CHANNEL_AUTO_OFF + return APC_CHANNEL_OFF + /obj/machinery/power/apc/proc/reset(wire) switch(wire) if(WIRE_IDSCAN) @@ -1461,14 +1553,13 @@ if(WIRE_POWER1, WIRE_POWER2) if(!wires.is_cut(WIRE_POWER1) && !wires.is_cut(WIRE_POWER2)) shorted = FALSE - update() if(WIRE_AI) if(!wires.is_cut(WIRE_AI)) aidisabled = FALSE if(APC_RESET_EMP) - equipment = 3 - environ = 3 - update_icon() + equipment = APC_CHANNEL_AUTO_ON + environ = APC_CHANNEL_AUTO_ON + update_appearance() update() // damage and destruction acts @@ -1481,12 +1572,12 @@ occupier.emp_act(severity) if(. & EMP_PROTECT_SELF) return - lighting = 0 - equipment = 0 - environ = 0 - update_icon() + lighting = APC_CHANNEL_OFF + equipment = APC_CHANNEL_OFF + environ = APC_CHANNEL_OFF + update_appearance() update() - addtimer(CALLBACK(src, .proc/reset, APC_RESET_EMP), severity*8) + addtimer(CALLBACK(src, .proc/reset, APC_RESET_EMP), 600) /obj/machinery/power/apc/blob_act(obj/structure/blob/B) set_broken() @@ -1499,11 +1590,10 @@ /obj/machinery/power/apc/proc/set_broken() if(malfai && operating) malfai.malf_picker.processing_time = clamp(malfai.malf_picker.processing_time - 10,0,1000) - stat |= BROKEN operating = FALSE + obj_break() if(occupier) malfvacate(1) - update_icon() update() // overload all the lights in this APC area @@ -1524,23 +1614,14 @@ /obj/machinery/power/apc/proc/shock(mob/user, prb) if(!prob(prb)) - return 0 + return FALSE do_sparks(5, TRUE, src) if(isalien(user)) - return 0 + return FALSE if(electrocute_mob(user, src, src, 1, TRUE)) - return 1 + return TRUE else - return 0 - -/obj/machinery/power/apc/proc/setsubsystem(val) - if(cell && cell.charge > 0) - return (val==1) ? 0 : val - else if(val == 3) - return 1 - else - return 0 - + return FALSE /obj/machinery/power/apc/proc/energy_fail(duration) for(var/obj/machinery/M in area.contents) @@ -1566,12 +1647,8 @@ /obj/machinery/power/apc/proc/set_hijacked_lighting() set waitfor = FALSE - var/hijackerreturn - if (hijacker) - var/obj/item/implant/hijack/H = hijacker.getImplant(/obj/item/implant/hijack) - hijackerreturn = H && !H.stealthmode for(var/obj/machinery/light/L in area) - L.hijacked = hijackerreturn + L.hijacked = hijackerreturn() L.update(FALSE) CHECK_TICK @@ -1587,16 +1664,19 @@ var/normal_requires_auth = CONFIG_GET(flag/nightshift_toggle_requires_auth) return (configured_level && our_level && ((our_level <= configured_level)? public_requires_auth : normal_requires_auth)) -#undef UPSTATE_CELL_IN -#undef UPSTATE_OPENED1 -#undef UPSTATE_OPENED2 -#undef UPSTATE_MAINT -#undef UPSTATE_BROKE -#undef UPSTATE_BLUESCREEN -#undef UPSTATE_WIREEXP -#undef UPSTATE_ALLGOOD -#undef APC_RESET_EMP +#undef APC_CHANNEL_OFF +#undef APC_CHANNEL_AUTO_OFF +#undef APC_CHANNEL_ON +#undef APC_CHANNEL_AUTO_ON + +#undef AUTOSET_FORCE_OFF +#undef AUTOSET_OFF +#undef AUTOSET_ON + +#undef APC_NO_POWER +#undef APC_LOW_POWER +#undef APC_HAS_POWER #undef APC_ELECTRONICS_MISSING #undef APC_ELECTRONICS_INSTALLED @@ -1610,22 +1690,26 @@ #undef APC_CHARGING #undef APC_FULLY_CHARGED -//update_overlay -#undef APC_UPOVERLAY_CHARGEING0 -#undef APC_UPOVERLAY_CHARGEING1 -#undef APC_UPOVERLAY_CHARGEING2 -#undef APC_UPOVERLAY_EQUIPMENT0 -#undef APC_UPOVERLAY_EQUIPMENT1 -#undef APC_UPOVERLAY_EQUIPMENT2 -#undef APC_UPOVERLAY_LIGHTING0 -#undef APC_UPOVERLAY_LIGHTING1 -#undef APC_UPOVERLAY_LIGHTING2 -#undef APC_UPOVERLAY_ENVIRON0 -#undef APC_UPOVERLAY_ENVIRON1 -#undef APC_UPOVERLAY_ENVIRON2 -#undef APC_UPOVERLAY_LOCKED -#undef APC_UPOVERLAY_OPERATING +#undef APC_DRAIN_TIME +#undef APC_POWER_GAIN +#undef APC_RESET_EMP + +// update_state +#undef UPSTATE_CELL_IN +#undef UPSTATE_COVER_SHIFT +#undef UPSTATE_BROKE +#undef UPSTATE_MAINT +#undef UPSTATE_BLUESCREEN +#undef UPSTATE_WIREEXP + +//update_overlay +#undef UPOVERLAY_OPERATING +#undef UPOVERLAY_LOCKED +#undef UPOVERLAY_CHARGING_SHIFT +#undef UPOVERLAY_EQUIPMENT_SHIFT +#undef UPOVERLAY_LIGHTING_SHIFT +#undef UPOVERLAY_ENVIRON_SHIFT #undef MAXIMUM_COG_REGAIN /*Power module, used for APC construction*/ diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index a0509fbd41..0af16013ec 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -79,7 +79,7 @@ return 0 if(charge < amount) return 0 - charge = (charge - amount) + charge -= amount if(!istype(loc, /obj/machinery/power/apc)) SSblackbox.record_feedback("tally", "cell_used", 1, type) return 1 diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index e37ae56e71..3fe03978bd 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -32,7 +32,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne return FALSE /obj/machinery/gravity_generator/ex_act(severity, target) - if(severity == 1) // Very sturdy. + if(severity >= EXPLODE_DEVASTATE) // Very sturdy. set_broken() /obj/machinery/gravity_generator/blob_act(obj/structure/blob/B) @@ -40,12 +40,13 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne set_broken() /obj/machinery/gravity_generator/zap_act(power, zap_flags) - ..() + . = ..() if(zap_flags & ZAP_MACHINE_EXPLOSIVE) qdel(src)//like the singulo, tesla deletes it. stops it from exploding over and over /obj/machinery/gravity_generator/update_icon_state() icon_state = "[get_status()]_[sprite_number]" + return ..() /obj/machinery/gravity_generator/proc/get_status() return "off" @@ -80,14 +81,19 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne /obj/machinery/gravity_generator/part/get_status() return main_part?.get_status() -/obj/machinery/gravity_generator/part/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) - return main_part.attack_hand(user) +/obj/machinery/gravity_generator/part/attack_hand(mob/user, list/modifiers) + return main_part.attack_hand(user, modifiers) /obj/machinery/gravity_generator/part/set_broken() ..() if(main_part && !(main_part.stat & BROKEN)) main_part.set_broken() +/// Used to eat args +/obj/machinery/gravity_generator/part/proc/on_update_icon(obj/machinery/gravity_generator/source, updates, updated) + SIGNAL_HANDLER + return update_appearance(updates) + // // Generator which spawns with the station. // @@ -124,7 +130,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne var/charge_count = 100 var/current_overlay = null var/broken_state = 0 - var/setting = 1 //Gravity value when on + var/setting = 1 //Gravity value when on /obj/machinery/gravity_generator/main/Destroy() // If we somehow get deleted, remove all of our other parts. investigate_log("was destroyed!", INVESTIGATE_GRAVITY) @@ -149,13 +155,13 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne if(count == 5) // Middle middle = part if(count <= 3) // Their sprite is the top part of the generator - part.density = FALSE + part.density= 0 part.layer = WALL_OBJ_LAYER part.sprite_number = count part.main_part = src parts += part - part.update_icon() - part.RegisterSignal(src, COMSIG_ATOM_UPDATED_ICON, /atom/proc/update_icon) + part.update_appearance() + part.RegisterSignal(src, COMSIG_ATOM_UPDATED_ICON, /obj/machinery/gravity_generator/part/proc/on_update_icon) /obj/machinery/gravity_generator/main/proc/connected_parts() return parts.len == 8 @@ -178,7 +184,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne if(M.stat & BROKEN) M.set_fix() broken_state = FALSE - update_icon() + update_appearance() set_power() // Interaction @@ -188,33 +194,33 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne switch(broken_state) if(GRAV_NEEDS_SCREWDRIVER) if(I.tool_behaviour == TOOL_SCREWDRIVER) - to_chat(user, "You secure the screws of the framework.") + to_chat(user, span_notice("You secure the screws of the framework.")) I.play_tool_sound(src) broken_state++ - update_icon() + update_appearance() return if(GRAV_NEEDS_WELDING) if(I.tool_behaviour == TOOL_WELDER) if(I.use_tool(src, user, 0, volume=50, amount=1)) - to_chat(user, "You mend the damaged framework.") + to_chat(user, span_notice("You mend the damaged framework.")) broken_state++ - update_icon() + update_appearance() return if(GRAV_NEEDS_PLASTEEL) if(istype(I, /obj/item/stack/sheet/plasteel)) var/obj/item/stack/sheet/plasteel/PS = I if(PS.get_amount() >= 10) PS.use(10) - to_chat(user, "You add the plating to the framework.") + to_chat(user, span_notice("You add the plating to the framework.")) playsound(src.loc, 'sound/machines/click.ogg', 75, TRUE) broken_state++ - update_icon() + update_appearance() else - to_chat(user, "You need 10 sheets of plasteel!") + to_chat(user, span_warning("You need 10 sheets of plasteel!")) return if(GRAV_NEEDS_WRENCH) if(I.tool_behaviour == TOOL_WRENCH) - to_chat(user, "You secure the plating to the framework.") + to_chat(user, span_notice("You secure the plating to the framework.")) I.play_tool_sound(src) set_fix() return @@ -238,7 +244,8 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne return data /obj/machinery/gravity_generator/main/ui_act(action, params) - if(..()) + . = ..() + if(.) return switch(action) @@ -270,7 +277,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne charging_state = new_state ? POWER_UP : POWER_DOWN // Startup sequence animation. investigate_log("is now [charging_state == POWER_UP ? "charging" : "discharging"].", INVESTIGATE_GRAVITY) - update_icon() + update_appearance() // Set the state of the gravity. /obj/machinery/gravity_generator/main/proc/set_state(new_state) @@ -291,7 +298,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne investigate_log("was brought offline and there is now no gravity for this level.", INVESTIGATE_GRAVITY) message_admins("The gravity generator was brought offline with no backup generator. [ADMIN_VERBOSEJMP(src)]") - update_icon() + update_appearance() update_list() src.updateUsrDialog() if(alert) @@ -391,13 +398,16 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne // Misc /obj/item/paper/guides/jobs/engi/gravity_gen - info = {" -# Gravity Generator Instructions For Dummies -Surprisingly, gravity isn't that hard to make! All you have to do is inject deadly radioactive minerals into a ball of energy and you have yourself gravity! You can turn the machine on or off when required but you must remember that the generator will EMIT RADIATION when charging or discharging, you can tell it is charging or discharging by the noise it makes, so please WEAR PROTECTIVE CLOTHING.

-### It blew up! -Don't panic! The gravity generator was designed to be easily repaired. If, somehow, the sturdy framework did not survive then please proceed to panic; otherwise follow these steps. -1. Secure the screws of the framework with a screwdriver. -2. Mend the damaged framework with a welding tool. -3. Add additional plasteel plating. -4. Secure the additional plating with a wrench. -"} + name = "paper- 'Generate your own gravity!'" + info = {"

Gravity Generator Instructions For Dummies

+

Surprisingly, gravity isn't that hard to make! All you have to do is inject deadly radioactive minerals into a ball of + energy and you have yourself gravity! You can turn the machine on or off when required but you must remember that the generator + will EMIT RADIATION when charging or discharging, you can tell it is charging or discharging by the noise it makes, so please WEAR PROTECTIVE CLOTHING.

+
+

It blew up!

+

Don't panic! The gravity generator was designed to be easily repaired. If, somehow, the sturdy framework did not survive then + please proceed to panic; otherwise follow these steps.

    +
  1. Secure the screws of the framework with a screwdriver.
  2. +
  3. Mend the damaged framework with a welding tool.
  4. +
  5. Add additional plasteel plating.
  6. +
  7. Secure the additional plating with a wrench.
"} diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 9bbdcf4f66..c2dd77290a 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -104,15 +104,23 @@ /obj/machinery/proc/removeStaticPower(value, powerchannel) addStaticPower(-value, powerchannel) -/obj/machinery/proc/power_change() // called whenever the power settings of the containing area change - // by default, check equipment channel & set flag - // can override if needed - if(powered(power_channel)) - stat &= ~NOPOWER - else +/obj/machinery/proc/power_change() + //SIGNAL_HANDLER + //SHOULD_CALL_PARENT(TRUE) - stat |= NOPOWER - return + if(stat & BROKEN) + return + if(powered(power_channel)) + if(stat & NOPOWER) + SEND_SIGNAL(src, COMSIG_MACHINERY_POWER_RESTORED) + . = TRUE + set_machine_stat(stat & ~NOPOWER) + else + if(!(stat & NOPOWER)) + SEND_SIGNAL(src, COMSIG_MACHINERY_POWER_LOST) + . = TRUE + set_machine_stat(stat | NOPOWER) + update_appearance() // connect the machine to a powernet if a node cable is present on the turf /obj/machinery/power/proc/connect_to_network() diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 9cc289b06d..907c4e7d65 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -63,7 +63,7 @@ assembly = S assembly.glass_type.on_solar_construction(src) obj_integrity = max_integrity - update_icon() + update_appearance() /obj/machinery/power/solar/crowbar_act(mob/user, obj/item/I) playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) @@ -86,11 +86,10 @@ /obj/machinery/power/solar/obj_break(damage_flag) - if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1)) + . = ..() + if(.) playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE) - stat |= BROKEN unset_control() - update_icon() /obj/machinery/power/solar/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) @@ -99,7 +98,7 @@ assembly.forceMove(loc) assembly.give_glass(stat & BROKEN) else - playsound(src, "shatter", 70, 1) + playsound(src, "shatter", 70, TRUE) var/shard = assembly?.glass_type ? assembly.glass_type.shard_type : /obj/item/shard new shard(loc) new shard(loc) @@ -110,16 +109,15 @@ var/matrix/turner = matrix() turner.Turn(azimuth_current) panel.transform = turner - if(stat & BROKEN) - panel.icon_state = "solar_panel-b" - else - panel.icon_state = "solar_panel" + panel.icon_state = "solar_panel[(stat & BROKEN) ? "-b" : null]" /obj/machinery/power/solar/proc/queue_turn(azimuth) needs_to_turn = TRUE azimuth_target = azimuth /obj/machinery/power/solar/proc/queue_update_solar_exposure() + SIGNAL_HANDLER + needs_to_update_solar_exposure = TRUE //updating right away would be wasteful if we're also turning later /obj/machinery/power/solar/proc/update_turn() @@ -127,7 +125,7 @@ if(azimuth_current != azimuth_target) azimuth_current = azimuth_target occlusion_setup() - update_icon() + update_appearance() needs_to_update_solar_exposure = TRUE ///trace towards sun to see if we're in shadow @@ -173,7 +171,7 @@ control.gen += sgen //Bit of a hack but this whole type is a hack -/obj/machinery/power/solar/fake/Initialize(turf/loc, obj/item/solar_assembly/S) +/obj/machinery/power/solar/fake/Initialize(mapload, obj/item/solar_assembly/S) . = ..() UnregisterSignal(SSsun, COMSIG_SUN_MOVED) @@ -199,6 +197,16 @@ var/static/list/allowed_sheets = typecacheof(list(/obj/item/stack/sheet/glass, /obj/item/stack/sheet/rglass, /obj/item/stack/sheet/plasmaglass, /obj/item/stack/sheet/plasmarglass, /obj/item/stack/sheet/titaniumglass, /obj/item/stack/sheet/plastitaniumglass)) + var/random_offset = 6 //amount in pixels an unanchored assembly may be offset by + +/obj/item/solar_assembly/Initialize(mapload) + . = ..() + if(!anchored && !pixel_x && !pixel_y) + randomise_offset(random_offset) + +/obj/item/solar_assembly/proc/randomise_offset(amount) + pixel_x = rand(-amount, amount) + pixel_y = rand(-amount, amount) // Give back the glass type we were supplied with /obj/item/solar_assembly/proc/give_glass(device_broken) @@ -212,20 +220,21 @@ glass_type.forceMove(Tsec) glass_type = null +/obj/item/solar_assembly/set_anchored(anchorvalue) + . = ..() + if(isnull(.)) + return + randomise_offset(anchored ? 0 : random_offset) /obj/item/solar_assembly/attackby(obj/item/W, mob/user, params) if(W.tool_behaviour == TOOL_WRENCH && isturf(loc)) if(isinspace()) to_chat(user, "You can't secure [src] here.") return - anchored = !anchored - if(anchored) - user.visible_message("[user] wrenches the solar assembly into place.", "You wrench the solar assembly into place.") - W.play_tool_sound(src, 75) - else - user.visible_message("[user] unwrenches the solar assembly from its place.", "You unwrench the solar assembly from its place.") - W.play_tool_sound(src, 75) - return 1 + set_anchored(!anchored) + user.visible_message("[user] [anchored ? null : "un"]wrenches the solar assembly into place.", "You [anchored ? null : "un"]wrench the solar assembly into place.") + W.play_tool_sound(src, 75) + return TRUE if(is_type_in_typecache(W, allowed_sheets)) if(!anchored) @@ -249,16 +258,16 @@ if(istype(W, /obj/item/electronics/tracker)) if(!user.temporarilyRemoveItemFromInventory(W)) return - tracker = 1 + tracker = TRUE qdel(W) user.visible_message("[user] inserts the electronics into the solar assembly.", "You insert the electronics into the solar assembly.") return 1 else if(W.tool_behaviour == TOOL_CROWBAR) new /obj/item/electronics/tracker(src.loc) - tracker = 0 + tracker = FALSE user.visible_message("[user] takes out the electronics from the solar assembly.", "You take out the electronics from the solar assembly.") - return 1 + return TRUE return ..() // @@ -322,11 +331,12 @@ if(stat & NOPOWER) . += mutable_appearance(icon, "[icon_keyboard]_off") return + . += mutable_appearance(icon, icon_keyboard) if(stat & BROKEN) . += mutable_appearance(icon, "[icon_state]_broken") - else - . += mutable_appearance(icon, icon_screen) + return + . += mutable_appearance(icon, icon_screen) /obj/machinery/power/solar_control/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -347,7 +357,8 @@ return data /obj/machinery/power/solar_control/ui_act(action, params) - if(..()) + . = ..() + if(.) return if(action == "azimuth") var/adjust = text2num(params["adjust"]) @@ -381,10 +392,10 @@ return TRUE return FALSE -/obj/machinery/power/solar_control/attackby(obj/item/I, mob/user, params) +/obj/machinery/power/solar_control/attackby(obj/item/I, mob/living/user, params) if(I.tool_behaviour == TOOL_SCREWDRIVER) - if(I.use_tool(src, user, 20, volume = 50)) - if(src.stat & BROKEN) + if(I.use_tool(src, user, 20, volume=50)) + if (src.stat & BROKEN) to_chat(user, "The broken glass falls out.") var/obj/structure/frame/computer/A = new /obj/structure/frame/computer( src.loc ) new /obj/item/shard( src.loc ) @@ -394,7 +405,7 @@ A.circuit = M A.state = 3 A.icon_state = "3" - A.anchored = TRUE + A.set_anchored(TRUE) qdel(src) else to_chat(user, "You disconnect the monitor.") @@ -405,7 +416,7 @@ A.circuit = M A.state = 4 A.icon_state = "4" - A.anchored = TRUE + A.set_anchored(TRUE) qdel(src) else if(user.a_intent != INTENT_HARM && !(I.item_flags & NOBLUDGEON)) attack_hand(user) @@ -423,10 +434,9 @@ playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) /obj/machinery/power/solar_control/obj_break(damage_flag) - if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1)) + . = ..() + if(.) playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE) - stat |= BROKEN - update_icon() /obj/machinery/power/solar_control/process() lastgen = gen @@ -437,6 +447,8 @@ ///Ran every time the sun updates. /obj/machinery/power/solar_control/proc/timed_track() + SIGNAL_HANDLER + if(track == SOLAR_TRACK_TIMED) azimuth_target += azimuth_rate set_panels(azimuth_target) @@ -453,20 +465,12 @@ for(var/obj/machinery/power/solar/S in connected_panels) S.queue_turn(azimuth) -/obj/machinery/power/solar_control/power_change() - ..() - update_icon() - // // MISC // /obj/item/paper/guides/jobs/engi/solars - info = {" -# Welcome! -At greencorps we love the environment, and space. With this package you are able to help mother nature and produce energy without any usage of fossil fuel or plasma! Singularity energy is dangerous while solar energy is safe, which is why it's better. Now here is how you setup your own solar array. -You can make a solar panel by wrenching the solar assembly onto a cable node. Adding a glass panel, reinforced or regular glass will do, will finish the construction of your solar panel. It is that easy!

Now after setting up 19 more of these solar panels you will want to create a solar tracker to keep track of our mother nature's gift, the sun. These are the same steps as before except you insert the tracker equipment circuit into the assembly before performing the final step of adding the glass. You now have a tracker! Now the last step is to add a computer to calculate the sun's movements and to send commands to the solar panels to change direction with the sun. Setting up the solar computer is the same as setting up any computer, so you should have no trouble in doing that. You do need to put a wire node under the computer, and the wire needs to be connected to the tracker. -Congratulations, you should have a working solar array. If you are having trouble, here are some tips. Make sure all solar equipment are on a cable node, even the computer. You can always deconstruct your creations if you make a mistake.

That's all to it, be safe, be green! -"} + name = "paper- 'Going green! Setup your own solar array instructions.'" + info = "

Welcome

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

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

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

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

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

" #undef SOLAR_GEN_RATE diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index b1e1ff2208..b802cc7b88 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -12,33 +12,17 @@ #define OBJECT (LOWEST + 1) #define LOWEST (1) -#define PLASMA_HEAT_PENALTY 15 // Higher == Bigger heat and waste penalty from having the crystal surrounded by this gas. Negative numbers reduce penalty. -#define OXYGEN_HEAT_PENALTY 1 -#define PLUOXIUM_HEAT_PENALTY -1 -#define TRITIUM_HEAT_PENALTY 10 -#define CO2_HEAT_PENALTY 0.1 -#define NITROGEN_HEAT_PENALTY -1.5 -#define BZ_HEAT_PENALTY 5 -#define H2O_HEAT_PENALTY 8 -//#define FREON_HEAT_PENALTY -10 //very good heat absorbtion and less plasma and o2 generation -//#define HYDROGEN_HEAT_PENALTY 10 // similar heat penalty as tritium (dangerous) - - -//All of these get divided by 10-bzcomp * 5 before having 1 added and being multiplied with power to determine rads -//Keep the negative values here above -10 and we won't get negative rads -#define OXYGEN_TRANSMIT_MODIFIER 1.5 //Higher == Bigger bonus to power generation. -#define PLASMA_TRANSMIT_MODIFIER 4 -#define BZ_TRANSMIT_MODIFIER -2 -#define TRITIUM_TRANSMIT_MODIFIER 30 //We divide by 10, so this works out to 3 -#define PLUOXIUM_TRANSMIT_MODIFIER -5 //Should halve the power output -#define H2O_TRANSMIT_MODIFIER 2 -//#define HYDROGEN_TRANSMIT_MODIFIER 25 //increase the radiation emission, but less than the trit (2.5) - -#define BZ_RADIOACTIVITY_MODIFIER 5 //Improves the effect of transmit modifiers - -#define N2O_HEAT_RESISTANCE 6 //Higher == Gas makes the crystal more resistant against heat damage. -#define PLUOXIUM_HEAT_RESISTANCE 3 -//#define HYDROGEN_HEAT_RESISTANCE 2 // just a bit of heat resistance to spice it up +/datum/auxgm/proc/add_supermatter_properties(datum/gas/gas) + var/g = gas.id + var/list/props = src.supermatter + if(gas.powermix || gas.heat_penalty || gas.transmit_modifier || gas.radioactivity_modifier || gas.heat_resistance || gas.powerloss_inhibition) + props[HEAT_PENALTY][g] = gas.heat_penalty + props[TRANSMIT_MODIFIER][g] = gas.transmit_modifier + props[RADIOACTIVITY_MODIFIER][g] = gas.radioactivity_modifier + props[HEAT_RESISTANCE][g] = gas.heat_resistance + props[POWERLOSS_INHIBITION][g] = gas.powerloss_inhibition + props[POWER_MIX][g] = gas.powermix + props[ALL_SUPERMATTER_GASES] += g #define POWERLOSS_INHIBITION_GAS_THRESHOLD 0.20 //Higher == Higher percentage of inhibitor gas needed before the charge inertia chain reaction effect starts. #define POWERLOSS_INHIBITION_MOLE_THRESHOLD 20 //Higher == More moles of the gas are needed before the charge inertia chain reaction effect starts. //Scales powerloss inhibition down until this amount of moles is reached @@ -55,7 +39,8 @@ #define DAMAGE_INCREASE_MULTIPLIER 0.25 -#define THERMAL_RELEASE_MODIFIER 5 //Higher == less heat released during reaction, not to be confused with the above values +#define THERMAL_RELEASE_MODIFIER 350 //Higher == more heat released during reaction, not to be confused with the above values +#define THERMAL_RELEASE_CAP_MODIFIER 250 //Higher == lower cap on how much heat can be released per tick--currently 1.3x old value #define PLASMA_RELEASE_MODIFIER 750 //Higher == less plasma released by reaction #define OXYGEN_RELEASE_MODIFIER 325 //Higher == less oxygen released at high temperature/power @@ -116,7 +101,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) ///The portion of the gasmix we're on that we should remove var/gasefficency = 0.15 ///Used for changing icon states for diff base sprites - var/base_icon_state = "darkmatter" + base_icon_state = "darkmatter" ///Are we exploding? var/final_countdown = FALSE @@ -148,90 +133,17 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/power = 0 ///Determines the rate of positve change in gas comp values var/gas_change_rate = 0.05 - ///The list of gases we will be interacting with in process_atoms() - var/list/gases_we_care_about = list( - GAS_O2, - GAS_H2O, - GAS_PLASMA, - GAS_CO2, - GAS_NITROUS, - GAS_N2, - GAS_PLUOXIUM, - GAS_TRITIUM, - GAS_BZ, -// /datum/gas/freon, -// /datum/gas/hydrogen, - ) - ///The list of gases mapped against their current comp. We use this to calculate different values the supermatter uses, like power or heat resistance. It doesn't perfectly match the air around the sm, instead moving up at a rate determined by gas_change_rate per call. Ranges from 0 to 1 - var/list/gas_comp = list( - GAS_O2 = 0, - GAS_H2O = 0, - GAS_PLASMA = 0, - GAS_CO2 = 0, - GAS_NITROUS = 0, - GAS_N2 = 0, - GAS_PLUOXIUM = 0, - GAS_TRITIUM = 0, - GAS_BZ = 0, -// /datum/gas/freon = 0, -// /datum/gas/hydrogen = 0, - ) - ///The list of gases mapped against their transmit values. We use it to determine the effect different gases have on radiation - var/list/gas_trans = list( - GAS_O2 = OXYGEN_TRANSMIT_MODIFIER, - GAS_H2O = H2O_TRANSMIT_MODIFIER, - GAS_PLASMA = PLASMA_TRANSMIT_MODIFIER, - GAS_PLUOXIUM = PLUOXIUM_TRANSMIT_MODIFIER, - GAS_TRITIUM = TRITIUM_TRANSMIT_MODIFIER, - GAS_BZ = BZ_TRANSMIT_MODIFIER, -// /datum/gas/hydrogen = HYDROGEN_TRANSMIT_MODIFIER, - ) - ///The list of gases mapped against their heat penaltys. We use it to determin molar and heat output - var/list/gas_heat = list( - GAS_O2 = OXYGEN_HEAT_PENALTY, - GAS_H2O = H2O_HEAT_PENALTY, - GAS_PLASMA = PLASMA_HEAT_PENALTY, - GAS_CO2 = CO2_HEAT_PENALTY, - GAS_N2 = NITROGEN_HEAT_PENALTY, - GAS_PLUOXIUM = PLUOXIUM_HEAT_PENALTY, - GAS_TRITIUM = TRITIUM_HEAT_PENALTY, - GAS_BZ = BZ_HEAT_PENALTY, -// /datum/gas/freon = FREON_HEAT_PENALTY, -// /datum/gas/hydrogen = HYDROGEN_HEAT_PENALTY, - ) - ///The list of gases mapped against their heat resistance. We use it to moderate heat damage. - var/list/gas_resist = list( - GAS_NITROUS = N2O_HEAT_RESISTANCE, - GAS_PLUOXIUM = PLUOXIUM_HEAT_RESISTANCE, -// /datum/gas/hydrogen = HYDROGEN_HEAT_RESISTANCE, - ) - ///The list of gases mapped against their powermix ratio - var/list/gas_powermix = list( - GAS_O2 = 1, - GAS_H2O = 1, - GAS_PLASMA = 1, - GAS_CO2 = 1, - GAS_N2 = -1, - GAS_PLUOXIUM = -1, - GAS_TRITIUM = 1, - GAS_BZ = 1, -// /datum/gas/freon = -1, -// /datum/gas/hydrogen = 1, - ) + var/list/gas_comp = list() ///The last air sample's total molar count, will always be above or equal to 0 var/combined_gas = 0 ///Affects the power gain the sm experiances from heat var/gasmix_power_ratio = 0 - ///Affects the amount of o2 and plasma the sm outputs, along with the heat it makes. - var/dynamic_heat_modifier = 1 ///Affects the amount of damage and minimum point at which the sm takes heat damage var/dynamic_heat_resistance = 1 ///Uses powerloss_dynamic_scaling and combined_gas to lessen the effects of our powerloss functions var/powerloss_inhibitor = 1 ///Based on co2 percentage, slowly moves between 0 and 1. We use it to calc the powerloss_inhibitor var/powerloss_dynamic_scaling= 0 - ///Affects the amount of radiation the sm makes. We multiply this with power to find the rads. - var/power_transmission_bonus = 0 ///Used to increase or lessen the amount of damage the sm takes from heat based on molar counts. var/mole_heat_penalty = 0 ///Takes the energy throwing things into the sm generates and slowly turns it into actual power @@ -241,7 +153,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) ///How much the bullets damage should be multiplied by when it is added to the internal variables var/bullet_energy = 2 ///How much hallucination should we produce per unit of power? - var/hallucination_power = 0.1 + var/hallucination_power = 0.05 // 2 seconds per second at a distance of 7 with a typical nitrogen setup ///Our internal radio var/obj/item/radio/radio @@ -481,6 +393,10 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) removed = new() damage_archived = damage + var/list/gas_info = GLOB.gas_data.supermatter + + var/list/gases_we_care_about = gas_info[ALL_SUPERMATTER_GASES] + /******** EXPERIMENTAL, HUGBOXY AS HELL CITADEL CHANGES: Even in a vaccum, update gas composition and modifiers. This means that the SM will usually have a very small explosion if it ends up being breached to space, @@ -491,7 +407,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(takes_damage) damage += max((power / 1000) * DAMAGE_INCREASE_MULTIPLIER, 0.1) // always does at least some damage combined_gas = max(0, combined_gas - 0.5) // Slowly wear off. - for(var/gasID in gases_we_care_about) + for(var/gasID in gas_comp) gas_comp[gasID] = max(0, gas_comp[gasID] - 0.05) //slowly ramp down else if(takes_damage) @@ -531,46 +447,49 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //Prevents huge bursts of gas/heat when a large amount of something is introduced //They range between 0 and 1 for(var/gasID in gases_we_care_about) + if(!(gasID in gas_comp)) + gas_comp[gasID] = 0 gas_comp[gasID] += clamp(max(removed.get_moles(gasID)/combined_gas, 0) - gas_comp[gasID], -1, gas_change_rate) - var/list/heat_mod = gases_we_care_about.Copy() - var/list/transit_mod = gases_we_care_about.Copy() - var/list/resistance_mod = gases_we_care_about.Copy() + var/list/threshold_mod = gases_we_care_about.Copy() + + var/list/powermix = gas_info[POWER_MIX] + var/list/heat = gas_info[HEAT_PENALTY] + var/list/transmit = gas_info[TRANSMIT_MODIFIER] + var/list/resist = gas_info[HEAT_RESISTANCE] + var/list/radioactivity = gas_info[RADIOACTIVITY_MODIFIER] + var/list/inhibition = gas_info[POWERLOSS_INHIBITION] //We're concerned about pluoxium being too easy to abuse at low percents, so we make sure there's a substantial amount. var/pluoxiumbonus = (gas_comp[GAS_PLUOXIUM] >= 0.15) //makes pluoxium only work at 15%+ - var/h2obonus = 1 - (gas_comp[GAS_H2O] * 0.25)//At max this value should be 0.75 + var/h2obonus = 1 - (gas_comp[GAS_H2O] * 0.25)//At min this value should be 0.75 // var/freonbonus = (gas_comp[/datum/gas/freon] <= 0.03) //Let's just yeet power output if this shit is high - heat_mod[GAS_PLUOXIUM] = pluoxiumbonus - transit_mod[GAS_PLUOXIUM] = pluoxiumbonus - resistance_mod[GAS_PLUOXIUM] = pluoxiumbonus + threshold_mod[GAS_PLUOXIUM] = pluoxiumbonus //No less then zero, and no greater then one, we use this to do explosions and heat to power transfer //Be very careful with modifing this var by large amounts, and for the love of god do not push it past 1 gasmix_power_ratio = 0 - for(var/gasID in gas_powermix) - gasmix_power_ratio += gas_comp[gasID] * gas_powermix[gasID] - gasmix_power_ratio = clamp(gasmix_power_ratio, 0, 1) - - //Minimum value of -10, maximum value of 23. Effects plasma and o2 output and the output heat - dynamic_heat_modifier = 0 - for(var/gasID in gas_heat) - dynamic_heat_modifier += gas_comp[gasID] * gas_heat[gasID] * (isnull(heat_mod[gasID]) ? 1 : heat_mod[gasID]) - dynamic_heat_modifier *= h2obonus - dynamic_heat_modifier = max(dynamic_heat_modifier, 0.5) - - //Value between 1 and 10. Effects the damage heat does to the crystal + //Affects the amount of o2 and plasma the sm outputs, along with the heat it makes. + var/dynamic_heat_modifier = 0 + //Effects the damage heat does to the crystal. dynamic_heat_resistance = 0 - for(var/gasID in gas_resist) - dynamic_heat_resistance += gas_comp[gasID] * gas_resist[gasID] * (isnull(resistance_mod[gasID]) ? 1 : resistance_mod[gasID]) - dynamic_heat_resistance = max(dynamic_heat_resistance, 1) - - //Value between -5 and 30, used to determine radiation output as it concerns things like collectors. - power_transmission_bonus = 0 - for(var/gasID in gas_trans) - power_transmission_bonus += gas_comp[gasID] * gas_trans[gasID] * (isnull(transit_mod[gasID]) ? 1 : transit_mod[gasID]) + //We multiply this with power to find the rads. + var/power_transmission_bonus = 0 + var/powerloss_inhibition_gas = 0 + var/radioactivity_modifier = 0 + for(var/gasID in gas_comp) + var/this_comp = gas_comp[gasID] * (isnull(threshold_mod[gasID] ? 1 : threshold_mod[gasID])) + gasmix_power_ratio += this_comp * powermix[gasID] + dynamic_heat_modifier += this_comp * heat[gasID] + dynamic_heat_resistance += this_comp * resist[gasID] + power_transmission_bonus += this_comp * transmit[gasID] + powerloss_inhibition_gas += this_comp * inhibition[gasID] + radioactivity_modifier += this_comp * radioactivity[gasID] + dynamic_heat_modifier *= h2obonus power_transmission_bonus *= h2obonus + gasmix_power_ratio = clamp(gasmix_power_ratio, 0, 1) + dynamic_heat_modifier = max(dynamic_heat_modifier, 0.5) //more moles of gases are harder to heat than fewer, so let's scale heat damage around them mole_heat_penalty = max(combined_gas / MOLE_HEAT_PENALTY, 0.25) @@ -578,11 +497,12 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //Ramps up or down in increments of 0.02 up to the proportion of co2 //Given infinite time, powerloss_dynamic_scaling = co2comp //Some value between 0 and 1 - if (combined_gas > POWERLOSS_INHIBITION_MOLE_THRESHOLD && gas_comp[GAS_CO2] > POWERLOSS_INHIBITION_GAS_THRESHOLD) //If there are more then 20 mols, and more then 20% co2 - powerloss_dynamic_scaling = clamp(powerloss_dynamic_scaling + clamp(gas_comp[GAS_CO2] - powerloss_dynamic_scaling, -0.02, 0.02), 0, 1) + if (combined_gas > POWERLOSS_INHIBITION_MOLE_THRESHOLD && powerloss_inhibition_gas > POWERLOSS_INHIBITION_GAS_THRESHOLD) //If there are more then 20 mols, and more then 20% co2 + powerloss_dynamic_scaling = clamp(powerloss_dynamic_scaling + clamp(powerloss_inhibition_gas - powerloss_dynamic_scaling, -0.02, 0.02), 0, 1) else powerloss_dynamic_scaling = clamp(powerloss_dynamic_scaling - 0.05, 0, 1) - //Ranges from 0 to 1(1-(value between 0 and 1 * ranges from 1 to 1.5(mol / 500))) + //Ranges from 0 to 1 (1-(value between 0 and 1 * ranges from 1 to 1.5(mol / 500))) + //0 means full inhibition, 1 means no inhibition //We take the mol count, and scale it to be our inhibitor powerloss_inhibitor = clamp(1-(powerloss_dynamic_scaling * clamp(combined_gas/POWERLOSS_INHIBITION_MOLE_BOOST_THRESHOLD, 1, 1.5)), 0, 1) @@ -605,36 +525,32 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) temp_factor = 30 icon_state = base_icon_state + var/effective_temperature = min(removed.return_temperature(), 2500 * dynamic_heat_modifier) + //if there is more pluox and n2 then anything else, we receive no power increase from heat if(power_changes) - power = max((removed.return_temperature() * temp_factor / T0C) * gasmix_power_ratio + power, 0) + power = max((effective_temperature * temp_factor / T0C) * gasmix_power_ratio + power, 0) if(prob(50)) //(1 + (tritRad + pluoxDampen * bzDampen * o2Rad * plasmaRad / (10 - bzrads))) * freonbonus - radiation_pulse(src, power * max(0, (1 + (power_transmission_bonus/(10-(gas_comp[GAS_BZ] * BZ_RADIOACTIVITY_MODIFIER)))) * 1))//freonbonus))// RadModBZ(500%) - if(gas_comp[GAS_BZ] >= 0.4 && prob(30 * gas_comp[GAS_BZ])) - src.fire_nuclear_particle() // Start to emit radballs at a maximum of 30% chance per tick + radiation_pulse(src, power * max(0, (1 + (power_transmission_bonus/(10-radioactivity_modifier)))))//freonbonus))// RadModBZ(500%) + if(radioactivity_modifier >= 2 && prob(6 * radioactivity_modifier)) + src.fire_nuclear_particle() //Power * 0.55 * a value between 1 and 0.8 var/device_energy = power * REACTION_POWER_MODIFIER - //To figure out how much temperature to add each tick, consider that at one atmosphere's worth - //of pure oxygen, with all four lasers firing at standard energy and no N2 present, at room temperature - //that the device energy is around 2140. At that stage, we don't want too much heat to be put out - //Since the core is effectively "cold" - - //Also keep in mind we are only adding this temperature to (efficiency)% of the one tile the rock - //is on. An increase of 4*C @ 25% efficiency here results in an increase of 1*C / (#tilesincore) overall. - //Power * 0.55 * (some value between 1.5 and 23) / 5 - removed.set_temperature(removed.return_temperature() + ((device_energy * dynamic_heat_modifier) / THERMAL_RELEASE_MODIFIER)) - //We can only emit so much heat, that being 57500 - removed.set_temperature(max(0, min(removed.return_temperature(), 2500 * dynamic_heat_modifier))) - + var/max_temp_increase = effective_temperature + ((device_energy * dynamic_heat_modifier) / THERMAL_RELEASE_CAP_MODIFIER) //Calculate how much gas to release //Varies based on power and gas content removed.adjust_moles(GAS_PLASMA, max((device_energy * dynamic_heat_modifier) / PLASMA_RELEASE_MODIFIER, 0)) //Varies based on power, gas content, and heat - removed.adjust_moles(GAS_O2, max(((device_energy + removed.return_temperature() * dynamic_heat_modifier) - T0C) / OXYGEN_RELEASE_MODIFIER, 0)) + removed.adjust_moles(GAS_O2, max(((device_energy + effective_temperature * dynamic_heat_modifier) - T0C) / OXYGEN_RELEASE_MODIFIER, 0)) + + if(removed.return_temperature() < max_temp_increase) + removed.adjust_heat(device_energy * dynamic_heat_modifier * THERMAL_RELEASE_MODIFIER) + removed.set_temperature(min(removed.return_temperature(), max_temp_increase)) + if(produces_gas) env.merge(removed) @@ -648,6 +564,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) for(var/mob/living/carbon/human/l in fov_viewers(src, HALLUCINATION_RANGE(power))) // If they can see it without mesons on. Bad on them. if(!istype(l.glasses, /obj/item/clothing/glasses/meson)) var/D = sqrt(1 / max(1, get_dist(l, src))) + if(!l.hallucination) + to_chat(l, "Looking at the supermatter unprotected gives you a headache...") l.hallucination += power * hallucination_power * D l.hallucination = clamp(l.hallucination, 0, 200) for(var/mob/living/l in range(src, round((power / 100) ** 0.25))) @@ -681,13 +599,13 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) zap_icon = SLIGHTLY_CHARGED_ZAP_ICON_STATE //Uncaps the zap damage, it's maxed by the input power //Objects take damage now - flags |= (ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE) + flags |= (ZAP_MOB_DAMAGE) zap_count = 3 if(CRITICAL_POWER_PENALTY_THRESHOLD to INFINITY) zap_icon = OVER_9000_ZAP_ICON_STATE //It'll stun more now, and damage will hit harder, gloves are no garentee. //Machines go boom - flags |= (ZAP_MOB_STUN | ZAP_MACHINE_EXPLOSIVE | ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE) + flags |= (ZAP_MOB_STUN | ZAP_MOB_DAMAGE) zap_count = 4 //Now we deal with damage shit if (damage > damage_penalty_point && prob(20)) @@ -1140,9 +1058,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(zapdir) . = zapdir - //Going boom should be rareish - if(prob(80)) - zap_flags &= ~ZAP_MACHINE_EXPLOSIVE if(target_type == COIL) //In the best situation we can expect this to grow up to 2120kw before a delam/IT'S GONE TOO FAR FRED SHUT IT DOWN //The formula for power gen is zap_str * zap_mod / 2 * capacitor rating, between 1 and 4 diff --git a/code/modules/procedural_mapping/mapGenerators/repair.dm b/code/modules/procedural_mapping/mapGenerators/repair.dm index d9380a40dd..a36ac88d6c 100644 --- a/code/modules/procedural_mapping/mapGenerators/repair.dm +++ b/code/modules/procedural_mapping/mapGenerators/repair.dm @@ -41,6 +41,7 @@ set waitfor = FALSE var/turf/B = L atoms += B + B.assemble_baseturfs(B.type) for(var/A in B) atoms += A if(istype(A,/obj/structure/cable)) diff --git a/code/modules/projectiles/ammunition/energy/special.dm b/code/modules/projectiles/ammunition/energy/special.dm index 2bf7c06ec6..0cea7a361d 100644 --- a/code/modules/projectiles/ammunition/energy/special.dm +++ b/code/modules/projectiles/ammunition/energy/special.dm @@ -32,12 +32,13 @@ /obj/item/ammo_casing/energy/temp projectile_type = /obj/item/projectile/temp select_name = "freeze" - e_cost = 250 + e_cost = 50 // twenty shots before emptying fire_sound = 'sound/weapons/pulse3.ogg' /obj/item/ammo_casing/energy/temp/hot projectile_type = /obj/item/projectile/temp/hot select_name = "bake" + fire_sound = 'sound/weapons/pulse2.ogg' /obj/item/ammo_casing/energy/meteor projectile_type = /obj/item/projectile/meteor diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 0f5934e8fd..34e9247184 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -44,7 +44,7 @@ cell.use(round(cell.charge * severity/100)) chambered = null //we empty the chamber recharge_newshot() //and try to charge a new shot - update_icon() + update_appearance() /obj/item/gun/energy/get_cell() return cell @@ -61,7 +61,7 @@ recharge_newshot(TRUE) if(selfcharge) START_PROCESSING(SSobj, src) - update_icon() + update_appearance() /obj/item/gun/energy/ComponentInitialize() . = ..() @@ -74,7 +74,7 @@ /obj/item/gun/energy/handle_atom_del(atom/A) if(A == cell) cell = null - update_icon() + update_appearance() return ..() /obj/item/gun/energy/examine(mob/user) @@ -100,7 +100,7 @@ cell.give(100) if(!chambered) //if empty chamber we try to charge a new shot recharge_newshot(TRUE) - update_icon() + update_appearance() // ATTACK SELF IGNORING PARENT RETURN VALUE /obj/item/gun/energy/attack_self(mob/living/user) @@ -174,7 +174,7 @@ if(user_for_feedback) to_chat(user_for_feedback, "[src] is now set to [C.select_name || C].") post_set_firemode() - update_icon(TRUE) + update_appearance() /obj/item/gun/energy/proc/post_set_firemode(recharge_newshot = TRUE) if(recharge_newshot) diff --git a/code/modules/projectiles/guns/energy/laser_gatling.dm b/code/modules/projectiles/guns/energy/laser_gatling.dm index 716cc6f31d..a0274d76d7 100644 --- a/code/modules/projectiles/guns/energy/laser_gatling.dm +++ b/code/modules/projectiles/guns/energy/laser_gatling.dm @@ -68,8 +68,8 @@ if(!M.incapacitated()) - if(istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + if(istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) /obj/item/minigunpack/update_icon_state() diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index f965100846..15acd40172 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -310,9 +310,10 @@ /obj/item/gun/energy/temperature name = "temperature gun" icon_state = "freezegun" + item_state = null desc = "A gun that changes temperatures." ammo_type = list(/obj/item/ammo_casing/energy/temp, /obj/item/ammo_casing/energy/temp/hot) - cell_type = "/obj/item/stock_parts/cell/high" + shaded_charge = TRUE pin = null /obj/item/gun/energy/temperature/security diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index 9d9f6aeb83..2ef974a450 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -280,7 +280,7 @@ /obj/item/gun/energy/beam_rifle/onMouseDown(object, location, params, mob/mob) if(istype(mob)) set_user(mob) - if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher)) + if(istype(object, /atom/movable/screen) && !istype(object, /atom/movable/screen/click_catcher)) return if((object in mob.contents) || (object == mob)) return @@ -288,7 +288,7 @@ return ..() /obj/item/gun/energy/beam_rifle/onMouseUp(object, location, params, mob/M) - if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher)) + if(istype(object, /atom/movable/screen) && !istype(object, /atom/movable/screen/click_catcher)) return process_aim() if(fire_check() && can_trigger_gun(M)) diff --git a/code/modules/projectiles/guns/misc/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm index dc2a1df03a..39b7cbf540 100644 --- a/code/modules/projectiles/guns/misc/syringe_gun.dm +++ b/code/modules/projectiles/guns/misc/syringe_gun.dm @@ -114,7 +114,7 @@ can_unsuppress = FALSE /obj/item/gun/syringe/dart/Initialize() - ..() + . = ..() chambered = new /obj/item/ammo_casing/syringegun/dart(src) /obj/item/gun/syringe/dart/attackby(obj/item/A, mob/user, params, show_msg = TRUE) diff --git a/code/modules/projectiles/projectile/bullets/dart_syringe.dm b/code/modules/projectiles/projectile/bullets/dart_syringe.dm index bc2a7c40fb..318acb66b5 100644 --- a/code/modules/projectiles/projectile/bullets/dart_syringe.dm +++ b/code/modules/projectiles/projectile/bullets/dart_syringe.dm @@ -60,6 +60,8 @@ if(M.can_inject(null, FALSE, def_zone, piercing)) // Pass the hit zone to see if it can inject by whether it hit the head or the body. ..(target, blocked, TRUE) for(var/datum/reagent/medicine/R in reagents.reagent_list) //OD prevention time! + if(R.type in GLOB.blacklisted_medchems) + continue if(M.reagents.has_reagent(R.type)) if(R.overdose_threshold == 0 || emptrig == TRUE) //Is there a possible OD? M.reagents.add_reagent(R.type, R.volume) diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index 6f272dab40..acec1ef94f 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -31,6 +31,11 @@ else if(tase_duration && (C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE) && !HAS_TRAIT(C, TRAIT_TASED_RESISTANCE)) C.apply_status_effect(strong_tase? STATUS_EFFECT_TASED : STATUS_EFFECT_TASED_WEAK, tase_duration) addtimer(CALLBACK(C, /mob/living/carbon.proc/do_jitter_animation, jitter), 5) + else if(iscyborg(target)) + target.visible_message(span_danger("A shower of sparks emit from [target] on impact from [src]!")) + do_sparks(1, TRUE, target) + var/mob/living/silicon/robot/R = target + R.vtec_disable(10 SECONDS) /obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet do_sparks(1, TRUE, src) diff --git a/code/modules/projectiles/projectile/special/temperature.dm b/code/modules/projectiles/projectile/special/temperature.dm index 71e6e79f59..ec23af6748 100644 --- a/code/modules/projectiles/projectile/special/temperature.dm +++ b/code/modules/projectiles/projectile/special/temperature.dm @@ -1,9 +1,17 @@ /obj/item/projectile/temp name = "freeze beam" icon_state = "ice_2" + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE damage = 0 + light_range = 2 damage_type = BURN nodamage = FALSE + hitsound = 'sound/weapons/frost.ogg' + hitsound_wall = 'sound/weapons/frost.ogg' + ricochets_max = 50 //Honk! + ricochet_chance = 80 + is_reflectable = TRUE + light_color = LIGHT_COLOR_BLUE flag = "energy" var/temperature = 100 @@ -15,7 +23,12 @@ /obj/item/projectile/temp/hot name = "heat beam" + icon_state = "lava" + damage = 10 + hitsound = 'sound/weapons/sear.ogg' + hitsound_wall = 'sound/weapons/effects/searwall.ogg' temperature = 400 + light_color = LIGHT_COLOR_RED /obj/item/projectile/temp/cryo name = "cryo beam" diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index fd6204a8e3..922e14e580 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -62,6 +62,7 @@ var/fermiIsReacting = FALSE //that prevents multiple reactions from occurring (i.e. add_reagent calls to process_reactions(), this stops any extra reactions.) var/fermiReactID //instance of the chem reaction used during a fermireaction, kept here so it's cache isn't lost between loops/procs. var/value_multiplier = DEFAULT_REAGENTS_VALUE //used for cargo reagents selling. + var/force_alt_taste = FALSE /datum/reagents/New(maximum=100, new_flags = NONE, new_value = DEFAULT_REAGENTS_VALUE) maximum_volume = maximum @@ -280,71 +281,114 @@ R.handle_reactions() return amount -/datum/reagents/proc/metabolize(mob/living/carbon/C, can_overdose = FALSE, liverless = FALSE) +/** + * Triggers metabolizing for all the reagents in this holder + * + * Arguments: + * * mob/living/carbon/carbon - The mob to metabolize in, if null it uses [/datum/reagents/var/my_atom] + * * delta_time - the time in server seconds between proc calls (when performing normally it will be 2) + * * times_fired - the number of times the owner's life() tick has been called aka The number of times SSmobs has fired + * * can_overdose - Allows overdosing + * * liverless - Stops reagents that aren't set as [/datum/reagent/var/self_consuming] from metabolizing + */ +/datum/reagents/proc/metabolize(mob/living/carbon/owner, delta_time, times_fired, can_overdose = FALSE, liverless = FALSE) var/list/cached_reagents = reagent_list - var/list/cached_addictions = addiction_list - if(C) - expose_temperature(C.bodytemperature, 0.25) - var/need_mob_update = 0 - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(QDELETED(R.holder)) - continue - if(liverless && !R.self_consuming) //need to be metabolized - continue - if(!C) - C = R.holder.my_atom - if(!R.metabolizing) - R.metabolizing = TRUE - R.on_mob_metabolize(C) - if(C && R) - if(C.reagent_check(R) != 1) - if(can_overdose) - if(R.overdose_threshold) - if(R.volume > R.overdose_threshold && !R.overdosed) - R.overdosed = 1 - var/turf/CT = get_turf(C) - log_reagent("OVERDOSE START: [key_name(C)] at [AREACOORD(CT)] started overdosing on [R.volume] units of [R].") - need_mob_update += R.overdose_start(C) - if(R.addiction_threshold) - if(R.volume > R.addiction_threshold && !is_type_in_list(R, cached_addictions)) - var/datum/reagent/new_reagent = new R.type() - cached_addictions.Add(new_reagent) - if(R.overdosed) - need_mob_update += R.overdose_process(C) - if(is_type_in_list(R,cached_addictions)) - for(var/addiction in cached_addictions) - var/datum/reagent/A = addiction - if(istype(R, A)) - A.addiction_stage = -15 // you're satisfied for a good while. - need_mob_update += R.on_mob_life(C) - + if(owner) + expose_temperature(owner.bodytemperature, 0.25) + var/need_mob_update = FALSE + for(var/datum/reagent/reagent as anything in cached_reagents) + need_mob_update += metabolize_reagent(owner, reagent, delta_time, times_fired, can_overdose, liverless) if(can_overdose) if(addiction_tick == 6) addiction_tick = 1 - for(var/addiction in cached_addictions) + for(var/addiction in addiction_list) var/datum/reagent/R = addiction - if(C && R) + if(owner && R) R.addiction_stage++ if(1 <= R.addiction_stage && R.addiction_stage <= R.addiction_stage1_end) - need_mob_update += R.addiction_act_stage1(C) + need_mob_update += R.addiction_act_stage1(owner) else if(R.addiction_stage1_end < R.addiction_stage && R.addiction_stage <= R.addiction_stage2_end) - need_mob_update += R.addiction_act_stage2(C) + need_mob_update += R.addiction_act_stage2(owner) else if(R.addiction_stage2_end < R.addiction_stage && R.addiction_stage <= R.addiction_stage3_end) - need_mob_update += R.addiction_act_stage3(C) + need_mob_update += R.addiction_act_stage3(owner) else if(R.addiction_stage3_end < R.addiction_stage && R.addiction_stage <= R.addiction_stage4_end) - need_mob_update += R.addiction_act_stage4(C) + need_mob_update += R.addiction_act_stage4(owner) else if(R.addiction_stage4_end < R.addiction_stage) remove_addiction(R) else - SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "[R.type]_overdose") + SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "[R.type]_overdose") addiction_tick++ - if(C && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates. - C.updatehealth() - C.update_mobility() - C.update_stamina() + if(owner && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates. + owner.updatehealth() + owner.update_mobility() + owner.update_stamina() update_total() +/* + * Metabolises a single reagent for a target owner carbon mob. See above. + * + * Arguments: + * * mob/living/carbon/owner - The mob to metabolize in, if null it uses [/datum/reagents/var/my_atom] + * * delta_time - the time in server seconds between proc calls (when performing normally it will be 2) + * * times_fired - the number of times the owner's life() tick has been called aka The number of times SSmobs has fired + * * can_overdose - Allows overdosing + * * liverless - Stops reagents that aren't set as [/datum/reagent/var/self_consuming] from metabolizing + */ +/datum/reagents/proc/metabolize_reagent(mob/living/carbon/owner, datum/reagent/reagent, delta_time, times_fired, can_overdose = FALSE, liverless = FALSE) + var/need_mob_update = FALSE + if(QDELETED(reagent.holder)) + return FALSE + + if(!owner) + owner = reagent.holder.my_atom + + if(owner && reagent) + if(!owner.reagent_check(reagent, delta_time, times_fired) != TRUE) + return + if(liverless && !reagent.self_consuming) //need to be metabolized + return + if(!reagent.metabolizing) + reagent.metabolizing = TRUE + reagent.on_mob_metabolize(owner) + if(can_overdose) + if(reagent.overdose_threshold) + if(reagent.volume >= reagent.overdose_threshold && !reagent.overdosed) + reagent.overdosed = TRUE + need_mob_update += reagent.overdose_start(owner) + log_game("[key_name(owner)] has started overdosing on [reagent.name] at [reagent.volume] units.") + + // for(var/addiction in reagent.addiction_types) + // owner.mind?.add_addiction_points(addiction, reagent.addiction_types[addiction] * REAGENTS_METABOLISM) + if(reagent.addiction_threshold) + if(reagent.volume > reagent.addiction_threshold && !is_type_in_list(reagent, addiction_list)) + var/datum/reagent/new_reagent = new reagent.type() + addiction_list.Add(new_reagent) + if(is_type_in_list(reagent, addiction_list)) + for(var/addiction in addiction_list) + var/datum/reagent/A = addiction + if(istype(reagent, A)) + A.addiction_stage = -15 // you're satisfied for a good while. + + if(reagent.overdosed) + need_mob_update += reagent.overdose_process(owner, delta_time, times_fired) + + need_mob_update += reagent.on_mob_life(owner, delta_time, times_fired) + return need_mob_update + +/// Signals that metabolization has stopped, triggering the end of trait-based effects +/datum/reagents/proc/end_metabolization(mob/living/carbon/C, keep_liverless = TRUE) + var/list/cached_reagents = reagent_list + for(var/datum/reagent/reagent as anything in cached_reagents) + if(QDELETED(reagent.holder)) + continue + if(keep_liverless && reagent.self_consuming) //Will keep working without a liver + continue + if(!C) + C = reagent.holder.my_atom + if(reagent.metabolizing) + reagent.metabolizing = FALSE + reagent.on_mob_end_metabolize(C) + /datum/reagents/proc/remove_addiction(datum/reagent/R) to_chat(my_atom, "You feel like you've gotten over your need for [R.name].") SEND_SIGNAL(my_atom, COMSIG_CLEAR_MOOD_EVENT, "[R.type]_overdose") @@ -354,21 +398,6 @@ addiction_list.Remove(R) qdel(R) -//Signals that metabolization has stopped, triggering the end of trait-based effects -/datum/reagents/proc/end_metabolization(mob/living/carbon/C, keep_liverless = TRUE) - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(QDELETED(R.holder)) - continue - if(keep_liverless && R.self_consuming) //Will keep working without a liver - continue - if(!C) - C = R.holder.my_atom - if(R.metabolizing) - R.metabolizing = FALSE - R.on_mob_end_metabolize(C) - /datum/reagents/proc/conditional_update_move(atom/A, Running = 0) var/list/cached_reagents = reagent_list for(var/reagent in cached_reagents) @@ -1092,47 +1121,54 @@ . = locate(type) in cached_reagents /datum/reagents/proc/generate_taste_message(minimum_percent=15) - // the lower the minimum percent, the more sensitive the message is. var/list/out = list() - var/list/tastes = list() //descriptor = strength - if(minimum_percent <= 100) - for(var/datum/reagent/R in reagent_list) - if(!R.taste_mult) - continue - - if(istype(R, /datum/reagent/consumable/nutriment)) - var/list/taste_data = R.data - for(var/taste in taste_data) - var/ratio = taste_data[taste] - var/amount = ratio * R.taste_mult * R.volume - if(taste in tastes) - tastes[taste] += amount - else - tastes[taste] = amount - else - var/taste_desc = R.taste_description - var/taste_amount = R.volume * R.taste_mult - if(taste_desc in tastes) - tastes[taste_desc] += taste_amount - else - tastes[taste_desc] = taste_amount - //deal with percentages - // TODO it would be great if we could sort these from strong to weak - var/total_taste = counterlist_sum(tastes) - if(total_taste > 0) - for(var/taste_desc in tastes) - var/percent = tastes[taste_desc]/total_taste * 100 - if(percent < minimum_percent) + if(!force_alt_taste) + // the lower the minimum percent, the more sensitive the message is. + var/list/tastes = list() //descriptor = strength + if(minimum_percent <= 100) + for(var/datum/reagent/R in reagent_list) + if(!R.taste_mult) continue - var/intensity_desc = "a hint of" - if(ISINRANGE(percent, minimum_percent * 2, minimum_percent * 3)|| percent == 100) - intensity_desc = "" - else if(percent > minimum_percent * 3) - intensity_desc = "the strong flavor of" - if(intensity_desc != "") - out += "[intensity_desc] [taste_desc]" + + if(istype(R, /datum/reagent/consumable/nutriment)) + var/list/taste_data = R.data + for(var/taste in taste_data) + var/ratio = taste_data[taste] + var/amount = ratio * R.taste_mult * R.volume + if(taste in tastes) + tastes[taste] += amount + else + tastes[taste] = amount else - out += "[taste_desc]" + var/taste_desc = R.taste_description + var/taste_amount = R.volume * R.taste_mult + if(taste_desc in tastes) + tastes[taste_desc] += taste_amount + else + tastes[taste_desc] = taste_amount + //deal with percentages + // TODO it would be great if we could sort these from strong to weak + var/total_taste = counterlist_sum(tastes) + if(total_taste > 0) + for(var/taste_desc in tastes) + var/percent = tastes[taste_desc]/total_taste * 100 + if(percent < minimum_percent) + continue + var/intensity_desc = "a hint of" + if(ISINRANGE(percent, minimum_percent * 2, minimum_percent * 3)|| percent == 100) + intensity_desc = "" + else if(percent > minimum_percent * 3) + intensity_desc = "the strong flavor of" + if(intensity_desc != "") + out += "[intensity_desc] [taste_desc]" + else + out += "[taste_desc]" + + else + // alternate taste is to force the taste of the atom if its a food item + if(my_atom && isfood(my_atom)) + var/obj/item/reagent_containers/food/snacks/F = my_atom + out = F.tastes return english_list(out, "something indescribable") diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 9982bc3722..12c91e145a 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -586,7 +586,7 @@ All effects don't start immediately, but rather get worse over time; the rate is if(AmBloodsucker(C)) disgust_bloodsucker(FALSE, 1) //Bloodsuckers get SOME blood from it, for style reasons. if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio)) - C.blood_volume = min((BLOOD_VOLUME_NORMAL*C.blood_ratio), C.blood_volume + 3) //Bloody Mary quickly restores blood loss. + C.adjust_integration_blood(3) //Bloody Mary quickly restores blood loss. ..() /datum/reagent/consumable/ethanol/brave_bull @@ -2593,7 +2593,7 @@ All effects don't start immediately, but rather get worse over time; the rate is alcohol_description = "sweet" else alcohol_description = "watery" //How the hell did you get negative boozepwr? - + var/list/fruits = list() if(names_in_order.len <= 3) fruits = names_in_order diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index f4f5b90398..5059376954 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -505,11 +505,11 @@ value = REAGENT_VALUE_COMMON /datum/reagent/consumable/nuka_cola/on_mob_metabolize(mob/living/carbon/M) - M.add_movespeed_modifier(/datum/movespeed_modifier/reagent/meth) + M.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nuka_cola) return ..() /datum/reagent/consumable/nuka_cola/on_mob_end_metabolize(mob/living/carbon/M) - M.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/meth) + M.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/nuka_cola) return ..() /datum/reagent/consumable/nuka_cola/on_mob_life(mob/living/carbon/M) diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 96985514b5..ed80804f28 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -164,62 +164,54 @@ /datum/reagent/drug/methamphetamine name = "Methamphetamine" - description = "Reduces stun times by about 300%, and allows the user to quickly recover stamina while dealing a small amount of Brain damage. If overdosed the subject will move randomly, laugh randomly, drop items and suffer from Toxin and Brain damage. If addicted the subject will constantly jitter and drool, before becoming dizzy and losing motor control and eventually suffer heavy toxin damage." + description = "Reduces stun times by about 300%, speeds the user up, and allows the user to quickly recover stamina while dealing a small amount of Brain damage. If overdosed the subject will move randomly, laugh randomly, drop items and suffer from Toxin and Brain damage. If addicted the subject will constantly jitter and drool, before becoming dizzy and losing motor control and eventually suffer heavy toxin damage." reagent_state = LIQUID color = "#FAFAFA" overdose_threshold = 20 - addiction_threshold = 10 metabolization_rate = 0.75 * REAGENTS_METABOLISM - var/brain_damage = TRUE - var/jitter = TRUE - var/confusion = TRUE pH = 5 + addiction_threshold = 10 value = REAGENT_VALUE_UNCOMMON /datum/reagent/drug/methamphetamine/on_mob_metabolize(mob/living/L) ..() - ADD_TRAIT(L, TRAIT_IGNOREDAMAGESLOWDOWN, type) - L.update_movespeed() - ADD_TRAIT(L, TRAIT_TASED_RESISTANCE, type) - L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/meth) + L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/methamphetamine) /datum/reagent/drug/methamphetamine/on_mob_end_metabolize(mob/living/L) - REMOVE_TRAIT(L, TRAIT_IGNOREDAMAGESLOWDOWN, type) - L.update_movespeed() - REMOVE_TRAIT(L, TRAIT_TASED_RESISTANCE, type) - L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/meth) + L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/methamphetamine) ..() -/datum/reagent/drug/methamphetamine/on_mob_life(mob/living/carbon/M) +/datum/reagent/drug/methamphetamine/on_mob_life(mob/living/carbon/M, delta_time, times_fired) var/high_message = pick("You feel hyper.", "You feel like you need to go faster.", "You feel like you can run the world.") - if(prob(5)) - to_chat(M, "[high_message]") - M.AdjustAllImmobility(-40, 0) - M.AdjustUnconscious(-40, 0) - M.adjustStaminaLoss(-7.5 * REM, 0) - if(jitter) - M.Jitter(2) - if(brain_damage) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(1,4)) - M.heal_overall_damage(2, 2) - if(prob(5)) + if(DT_PROB(2.5, delta_time)) + to_chat(M, span_notice("[high_message]")) + // SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "tweaking", /datum/mood_event/stimulant_medium, name) + M.AdjustStun(-40 * REM * delta_time) + M.AdjustKnockdown(-40 * REM * delta_time) + M.AdjustUnconscious(-40 * REM * delta_time) + M.AdjustParalyzed(-40 * REM * delta_time) + M.AdjustImmobilized(-40 * REM * delta_time) + M.adjustStaminaLoss(-2 * REM * delta_time, 0) + M.Jitter(2 * REM * delta_time) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(1, 4) * REM * delta_time) + if(DT_PROB(2.5, delta_time)) M.emote(pick("twitch", "shiver")) ..() - . = 1 + . = TRUE -/datum/reagent/drug/methamphetamine/overdose_process(mob/living/M) +/datum/reagent/drug/methamphetamine/overdose_process(mob/living/M, delta_time, times_fired) if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovable(M.loc)) - for(var/i in 1 to 4) + for(var/i in 1 to round(4 * REM * delta_time, 1)) step(M, pick(GLOB.cardinals)) - if(prob(20)) + if(DT_PROB(10, delta_time)) M.emote("laugh") - if(prob(33)) - M.visible_message("[M]'s hands flip out and flail everywhere!") + if(DT_PROB(18, delta_time)) + M.visible_message(span_danger("[M]'s hands flip out and flail everywhere!")) M.drop_all_held_items() ..() - M.adjustToxLoss(1, 0) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, pick(0.5, 0.6, 0.7, 0.8, 0.9, 1)) - . = 1 + M.adjustToxLoss(1 * REM * delta_time, 0) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, (rand(5, 10) / 10) * REM * delta_time) + . = TRUE /datum/reagent/drug/methamphetamine/addiction_act_stage1(mob/living/M) M.Jitter(5) @@ -256,14 +248,6 @@ ..() . = 1 -/datum/reagent/drug/methamphetamine/changeling - name = "Changeling Adrenaline" - addiction_threshold = 35 - overdose_threshold = 35 - jitter = FALSE - brain_damage = FALSE - value = REAGENT_VALUE_RARE - /datum/reagent/drug/bath_salts name = "Bath Salts" description = "Makes you impervious to stuns and grants a stamina regeneration buff, but you will be a nearly uncontrollable tramp-bearded raving lunatic." diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 90082c464b..02b19909b0 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -345,6 +345,8 @@ victim.confused = max(M.confused, 3) victim.damageoverlaytemp = 60 victim.DefaultCombatKnockdown(80, override_hardstun = 0.1, override_stamdmg = min(reac_volume * 3, 15)) + victim.add_movespeed_modifier(/datum/movespeed_modifier/reagent/pepperspray) + addtimer(CALLBACK(victim, /mob.proc/remove_movespeed_modifier, /datum/movespeed_modifier/reagent/pepperspray), 10 SECONDS) return else if ( eyes_covered ) // Eye cover is better than mouth cover victim.blur_eyes(3) @@ -358,6 +360,8 @@ victim.confused = max(M.confused, 6) victim.damageoverlaytemp = 75 victim.DefaultCombatKnockdown(80, override_hardstun = 0.1, override_stamdmg = min(reac_volume * 5, 25)) + victim.add_movespeed_modifier(/datum/movespeed_modifier/reagent/pepperspray) + addtimer(CALLBACK(victim, /mob.proc/remove_movespeed_modifier, /datum/movespeed_modifier/reagent/pepperspray), 10 SECONDS) victim.update_damage_hud() /datum/reagent/consumable/condensedcapsaicin/on_mob_life(mob/living/carbon/M) @@ -550,6 +554,13 @@ color = "#302000" // rgb: 48, 32, 0 taste_description = "wet and cheap noodles" +/datum/reagent/consumable/nutraslop + name = "Nutraslop" + description = "Mixture of leftover prison foods served on previous days." + nutriment_factor = 5 * REAGENTS_METABOLISM + color = "#3E4A00" // rgb: 62, 74, 0 + taste_description = "your imprisonment" + /datum/reagent/consumable/hot_ramen/on_mob_life(mob/living/carbon/M) M.adjust_bodytemperature(10 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL) ..() diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 65443b65c7..72a9779726 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -396,26 +396,34 @@ metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 60 taste_description = "sweetness and salt" + var/extra_regen = 0.25 // in addition to acting as temporary blood, also add this much to their actual blood per tick var/last_added = 0 var/maximum_reachable = BLOOD_VOLUME_NORMAL - 10 //So that normal blood regeneration can continue with salglu active - var/extra_regen = 0.25 // in addition to acting as temporary blood, also add this much to their actual blood per tick pH = 5.5 -/datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/M) - if((HAS_TRAIT(M, TRAIT_NOMARROW))) - return - if(last_added) - M.blood_volume -= last_added - last_added = 0 - if(M.blood_volume < maximum_reachable) //Can only up to double your effective blood level. - var/amount_to_add = min(M.blood_volume, volume*5) - var/new_blood_level = min(M.blood_volume + amount_to_add, maximum_reachable) - last_added = new_blood_level - M.blood_volume - M.blood_volume = new_blood_level + extra_regen +/datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/human/M) if(prob(33)) M.adjustBruteLoss(-0.5*REM, 0) M.adjustFireLoss(-0.5*REM, 0) . = TRUE + if((HAS_TRAIT(M, TRAIT_NOMARROW))) + return ..() + if(last_added) + M.adjust_integration_blood(-last_added, TRUE) + last_added = 0 + if(M.functional_blood() < maximum_reachable) //Can only up to double your effective blood level. + var/new_blood_level = min(volume * 5, maximum_reachable) + last_added = new_blood_level + M.adjust_integration_blood(new_blood_level + (extra_regen * REM)) + if(prob(33)) + M.adjustBruteLoss(-0.5*REM, 0) + M.adjustFireLoss(-0.5*REM, 0) + . = TRUE + ..() + +/datum/reagent/medicine/salglu_solution/on_mob_delete(mob/living/carbon/human/M) + if(last_added) + M.adjust_integration_blood(-last_added, TRUE) ..() /datum/reagent/medicine/salglu_solution/overdose_process(mob/living/M) @@ -706,21 +714,42 @@ addiction_threshold = 30 pH = 12 -/datum/reagent/medicine/ephedrine/on_mob_life(mob/living/carbon/M) - M.AdjustAllImmobility(-20, FALSE) - M.AdjustUnconscious(-20, FALSE) - M.adjustStaminaLoss(-4.5*REM, FALSE) - M.Jitter(10) - if(prob(50)) - M.confused = max(M.confused, 1) +/datum/reagent/medicine/ephedrine/on_mob_metabolize(mob/living/L) + ..() + L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine) + ADD_TRAIT(L, TRAIT_TASED_RESISTANCE, type) + +/datum/reagent/medicine/ephedrine/on_mob_end_metabolize(mob/living/L) + L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine) + REMOVE_TRAIT(L, TRAIT_TASED_RESISTANCE, type) + ..() + +/datum/reagent/medicine/ephedrine/on_mob_life(mob/living/carbon/M, delta_time, times_fired) + // if(DT_PROB(10 * (1-creation_purity), delta_time) && iscarbon(M)) + // var/obj/item/I = M.get_active_held_item() + // if(I && M.dropItemToGround(I)) + // to_chat(M, span_notice("Your hands spaz out and you drop what you were holding!")) + // M.Jitter(10) + + M.AdjustAllImmobility(-20 * REM * delta_time) + M.adjustStaminaLoss(-1 * REM * delta_time, FALSE) ..() return TRUE -/datum/reagent/medicine/ephedrine/overdose_process(mob/living/M) - if(prob(33)) - M.adjustToxLoss(0.5*REM, 0) +/datum/reagent/medicine/ephedrine/overdose_process(mob/living/M, delta_time, times_fired) + if(DT_PROB(1, delta_time) && iscarbon(M)) + var/datum/disease/D = new /datum/disease/heart_failure + M.ForceContractDisease(D) + to_chat(M, span_userdanger("You're pretty sure you just felt your heart stop for a second there..")) + M.playsound_local(M, 'sound/effects/singlebeat.ogg', 100, 0) + + if(DT_PROB(3.5, delta_time)) + to_chat(M, span_notice("[pick("Your head pounds.", "You feel a tight pain in your chest.", "You find it hard to stay still.", "You feel your heart practically beating out of your chest.")]")) + + if(DT_PROB(18, delta_time)) + M.adjustToxLoss(1, 0) M.losebreath++ - . = 1 + . = TRUE return TRUE /datum/reagent/medicine/ephedrine/addiction_act_stage1(mob/living/M) @@ -981,7 +1010,7 @@ M.grab_ghost() M.emote("gasp") log_combat(M, M, "revived", src) - var/list/policies = CONFIG_GET(keyed_list/policyconfig) + var/list/policies = CONFIG_GET(keyed_list/policy) var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) * 10 //the config is in seconds, not deciseconds var/late = timelimit && (tplus > timelimit) var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT] @@ -1274,7 +1303,7 @@ M.adjustCloneLoss(-3*REM, FALSE) M.adjustStaminaLoss(-25*REM,FALSE) if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio)) - M.blood_volume += 40 // blood fall out man bad + M.adjust_integration_blood(40) // blood fall out man bad ..() . = 1 @@ -1295,7 +1324,7 @@ M.adjustCloneLoss(-1.25*REM, FALSE) M.adjustStaminaLoss(-4*REM,FALSE) if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio)) - M.blood_volume += 3 + M.adjust_integration_blood(3) ..() . = 1 @@ -1415,37 +1444,42 @@ /datum/reagent/medicine/changelingadrenaline name = "Changeling Adrenaline" description = "Reduces the duration of unconciousness, knockdown and stuns. Restores stamina, but deals toxin damage when overdosed." - color = "#918e53" + color = "#C1151D" overdose_threshold = 30 value = REAGENT_VALUE_VERY_RARE -/datum/reagent/medicine/changelingadrenaline/on_mob_metabolize(mob/living/L) - ..() - ADD_TRAIT(L, TRAIT_TASED_RESISTANCE, type) - -/datum/reagent/medicine/changelingadrenaline/on_mob_end_metabolize(mob/living/L) - REMOVE_TRAIT(L, TRAIT_TASED_RESISTANCE, type) - ..() - -/datum/reagent/medicine/changelingadrenaline/on_mob_life(mob/living/carbon/M as mob) - M.AdjustUnconscious(-20, 0) - M.AdjustAllImmobility(-20, 0) - M.AdjustSleeping(-20, 0) - M.adjustStaminaLoss(-30, 0) +/datum/reagent/medicine/changelingadrenaline/on_mob_life(mob/living/carbon/metabolizer, delta_time, times_fired) ..() + metabolizer.AdjustAllImmobility(-20 * REM * delta_time) + metabolizer.adjustStaminaLoss(-30 * REM * delta_time, 0) + metabolizer.Jitter(10 * REM * delta_time) + metabolizer.Dizzy(10 * REM * delta_time) return TRUE -/datum/reagent/medicine/changelingadrenaline/overdose_process(mob/living/M as mob) - M.adjustToxLoss(5, 0) //let's make this mildly more toxic because of the stamina buff +/datum/reagent/medicine/changelingadrenaline/on_mob_metabolize(mob/living/L) + ..() + ADD_TRAIT(L, TRAIT_SLEEPIMMUNE, type) + ADD_TRAIT(L, TRAIT_TASED_RESISTANCE, type) + L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) + +/datum/reagent/medicine/changelingadrenaline/on_mob_end_metabolize(mob/living/L) + ..() + REMOVE_TRAIT(L, TRAIT_SLEEPIMMUNE, type) + REMOVE_TRAIT(L, TRAIT_TASED_RESISTANCE, type) + L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) + L.Dizzy(0) + L.Jitter(0) + +/datum/reagent/medicine/changelingadrenaline/overdose_process(mob/living/metabolizer, delta_time, times_fired) + metabolizer.adjustToxLoss(1 * REM * delta_time, 0) ..() return TRUE /datum/reagent/medicine/changelinghaste name = "Changeling Haste" - description = "Drastically increases movement speed, but deals toxin damage." - color = "#669153" - metabolization_rate = 1 - value = REAGENT_VALUE_VERY_RARE + description = "Drastically increases movement speed." + color = "#AE151D" + metabolization_rate = 2.5 * REAGENTS_METABOLISM /datum/reagent/medicine/changelinghaste/on_mob_metabolize(mob/living/L) ..() @@ -1455,11 +1489,6 @@ L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste) ..() -/datum/reagent/medicine/changelinghaste/on_mob_life(mob/living/carbon/M) - M.adjustToxLoss(2, 0) - ..() - return TRUE - /datum/reagent/medicine/corazone // Heart attack code will not do damage if corazone is present // because it's SPACE MAGIC ASPIRIN diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 0c70f47c53..bf93c933de 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -48,7 +48,7 @@ var/mob/living/carbon/C = L var/blood_id = C.get_blood_id() if((HAS_TRAIT(C, TRAIT_NOMARROW) || blood_id == /datum/reagent/blood || blood_id == /datum/reagent/blood/jellyblood) && (method == INJECT || (method == INGEST && C.dna && C.dna.species && (DRINKSBLOOD in C.dna.species.species_traits)))) - C.blood_volume = min(C.blood_volume + round(reac_volume, 0.1), BLOOD_VOLUME_MAXIMUM * C.blood_ratio) + C.adjust_integration_blood(round(reac_volume, 0.1)) // we don't care about bloodtype here, we're just refilling the mob if(reac_volume >= 10 && istype(L) && method != INJECT) @@ -253,7 +253,7 @@ /datum/reagent/water/on_mob_life(mob/living/carbon/M) . = ..() if(M.blood_volume) - M.blood_volume += 0.1 // water is good for you! + M.adjust_integration_blood(0.1) // water is good for you! /* * Water reaction to turf @@ -370,7 +370,7 @@ /datum/reagent/water/holywater/on_mob_life(mob/living/carbon/M) if(M.blood_volume) - M.blood_volume += 0.1 // water is good for you! + M.adjust_integration_blood(0.1) // water is good for you! if(!data) data = list("misc" = 1) data["misc"]++ @@ -456,7 +456,7 @@ M.adjustBruteLoss(-2, FALSE) M.adjustFireLoss(-2, FALSE) if(ishuman(M) && M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio)) - M.blood_volume += 3 + M.adjust_integration_blood(3) else // Will deal about 90 damage when 50 units are thrown M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 150) M.adjustToxLoss(2, FALSE) @@ -1146,7 +1146,7 @@ if((HAS_TRAIT(C, TRAIT_NOMARROW))) return if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio)) - C.blood_volume += 0.25 + C.adjust_integration_blood(0.25) ..() /datum/reagent/iron/reaction_mob(mob/living/M, method=TOUCH, reac_volume) @@ -2552,7 +2552,7 @@ M.adjustBruteLoss(-3, FALSE) M.adjustFireLoss(-3, FALSE) if(ishuman(M) && M.blood_volume < BLOOD_VOLUME_NORMAL) - M.blood_volume += 3 + M.adjust_integration_blood(3) else M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 150) M.adjustToxLoss(2, FALSE) diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 0655faa1e8..7dd8cac452 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -827,7 +827,7 @@ if(prob(33)) // 1/3rd of the time, let's make it stack with the previous matrix! Mwhahahaha! for(var/whole_screen in screens) - var/obj/screen/plane_master/PM = whole_screen + var/atom/movable/screen/plane_master/PM = whole_screen newmatrix = skew * PM.transform for(var/whole_screen in screens) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 143025aed1..55f44a505e 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -58,6 +58,7 @@ name = "combat stimulant injector" desc = "A modified air-needle autoinjector, used by support operatives to quickly heal injuries in combat and get people back in the fight." amount_per_transfer_from_this = 10 + item_state = "combat_hypo" icon_state = "combat_hypo" volume = 100 ignore_flags = 1 // So they can heal their comrades. @@ -69,17 +70,27 @@ list_reagents = list(/datum/reagent/medicine/epinephrine = 30, /datum/reagent/medicine/omnizine = 30, /datum/reagent/medicine/leporazine = 15, /datum/reagent/medicine/atropine = 15) /obj/item/reagent_containers/hypospray/combat/nanites - desc = "A modified air-needle autoinjector for use in combat situations. Prefilled with experimental medical compounds for rapid healing." + name = "experimental combat stimulant injector" + desc = "A modified air-needle autoinjector for use in combat situations. Prefilled with experimental medical nanites and a stimulant for rapid healing and a combat boost." + item_state = "nanite_hypo" + icon_state = "nanite_hypo" volume = 100 list_reagents = list(/datum/reagent/medicine/adminordrazine/quantum_heal = 80, /datum/reagent/medicine/synaptizine = 20) -/obj/item/reagent_containers/hypospray/magillitis - name = "experimental autoinjector" - desc = "A modified air-needle autoinjector with a small single-use reservoir. It contains an experimental serum." - icon_state = "combat_hypo" - volume = 5 - reagent_flags = NONE - list_reagents = list(/datum/reagent/magillitis = 5) +/obj/item/reagent_containers/hypospray/combat/nanites/update_icon() + if(reagents.total_volume > 0) + icon_state = initial(icon_state) + else + icon_state = "[initial(icon_state)]0" + +/obj/item/reagent_containers/hypospray/combat/heresypurge + name = "holy water piercing injector" + desc = "A modified air-needle autoinjector for use in combat situations. Prefilled with 5 doses of a holy water and pacifier mixture. Not for use on your teammates." + item_state = "holy_hypo" + icon_state = "holy_hypo" + volume = 250 + list_reagents = list(/datum/reagent/water/holywater = 150, /datum/reagent/peaceborg_tire = 50, /datum/reagent/peaceborg_confuse = 50) + amount_per_transfer_from_this = 50 //MediPens @@ -136,6 +147,8 @@ /obj/item/reagent_containers/hypospray/medipen/ekit name = "emergency first-aid autoinjector" desc = "An epinephrine medipen with extra coagulant and antibiotics to help stabilize bad cuts and burns." + icon_state = "healthpen" + item_state = "healthpen" volume = 15 amount_per_transfer_from_this = 15 list_reagents = list(/datum/reagent/medicine/epinephrine = 12, /datum/reagent/medicine/coagulant = 2.5, /datum/reagent/medicine/spaceacillin = 0.5) @@ -143,15 +156,19 @@ /obj/item/reagent_containers/hypospray/medipen/blood_loss name = "hypovolemic-response autoinjector" desc = "A medipen designed to stabilize and rapidly reverse severe bloodloss." + icon_state = "hypovolemic" + item_state = "hypovolemic" volume = 15 amount_per_transfer_from_this = 15 list_reagents = list(/datum/reagent/medicine/epinephrine = 5, /datum/reagent/medicine/coagulant = 2.5, /datum/reagent/iron = 3.5, /datum/reagent/medicine/salglu_solution = 4) /obj/item/reagent_containers/hypospray/medipen/stimulants - name = "illegal stimpack medipen" - desc = "A highly illegal medipen due to its load and small injections, allow for five uses before being drained" + name = "stimpack medipen" + desc = "Contains stimulants." + icon_state = "syndipen" + item_state = "syndipen" volume = 50 - amount_per_transfer_from_this = 10 + amount_per_transfer_from_this = 50 list_reagents = list(/datum/reagent/medicine/stimulants = 50) /obj/item/reagent_containers/hypospray/medipen/stimulants/baseball @@ -166,6 +183,7 @@ name = "stimpack medipen" desc = "A rapid way to stimulate your body's adrenaline, allowing for freer movement in restrictive armor." icon_state = "stimpen" + item_state = "stimpen" volume = 20 amount_per_transfer_from_this = 20 list_reagents = list(/datum/reagent/medicine/ephedrine = 10, /datum/reagent/consumable/coffee = 10) @@ -177,20 +195,79 @@ /obj/item/reagent_containers/hypospray/medipen/morphine name = "morphine medipen" desc = "A rapid way to get you out of a tight situation and fast! You'll feel rather drowsy, though." + icon_state = "morphen" + item_state = "morphen" + volume = 10 + amount_per_transfer_from_this = 10 list_reagents = list(/datum/reagent/medicine/morphine = 10) +/obj/item/reagent_containers/hypospray/medipen/penacid + name = "pentetic acid medipen" + desc = "A autoinjector containing pentetic acid, used to reduce high levels of radiations and moderate toxins." + icon_state = "penacid" + item_state = "penacid" + volume = 10 + amount_per_transfer_from_this = 10 + list_reagents = list(/datum/reagent/medicine/pen_acid = 10) + +/obj/item/reagent_containers/hypospray/medipen/atropine + name = "atropine autoinjector" + desc = "A rapid way to save a person from a critical injury state!" + icon_state = "atropen" + item_state = "atropen" + volume = 10 + amount_per_transfer_from_this = 10 + list_reagents = list(/datum/reagent/medicine/atropine = 10) + +/obj/item/reagent_containers/hypospray/medipen/salacid + name = "salicyclic acid medipen" + desc = "A autoinjector containing salicyclic acid, used to treat severe brute damage." + icon_state = "salacid" + item_state = "salacid" + volume = 10 + amount_per_transfer_from_this = 10 + list_reagents = list(/datum/reagent/medicine/sal_acid = 10) + +/obj/item/reagent_containers/hypospray/medipen/oxandrolone + name = "oxandrolone medipen" + desc = "A autoinjector containing oxandrolone, used to treat severe burns." + icon_state = "oxapen" + item_state = "oxapen" + volume = 10 + amount_per_transfer_from_this = 10 + list_reagents = list(/datum/reagent/medicine/oxandrolone = 10) + +/obj/item/reagent_containers/hypospray/medipen/salbutamol + name = "salbutamol medipen" + desc = "A autoinjector containing salbutamol, used to heal oxygen damage quickly." + icon_state = "salpen" + item_state = "salpen" + volume = 10 + amount_per_transfer_from_this = 10 + list_reagents = list(/datum/reagent/medicine/salbutamol = 10) + /obj/item/reagent_containers/hypospray/medipen/tuberculosiscure name = "BVAK autoinjector" desc = "Bio Virus Antidote Kit autoinjector. Has a two use system for yourself, and someone else. Inject when infected." - icon_state = "stimpen" + icon_state = "tbpen" + item_state = "tbpen" volume = 60 amount_per_transfer_from_this = 30 list_reagents = list(/datum/reagent/medicine/atropine = 10, /datum/reagent/medicine/epinephrine = 10, /datum/reagent/medicine/salbutamol = 20, /datum/reagent/medicine/spaceacillin = 20) +/obj/item/reagent_containers/hypospray/medipen/tuberculosiscure/update_icon() + if(reagents.total_volume > 30) + icon_state = initial(icon_state) + else if (reagents.total_volume > 0) + icon_state = "[initial(icon_state)]1" + else + icon_state = "[initial(icon_state)]0" + /obj/item/reagent_containers/hypospray/medipen/survival name = "survival medipen" desc = "A medipen for surviving in the harshest of environments, heals and protects from environmental hazards. WARNING: Do not inject more than one pen in quick succession." - icon_state = "stimpen" + icon_state = "minepen" + item_state = "minepen" volume = 52 amount_per_transfer_from_this = 52 list_reagents = list(/datum/reagent/medicine/salbutamol = 10, /datum/reagent/medicine/leporazine = 15, /datum/reagent/medicine/neo_jelly = 15, /datum/reagent/medicine/epinephrine = 10, /datum/reagent/medicine/lavaland_extract = 2) @@ -198,16 +275,21 @@ /obj/item/reagent_containers/hypospray/medipen/firelocker name = "fire treatment medipen" desc = "A medipen that has been fulled with burn healing chemicals for personnel without advanced medical knowledge." + icon_state = "firepen" + item_state = "firepen" volume = 15 amount_per_transfer_from_this = 15 list_reagents = list(/datum/reagent/medicine/oxandrolone = 5, /datum/reagent/medicine/kelotane = 10) -/obj/item/reagent_containers/hypospray/combat/heresypurge - name = "holy water autoinjector" - desc = "A modified air-needle autoinjector for use in combat situations. Prefilled with 5 doses of a holy water mixture." - volume = 250 - list_reagents = list(/datum/reagent/water/holywater = 150, /datum/reagent/peaceborg_tire = 50, /datum/reagent/peaceborg_confuse = 50) - amount_per_transfer_from_this = 50 +/obj/item/reagent_containers/hypospray/medipen/magillitis + name = "experimental autoinjector" + desc = "A custom-frame needle injector with a small single-use reservoir, containing an experimental serum. Unlike the more common medipen frame, it cannot pierce through protective armor or hardsuits, nor can the chemical inside be extracted." + icon_state = "gorillapen" + item_state = "gorillapen" + volume = 5 + ignore_flags = 0 + reagent_flags = NONE + list_reagents = list(/datum/reagent/magillitis = 5) #define HYPO_SPRAY 0 #define HYPO_INJECT 1 diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 93a07b1a6e..c2f80de761 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -218,6 +218,31 @@ volume = 50 list_reagents = list(/datum/reagent/medicine/stimulants = 50) +/obj/item/reagent_containers/syringe/contraband + name = "unlabeled syringe" + desc = "A syringe containing some sort of unknown chemical cocktail." + +/obj/item/reagent_containers/syringe/contraband/space_drugs + list_reagents = list(/datum/reagent/drug/space_drugs = 15) + +/obj/item/reagent_containers/syringe/contraband/krokodil + list_reagents = list(/datum/reagent/drug/krokodil = 15) + +/obj/item/reagent_containers/syringe/contraband/crank + list_reagents = list(/datum/reagent/drug/crank = 15) + +/obj/item/reagent_containers/syringe/contraband/methamphetamine + list_reagents = list(/datum/reagent/drug/methamphetamine = 15) + +/obj/item/reagent_containers/syringe/contraband/bath_salts + list_reagents = list(/datum/reagent/drug/bath_salts = 15) + +/obj/item/reagent_containers/syringe/contraband/fentanyl + list_reagents = list(/datum/reagent/toxin/fentanyl = 15) + +/obj/item/reagent_containers/syringe/contraband/morphine + list_reagents = list(/datum/reagent/medicine/morphine = 15) + /obj/item/reagent_containers/syringe/calomel name = "syringe (calomel)" desc = "Contains calomel." diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 26f0ca66ee..db82e5cdb2 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -233,6 +233,14 @@ anchored = TRUE reagent_id = /datum/reagent/consumable/cooking_oil +/obj/structure/reagent_dispensers/servingdish + name = "serving dish" + desc = "A dish full of food slop for your bowl." + icon = 'icons/obj/kitchen.dmi' + icon_state = "serving" + anchored = TRUE + reagent_id = /datum/reagent/consumable/nutraslop + //////// //Kegs// //////// diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index ef3a053027..7fc57ee3a7 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -401,12 +401,15 @@ //check for items in disposal - occupied light if(contents.len > 0) . += "dispover-full" + . += emissive_appearance(icon, "dispover-full", alpha = src.alpha) //charging and ready light if(pressure_charging) . += "dispover-charge" + . += emissive_appearance(icon, "dispover-charge-glow", alpha = src.alpha) else if(full_pressure) . += "dispover-ready" + . += emissive_appearance(icon, "dispover-ready-glow", alpha = src.alpha) /obj/machinery/disposal/bin/proc/do_flush() set waitfor = FALSE @@ -462,7 +465,7 @@ /obj/machinery/disposal/bin/get_remote_view_fullscreens(mob/user) if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS))) - user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 2) + user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 2) //Delivery Chute diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm index 67890838db..fe9ffe2035 100644 --- a/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm +++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm @@ -30,13 +30,21 @@ category = list("initial","Dinnerware") /datum/design/tray - name = "Tray" - id = "tray" + name = "Serving Tray" + id = "servingtray" build_type = AUTOLATHE materials = list(/datum/material/iron = 3000) build_path = /obj/item/storage/bag/tray category = list("initial","Dinnerware") +/datum/design/tray + name = "Cafeteria Tray" + id = "foodtray" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 3000) + build_path = /obj/item/storage/bag/tray/cafeteria + category = list("initial","Dinnerware") + /datum/design/bowl name = "Bowl" id = "bowl" diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 7dfe19f635..630a3629cf 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -245,6 +245,36 @@ category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_SERVICE +/datum/design/emptybottle + name = "Glass Bottle" + desc = "A small, empty bottle for storing liquids." + id = "emptyglassbottle" + build_type = PROTOLATHE + materials = list(/datum/material/glass = 400) + build_path = /obj/item/reagent_containers/food/drinks/bottle/blank/small + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/largeemptybottle + name = "Large Glass Bottle" + desc = "A large, empty bottle for storing liquids." + id = "largeemptyglassbottle" + build_type = PROTOLATHE + materials = list(/datum/material/glass = 2000) + build_path = /obj/item/reagent_containers/food/drinks/bottle/blank + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/emptypitcher + name = "Pitcher" + desc = "A large Pitcher to hold vast amounts of liquid." + id = "emptypitcher" + build_type = PROTOLATHE + materials = list(/datum/material/glass = 3600) + build_path = /obj/item/reagent_containers/food/drinks/bottle/blank/pitcher + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + /datum/design/air_horn name = "Air Horn" desc = "Damn son, where'd you find this?" diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index 319b4a2199..98b04a8382 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -42,6 +42,7 @@ return ..() /obj/machinery/rnd/production/proc/update_research() + set waitfor = FALSE host_research.copy_research_to(stored_research, TRUE) update_designs() diff --git a/code/modules/research/nanites/nanite_program_hub.dm b/code/modules/research/nanites/nanite_program_hub.dm index 85a117f53f..9a625cd0c7 100644 --- a/code/modules/research/nanites/nanite_program_hub.dm +++ b/code/modules/research/nanites/nanite_program_hub.dm @@ -28,11 +28,10 @@ /obj/machinery/nanite_program_hub/update_overlays() . = ..() - SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) if((stat & (NOPOWER|MAINT|BROKEN)) || panel_open) return - SSvis_overlays.add_vis_overlay(src, icon, "nanite_program_hub_on", layer, plane) - SSvis_overlays.add_vis_overlay(src, icon, "nanite_program_hub_on", EMISSIVE_LAYER, EMISSIVE_PLANE) + . += mutable_appearance(icon, "nanite_program_hub_on") + . += emissive_appearance(icon, "nanite_program_hub_on") /obj/machinery/nanite_program_hub/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/disk/nanite_program)) @@ -148,3 +147,7 @@ disk.program = null disk.name = initial(disk.name) . = TRUE + +/obj/machinery/nanite_program_hub/admin/Initialize() + . = ..() + linked_techweb = SSresearch.admin_tech diff --git a/code/modules/research/nanites/nanite_programmer.dm b/code/modules/research/nanites/nanite_programmer.dm index f23a44909c..d858063cb1 100644 --- a/code/modules/research/nanites/nanite_programmer.dm +++ b/code/modules/research/nanites/nanite_programmer.dm @@ -13,11 +13,10 @@ /obj/machinery/nanite_programmer/update_overlays() . = ..() - SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) if((stat & (NOPOWER|MAINT|BROKEN)) || panel_open) return - SSvis_overlays.add_vis_overlay(src, icon, "nanite_programmer_on", layer, plane) - SSvis_overlays.add_vis_overlay(src, icon, "nanite_programmer_on", EMISSIVE_LAYER, EMISSIVE_PLANE) + . += mutable_appearance(icon, "nanite_programmer_on") + . += emissive_appearance(icon, "nanite_programmer_on") /obj/machinery/nanite_programmer/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/disk/nanite_program)) diff --git a/code/modules/research/nanites/nanite_programs/healing.dm b/code/modules/research/nanites/nanite_programs/healing.dm index 9274522553..81a837504a 100644 --- a/code/modules/research/nanites/nanite_programs/healing.dm +++ b/code/modules/research/nanites/nanite_programs/healing.dm @@ -109,7 +109,7 @@ /datum/nanite_program/blood_restoring/active_effect() if(iscarbon(host_mob)) var/mob/living/carbon/C = host_mob - C.blood_volume += 2 + C.adjust_integration_blood(2) /datum/nanite_program/repairing name = "Mechanical Repair" diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm index 3c1ba05267..35871e0cb3 100644 --- a/code/modules/research/techweb/_techweb.dm +++ b/code/modules/research/techweb/_techweb.dm @@ -142,7 +142,7 @@ if(unlock_hidden) for(var/i in receiver.hidden_nodes) CHECK_TICK - if(!hidden_nodes[i]) + if(available_nodes[i] || researched_nodes[i] || visible_nodes[i]) receiver.hidden_nodes -= i //We can see it so let them see it too. for(var/i in researched_nodes) CHECK_TICK diff --git a/code/modules/research/techweb/nodes/bepis_nodes.dm b/code/modules/research/techweb/nodes/bepis_nodes.dm index 41d3a08d64..ec29979bdf 100644 --- a/code/modules/research/techweb/nodes/bepis_nodes.dm +++ b/code/modules/research/techweb/nodes/bepis_nodes.dm @@ -55,7 +55,17 @@ display_name = "Nanite Replication Protocols" description = "Advanced behaviours that allow nanites to exploit certain circumstances to replicate faster." prereq_ids = list("nanite_smart") - design_ids = list("kickstart_nanites","factory_nanites","tinker_nanites","offline_nanites","synergy_nanites") + design_ids = list("kickstart_nanites","factory_nanites","offline_nanites","synergy_nanites") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + hidden = TRUE + experimental = TRUE + +/datum/techweb_node/nanite_storage_protocols + id = "nanite_storage_protocols" + display_name = "Nanite Storage Protocols" + description = "Advanced behaviours that allow nanites to increase their maximum volume at variable cost." + prereq_ids = list("nanite_smart") + design_ids = list("hive_nanites", "zip_nanites", "free_range_nanites", "unsafe_storage_nanites") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) hidden = TRUE experimental = TRUE diff --git a/code/modules/research/techweb/nodes/export_nodes.dm b/code/modules/research/techweb/nodes/export_nodes.dm index cbdedef113..5259fc1bfa 100644 --- a/code/modules/research/techweb/nodes/export_nodes.dm +++ b/code/modules/research/techweb/nodes/export_nodes.dm @@ -14,8 +14,8 @@ /datum/techweb_node/bottle_exports id = "bottle_exports" - display_name = "Legal Bottling" + display_name = "Advanced Bottling" prereq_ids = list("blueprinted_bottles") - description = "New bottles for printing and selling." - design_ids = list("minikeg", "blooddrop", "slim_gold", "white_bloodmoon", "greenroad") + description = "New bottles for printing, storage and selling." + design_ids = list("minikeg", "blooddrop", "slim_gold", "white_bloodmoon", "greenroad", "emptyglassbottle", "largeemptyglassbottle", "emptypitcher") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 250) diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index 62e68e5b0e..c408ad096e 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -1,4 +1,4 @@ -/obj/screen/alert/status_effect/rainbow_protection +/atom/movable/screen/alert/status_effect/rainbow_protection name = "Rainbow Protection" desc = "You are defended from harm, but so are those you might seek to injure!" icon_state = "slime_rainbowshield" @@ -6,7 +6,7 @@ /datum/status_effect/rainbow_protection id = "rainbow_protection" duration = 100 - alert_type = /obj/screen/alert/status_effect/rainbow_protection + alert_type = /atom/movable/screen/alert/status_effect/rainbow_protection var/originalcolor /datum/status_effect/rainbow_protection/on_apply() @@ -29,7 +29,7 @@ "You no longer feel protected...") return ..() -/obj/screen/alert/status_effect/slimeskin +/atom/movable/screen/alert/status_effect/slimeskin name = "Adamantine Slimeskin" desc = "You are covered in a thick, non-neutonian gel." icon_state = "slime_stoneskin" @@ -37,7 +37,7 @@ /datum/status_effect/slimeskin id = "slimeskin" duration = 300 - alert_type = /obj/screen/alert/status_effect/slimeskin + alert_type = /atom/movable/screen/alert/status_effect/slimeskin var/originalcolor /datum/status_effect/slimeskin/on_apply() @@ -91,14 +91,14 @@ owner.forceMove(target.loc) return ..() -/obj/screen/alert/status_effect/freon/stasis +/atom/movable/screen/alert/status_effect/freon/stasis desc = "You're frozen inside of a protective ice cube! While inside, you can't do anything, but are immune to harm! Resist to get out." /datum/status_effect/frozenstasis id = "slime_frozen" status_type = STATUS_EFFECT_UNIQUE duration = -1 //Will remove self when block breaks. - alert_type = /obj/screen/alert/status_effect/freon/stasis + alert_type = /atom/movable/screen/alert/status_effect/freon/stasis var/obj/structure/ice_stasis/cube /datum/status_effect/frozenstasis/on_apply() @@ -162,7 +162,7 @@ qdel(clone) return ..() -/obj/screen/alert/status_effect/clone_decay +/atom/movable/screen/alert/status_effect/clone_decay name = "Clone Decay" desc = "You are simply a construct, and cannot maintain this form forever. You will be returned to your original body if you should fall." icon_state = "slime_clonedecay" @@ -171,7 +171,7 @@ id = "slime_clonedecay" status_type = STATUS_EFFECT_UNIQUE duration = -1 - alert_type = /obj/screen/alert/status_effect/clone_decay + alert_type = /atom/movable/screen/alert/status_effect/clone_decay /datum/status_effect/slime_clone_decay/tick() owner.adjustToxLoss(1, 0) @@ -180,7 +180,7 @@ owner.adjustFireLoss(1, 0) owner.color = "#007BA7" -/obj/screen/alert/status_effect/bloodchill +/atom/movable/screen/alert/status_effect/bloodchill name = "Bloodchilled" desc = "You feel a shiver down your spine after getting hit with a glob of cold blood. You'll move slower and get frostbite for a while!" icon_state = "bloodchill" @@ -188,7 +188,7 @@ /datum/status_effect/bloodchill id = "bloodchill" duration = 100 - alert_type = /obj/screen/alert/status_effect/bloodchill + alert_type = /atom/movable/screen/alert/status_effect/bloodchill /datum/status_effect/bloodchill/on_apply() owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/bloodchill) @@ -202,7 +202,7 @@ owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/bloodchill) return ..() -/obj/screen/alert/status_effect/bloodchill +/atom/movable/screen/alert/status_effect/bloodchill name = "Bloodchilled" desc = "You feel a shiver down your spine after getting hit with a glob of cold blood. You'll move slower and get frostbite for a while!" icon_state = "bloodchill" @@ -210,7 +210,7 @@ /datum/status_effect/bonechill id = "bonechill" duration = 80 - alert_type = /obj/screen/alert/status_effect/bonechill + alert_type = /atom/movable/screen/alert/status_effect/bonechill /datum/status_effect/bonechill/on_apply() owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/bonechill) @@ -226,7 +226,7 @@ owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/bonechill) return ..() -/obj/screen/alert/status_effect/bonechill +/atom/movable/screen/alert/status_effect/bonechill name = "Bonechilled" desc = "You feel a shiver down your spine after hearing the haunting noise of bone rattling. You'll move slower and get frostbite for a while!" icon_state = "bloodchill" @@ -573,6 +573,10 @@ if(batteries.len) var/obj/item/stock_parts/cell/ToCharge = pick(batteries) ToCharge.charge += min(ToCharge.maxcharge - ToCharge.charge, ToCharge.maxcharge/10) //10% of the cell, or to maximum. + ToCharge.update_appearance() //make sure the cell gets their appearance updated. + var/atom/l = ToCharge.loc + if(isgun(l)) //updates the gun appearance as well if the cell is inside one. + l.update_appearance() to_chat(owner, "[linked_extract] discharges some energy into a device you have.") return ..() @@ -661,7 +665,7 @@ return ..() //Bluespace has an icon because it's kinda active. -/obj/screen/alert/status_effect/bluespaceslime +/atom/movable/screen/alert/status_effect/bluespaceslime name = "Stabilized Bluespace Extract" desc = "You shouldn't see this, since we set it to change automatically!" icon_state = "slime_bluespace_on" @@ -674,7 +678,7 @@ /datum/status_effect/stabilized/bluespace id = "stabilizedbluespace" colour = "bluespace" - alert_type = /obj/screen/alert/status_effect/bluespaceslime + alert_type = /atom/movable/screen/alert/status_effect/bluespaceslime var/healthcheck /datum/status_effect/stabilized/bluespace/tick() @@ -704,16 +708,20 @@ /datum/status_effect/stabilized/sepia id = "stabilizedsepia" colour = "sepia" - var/mod = 0 + var/list/possible = list( + -0.5, + -0.25, + 0, + 0.5, + 1 + ) + +/datum/status_effect/stabilized/sepia/New(list/arguments) + . = ..() + possible = typelist(NAMEOF(src, possible), possible) /datum/status_effect/stabilized/sepia/tick() - if(prob(50) && mod > -1) - mod-- - owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia, multiplicative_slowdown = 1) - else if(mod < 1) - mod++ - // yeah a value of 0 does nothing but replacing the trait in place is cheaper than removing and adding repeatedly - owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia, multiplicative_slowdown = 0) + owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia, multiplicative_slowdown = safepick(possible)) return ..() /datum/status_effect/stabilized/sepia/on_remove() @@ -934,6 +942,7 @@ /datum/status_effect/stabilized/lightpink/on_apply() ADD_TRAIT(owner, TRAIT_FREESPRINT, "stabilized_slime") + owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/slime/light_pink) return ..() /datum/status_effect/stabilized/lightpink/tick() @@ -945,6 +954,7 @@ /datum/status_effect/stabilized/lightpink/on_remove() REMOVE_TRAIT(owner, TRAIT_FREESPRINT, "stabilized_slime") + owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/slime/light_pink) return ..() /datum/status_effect/stabilized/adamantine diff --git a/code/modules/research/xenobiology/crossbreeding/consuming.dm b/code/modules/research/xenobiology/crossbreeding/consuming.dm index af37a70232..8d80613be4 100644 --- a/code/modules/research/xenobiology/crossbreeding/consuming.dm +++ b/code/modules/research/xenobiology/crossbreeding/consuming.dm @@ -322,7 +322,7 @@ Consuming extracts: playsound(get_turf(M), 'sound/effects/splat.ogg', 10, 1) if(iscarbon(M)) var/mob/living/carbon/C = M - C.blood_volume += 25 //Half a vampire drain. + C.adjust_integration_blood(25) //Half a vampire drain. /obj/item/slimecross/consuming/green colour = "green" diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index 39877d6706..dee7b1cf45 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -14,25 +14,62 @@ Regenerative extracts: /obj/item/slimecross/regenerative/proc/core_effect_before(mob/living/carbon/human/target, mob/user) return +/obj/item/slimecross/regenerative/pre_attack(atom/A, mob/living/user, params, attackchain_flags, damage_multiplier) + if(isliving(A)) + var/mob/living/M = A + if(M.stat == DEAD) + to_chat(user, "[src] will not work on the dead!") + return TRUE //returning TRUE preemptively ends the attack chain and thus doesn't call afterattack, this is noteworthy for below as well + //inform the target that they're about to have a regenerative extract used on them + if(M != user) //targeting someone else + M.visible_message("[user] readies [src], holding it steady near [M] and guiding it to the center of [M.p_their()] mass...", + "[user] readies [src], holding it steady near you and guiding it to the center of your mass...") + if(!do_after(user, 50, target = M)) //5 seconds + return TRUE + else //targeting self + M.visible_message("[user] readies [src], holding it steady near [user.p_them()]self and guiding it to the center of [user.p_their()] mass...", + "You ready [src], holding it steady near you and guiding it to the center of your mass...") + if(!do_after(user, 10, target = M)) //1 second + return TRUE + . = ..() + else + . = ..() /obj/item/slimecross/regenerative/afterattack(atom/target,mob/user,prox) . = ..() if(!prox || !isliving(target)) return - var/mob/living/H = target - if(H.stat == DEAD) - to_chat(user, "[src] will not work on the dead!") + var/mob/living/M = target + if(M.stat == DEAD) + to_chat(user, "[M] died before you could apply [src]!") return - if(H != user) - user.visible_message("[user] crushes the [src] over [H], the milky goo quickly regenerating all of [H.p_their()] injuries!", - "You squeeze the [src], and it bursts over [H], the milky goo regenerating [H.p_their()] injuries.") + if(M != user) + user.visible_message("[user] crushes the [src] over [M], the milky goo quickly regenerating all of [M.p_their()] injuries!", + "You squeeze the [src], and it bursts over [M], the milky goo regenerating [M.p_their()] injuries.") else user.visible_message("[user] crushes the [src] over [user.p_them()]self, the milky goo quickly regenerating all of [user.p_their()] injuries!", "You squeeze the [src], and it bursts in your hand, splashing you with milky goo which quickly regenerates your injuries!") - core_effect_before(H, user) - H.revive(full_heal = 1) - core_effect(H, user) + core_effect_before(M, user) + var/new_disgust_level = 0 + if(iscarbon(M)) //simpler mobs don't have a disgust variable and we need to grab that. + var/mob/living/carbon/C = M + new_disgust_level = C.disgust + DISGUST_LEVEL_GROSS + M.revive(full_heal = 1) + M.set_disgust(new_disgust_level) + core_effect(M, user) playsound(target, 'sound/effects/splat.ogg', 40, 1) + //warn receivers of the extract about the disgust if they're carbon, making it clear that the regenerative extract is causing this. + if(iscarbon(M)) + var/obj/item/organ/stomach/S = M.getorganslot(ORGAN_SLOT_STOMACH) //for getting the stummy name + switch(new_disgust_level) + if(0 to DISGUST_LEVEL_GROSS) + to_chat(M,"While you recovered from [src], you feel a little nauseous.") + if(DISGUST_LEVEL_GROSS to DISGUST_LEVEL_VERYGROSS) + to_chat(M,"While you recovered from [src], you feel quite queasy.") + if(DISGUST_LEVEL_VERYGROSS to DISGUST_LEVEL_DISGUSTED) + to_chat(M,"While you recovered from [src], you feel like you're about to vomit!") + if(DISGUST_LEVEL_DISGUSTED to INFINITY) + to_chat(M,"You feel absolutely sick. Maybe you should lay off the regenerative extracts until your [(S ? S.name : "stomach")] settles!") qdel(src) /obj/item/slimecross/regenerative/grey diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index a8cefd9bed..70cd28718c 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -187,7 +187,7 @@ switch(activation_type) if(SLIME_ACTIVATE_MINOR) user.adjust_nutrition(50) - user.blood_volume += 50 + user.adjust_integration_blood(50) to_chat(user, "You activate [src], and your body is refilled with fresh slime jelly!") return 150 diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm index 66872ae818..7109c87999 100644 --- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm @@ -302,7 +302,7 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) user.reset_perspective(parentSphere) user.set_machine(src) var/datum/action/peepholeCancel/PHC = new - user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1) + user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 1) PHC.Grant(user) return TRUE diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm index 36abcb41dc..a215b58b55 100644 --- a/code/modules/shuttle/navigation_computer.dm +++ b/code/modules/shuttle/navigation_computer.dm @@ -356,7 +356,7 @@ playsound(console, 'sound/machines/terminal_prompt_confirm.ogg', 25, 0) remote_eye.setLoc(T) to_chat(target, "Jumped to [selected]") - C.overlay_fullscreen("flash", /obj/screen/fullscreen/flash/static) + C.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash/static) C.clear_fullscreen("flash", 3) else playsound(console, 'sound/machines/terminal_prompt_deny.ogg', 25, 0) diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm index 8fab4a221d..aa2a2e4083 100644 --- a/code/modules/spells/spell_types/aimed.dm +++ b/code/modules/spells/spell_types/aimed.dm @@ -4,7 +4,7 @@ var/projectile_type = /obj/item/projectile/magic/teleport var/deactive_msg = "You discharge your projectile..." var/active_msg = "You charge your projectile!" - var/base_icon_state = "projectile" + base_icon_state = "projectile" var/active_icon_state = "projectile" var/list/projectile_var_overrides = list() var/projectile_amount = 1 //Projectiles per cast. diff --git a/code/modules/spells/spell_types/pointed/mind_transfer.dm b/code/modules/spells/spell_types/pointed/mind_transfer.dm index 28d646f6b6..caab6c5547 100644 --- a/code/modules/spells/spell_types/pointed/mind_transfer.dm +++ b/code/modules/spells/spell_types/pointed/mind_transfer.dm @@ -44,6 +44,13 @@ to_chat(user, "The devilish contract doesn't include the 'mind swappable' package, please try again another lifetime.") return + // lets not have people be mindswapped to/from people who have people currently in their vore bellies + if(has_vore_belly(user)) + user.release_vore_contents(include_absorbed = TRUE, silent = TRUE) + + if(has_vore_belly(victim)) + victim.release_vore_contents(include_absorbed = TRUE, silent = TRUE) + //MIND TRANSFER BEGIN var/mob/dead/observer/ghost = victim.ghostize() user.mind.transfer_to(victim) diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index b68a289e85..69f2d5454e 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -63,10 +63,10 @@ name = "DNA Sampler" desc = "Can be used to take chemical and genetic samples of pretty much anything." icon = 'icons/obj/syringe.dmi' - item_state = "hypo" + item_state = "sampler" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - icon_state = "hypo" + icon_state = "sampler" item_flags = NOBLUDGEON var/list/animals = list() var/list/plants = list() diff --git a/code/modules/surgery/advanced/revival.dm b/code/modules/surgery/advanced/revival.dm index 0b864958a0..945dee48e7 100644 --- a/code/modules/surgery/advanced/revival.dm +++ b/code/modules/surgery/advanced/revival.dm @@ -25,7 +25,7 @@ return TRUE /datum/surgery_step/revive name = "electrically stimulate brain" - implements = list(/obj/item/shockpaddles = 100, /obj/item/abductor/gizmo = 100, /obj/item/melee/baton = 75, /obj/item/organ/cyberimp/arm/baton = 75, /obj/item/organ/cyberimp/arm/gun/taser = 60, /obj/item/gun/energy/e_gun/advtaser = 60, /obj/item/gun/energy/taser = 60) + implements = list(/obj/item/shockpaddles = 100, /obj/item/abductor/gizmo = 100, /obj/item/rod_of_asclepius = 100, /obj/item/melee/baton = 75, /obj/item/organ/cyberimp/arm/baton = 75, /obj/item/organ/cyberimp/arm/gun/taser = 60, /obj/item/gun/energy/e_gun/advtaser = 60, /obj/item/gun/energy/taser = 60) time = 120 /datum/surgery_step/revive/tool_check(mob/user, obj/item/tool) . = TRUE @@ -69,7 +69,7 @@ for(var/obj/item/organ/O in target.internal_organs)//zap those buggers back to life! if(O.organ_flags & ORGAN_FAILING) O.applyOrganDamage(-5) - var/list/policies = CONFIG_GET(keyed_list/policyconfig) + var/list/policies = CONFIG_GET(keyed_list/policy) var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) * 10 //the config is in seconds, not deciseconds var/late = timelimit && (tplus > timelimit) var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT] diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index e24268cc45..6f95fd0f8d 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -188,7 +188,7 @@ needs_processing = . //Return TRUE to get whatever mob this is in to update health. -/obj/item/bodypart/proc/on_life() +/obj/item/bodypart/proc/on_life(seconds, times_fired) if(stam_heal_tick && stamina_dam > DAMAGE_PRECISION) //DO NOT update health here, it'll be done in the carbon's life. if(heal_damage(brute = 0, burn = 0, stamina = (stam_heal_tick * (disabled ? 2 : 1)), only_robotic = FALSE, only_organic = FALSE, updating_health = FALSE)) . |= BODYPART_LIFE_UPDATE_HEALTH @@ -792,6 +792,7 @@ . += image(marking_list[1], "[marking_list[2]]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) var/image/limb = image(layer = -BODYPARTS_LAYER, dir = image_dir) + var/image/second_limb var/list/aux = list() var/list/auxmarking = list() @@ -825,6 +826,11 @@ else limb.icon_state = "[species_id]_[body_zone]" + if(istype(src, /obj/item/bodypart/l_leg) || istype(src, /obj/item/bodypart/r_leg)) + second_limb = image(layer = -BODYPARTS_LAYER, dir = image_dir) + second_limb.icon = limb.icon + . += second_limb + // Body markings if(length(body_markings_list)) if(species_id == "husk") @@ -913,7 +919,8 @@ draw_color = "#[draw_color]" if(draw_color) if(grayscale) - limb.icon_state += "_g" + if(!second_limb) + limb.icon_state += "_g" limb.color = draw_color if(aux_icons) for(var/a in aux) @@ -931,6 +938,12 @@ for(var/image/marking in markings_list) marking.color = "#141414" + if(second_limb) + var/original_state = limb.icon_state + limb.icon_state = "[original_state]_front" + second_limb.icon_state = "[original_state]_behind" + second_limb.color = limb.color + /obj/item/bodypart/deconstruct(disassembled = TRUE) drop_organs() qdel(src) diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 88b6f0f662..6b5b4a14aa 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -237,7 +237,7 @@ C.handcuffed = null C.update_handcuffed() if(C.hud_used) - var/obj/screen/inventory/hand/R = C.hud_used.hand_slots["[held_index]"] + var/atom/movable/screen/inventory/hand/R = C.hud_used.hand_slots["[held_index]"] if(R) R.update_icon() if(C.gloves) @@ -255,7 +255,7 @@ C.handcuffed = null C.update_handcuffed() if(C.hud_used) - var/obj/screen/inventory/hand/L = C.hud_used.hand_slots["[held_index]"] + var/atom/movable/screen/inventory/hand/L = C.hud_used.hand_slots["[held_index]"] if(L) L.update_icon() if(C.gloves) @@ -340,7 +340,7 @@ if(C.dna.species.mutanthands && !is_pseudopart) C.put_in_hand(new C.dna.species.mutanthands(), held_index) if(C.hud_used) - var/obj/screen/inventory/hand/hand = C.hud_used.hand_slots["[held_index]"] + var/atom/movable/screen/inventory/hand/hand = C.hud_used.hand_slots["[held_index]"] if(hand) hand.update_icon() C.update_inv_gloves() diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index 8c7553d8e3..3a08a764d3 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -90,7 +90,7 @@ if(held_index) owner.dropItemToGround(owner.get_item_for_held_index(held_index)) if(owner.hud_used) - var/obj/screen/inventory/hand/L = owner.hud_used.hand_slots["[held_index]"] + var/atom/movable/screen/inventory/hand/L = owner.hud_used.hand_slots["[held_index]"] if(L) L.update_icon() @@ -152,7 +152,7 @@ if(held_index) owner.dropItemToGround(owner.get_item_for_held_index(held_index)) if(owner.hud_used) - var/obj/screen/inventory/hand/R = owner.hud_used.hand_slots["[held_index]"] + var/atom/movable/screen/inventory/hand/R = owner.hud_used.hand_slots["[held_index]"] if(R) R.update_icon() diff --git a/code/modules/surgery/emergency_reboot.dm b/code/modules/surgery/emergency_reboot.dm index 046edd884c..5023480b51 100644 --- a/code/modules/surgery/emergency_reboot.dm +++ b/code/modules/surgery/emergency_reboot.dm @@ -42,7 +42,7 @@ if(target.revive()) target.visible_message("...[target]'s posibrain flickers to life once again!") target.emote("ping") - var/list/policies = CONFIG_GET(keyed_list/policyconfig) + var/list/policies = CONFIG_GET(keyed_list/policy) var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) * 10 //the config is in seconds, not deciseconds var/late = timelimit && (tplus > timelimit) var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT] diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 09f0a901a3..9861a1b639 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -41,7 +41,7 @@ return switch(eye_damaged) if(BLURRY_VISION_ONE, BLURRY_VISION_TWO) - owner.overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, eye_damaged) + owner.overlay_fullscreen("eye_damage", /atom/movable/screen/fullscreen/impaired, eye_damaged) if(BLIND_VISION_THREE) owner.become_blind(EYE_DAMAGE) if(ishuman(owner)) @@ -106,7 +106,7 @@ else if(eye_damaged == BLIND_VISION_THREE) owner.become_blind(EYE_DAMAGE) if(eye_damaged && eye_damaged != BLIND_VISION_THREE) - owner.overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, eye_damaged) + owner.overlay_fullscreen("eye_damage", /atom/movable/screen/fullscreen/impaired, eye_damaged) else owner.clear_fullscreen("eye_damage") diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index 2037547d36..5c6b66f702 100755 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -25,7 +25,7 @@ var/cachedmoveCalc = 1 food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/iron = 5) -/obj/item/organ/liver/on_life() +/obj/item/organ/liver/on_life(seconds, times_fired) . = ..() if(!. || !owner)//can't process reagents with a failing liver return @@ -40,7 +40,7 @@ damage += (thisamount*toxLethality) //metabolize reagents - owner.reagents.metabolize(owner, can_overdose=TRUE) + owner.reagents.metabolize(owner, seconds, times_fired, can_overdose=TRUE) if(damage > 10 && prob(damage/3))//the higher the damage the higher the probability to_chat(owner, "You feel a dull pain in your abdomen.") diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 536b70044f..e10b05822b 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -54,7 +54,8 @@ var/SA_para_min = 1 //nitrous values var/SA_sleep_min = 5 - var/BZ_trip_balls_min = 1 //BZ gas + var/BZ_trip_balls_min = 0.1 //BZ gas + var/BZ_brain_damage_min = 1 var/gas_stimulation_min = 0.002 //Nitryl and Stimulum var/cold_message = "your face freezing and an icicle forming" @@ -269,13 +270,13 @@ // BZ var/bz_pp = PP(breath, GAS_BZ) - if(bz_pp > BZ_trip_balls_min) + if(bz_pp > BZ_brain_damage_min) H.hallucination += 10 H.reagents.add_reagent(/datum/reagent/bz_metabolites,5) if(prob(33)) H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 150) - else if(bz_pp > 0.01) + else if(bz_pp > BZ_trip_balls_min) H.hallucination += 5 H.reagents.add_reagent(/datum/reagent/bz_metabolites,1) @@ -476,7 +477,7 @@ ) SA_para_min = 30 SA_sleep_min = 50 - BZ_trip_balls_min = 30 + BZ_brain_damage_min = 30 emp_vulnerability = 3 cold_level_1_threshold = 200 @@ -509,8 +510,29 @@ heat_level_2_threshold = 600 // up 200 from level 1, 1000 is silly but w/e for level 3 /obj/item/organ/lungs/ashwalker/populate_gas_info() + // humans usually breathe 21 but require 16/17, so 80% - 1, which is more lenient but it's fine + #define SAFE_THRESHOLD_RATIO 0.8 + var/datum/gas_mixture/breath = SSair.planetary[LAVALAND_DEFAULT_ATMOS] // y'all know + var/pressure = breath.return_pressure() + var/total_moles = breath.total_moles() + for(var/id in breath.get_gases()) + var/this_pressure = PP(breath, id) + var/req_pressure = (this_pressure * SAFE_THRESHOLD_RATIO) - 1 + if(req_pressure > 0) + gas_min[id] = req_pressure + if(id in gas_max) + gas_max[id] += this_pressure + var/bz = breath.get_moles(GAS_BZ) + if(bz) + BZ_trip_balls_min += bz + BZ_brain_damage_min += bz + + gas_max[GAS_N2] = PP(breath, GAS_N2) + 5 + var/o2_pp = PP(breath, GAS_O2) + safe_breath_min = 0.3 * o2_pp + safe_breath_max = 1.3 * o2_pp ..() - gas_max[GAS_N2] = 28 + #undef SAFE_THRESHOLD_RATIO /obj/item/organ/lungs/slime name = "vacuole" @@ -533,7 +555,7 @@ var/total_moles = breath.total_moles() var/pressure = breath.return_pressure() var/plasma_pp = PP(breath, GAS_PLASMA) - owner.blood_volume += (0.2 * plasma_pp) // 10/s when breathing literally nothing but plasma, which will suffocate you. + owner.adjust_integration_blood(0.2 * plasma_pp) // 10/s when breathing literally nothing but plasma, which will suffocate you. /obj/item/organ/lungs/yamerol name = "Yamerol lungs" diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 6cdeadcbb3..1800fe221b 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -92,18 +92,18 @@ on_death() //Kinda hate doing it like this, but I really don't want to call process directly. //Sources; life.dm process_organs -/obj/item/organ/proc/on_death() //Runs when outside AND inside. - decay() +/obj/item/organ/proc/on_death(seconds, times_fired) //Runs when outside AND inside. + decay(seconds, times_fired) //Applys the slow damage over time decay -/obj/item/organ/proc/decay() +/obj/item/organ/proc/decay(seconds, times_fired) if(!can_decay()) STOP_PROCESSING(SSobj, src) return is_cold() if(organ_flags & ORGAN_FROZEN) return - applyOrganDamage(maxHealth * decay_factor) + applyOrganDamage(maxHealth * decay_factor * (seconds * 0.5)) /obj/item/organ/proc/can_decay() if(CHECK_BITFIELD(organ_flags, ORGAN_NO_SPOIL | ORGAN_SYNTHETIC | ORGAN_FAILING)) @@ -151,7 +151,7 @@ organ_flags &= ~ORGAN_FROZEN return FALSE -/obj/item/organ/proc/on_life() //repair organ damage if the organ is not failing or synthetic +/obj/item/organ/proc/on_life(seconds, times_fired) //repair organ damage if the organ is not failing or synthetic if(organ_flags & ORGAN_FAILING || !owner) return FALSE if(organ_flags & ORGAN_SYNTHETIC_EMP) //Synthetic organ has been emped, is now failing. diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index defb062f1a..f436b31513 100644 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -62,13 +62,13 @@ H.clear_alert("disgust") SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "disgust") if(DISGUST_LEVEL_GROSS to DISGUST_LEVEL_VERYGROSS) - H.throw_alert("disgust", /obj/screen/alert/gross) + H.throw_alert("disgust", /atom/movable/screen/alert/gross) SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/gross) if(DISGUST_LEVEL_VERYGROSS to DISGUST_LEVEL_DISGUSTED) - H.throw_alert("disgust", /obj/screen/alert/verygross) + H.throw_alert("disgust", /atom/movable/screen/alert/verygross) SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/verygross) if(DISGUST_LEVEL_DISGUSTED to INFINITY) - H.throw_alert("disgust", /obj/screen/alert/disgusted) + H.throw_alert("disgust", /atom/movable/screen/alert/disgusted) SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/disgusted) /obj/item/organ/stomach/Remove(special = FALSE) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 12e282200c..e41980cdd3 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -1,8 +1,15 @@ -#define COOLDOWN_STUN 1200 -#define COOLDOWN_KNOCKDOWN 600 -#define COOLDOWN_DAMAGE 600 -#define COOLDOWN_MEME 300 -#define COOLDOWN_NONE 100 +#define COOLDOWN_STUN 300 +#define COOLDOWN_KNOCKDOWN 300 +#define COOLDOWN_DAMAGE 300 +#define COOLDOWN_MEME 150 +#define COOLDOWN_NONE 50 + +/// anything above this requires adminbus, to prevent a cultist from stacking chaplain + cult + specific listener = 8x, which is enough to instantly kill someone with damage. +#define VOG_MAX_STANDARD_POWER 3 +/// max damage we can do in one "blast" to a listener +#define VOG_MAX_BURST_DAMAGE 40 +/// max healing we can do in one "blast" to a listener +#define VOG_MAX_BURST_HEAL 40 /obj/item/organ/vocal_cords //organs that are activated through speech with the :x/MODE_KEY_VOCALCORDS channel name = "vocal cords" @@ -130,13 +137,11 @@ return 0 //no cooldown var/log_message = uppertext(message) - if(!span_list || !span_list.len) - if(iscultist(user)) - span_list = list("narsiesmall") - else if (is_servant_of_ratvar(user)) - span_list = list("ratvar") - else - span_list = list() + if(iscultist(user)) + span_list = list("narsiesmall") + else if (is_servant_of_ratvar(user)) + span_list = list("ratvar") + LAZYINITLIST(span_list) user.say(message, spans = span_list, sanitize = FALSE) @@ -156,39 +161,24 @@ cooldown = COOLDOWN_NONE return cooldown - var/power_multiplier = base_multiplier - - if(user.mind) - //Chaplains are very good at speaking with the voice of god - if(user.mind.assigned_role == "Chaplain") - power_multiplier *= 2 - //Command staff has authority - if(user.mind.assigned_role in GLOB.command_positions) - power_multiplier *= 1.4 - //Why are you speaking - if(user.mind.assigned_role == "Mime") - power_multiplier *= 0.5 - - //Cultists are closer to their gods and are more powerful, but they'll give themselves away - if(iscultist(user)) - power_multiplier *= 2 - else if (is_servant_of_ratvar(user)) - power_multiplier *= 2 - //Try to check if the speaker specified a name or a job to focus on var/list/specific_listeners = list() var/found_string = null + var/devil_target = FALSE //Get the proper job titles message = get_full_job_name(message) + // limitation: this only checks at the start of the message. + // if we wanted to check anywhere we'd have to make the user use delimiters to specify who they're talking to, + // as otherwise it'd be far too computationally and logically expensive to find out who we want. for(var/V in listeners) var/mob/living/L = V var/datum/antagonist/devil/devilinfo = is_devil(L) if(devilinfo && findtext(message, devilinfo.truename)) var/start = findtext(message, devilinfo.truename) listeners = list(L) //Devil names are unique. - power_multiplier *= 5 //if you're a devil and god himself addressed you, you fucked up + devil_target = TRUE //if you're a devil and god himself addressed you, you fucked up //Cut out the name so it doesn't trigger commands message = copytext(message, 1, start) + copytext(message, start + length(devilinfo.truename)) break @@ -207,10 +197,14 @@ //Cut out the job so it doesn't trigger commands found_string = L.mind.assigned_role + var/power_multiplier = get_vog_multiplier(user, base_multiplier, specific_listeners) + var/adminbus = power_multiplier > VOG_MAX_STANDARD_POWER // an admin is being a dunce, bypass hard scaling limits on this message + if(devil_target) + power_multiplier = max(power_multiplier, 5) + if(specific_listeners.len) - listeners = specific_listeners - power_multiplier *= (1 + (1/specific_listeners.len)) //2x on a single guy, 1.5x on two and so on message = copytext(message, length(found_string) + 1) + listeners = specific_listeners.Copy() var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt") var/static/regex/knockdown_words = regex("drop|fall|trip|knockdown") @@ -264,7 +258,7 @@ cooldown = COOLDOWN_STUN for(var/V in listeners) var/mob/living/L = V - L.Stagger(60 * power_multiplier) + L.Stagger(40 * power_multiplier) //KNOCKDOWN else if(findtext(message, knockdown_words)) @@ -272,6 +266,7 @@ for(var/V in listeners) var/mob/living/L = V L.DefaultCombatKnockdown() + L.Stagger(10 * power_multiplier) //VOMIT else if((findtext(message, vomit_words))) @@ -285,13 +280,13 @@ for(var/mob/living/carbon/C in listeners) if(user.mind && (user.mind.assigned_role == "Curator" || user.mind.assigned_role == "Mime")) power_multiplier *= 3 - C.silent += (10 * power_multiplier) + C.silent += (5 * power_multiplier) //HALLUCINATE else if((findtext(message, hallucinate_words))) cooldown = COOLDOWN_MEME for(var/mob/living/carbon/C in listeners) - new /datum/hallucination/delusion(C, TRUE, null,150 * power_multiplier,0) + new /datum/hallucination/delusion(C, TRUE, null, 150 * power_multiplier, 0) //WAKE UP else if((findtext(message, wakeup_words))) @@ -305,14 +300,14 @@ cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V - L.heal_overall_damage(10 * power_multiplier, 10 * power_multiplier, 0, FALSE, FALSE) + L.heal_overall_damage(min(17.5 * power_multiplier, adminbus? INFINITY : VOG_MAX_BURST_HEAL), min(17.5 * power_multiplier, VOG_MAX_BURST_HEAL), 0, FALSE, FALSE) //BRUTE DAMAGE else if((findtext(message, hurt_words))) cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V - L.apply_damage(15 * power_multiplier, def_zone = BODY_ZONE_CHEST, wound_bonus=CANT_WOUND) + L.apply_damage(min(20 * power_multiplier, adminbus? INFINITY : VOG_MAX_BURST_DAMAGE), def_zone = BODY_ZONE_CHEST, wound_bonus = CANT_WOUND) //BLEED else if((findtext(message, bleed_words))) @@ -334,14 +329,14 @@ cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V - L.adjust_bodytemperature(50 * power_multiplier) + L.adjust_bodytemperature(75 * power_multiplier) //COLD else if((findtext(message, cold_words))) cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V - L.adjust_bodytemperature(-50 * power_multiplier) + L.adjust_bodytemperature(-75 * power_multiplier) //REPULSE else if((findtext(message, repulse_words))) @@ -596,6 +591,34 @@ return cooldown +/proc/get_vog_multiplier(mob/living/carbon/user, base_multiplier = 1, list/specific_listeners = list()) + if(base_multiplier >= VOG_MAX_STANDARD_POWER) + return base_multiplier // an admin bussed you and they probably didn't realize you were a chaplain/cultist. + + var/special_check = get_vog_special(user) + if(!special_check) + return 0 + + . = min(base_multiplier * special_check, VOG_MAX_STANDARD_POWER) // anything above should require conscious admin fuckery, as things are balanced around 3 multiplier tops (see: damage being 15*3) + if(!specific_listeners.len) + return + . = min(. * (1 + (1 / specific_listeners.len)), VOG_MAX_STANDARD_POWER) + +/// get special role multiplier for voice of god. No double dipping. +/proc/get_vog_special(mob/living/carbon/user) + if(iscultist(user) || is_servant_of_ratvar(user)) + return 2 // servant of god + if(user.mind) + // servant of god + if(user.mind.assigned_role == "Chaplain") + return 2 + // shut up you broke your vow + if(user.mind.assigned_role == "Mime") + return 0.5 + if(user.mind.assigned_role in GLOB.command_positions) + return 1.4 // heads are great at speaking with authority + return 1 + ////////////////////////////////////// ///////ENTHRAL VELVET CHORDS////////// ////////////////////////////////////// diff --git a/code/modules/tooltip/tooltip.dm b/code/modules/tooltip/tooltip.dm index f9efd7d9c1..65e44cfbc6 100644 --- a/code/modules/tooltip/tooltip.dm +++ b/code/modules/tooltip/tooltip.dm @@ -13,7 +13,7 @@ Configuration: Usage: - Define mouse event procs on your (probably HUD) object and simply call the show and hide procs respectively: - /obj/screen/hud + /atom/movable/screen/hud MouseEntered(location, control, params) usr.client.tooltip.show(params, title = src.name, content = src.desc) @@ -137,7 +137,7 @@ Notes: /atom/movable/MouseEntered(location, control, params) . = ..() if(tooltips) - if(!QDELETED(src)) + if(!QDELETED(src) && usr.client.prefs.enable_tips) var/list/tooltip_data = get_tooltip_data() if(length(tooltip_data)) var/examine_data = tooltip_data.Join("
") diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 2745d971ff..706a7a3910 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -32,47 +32,79 @@ /// Intended to be used in the manner of `TEST_FOCUS(/datum/unit_test/math)` #define TEST_FOCUS(test_path) ##test_path { focus = TRUE; } +/// Constants indicating unit test completion status +#define UNIT_TEST_PASSED 0 +#define UNIT_TEST_FAILED 1 +#define UNIT_TEST_SKIPPED 2 + +#define TEST_DEFAULT 1 +#define TEST_DEL_WORLD INFINITY + +/// A trait source when adding traits through unit tests +#define TRAIT_SOURCE_UNIT_TESTS "unit_tests" + #include "anchored_mobs.dm" #include "bespoke_id.dm" #include "binary_insert.dm" +// #include "bloody_footprints.dm" +// #include "breath.dm" // #include "card_mismatch.dm" #include "chain_pull_through_space.dm" // #include "combat.dm" #include "component_tests.dm" +// #include "connect_loc.dm" // #include "confusion.dm" +// #include "crayons.dm" +// #include "create_and_destroy.dm" +// #include "designs.dm" +// #include "dynamic_ruleset_sanity.dm" +// #include "egg_glands.dm" // #include "emoting.dm" +// #include "food_edibility_check.dm" +// #include "greyscale_config.dm" // #include "heretic_knowledge.dm" // #include "holidays.dm" -#include "initialize_sanity.dm" -#include "keybinding_init.dm" +// #include "hydroponics_harvest.dm" +// #include "keybinding_init.dm" #include "machine_disassembly.dm" #include "medical_wounds.dm" #include "merge_type.dm" // #include "metabolizing.dm" +// #include "ntnetwork_tests.dm" // #include "outfit_sanity.dm" // #include "pills.dm" // #include "plantgrowth_tests.dm" // #include "projectiles.dm" +// #include "rcd.dm" #include "reagent_id_typos.dm" // #include "reagent_mod_expose.dm" // #include "reagent_mod_procs.dm" #include "reagent_recipe_collisions.dm" #include "resist.dm" // #include "say.dm" +// #include "security_officer_distribution.dm" // #include "serving_tray.dm" // #include "siunit.dm" #include "spawn_humans.dm" +#include "spawn_mobs.dm" // #include "species_whitelists.dm" // #include "stomach.dm" +// #include "strippable.dm" #include "subsystem_init.dm" #include "surgeries.dm" #include "teleporters.dm" +#include "tgui_create_message.dm" #include "timer_sanity.dm" #include "unit_test.dm" +// #include "wizard.dm" /// CIT TESTS #include "character_saving.dm" +#ifdef REFERENCE_TRACKING //Don't try and parse this file if ref tracking isn't turned on. IE: don't parse ref tracking please mr linter +#include "find_reference_sanity.dm" +#endif + #undef TEST_ASSERT #undef TEST_ASSERT_EQUAL #undef TEST_ASSERT_NOTEQUAL diff --git a/code/modules/unit_tests/chain_pull_through_space.dm b/code/modules/unit_tests/chain_pull_through_space.dm index ffdd1bf7c9..10363d5aad 100644 --- a/code/modules/unit_tests/chain_pull_through_space.dm +++ b/code/modules/unit_tests/chain_pull_through_space.dm @@ -1,6 +1,6 @@ /datum/unit_test/chain_pull_through_space var/turf/open/space/space_tile - var/turf/claimed_tile + var/claimed_tile var/mob/living/carbon/human/alice var/mob/living/carbon/human/bob var/mob/living/carbon/human/charlie @@ -9,25 +9,25 @@ ..() // Create a space tile that goes to another z-level - claimed_tile = run_loc_bottom_left + claimed_tile = run_loc_floor_bottom_left.type - space_tile = new(locate(run_loc_bottom_left.x, run_loc_bottom_left.y, run_loc_bottom_left.z)) + space_tile = new(locate(run_loc_floor_bottom_left.x, run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)) space_tile.destination_x = 100 space_tile.destination_y = 100 space_tile.destination_z = 5 // Create our list of humans, all adjacent to one another - alice = new(locate(run_loc_bottom_left.x + 2, run_loc_bottom_left.y, run_loc_bottom_left.z)) + alice = new(locate(run_loc_floor_bottom_left.x + 2, run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)) alice.name = "Alice" - bob = new(locate(run_loc_bottom_left.x + 3, run_loc_bottom_left.y, run_loc_bottom_left.z)) + bob = new(locate(run_loc_floor_bottom_left.x + 3, run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)) bob.name = "Bob" - charlie = new(locate(run_loc_bottom_left.x + 4, run_loc_bottom_left.y, run_loc_bottom_left.z)) + charlie = new(locate(run_loc_floor_bottom_left.x + 4, run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)) charlie.name = "Charlie" /datum/unit_test/chain_pull_through_space/Destroy() - space_tile.copyTurf(claimed_tile) + space_tile.ChangeTurf(claimed_tile) qdel(alice) qdel(bob) qdel(charlie) @@ -40,14 +40,14 @@ bob.start_pulling(charlie) // Walk normally to the left, make sure we're still a chain - alice.Move(locate(run_loc_bottom_left.x + 1, run_loc_bottom_left.y, run_loc_bottom_left.z)) - if (bob.x != run_loc_bottom_left.x + 2) + alice.Move(locate(run_loc_floor_bottom_left.x + 1, run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)) + if (bob.x != run_loc_floor_bottom_left.x + 2) return Fail("During normal move, Bob was not at the correct x ([bob.x])") - if (charlie.x != run_loc_bottom_left.x + 3) + if (charlie.x != run_loc_floor_bottom_left.x + 3) return Fail("During normal move, Charlie was not at the correct x ([charlie.x])") // We're going through the space turf now that should teleport us - alice.Move(run_loc_bottom_left) + alice.Move(run_loc_floor_bottom_left) if (alice.z != space_tile.destination_z) return Fail("Alice did not teleport to the destination z-level. Current location: ([alice.x], [alice.y], [alice.z])") diff --git a/code/modules/unit_tests/find_reference_sanity.dm b/code/modules/unit_tests/find_reference_sanity.dm new file mode 100644 index 0000000000..f41714f065 --- /dev/null +++ b/code/modules/unit_tests/find_reference_sanity.dm @@ -0,0 +1,111 @@ +///Used to test the completeness of the reference finder proc. +/datum/unit_test/find_reference_sanity + +/atom/movable/ref_holder + var/atom/movable/ref_test/test + var/list/test_list = list() + var/list/test_assoc_list = list() + +/atom/movable/ref_holder/Destroy() + test = null + test_list.Cut() + test_assoc_list.Cut() + return ..() + +/atom/movable/ref_test + var/atom/movable/ref_test/self_ref + +/atom/movable/ref_test/Destroy(force) + self_ref = null + return ..() + +/datum/unit_test/find_reference_sanity/Run() + var/atom/movable/ref_test/victim = allocate(/atom/movable/ref_test) + var/atom/movable/ref_holder/testbed = allocate(/atom/movable/ref_holder) + SSgarbage.should_save_refs = TRUE + + //Sanity check + victim.DoSearchVar(testbed, "Sanity Check", search_time = 1) //We increment search time to get around an optimization + TEST_ASSERT(!victim.found_refs.len, "The ref-tracking tool found a ref where none existed") + SSgarbage.should_save_refs = FALSE + +/datum/unit_test/find_reference_baseline/Run() + var/atom/movable/ref_test/victim = allocate(/atom/movable/ref_test) + var/atom/movable/ref_holder/testbed = allocate(/atom/movable/ref_holder) + SSgarbage.should_save_refs = TRUE + + //Set up for the first round of tests + testbed.test = victim + testbed.test_list += victim + testbed.test_assoc_list["baseline"] = victim + + victim.DoSearchVar(testbed, "First Run", search_time = 2) + + TEST_ASSERT(victim.found_refs["test"], "The ref-tracking tool failed to find a regular value") + TEST_ASSERT(victim.found_refs[testbed.test_list], "The ref-tracking tool failed to find a list entry") + TEST_ASSERT(victim.found_refs[testbed.test_assoc_list], "The ref-tracking tool failed to find an assoc list value") + SSgarbage.should_save_refs = FALSE + +/datum/unit_test/find_reference_exotic/Run() + var/atom/movable/ref_test/victim = allocate(/atom/movable/ref_test) + var/atom/movable/ref_holder/testbed = allocate(/atom/movable/ref_holder) + SSgarbage.should_save_refs = TRUE + + //Second round, bit harder this time + testbed.overlays += victim + testbed.vis_contents += victim + testbed.test_assoc_list[victim] = TRUE + + victim.DoSearchVar(testbed, "Second Run", search_time = 3) + + //This is another sanity check + TEST_ASSERT(!victim.found_refs[testbed.overlays], "The ref-tracking tool found an overlays entry? That shouldn't be possible") + TEST_ASSERT(victim.found_refs[testbed.vis_contents], "The ref-tracking tool failed to find a vis_contents entry") + TEST_ASSERT(victim.found_refs[testbed.test_assoc_list], "The ref-tracking tool failed to find an assoc list key") + SSgarbage.should_save_refs = FALSE + +/datum/unit_test/find_reference_esoteric/Run() + var/atom/movable/ref_test/victim = allocate(/atom/movable/ref_test) + var/atom/movable/ref_holder/testbed = allocate(/atom/movable/ref_holder) + SSgarbage.should_save_refs = TRUE + + //Let's get a bit esoteric + victim.self_ref = victim + var/list/to_find = list(victim) + testbed.test_list += list(to_find) + var/list/to_find_assoc = list(victim) + testbed.test_assoc_list["Nesting"] = to_find_assoc + + victim.DoSearchVar(victim, "Third Run Self", search_time = 4) + victim.DoSearchVar(testbed, "Third Run Testbed", search_time = 4) + TEST_ASSERT(victim.found_refs["self_ref"], "The ref-tracking tool failed to find a self reference") + TEST_ASSERT(victim.found_refs[to_find], "The ref-tracking tool failed to find a nested list entry") + TEST_ASSERT(victim.found_refs[to_find_assoc], "The ref-tracking tool failed to find a nested assoc list entry") + SSgarbage.should_save_refs = FALSE + +/datum/unit_test/find_reference_null_key_entry/Run() + var/atom/movable/ref_test/victim = allocate(/atom/movable/ref_test) + var/atom/movable/ref_holder/testbed = allocate(/atom/movable/ref_holder) + SSgarbage.should_save_refs = TRUE + + //Calm before the storm + testbed.test_assoc_list = list(null = victim) + + victim.DoSearchVar(testbed, "Fourth Run", search_time = 5) + TEST_ASSERT(testbed.test_assoc_list, "The ref-tracking tool failed to find a null key'd assoc list entry") + +/datum/unit_test/find_reference_assoc_investigation/Run() + var/atom/movable/ref_test/victim = allocate(/atom/movable/ref_test) + var/atom/movable/ref_holder/testbed = allocate(/atom/movable/ref_holder) + SSgarbage.should_save_refs = TRUE + + //Let's do some more complex assoc list investigation + var/list/to_find_in_key = list(victim) + testbed.test_assoc_list[to_find_in_key] = list("memes") + var/list/to_find_null_assoc_nested = list(victim) + testbed.test_assoc_list[null] = to_find_null_assoc_nested + + victim.DoSearchVar(testbed, "Fifth Run", search_time = 6) + TEST_ASSERT(victim.found_refs[to_find_in_key], "The ref-tracking tool failed to find a nested assoc list key") + TEST_ASSERT(victim.found_refs[to_find_null_assoc_nested], "The ref-tracking tool failed to find a null key'd nested assoc list entry") + SSgarbage.should_save_refs = FALSE diff --git a/code/modules/unit_tests/initialize_sanity.dm b/code/modules/unit_tests/initialize_sanity.dm deleted file mode 100644 index d183f530c8..0000000000 --- a/code/modules/unit_tests/initialize_sanity.dm +++ /dev/null @@ -1,11 +0,0 @@ -/datum/unit_test/initialize_sanity/Run() - if(length(SSatoms.BadInitializeCalls)) - Fail("Bad Initialize() calls detected. Please read logs.") - var/list/init_failures_to_text = list( - "[BAD_INIT_QDEL_BEFORE]" = "Qdeleted Before Initialized", - "[BAD_INIT_DIDNT_INIT]" = "Did Not Initialize", - "[BAD_INIT_SLEPT]" = "Initialize() Slept", - "[BAD_INIT_NO_HINT]" = "No Initialize() Hint Returned", - ) - for(var/failure in SSatoms.BadInitializeCalls) - log_world("[failure]: [init_failures_to_text["[SSatoms.BadInitializeCalls[failure]]"]]") // You like stacked brackets? diff --git a/code/modules/unit_tests/keybinding_init.dm b/code/modules/unit_tests/keybinding_init.dm index 2bd2fdee1e..16141bc553 100644 --- a/code/modules/unit_tests/keybinding_init.dm +++ b/code/modules/unit_tests/keybinding_init.dm @@ -3,4 +3,4 @@ var/datum/keybinding/KB = i if(initial(KB.keybind_signal) || !initial(KB.name)) continue - Fail("[KB.name] does not have a keybind signal defined.") + Fail("[initial(KB.name)] does not have a keybind signal defined.") diff --git a/code/modules/unit_tests/merge_type.dm b/code/modules/unit_tests/merge_type.dm index ba3cfcf492..1aed82e6a3 100644 --- a/code/modules/unit_tests/merge_type.dm +++ b/code/modules/unit_tests/merge_type.dm @@ -10,6 +10,6 @@ var/list/paths = subtypesof(/obj/item/stack) - blacklist for(var/stackpath in paths) - var/obj/item/stack/stack = stackpath - if(!initial(stack.merge_type)) + var/obj/item/stack/stack = new stackpath + if(!stack.merge_type) Fail("([stack]) lacks set merge_type variable!") diff --git a/code/modules/unit_tests/metabolizing.dm b/code/modules/unit_tests/metabolizing.dm index b7f8fc4f6a..6c0a635b13 100644 --- a/code/modules/unit_tests/metabolizing.dm +++ b/code/modules/unit_tests/metabolizing.dm @@ -11,7 +11,7 @@ /datum/unit_test/metabolization/proc/test_reagent(mob/living/carbon/C, reagent_type) C.reagents.add_reagent(reagent_type, 10) - C.reagents.metabolize(C, can_overdose = TRUE) + C.reagents.metabolize(C, SSMOBS_DT, 1, can_overdose = TRUE) C.reagents.clear_reagents() /datum/unit_test/metabolization/Destroy() diff --git a/code/modules/unit_tests/say.dm b/code/modules/unit_tests/say.dm deleted file mode 100644 index a7df5ad624..0000000000 --- a/code/modules/unit_tests/say.dm +++ /dev/null @@ -1,23 +0,0 @@ -/// Test to verify message mods are parsed correctly -/datum/unit_test/get_message_mods - var/mob/host_mob - -/datum/unit_test/get_message_mods/Run() - host_mob = allocate(/mob/living/carbon/human) - - test("Hello", "Hello", list()) - test(";HELP", "HELP", list(MODE_HEADSET = TRUE)) - test(";%Never gonna give you up", "Never gonna give you up", list(MODE_HEADSET = TRUE, MODE_SING = TRUE)) - test(".s Gun plz", "Gun plz", list(RADIO_KEY = RADIO_KEY_SECURITY, RADIO_EXTENSION = RADIO_CHANNEL_SECURITY)) - test("...What", "...What", list()) - -/datum/unit_test/get_message_mods/proc/test(message, expected_message, list/expected_mods) - var/list/mods = list() - TEST_ASSERT_EQUAL(host_mob.get_message_mods(message, mods), expected_message, "Chopped message was not what we expected. Message: [message]") - - for (var/mod_key in mods) - TEST_ASSERT_EQUAL(mods[mod_key], expected_mods[mod_key], "The value for [mod_key] was not what we expected. Message: [message]") - expected_mods -= mod_key - - if (expected_mods.len) - Fail("Some message mods were expected, but were not returned by get_message_mods: [json_encode(expected_mods)]. Message: [message]") diff --git a/code/modules/unit_tests/spawn_humans.dm b/code/modules/unit_tests/spawn_humans.dm index 0500deae0a..1bc7ca3d8a 100644 --- a/code/modules/unit_tests/spawn_humans.dm +++ b/code/modules/unit_tests/spawn_humans.dm @@ -1,5 +1,5 @@ /datum/unit_test/spawn_humans/Run() - var/locs = block(run_loc_bottom_left, run_loc_top_right) + var/locs = block(run_loc_floor_bottom_left, run_loc_floor_top_right) for(var/I in 1 to 5) new /mob/living/carbon/human(pick(locs)) diff --git a/code/modules/unit_tests/spawn_mobs.dm b/code/modules/unit_tests/spawn_mobs.dm new file mode 100644 index 0000000000..f14d14eb43 --- /dev/null +++ b/code/modules/unit_tests/spawn_mobs.dm @@ -0,0 +1,8 @@ +///Unit test that spawns all mobs that can be spawned by golden slimes +/datum/unit_test/spawn_mobs + +/datum/unit_test/spawn_mobs/Run() + for(var/_animal in typesof(/mob/living/simple_animal)) + var/mob/living/simple_animal/animal = _animal + if (initial(animal.gold_core_spawnable) == HOSTILE_SPAWN || initial(animal.gold_core_spawnable) == FRIENDLY_SPAWN) + allocate(_animal) diff --git a/code/modules/unit_tests/surgeries.dm b/code/modules/unit_tests/surgeries.dm index 6348057f79..c8ac1d9424 100644 --- a/code/modules/unit_tests/surgeries.dm +++ b/code/modules/unit_tests/surgeries.dm @@ -53,7 +53,8 @@ TEST_ASSERT(!isnull(alice.get_bodypart(BODY_ZONE_HEAD)), "Alice has no head after prosthetic replacement") TEST_ASSERT_EQUAL(alice.get_visible_name(), "Bob", "Bob's head was transplanted onto Alice's body, but their name is not Bob") - +/* +i couldn't actually find anything in the parts of the code it's calling preventing two surgeries, so it's probably somewhere else /datum/unit_test/multiple_surgeries/Run() var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human) var/mob/living/carbon/human/patient_zero = allocate(/mob/living/carbon/human) @@ -65,10 +66,12 @@ var/datum/surgery/organ_manipulation/surgery_for_zero = new INVOKE_ASYNC(surgery_step, /datum/surgery_step/proc/initiate, user, patient_zero, BODY_ZONE_CHEST, scalpel, surgery_for_zero) + sleep(1) TEST_ASSERT(surgery_for_zero.step_in_progress, "Surgery on patient zero was not initiated") var/datum/surgery/organ_manipulation/surgery_for_one = new + // Without waiting for the incision to complete, try to start a new surgery TEST_ASSERT(!surgery_step.initiate(user, patient_one, BODY_ZONE_CHEST, scalpel, surgery_for_one), "Was allowed to start a second surgery without the rod of asclepius") TEST_ASSERT(!surgery_for_one.step_in_progress, "Surgery for patient one is somehow in progress, despite not initiating") @@ -76,6 +79,7 @@ user.apply_status_effect(STATUS_EFFECT_HIPPOCRATIC_OATH) INVOKE_ASYNC(surgery_step, /datum/surgery_step/proc/initiate, user, patient_one, BODY_ZONE_CHEST, scalpel, surgery_for_one) TEST_ASSERT(surgery_for_one.step_in_progress, "Surgery on patient one was not initiated, despite having rod of asclepius") +*/ /datum/unit_test/tend_wounds/Run() var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human) diff --git a/code/modules/unit_tests/teleporters.dm b/code/modules/unit_tests/teleporters.dm index fa2624adaa..e1b4b71e9e 100644 --- a/code/modules/unit_tests/teleporters.dm +++ b/code/modules/unit_tests/teleporters.dm @@ -1,8 +1,8 @@ /datum/unit_test/auto_teleporter_linking/Run() // Put down the teleporter machinery var/obj/machinery/teleport/hub/hub = allocate(/obj/machinery/teleport/hub) - var/obj/machinery/teleport/station/station = allocate(/obj/machinery/teleport/station, locate(run_loc_bottom_left.x + 1, run_loc_bottom_left.y, run_loc_bottom_left.z)) - var/obj/machinery/computer/teleporter/computer = allocate(/obj/machinery/computer/teleporter, locate(run_loc_bottom_left.x + 2, run_loc_bottom_left.y, run_loc_bottom_left.z)) + var/obj/machinery/computer/teleporter/computer = allocate(/obj/machinery/computer/teleporter, locate(run_loc_floor_bottom_left.x + 2, run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)) + var/obj/machinery/teleport/station/station = allocate(/obj/machinery/teleport/station, locate(run_loc_floor_bottom_left.x + 1, run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)) TEST_ASSERT_EQUAL(hub.power_station, station, "Hub didn't link to the station") TEST_ASSERT_EQUAL(station.teleporter_console, computer, "Station didn't link to the teleporter console") diff --git a/code/modules/unit_tests/tgui_create_message.dm b/code/modules/unit_tests/tgui_create_message.dm new file mode 100644 index 0000000000..4d5a4bc0a0 --- /dev/null +++ b/code/modules/unit_tests/tgui_create_message.dm @@ -0,0 +1,28 @@ +/// Test that `TGUI_CREATE_MESSAGE` is correctly implemented +/datum/unit_test/tgui_create_message + +/datum/unit_test/tgui_create_message/Run() + var/type = "something/here" + var/list/payload = list( + "name" = "Terry McTider", + "heads_caved" = 100, + "accomplishments" = list( + "nothing", + "literally nothing", + list( + "something" = "just kidding", + ), + ), + ) + + var/message = TGUI_CREATE_MESSAGE(type, payload) + + // Ensure consistent output to compare by performing a round-trip. + var/output = json_encode(json_decode(url_decode(message))) + + var/expected = json_encode(list( + "type" = type, + "payload" = payload, + )) + + TEST_ASSERT_EQUAL(expected, output, "TGUI_CREATE_MESSAGE didn't round trip properly") diff --git a/code/modules/unit_tests/unit_test.dm b/code/modules/unit_tests/unit_test.dm index 15fe6b466c..aee62b7a52 100644 --- a/code/modules/unit_tests/unit_test.dm +++ b/code/modules/unit_tests/unit_test.dm @@ -7,7 +7,7 @@ Call Fail() to fail the test (You should specify a reason) You may use /New() and /Destroy() for setup/teardown respectively -You can use the run_loc_bottom_left and run_loc_top_right to get turfs for testing +You can use the run_loc_floor_bottom_left and run_loc_floor_top_right to get turfs for testing */ @@ -19,39 +19,46 @@ GLOBAL_VAR(test_log) //Bit of metadata for the future maybe var/list/procs_tested - /// The bottom left turf of the testing zone - var/turf/run_loc_bottom_left - - /// The top right turf of the testing zone - var/turf/run_loc_top_right - - /// The type of turf to allocate for the testing zone - var/test_turf_type = /turf/open/floor/plasteel + /// The bottom left floor turf of the testing zone + var/turf/run_loc_floor_bottom_left + /// The top right floor turf of the testing zone + var/turf/run_loc_floor_top_right + ///The priority of the test, the larger it is the later it fires + var/priority = TEST_DEFAULT //internal shit var/focus = FALSE var/succeeded = TRUE var/list/allocated var/list/fail_reasons - var/static/datum/turf_reservation/turf_reservation + var/static/datum/turf_reservation/reservation + +/proc/cmp_unit_test_priority(datum/unit_test/a, datum/unit_test/b) + return initial(a.priority) - initial(b.priority) /datum/unit_test/New() - if (isnull(turf_reservation)) - turf_reservation = SSmapping.RequestBlockReservation(5, 5) + if (isnull(reservation)) + reservation = SSmapping.RequestBlockReservation(5, 5) - for (var/turf/reserved_turf in turf_reservation.reserved_turfs) - reserved_turf.ChangeTurf(test_turf_type) + for (var/turf/reserved_turf in reservation.reserved_turfs) + reserved_turf.ChangeTurf(/turf/open/floor/plasteel) allocated = new - run_loc_bottom_left = locate(turf_reservation.bottom_left_coords[1], turf_reservation.bottom_left_coords[2], turf_reservation.bottom_left_coords[3]) - run_loc_top_right = locate(turf_reservation.top_right_coords[1], turf_reservation.top_right_coords[2], turf_reservation.top_right_coords[3]) + run_loc_floor_bottom_left = locate(reservation.bottom_left_coords[1], reservation.bottom_left_coords[2], reservation.bottom_left_coords[3]) + run_loc_floor_top_right = locate(reservation.top_right_coords[1], reservation.top_right_coords[2], reservation.top_right_coords[3]) + + TEST_ASSERT(isfloorturf(run_loc_floor_bottom_left), "run_loc_floor_bottom_left was not a floor ([run_loc_floor_bottom_left])") + TEST_ASSERT(isfloorturf(run_loc_floor_top_right), "run_loc_floor_top_right was not a floor ([run_loc_floor_top_right])") /datum/unit_test/Destroy() - //clear the test area - for(var/atom/movable/AM in block(run_loc_bottom_left, run_loc_top_right)) - qdel(AM) QDEL_LIST(allocated) + // clear the test area + for (var/turf/turf in block(locate(1, 1, run_loc_floor_bottom_left.z), locate(world.maxx, world.maxy, run_loc_floor_bottom_left.z))) + for (var/content in turf.contents) + if (istype(content, /obj/effect/landmark)) + continue + qdel(content) return ..() /datum/unit_test/proc/Run() @@ -70,44 +77,64 @@ GLOBAL_VAR(test_log) /datum/unit_test/proc/allocate(type, ...) var/list/arguments = args.Copy(2) if (!arguments.len) - arguments = list(run_loc_bottom_left) + arguments = list(run_loc_floor_bottom_left) else if (arguments[1] == null) - arguments[1] = run_loc_bottom_left + arguments[1] = run_loc_floor_bottom_left var/instance = new type(arglist(arguments)) allocated += instance return instance +/proc/RunUnitTest(test_path, list/test_results) + var/datum/unit_test/test = new test_path + + GLOB.current_test = test + var/duration = REALTIMEOFDAY + + test.Run() + + duration = REALTIMEOFDAY - duration + GLOB.current_test = null + GLOB.failed_any_test |= !test.succeeded + + var/list/log_entry = list("[test.succeeded ? "PASS" : "FAIL"]: [test_path] [duration / 10]s") + var/list/fail_reasons = test.fail_reasons + + for(var/J in 1 to LAZYLEN(fail_reasons)) + log_entry += "\tREASON #[J]: [fail_reasons[J]]" + var/message = log_entry.Join("\n") + log_test(message) + + test_results[test_path] = list("status" = test.succeeded ? UNIT_TEST_PASSED : UNIT_TEST_FAILED, "message" = message, "name" = test_path) + + qdel(test) + /proc/RunUnitTests() CHECK_TICK - var/tests_to_run = subtypesof(/datum/unit_test) + var/list/tests_to_run = subtypesof(/datum/unit_test) for (var/_test_to_run in tests_to_run) var/datum/unit_test/test_to_run = _test_to_run if (initial(test_to_run.focus)) tests_to_run = list(test_to_run) break - for(var/I in tests_to_run) - var/datum/unit_test/test = new I + tests_to_run = sortTim(tests_to_run, /proc/cmp_unit_test_priority) - GLOB.current_test = test - var/duration = REALTIMEOFDAY + var/list/test_results = list() - test.Run() + for(var/unit_path in tests_to_run) + CHECK_TICK //We check tick first because the unit test we run last may be so expensive that checking tick will lock up this loop forever + RunUnitTest(unit_path, test_results) - duration = REALTIMEOFDAY - duration - GLOB.current_test = null - GLOB.failed_any_test |= !test.succeeded - - var/list/log_entry = list("[test.succeeded ? "PASS" : "FAIL"]: [I] [duration / 10]s") - var/list/fail_reasons = test.fail_reasons - - qdel(test) - - for(var/J in 1 to LAZYLEN(fail_reasons)) - log_entry += "\tREASON #[J]: [fail_reasons[J]]" - log_test(log_entry.Join("\n")) - - CHECK_TICK + var/file_name = "data/unit_tests.json" + fdel(file_name) + file(file_name) << json_encode(test_results) SSticker.force_ending = TRUE + //We have to call this manually because del_text can preceed us, and SSticker doesn't fire in the post game + SSticker.ready_for_reboot = TRUE + SSticker.standard_reboot() + +// /datum/map_template/unit_tests +// name = "Unit Tests Zone" +// mappath = "_maps/templates/unit_tests.dmm" diff --git a/code/modules/uplink/uplink_items/uplink_ammo.dm b/code/modules/uplink/uplink_items/uplink_ammo.dm index 2ab6c6f490..a7f3f5321d 100644 --- a/code/modules/uplink/uplink_items/uplink_ammo.dm +++ b/code/modules/uplink/uplink_items/uplink_ammo.dm @@ -265,7 +265,7 @@ /datum/uplink_item/ammo/flechetteap name = "Armor Piercing Flechette Magazine" desc = "An additional 40-round flechette magazine; compatible with the Flechette Launcer. \ - Loaded with armor piercing flechettes that very nearly ignore armor, but are not very effective agaisnt flesh." + Loaded with armor piercing flechettes that very nearly ignore armor, but are not very effective against flesh." item = /obj/item/ammo_box/magazine/flechette cost = 2 include_modes = list(/datum/game_mode/nuclear) diff --git a/code/modules/uplink/uplink_items/uplink_devices.dm b/code/modules/uplink/uplink_items/uplink_devices.dm index ad1cc31ba7..21889219cf 100644 --- a/code/modules/uplink/uplink_items/uplink_devices.dm +++ b/code/modules/uplink/uplink_items/uplink_devices.dm @@ -213,7 +213,7 @@ name = "Stimpack" desc = "Stimpacks, the tool of many great heroes. Makes you nearly immune to non-lethal weaponry for about \ 5 minutes after injection." - item = /obj/item/reagent_containers/syringe/stimulants + item = /obj/item/reagent_containers/hypospray/medipen/stimulants cost = 5 surplus = 90 diff --git a/code/modules/uplink/uplink_items/uplink_roles.dm b/code/modules/uplink/uplink_items/uplink_roles.dm index 774c2d9794..72e0111c41 100644 --- a/code/modules/uplink/uplink_items/uplink_roles.dm +++ b/code/modules/uplink/uplink_items/uplink_roles.dm @@ -195,7 +195,7 @@ name = "Magillitis Serum Autoinjector" desc = "A single-use autoinjector which contains an experimental serum that causes rapid muscular growth in Hominidae. \ Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas." - item = /obj/item/reagent_containers/hypospray/magillitis + item = /obj/item/reagent_containers/hypospray/medipen/magillitis cost = 8 restricted_roles = list("Geneticist", "Chief Medical Officer") diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index d125453e5a..d5ddfe63cc 100644 --- a/code/modules/vehicles/atv.dm +++ b/code/modules/vehicles/atv.dm @@ -9,7 +9,7 @@ /obj/vehicle/ridden/atv/Initialize() . = ..() var/datum/component/riding/D = LoadComponent(/datum/component/riding) - D.vehicle_move_delay = 1 + D.vehicle_move_delay = CONFIG_GET(number/movedelay/run_delay) D.set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 4), TEXT_SOUTH = list(0, 4), TEXT_EAST = list(0, 4), TEXT_WEST = list( 0, 4))) D.set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER) D.set_vehicle_dir_layer(NORTH, OBJ_LAYER) diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index b86ab6023a..eab1c55ca9 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -243,10 +243,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C . = ..() if(!light_mask) return - - SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) if(!(stat & BROKEN) && powered()) - SSvis_overlays.add_vis_overlay(src, icon, light_mask, EMISSIVE_LAYER, EMISSIVE_PLANE) + . += emissive_appearance(icon, light_mask) /obj/machinery/vending/obj_break(damage_flag) . = ..() diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm index 5ec0987111..87f2a0940b 100644 --- a/code/modules/vending/boozeomat.dm +++ b/code/modules/vending/boozeomat.dm @@ -5,6 +5,9 @@ icon_deny = "boozeomat-deny" products = list(/obj/item/reagent_containers/food/drinks/drinkingglass = 30, /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass = 12, + /obj/item/reagent_containers/food/drinks/bottle/blank = 5, + /obj/item/reagent_containers/food/drinks/bottle/blank/small = 10, + /obj/item/reagent_containers/food/drinks/bottle/blank/pitcher = 2, /obj/item/reagent_containers/food/drinks/bottle/gin = 5, /obj/item/reagent_containers/food/drinks/bottle/whiskey = 5, /obj/item/reagent_containers/food/drinks/bottle/tequila = 5, diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index a061561383..6adc9d38e6 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -21,7 +21,7 @@ /obj/item/clothing/suit/jacket/puffer/vest = 4, /obj/item/clothing/suit/jacket/puffer = 4, /obj/item/clothing/suit/hooded/cloak/david = 4, - /obj/item/clothing/neck/cancloak/polychromic = 4, + /obj/item/clothing/neck/cloak/cancloak/polychromic = 4, /obj/item/clothing/suit/bomber = 5, /obj/item/clothing/under/suit/turtle/teal = 3, /obj/item/clothing/under/suit/turtle/grey = 3, diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index cea9c5ae70..a1d9bc1691 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -9,6 +9,7 @@ /obj/item/toy/cards/deck/cas/black = 3, /obj/item/toy/cards/deck/unum = 3, /obj/item/cardpack/series_one = 10, + /obj/item/dyespray=3, /obj/item/tcgcard_binder = 5) contraband = list(/obj/item/dice/fudge = 9) premium = list(/obj/item/melee/skateboard/pro = 3, diff --git a/code/modules/vore/eating/vorepanel.dm b/code/modules/vore/eating/vorepanel.dm index a3adc89352..8e8cfc4935 100644 --- a/code/modules/vore/eating/vorepanel.dm +++ b/code/modules/vore/eating/vorepanel.dm @@ -466,8 +466,6 @@ if(!(target in host.vore_selected)) return TRUE // Not in our X anymore, update UI var/list/available_options = list("Examine", "Eject", "Move") - if(ishuman(target)) - available_options += "Transform" intent = tgui_alert(user, "What would you like to do with [target]?", "Vore Pick", available_options) switch(intent) if("Examine") @@ -498,17 +496,6 @@ host.vore_selected.transfer_contents(target, choice) return TRUE - if("Transform") - if(host.stat) - to_chat(user,"You can't do that in your state!") - return TRUE - - var/mob/living/carbon/human/H = target - if(!istype(H)) - return - - return TRUE - /datum/vore_look/proc/set_attr(mob/user, params) if(!host.vore_selected) tgui_alert_async(usr, "No belly selected to modify.") diff --git a/config/antag_rep.txt b/config/antag_rep.txt deleted file mode 100644 index e8a7250686..0000000000 --- a/config/antag_rep.txt +++ /dev/null @@ -1,5 +0,0 @@ -## Custom antag reputation values -## List of job titles followed by antag rep value, all prefixed with ANTAG_REP. See code/modules/jobs/job_types for titles -## e.g. -## ANTAG_REP Captain 10 -## ANTAG_REP Assistant 0 diff --git a/config/config.txt b/config/config.txt index 611d63cb24..c0c683373d 100644 --- a/config/config.txt +++ b/config/config.txt @@ -1,18 +1,7 @@ # You can use the "$include" directive to split your configs however you want -$include game_options.txt -$include dbconfig.txt -$include comms.txt -$include antag_rep.txt -$include resources.txt -# Cit-specific imports -$include donator_groupings.txt -$include dynamic_config.txt -$include plushies/defines.txt -$include job_threats.txt -$include policy.txt -$include persistence.txt -$include respawns.txt +# MAKE SURE ENTRIES ARE SORTED IN THE SAME FASHION THEY ARE IN THE .dm +# if you don't do this i will find you and put lemons on your eyes. # You can use the @ character at the beginning of a config option to lock it from being edited in-game # Example usage: @@ -22,523 +11,31 @@ $include respawns.txt # Which explicitly disables LOG_TWITTER, as well as locking it. # There are various options which are hard-locked for security reasons. -## Server name: This appears at the top of the screen in-game and in the BYOND hub. Uncomment and replace 'tgstation' with the name of your choice. -# SERVERNAME tgstation -## Server tagline: This will appear right below the server's title. -# SERVERTAGLINE A generic TG-based server - -## Server SQL name: This is the name used to identify the server to the SQL DB, distinct from SERVERNAME as it must be at most 32 characters. -# SERVERSQLNAME tgstation - -## Station name: The name of the station as it is referred to in-game. If commented out, the game will generate a random name instead. -STATIONNAME Space Station 13 - -## Put on byond hub: Uncomment this to put your server on the byond hub. -#HUB - -## Lobby time: This is the amount of time between rounds that players have to setup their characters and be ready. -LOBBY_COUNTDOWN 120 - -## Round End Time: This is the amount of time after the round ends that players have to murder death kill each other. -ROUND_END_COUNTDOWN 90 - -## Comment this out if you want to use the SQL based admin system, the legacy system uses admins.txt. -## You need to set up your database to use the SQL based system. -## This flag is automatically enabled if SQL_ENABLED isn't -ADMIN_LEGACY_SYSTEM - -##Uncomment this to stop any admins loaded by the legacy system from having their rank edited by the permissions panel -#PROTECT_LEGACY_ADMINS - -##Uncomment this to stop any ranks loaded by the legacy system from having their flags edited by the permissions panel -#PROTECT_LEGACY_RANKS - -##Uncomment this to have admin ranks only loaded from the legacy admin_ranks.txt -##If enabled, each time admins are loaded ranks the database will be updated with the current ranks and their flags -#LOAD_LEGACY_RANKS_ONLY - -## Comment this out if you want to use the SQL based banning system. The legacy systems use the files in the data folder. You need to set up your database to use the SQL based system. -BAN_LEGACY_SYSTEM - -## Comment this out to stop locally connected clients from being given the almost full access !localhost! admin rank -ENABLE_LOCALHOST_RANK - -## Comment this out if you want to use the SQL based mentor system, the legacy system uses mentors.txt. -## You need to set up your database to use the SQL based system. -## This flag is automatically enabled if SQL_ENABLED isn't -MENTOR_LEGACY_SYSTEM - -#Mentors only see ckeys by default. Uncomment to have them only see mob name -#MENTORS_MOBNAME_ONLY - -## Uncomment this entry to have certain jobs require your account to be at least a certain number of days old to select. You can configure the exact age requirement for different jobs by editing -## the minimal_player_age variable in the files in folder /code/game/jobs/job/.. for the job you want to edit. Set minimal_player_age to 0 to disable age requirement for that job. -## REQUIRES the database set up to work. Keep it hashed if you don't have a database set up. -## NOTE: If you have just set-up the database keep this DISABLED, as player age is determined from the first time they connect to the server with the database up. If you just set it up, it means -## you have noone older than 0 days, since noone has been logged yet. Only turn this on once you have had the database up for 30 days. -#USE_AGE_RESTRICTION_FOR_JOBS - -## Uncomment this to have the job system use the player's account creation date, rather than the when they first joined the server for job timers. -#USE_ACCOUNT_AGE_FOR_JOBS - -## Unhash this to track player playtime in the database. Requires database to be enabled. -#USE_EXP_TRACKING -## Unhash this to enable playtime requirements for head jobs. -#USE_EXP_RESTRICTIONS_HEADS -## Unhash this to override head jobs' playtime requirements with this number of hours. -## Leave this commented out to use the values defined in the job datums. Values in the datums are stored as minutes. -#USE_EXP_RESTRICTIONS_HEADS_HOURS 3 -## Unhash this to change head jobs' playtime requirements so that they're based on department playtime, rather than crew playtime. -#USE_EXP_RESTRICTIONS_HEADS_DEPARTMENT -## Unhash this to enable playtime requirements for certain non-head jobs, like Engineer and Scientist. -#USE_EXP_RESTRICTIONS_OTHER -## Allows admins to bypass job playtime requirements. -#USE_EXP_RESTRICTIONS_ADMIN_BYPASS - -## log OOC channel -LOG_OOC - -## log client Say -LOG_SAY - -## log admin actions -LOG_ADMIN - -## log admin chat -LOG_ADMINCHAT - -## log client access (logon/logoff) -LOG_ACCESS - -## log game actions (start of round, results, etc.) -LOG_GAME - -## log player votes -LOG_VOTE - -## log player crafting -LOG_CRAFT - -## log client Whisper -LOG_WHISPER - -## log emotes -LOG_EMOTE - -## log attack messages -LOG_ATTACK - -## log pda messages -LOG_PDA - -## log telecomms messages -LOG_TELECOMMS - -## log prayers -LOG_PRAYER - -## log lawchanges -LOG_LAW - -## log crew manifest to seperate file -LOG_MANIFEST - -## log job divide debugging information -#LOG_JOB_DEBUG - -## log all world.Topic() calls -# LOG_WORLD_TOPIC - -## enables use of the proc twitterize() that lets you take a large list of strings and turn it into a JSON file of tweet sized strings. -## As an example of how this could be """useful""" look towards Poly (https://twitter.com/Poly_the_Parrot) -# LOG_TWITTER - -## Enable logging pictures -# LOG_PICTURES - -## log virus and actions -LOG_VIRUS - -##Log camera pictures - Must have picture logging enabled -PICTURE_LOGGING_CAMERA - -## period of time in seconds for players to be considered inactive -# INACTIVITY_PERIOD 300 - -## period of time in seconds for players to be considered afk and kickable -# AFK_PERIOD 600 - -## disconnect players who are considered afk -# KICK_INACTIVE - -## Comment this out to stop admins being able to choose their personal ooccolor -ALLOW_ADMIN_OOCCOLOR - -## Job slot open/close by identification consoles delay in seconds -ID_CONSOLE_JOBSLOT_DELAY 30 - -## allow players to initiate a restart vote -#ALLOW_VOTE_RESTART - -## allow players to initate a mode-change start -#ALLOW_VOTE_MODE - -## min delay (deciseconds) between voting sessions (default 10 minutes) -VOTE_DELAY 6000 - -## time period (deciseconds) which voting session will last (default 1 minute) -VOTE_PERIOD 600 - -## autovote initial delay (deciseconds) before first automatic transfer vote call (default 120 minutes) -## Set to 0 to disable the subsystem altogether. -VOTE_AUTOTRANSFER_INITIAL 72000 - -## autovote delay (deciseconds) before sequential automatic transfer votes are called (default 30 minutes) -VOTE_AUTOTRANSFER_INTERVAL 18000 - -## autovote maximum votes until automatic transfer call. (default 4) -## Set to 0 to force automatic crew transfer after the 'vote_autotransfer_initial' elapsed. -## Set to -1 to disable the maximum votes cap. -VOTE_AUTOTRANSFER_MAXIMUM 4 - -## prevents dead players from voting or starting votes -# NO_DEAD_VOTE - -## players' votes default to "No vote" (otherwise, default to "No change") -# DEFAULT_NO_VOTE - -## disables calling del(src) on newmobs if they logout before spawnin in -# DONT_DEL_NEWMOB - -## set a hosted by name for unix platforms -HOSTEDBY Yournamehere - -## Set to jobban "Guest-" accounts from Captain, HoS, HoP, CE, RD, CMO, Warden, Security, Detective, and AI positions. -## Set to 1 to jobban them from those positions, set to 0 to allow them. -# GUEST_JOBBAN - -## Uncomment this to stop people connecting to your server without a registered ckey. (i.e. guest-* are all blocked from connecting) -GUEST_BAN - -## Comment this out to disable checking for the cid randomizer dll. (disabled if database isn't enabled or connected) -CHECK_RANDOMIZER - -## IPINTEL: -## This allows you to detect likely proxies by checking ips against getipintel.net -## Rating to warn at: (0.9 is good, 1 is 100% likely to be a spammer/proxy, 0.8 is 80%, etc) anything equal to or higher then this number triggers an admin warning -#IPINTEL_RATING_BAD 0.9 -## Contact email, (required to use the service, leaving blank or default disables IPINTEL) -#IPINTEL_EMAIL ch@nge.me -## How long to save good matches (ipintel rate limits to 15 per minute and 500 per day. so this shouldn't be too low, getipintel.net suggests 6 hours, time is in hours) (Your ip will get banned if you go over 500 a day too many times) -#IPINTEL_SAVE_GOOD 12 -## How long to save bad matches (these numbers can change as ips change hands, best not to save these for too long in case somebody gets a new ip used by a spammer/proxy before.) -#IPINTEL_SAVE_BAD 3 -## Domain name to query (leave commented out for the default, only needed if you pay getipintel.net for more querys) -#IPINTEL_DOMAIN check.getipintel.net - -## Uncomment to allow web client connections -#ALLOW_WEBCLIENT - -## Uncomment to restrict web client connections to byond members -## This makes for a nice pay gate to cut down on ban evading, as the webclient's cid system isn't that great -## byond membership starts at $10 for 3 months, so to use the webclient to evade, they would have sink 10 bucks in each evade. -#WEBCLIENT_ONLY_BYOND_MEMBERS - -## Set to prevent anyone but those ckeys listed in config/whitelist.txt and config/admins.txt from joining your server -#USEWHITELIST - -## set a server location for world reboot. Don't include the byond://, just give the address and port. -## Don't set this to the same server, BYOND will automatically restart players to the server when it has restarted. -# SERVER ss13.example.com:2506 - -## forum address -# FORUMURL https://citadel-station.net/forum/ - -## Wiki address -# WIKIURL https://katlin.dog/citadel-wiki - -## Rules address -# RULESURL https://katlin.dog/citadel-rules/main - -## Github address -# GITHUBURL https://github.com/Citadel-Station-13/Citadel-Station-13 - -## Round specific stats address -## Link to round specific parsed logs; IE statbus. It is appended with the RoundID automatically by ticker/Reboot() -## This will take priority over the game logs address during reboot. -## Example: https://atlantaned.space/statbus/round.php?round= -# ROUNDSTATSURL http://citadel-station.net/slimbus/ - -## Game Logs address -## Incase you don't have a fancy parsing system, but still want players to be able to find where you keep your server's logs. -## Example: https://tgstation13.org/parsed-logs/basil/data/logs/ -# GAMELOGURL - -## Github repo id -##This can be found by going to https://api.github.com/users//repos -##Or https://api.github.com/orgs//repos if the repo owner is an organization -# GITHUBREPOID 62485194 - -## Ban appeals URL - usually for a forum or wherever people should go to contact your admins. -# BANAPPEALS https://citadel-station.net/forum/viewforum.php?f=8&sid=a0ce5331d5594ef6d49661609c6f4ff9 - -## System command that invokes youtube-dl, used by Play Internet Sound. -## You can install youtube-dl with -## "pip install youtube-dl" if you have pip installed -## from https://github.com/rg3/youtube-dl/releases -## or your package manager -## The default value assumes youtube-dl is in your system PATH -# INVOKE_YOUTUBEDL youtube-dl - -## In-game features -##Toggle for having jobs load up from the .txt -# LOAD_JOBS_FROM_TXT - -## Uncomment this to forbid admins from possessing the singularity. -#FORBID_SINGULO_POSSESSION - -## Uncomment to show a popup 'reply to' window to every non-admin that receives an adminPM. -## The intention is to make adminPMs more visible. (although I fnd popups annoying so this defaults to off) -#POPUP_ADMIN_PM - -## Uncomment to allow special 'Easter-egg' events on special holidays such as seasonal holidays and stuff like 'Talk Like a Pirate Day' :3 YAARRR -ALLOW_HOLIDAYS - -## Uncomment to show the names of the admin sending a pm from IRC instead of showing as a stealthmin. -#SHOW_IRC_NAME - -## Defines the ticklimit for subsystem initialization (In percents of a byond tick). Lower makes world start smoother. Higher makes it faster. -##This is currently a testing optimized setting. A good value for production would be 98. -TICK_LIMIT_MC_INIT 500 - -##Defines the ticklag for the world. Ticklag is the amount of time between game ticks (aka byond ticks) (in 1/10ths of a second). -## This also controls the client network update rate, as well as the default client fps -TICKLAG 0.5 - -##Can also be set as per-second value, the following value is identical to the above. -#FPS 20 - -## Comment this out to disable automuting -#AUTOMUTE_ON - -## Uncomment this to let players see their own notes (they can still be set by admins only) -#SEE_OWN_NOTES - -### Comment these two out to prevent notes fading out over time for admins. -## Notes older then this will start fading out. -NOTE_FRESH_DAYS 91.31055 -## Notes older then this will be completely faded out. -NOTE_STALE_DAYS 365.2422 - -##Note: all population caps can be used with each other if desired. - -## Uncomment for 'soft' population caps, players will be warned while joining if the living crew exceeds the listed number. -#SOFT_POPCAP 100 - -## Message for soft cap -SOFT_POPCAP_MESSAGE Be warned that the server is currently serving a high number of users, consider using alternative game servers. - -## Uncomment for 'hard' population caps, players will not be allowed to spawn if the living crew exceeds the listed number, though they may still observe or wait for the living crew to decrease in size. -#HARD_POPCAP 150 - -## Message for hard cap -HARD_POPCAP_MESSAGE The server is currently serving a high number of users, You cannot currently join. You may wait for the number of living crew to decline, observe, or find alternative servers. - -## Uncomment for 'extreme' population caps, players will not be allowed to join the server if living crew exceeds the listed number. -#EXTREME_POPCAP 200 - -## Message for extreme cap -EXTREME_POPCAP_MESSAGE The server is currently serving a high number of users, find alternative servers. - -## Notify admins when a new player connects for the first x days a player's been around. (0 for first connection only, -1 for never) -## Requres database -NOTIFY_NEW_PLAYER_AGE 0 - -## Notify admins when a player connects if their byond account was created in the last X days -## Requires database -NOTIFY_NEW_PLAYER_ACCOUNT_AGE 1 - -## Notify the irc channel when a new player makes their first connection -## Requres database -#IRC_FIRST_CONNECTION_ALERT - -## Deny all new connections by ckeys we haven't seen before (exempts admins and only denies the connection if the database is enabled and connected) -## Requires database -#PANIC_BUNKER - -## If a player connects during a bunker with less then or this amount of living time (Minutes), we deny the connection -#PANIC_BUNKER_LIVING 90 - -## The message the Panic Bunker gives when someone is rejected by it -## %minutes% is replaced with PANIC_BUNKER_LIVING on runtime, remove it if you don't want this -#PANIC_BUNKER_MESSAGE Sorry, but the server is currently not accepting connections from players with less than %minutes% minutes of living time. - -## If panic bunker is on and a player is rejected (see above), attempt to send them to this connected server (see below) instead. -## You probably want this to be the same as CROSS_SERVER_ADDRESS -#PANIC_SERVER_ADDRESS byond://address:port - -##Name of the place to send people rejected by the bunker -#PANIC_SERVER_NAME [Put the name here] - -##Automated age verification, comment this out to not ask new users if they are 18+ -#AGE_VERIFICATION - -## Uncomment to have the changelog file automatically open when a user connects and hasn't seen the latest changelog -#AGGRESSIVE_CHANGELOG - -## Comment this out if you've used the mass conversion sql proc for notes or want to stop converting notes -AUTOCONVERT_NOTES - -## Comment this out to stop admin messages sent anytime an admin disconnects from a round in play, you can edit the messages in admin.dm -ANNOUNCE_ADMIN_LOGOUT - -## Uncomment to have an admin message sent anytime an admin connects to a round in play, you can edit the messages in admin.dm -#ANNOUNCE_ADMIN_LOGIN - -## Map rotation -## You should edit maps.txt to match your configuration when you enable this. -MAPROTATION - -## TG-style map rotation -## By default, Citadel uses a more traditional method of map voting, where at the end of a round, players are given a full upfront vote. -## This PR will disable that, and will make the server use TG's map rotation instead. -#TGSTYLE_MAPROTATION - -## Map voting -## Allows players to vote for their preffered map -## When it's set to zero, the map will be randomly picked each round -ALLOW_MAP_VOTING 1 - -## Map voting type -## Determines what kind of vote the map vote is -## Options are: -## PLURALITY (default, only vote for one option) -## APPROVAL (can vote for as many as you want), I -## IRV (vote by ranked choice, winner determined by instant runoff algorithm) -## SCORE (give individual rankings of each choice, winner determined by majority judgement algorithm) -MAP_VOTE_TYPE APPROVAL - -## Map rotate chance delta -## This is the chance of map rotation factored to the round length. -## A value of 1 would mean the map rotation chance is the round length in minutes (hour long round == 60% rotation chance) -## A value of 0.5 would mean the map rotation chance is half of the round length in minutes (hour long round == 30% rotation chance) -#MAPROTATIONCHANCEDELTA 0.75 - -## AUTOADMIN -## The default admin rank -AUTOADMIN_RANK Game Master - -## Uncomment to automatically give that admin rank to all players -#AUTOADMIN - -## CLIENT VERSION CONTROL -## This allows you to configure the minimum required client version, as well as a warning version, and message for both. -## These trigger for any version below (non-inclusive) the given version, so 510 triggers on 509 or lower. -## These messages will be followed by one stating the clients current version and the required version for clarity. -## If CLIENT_WARN_POPUP is uncommented a popup window with the message will be displayed instead -#CLIENT_WARN_VERSION 511 -#CLIENT_WARN_POPUP -#CLIENT_WARN_MESSAGE Byond released 511 as the stable release. You can set the framerate your client runs at, which makes the game feel very different and cool. Shortly after its release we will end up using 511 client features and you will be forced to update. -CLIENT_ERROR_VERSION 511 -CLIENT_ERROR_MESSAGE Your version of byond is not supported. Please upgrade. -## The minimum build needed for joining the server, if using 512, a good minimum build would be 1421 as that disables the Middle Mouse Button exploit. -CLIENT_ERROR_BUILD 1421 - -## TOPIC RATE LIMITING -## This allows you to limit how many topic calls (clicking on an interface window) the client can do in any given game second and/or game minute. -## Admins are exempt from these limits. -## Hitting the minute limit notifies admins. -## Set to 0 or comment out to disable. -SECOND_TOPIC_LIMIT 10 - -MINUTE_TOPIC_LIMIT 100 - - -## CLICK RATE LIMITING -## Same as above, but applies to clicking on objects in the game window. -## This should be a higher then the interface limit to allow for the spam clickly nature of most battles. -## Admins are exempt from these limits. -## Hitting the minute limit notifies admins. -## Set to 0 to disable. -SECOND_CLICK_LIMIT 15 - -MINUTE_CLICK_LIMIT 400 - -##Error handling related options -## The "cooldown" time for each occurence of a unique error -#ERROR_COOLDOWN 600 -## How many occurences before the next will silence them -#ERROR_LIMIT 90 -## How long a unique error will be silenced for -#ERROR_SILENCE_TIME 6000 -##How long to wait between messaging admins about occurences of a unique error -#ERROR_MSG_DELAY 50 - -## Chat Announce Options -## Various messages to be sent to game chats -## Uncommenting these will enable them, by default they will be broadcast to Game chat channels on TGS3 or non-admin channels on TGS4 -## If using TGS4, the string option can be set as a chat channel tag to limit the message to channels of that tag type (case-sensitive) -## i.e. CHAT_ANNOUNCE_NEW_GAME chat_channel_tag - -## Send a message with the station name starting a new game -#CHAT_ANNOUNCE_NEW_GAME - -## Allow admin hrefs that don't use the new token system, will eventually be removed -DEBUG_ADMIN_HREFS - -###Master Controller High Pop Mode### - -##The Master Controller(MC) is the primary system controlling timed tasks and events in SS13 (lobby timer, game checks, lighting updates, atmos, etc) -##Default base MC tick rate (1 = process every "byond tick" (see: tick_lag/fps config settings), 2 = process every 2 byond ticks, etc) -## Setting this to 0 will prevent the Master Controller from ticking -BASE_MC_TICK_RATE 1 - -##High population MC tick rate -## Byond rounds timer values UP, but the tick rate is modified with heuristics during lag spites so setting this to something like 2 -## will make it run every 2 byond ticks, but will also double the effect of anti-lag heuristics. You can instead set it to something like -## 1.1 to make it run every 2 byond ticks, but only increase the effect of anti-lag heuristics by 10%. or 1.5 for 50%. -## (As an aside, you could in theory also reduce the effect of anti-lag heuristics in the base tick rate by setting it to something like 0.5) -HIGH_POP_MC_TICK_RATE 1.1 - -##Engage high pop mode if player count raises above this (Player in this context means any connected user. Lobby, ghost or in-game all count) -HIGH_POP_MC_MODE_AMOUNT 65 - -##Disengage high pop mode if player count drops below this -DISABLE_HIGH_POP_MC_MODE_AMOUNT 60 - -## Uncomment to prevent the world from sleeping while no players are connected after initializations -#RESUME_AFTER_INITIALIZATIONS - -## Uncomment to set the number of /world/Reboot()s before the DreamDaemon restarts itself. 0 means restart every round. Requires tgstation server tools. -#ROUNDS_UNTIL_HARD_RESTART 10 - -## Number of days for an individual panic bunker passthrough entry to be wiped. Note that they're also wiped as soon as a player is in the database. -#MAX_BUNKER_DAYS 7 - -##Default screen resolution, in tiles. -## By default, this is 15x15, which gets simplified to 7 by BYOND, as it is a 1:1 screen ratio. -## For reference, Goonstation uses a resolution of 21x15 for it's widescreen mode. -## Do note that changing this value will affect the title screen. The title screen will have to be updated manually if this is changed. -DEFAULT_VIEW 21x15 - -### FAIL2TOPIC: -### Automated IP bans for world/Topic() spammers -### NOTE FOR WINDOWS HOSTS: This requires you to be running dreamdaemon as an administrator for it to work at all. TGS3 handles this automatically, and honestly there's no reason not to be using TGS3 if you're hosting on Windows. -### NOTE FOR LINUX HOSTS: This requires manual setup of iptables. Beware that improper configuration of this can and will irreversibly fuck up a server, so please don't tinker with it if you don't know what you're doing. -## Enabled -#FAIL2TOPIC_ENABLED -## Minimum wait time in deciseconds between valid requests -FAIL2TOPIC_RATE_LIMIT 10 -## Number of requests after breaching rate limit that triggers a ban -FAIL2TOPIC_MAX_FAILS 5 -## Firewall rule name used on physical server -## FOR LINUX HOSTS: This is used as the chain name. The iptables chain doesn't get created or hooked up to INPUT automatically, so you'll have to get that set up yourself. Recommended name: BYOND -FAIL2TOPIC_RULE_NAME _dd_fail2topic - -## Enable automatic profiling - Byond 513.1506 and newer only. -#AUTO_PROFILE - -## Uncomment to enable global ban DB using the provided URL. The API should expect to receive a ckey at the end of the URL. -## More API details can be found here: https://centcom.melonmesa.com -CENTCOM_BAN_DB https://centcom.melonmesa.com/ban/search +$include entries/admin.txt +$include entries/alert.txt +$include entries/antag_rep.txt +$include entries/comms.txt +$include entries/connections.txt +$include entries/dbconfig.txt +$include entries/debris.txt +$include entries/donator.txt +$include entries/dynamic.txt +$include entries/fetish_content.txt +$include entries/gamemodes.txt +$include entries/general.txt +$include entries/jexp.txt +$include entries/logging.txt +$include entries/movespeed.txt +$include entries/persistence.txt +$include entries/policy.txt +$include entries/resources.txt +$include entries/respawns.txt +$include entries/security.txt +$include entries/server.txt +$include entries/stamina_combat.txt +$include entries/threat.txt +$include entries/urls.txt +$include entries/vote.txt + +$include plushies/defines.txt diff --git a/config/donator_groupings.txt b/config/donator_groupings.txt deleted file mode 100644 index b26d1efe22..0000000000 --- a/config/donator_groupings.txt +++ /dev/null @@ -1,8 +0,0 @@ -#this is a bad system but I'm lazy so it piggybacks off config loader system. -#Specify group followed by ckey for each ckey. - -#TIER_1_DONATORS test_ckey - -#TIER_2_DONATORS test_ckey - -#TIER_3_DONATORS test_ckey diff --git a/config/entries/admin.txt b/config/entries/admin.txt new file mode 100644 index 0000000000..e583790b82 --- /dev/null +++ b/config/entries/admin.txt @@ -0,0 +1,83 @@ +## Comment this out if you want to use the SQL based admin system, the legacy system uses admins.txt. +## You need to set up your database to use the SQL based system. +## This flag is automatically enabled if SQL_ENABLED isn't +ADMIN_LEGACY_SYSTEM + +##Uncomment this to stop any admins loaded by the legacy system from having their rank edited by the permissions panel +#PROTECT_LEGACY_ADMINS + +##Uncomment this to stop any ranks loaded by the legacy system from having their flags edited by the permissions panel +#PROTECT_LEGACY_RANKS + +##Uncomment this to have admin ranks only loaded from the legacy admin_ranks.txt +##If enabled, each time admins are loaded ranks the database will be updated with the current ranks and their flags +#LOAD_LEGACY_RANKS_ONLY + +## Comment this out if you want to use the SQL based banning system. The legacy systems use the files in the data folder. You need to set up your database to use the SQL based system. +BAN_LEGACY_SYSTEM + +## Comment this out to stop locally connected clients from being given the almost full access !localhost! admin rank +ENABLE_LOCALHOST_RANK + +## Comment this out if you want to use the SQL based mentor system, the legacy system uses mentors.txt. +## You need to set up your database to use the SQL based system. +## This flag is automatically enabled if SQL_ENABLED isn't +MENTOR_LEGACY_SYSTEM + +#Mentors only see ckeys by default. Uncomment to have them only see mob name +#MENTORS_MOBNAME_ONLY + +## Uncomment this to forbid admins from possessing the singularity. +#FORBID_SINGULO_POSSESSION + +## Uncomment to show a popup 'reply to' window to every non-admin that receives an adminPM. +## The intention is to make adminPMs more visible. (although I fnd popups annoying so this defaults to off) +#POPUP_ADMIN_PM + +## Uncomment this to let players see their own notes (they can still be set by admins only) +#SEE_OWN_NOTES + +### Comment these two out to prevent notes fading out over time for admins. +## Notes older then this will start fading out. +NOTE_FRESH_DAYS 91.31055 +## Notes older then this will be completely faded out. +NOTE_STALE_DAYS 365.2422 + +## Comment this out if you've used the mass conversion sql proc for notes or want to stop converting notes +AUTOCONVERT_NOTES + +## Comment this out to stop admin messages sent anytime an admin disconnects from a round in play, you can edit the messages in admin.dm +ANNOUNCE_ADMIN_LOGOUT + +## Uncomment to have an admin message sent anytime an admin connects to a round in play, you can edit the messages in admin.dm +#ANNOUNCE_ADMIN_LOGIN + +## Uncomment to enable global ban DB using the provided URL. The API should expect to receive a ckey at the end of the URL. +## More API details can be found here: https://centcom.melonmesa.com +#CENTCOM_BAN_DB https://centcom.melonmesa.com/ban/search +## Uncomment to enable source whitelisting, a comma-separated list (no spaces) of CentCom sources (sourceName). +## If enabled, only bans from these servers will be shown to admins using CentCom. The default sources list is an example. +#CENTCOM_SOURCE_WHITELIST Beestation MRP,TGMC,FTL13 + +## AUTOADMIN +## The default admin rank +AUTOADMIN_RANK Game Master + +## Uncomment to automatically give that admin rank to all players +#AUTOADMIN + +## Comment this out to stop admins being able to choose their personal ooccolor +ALLOW_ADMIN_OOCCOLOR + +## Set to jobban "Guest-" accounts from Captain, HoS, HoP, CE, RD, CMO, Warden, Security, Detective, and AI positions. +## Set to 1 to jobban them from those positions, set to 0 to allow them. +# GUEST_JOBBAN + +## Uncomment this to stop people connecting to your server without a registered ckey. (i.e. guest-* are all blocked from connecting) +GUEST_BAN + +## Comment this out to disable automuting +#AUTOMUTE_ON + +## Allow admin hrefs that don't use the new token system, will eventually be removed +DEBUG_ADMIN_HREFS diff --git a/config/entries/alert.txt b/config/entries/alert.txt new file mode 100644 index 0000000000..5a03eadaec --- /dev/null +++ b/config/entries/alert.txt @@ -0,0 +1,13 @@ +## ALERT LEVELS ### +ALERT_GREEN All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced. +ALERT_BLUE_UPTO The station has received reliable information about potential threats to the station. Security staff may have weapons visible, random searches are permitted. +ALERT_BLUE_DOWNTO Significant confirmed threats have been neutralized. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still permitted. +ALERT_AMBER_UPTO There are signficant confirmed threats to the station. Security staff may have weapons unholstered at all times. Random searches are allowed and advised. +ALERT_AMBER_DOWNTO The immediate threat has passed. Security is no longer authorized to use lethal force, but may continue to have weapons drawn. Access requirements have been restored. +ALERT_RED_UPTO There is an immediate serious threat to the station. Security is now authorized to use lethal force. Additionally, access requirements on some machines have been lifted. +ALERT_RED_DOWNTO The station's destruction has been averted. There is still however an immediate serious threat to the station. Security is still authorized to use lethal force. +ALERT_DELTA Destruction of the station is imminent. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill. + +## Determines the minimum alert level for the security cyborg model to be chosen +## 0: Green, 1:Blue, 2:Amber, 3:Red, 4:Delta +MINIMUM_SECBORG_ALERT 3 diff --git a/config/entries/antag_rep.txt b/config/entries/antag_rep.txt new file mode 100644 index 0000000000..6cd9315a0c --- /dev/null +++ b/config/entries/antag_rep.txt @@ -0,0 +1,19 @@ +## disclaimer: this is a confusing file. reading and understanding antag rep code is recommended for future headmins/server leads. + +## Use the antagonist reputation system +# ANTAG_REP + +## Maximum antag roll ticketts someone can have +# ANTAG_REP_MAXIMUM 200 + +## "Free" tickets someone gets on roll +# DEFAULT_ANTAG_TICKETS 100 + +## Maximum **STORED** tickets used ontop of default per roll +# MAX_TICKETS_PER_ROLL 100 + +## Custom antag reputation values +## List of job titles followed by antag rep value, all prefixed with ANTAG_REP. See code/modules/jobs/job_types for titles +## e.g. +## ANTAG_REP Captain 10 +## ANTAG_REP Assistant 0 diff --git a/config/comms.txt b/config/entries/comms.txt similarity index 78% rename from config/comms.txt rename to config/entries/comms.txt index ae336d484b..7af6a758d3 100644 --- a/config/comms.txt +++ b/config/entries/comms.txt @@ -7,9 +7,12 @@ #CROSS_SERVER ServerName byond:\\address:port ## Name that the server calls itself in communications -#CROSS_COMMS_NAME +# CROSS_COMMS_NAME Citadel Main ## Network-name used for cross-server broadcasts made from communication consoles. ## Servers that do not match this network-name will have their messages discarded. ## Leaving this commented will allow all messages through, regardless of network. #CROSS_COMMS_NETWORK default_network + +## CITADEL CONFIG: List of cross server URLs, same as CROSS_SERVER, to send bunker override messages for +## Format is the same as CROSS_SERVER. diff --git a/config/entries/connections.txt b/config/entries/connections.txt new file mode 100644 index 0000000000..6351a77fcf --- /dev/null +++ b/config/entries/connections.txt @@ -0,0 +1,93 @@ +## Deny all new connections by ckeys we haven't seen before (exempts admins and only denies the connection if the database is enabled and connected) +## Requires database +#PANIC_BUNKER + +## If a player connects during a bunker with less then or this amount of living time (Minutes), we deny the connection +#PANIC_BUNKER_LIVING 90 + +## The message the Panic Bunker gives when someone is rejected by it +## %minutes% is replaced with PANIC_BUNKER_LIVING on runtime, remove it if you don't want this +#PANIC_BUNKER_MESSAGE Sorry, but the server is currently not accepting connections from players with less than %minutes% minutes of living time. + +## If panic bunker is on and a player is rejected (see above), attempt to send them to this connected server (see below) instead. +## You probably want this to be the same as CROSS_SERVER_ADDRESS +#PANIC_SERVER_ADDRESS byond://address:port + +##Name of the place to send people rejected by the bunker +#PANIC_SERVER_NAME [Put the name here] + +## Number of days for an individual panic bunker passthrough entry to be wiped. Note that they're also wiped as soon as a player is in the database. +#MAX_BUNKER_DAYS 7 + +## Notify admins when a new player connects for the first x days a player's been around. (0 for first connection only, -1 for never) +## Requres database +NOTIFY_NEW_PLAYER_AGE 0 + +## Notify admins when a player connects if their byond account was created in the last X days +## Requires database +NOTIFY_NEW_PLAYER_ACCOUNT_AGE 1 + +##Automated age verification, comment this out to not ask new users if they are 18+ +#AGE_VERIFICATION + +## Notify the irc channel when a new player makes their first connection +## Requres database +#IRC_FIRST_CONNECTION_ALERT + +## Comment this out to disable checking for the cid randomizer dll. (disabled if database isn't enabled or connected) +CHECK_RANDOMIZER + +## IPINTEL: +## This allows you to detect likely proxies by checking ips against getipintel.net +## Rating to warn at: (0.9 is good, 1 is 100% likely to be a spammer/proxy, 0.8 is 80%, etc) anything equal to or higher then this number triggers an admin warning +#IPINTEL_RATING_BAD 0.9 +## Contact email, (required to use the service, leaving blank or default disables IPINTEL) +#IPINTEL_EMAIL ch@nge.me +## How long to save good matches (ipintel rate limits to 15 per minute and 500 per day. so this shouldn't be too low, getipintel.net suggests 6 hours, time is in hours) (Your ip will get banned if you go over 500 a day too many times) +#IPINTEL_SAVE_GOOD 12 +## How long to save bad matches (these numbers can change as ips change hands, best not to save these for too long in case somebody gets a new ip used by a spammer/proxy before.) +#IPINTEL_SAVE_BAD 3 +## Domain name to query (leave commented out for the default, only needed if you pay getipintel.net for more querys) +#IPINTEL_DOMAIN check.getipintel.net + +## Uncomment to have the changelog file automatically open when a user connects and hasn't seen the latest changelog +#AGGRESSIVE_CHANGELOG + +## Uncomment to allow web client connections +#ALLOW_WEBCLIENT + +## Uncomment to restrict web client connections to byond members +## This makes for a nice pay gate to cut down on ban evading, as the webclient's cid system isn't that great +## byond membership starts at $10 for 3 months, so to use the webclient to evade, they would have sink 10 bucks in each evade. +#WEBCLIENT_ONLY_BYOND_MEMBERS + +## CLIENT VERSION CONTROL +## This allows you to configure the minimum required client version, as well as a warning version, and message for both. +## These trigger for any version below (non-inclusive) the given version, so 510 triggers on 509 or lower. +## These messages will be followed by one stating the clients current version and the required version for clarity. +## If CLIENT_WARN_POPUP is uncommented a popup window with the message will be displayed instead +#CLIENT_WARN_VERSION 511 +#CLIENT_WARN_POPUP +#CLIENT_WARN_MESSAGE Byond released 511 as the stable release. You can set the framerate your client runs at, which makes the game feel very different and cool. Shortly after its release we will end up using 511 client features and you will be forced to update. +CLIENT_ERROR_VERSION 511 +CLIENT_ERROR_MESSAGE Your version of byond is not supported. Please upgrade. +## The minimum build needed for joining the server, if using 512, a good minimum build would be 1421 as that disables the Middle Mouse Button exploit. +CLIENT_ERROR_BUILD 1421 + +## Uncomment for 'soft' population caps, players will be warned while joining if the living crew exceeds the listed number. +#SOFT_POPCAP 100 + +## Message for soft cap +SOFT_POPCAP_MESSAGE Be warned that the server is currently serving a high number of users, consider using alternative game servers. + +## Uncomment for 'hard' population caps, players will not be allowed to spawn if the living crew exceeds the listed number, though they may still observe or wait for the living crew to decrease in size. +#HARD_POPCAP 150 + +## Message for hard cap +HARD_POPCAP_MESSAGE The server is currently serving a high number of users, You cannot currently join. You may wait for the number of living crew to decline, observe, or find alternative servers. + +## Uncomment for 'extreme' population caps, players will not be allowed to join the server if living crew exceeds the listed number. +#EXTREME_POPCAP 200 + +## Message for extreme cap +EXTREME_POPCAP_MESSAGE The server is currently serving a high number of users, find alternative servers. diff --git a/config/dbconfig.txt b/config/entries/dbconfig.txt similarity index 93% rename from config/dbconfig.txt rename to config/entries/dbconfig.txt index 3a058fe563..d5bc37bce7 100644 --- a/config/dbconfig.txt +++ b/config/entries/dbconfig.txt @@ -43,3 +43,6 @@ BSQL_THREAD_LIMIT 50 ## Uncomment to enable verbose BSQL communication logs #BSQL_DEBUG + +## Time to wait before considering a query as lingering too long +@QUERY_DEBUG_LOG_TIMEOUT 70 diff --git a/config/entries/debris.txt b/config/entries/debris.txt new file mode 100644 index 0000000000..345ce6610f --- /dev/null +++ b/config/entries/debris.txt @@ -0,0 +1,8 @@ +## Default turf threshold to get dirt +TURF_DIRT_THRESHOLD 100 + +## Default alpha of dirt on spawn +DIRT_ALPHA_STARTING 127 + +## Multiplier for how dirty walking over a turf makes it +TURF_DIRTY_MULTIPLIER 1 diff --git a/config/entries/donator.txt b/config/entries/donator.txt new file mode 100644 index 0000000000..42c0461bf8 --- /dev/null +++ b/config/entries/donator.txt @@ -0,0 +1,11 @@ +## Citadel donator system +## this is a bad system but I'm lazy so it piggybacks off config loader system. +## File isn't properly documented because the donator system desperately needs a rewrite and I can't be arsed to right now. + +#Specify group followed by ckey for each ckey. + +#TIER_1_DONATORS test_ckey + +#TIER_2_DONATORS test_ckey + +#TIER_3_DONATORS test_ckey diff --git a/config/dynamic_config.txt b/config/entries/dynamic.txt similarity index 98% rename from config/dynamic_config.txt rename to config/entries/dynamic.txt index 480f6d8ed8..e08fb7634d 100644 --- a/config/dynamic_config.txt +++ b/config/entries/dynamic.txt @@ -307,3 +307,12 @@ DYNAMIC_ASSASSINATE_COST 2 DYNAMIC_WAROPS_REQUIREMENT 60 DYNAMIC_WAROPS_COST 10 + +## Storyteller min players +# STORYTELLER_MIN_PLAYERS CHAOTIC 35 + +## Storyteller minimum chaos +# STORYTELLER_MIN_CHAOS CHAOTIC 75 + +## Storyteller maximum chaos +# STORYTELLER_MAX_CHAOS CHAOTIC 250 diff --git a/config/entries/fetish_content.txt b/config/entries/fetish_content.txt new file mode 100644 index 0000000000..6fabd095d8 --- /dev/null +++ b/config/entries/fetish_content.txt @@ -0,0 +1,33 @@ +## Breast cups selectable from the character creation menu. Keep em lowercase. +BREASTS_CUPS_PREFS a +BREASTS_CUPS_PREFS b +BREASTS_CUPS_PREFS c +BREASTS_CUPS_PREFS d +BREASTS_CUPS_PREFS e +BREASTS_CUPS_PREFS f +BREASTS_CUPS_PREFS g +BREASTS_CUPS_PREFS h + +## Minimum and maximum limits for penis length from the character creation menu. +PENIS_MIN_INCHES_PREFS 1 +PENIS_MAX_INCHES_PREFS 24 + +## Body size configs, the feature will be disabled if both min and max have the same value. +BODY_SIZE_MIN 0.9 +BODY_SIZE_MAX 1.25 + +## Allowed visibility toggles + +# SAFE_VISIBILITY_TOGGLES Always visible +SAFE_VISIBILITY_TOGGLES Hidden by clothes +SAFE_VISIBILITY_TOGGLES Hidden by underwear +SAFE_VISIBILITY_TOGGLES Always hidden + +## Pun-Pun movement slowdown given to characters with a body size smaller than this value, +## to compensate for their smaller hitbox. +## To disable, just make sure the value is lower than 'body_size_min' +THRESHOLD_BODY_SIZE_PENALTY 1 + +## Multiplier used in the smaller strides slowdown calculation. +## Doesn't apply to floating or crawling mobs. +BODY_SIZE_SLOWDOWN_MULTIPLIER 0 diff --git a/config/entries/gamemodes.txt b/config/entries/gamemodes.txt new file mode 100644 index 0000000000..f78c3743aa --- /dev/null +++ b/config/entries/gamemodes.txt @@ -0,0 +1,178 @@ +## Comment to disable weighting modes by how chaotic recent mode rolls were. +WEIGH_BY_RECENT_CHAOS + +## The weight adjustment will be proportional to this power relative to the "ideal" weight range. +## e.g. if we have a weight range of 0-5, and an exponent of 1, 6 will be weighted 1/2, 7 1/3 etc. +## if exponent is 2, it'll be 1/4, 1/9 etc. +CHAOS_EXPONENT 1 + +## Percent weight reductions for three of the most recent modes + +REPEATED_MODE_ADJUST 45 30 10 + +## Probablities for game modes chosen in 'secret' and 'random' modes. +## Default probablity is 1, increase to make that mode more likely to be picked. +## Set to 0 to disable that mode. + +PROBABILITY TRAITOR 5 +PROBABILITY TRAITORBRO 2 +PROBABILITY TRAITORCHAN 4 +PROBABILITY INTERNAL_AFFAIRS 3 +PROBABILITY NUCLEAR 2 +PROBABILITY REVOLUTION 2 +PROBABILITY CULT 2 +PROBABILITY CHANGELING 2 +PROBABILITY WIZARD 4 +PROBABILITY MONKEY 0 +PROBABILITY METEOR 0 +PROBABILITY EXTENDED 0 +PROBABILITY SECRET_EXTENDED 0 +PROBABILITY DEVIL 0 +PROBABILITY DEVIL_AGENTS 0 +PROBABILITY CLOWNOPS 0 +PROBABILITY BLOODSUCKER 0 + +## You probably want to keep sandbox off by default for secret and random. +PROBABILITY SANDBOX 0 + +## Toggles for continuous modes. +## Modes that aren't continuous will end the instant all antagonists are dead. + +CONTINUOUS TRAITOR +CONTINUOUS TRAITORBRO +CONTINUOUS TRAITORCHAN +CONTINUOUS INTERNAL_AFFAIRS +#CONTINUOUS NUCLEAR +#CONTINUOUS REVOLUTION +CONTINUOUS CULT +CONTINUOUS CLOCKWORK_CULT +CONTINUOUS CHANGELING +CONTINUOUS WIZARD +#CONTINUOUS MONKEY +CONTINUOUS BLOODSUCKER +CONTINUOUS HERESY + +##Note: do not toggle continuous off for these modes, as they have no antagonists and would thus end immediately! + +CONTINUOUS METEOR +CONTINUOUS EXTENDED +CONTINUOUS SECRET_EXTENDED + +## Toggles for allowing midround antagonists (aka mulligan antagonists). +## In modes that are continuous, if all antagonists should die then a new set of antagonists will be created. + +MIDROUND_ANTAG TRAITOR +#MIDROUND_ANTAG TRAITORBRO +MIDROUND_ANTAG TRAITORCHAN +MIDROUND_ANTAG INTERNAL_AFFAIRS +#MIDROUND_ANTAG NUCLEAR +#MIDROUND_ANTAG REVOLUTION +MIDROUND_ANTAG CULT +MIDROUND_ANTAG CLOCKWORK_CULT +MIDROUND_ANTAG CHANGELING +MIDROUND_ANTAG WIZARD +#MIDROUND_ANTAG MONKEY + +## Toggles for whether this mode should force antags even if not enough players have it enabled. +## If it's off, it just won't roll as many antags. +#FORCE_ANTAG_COUNT TRAITOR +#FORCE_ANTAG_COUNT TRAITORBRO +#FORCE_ANTAG_COUNT TRAITORCHAN +#FORCE_ANTAG_COUNT INTERNAL_AFFAIRS +FORCE_ANTAG_COUNT NUCLEAR +FORCE_ANTAG_COUNT REVOLUTION +FORCE_ANTAG_COUNT CULT +FORCE_ANTAG_COUNT CLOCKWORK_CULT +#FORCE_ANTAG_COUNT CHANGELING +#FORCE_ANTAG_COUNT WIZARD +#FORCE_ANTAG_COUNT MONKEY + +## A config for how much each game mode's chaos level is. +## All of them have reasonable defaults, but this can be used to adjust them. +## 0-9, where 0 is lowest chaos (should only be extended) and 9 is highest (wizard? nukies?) +#CHAOS_LEVEL EXTENDED 0 + +## Uncomment these for overrides of the minimum / maximum number of players in a round type. +## If you set any of these occasionally check to see if you still need them as the modes +## will still be actively rebalanced around the SUGGESTED populations, not your overrides. +## Notes: For maximum number of players a value of -1 means no maximum. Setting minimums to +## VERY low numbers (< 5) can lead to errors if the roundtypes were not designed for that. + +#MIN_POP TRAITOR 0 +#MAX_POP TRAITOR -1 + +#MIN_POP TRAITORBRO 0 +#MAX_POP TRAITORBRO -1 + +#MIN_POP TRAITORCHAN 15 +#MAX_POP TRAITORCHAN -1 + +#MIN_POP DOUBLE_AGENTS 25 +#MAX_POP DOUBLE_AGENTS -1 + +#MIN_POP NUCLEAR 0 +#MAX_POP NUCLEAR -1 + +#MIN_POP REVOLUTION 20 +#MAX_POP REVOLUTION -1 + +#MIN_POP CULT 24 +#MAX_POP CULT -1 + +#MIN_POP CLOCKWORK_CULT 24 +#MAX_POP CLOCKWORK_CULT -1 + +#MIN_POP CHANGELING 15 +#MAX_POP CHANGELING -1 + +#MIN_POP WIZARD 20 +#MAX_POP WIZARD -1 + +#MIN_POP MONKEY 20 +#MAX_POP MONKEY -1 + +#MIN_POP METEOR 0 +#MAX_POP METEOR -1 + +#MIN_POP DEVIL 0 +#MAX_POP DEVIL -1 + +#MIN_POP DEVIL_AGENTS 25 +#MAX_POP DEVIL_AGENTS -1 + +## Setting at least one mode to be playable at 0/1 players is required. +#MIN_POP EXTENDED 0 +#MAX_POP EXTENDED -1 + +## Variables calculate how number of antagonists will scale to population. +## Used as (Antagonists = Population / Coeff) +## Set to 0 to disable scaling and use default numbers instead. +TRAITOR_SCALING_COEFF 6 +## per brother TEAM +BROTHER_SCALING_COEFF 12 +CHANGELING_SCALING_COEFF 6 +## heretics +ECULT_SCALING_COEFF 5 +## per abductor TEAM +ABDUCTOR_SCALING_COEFF 15 + +## Variables calculate how number of open security officer positions will scale to population. +## Used as (Officers = Population / Coeff) +## Set to 0 to disable scaling and use default numbers instead. +SECURITY_SCALING_COEFF 8 + +## The number of objectives traitors get. +## Not including escaping/hijacking. +TRAITOR_OBJECTIVES_AMOUNT 2 +BROTHER_OBJECTIVES_AMOUNT 2 + +## Uncomment to prohibit jobs that start with loyalty +## implants from being most antagonists. +#PROTECT_ROLES_FROM_ANTAGONIST + +## Uncomment to prohibit assistants from becoming most antagonists. +#PROTECT_ASSISTANT_FROM_ANTAGONIST + + +## If late-joining players have a chance to become a traitor/changeling +ALLOW_LATEJOIN_ANTAGONISTS diff --git a/config/game_options.txt b/config/entries/general.txt similarity index 63% rename from config/game_options.txt rename to config/entries/general.txt index b9d763e5b0..b426881de9 100644 --- a/config/game_options.txt +++ b/config/entries/general.txt @@ -1,3 +1,51 @@ +## Lobby time: This is the amount of time between rounds that players have to setup their characters and be ready. +LOBBY_COUNTDOWN 120 + +## Round End Time: This is the amount of time after the round ends that players have to murder death kill each other. +ROUND_END_COUNTDOWN 90 + +## period of time in seconds for players to be considered inactive +# INACTIVITY_PERIOD 300 + +## period of time in seconds for players to be considered afk and kickable +# AFK_PERIOD 600 + +## disconnect players who are considered afk +# KICK_INACTIVE + +## Job slot open/close by identification consoles delay in seconds +ID_CONSOLE_JOBSLOT_DELAY 30 + + +## disables calling del(src) on newmobs if they logout before spawnin in +# DONT_DEL_NEWMOB + +## In-game features +##Toggle for having jobs load up from the .txt +# LOAD_JOBS_FROM_TXT + + +## Uncomment to allow special 'Easter-egg' events on special holidays such as seasonal holidays and stuff like 'Talk Like a Pirate Day' :3 YAARRR +ALLOW_HOLIDAYS + +## Uncomment to show the names of the admin sending a pm from IRC instead of showing as a stealthmin. +#SHOW_IRC_NAME + +## Chat Announce Options +## Various messages to be sent to game chats +## Uncommenting these will enable them, by default they will be broadcast to Game chat channels on TGS3 or non-admin channels on TGS4 +## If using TGS4, the string option can be set as a chat channel tag to limit the message to channels of that tag type (case-sensitive) +## i.e. CHAT_ANNOUNCE_NEW_GAME chat_channel_tag + +## Send a message with the station name starting a new game +#CHAT_ANNOUNCE_NEW_GAME + +##Default screen resolution, in tiles. +## By default, this is 15x15, which gets simplified to 7 by BYOND, as it is a 1:1 screen ratio. +## For reference, Goonstation uses a resolution of 21x15 for it's widescreen mode. +## Do note that changing this value will affect the title screen. The title screen will have to be updated manually if this is changed. +DEFAULT_VIEW 21x15 + ## HEALTH ### ##Damage multiplier, effects both weapons and healing on all mobs. For example, 1.25 would result in 25% higher damage. @@ -22,30 +70,6 @@ OOC_DURING_ROUND ## Comment this out if you want to disable emojis EMOJIS -## MOB MOVEMENT ### - -## We suggest editing these variables ingame to find a good speed for your server. -## To do this you must be a high level admin. Open the 'debug' tab ingame. -## Select "Debug Controller" and then, in the popup, select "Configuration". These variables should have the same name. - -## These values get directly added to values and totals ingame. -## To speed things up make the number negative, to slow things down, make the number positive. - -## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied. -RUN_DELAY 1 -WALK_DELAY 4 - -## The variables below affect the movement of specific mob types. THIS AFFECTS ALL SUBTYPES OF THE TYPE YOU CHOOSE! -## Entries completely override all subtypes. Later entries have precedence over earlier entries. -## This means if you put /mob 0 on the last entry, it will null out all changes, while if you put /mob as the first entry and -## /mob/living/carbon/human on the last entry, the last entry will override the first. -MULTIPLICATIVE_MOVESPEED /mob/living/carbon/human 1 -##MULTIPLICATIVE_MOVESPEED /mob/living/silicon/robot 0 -##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/monkey 0 -##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/alien 0 -##MULTIPLICATIVE_MOVESPEED /mob/living/simple_animal/slime 0 -MULTIPLICATIVE_MOVESPEED /mob/living/simple_animal 1 - ## NAMES ### ## If uncommented this adds a random surname to a player's name if they only specify one name. @@ -54,205 +78,18 @@ MULTIPLICATIVE_MOVESPEED /mob/living/simple_animal 1 ## If uncommented, this forces all players to use random names !and appearances!. #FORCE_RANDOM_NAMES - -## ALERT LEVELS ### -ALERT_GREEN All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced. -ALERT_BLUE_UPTO The station has received reliable information about potential threats to the station. Security staff may have weapons visible, random searches are permitted. -ALERT_BLUE_DOWNTO Significant confirmed threats have been neutralized. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still permitted. -ALERT_AMBER_UPTO There are signficant confirmed threats to the station. Security staff may have weapons unholstered at all times. Random searches are allowed and advised. -ALERT_AMBER_DOWNTO The immediate threat has passed. Security is no longer authorized to use lethal force, but may continue to have weapons drawn. Access requirements have been restored. -ALERT_RED_UPTO There is an immediate serious threat to the station. Security is now authorized to use lethal force. Additionally, access requirements on some machines have been lifted. -ALERT_RED_DOWNTO The station's destruction has been averted. There is still however an immediate serious threat to the station. Security is still authorized to use lethal force. -ALERT_DELTA Destruction of the station is imminent. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill. - - - ## GAME MODES ### ## Uncomment to not send a roundstart intercept report. Gamemodes may override this. #NO_INTERCEPT_REPORT -## Comment to disable weighting modes by how chaotic recent mode rolls were. -WEIGH_BY_RECENT_CHAOS - -## The weight adjustment will be proportional to this power relative to the "ideal" weight range. -## e.g. if we have a weight range of 0-5, and an exponent of 1, 6 will be weighted 1/2, 7 1/3 etc. -## if exponent is 2, it'll be 1/4, 1/9 etc. -CHAOS_EXPONENT 1 - -## Probablities for game modes chosen in 'secret' and 'random' modes. -## Default probablity is 1, increase to make that mode more likely to be picked. -## Set to 0 to disable that mode. - -PROBABILITY TRAITOR 5 -PROBABILITY TRAITORBRO 2 -PROBABILITY TRAITORCHAN 4 -PROBABILITY INTERNAL_AFFAIRS 3 -PROBABILITY NUCLEAR 2 -PROBABILITY REVOLUTION 2 -PROBABILITY CULT 2 -PROBABILITY CHANGELING 2 -PROBABILITY WIZARD 4 -PROBABILITY MONKEY 0 -PROBABILITY METEOR 0 -PROBABILITY EXTENDED 0 -PROBABILITY SECRET_EXTENDED 0 -PROBABILITY DEVIL 0 -PROBABILITY DEVIL_AGENTS 0 -PROBABILITY CLOWNOPS 0 -PROBABILITY BLOODSUCKER 0 - -## You probably want to keep sandbox off by default for secret and random. -PROBABILITY SANDBOX 0 - -## Percent weight reductions for three of the most recent modes - -REPEATED_MODE_ADJUST 45 30 10 - -## Toggles for continuous modes. -## Modes that aren't continuous will end the instant all antagonists are dead. - -CONTINUOUS TRAITOR -CONTINUOUS TRAITORBRO -CONTINUOUS TRAITORCHAN -CONTINUOUS INTERNAL_AFFAIRS -#CONTINUOUS NUCLEAR -#CONTINUOUS REVOLUTION -CONTINUOUS CULT -CONTINUOUS CLOCKWORK_CULT -CONTINUOUS CHANGELING -CONTINUOUS WIZARD -#CONTINUOUS MONKEY -CONTINUOUS BLOODSUCKER -CONTINUOUS HERESY - -##Note: do not toggle continuous off for these modes, as they have no antagonists and would thus end immediately! - -CONTINUOUS METEOR -CONTINUOUS EXTENDED -CONTINUOUS SECRET_EXTENDED - - -## Toggles for allowing midround antagonists (aka mulligan antagonists). -## In modes that are continuous, if all antagonists should die then a new set of antagonists will be created. - -MIDROUND_ANTAG TRAITOR -#MIDROUND_ANTAG TRAITORBRO -MIDROUND_ANTAG TRAITORCHAN -MIDROUND_ANTAG INTERNAL_AFFAIRS -#MIDROUND_ANTAG NUCLEAR -#MIDROUND_ANTAG REVOLUTION -MIDROUND_ANTAG CULT -MIDROUND_ANTAG CLOCKWORK_CULT -MIDROUND_ANTAG CHANGELING -MIDROUND_ANTAG WIZARD -#MIDROUND_ANTAG MONKEY - -## Toggles for whether this mode should force antags even if not enough players have it enabled. -## If it's off, it just won't roll as many antags. -#FORCE_ANTAG_COUNT TRAITOR -#FORCE_ANTAG_COUNT TRAITORBRO -#FORCE_ANTAG_COUNT TRAITORCHAN -#FORCE_ANTAG_COUNT INTERNAL_AFFAIRS -FORCE_ANTAG_COUNT NUCLEAR -FORCE_ANTAG_COUNT REVOLUTION -FORCE_ANTAG_COUNT CULT -FORCE_ANTAG_COUNT CLOCKWORK_CULT -#FORCE_ANTAG_COUNT CHANGELING -#FORCE_ANTAG_COUNT WIZARD -#FORCE_ANTAG_COUNT MONKEY - -## A config for how much each game mode's chaos level is. -## All of them have reasonable defaults, but this can be used to adjust them. -## 0-9, where 0 is lowest chaos (should only be extended) and 9 is highest (wizard? nukies?) -#CHAOS_LEVEL EXTENDED 0 - -## Uncomment these for overrides of the minimum / maximum number of players in a round type. -## If you set any of these occasionally check to see if you still need them as the modes -## will still be actively rebalanced around the SUGGESTED populations, not your overrides. -## Notes: For maximum number of players a value of -1 means no maximum. Setting minimums to -## VERY low numbers (< 5) can lead to errors if the roundtypes were not designed for that. - -#MIN_POP TRAITOR 0 -#MAX_POP TRAITOR -1 - -#MIN_POP TRAITORBRO 0 -#MAX_POP TRAITORBRO -1 - -#MIN_POP TRAITORCHAN 15 -#MAX_POP TRAITORCHAN -1 - -#MIN_POP DOUBLE_AGENTS 25 -#MAX_POP DOUBLE_AGENTS -1 - -#MIN_POP NUCLEAR 0 -#MAX_POP NUCLEAR -1 - -#MIN_POP REVOLUTION 20 -#MAX_POP REVOLUTION -1 - -#MIN_POP CULT 24 -#MAX_POP CULT -1 - -#MIN_POP CLOCKWORK_CULT 24 -#MAX_POP CLOCKWORK_CULT -1 - -#MIN_POP CHANGELING 15 -#MAX_POP CHANGELING -1 - -#MIN_POP WIZARD 20 -#MAX_POP WIZARD -1 - -#MIN_POP MONKEY 20 -#MAX_POP MONKEY -1 - -#MIN_POP METEOR 0 -#MAX_POP METEOR -1 - -#MIN_POP DEVIL 0 -#MAX_POP DEVIL -1 - -#MIN_POP DEVIL_AGENTS 25 -#MAX_POP DEVIL_AGENTS -1 - -## Setting at least one mode to be playable at 0/1 players is required. -#MIN_POP EXTENDED 0 -#MAX_POP EXTENDED -1 - +## If non-human species are barred from joining as a head of staff +#ENFORCE_HUMAN_AUTHORITY ## The amount of time it takes for the emergency shuttle to be called, from round start. SHUTTLE_REFUEL_DELAY 12000 -## Variables calculate how number of antagonists will scale to population. -## Used as (Antagonists = Population / Coeff) -## Set to 0 to disable scaling and use default numbers instead. -TRAITOR_SCALING_COEFF 6 -BROTHER_SCALING_COEFF 6 -CHANGELING_SCALING_COEFF 6 - -## Variables calculate how number of open security officer positions will scale to population. -## Used as (Officers = Population / Coeff) -## Set to 0 to disable scaling and use default numbers instead. -SECURITY_SCALING_COEFF 8 - -## The number of objectives traitors get. -## Not including escaping/hijacking. -TRAITOR_OBJECTIVES_AMOUNT 2 -BROTHER_OBJECTIVES_AMOUNT 2 - -## Uncomment to prohibit jobs that start with loyalty -## implants from being most antagonists. -#PROTECT_ROLES_FROM_ANTAGONIST - -## Uncomment to prohibit assistants from becoming most antagonists. -#PROTECT_ASSISTANT_FROM_ANTAGONIST - -## If non-human species are barred from joining as a head of staff -#ENFORCE_HUMAN_AUTHORITY - -## If late-joining players have a chance to become a traitor/changeling -ALLOW_LATEJOIN_ANTAGONISTS ## Comment this out to disable the antagonist reputation system. This system rewards players who participate in the game instead of greytiding by giving them slightly higher odds to ## roll antagonist in subsequent rounds until they get it. @@ -303,9 +140,6 @@ ALLOW_AI_MULTICAM ## Uncomment to prevent the security cyborg module from being chosen #DISABLE_SECBORG -## Determines the minimum alert level for the security cyborg model to be chosen -## 0: Green, 1:Blue, 2:Amber, 3:Red, 4:Delta -MINIMUM_SECBORG_ALERT 3 ## Peacekeeper Borg ### ## Uncomment to prevent the peacekeeper cyborg module from being chosen @@ -643,39 +477,10 @@ BOX_RANDOM_ENGINE Box Empty,0 BOX_RANDOM_ENGINE Box Antimatter,1 BOX_RANDOM_ENGINE Box P.A.C.M.A.N,1 -## Whether or not there's a mode tier list vote after the secret/extended vote. -MODETIER_VOTING - -## Number of modes dropped by the modetier vote during mode selection, after vote. -DROPPED_MODES 3 ## Whether the suicide verb is allowed. # SUICIDE_ALLOWED -## Breast cups selectable from the character creation menu. Keep em lowercase. -BREASTS_CUPS_PREFS a -BREASTS_CUPS_PREFS b -BREASTS_CUPS_PREFS c -BREASTS_CUPS_PREFS d -BREASTS_CUPS_PREFS e - -## Minimum and maximum limits for penis length from the character creation menu. -PENIS_MIN_INCHES_PREFS 1 -PENIS_MAX_INCHES_PREFS 20 - -## Body size configs, the feature will be disabled if both min and max have the same value. -BODY_SIZE_MIN 0.9 -BODY_SIZE_MAX 1.25 - -## Pun-Pun movement slowdown given to characters with a body size smaller than this value, -## to compensate for their smaller hitbox. -## To disable, just make sure the value is lower than 'body_size_min' -THRESHOLD_BODY_SIZE_PENALTY 1 - -## Multiplier used in the smaller strides slowdown calculation. -## Doesn't apply to floating or crawling mobs. -BODY_SIZE_SLOWDOWN_MULTIPLIER 0 - ## Allows players to set a hexadecimal color of their choice as skin tone, on top of the standard ones. ALLOW_CUSTOM_SKINTONES @@ -683,11 +488,15 @@ ALLOW_CUSTOM_SKINTONES ## Camera mobs, AIs, ghosts and some other are of course exempt from this. This also doesn't influence simplemob AI, for the best. #USE_FIELD_OF_VISION -## Default turf threshold to get dirt -TURF_DIRT_THRESHOLD 100 - -## Default alpha of dirt on spawn -DIRT_ALPHA_STARTING 127 ## Allows pAI custom holoforms PAI_CUSTOM_HOLOFORMS + +## How long in seconds after which a hard delete is treated as causing lag. This can be a float and supports a precision as low as nanoseconds. +#HARD_DELETES_OVERRUN_THRESHOLD 0.5 + +## Once a typepath causes overrun from hard deletes this many times, stop hard deleting it on garbage collection failures. (set to 0 to disable) +#HARD_DELETES_OVERRUN_LIMIT 0 + +## Enables monstermos/"equalization" step in atmos. +# ATMOS_EQUALIZATION_ENABLED diff --git a/config/entries/jexp.txt b/config/entries/jexp.txt new file mode 100644 index 0000000000..e46d743a66 --- /dev/null +++ b/config/entries/jexp.txt @@ -0,0 +1,23 @@ +## Uncomment this entry to have certain jobs require your account to be at least a certain number of days old to select. You can configure the exact age requirement for different jobs by editing +## the minimal_player_age variable in the files in folder /code/game/jobs/job/.. for the job you want to edit. Set minimal_player_age to 0 to disable age requirement for that job. +## REQUIRES the database set up to work. Keep it hashed if you don't have a database set up. +## NOTE: If you have just set-up the database keep this DISABLED, as player age is determined from the first time they connect to the server with the database up. If you just set it up, it means +## you have noone older than 0 days, since noone has been logged yet. Only turn this on once you have had the database up for 30 days. +#USE_AGE_RESTRICTION_FOR_JOBS + +## Uncomment this to have the job system use the player's account creation date, rather than the when they first joined the server for job timers. +#USE_ACCOUNT_AGE_FOR_JOBS + +## Unhash this to track player playtime in the database. Requires database to be enabled. +#USE_EXP_TRACKING +## Unhash this to enable playtime requirements for head jobs. +#USE_EXP_RESTRICTIONS_HEADS +## Unhash this to override head jobs' playtime requirements with this number of hours. +## Leave this commented out to use the values defined in the job datums. Values in the datums are stored as minutes. +#USE_EXP_RESTRICTIONS_HEADS_HOURS 3 +## Unhash this to change head jobs' playtime requirements so that they're based on department playtime, rather than crew playtime. +#USE_EXP_RESTRICTIONS_HEADS_DEPARTMENT +## Unhash this to enable playtime requirements for certain non-head jobs, like Engineer and Scientist. +#USE_EXP_RESTRICTIONS_OTHER +## Allows admins to bypass job playtime requirements. +#USE_EXP_RESTRICTIONS_ADMIN_BYPASS diff --git a/config/entries/logging.txt b/config/entries/logging.txt new file mode 100644 index 0000000000..1690dbfacf --- /dev/null +++ b/config/entries/logging.txt @@ -0,0 +1,85 @@ +## log OOC channel +LOG_OOC + +## log client Say +LOG_SAY + +## log admin actions +@LOG_ADMIN + +## log admin chat +@LOG_ADMINCHAT + +## log client access (logon/logoff) +LOG_ACCESS + +## log game actions (start of round, results, etc.) +LOG_GAME + +## log player votes +LOG_VOTE + +## log player crafting +LOG_CRAFT + +## log client Whisper +LOG_WHISPER + +## log emotes +LOG_EMOTE + +## log attack messages +LOG_ATTACK + +## log pda messages +LOG_PDA + +## log telecomms messages +LOG_TELECOMMS + +## log prayers +LOG_PRAYER + +## log lawchanges +LOG_LAW + +## log crew manifest to seperate file +LOG_MANIFEST + +## log job divide debugging information +LOG_JOB_DEBUG + +## Log shuttle related actions +LOG_SHUTTLE + +## log all world.Topic() calls +LOG_WORLD_TOPIC + +## enables use of the proc twitterize() that lets you take a large list of strings and turn it into a JSON file of tweet sized strings. +## As an example of how this could be """useful""" look towards Poly (https://twitter.com/Poly_the_Parrot) +# LOG_TWITTER + +## Enable logging pictures +LOG_PICTURES + +## Log camera pictures +PICTURE_LOGGING_CAMERA + +## log virus and actions +LOG_VIRUS + +## Log all raw hrefs of tgui, rather than letting tgui logging handle it. KEEP THIS OFF UNLESS YOU KNOW WHAT YOU ARE DOING. +# EMERGENCY_TGUI_LOGGING + +## Cooldown time for each occurance of a unique runtime in deciseconds +ERROR_COOLDOWN 600 + +## Max runtimes of one type before silencing +ERROR_LIMIT 50 + +## How long an unique runtime will be silenced for when reaching limit in deciseconds +ERROR_SILENCE_TIME 6000 + +How long to wait between messaging admins about an unique runtime +ERROR_MSG_DELAY 50 + diff --git a/config/entries/movespeed.txt b/config/entries/movespeed.txt new file mode 100644 index 0000000000..67f9ab503b --- /dev/null +++ b/config/entries/movespeed.txt @@ -0,0 +1,56 @@ +## MOB MOVEMENT ### + +## We suggest editing these variables ingame to find a good speed for your server. +## To do this you must be a high level admin. Open the 'debug' tab ingame. +## Select "Debug Controller" and then, in the popup, select "Configuration". These variables should have the same name. + +## These values get directly added to values and totals ingame. +## To speed things up make the number negative, to slow things down, make the number positive. + +## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied. +RUN_DELAY 1.5 +WALK_DELAY 4 + +## The variables below affect the movement of specific mob types. THIS AFFECTS ALL SUBTYPES OF THE TYPE YOU CHOOSE! +## Entries completely override all subtypes. Later entries have precedence over earlier entries. +## This means if you put /mob 0 on the last entry, it will null out all changes, while if you put /mob as the first entry and +## /mob/living/carbon/human on the last entry, the last entry will override the first. +MULTIPLICATIVE_MOVESPEED /mob/living/carbon/alien -1 +MULTIPLICATIVE_MOVESPEED /mob/living/carbon/alien/humanoid/sentinel -0.75 +MULTIPLICATIVE_MOVESPEED /mob/living/carbon/alien/humanoid/drone -0.5 +MULTIPLICATIVE_MOVESPEED /mob/living/carbon/alien/humanoid/royal/praetorian 0 +MULTIPLICATIVE_MOVESPEED /mob/living/carbon/alien/humanoid/royal/queen 2 + +## The above, only when a mob is FLOATING +MULTIPLICATIVE_MOVESPEED_FLOATING /mob/living/carbon -0.5 +MULTIPLICATIVE_MOVESPEED_FLOATING /mob/living 0 + +## Whether or not sprint is enabled +SPRINT_ENABLED 0 + +## When sprint is off, how much does getting staggered slow you +SPRINTLESS_STAGGER_SLOWDOWN 0.5 + +## When sprint is off, how much does getting shoved off balance slow you +SPRINTLESS_OFF_BALANCE_SLOWDOWN 0.85 + +## Melee stagger power multiplier +MELEE_STAGGER_FACTOR 1 + +## Sprint speed increase +SPRINT_SPEED_INCREASE 1 + +## Max tiles/second increase from sprint +SPRINT_MAX_TILES_INCREASE 5 + +## Absolute max speed sprint can make someone go (tiles/second) +SPRINT_ABSOLUTE_MAX_TILES 13 + +## Max sprint buffer +SPRINT_BUFFER_MAX 24 + +## Stamina/tile when bufer empty +SPRINT_STAMINA_COST 1.4 + +## Buffer regen/decisecond - 0.4 = 4/second +SPRINT_BUFFER_REGEN_PER_DS 0.4 diff --git a/config/persistence.txt b/config/entries/persistence.txt similarity index 100% rename from config/persistence.txt rename to config/entries/persistence.txt diff --git a/config/entries/policy.txt b/config/entries/policy.txt new file mode 100644 index 0000000000..07f64b5b2a --- /dev/null +++ b/config/entries/policy.txt @@ -0,0 +1,24 @@ +## Policy configuration +## Current valid keys are: +## ON_CLONE - displayed after a successful cloning operation to the cloned person +## ON_DEFIB_INTACT - displayed after defibbing before memory loss time threshold +## ON_DEFIB_LATE - displayed after defibbing post memory loss time threshold +## SDGF - displayed on SDGF clone spawning +## SDGF_GOOD - displayed on SDGF clone spawning, if the clone is loyal +## SDGF_BAD - displayed on SDGF clone spawning, if the clone is not loyal +## PAI - displayed on PAI personality being loaded +## EXAMPLE: +## POLICY ON_CLONE insert text here span classes are fully supported + +POLICY ON_CLONE Your thoughts are hazy as the cloning algorithms reboot your consciousness. Unfortunately for you, the imperfect nature of the process has left out your more recent, less entrenched memories.
You only remember vague details of your death, without clear recollection of who or what is specifically responsible for your demise.
(If you were murdered, you do not remember the exact name or appearance of your killer, only vague details of how they killed you rather than the exact murder weapon. (ex: drank something and blanked out, felt an impact in the back and bled out)
If you died to environmental hazards like ash storms or spacing, this is not as applicable -- however, keep in mind that if someone set you up to die to that, like being tossed forcefully into space, that the previous clause of not remembering killer name in a murder applies!
+ +POLICY ON_DEFIB_LATE Your mind barely responds as first as you are forcefully returned to the world of the living after all too long in a state of decay. While medicine may restore your brain functions, you can't seem to remember your latest memories...
You only remember vague details of your death, without clear recollection of who or what is specifically responsible for your demise.
(If you were murdered, you do not remember the exact name or appearance of your killer, only vague details of how they killed you rather than the exact murder weapon. (ex: drank something and blanked out, felt an impact in the back and bled out)
If you died to environmental hazards like ash storms or spacing, this is not as applicable -- however, keep in mind that if someone set you up to die to that, like being tossed forcefully into space, that the previous clause of not remembering killer name in a murder applies!
+ +POLICY ON_DEFIB_INTACT You barely miss a beat as you gasp, awakening from the slumber of the deceased. The rapid resuscitation has saved you from the worst effects of brain damage.
You recall all information leading up to your death and exact details on method of death and killer if applicable, as long as you were conscious to witness such. + +POLICY PAI If you are given an ERP-related directive without OOC consent, ahelp immediately.w + +## Misc entries for above + +## Defib time limit for "cloning memory disorder" memory loss in seconds +DEFIB_CMD_TIME_LIMIT 300 diff --git a/config/resources.txt b/config/entries/resources.txt similarity index 100% rename from config/resources.txt rename to config/entries/resources.txt diff --git a/config/respawns.txt b/config/entries/respawns.txt similarity index 90% rename from config/respawns.txt rename to config/entries/respawns.txt index 804a856a93..41c76eaabc 100644 --- a/config/respawns.txt +++ b/config/entries/respawns.txt @@ -2,7 +2,7 @@ RESPAWNS_ENABLED ## Minutes delay before allowing respawns, either from death or observing. Not an integer. -RESPAWN_DELAY 15.0 +RESPAWN_DELAY 10.0 ## Minutes delay before allowing respawns, if the user cryo'd. Not an integer. RESPAWN_DELAY_CRYO 5.0 @@ -16,8 +16,8 @@ ALLOW_NON_ASSISTANT_RESPAWN ## Allow respawning as the same character # ALLOW_SAME_CHARACTER_RESPAWN -## Observing is considered a respawn for the purposes of role lockouts. Defaults to disabled. When disabled, only RESPAWNING rather than returning from observe locks you out. -# RESPAWN_PENALTY_INCLUDES_OBSERVE +## Observing is considered a respawn for the purposes of role lockouts. Defaults to disabled. When disabled, only RESPAWNING rather than returning from observer locks you out. +RESPAWN_PENALTY_INCLUDES_OBSERVE ## Time in minutes from round start before respawn is enabled RESPAWN_MINIMUM_DELAY_ROUNDSTART 30.0 diff --git a/config/entries/security.txt b/config/entries/security.txt new file mode 100644 index 0000000000..e6a13d5cdf --- /dev/null +++ b/config/entries/security.txt @@ -0,0 +1,38 @@ +### FAIL2TOPIC: +### Automated IP bans for world/Topic() spammers +### NOTE FOR WINDOWS HOSTS: This requires you to be running dreamdaemon as an administrator for it to work at all. TGS3 handles this automatically, and honestly there's no reason not to be using TGS3 if you're hosting on Windows. +### NOTE FOR LINUX HOSTS: This requires manual setup of iptables. Beware that improper configuration of this can and will irreversibly fuck up a server, so please don't tinker with it if you don't know what you're doing. +## Enabled +#FAIL2TOPIC_ENABLED +## Minimum wait time in deciseconds between valid requests +FAIL2TOPIC_RATE_LIMIT 10 +## Number of requests after breaching rate limit that triggers a ban +FAIL2TOPIC_MAX_FAILS 5 +## Firewall rule name used on physical server +## FOR LINUX HOSTS: This is used as the chain name. The iptables chain doesn't get created or hooked up to INPUT automatically, so you'll have to get that set up yourself. Recommended name: BYOND +@FAIL2TOPIC_RULE_NAME _dd_fail2topic + +## Topic max size before it's rejected, using BYOND length() +TOPIC_MAX_SIZE 8192 + +## Fail2topic rate limit whitelist. Using any external IPs is not recommended. +# TOPIC_RATE_LIMIT_WHITELIST 127.0.0.1:1337 + +## TOPIC RATE LIMITING +## This allows you to limit how many topic calls (clicking on an interface window) the client can do in any given game second and/or game minute. +## Admins are exempt from these limits. +## Hitting the minute limit notifies admins. +## Set to 0 or comment out to disable. +SECOND_TOPIC_LIMIT 10 + +MINUTE_TOPIC_LIMIT 100 + +## CLICK RATE LIMITING +## Same as above, but applies to clicking on objects in the game window. +## This should be a higher then the interface limit to allow for the spam clickly nature of most battles. +## Admins are exempt from these limits. +## Hitting the minute limit notifies admins. +## Set to 0 to disable. +SECOND_CLICK_LIMIT 15 + +MINUTE_CLICK_LIMIT 400 diff --git a/config/entries/server.txt b/config/entries/server.txt new file mode 100644 index 0000000000..0ffd5b21a3 --- /dev/null +++ b/config/entries/server.txt @@ -0,0 +1,68 @@ +## Enable automatic profiling - Byond 513.1506 and newer only. +#AUTO_PROFILE + +## Server name: This appears at the top of the screen in-game and in the BYOND hub. Uncomment and replace 'tgstation' with the name of your choice. +# SERVERNAME tgstation + +## Server tagline: This will appear right below the server's title. +# SERVERTAGLINE A generic TG-based server + +## Server SQL name: This is the name used to identify the server to the SQL DB, distinct from SERVERNAME as it must be at most 32 characters. +# SERVERSQLNAME tgstation + +## Station name: The name of the station as it is referred to in-game. If commented out, the game will generate a random name instead. +STATIONNAME Space Station 13 + +## Put on byond hub: Uncomment this to put your server on the byond hub. +#HUB + +## Defines the ticklimit for subsystem initialization (In percents of a byond tick). Lower makes world start smoother. Higher makes it faster. +##This is currently a testing optimized setting. A good value for production would be 98. +TICK_LIMIT_MC_INIT 500 + +##Defines the ticklag for the world. Ticklag is the amount of time between game ticks (aka byond ticks) (in 1/10ths of a second). +## This also controls the client network update rate, as well as the default client fps +TICKLAG 0.5 + +##Can also be set as per-second value, the following value is identical to the above. +#FPS 20 + +## Set to prevent anyone but those ckeys listed in config/whitelist.txt and config/admins.txt from joining your server +#USEWHITELIST + +## set a hosted by name for unix platforms +HOSTEDBY Yournamehere + +## System command that invokes youtube-dl, used by Play Internet Sound. +## You can install youtube-dl with +## "pip install youtube-dl" if you have pip installed +## from https://github.com/rg3/youtube-dl/releases +## or your package manager +## The default value assumes youtube-dl is in your system PATH +# INVOKE_YOUTUBEDL youtube-dl + +###Master Controller High Pop Mode### + +##The Master Controller(MC) is the primary system controlling timed tasks and events in SS13 (lobby timer, game checks, lighting updates, atmos, etc) +##Default base MC tick rate (1 = process every "byond tick" (see: tick_lag/fps config settings), 2 = process every 2 byond ticks, etc) +## Setting this to 0 will prevent the Master Controller from ticking +BASE_MC_TICK_RATE 1 + +##High population MC tick rate +## Byond rounds timer values UP, but the tick rate is modified with heuristics during lag spites so setting this to something like 2 +## will make it run every 2 byond ticks, but will also double the effect of anti-lag heuristics. You can instead set it to something like +## 1.1 to make it run every 2 byond ticks, but only increase the effect of anti-lag heuristics by 10%. or 1.5 for 50%. +## (As an aside, you could in theory also reduce the effect of anti-lag heuristics in the base tick rate by setting it to something like 0.5) +HIGH_POP_MC_TICK_RATE 1.1 + +##Engage high pop mode if player count raises above this (Player in this context means any connected user. Lobby, ghost or in-game all count) +HIGH_POP_MC_MODE_AMOUNT 65 + +##Disengage high pop mode if player count drops below this +DISABLE_HIGH_POP_MC_MODE_AMOUNT 60 + +## Uncomment to prevent the world from sleeping while no players are connected after initializations +#RESUME_AFTER_INITIALIZATIONS + +## Uncomment to set the number of /world/Reboot()s before the DreamDaemon restarts itself. 0 means restart every round. Requires tgstation server tools. +#ROUNDS_UNTIL_HARD_RESTART 10 diff --git a/config/entries/stamina_combat.txt b/config/entries/stamina_combat.txt new file mode 100644 index 0000000000..5339502586 --- /dev/null +++ b/config/entries/stamina_combat.txt @@ -0,0 +1,28 @@ +## haha these keys are going to collide with other stuff for sure someday + +## OUT_OF_COMBAT_TIMER, PERCENT_REGENERATION_OUT_OF_COMBAT disabled - combat mode has been yanked from the codebase and made a UI toggle. + +## Maximum stamina buffer +BUFFER_MAX 25 + +## Seconds until out of combat regen kicks in +# OUT_OF_COMBAT_TIMER 15 + +## Base regen per second +BASE_REGENERATION 3.5 + +## Regenerate this % of total buffer when out of combat +# PERCENT_REGENERATION_OUT_OF_COMBAT + +## Seconds after an action for which regeneration is penalized +POST_ACTION_PENALTY_DELAY 5 + +## Factor to multiply by for penalizing post action regen +POST_ACTION_PENALTY_FACTOR 0.25 + +## Factor to multiply by for stamina usage past buffer into health +OVERDRAW_PENALTY_FACTOR 1.5 + +## Completely disable stamina combat by giving people infinite buffers. +## Has serious balance implications. +# DISABLE_STAMBUFFER diff --git a/config/job_threats.txt b/config/entries/threat.txt similarity index 91% rename from config/job_threats.txt rename to config/entries/threat.txt index e57edb66e4..fa7c5cffa5 100644 --- a/config/job_threats.txt +++ b/config/entries/threat.txt @@ -6,4 +6,4 @@ ## Custom antag threat values, see above ## e.g. -## ANTAG_THREAT Traitor 5 \ No newline at end of file +## ANTAG_THREAT Traitor 5 diff --git a/config/entries/urls.txt b/config/entries/urls.txt new file mode 100644 index 0000000000..f307245055 --- /dev/null +++ b/config/entries/urls.txt @@ -0,0 +1,37 @@ +## set a server location for world reboot. Don't include the byond://, just give the address and port. +## Don't set this to the same server, BYOND will automatically restart players to the server when it has restarted. +# SERVER ss13.example.com:2506 + +## forum address +# FORUMURL https://citadel-station.net/forum/ + +## Wiki address +# WIKIURL https://citadel-station.net/wikimain/index.php + +## Wiki address of upstream +WIKIURLTG http://www.tgstation13.org/wiki + +## Rules address +# RULESURL https://citadel-station.net/wikimain/index.php?title=Rules_-_Main + +## Github address +# GITHUBURL https://github.com/Citadel-Station-13/Citadel-Station-13 + +## Round specific stats address +## Link to round specific parsed logs; IE statbus. It is appended with the RoundID automatically by ticker/Reboot() +## This will take priority over the game logs address during reboot. +## Example: https://atlantaned.space/statbus/round.php?round= +# ROUNDSTATSURL http://citadel-station.net/slimbus/ + +## Game Logs address +## Incase you don't have a fancy parsing system, but still want players to be able to find where you keep your server's logs. +## Example: https://tgstation13.org/parsed-logs/basil/data/logs/ +# GAMELOGURL + +## Github repo id +##This can be found by going to https://api.github.com/users//repos +##Or https://api.github.com/orgs//repos if the repo owner is an organization +# GITHUBREPOID 62485194 + +## Ban appeals URL - usually for a forum or wherever people should go to contact your admins. +# BANAPPEALS https://citadel-station.net/forum/viewforum.php?f=8&sid=a0ce5331d5594ef6d49661609c6f4ff9 diff --git a/config/entries/vote.txt b/config/entries/vote.txt new file mode 100644 index 0000000000..14c7c36a4e --- /dev/null +++ b/config/entries/vote.txt @@ -0,0 +1,67 @@ +## allow players to initiate a restart vote +#ALLOW_VOTE_RESTART + +## allow players to initate a mode-change start +#ALLOW_VOTE_MODE + +## min delay (deciseconds) between voting sessions (default 10 minutes) +VOTE_DELAY 6000 + +## time period (deciseconds) which voting session will last (default 1 minute) +VOTE_PERIOD 600 + +## autovote initial delay (deciseconds) before first automatic transfer vote call (default 120 minutes) +## Set to 0 to disable the subsystem altogether. +VOTE_AUTOTRANSFER_INITIAL 72000 + +## autovote delay (deciseconds) before sequential automatic transfer votes are called (default 30 minutes) +VOTE_AUTOTRANSFER_INTERVAL 18000 + +## autovote maximum votes until automatic transfer call. (default 4) +## Set to 0 to force automatic crew transfer after the 'vote_autotransfer_initial' elapsed. +## Set to -1 to disable the maximum votes cap. +VOTE_AUTOTRANSFER_MAXIMUM 4 + +## prevents dead players from voting or starting votes +# NO_DEAD_VOTE + +## players' votes default to "No vote" (otherwise, default to "No change") +# DEFAULT_NO_VOTE + +## Map rotation +## You should edit maps.txt to match your configuration when you enable this. +MAPROTATION + +## TG-style map rotation +## By default, Citadel uses a more traditional method of map voting, where at the end of a round, players are given a full upfront vote. +## This PR will disable that, and will make the server use TG's map rotation instead. +#TGSTYLE_MAPROTATION + +## Map voting +## Allows players to vote for their preffered map +## When it's set to zero, the map will be randomly picked each round +ALLOW_MAP_VOTING 1 + +## Map voting type +## Determines what kind of vote the map vote is +## Options are: +## PLURALITY (default, only vote for one option) +## APPROVAL (can vote for as many as you want), I +## IRV (vote by ranked choice, winner determined by instant runoff algorithm) +## SCORE (give individual rankings of each choice, winner determined by majority judgement algorithm) +MAP_VOTE_TYPE APPROVAL + +## Map rotate chance delta +## This is the chance of map rotation factored to the round length. +## A value of 1 would mean the map rotation chance is the round length in minutes (hour long round == 60% rotation chance) +## A value of 0.5 would mean the map rotation chance is half of the round length in minutes (hour long round == 30% rotation chance) +#MAPROTATIONCHANCEDELTA 0.75 + +## Whether or not there's a mode tier list vote after the secret/extended vote. +MODETIER_VOTING + +## Number of modes dropped by the modetier vote during mode selection, after vote. +DROPPED_MODES 3 + +## Whether or not you must be readied up to vote gamemode +#MUST_BE_READIED_TO_VOTE_GAMEMODE diff --git a/config/external_rsc_urls.txt b/config/external_rsc_urls.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/config/jobs.txt b/config/jobs.txt index 1bf271763b..fab38e70f6 100644 --- a/config/jobs.txt +++ b/config/jobs.txt @@ -11,6 +11,8 @@ Chief Medical Officer=1,1 Assistant=-1,-1 +Prisoner=0,2 + Quartermaster=1,1 Cargo Technician=3,2 Shaft Miner=3,3 diff --git a/config/policy.txt b/config/policy.txt deleted file mode 100644 index 502b525ad0..0000000000 --- a/config/policy.txt +++ /dev/null @@ -1,16 +0,0 @@ -## Policy configuration -## Current valid keys are: -## ON_CLONE - displayed after a successful cloning operation to the cloned person -## ON_DEFIB_INTACT - displayed after defibbing before memory loss time threshold -## ON_DEFIB_LATE - displayed after defibbing post memory loss time threshold -## SDGF - displayed on SDGF clone spawning -## SDGF_GOOD - displayed on SDGF clone spawning, if the clone is loyal -## SDGF_BAD - displayed on SDGF clone spawning, if the clone is not loyal -## PAI - displayed on PAI personality being loaded -## EXAMPLE: -## POLICYCONFIG ON_CLONE insert text here span classes are fully supported - -## Misc entries for above - -## Defib time limit for "cloning memory disorder" memory loss in seconds -# DEFIB_CMD_TIME_LIMIT 300 diff --git a/dependencies.sh b/dependencies.sh index a86c58a5a2..aca82a3a05 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -4,24 +4,24 @@ #Final authority on what's required to fully build the project # byond version -export BYOND_MAJOR=513 -export BYOND_MINOR=1536 +export BYOND_MAJOR=514 +export BYOND_MINOR=1556 #rust_g git tag -export RUST_G_VERSION=0.4.8 - -#auxmos git tag -export AUXMOS_VERSION=v0.2.0 +export RUST_G_VERSION=0.4.10 #node version export NODE_VERSION=12 -export NODE_VERSION_PRECISE=12.20.0 +export NODE_VERSION_PRECISE=12.22.4 # SpacemanDMM git tag -export SPACEMAN_DMM_VERSION=suite-1.6 - -# Extools git tag -export EXTOOLS_VERSION=v0.0.7 +export SPACEMAN_DMM_VERSION=suite-1.7 # Python version for mapmerge and other tools export PYTHON_VERSION=3.6.8 + +# Auxmos git tag +export AUXMOS_VERSION=v0.2.3 + +# Extools git tag +export EXTOOLS_VERSION=v0.0.7 diff --git a/html/changelog.html b/html/changelog.html index 5b5d5bef86..dabd4e7704 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,429 @@ -->
+

18 September 2021

+

kiwedespars updated:

+
    +
  • blacklisted morphine and haloperidol from dart guns
  • +
+ +

17 September 2021

+

DeltaFire15 updated:

+
    +
  • Techweb hidden nodes should now show less weird behavior.
  • +
+ +

14 September 2021

+

Hatterhat updated:

+
    +
  • The Syndicate zero-day'd the NT IRN program on modular computers through cryptographic sequencing technology. NanoTrasen's cybersecurity divisions are seething.
  • +
+

LetterN updated:

+
    +
  • sync mafia code
  • +
+

Putnam3145 updated:

+
    +
  • Nerfed bad toxins bombs and buffed good toxins bombs. There's no longer an arbitrary hard research points cap.
  • +
+

keronshb updated:

+
    +
  • Removes zap obj damage and machinery explosion from the SM arcs
  • +
  • Fixes hitby runtime.
  • +
+

zeroisthebiggay updated:

+
    +
  • the permabrig erp role
  • +
  • changeling adrenals buff
  • +
  • speedups
  • +
  • bread goes in mouth and not on head
  • +
+ +

12 September 2021

+

LetterN updated:

+
    +
  • lowers the audio volume of ark sfx
  • +
  • readded cwc theme in the index.js once more
  • +
+

timothyteakettle updated:

+
    +
  • allows custom taste text and color on the custom ice cream setting in the ice cream vat
  • +
+ +

11 September 2021

+

LetterN updated:

+
    +
  • Tickers, GC, MC, FS updates
  • +
  • rust_g update. It is default that we use their urlencode/unencode now.
  • +
  • updates CBT to juke
  • +
  • CI Cache works properly now
  • +
+

Putnam3145 updated:

+
    +
  • Removed some crashes
  • +
+

SandPoot updated:

+
    +
  • Cyborg grippers now have a preview of the item you are holding. tweak: Cyborg grippers no longer drop using alt-click, instead, you try to drop the gripper to drop the item, and then you can drop the gripper. tweak: You can now use the "Pick up" verb on the right click menu to take items with a cyborg gripper.
  • +
  • You should be able to access the interface of airlock electronics once again as a borg.
  • +
  • Reworks a lot of stuff that was being used on the grippers.
  • +
+

timothyteakettle updated:

+
    +
  • arachnid legs now show up properly
  • +
+

zeroisthebiggay updated:

+
    +
  • reinforcing the mining hardsuit with goliath hide now makes the sprite cooler
  • +
  • The SWAT helmet is now consistent between its front, side and back sprites for coloration.
  • +
  • new riot armor sprites
  • +
+ +

10 September 2021

+

BlueWildrose updated:

+
    +
  • CTRL + (combat mode) Right Click - positional dropping and item rotation.
  • +
+

keronshb updated:

+
    +
  • Readds Reebe
  • +
  • Added the ability to dye your hair with gradients by using a hair dye spray.
  • +
  • The new Colorist quirk, allowing you to spawn with a hair dye spray.
  • +
  • Adds Hair gradients to preferences
  • +
  • Three new hair gradients, a pair of shorter fades and a spiky wave.
  • +
  • Adds viewers for mask of madness so it doesn't wallhack
  • +
+

zeroisthebiggay updated:

+
    +
  • Replaced the DNA probe's old sprite (Hypospray) with a unique sprite
  • +
  • added some icons and images for hyposprays and medipens so they stand out
  • +
  • added inhands for the cautery, retractor, drapes and hemostat.
  • +
  • New icon and sprites for the DNA probe
  • +
  • Emergency survival boxes now have an unique blue sprite and description to tell them apart from regular boxes.
  • +
  • Added craftable normal/extended emergency oxygen tank boxes to put your emergency oxygen tank collection inside.
  • +
  • Emergency first aid kits now look visually consistent with full first aid kits.
  • +
  • Ports new Hypospray, Combat Autoinjector, Pestle, Mortar and Dropper sprites from Shiptest!
  • +
  • Adds a new sprite for pill bottles!
  • +
  • new surgical tool sprites
  • +
  • The cyborg toolset is now all new and improved, with a new coat of paint!
  • +
  • Updates pride hammer sprites!
  • +
  • Replaced old Mjolnir sprites with new Mjolnir sprites.
  • +
+ +

08 September 2021

+

keronshb updated:

+
    +
  • Adds the parade outfit for the HoS and Centcomm
  • +
  • Recolors the parade outfit for the Captain
  • +
  • Adds a toggle option for the parade outfits
  • +
  • Observers can no longer highlight your items
  • +
+ +

07 September 2021

+

bunny232 updated:

+
    +
  • fixed some jank in pubby's xenobiological secure pen
  • +
+

keronshb updated:

+
    +
  • Gremlins no longer have AA when dead
  • +
+

zeroisthebiggay updated:

+
    +
  • you can just about
  • +
+ +

05 September 2021

+

DeltaFire15 updated:

+
    +
  • Unreadied player gamemode votes now actually get ignored (if the config for this is enabled).
  • +
+ +

04 September 2021

+

Putnam3145 updated:

+
    +
  • Might've fixed some ghost sprite oddities nobody even knew about
  • +
+

WanderingFox95 updated:

+
    +
  • Lavaland architects don't screw up so badly anymore and do in fact not somehow leave holes through the planet surface all the way into space under their bookshelves.
  • +
  • Snow was removed from Lavaland Ruins.
  • +
+

keronshb updated:

+
    +
  • Fixes entering an occupied VR sleeper bug
  • +
+

timothyteakettle updated:

+
    +
  • makes the arm/leg markings for synthetic lizards appear as an option again
  • +
+ +

03 September 2021

+

timothyteakettle updated:

+
    +
  • fixes losing your additional language upon changing species
  • +
+ +

01 September 2021

+

BlueWildrose updated:

+
    +
  • The waddle component now takes size into account when running rotating animations, thus not reverting character sizes to default size.
  • +
+

ma44 updated:

+
    +
  • Weapon rechargers now have their recharger indicators again.
  • +
  • Energy guns now update when switching modes again.
  • +
  • Stabilized yellow slime extracts will now update cells and guns it recharges.
  • +
  • Weapon rechargers will now be more noticeable when it has finished recharging something.
  • +
+

zeroisthebiggay updated:

+
    +
  • the fucking chainsaw sprite
  • +
+ +

28 August 2021

+

DeltaFire15 updated:

+
    +
  • Demons now drop bodies on their own tile instead of scattering them across the station. tweak: Space dragon content ejection is now slightly safer.
  • +
  • Space dragons no longer delete their contents if they die due to timeout, ejecting them instead.
  • +
  • Carp rifts created by space dragons now have their armor work correctly.
  • +
+

Putnam3145 updated:

+
    +
  • Planetary monstermos can now be disabled with varedit
  • +
  • Lavaland/ice planet atmos is no longer a preset gas mixture and varies per round
  • +
+

keronshb updated:

+
    +
  • Ports Inventory Outlines
  • +
  • Re-adds the old glue sprite
  • +
  • Adds Plague Rats
  • +
  • Gives Plague Rat spawn conditions for regular mice
  • +
  • Plague Rat sprite
  • +
  • Gremlin
  • +
  • Gremlin sprites
  • +
+

zeroisthebiggay updated:

+
    +
  • grilles as maintenance loot
  • +
  • sevensune tail from hyperstation
  • +
+ +

26 August 2021

+

keronshb updated:

+
    +
  • Adds catwalk floors
  • +
+ +

24 August 2021

+

BlueWildrose updated:

+
    +
  • MK ultra explosions (failures at making MKultra) are gone, and replaced with a gas that just causes a bunch of status effects to you.
  • +
+ +

23 August 2021

+

zeroisthebiggay updated:

+
    +
  • i hate the grammarchrist
  • +
+ +

22 August 2021

+

zeroisthebiggay updated:

+
    +
  • trillby can't spell pair
  • +
+ +

20 August 2021

+

EmeraldSundisk updated:

+
    +
  • Adds a law office/courtroom to OmegaStation
  • +
  • Adds a gateway to OmegaStation
  • +
  • Adds a pool/maintenance bar to OmegaStation
  • +
  • Removes the original maintenance garden in OmegaStation tweak: Relocates the bathrooms to the starboard hall tweak: Modifies port quarter maintenance to include some affected items
  • +
+

Putnam3145 updated:

+
    +
  • Beach now has showers
  • +
+

TripleShades updated:

+
    +
  • At least four or five space heaters spread across Pubby Station Maints
  • +
  • Missing decal in Pubby Station engineering
  • +
  • Moved an atmos alarm in the SM emitter chamber so it wont be destroyed
  • +
+

WanderingFox95 updated:

+
    +
  • Empty bottles and pitchers are available to the bartender now.
  • +
  • They even come with 10 different fillstates!
  • +
  • Better Shark Tails, dodododododo~
  • +
  • The old ones are now listed as carp tails.
  • +
+ +

18 August 2021

+

timothyteakettle updated:

+
    +
  • lets you select 4 prosthetic limbs instead of only 2
  • +
+ +

16 August 2021

+

BlueWildrose updated:

+
    +
  • Incapacitated mobs are blacklisted from being human-level intelligence sentience event candidates. This is particularly important due to slimes in BZ stasis on the station.
  • +
+

bunny232 updated:

+
    +
  • Polyvitiligo actually changes your color now
  • +
+ +

13 August 2021

+

Putnam3145 updated:

+
    +
  • makes certain organs no longer have circular references
  • +
+ +

12 August 2021

+

Arturlang updated:

+
    +
  • Nonslimes and nonvampires will no longer be able to increase their blood to stupid heights
  • +
+

Putnam3145 updated:

+
    +
  • Supermatter values use auxgm
  • +
+

cadyn updated:

+
    +
  • precompile.sh and build.sh updated, auxmos set to 0.2.3 in dependencies.sh
  • +
+ +

11 August 2021

+

timothyteakettle updated:

+
    +
  • lets felinids, humans and moths have markings
  • +
+ +

09 August 2021

+

Arturlang updated:

+
    +
  • Nanite machinery overlays should now work properly
  • +
  • screen objects are now atom/movables instead
  • +
  • Update appearance is used for updating atoms now instead of update_icon and such
  • +
+

BlueWildrose updated:

+
    +
  • Old gateway animation is back. Feedback is given that the gateway is open again.
  • +
+

Putnam3145 updated:

+
    +
  • Rod of asclepius can now be used for revival surgery
  • +
+ +

07 August 2021

+

BlueWildrose updated:

+
    +
  • The black dress, pink tutu, the bathrobe, the kimonos, and the qipaos no longer have a missing pixel when wearing them with the feminine bodytype. They're also no longer adjustable (they have no sprite for the adjusted variant and therefore it would just make an error if someone did that.)
  • +
+

Putnam3145 updated:

+
    +
  • Supernova rad storms are now half as likely per tick tweak: Supernovae don't announce they're ending if they never announced they're starting tweak: Supernovae say explicitly no rad storms can happen if they can't
  • +
  • Monstermos is back
  • +
+ +

05 August 2021

+

Putnam3145 updated:

+
    +
  • organs decay again
  • +
+ +

04 August 2021

+

BlueWildrose updated:

+
    +
  • The debrained overlay actually shows for brainless corpses now instead of showing a blue error.
  • +
+

timothyteakettle updated:

+
    +
  • legs are no longer awful
  • +
+ +

03 August 2021

+

zeroisthebiggay updated:

+
    +
  • tempgun is a laser
  • +
  • bake mode is useful
  • +
  • tempgun has less shots
  • +
  • tempgun has more sprites
  • +
+ +

02 August 2021

+

TripleShades updated:

+
    +
  • Decorative (read: Station-safe) water tile in the code
  • +
  • Pubby's new water feature wont kill atmosphere anymore
  • +
+ +

31 July 2021

+

MrJWhit updated:

+
    +
  • Fixes some minor mistakes around space near boxstation.
  • +
+

TripleShades updated:

+
    +
  • Fountain area to public mining station-side tweak: Moved around the tables and chairs and monitor at public mining station-side
  • +
+

WanderingFox95 updated:

+
    +
  • Added new ruin maps: The Bathhouse, The Library, The Engineering outpost, The Hotsprings(un-cursed), Lust, Wrath and an alternate spawn for the BDM in the form of a mining outpost, based on the same Ruins on the Ice Moon. removed: A lot of the fun items within the ice moon-based ruins that would break mining even more and trading cards.
  • +
  • Yes, this includes that the lavaland version of the hot spring is literally just water and not cursed. tweak: Also "fixed" that only one version of the BDM ruin ever spawns. Not sure it needed fixing but even locally hosted, only blooddrunk2.dmm would spawn. Since I added another spawn for the BDM, I fixed that too.
  • +
+ +

29 July 2021

+

EmeraldSundisk updated:

+
    +
  • Adds decals between Virology and the general Medbay to provide clarity
  • +
  • Adds an airlock with access to the Engineering Cooling Loop
  • +
  • The Maintenance Theater now has a suitable amount of dust
  • +
  • Removed an errant entertainment monitor left in the morgue
  • +
  • Removed redundant scrubber piping in and around the bar and kitchen tweak: Slightly readjusts an airpipe to take advantage of newfound space tweak: The Toxins Lab has received (predominantly) visual adjustments as to render it more in line with the general science department tweak: Toxins Storage is no longer its own area and as such needn't worry about APCs
  • +
  • Hydroponics now has a proper APC as intended
  • +
+ +

27 July 2021

+

Putnam3145 updated:

+
    +
  • Generic fires work now
  • +
  • A knock-on effect of the HE pipe change is that space cooling is ~8.4x as powerful
  • +
+ +

26 July 2021

+

SandPoot updated:

+
    +
  • Removes a sneaky transform button on the vore panel.
  • +
+ +

24 July 2021

+

MrJWhit updated:

+
    +
  • Replaces the northwest maint room on box with a sadness room
  • +
  • Replaces bar stripper room with an arcade on boxstation
  • +
  • Squished the west bathrooms a bit and made a room to sell things on boxstation.
  • +
  • Southeast maint hallway on box is now ziggy and zaggier.
  • +
  • Fixed pipes being not connected with the recent map PR for boxstation.
  • +
+

Putnam3145 updated:

+
    +
  • hallucination now bottoms out at 0
  • +
  • supermatter now causes only half the hallucinations
  • +
+

cadyn updated:

+
    +
  • auxmos bump for dependencies.sh
  • +
+ +

23 July 2021

+

silicons updated:

+
    +
  • Batons are slightly more powerful.
  • +
+

19 July 2021

Arturlang updated:

    @@ -87,528 +510,6 @@
  • anthros can now select the cow tail
  • new quirk that allows you to eat trash
- -

18 July 2021

-

timothyteakettle updated:

-
    -
  • fixes photosynthesis stopping nutrition going past well fed from non-photosynthesis means
  • -
- -

17 July 2021

-

cadyn updated:

-
    -
  • precompile.sh updated
  • -
- -

15 July 2021

-

Putnam3145 updated:

-
    -
  • fixes a major source of lag
  • -
- -

14 July 2021

-

Putnam3145 updated:

-
    -
  • Acid is now a component
  • -
- -

13 July 2021

-

MrJWhit updated:

-
    -
  • Adds a mirror above the sink in the captains bedroom in pubby
  • -
- -

12 July 2021

-

Putnam3145 updated:

-
    -
  • causes_dirt_buildup_on_floor is now just a thing humans do instead of a weird var only true for humans
  • -
- -

11 July 2021

-

shellspeed1 updated:

-
    -
  • replaces the seed machine with a biogen in the survival pod.
  • -
  • corrected an issue regarding wrong pair of gloves in the pod for DYI wiring .
  • -
- -

10 July 2021

-

WanderingFox95 updated:

-
    -
  • Returns the wheelchair sprites to having, you know, wheels?
  • -
  • A motorized wheelchair addsound: Chairwhoosh.
  • -
- -

09 July 2021

-

MrJWhit updated:

-
    -
  • Made a light not exist on the same tile as a door on pubby.
  • -
  • Makes the RD APC automatically connect to the powernet with the correct wire on pubby.
  • -
  • Added another wall for the AM engine so it doesn't space the airlock roundstart.
  • -
- -

07 July 2021

-

DeltaFire15 updated:

-
    -
  • Golem / Plasmaman species color should work again.
  • -
- -

05 July 2021

-

Putnam3145 updated:

-
    -
  • Watchers no longer search 9 tiles away for stuff then throw the result away if it's more than 1 tile away
  • -
  • Auxmos pull now uses a tag instead of pulling straight from the main branch
  • -
-

WanderingFox95 updated:

-
    -
  • Moved a sprite one pixel to the left.
  • -
-

zeroisthebiggay updated:

-
    -
  • tg based tool resprites
  • -
  • wirecutters have proper overlays
  • -
- -

04 July 2021

-

cadyn updated:

-
    -
  • Updated server scripts for proper linux support
  • -
- -

03 July 2021

-

DeltaFire15 updated:

-
    -
  • Turrets on nonlethal mode now once again shoot till the target is stamcrit as opposed to unable to use items, resolving some issues.
  • -
-

Putnam3145 updated:

-
    -
  • A bunch of sleeping process() calls now either don't sleep or make sure to call a proc with waitfor set to FALSE
  • -
-

WanderingFox95 updated:

-
    -
  • The axolotl ears in the .dmi file actually exist to the game now.
  • -
- -

02 July 2021

-

silicons updated:

-
    -
  • spray bottles work again.
  • -
- -

30 June 2021

-

WanderingFox95 updated:

-
    -
  • More plushies in the code.
  • -
  • Nabbed some plushie sprites from Cit RP and TG and made some myself. Enjoy!
  • -
  • The Daily Whiplash (Newspaper Baton) is now available! (Using sticky tape to stick a newspaper onto a baton) Bap!
  • -
  • A rolled up newspaper sprite was provided.
  • -
  • Switched Gateway and Vault locations on Boxstation, bringing it more in line with other stations.
  • -
-

bunny232 updated:

-
    -
  • The pubby xenobiology air/scrubber network is now isolated from the rest of the station
  • -
-

qweq12yt updated:

-
    -
  • HoP's cargo access was removed...
  • -
-

shellspeed1 updated:

-
    -
  • NT has lost experimental KA tech to miners who were lost in the field. Make sure to try and recover it.
  • -
  • Adds an extremely expensive survival pod to mining for people to work towards. Get to work cracking rocks today.
  • -
- -

28 June 2021

-

Putnam3145 updated:

-
    -
  • APCs aren't infinite power anymore
  • -
  • FDA, LINDA without the bookkeeping.
  • -
  • Putnamos, a simpler replacement for Monstermos. If I can get Monstermos to work, this will be Monstermos instead.
  • -
  • LINDA, the old active-turfs-based atmos subsystem.
  • -
  • Monstermos? I would rather not get rid of this, but I can't get it to work correctly.
  • -
  • Extools has been removed, and loading extools alongside auxtools will cause massive problems. If this is tested or merged, remove extools from the static files.
  • -
-

WanderingFox95 updated:

-
    -
  • Carrots are good for your eyes - but eyes are also good for your carrots. Adds the googly eyes trait to walkingshrooms (Oculary Mimicry)
  • -
  • Googly Eyes - they make everything better.
  • -
- -

25 June 2021

-

MrJWhit updated:

-
    -
  • Adds two missing decals to the 5x5 SM.
  • -
-

brokenOculus updated:

-
    -
  • pillbottles and syringesare now printable from the medbay protolathe, shiftstart. Hyposprays are now printable in medbay lathe under advanced biotech.
  • -
- -

24 June 2021

-

WanderingFox95 updated:

-
    -
  • An announcement to let players know the Cat Surgeon has come to visit.
  • -
  • Upped the Volume of his spawn noise and lowered the spawn weight slightly.
  • -
- -

23 June 2021

-

DeltaFire15 updated:

-
    -
  • A bunch of small nanite things should be less wonky
  • -
  • Slimes are no longer immune to vomiting (undocumented change from a previous PR)
  • -
  • Fruit wine exists again.
  • -
  • Airlock hacking no longer sleeps.
  • -
  • The clockwork gateway deconstruction no longer sleeps.
  • -
  • Teslium reactions and Holywater booms no longer sleep.
  • -
  • Slime timestop no longer sleeps.
  • -
-

Putnam3145 updated:

-
    -
  • inelastic exports no longer uselessly do exponential functions
  • -
- -

22 June 2021

-

bunny232 updated:

-
    -
  • Adds a missing win door to meta xenobiology pen 6
  • -
-

silicons updated:

-
    -
  • no more doubleroasting
  • -
- -

21 June 2021

-

silicons updated:

-
    -
  • glowshroom scaling
  • -
-

timothyteakettle updated:

-
    -
  • vore is 0.1% less shitcode
  • -
- -

20 June 2021

-

Arturlang updated:

-
    -
  • Port's TG's nanite storage modification programs from the bepis
  • -
  • Fixes infective nanite progreams not syncing cloud ID.
  • -
  • Add's off icons for nanite machinery
  • -
  • Fixes antitox nanites runtiming on simplemobs
  • -
  • Updates the nanite dermal button icon set
  • -
  • Adds the ability to select the logic for nanite rules
  • -
  • Nanite programs with triggers won't ignore rules.
  • -
  • Coagluating nanite program research no longer has the wrong name tweak: Nanite program's have better descriptions now tweak: Nanite subdermal ID's now also include pulled ID's for simplemobs
  • -
  • Nanite voice sensors should properly work now.
  • -
  • Fixes nanite comm remote, now they should actually work
  • -
-

EmeraldSundisk updated:

-
    -
  • Adds ColorMates to Snow Taxi tweak: Slight adjustments near the arrival shuttle landing zone
  • -
  • Removes an undesired corporate entity
  • -
-

Nanotrasen Structual Engineering Division updated:

-
    -
  • Added lables to the atmos tanks on Metastation.
  • -
  • Adjusted Pubbystation's emitter room wall layout to prevent light-breakage on startup of emitters.
  • -
  • Removed frestanding sink and showers from Metastation science airlock, and Deltastation Xenobio. Added an emergency shower next to the kill room.
  • -
  • Removed a leftover pipe in Metastation security hallway.
  • -
-

bunny232 updated:

-
    -
  • Pressure tanks other then air tanks start with gas!
  • -
-

keronshb updated:

-
    -
  • Adds the Space Dragon midround event
  • -
  • Space Dragon sounds
  • -
  • Space Dragon + effects
  • -
  • Added Spacewalk trait
  • -
  • Gibs the original owner if they are turned into a Space Dragon with the traitor panel
  • -
  • logging for Space Dragon creation
  • -
-

kiwedespars updated:

-
    -
  • a downside to wheely heelies ((made it actually detrimental))
  • -
-

zeroisthebiggay updated:

-
    -
  • beltslot sprites for various items
  • -
  • resprite for telebaton
  • -
- -

19 June 2021

-

keronshb updated:

-
    -
  • Ling Bone Gauntlets work again
  • -
- -

17 June 2021

-

Vynzill updated:

-
    -
  • ability to change crafted armwrap sprite to alternate one.
  • -
  • extended armwrap icon and sprite
  • -
-

timothyteakettle updated:

-
    -
  • fixes an oversight causing embed jostling to do 2x as much damage as it should
  • -
- -

16 June 2021

-

silicons updated:

-
    -
  • on_found works again
  • -
- -

15 June 2021

-

EmeraldSundisk updated:

-
    -
  • Xenobiology now has proper lighting
  • -
  • The Corporate Showroom now has a proper front door
  • -
  • Mining snowmobiles now have keys
  • -
  • Adjusts area designations so GENTURF icons should no longer be visible in-game
  • -
- -

14 June 2021

-

EmeraldSundisk updated:

-
    -
  • Adds a brand new, wholly unique mining base to Snaxi tweak: A thorough redesign of Snaxi (see PR #14818 for more info)
  • -
  • Increases the number of electrical connections between substations
  • -
-

MrJWhit updated:

-
    -
  • Removes cat meteors.
  • -
-

SandPoot updated:

-
    -
  • Tablet computers now have a pen slot, they can almost replace your pda!
  • -
  • Removed a bracket from printer's examine.
  • -
  • The cosmetic turtleneck and skirtleneck no longer start with broken sensors.
  • -
-

TripleShades updated:

-
    -
  • Lights to AI Sat Walkways
  • -
  • Lights to Atmospherics
  • -
  • Floor labels to Atmospherics Gas Miner containment units
  • -
  • Gas canisters from Gas Miner containment units
  • -
  • Excessive wiring in Security and Detective's Office
  • -
-

qweq12yt updated:

-
    -
  • Locker orders now properly bundle together in a single locker (still separated by buyer).
  • -
  • Changed some package names to be more accurate.
  • -
-

timothyteakettle updated:

-
    -
  • bees can go in containers and are released upon opening the container
  • -
  • 7 more round tips have been added
  • -
-

zeroisthebiggay updated:

-
    -
  • new singularity hammer sprite
  • -
  • various slight sprite additions
  • -
  • distinctive combat defib sprite
  • -
  • a onesleeved croptop accessory sprited by trojan coyote
  • -
  • new bank machine sprite
  • -
  • unused goon coffin sprite
  • -
  • new water cooler sprite
  • -
- -

12 June 2021

-

silicons updated:

-
    -
  • xenos are now truly immune to stamina damage.
  • -
- -

10 June 2021

-

Arturlang updated:

-
    -
  • Holoparasites for traitors now cost 12 crystals, for operatives 8, the ricochet eyepath traitor item now 4.
  • -
-

DrPainis updated:

-
    -
  • goliath calamari
  • -
  • cat meteors
  • -
-

Linzolle updated:

-
    -
  • cults can build in maintenance (and other small areas) again.
  • -
  • centcom can no longer be selected as the target area for narsie to be summoned??????
  • -
-

MrJWhit updated:

-
    -
  • Moves medical holodeck to the restricted category
  • -
-

SandPoot updated:

-
    -
  • Uses some of the existing images for the typing indicators.
  • -
  • Fixes soulstone shard not working for non-cultists.
  • -
-

WanderingFox95 updated:

-
    -
  • A random event for the cat surgeon to invade the station. Listen for scary noises!
  • -
  • Screaming Cat SFX, you know, for the mood.
  • -
-

bunny232 updated:

-
    -
  • Atmos resin now properly prevents all atmos from moving
  • -
  • Air tanks now properly have a 21/79 o2/n2 mix
  • -
  • Hydroponics can now make 5u of slimejelly by injecting 3 oil, 2 radium and 1 tinea luxor into a glowshroom
  • -
-

keronshb updated:

-
    -
  • Made it so Off Balance only disarms if they're shoved into a wall or person.
  • -
  • Reduced Off Balance time to 2 seconds.
  • -
  • Pierced Realities despawn after 3 minutes and 15 seconds, new unresearched realities spawn in after that time elsewhere to help other heretics get back into the game.
  • -
  • A required sacrifice amount for heretic's second to last and last powers are added to discourage only rushing for holes.
  • -
  • An announcement automatically plays to everyone that there's a heretic gunning for ascension upon learning the 2nd to last power
  • -
  • Blade Shatters are now used in hand other than with a HUD icon tweak: Adjusted some TGUI menus for the book to reflect how many sacrifices a heretic has and how many are required for certain powers
  • -
  • Fixes sprite issue for Void Cloak for people who have digigrade legs.
  • -
  • Fixes the Raw Prophet recipe to match the description
  • -
  • Lets the Cargo Shuttle use Disposal Pipes again
  • -
  • Adds motivation and adds it to the uplink
  • -
  • Adds Judgement Cut projectiles
  • -
  • Adds Judgement Cut hit effects and firing effects.
  • -
  • added sounds for the firing and hit sounds of Judgement Cuts, created by @dzahlus
  • -
  • Adds Floor Cluwnes and event for midround
  • -
  • Adds Cluwne mutation
  • -
  • Adds Cluwne spell
  • -
  • Adds Cluwnes
  • -
  • Adds Cluwne Mask + shoes
  • -
  • Adds Floor Cluwne spawn button
  • -
  • Adds Cluwne smite button
  • -
-

zeroisthebiggay updated:

-
    -
  • Fixed an exploit allowing you to grab people from anywhere with a clowncar.
  • -
  • revenant essence objective reduced
  • -
- -

06 June 2021

-

bunny232 updated:

-
    -
  • Pools are capable of mist at lower temperatures
  • -
- -

05 June 2021

-

Arturlang updated:

-
    -
  • float sanity now makes it not actually run if it's actively being thrown
  • -
-

coderbus13 updated:

-
    -
  • Pubby's toxins injector now starts at 200L, like it does on other maps
  • -
-

zeroisthebiggay updated:

-
    -
  • light floppy dog ears
  • -
- -

04 June 2021

-

MrJWhit updated:

-
    -
  • Adds a missing pipe
  • -
-

Putnam3145 updated:

-
    -
  • sniper rifle doesn't ruin your round instantly now
  • -
- -

03 June 2021

-

MrJWhit updated:

-
    -
  • Removed some debug tiles on the xenoruin.
  • -
-

TripleShades updated:

-
    -
  • Added a camera to both solar entryways
  • -
  • Added an intercom to toxin's launch for the doppler
  • -
  • The fake nuke auth disk in the library
  • -
- -

29 May 2021

-

Kraseo updated:

-
    -
  • No more slamming into people while bloodcrawled.
  • -
-

Linzolle updated:

-
    -
  • brand intelligence event works again
  • -
-

keronshb updated:

-
    -
  • swag outfit available in clothesmate
  • -
  • swag shoes availble in clothesmate resprite: changed swag shoes icon to the one twaticus made.
  • -
  • Adds the clown mob spawner for admins
  • -
-

zeroisthebiggay updated:

-
    -
  • puglism damage can no longer stack with scarp
  • -
- -

26 May 2021

-

bunny232 updated:

-
    -
  • Removed two random 'captain's office' tiles from space on meta station
  • -
- -

24 May 2021

-

zeroisthebiggay updated:

-
    -
  • New traitor item: the Mauler Gauntlets! Punch hard, punch good! Eight telecrystals, buy today!
  • -
  • hairs from Airborne Snitch
  • -
- -

23 May 2021

-

Putnam3145 updated:

-
    -
  • Antag and species no longer remove all traits if one has a blacklisted trait
  • -
-

WanderingFox95 updated:

-
    -
  • Replaced the antlers showing up when you select deer ears with actual deer ears. Literally why was that even a thing before?
  • -
  • Straight rabbit ears are now a thing.
  • -
-

keronshb updated:

-
    -
  • 30 > 25 pop req for contractor kit
  • -
  • adds a special hud for simple mobs.
  • -
  • a lot of >32x32 mobs now have icons for their health dolls
  • -
- -

21 May 2021

-

Putnam3145 updated:

-
    -
  • Fixed activity being attached to minds instead of mobs on antag attach.
  • -
- -

20 May 2021

-

qweq12yt updated:

-
    -
  • Fixed void cloak voiding itself into oblivion.
  • -
  • You can now order emag shuttles again.
  • -
-

timothyteakettle updated:

-
    -
  • ports rp's marking system
  • -
- -

19 May 2021

-

WanderingFox95 updated:

-
    -
  • The E-Fink, a mending tool for food.
  • -
  • A backwards bladeslice. (Yes, for the E-fink)
  • -
  • And Icons for the E-fink, of course.
  • -
-

shellspeed1 updated:

-
    -
  • Survival pods can now be designated as requiring power. Survival pods with this feature should include an APC when created and will run out of power rather quickly if no source is added. Perfect for true emergencies.
  • -
  • An empty survival pod has been added to the mining vendor. This is an extremely barebones pod featuring only a gps, table, apc, and the standard fridge for some donk pockets.
  • -
-

zeroisthebiggay updated:

-
    -
  • New Alcohol Amaretto and various cocktails
  • -
  • more drink mixture flavortext
  • -
  • you're going to Baystation
  • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index b7ec1b0ab3..e4e1fba1c6 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -29702,3 +29702,304 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. timothyteakettle: - bugfix: anthros can now select the cow tail - rscadd: new quirk that allows you to eat trash +2021-07-23: + silicons: + - balance: Batons are slightly more powerful. +2021-07-24: + MrJWhit: + - rscadd: Replaces the northwest maint room on box with a sadness room + - rscadd: Replaces bar stripper room with an arcade on boxstation + - rscadd: Squished the west bathrooms a bit and made a room to sell things on boxstation. + - balance: Southeast maint hallway on box is now ziggy and zaggier. + - bugfix: Fixed pipes being not connected with the recent map PR for boxstation. + Putnam3145: + - bugfix: hallucination now bottoms out at 0 + - balance: supermatter now causes only half the hallucinations + cadyn: + - server: auxmos bump for dependencies.sh +2021-07-26: + SandPoot: + - rscdel: Removes a sneaky transform button on the vore panel. +2021-07-27: + Putnam3145: + - bugfix: Generic fires work now + - balance: A knock-on effect of the HE pipe change is that space cooling is ~8.4x + as powerful +2021-07-29: + EmeraldSundisk: + - rscadd: Adds decals between Virology and the general Medbay to provide clarity + - rscadd: Adds an airlock with access to the Engineering Cooling Loop + - rscadd: The Maintenance Theater now has a suitable amount of dust + - rscdel: Removed an errant entertainment monitor left in the morgue + - rscdel: 'Removed redundant scrubber piping in and around the bar and kitchen tweak: + Slightly readjusts an airpipe to take advantage of newfound space tweak: The + Toxins Lab has received (predominantly) visual adjustments as to render it more + in line with the general science department tweak: Toxins Storage is no longer + its own area and as such needn''t worry about APCs' + - bugfix: Hydroponics now has a proper APC as intended +2021-07-31: + MrJWhit: + - bugfix: Fixes some minor mistakes around space near boxstation. + TripleShades: + - rscadd: 'Fountain area to public mining station-side tweak: Moved around the tables + and chairs and monitor at public mining station-side' + WanderingFox95: + - rscadd: 'Added new ruin maps: The Bathhouse, The Library, The Engineering outpost, + The Hotsprings(un-cursed), Lust, Wrath and an alternate spawn for the BDM in + the form of a mining outpost, based on the same Ruins on the Ice Moon. removed: + A lot of the fun items within the ice moon-based ruins that would break mining + even more and trading cards.' + - balance: 'Yes, this includes that the lavaland version of the hot spring is literally + just water and not cursed. tweak: Also "fixed" that only one version of the + BDM ruin ever spawns. Not sure it needed fixing but even locally hosted, only + blooddrunk2.dmm would spawn. Since I added another spawn for the BDM, I fixed + that too.' +2021-08-02: + TripleShades: + - rscadd: 'Decorative (read: Station-safe) water tile in the code' + - bugfix: Pubby's new water feature wont kill atmosphere anymore +2021-08-03: + zeroisthebiggay: + - balance: tempgun is a laser + - balance: bake mode is useful + - balance: tempgun has less shots + - imageadd: tempgun has more sprites +2021-08-04: + BlueWildrose: + - bugfix: The debrained overlay actually shows for brainless corpses now instead + of showing a blue error. + timothyteakettle: + - bugfix: legs are no longer awful +2021-08-05: + Putnam3145: + - bugfix: organs decay again +2021-08-07: + BlueWildrose: + - bugfix: The black dress, pink tutu, the bathrobe, the kimonos, and the qipaos + no longer have a missing pixel when wearing them with the feminine bodytype. + They're also no longer adjustable (they have no sprite for the adjusted variant + and therefore it would just make an error if someone did that.) + Putnam3145: + - balance: 'Supernova rad storms are now half as likely per tick tweak: Supernovae + don''t announce they''re ending if they never announced they''re starting tweak: + Supernovae say explicitly no rad storms can happen if they can''t' + - rscadd: Monstermos is back +2021-08-09: + Arturlang: + - bugfix: Nanite machinery overlays should now work properly + - code_imp: screen objects are now atom/movables instead + - code_imp: Update appearance is used for updating atoms now instead of update_icon + and such + BlueWildrose: + - bugfix: Old gateway animation is back. Feedback is given that the gateway is open + again. + Putnam3145: + - balance: Rod of asclepius can now be used for revival surgery +2021-08-11: + timothyteakettle: + - rscadd: lets felinids, humans and moths have markings +2021-08-12: + Arturlang: + - rscdel: Nonslimes and nonvampires will no longer be able to increase their blood + to stupid heights + Putnam3145: + - refactor: Supermatter values use auxgm + cadyn: + - server: precompile.sh and build.sh updated, auxmos set to 0.2.3 in dependencies.sh +2021-08-13: + Putnam3145: + - bugfix: makes certain organs no longer have circular references +2021-08-16: + BlueWildrose: + - bugfix: Incapacitated mobs are blacklisted from being human-level intelligence + sentience event candidates. This is particularly important due to slimes in + BZ stasis on the station. + bunny232: + - bugfix: Polyvitiligo actually changes your color now +2021-08-18: + timothyteakettle: + - rscadd: lets you select 4 prosthetic limbs instead of only 2 +2021-08-20: + EmeraldSundisk: + - rscadd: Adds a law office/courtroom to OmegaStation + - rscadd: Adds a gateway to OmegaStation + - rscadd: Adds a pool/maintenance bar to OmegaStation + - rscdel: 'Removes the original maintenance garden in OmegaStation tweak: Relocates + the bathrooms to the starboard hall tweak: Modifies port quarter maintenance + to include some affected items' + Putnam3145: + - rscadd: Beach now has showers + TripleShades: + - rscadd: At least four or five space heaters spread across Pubby Station Maints + - rscadd: Missing decal in Pubby Station engineering + - bugfix: Moved an atmos alarm in the SM emitter chamber so it wont be destroyed + WanderingFox95: + - rscadd: Empty bottles and pitchers are available to the bartender now. + - imageadd: They even come with 10 different fillstates! + - imageadd: Better Shark Tails, dodododododo~ + - rscadd: The old ones are now listed as carp tails. +2021-08-22: + zeroisthebiggay: + - spellcheck: trillby can't spell pair +2021-08-23: + zeroisthebiggay: + - spellcheck: i hate the grammarchrist +2021-08-24: + BlueWildrose: + - balance: MK ultra explosions (failures at making MKultra) are gone, and replaced + with a gas that just causes a bunch of status effects to you. +2021-08-26: + keronshb: + - rscadd: Adds catwalk floors +2021-08-28: + DeltaFire15: + - bugfix: 'Demons now drop bodies on their own tile instead of scattering them across + the station. tweak: Space dragon content ejection is now slightly safer.' + - bugfix: Space dragons no longer delete their contents if they die due to timeout, + ejecting them instead. + - bugfix: Carp rifts created by space dragons now have their armor work correctly. + Putnam3145: + - config: Planetary monstermos can now be disabled with varedit + - rscadd: Lavaland/ice planet atmos is no longer a preset gas mixture and varies + per round + keronshb: + - rscadd: Ports Inventory Outlines + - imageadd: Re-adds the old glue sprite + - rscadd: Adds Plague Rats + - rscadd: Gives Plague Rat spawn conditions for regular mice + - imageadd: Plague Rat sprite + - rscadd: Gremlin + - imageadd: Gremlin sprites + zeroisthebiggay: + - rscdel: grilles as maintenance loot + - rscadd: sevensune tail from hyperstation +2021-09-01: + BlueWildrose: + - bugfix: The waddle component now takes size into account when running rotating + animations, thus not reverting character sizes to default size. + ma44: + - bugfix: Weapon rechargers now have their recharger indicators again. + - bugfix: Energy guns now update when switching modes again. + - bugfix: Stabilized yellow slime extracts will now update cells and guns it recharges. + - rscadd: Weapon rechargers will now be more noticeable when it has finished recharging + something. + zeroisthebiggay: + - bugfix: the fucking chainsaw sprite +2021-09-03: + timothyteakettle: + - bugfix: fixes losing your additional language upon changing species +2021-09-04: + Putnam3145: + - bugfix: Might've fixed some ghost sprite oddities nobody even knew about + WanderingFox95: + - bugfix: Lavaland architects don't screw up so badly anymore and do in fact not + somehow leave holes through the planet surface all the way into space under + their bookshelves. + - bugfix: Snow was removed from Lavaland Ruins. + keronshb: + - bugfix: Fixes entering an occupied VR sleeper bug + timothyteakettle: + - bugfix: makes the arm/leg markings for synthetic lizards appear as an option again +2021-09-05: + DeltaFire15: + - bugfix: Unreadied player gamemode votes now actually get ignored (if the config + for this is enabled). +2021-09-07: + bunny232: + - bugfix: fixed some jank in pubby's xenobiological secure pen + keronshb: + - bugfix: Gremlins no longer have AA when dead + zeroisthebiggay: + - spellcheck: you can just about +2021-09-08: + keronshb: + - imageadd: Adds the parade outfit for the HoS and Centcomm + - imageadd: Recolors the parade outfit for the Captain + - imageadd: Adds a toggle option for the parade outfits + - bugfix: Observers can no longer highlight your items +2021-09-10: + BlueWildrose: + - rscadd: CTRL + (combat mode) Right Click - positional dropping and item rotation. + keronshb: + - rscadd: Readds Reebe + - rscadd: Added the ability to dye your hair with gradients by using a hair dye + spray. + - rscadd: The new Colorist quirk, allowing you to spawn with a hair dye spray. + - rscadd: Adds Hair gradients to preferences + - imageadd: Three new hair gradients, a pair of shorter fades and a spiky wave. + - bugfix: Adds viewers for mask of madness so it doesn't wallhack + zeroisthebiggay: + - bugfix: Replaced the DNA probe's old sprite (Hypospray) with a unique sprite + - imageadd: added some icons and images for hyposprays and medipens so they stand + out + - imageadd: added inhands for the cautery, retractor, drapes and hemostat. + - imageadd: New icon and sprites for the DNA probe + - imageadd: Emergency survival boxes now have an unique blue sprite and description + to tell them apart from regular boxes. + - imageadd: Added craftable normal/extended emergency oxygen tank boxes to put your + emergency oxygen tank collection inside. + - imageadd: Emergency first aid kits now look visually consistent with full first + aid kits. + - imageadd: Ports new Hypospray, Combat Autoinjector, Pestle, Mortar and Dropper + sprites from Shiptest! + - imageadd: Adds a new sprite for pill bottles! + - imageadd: new surgical tool sprites + - imageadd: The cyborg toolset is now all new and improved, with a new coat of paint! + - imageadd: Updates pride hammer sprites! + - imageadd: Replaced old Mjolnir sprites with new Mjolnir sprites. +2021-09-11: + LetterN: + - code_imp: Tickers, GC, MC, FS updates + - code_imp: rust_g update. It is default that we use their urlencode/unencode now. + - code_imp: updates CBT to juke + - bugfix: CI Cache works properly now + Putnam3145: + - bugfix: Removed some crashes + SandPoot: + - rscadd: 'Cyborg grippers now have a preview of the item you are holding. tweak: + Cyborg grippers no longer drop using alt-click, instead, you try to drop the + gripper to drop the item, and then you can drop the gripper. tweak: You can + now use the "Pick up" verb on the right click menu to take items with a cyborg + gripper.' + - bugfix: You should be able to access the interface of airlock electronics once + again as a borg. + - refactor: Reworks a lot of stuff that was being used on the grippers. + timothyteakettle: + - bugfix: arachnid legs now show up properly + zeroisthebiggay: + - imageadd: reinforcing the mining hardsuit with goliath hide now makes the sprite + cooler + - imageadd: The SWAT helmet is now consistent between its front, side and back sprites + for coloration. + - imageadd: new riot armor sprites +2021-09-12: + LetterN: + - bugfix: lowers the audio volume of ark sfx + - bugfix: readded cwc theme in the index.js once more + timothyteakettle: + - rscadd: allows custom taste text and color on the custom ice cream setting in + the ice cream vat +2021-09-14: + Hatterhat: + - balance: The Syndicate zero-day'd the NT IRN program on modular computers through + cryptographic sequencing technology. NanoTrasen's cybersecurity divisions are + seething. + LetterN: + - code_imp: sync mafia code + Putnam3145: + - balance: Nerfed bad toxins bombs and buffed good toxins bombs. There's no longer + an arbitrary hard research points cap. + keronshb: + - balance: Removes zap obj damage and machinery explosion from the SM arcs + - bugfix: Fixes hitby runtime. + zeroisthebiggay: + - rscadd: the permabrig erp role + - balance: changeling adrenals buff + - bugfix: speedups + - bugfix: bread goes in mouth and not on head +2021-09-17: + DeltaFire15: + - bugfix: Techweb hidden nodes should now show less weird behavior. +2021-09-18: + kiwedespars: + - balance: blacklisted morphine and haloperidol from dart guns diff --git a/html/changelogs/AutoChangeLog-pr-15074.yml b/html/changelogs/AutoChangeLog-pr-15074.yml new file mode 100644 index 0000000000..5da0c10a10 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15074.yml @@ -0,0 +1,4 @@ +author: "keronshb" +delete-after: True +changes: + - rscadd: "PAIs can be emagged to reset master" diff --git a/html/changelogs/AutoChangeLog-pr-15084.yml b/html/changelogs/AutoChangeLog-pr-15084.yml new file mode 100644 index 0000000000..6c99cc159d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15084.yml @@ -0,0 +1,10 @@ +author: "keronshb" +delete-after: True +changes: + - bugfix: "Plague Rats will no longer spawn thousands of dirt decals" + - bugfix: "Plague Rats will no longer spawn thousands of corpses" + - bugfix: "Plague Rats can't spawn or transform off station z anymore" + - bugfix: "Plague Rats shouldn't explosively grow instantly" + - bugfix: "Plague Rats won't spawn infinite miasma anymore." + - balance: "Plague Rats health is now 100." + - balance: "Plague Rats can now ventcrawl through everything to prevent farming." diff --git a/html/changelogs/AutoChangeLog-pr-15094.yml b/html/changelogs/AutoChangeLog-pr-15094.yml new file mode 100644 index 0000000000..21dcf75960 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15094.yml @@ -0,0 +1,4 @@ +author: "zeroisthebiggay" +delete-after: True +changes: + - balance: "glass has do_after" diff --git a/html/changelogs/AutoChangeLog-pr-15119.yml b/html/changelogs/AutoChangeLog-pr-15119.yml new file mode 100644 index 0000000000..ee7100fd9b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15119.yml @@ -0,0 +1,8 @@ +author: "keronshb" +delete-after: True +changes: + - bugfix: "Slaughter Demons Slam will now wound again on hit." + - balance: "Damage for demons back up to 30" + - balance: "Wound Bonus for demons now at 0. +image_add: Adds a sprite for the action bar" + - refactor: "Changed the CTRL+SHIFT Click to an action button. People can see the cooldown now too." diff --git a/html/changelogs/AutoChangeLog-pr-15133.yml b/html/changelogs/AutoChangeLog-pr-15133.yml new file mode 100644 index 0000000000..3bc023735f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15133.yml @@ -0,0 +1,5 @@ +author: "zeroisthebiggay" +delete-after: True +changes: + - rscadd: "new tips" + - rscdel: "old tips" diff --git a/html/changelogs/AutoChangeLog-pr-15134.yml b/html/changelogs/AutoChangeLog-pr-15134.yml new file mode 100644 index 0000000000..2a71bd9aa0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15134.yml @@ -0,0 +1,4 @@ +author: "zeroisthebiggay" +delete-after: True +changes: + - rscadd: "some more brainhurt lines" diff --git a/html/changelogs/AutoChangeLog-pr-15137.yml b/html/changelogs/AutoChangeLog-pr-15137.yml new file mode 100644 index 0000000000..eef278a6ea --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15137.yml @@ -0,0 +1,4 @@ +author: "DeltaFire15" +delete-after: True +changes: + - balance: "carded AIs can now be converted by conversion sigils (clockcult)" diff --git a/html/changelogs/AutoChangeLog-pr-15139.yml b/html/changelogs/AutoChangeLog-pr-15139.yml new file mode 100644 index 0000000000..001897e223 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15139.yml @@ -0,0 +1,4 @@ +author: "DeltaFire15" +delete-after: True +changes: + - bugfix: "Catsurgeons should now spawn at more reasonable locations if possible." diff --git a/html/changelogs/AutoChangeLog-pr-15143.yml b/html/changelogs/AutoChangeLog-pr-15143.yml new file mode 100644 index 0000000000..d4e2141937 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15143.yml @@ -0,0 +1,4 @@ +author: "zeroisthebiggay" +delete-after: True +changes: + - bugfix: "box perma has power" diff --git a/html/changelogs/AutoChangeLog-pr-15144.yml b/html/changelogs/AutoChangeLog-pr-15144.yml new file mode 100644 index 0000000000..860f1a60cc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15144.yml @@ -0,0 +1,4 @@ +author: "zeroisthebiggay" +delete-after: True +changes: + - bugfix: "bone satchel onmob sprites" diff --git a/html/changelogs/AutoChangeLog-pr-15147.yml b/html/changelogs/AutoChangeLog-pr-15147.yml new file mode 100644 index 0000000000..09f98404fd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15147.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - config: "monstermos config added, disabled" diff --git a/html/changelogs/AutoChangeLog-pr-15154.yml b/html/changelogs/AutoChangeLog-pr-15154.yml new file mode 100644 index 0000000000..756cc2bfb7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15154.yml @@ -0,0 +1,4 @@ +author: "qweq12yt" +delete-after: True +changes: + - bugfix: "Fixed space heaters not being able to be interacted/turned on in non powered areas" diff --git a/html/changelogs/AutoChangeLog-pr-15156.yml b/html/changelogs/AutoChangeLog-pr-15156.yml new file mode 100644 index 0000000000..4d74820ca3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15156.yml @@ -0,0 +1,4 @@ +author: "zeroisthebiggay" +delete-after: True +changes: + - bugfix: "missing madness mask sprites" diff --git a/html/changelogs/AutoChangeLog-pr-15157.yml b/html/changelogs/AutoChangeLog-pr-15157.yml new file mode 100644 index 0000000000..b3f0b8eaba --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15157.yml @@ -0,0 +1,4 @@ +author: "DeltaFire15" +delete-after: True +changes: + - bugfix: "There is now a way to acquire nanite storage protocols (bepis, like the other protocols), as opposed to them existing with no way to acquire them." diff --git a/html/changelogs/AutoChangeLog-pr-15160.yml b/html/changelogs/AutoChangeLog-pr-15160.yml new file mode 100644 index 0000000000..da0d68f52f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15160.yml @@ -0,0 +1,4 @@ +author: "timothyteakettle" +delete-after: True +changes: + - bugfix: "removes passkey from access circuits as its not used anymore" diff --git a/html/changelogs/AutoChangeLog-pr-15162.yml b/html/changelogs/AutoChangeLog-pr-15162.yml new file mode 100644 index 0000000000..926f0898d1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15162.yml @@ -0,0 +1,4 @@ +author: "zeroisthebiggay" +delete-after: True +changes: + - bugfix: "prisoners cannot latejoin anymore" diff --git a/html/changelogs/AutoChangeLog-pr-15163.yml b/html/changelogs/AutoChangeLog-pr-15163.yml new file mode 100644 index 0000000000..3fe5ba69ee --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15163.yml @@ -0,0 +1,4 @@ +author: "buffyuwu" +delete-after: True +changes: + - rscadd: "Adds 4 redesigned jackets and 2 redesigned shirts to loadout" diff --git a/html/changelogs/AutoChangeLog-pr-15167.yml b/html/changelogs/AutoChangeLog-pr-15167.yml new file mode 100644 index 0000000000..1c13dfc56f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15167.yml @@ -0,0 +1,4 @@ +author: "BlueWildrose" +delete-after: True +changes: + - balance: "Slime regenerative extracts now require five seconds of wait before they are used. They add 25 disgust when used." diff --git a/html/changelogs/AutoChangeLog-pr-15168.yml b/html/changelogs/AutoChangeLog-pr-15168.yml new file mode 100644 index 0000000000..4f040b4580 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15168.yml @@ -0,0 +1,4 @@ +author: "dapnee" +delete-after: True +changes: + - bugfix: "attaches an air vent that was just there on the AI sat, changes some areas to what they'd logically be" diff --git a/html/changelogs/AutoChangeLog-pr-15169.yml b/html/changelogs/AutoChangeLog-pr-15169.yml new file mode 100644 index 0000000000..f3af23ac39 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15169.yml @@ -0,0 +1,4 @@ +author: "timothyteakettle" +delete-after: True +changes: + - rscadd: "a new mild trauma, **[REDACTED]**" diff --git a/html/changelogs/AutoChangeLog-pr-15171.yml b/html/changelogs/AutoChangeLog-pr-15171.yml new file mode 100644 index 0000000000..958d61e87c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15171.yml @@ -0,0 +1,4 @@ +author: "DeltaFire15" +delete-after: True +changes: + - bugfix: "Plastic golems are back to ventcrawler_nude instead of ventcrawler_always" diff --git a/html/changelogs/AutoChangeLog-pr-15174.yml b/html/changelogs/AutoChangeLog-pr-15174.yml new file mode 100644 index 0000000000..79b3b9400f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15174.yml @@ -0,0 +1,4 @@ +author: "buffyuwu" +delete-after: True +changes: + - bugfix: "Holoparasites no long rename and recolor on relog" diff --git a/html/changelogs/AutoChangeLog-pr-15176.yml b/html/changelogs/AutoChangeLog-pr-15176.yml new file mode 100644 index 0000000000..3335997a85 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15176.yml @@ -0,0 +1,4 @@ +author: "buffyuwu" +delete-after: True +changes: + - bugfix: "fixed medihound sleeper ui display" diff --git a/html/changelogs/AutoChangeLog-pr-15178.yml b/html/changelogs/AutoChangeLog-pr-15178.yml new file mode 100644 index 0000000000..3f4debbc45 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15178.yml @@ -0,0 +1,4 @@ +author: "zeroisthebiggay" +delete-after: True +changes: + - imageadd: "all medipens get inhands" diff --git a/icons/mob/actions/actions_minor_antag.dmi b/icons/mob/actions/actions_minor_antag.dmi index 3b9fe54577..6936e9e4bf 100644 Binary files a/icons/mob/actions/actions_minor_antag.dmi and b/icons/mob/actions/actions_minor_antag.dmi differ diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index 68e6170969..34bd587146 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/arachnid_parts.dmi b/icons/mob/arachnid_parts.dmi index 1b70935450..196e2037b5 100644 Binary files a/icons/mob/arachnid_parts.dmi and b/icons/mob/arachnid_parts.dmi differ diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi index ff787bc3fc..8c34b6cc4e 100644 Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ diff --git a/icons/mob/clothing/custom_w.dmi b/icons/mob/clothing/custom_w.dmi index 1a4acbc242..199232d73b 100644 Binary files a/icons/mob/clothing/custom_w.dmi and b/icons/mob/clothing/custom_w.dmi differ diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi index 51675c8d7d..1596672ac3 100644 Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ diff --git a/icons/mob/clothing/head_muzzled.dmi b/icons/mob/clothing/head_muzzled.dmi index e99f1ff6d4..2fce92ee81 100644 Binary files a/icons/mob/clothing/head_muzzled.dmi and b/icons/mob/clothing/head_muzzled.dmi differ diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi index 60c2e34b39..075464ace5 100644 Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ diff --git a/icons/mob/clothing/suit.dmi b/icons/mob/clothing/suit.dmi index 39ad5337a7..b4ecbdfb2a 100644 Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ diff --git a/icons/mob/clothing/suit_digi.dmi b/icons/mob/clothing/suit_digi.dmi index f80cb4a426..80259e2832 100644 Binary files a/icons/mob/clothing/suit_digi.dmi and b/icons/mob/clothing/suit_digi.dmi differ diff --git a/icons/mob/clothing/taur_canine.dmi b/icons/mob/clothing/taur_canine.dmi index 6155a274f2..db88043fb2 100644 Binary files a/icons/mob/clothing/taur_canine.dmi and b/icons/mob/clothing/taur_canine.dmi differ diff --git a/icons/mob/clothing/taur_hooved.dmi b/icons/mob/clothing/taur_hooved.dmi index 03fd8c8a30..a0af305d4c 100644 Binary files a/icons/mob/clothing/taur_hooved.dmi and b/icons/mob/clothing/taur_hooved.dmi differ diff --git a/icons/mob/clothing/taur_naga.dmi b/icons/mob/clothing/taur_naga.dmi index 3525333fb3..3df8625bec 100644 Binary files a/icons/mob/clothing/taur_naga.dmi and b/icons/mob/clothing/taur_naga.dmi differ diff --git a/icons/mob/clothing/uniform.dmi b/icons/mob/clothing/uniform.dmi index fd4ded6ad8..d4b1428f3e 100644 Binary files a/icons/mob/clothing/uniform.dmi and b/icons/mob/clothing/uniform.dmi differ diff --git a/icons/mob/hair_gradients.dmi b/icons/mob/hair_gradients.dmi new file mode 100644 index 0000000000..ceb3b52eab Binary files /dev/null and b/icons/mob/hair_gradients.dmi differ diff --git a/icons/mob/human_parts.dmi b/icons/mob/human_parts.dmi index 34a1ada483..3310d911cb 100644 Binary files a/icons/mob/human_parts.dmi and b/icons/mob/human_parts.dmi differ diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi index c404fbcacb..d04323b02b 100644 Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ diff --git a/icons/mob/inhands/equipment/medical_lefthand.dmi b/icons/mob/inhands/equipment/medical_lefthand.dmi index 232f3f9e65..679b6c1159 100644 Binary files a/icons/mob/inhands/equipment/medical_lefthand.dmi and b/icons/mob/inhands/equipment/medical_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/medical_righthand.dmi b/icons/mob/inhands/equipment/medical_righthand.dmi index 8133cca9bd..a8f4580881 100644 Binary files a/icons/mob/inhands/equipment/medical_righthand.dmi and b/icons/mob/inhands/equipment/medical_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/chainsaw_lefthand.dmi b/icons/mob/inhands/weapons/chainsaw_lefthand.dmi index 3e0aea0e6b..3053fea723 100644 Binary files a/icons/mob/inhands/weapons/chainsaw_lefthand.dmi and b/icons/mob/inhands/weapons/chainsaw_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/chainsaw_righthand.dmi b/icons/mob/inhands/weapons/chainsaw_righthand.dmi index 0800a52731..4e76c19b7a 100644 Binary files a/icons/mob/inhands/weapons/chainsaw_righthand.dmi and b/icons/mob/inhands/weapons/chainsaw_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/guns_lefthand.dmi b/icons/mob/inhands/weapons/guns_lefthand.dmi index 07000f43aa..ca742c9c7f 100644 Binary files a/icons/mob/inhands/weapons/guns_lefthand.dmi and b/icons/mob/inhands/weapons/guns_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/guns_righthand.dmi b/icons/mob/inhands/weapons/guns_righthand.dmi index cf07bbba91..a277b29993 100644 Binary files a/icons/mob/inhands/weapons/guns_righthand.dmi and b/icons/mob/inhands/weapons/guns_righthand.dmi differ diff --git a/icons/mob/landmarks.dmi b/icons/mob/landmarks.dmi index 284809da70..0e2ae605f6 100644 Binary files a/icons/mob/landmarks.dmi and b/icons/mob/landmarks.dmi differ diff --git a/icons/mob/legfile1test.dmi b/icons/mob/legfile1test.dmi new file mode 100644 index 0000000000..cf74d73796 Binary files /dev/null and b/icons/mob/legfile1test.dmi differ diff --git a/icons/mob/legfile2test.dmi b/icons/mob/legfile2test.dmi new file mode 100644 index 0000000000..cf74d73796 Binary files /dev/null and b/icons/mob/legfile2test.dmi differ diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index 3137e8ac26..65efde8697 100644 Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ diff --git a/icons/mob/radial.dmi b/icons/mob/radial.dmi index e681069131..27b268eea0 100644 Binary files a/icons/mob/radial.dmi and b/icons/mob/radial.dmi differ diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index 3916fcb694..36db68b7bb 100644 Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 854928f2ca..7d4ae79957 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi index 532d4f5df7..1e2449329d 100644 Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index f689ee5068..77d1d026b2 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 2bbe93a410..e7467d6352 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi index a6c554f7da..9af0a6ba3a 100644 Binary files a/icons/obj/contraband.dmi and b/icons/obj/contraband.dmi differ diff --git a/icons/obj/crates.dmi b/icons/obj/crates.dmi index 1fda3933bd..c6574ca86b 100644 Binary files a/icons/obj/crates.dmi and b/icons/obj/crates.dmi differ diff --git a/icons/obj/custom.dmi b/icons/obj/custom.dmi index 7b00d52f8f..89da4b43a0 100644 Binary files a/icons/obj/custom.dmi and b/icons/obj/custom.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index b7f21a1fe4..0f49bc6d5f 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/dyespray.dmi b/icons/obj/dyespray.dmi new file mode 100644 index 0000000000..eb05603679 Binary files /dev/null and b/icons/obj/dyespray.dmi differ diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi index 40e00b431e..78ee67c45a 100644 Binary files a/icons/obj/food/containers.dmi and b/icons/obj/food/containers.dmi differ diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi index 158c95ee5d..5a9493e874 100644 Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi index b468d0d4c9..39f1845f43 100644 Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ diff --git a/icons/obj/items_cyborg.dmi b/icons/obj/items_cyborg.dmi index 769d5492c6..5d87bee320 100644 Binary files a/icons/obj/items_cyborg.dmi and b/icons/obj/items_cyborg.dmi differ diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index 36efd97189..84b4f47e1a 100644 Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ diff --git a/icons/obj/machines/prison.dmi b/icons/obj/machines/prison.dmi new file mode 100644 index 0000000000..7ce58e93a2 Binary files /dev/null and b/icons/obj/machines/prison.dmi differ diff --git a/icons/obj/radio.dmi b/icons/obj/radio.dmi index dbfc7b1f93..7e9a976624 100644 Binary files a/icons/obj/radio.dmi and b/icons/obj/radio.dmi differ diff --git a/icons/obj/reagentfillings.dmi b/icons/obj/reagentfillings.dmi index 8115036b6f..7926ead12d 100644 Binary files a/icons/obj/reagentfillings.dmi and b/icons/obj/reagentfillings.dmi differ diff --git a/icons/obj/shards.dmi b/icons/obj/shards.dmi index e7875efa26..6e5f5821ce 100644 Binary files a/icons/obj/shards.dmi and b/icons/obj/shards.dmi differ diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index a4fbe53dba..7e04fa0d2a 100644 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index b4f223e57d..1925834ebb 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 52172bbe29..58ba5fadd8 100755 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/icons/obj/syringe.dmi b/icons/obj/syringe.dmi index b474dc68ba..3515545514 100644 Binary files a/icons/obj/syringe.dmi and b/icons/obj/syringe.dmi differ diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi index 088b6c2c7b..757208cd9b 100644 Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi index a720aff62c..95a887a733 100644 Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi index a1a6180068..3224e875b2 100644 Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ diff --git a/icons/turf/floors/catwalk_plating.dmi b/icons/turf/floors/catwalk_plating.dmi new file mode 100644 index 0000000000..24954e4a17 Binary files /dev/null and b/icons/turf/floors/catwalk_plating.dmi differ diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm index 39ed9d6ec8..c1489da94a 100644 --- a/modular_citadel/code/modules/client/loadout/__donator.dm +++ b/modular_citadel/code/modules/client/loadout/__donator.dm @@ -554,3 +554,9 @@ slot = SLOT_W_UNIFORM path = /obj/item/clothing/under/smaiden ckeywhitelist = list("ultimarifox") + +/datum/gear/donator/mgasmask + name = "Military Gas Mask" + slot = SLOT_IN_BACKPACK + path = /obj/item/clothing/mask/gas/military + ckeywhitelist = list("unclebourbon") diff --git a/modular_citadel/code/modules/client/loadout/neck.dm b/modular_citadel/code/modules/client/loadout/neck.dm index 6be13b75d9..128285628a 100644 --- a/modular_citadel/code/modules/client/loadout/neck.dm +++ b/modular_citadel/code/modules/client/loadout/neck.dm @@ -103,6 +103,6 @@ /datum/gear/neck/cancloak name = "Canvas Cloak" - path = /obj/item/clothing/neck/cancloak/polychromic + path = /obj/item/clothing/neck/cloak/cancloak/polychromic loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC loadout_initial_colors = list("#585858", "#373737", "#BEBEBE") diff --git a/modular_citadel/code/modules/client/loadout/suit.dm b/modular_citadel/code/modules/client/loadout/suit.dm index 108bcafc19..92d94a41e8 100644 --- a/modular_citadel/code/modules/client/loadout/suit.dm +++ b/modular_citadel/code/modules/client/loadout/suit.dm @@ -97,6 +97,41 @@ name = "Brass winter coat" path = /obj/item/clothing/suit/hooded/wintercoat/ratvar/fake +/datum/gear/suit/jacketbluehoodie + name = "Blue hoodie" + path = /obj/item/clothing/suit/jacket/bluehoodie + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION + subcategory = LOADOUT_SUBCATEGORY_SUIT_JACKETS +/datum/gear/suit/jacketpurplehoodie + name = "Purple hoodie" + path = /obj/item/clothing/suit/jacket/purplehoodie + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION + subcategory = LOADOUT_SUBCATEGORY_SUIT_JACKETS + +/datum/gear/suit/jacketheartcoat + name = "Heart coat" + path = /obj/item/clothing/suit/jacket/heartcoat + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION + subcategory = LOADOUT_SUBCATEGORY_SUIT_JACKETS + +/datum/gear/suit/jacketgothiccoat + name = "Long black coat with cuffs" + path = /obj/item/clothing/suit/jacket/gothiccoat + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION + subcategory = LOADOUT_SUBCATEGORY_SUIT_JACKETS + +/datum/gear/suit/jacketgothshirt + name = "Black shirt with cuffs" + path = /obj/item/clothing/suit/jacket/gothicshirt + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION + subcategory = LOADOUT_SUBCATEGORY_SUIT_GENERAL + +/datum/gear/suit/jacketgothshirtcross + name = "Black shirt with cross" + path = /obj/item/clothing/suit/jacket/gothicshirtcross + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION + subcategory = LOADOUT_SUBCATEGORY_SUIT_GENERAL + /datum/gear/suit/coat/polycoat name = "Polychromic winter coat" path = /obj/item/clothing/suit/hooded/wintercoat/polychromic diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm index b7d04e0780..14114c513b 100644 --- a/modular_citadel/code/modules/custom_loadout/custom_items.dm +++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm @@ -229,6 +229,14 @@ mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' icon_state = "stalker" +/obj/item/clothing/mask/gas/military + name = "Military Gas Mask" + desc = "A rare PMC gas mask, one of the very expensive kinds. The inside looks comfortable to wear for a while. The blood red eyes however seem to stare back at you. Creepy." + icon = 'icons/obj/custom.dmi' + item_state = "mgas" + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' + icon_state = "mgas" + /obj/item/reagent_containers/food/drinks/flask/steel name = "The End" desc = "A plain steel flask, sealed by lock and key. The front is inscribed with The End." diff --git a/modular_citadel/code/modules/mob/living/carbon/carbon.dm b/modular_citadel/code/modules/mob/living/carbon/carbon.dm index 3a683ca2ff..bea34c27a2 100644 --- a/modular_citadel/code/modules/mob/living/carbon/carbon.dm +++ b/modular_citadel/code/modules/mob/living/carbon/carbon.dm @@ -6,11 +6,11 @@ if(SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_TOGGLED)) return FALSE //let's not override the main draw of the game these days voremode = !voremode - var/obj/screen/voretoggle/T = locate() in hud_used?.static_inventory + var/atom/movable/screen/voretoggle/T = locate() in hud_used?.static_inventory T?.update_icon_state() return TRUE /mob/living/carbon/proc/disable_vore_mode() voremode = FALSE - var/obj/screen/voretoggle/T = locate() in hud_used?.static_inventory + var/atom/movable/screen/voretoggle/T = locate() in hud_used?.static_inventory T?.update_icon_state() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index f66c0289b6..a76a8f846c 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -266,55 +266,20 @@ Creating a chem with a low purity will make you permanently fall in love with so //Creates a gas cloud when the reaction blows up, causing everyone in it to fall in love with someone/something while it's in their system. /datum/reagent/fermi/enthrallExplo//Created in a gas cloud when it explodes name = "Gaseous MKUltra" - description = "A forbidden deep red gas that overwhelms a foreign body, causing the person they next lay their eyes on to become more interesting. Studies have shown that people are 66% more likely to make friends with this in the air. Produced when MKUltra explodes." + description = "A deep red gas that when taken into a body, the recipient will experience a high and reduced control in their body for as long as it is in their system. Produced when MKUltra explodes." color = "#2C051A" // rgb: , 0, 255 - metabolization_rate = 0.1 - taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses." + metabolization_rate = 1 + taste_description = "extremely bitter chocolate" chemical_flags = REAGENT_DONOTSPLIT can_synth = FALSE - var/mob/living/carbon/love - var/lewd = FALSE -/datum/reagent/fermi/enthrallExplo/on_mob_life(mob/living/carbon/M)//Love gas, only affects while it's in your system,Gives a positive moodlet if close, gives brain damagea and a negative moodlet if not close enough. - if(HAS_TRAIT(M, TRAIT_MINDSHIELD)) - return ..() - if(!M.has_status_effect(STATUS_EFFECT_INLOVE)) - var/list/seen = (M.fov_view(M.client?.view || world.view) - M) | viewers(M.client?.view || world.view, M) - for(var/victim in seen) - if((isanimal(victim)) || (!isliving(victim))) - seen -= victim - if(!length(seen)) - return - love = pick(seen) - M.apply_status_effect(STATUS_EFFECT_INLOVE, love) - lewd = (M.client?.prefs.cit_toggles & HYPNO) && (love.client?.prefs.cit_toggles & HYPNO) - to_chat(M, "[(lewd?"":"")][(lewd?"You develop a sudden crush on [love], your heart beginning to race as you look upon them with new eyes.":"You suddenly feel like making friends with [love].")] You feel strangely drawn towards them.") - log_reagent("FERMICHEM: [M] ckey: [M.key] has temporarily bonded with [love] ckey: [love.key]") - SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times people have bonded") - else - if(get_dist(M, love) < 8) - var/message = "[(lewd?"I'm next to my crush..! Eee!":"I'm making friends with [love]!")]" - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "InLove", /datum/mood_event/InLove, message) - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove") - else - var/message = "[(lewd?"I can't keep my crush off my mind, I need to see them again!":"I really want to make friends with [love]!")]" - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "MissingLove", /datum/mood_event/MissingLove, message) - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove") - if(prob(5)) - M.Stun(10) - M.emote("whimper")//does this exist? - to_chat(M, "[(lewd?"":"")] You're overcome with a desire to see [love].") - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5)//I found out why everyone was so damaged! - ..() - -/datum/reagent/fermi/enthrallExplo/on_mob_delete(mob/living/carbon/M) - if(HAS_TRAIT(M, TRAIT_MINDSHIELD)) - return ..() - M.remove_status_effect(STATUS_EFFECT_INLOVE) - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove") - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove") - to_chat(M, "[(lewd?"":"")]Your feelings for [love] suddenly vanish!") - log_reagent("FERMICHEM: [M] ckey: [M.key] is no longer in temp bond") +/datum/reagent/fermi/enthrallExplo/on_mob_life(mob/living/carbon/M) //Drug them, jitter them, dizzy them, confuse them + M.Dizzy(5) + M.Jitter(5) + M.set_drugginess(15) + if(!M.confused) + M.confused = 1 + M.confused = max(M.confused, 20) ..() /datum/reagent/fermi/proc/FallInLove(mob/living/carbon/Lover, mob/living/carbon/Love) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm index 60c009bc29..3725e46b38 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm @@ -109,7 +109,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING ZI.Insert(SM) log_reagent("FERMICHEM: [M] ckey: [M.key]'s zombie_infection has been transferred to their clone") - var/list/policies = CONFIG_GET(keyed_list/policyconfig) + var/list/policies = CONFIG_GET(keyed_list/policy) var/policy = policies[POLICYCONFIG_SDGF] if(policy) to_chat(SM,policy) @@ -127,7 +127,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING else to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original.") log_reagent("FERMICHEM: [SM] ckey: [SM.key]'s is not bound by [M] ckey [M.key]'s will, and is free to determine their own goals, while respecting and acting as their origin.") - + to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you. Before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with your original, a perfect clone of your origin.") SM.client?.change_view(CONFIG_GET(string/default_view)) to_chat(M, "You feel a strange sensation building in your mind as you realise there's two of you. Before you get a chance to think about it, a mass splits from you, and find yourself face to face with yourself.") @@ -226,7 +226,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.adjustCloneLoss(-10, 0) //I don't want to make Rezadone obsolete. M.adjustBruteLoss(-25, 0)// Note that this takes a long time to apply and makes you fat and useless when it's in you, I don't think this small burst of healing will be useful considering how long it takes to get there. M.adjustFireLoss(-25, 0) - M.blood_volume += 250 + M.adjust_integration_blood(250) M.heal_bodypart_damage(1,1) M.action_cooldown_mod = 1 if (M.nutrition < 1500) @@ -236,7 +236,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING to_chat(M, "the cells fail to hold enough mass to generate a clone, instead diffusing into your system.") M.adjustBruteLoss(-10, 0) M.adjustFireLoss(-10, 0) - M.blood_volume += 100 + M.adjust_integration_blood(100) M.action_cooldown_mod = 1 if (M.nutrition < 1500) M.adjust_nutrition(500) @@ -309,7 +309,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /datum/reagent/fermi/SDGFheal/on_mob_life(mob/living/carbon/M)//Used to heal the clone after splitting, the clone spawns damaged. (i.e. insentivies players to make more than required, so their clone doesn't have to be treated) if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio)) - M.blood_volume += 10 + M.adjust_integration_blood(10) M.adjustCloneLoss(-2, 0) M.setOrganLoss(ORGAN_SLOT_BRAIN, -1) M.adjust_nutrition(10) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index edaaeb19b2..a78092988e 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -344,8 +344,13 @@ E.creatorID = B.data["ckey"] /datum/chemical_reaction/fermi/enthrall/FermiExplode(datum/reagents/R0, var/atom/my_atom, volume, temp, pH) + var/turf/T = get_turf(my_atom) + var/datum/reagents/R = new/datum/reagents(1000) + var/datum/effect_system/smoke_spread/chem/s = new() + R.add_reagent(/datum/reagent/fermi/enthrallExplo, volume) + s.set_up(R, volume/2, T) + s.start() R0.clear_reagents() - ..() /datum/chemical_reaction/fermi/hatmium // done name = "Hat growth serum" diff --git a/modular_citadel/icons/mob/mam_tails.dmi b/modular_citadel/icons/mob/mam_tails.dmi index 5e5a87c199..f30f7480f6 100644 Binary files a/modular_citadel/icons/mob/mam_tails.dmi and b/modular_citadel/icons/mob/mam_tails.dmi differ diff --git a/rust_g.dll b/rust_g.dll index 8ef1c59a10..26f6942861 100644 Binary files a/rust_g.dll and b/rust_g.dll differ diff --git a/sound/misc/seth.ogg b/sound/misc/seth.ogg new file mode 100644 index 0000000000..8def150775 Binary files /dev/null and b/sound/misc/seth.ogg differ diff --git a/sound/weapons/frost.ogg b/sound/weapons/frost.ogg new file mode 100644 index 0000000000..67884e87be Binary files /dev/null and b/sound/weapons/frost.ogg differ diff --git a/strings/sillytips.txt b/strings/sillytips.txt index 8e28284534..ba10f80bf1 100644 --- a/strings/sillytips.txt +++ b/strings/sillytips.txt @@ -8,14 +8,14 @@ Just like real life the entropy of the game can only increase with time. If thin Completing your objectives is good practice, but the best antagonists will strive to do more than the bare minimum to really leave an impression. The more obscure and underused a game mechanic is, the less likely your victims are to be able to deal with it. Space is cold and it will quickly freeze you to death if you don't protect yourself. This isn't how thermodynamics really works but just go with it. -Blobs are weak to fire! Use a flame thrower for maximum damage! +Blobs are weak to fire! Use a flamethrower for maximum friendly fire! Cleanbot. The wizard is supposed to be extremely strong in one on one combat, stop getting mad about it. Sometimes a round will just be a bust. C'est la vie. This is a game that is constantly being developed for. Expect things to be added, removed, fixed, and broken on a daily basis. It's fun to try and predict the round type from the tip of the round message. They said the QM could never be a head, but we showed them. -The birb remembers. +The bird remembers. Your sprite represents your hitbox, so that afro makes you easier to kill. The sacrifices we make for style. Sometimes admins will just do stuff. Roll with it. The remake will never come out. @@ -32,18 +32,22 @@ There are at least 11 ways to get through plastic flaps. How many can you name? FEED ME A STRAY CAT Did you know that tossing the clown into a singularity will either increase or decrease its size by a large amount? Don't worry, you can always circlejerk your hate on the discord about furries. -Play a Vampire, they're overpowered and broken with no downsides that matter! -You can make a Beepsky with E-swords that will murder people for not wearing their IDs! -You can make a Beepsky with Toy-E-Swords if you want. It's like a cheaper Beepsky that will trip people and maybe shout on the sec channel about people its "Arresting" -There is a magic chem that turns people into Cat Girls/Boys. Its called "Felinid Mutation Toxin"! -Having Neko ears and tails or Cat ears and tails does not make you into a Felinid race! -Mhelp is basically useless, and never used correctly. Being a Mentor just means that admins will do Mhelps for you and you get to learn the round type when someone asks you a basic question regarding their antag status. -Toxins Bombs are not the only way to get RnD points. However, nobody will ever do any other method to get sci points... +You can make a Beepsky with E-swords instead of batons that will kill people for existing wrong. +You can make a Beepsky with Toy-E-Swords instead of batons that will try to kill people out of spite alone. +Do not ask about the purrbation. +Ask about the purrbation. +Mhelp is basically useless, and never used correctly. Being a Mentor just means that Admins will answer tickets for you and you get to learn the round type when someone asks a basic question regarding their antag role. +Toxins Bombs are the only way to get Research points. There's others, but we don't talk about them. Plasma men are a powerful race with many perks! No really, I swear! So what if they need an "ERP Plasma room" to fuck, who cares! -As a Cargo Tech make sure to always buy a tesla to sell back to CC. They love those those. Trust me! +As a Cargo Technician make sure to always buy a tesla to sell back to CC. They love those. Trust me! ;HELP MAINT +Help. Admins always regret meme options in their polls. Putting cat ears on securitrons makes them table people and nya. Mekhi isn't a cat, but he still goes on the table, just roll with it. As a Changeling, you can live without a head as they are merely vestigal to you, now, finally, you can be a Dullahan without it being Halloween. People actually have fictional sex between fictional characters in this game. When in doubt, take a break. A long break, preferably. If the game is wearing down your mental state and it's starting to lose any semblance of fun value, go and do something else for a month or two. By the time you come back, everything you liked will have been changed anyways. +Coders aren't real people. +MARRY AND REPRODUCE +TOUCH GRASS +Floorbot. diff --git a/strings/tips.txt b/strings/tips.txt index d4373b3606..46dfe1d796 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -1,93 +1,97 @@ Where the space map levels connect is randomized every round, but are otherwise kept consistent within rounds. Remember that they are not necessarily bidirectional! You can catch thrown items by toggling on your throw mode with an empty hand active. -To crack the safe in the vault, have a stethoscope in one of your hands and fiddle with the tumbler or you can alternatively use several concentrated explosive charges on it. Remember that the latter may result in the contents of the safe becoming a pile of ash. +To crack the safe in the vault, have a stethoscope in one of your hands and fiddle with the tumbler or use a couple C4s on it. Remember the latter option may result in the contents of the safe becoming non-existant. You can climb onto a table by dragging yourself onto one. This takes time and drops the items in your hands on the table. Clicking on a table that someone else is climbing onto will knock them down. You can drag other players onto yourself to open the strip menu, letting you remove their equipment or force them to wear something. Note that exosuits or helmets will block your access to the clothing beneath them, and that certain items take longer to strip or put on than others. Clicking on a windoor rather then bumping into it will keep it open, you can click it again to close it. You can spray a fire extinguisher, throw items or fire a gun while floating through space to change your direction. Simply fire opposite to where you want to go. You can change the control scheme by pressing tab. One is WASD, the other is the arrow keys. Keep in mind that hotkeys are also changed with this. -All vending machines can be hacked to obtain some contraband items from them, and many may charge extra credits to give you premium items. +Most vending machines can be hacked to obtain contraband items from them. Firesuits and winter coats offer mild protection from the cold, allowing you to spend longer periods of time near breaches and space than if wearing nothing at all. +A firesuit and a hardhat make you immune to pressure damage, allowing you to spacewalk while only worrying about the cold. Glass shards can be welded to make glass, and metal rods can be welded to make metal. Ores can be welded too, but this takes a lot of fuel. If you need to drag multiple people either to safety or to space, bring a locker or crate over and stuff them all in before hauling them off. You can grab someone by clicking on them with the grab intent, then upgrade the grab by clicking on them once more. An aggressive grab can temporarily stun someone depending on their luck with resisting out of it, allowing you to slam them on a table by clicking on it, or throw them by toggling on throwing. -Holding alt and left clicking a tile will allow you to see its contents in the top right window pane, which is much faster than right clicking. +Holding alt and left clicking a tile will allow you to see its contents in the top right window pane, which is generally faster than right clicking. The resist button will allow you to resist out of handcuffs, being buckled to a chair or bed, out of locked lockers and more. Whenever you're stuck, try resisting! You can move an item out of the way by dragging it and then clicking on an adjacent tile with an empty hand. -You can recolor certain items like jumpsuits and gloves in washing machines by also throwing in a crayon. For more advanced fashion you can spray items with a spray can to tint its colors. Some items work better than others at displaying their tints, like sterile and paper masks, or darkly colored gloves. +You can recolor certain items like jumpsuits and gloves in washing machines by also throwing in a crayon. For more advanced fashion you can spray items with a spray can to change their tint, or toy with color matrixes at the ColorMate. Maintenance is full of equipment that is randomized every round. Look around and see if anything is worth using. Some roles cannot be antagonists by default, but antag selection is decided first. For instance, you can set Security Officer to High without affecting your chances of becoming an antag - the game will just assign you to your next preferred role - or in the case that you have no such preferences set, a random role entirely. There are many places around the station to hide contraband. A few for starters: linen boxes, toilet cisterns, body bags. Experiment to find more! -On all maps, you can use a machine in the vault to deposit space cash for cargo points. Otherwise, use it to steal the station's cash and get out before the alarm goes off. -As the Captain, you are one of the highest priority targets on the station. Everything from revolutions looking to thwart your rule, to nuclear operatives seeking the disk, to traitors that need to rob you of your several high value items - or your life are all things to be concerned about. +On all maps, you can use the bank terminal in the vault to deposit space cash for cargo points. On the contrary, can be used to drain the station's cash. Just remember to get out before the alarm goes off! +As the Captain, you are one of the highest priority targets on the station. Everything from revolutions looking to thwart your rule, to nuclear operatives seeking the station's destruction, or simply down-bad antagonists looking for loot. Walk with eyes behind your head at all times. As the Captain, always take the nuclear disk and pinpointer with you every shift. It's a good idea to give one of these to another head you can trust with keeping it safe, such as the Head of Personnel. As the Captain, you have absolute access and control over the station, but this does not mean that being a horrible person won't result in mutiny and a ban. As the Captain, you have a fancy pen that can be used as a holdout dagger or even as a scalpel in surgery! As the Captain, you can purchase a new emergency shuttle using a communications console. Some require credits, while others give you credits in exchange. Keep in mind that purchasing dangerous shuttles will incur the ire of your crew. -As the Chief Medical Officer, your hypospray is like the ones that your Medical Doctors can buy, except it comes in a fancy box that can hold several more hypovials than the standard, and already comes preloaded with specially-made high-capacity hypovials that hold double the reagents the standard ones do. +As the Chief Medical Officer, your hypospray is like the ones that your Medical Doctors can buy, except it comes in a fancy box that can hold several more hypovials than the standard, and already comes preloaded with special high-capacity hypovials that hold double the reagents the standard ones do. As the Chief Medical Officer, coordinate and communicate with your doctors, chemists, and paramedics during a nuclear emergency, blob infestation, or some other crisis to keep people alive and fighting. -As a Medical Doctor, pester Research for improved surgical tools. They work faster, combine the purposes of several tools in one (scalpel/saw, retractor/hemostat, drill/cautery), and don't cost many materials to boot! -As a Medical Doctor, the surgical saw and drill are both powerful weapons, the saw is sharp and can slice and dice, while the drill can quickly blind someone if aimed for the eyes. The laser scalpel is an upgraded version producible with Research's aid, and it has the highest force of most common place weapons, while still remaining sharp. -As a Medical Doctor, your belt can hold a full set of surgical tools. Using sterilizine before each attempt during surgery will reduce your failure chance on tricky steps or when using less-than-optimal equipment. -As a Medical Doctor, you can attempt to drain blood from a husk with a syringe to determine the cause. If you can extract blood, it was caused by extreme temperatures or lasers, if there is no blood to extract, you have confirmed the presence of changelings. -As a Medical Doctor, while both heal toxin damage, the difference between charcoal and antitoxin is that charcoal will actively remove all other reagents from one's body, while antitoxin only removes various toxins - but can overdose. +As a Medical Doctor, pester Research for upgraded surgical tools. They work faster and combine the purposes of several tools in one (scalpel/saw, retractor/hemostat, drill/cautery). +As a Medical Doctor, the surgical saw and drill are both powerful weapons, the saw is sharp and can cause wounds, while the drill can quickly blind someone if aimed for the eyes. The laser scalpel is an upgraded version of the saw producible with Research's aid, and it has the highest force of any printable weapon, while still remaining sharp. +As a Medical Doctor, your belt can hold up to a full set of surgical tools alongside most other medical equipment. +As a Medical Doctor, sterilizine will dramaticlaly increase the chances of consecutive surgical steps. Consider applying some during tricky surgical steps or when using less-than-optimal equipment. +As a Medical Doctor, you can attempt to drain blood from a husk with a syringe to determine the cause. If you can extract blood, it was likely caused by extreme temperatures or lasers, if there is no blood to extract, you may have confirmed the presence of changelings. +As a Medical Doctor, while both heal toxin damage, the difference between charcoal and antitoxin is that charcoal will actively remove all other reagents from one's body with no maluses, while antitoxin only removes various toxins - but can overdose. As a Medical Doctor, you can surgically implant or extract things from people's chests by performing a cavity implant. This could range from inserting a suicide bomb to embedding the nuke disk into the Captain's chest. -As a Medical Doctor, it's of utmost urgency that you tend to anyone who's been hugged by a facehugger. You only have a couple of minutes from the initial attachment to perform organ manipulation to their chest and remove the rapidly developing alien embryo before it bursts out and immediately kills your patient. +As a Medical Doctor, it's of utmost urgency that you tend to anyone who's been hugged by a facehugger. You only have a couple of minutes from the initial attachment to perform organ manipulation on their chest and remove the alien embryo before it bursts out as a dangerous alien larva. As a Medical Doctor, you must target the correct limb and be on help intent when trying to perform surgery on someone. Using disarm attempt will intentionally fail the surgery step. -As a Medical Doctor, corpses with the "...and their soul has departed" description no longer have a ghost attached to them and can't be revived. However it may prove useful to be creative in your revivification techniques with these bodies. +As a Medical Doctor, corpses with the "...and their soul has departed" description no longer have a ghost attached to them and can't be revived. However it may prove useful to keep an eye on these corpses in event their owner comes back. +As a Medical Doctor, morgue slabs will display differing colors depending on what's inside. Red is a currently-unrevivable corpse, yellow is a non-organic object, and green is a currently-revivable corpse. The latter-most will play an alarm whenever a ghost occupies the dead body. As a Medical Doctor, treating plasmamen is not impossible! Salbutamol and epinephrine stops them from suffocating due to lack of internals and showers stop them from burning alive. You can even perform surgery on them by doing the procedure on a roller bed under a shower. As a Medical Doctor, you can point your penlight at people to create a medical hologram. This lets them know that you're coming to treat them. As a Medical Doctor, you can extract implants by holding an empty implant case in your offhand while performing the extraction step. As a Medical Doctor, clone scanning people will implant them with a health tracker that displays their vitals in the clone records. Useful to check on crew members that didn't activate suit sensors! As a Medical Doctor, you can deal with patients who have absurd amounts of wounds by putting them in cryo. This will slowly treat all of their wounds simultaneously, but is much slower than direct treatment. -As a Medical Doctor, Critical Slash wounds are one of the most dangerous conditions someone can have. Apply gauze, epipens, sutures, cauteries, whatever you can, as soon as possible! +As a Medical Doctor, weeping avulsions are one of the most dangerous conditions someone can have. Apply gauze, epipens, sutures, cauteries, whatever you can, as soon as possible! As a Medical Doctor, Saline-Glucose not only acts as a temporary boost to a patient's blood level, it also speeds regeneration! Perfect for drained patients! -As a Medical Doctor, medical gauze is an incredibly underrated tool. It can be used to entirely halt a limb from bleeding or sling one that's been shattered until it can be given proper attention. This even works on the dead, too! Be sure to stop someone's bleeding whether they're in critical condition or a corpse, as dragging someone whom is bleeding will rapidly deplete them of all their blood. +As a Medical Doctor, medical gauze is an incredibly useful tool. It can be used to staunch a limb's bleeding bleeding or sling one that's been broken until it can be given proper attention. This even works on the dead, too! +As a Medical Doctor, dragging someone who is bleeding will rapidly cause their blood levels to drop into lethal levels - use fireman carrying, roller beds or even closets and crates to transport patients without giving yourself more work. As a Chemist, there are dozens of chemicals that can heal, and even more that can cause harm. See which chemicals have the best synergy, both in healing, and in harming. Experiment! As a Chemist, some chemicals can only be synthesized by heating up the contents in the chemical heater. As a Chemist, you will be expected to supply crew with certain chemicals. For example, clonexadone and mannitol for the cryo tubes, unstable mutagen and saltpetre for botany as well as healing pills and patches for the front desk. As a Chemist, you can make 100u bottles from plastic sheets. The ChemMaster can produce infinite 30u glass bottles as well. -As a Chemist, be sure to stock up some hypovials with useful chemicals for any doctors looking to heal on the go, you can also print out the deluxe hypovials at an autolathe specifically for the CMO's special hypospray. -As a Chemist, the reagent dartgun, while neutered in its ability to harm - can still be loaded up with morphine for a ghetto sedation weapon, and a quick shot of charcoal can make a slime hybrid regret their life choices in an instant. +As a Chemist, be sure to stock up some hypovials with useful chemicals for any doctors looking to heal on the go - you can also print deluxe hypovials at an autolathe for the CMO's special hypospray. +As a Chemist, the reagent dartgun, while neutered in its ability to harm - can still be loaded with morphine for a ghetto sedation weapon, and a quick shot of charcoal can make a slime hybrid regret their life choices in an instant. As a Geneticist, you can eject someone from cloning early by clicking on the cloner pod with your ID. Note that they will suffer more genetic damage and may lose vital organs from this. -As a Geneticist, becoming a hulk makes you capable of dealing high melee damage, becoming immune to most traditional stuns, and punching through walls. However, you can't fire guns, and will lose your hulk status if you take too much damage. -As the Virologist, your viruses can range from healing powers so great that you can heal out of critical status, or diseases so dangerous they can kill the entire crew with airborne spontaneous combustion. Experiment! +As a Geneticist, becoming a hulk makes you capable of dealing high melee damage, becoming immune to most traditional stuns, and punching through walls. However, you can't fire guns, and will lose your hulk status if you enter critical condition. +As the Virologist, your viruses can range from healing powers so great they heal you out of critical condition, or diseases so dangerous they can kill the entire crew with airborne spontaneous combustion. Experiment! As the Virologist, you only require small amounts of vaccine to heal a sick patient. Work with the Chemist to distribute your cures more efficiently. As the Research Director, you can take AIs out of their cores by loading them into an intelliCard, and then from there into an AI system integrity restorer computer to revive and/or repair them. As the Research Director, you can lock down cyborgs instead of blowing them up. Then you can have their laws reset or if that doesn't work, safely dismantled. As the Research Director, you can upgrade your modular console with better computer parts to speed up its functions. This can be useful when using the AI system integrity restorer. As the Research Director, your console's NTnet monitoring tool can be used to retrieve airlock passkeys, provided that someone used a door remote. -As a Scientist, you can use the mutation toxin obtained from green slimes to turn yourself into a jelly mutant. Each subspecies has unique features - for example telepathic powers, duplicating bodies or integrating slime extracts for several unique effects! +As a Scientist, you can use the mutation toxin obtained from green slimes to turn yourself into a jelly mutant. Each subspecies has unique features - from telepathic powers and duplicating bodies or integrating slime extracts for several unique effects! As a Scientist, you can maximize the number of uses you get out of a slime by feeding it slime steroid, created from purple slimes, while alive. You can then apply extract enhancer, created from cerulean slimes, on each extract. -As a Scientist, you can disable anomalies by scanning them with an analyzer, and then sending a signal on the frequency it gives you with a remote signalling device. Alternatively, you can print out anomaly defusal tools which can instantly disable an anomaly at the protolathe with some research, both of these methods will leave behind an anomaly core, which can be used to construct a Phazon mech, or be used in the destructive analyzer for a 10,000 point bonus! +As a Scientist, you can disable anomalies by scanning them with an analyzer, and then sending a signal on the frequency it gives you with a remote signalling device. Alternatively, you can print anomaly defusal tools which can instantly disable an anomaly at the protolathe with some research, both of these methods will leave behind an anomaly core, which can be used for a couple scientific boons. As a Scientist, researchable stock parts can seriously improve the efficiency and speed of machines around the station. In some cases, it can even unlock new functions. As a Scientist, you can generate research points by letting the tachyon-doppler array record increasingly large explosions. As a Scientist, getting drunk just enough will speed up research. Skol! As a Scientist, you can get points by placing slime cores into the destructive analyzer! This even works with crossbred slime cores. -As a Scientist, you can get a minuscule amount of points by sacrificing a packet of seeds from Hydroponics into the destructive analyzer! While each individual one may not yield many points per, you can quite easily amass a very large variety of seeds, which could add up over time for a couple extra minutes shaved off of maxing out RND. +As a Scientist, you can get points by placing seed packets into the destructive analyzer! This even works with mutated plants. +As a Scientist, any machine which prints things - be it your protolathe or circuit imprinters - can be used to teleport raw materials directly from the ore silo straight into your workplace. As a Roboticist, keep an ear out for anomaly announcements. If you get your hands on an anomaly core, you can build a Phazon mech! -As a Roboticist, you can repair your cyborgs with a welding tool. If they have taken burn damage from lasers, you can remove their battery, expose the wiring with a screwdriver and replace their wires with a cable coil. +As a Roboticist, you can repair a cyborg's brute damage with a welding tool. If they have taken burn damage, you can remove their battery, expose the wiring with a screwdriver and replace their wires with a cable coil. As a Roboticist, you can reset a cyborg's module by cutting and mending the reset wire with a wire cutter. -As a Roboticist, pay mind when toying with a cyborg's wires. It's best to pulse wires before immediately cutting them, as cutting them right away without knowing what they do may sever them from the AI, or disable their camera. +As a Roboticist, pay mind when toying with a cyborg's wires. It's best to pulse wires before immediately cutting them, as cutting them right away without knowing what they do may sever them from the AI or disable their camera. As a Roboticist, you can greatly help out Shaft Miners by building a Firefighter APLU equipped with a hydraulic clamp and plasma cutter. The mech is ash storm proof and can even walk across lava! -As a Roboticist, you can augment people with cyborg limbs. Augmented limbs are immune to the vacuum of space and temperatures while they can very easily be repaired with welders (brute) and cable coils (burn). -As a Roboticist, you can use your printer that is linked to the ore silo to teleport mats into your work place! +As a Roboticist, you can augment people with cyborg limbs. Augmented limbs are immune both pressure and temperature while being very easily be repaired with welders (brute) and cable coils (burn). As a Roboticist, you can upgrade cleanbots with adv mops and brooms to make them faster and better! As a Roboticist, you can upgrade medical bots with diamond-tipped syringes, hyposprays, and chemistry machine boards to make their injections pierce hardsuits, work faster, and inject higher quality medicines! As the AI, you can click on people's names when they speak over the radio to jump your eye to them. This only works if there are cameras that can see them and are not wearing anything which would obsfuscate their face or tracking capabilities. As the AI, you can quickly open and close doors by holding shift while clicking them, bolt them when holding ctrl, and even shock them while holding alt. As the AI, you can take pictures with your camera and upload them to newscasters. Cyborgs also share from this pool of pictures. As a Cyborg, choose your module carefully, as only having your reset wire cut and mended by someone capable of manipulation will let you repick it. If possible, refrain from choosing a module until a situation that requires one occurs. -As a Cyborg, you are immune to most forms of stunning, and excel at almost everything far better than humans. However, flashes and EMPs can easily stunlock you and you fall short in performing any tasks which require hands. -As a Cyborg, you are impervious to fires and heat. If you are rogue, you can release plasma fires everywhere and walk through them without a care in the world! +As a Cyborg, you are immune to most forms of stuns, and excel at almost everything far better than humans. However, both flashes and EMPs can easily stunlock you and you fall short in performing most complex tasks involving hands. +As a Cyborg, you are impervious to fires and heat. If you are feeling malfunctional, you can release plasma fires all over and walk through them without a care in the world! As a Cyborg, you are extremely vulnerable to EMPs as EMPs both stun you and damage you. The ion rifle in the armory or a traitor with an EMP kit can kill you in seconds. As a Service Cyborg, your spray can knocks people down. However, it is blocked by gas masks. -As an Engineering Cyborg, you can attach air alarm/fire alarm/APC frames to walls by placing them on the floor and using a screwdriver on them. Alternatively, you can use your in-built pseudo-hand manipulator to show those organics who's boss! It can even perform complex tasks such as removing cells from APCs, or inserting plasma canisters into radiation collectors. +As an Engineering Cyborg, you can attach air alarm/fire alarm/APC frames to walls by placing them on the floor and using a screwdriver on them. Alternatively, you can use your manipulator to show those organics who's boss to perform other basic tasks such as removing cells from APCs or inserting plasma canisters into radiation collectors. As a Medical Cyborg, you can fully perform surgery and even augment people. Best of all, they have a 0% failure chance, even if done on the floor. As a Janitor Cyborg, you are the bane of all slaughter demons and can even foil Bubblegum himself. Cleaning up blood stains will severely gimp them, although the latter may just turn you into robotic paste. As a Janitor Cyborg, you get a fancy bottle of drying agent! If you want to be nice, spray the janitor's galoshes with them to magically upgrade them to absorbent galoshes which automatically dry tiles. As the Chief Engineer, you can rename areas or create entirely new ones using your station blueprints. -As the Chief Engineer, your hardsuit is significantly better than everybody else's. It has the best features of both engineering and atmospherics hardsuits - boasting nigh-invulnerability to radiation and all atmospheric conditions. +As the Chief Engineer, your hardsuit is significantly better than everybody else's. It has the best features of both engineering and atmospherics hardsuits - boasting complete invulnerability to radiation and most atmospheric conditions. As the Chief Engineer, you can spy on and even forge PDA communications with the message monitor console! The key is in your office. As the Chief Engineer, your locker contains a jetpack upgrade that can be attached to hardsuits. As the Chief Engineer, the power flow control console in your office will show you APC infos and lets you control them remotely. @@ -104,7 +108,7 @@ As an Engineer, don't underestimate the humble P.A.C.M.A.N. generators. With upg As an Engineer, your departmental protolathe and circuit printer can manufacture the necessary circuit boards and components to build just about anything. Make extra medical machinery everywhere! Build a gibber for security! Set up an array of emitters pointing down the hall! The possibilities are endless! As an Engineer, you can pry open secure storage by disabling the engine room APC's environmental breaker. This is obviously a bad idea if the engine is running. As an Engineer, don't forget that Cargo has access to a meteor defense satellite that can be ordered BEFORE meteors hit the station. Any idle Engineers should have this on their to-do list. -As an Engineer, your RCD can be reloaded with mineral sheets instead of just compressed matter cartridges. Materials which are combined alloys of other materials (such as reinforced glass and plasteel) provide more matter per sheet to the RCD. +As an Engineer, your RCD can be reloaded with mineral sheets instead of just compressed matter cartridges. Materials which are combined alloys of other materials (such as reinforced glass and plasteel) provide significantly more matter per sheet to the RCD. As an Atmospheric Technician, you can unwrench a pipe regardless of the pressures of the gases inside, but if they're too high they can burst out and injure you! As an Atmospheric Technician, look into replacing your gas pumps with volumetric gas pumps, as those move air in flat numerical amounts, rather than percentages which leave trace gases. As an Atmospheric Technician, you are better suited to fighting fires than anyone else. As such, you have access to better firesuits, backpack firefighter tanks, and a completely heat and fire proof hardsuit. @@ -112,7 +116,8 @@ As an Atmospheric Technician, your backpack firefighter tank can launch resin. T As an Atmospheric Technician, your ATMOS holofan projectors can blocks gases and heat while allowing objects to pass through. With it, you can quickly contain gas spills, fires and hull breaches. Or, use it to create a plasmaman friendly lounge. As an Atmospheric Technician, burning a plasma/oxygen mix inside the incinerator will not only produce power, but also gases such as tritium and water vapor. As an Atmospheric Technician, you can change the layer of a pipe by clicking with it on a wrenched pipe or other atmos component of the desired layer. -As an Atmospheric Technician, you can take a few cans worth of N2/N2O and cool it down at local freezers. This is a good idea when dealing with (or preparing for) a supermatter meltdown. +As an Atmospheric Technician, you can take a few cans worth of N2 and cool it down at local freezers. This is a good idea when dealing with (or preparing for) a supermatter meltdown. +As an Atmospheric Technician, while N2O may be good at cooling the supermatter, it will quickly degrade into flammable oxygen. As the Head of Security, you are expected to coordinate your security force to handle any threat that comes to the station. Sometimes it means making use of the armory to handle a blob, sometimes it means being ruthless during a revolution or cult. As the Head of Security, you can call for executions or forced cyborgization, but may require the Captain's approval. As the Head of Security, don't let the power go to your head. You may have high access, great equipment, and a miniature army at your side, but being a terrible person without a good reason is grounds for banning. @@ -123,10 +128,10 @@ As the Warden, never underestimate the power of tech slugs! Scattershot fires a As the Warden, you can use a surgical saw on riot shotguns to shorten the barrel, making them able to fit in your backpack. Make sure to empty them prior lest you blast yourself in the face! As the Warden, you can implant criminals you suspect might re-offend with devices that will track their location and allow you to remotely inject them with disabling chemicals. As the Warden, you can use handcuffs on orange prisoner shoes to turn them into cuffed shoes, forcing prisoners to walk and potentially thwarting an escape. -As the Warden, tracker implants can be used on crewmembers. Doing this will let you track their person even without suit sensors and even instantly teleport to them at the local teleporter, although the implant will biodegrade after 5 minutes if its holder ever expires. +As the Warden, tracker implants can be used on crewmembers. Doing this will let you track their person even without suit sensors and even instantly teleport to them with the local teleporter. Keep in mind the implant will biodegrade after 5 minutes if its holder ever expires. As the Warden, cryostasis shotgun darts hold 10u of chemicals that will not react until it hits someone. -As the Warden, chemical implants can be loaded with a cocktail of healing or combat chems, perfect for the HoS or other security officers to make use of in a pinch. Be sure to keep a eye on them though, as they cannot be injected without the prisoner management console! EMPs or starvation might lead to the chemical implant going off preemptively. -As the Warden, tracker implants can be used on your security officers. Doing this will let you be able to message them when telecomms are out, or when you suspect comms are compromised. This is also good against rogue AIs as the prisoner tracker doesn't leave logs or alarms for the AI. +As the Warden, chemical implants can be used both on friends and foe alike. Give your underlings a cocktail of healing stimulants to be injected in a pinch, or give your parolees some lethal incentive to not reoffend. +As the Warden, tracking implants can be used on both friends and foe alike. Give your underlings one to keep tabs on their locations and privately message them if you suspect communications may be comprimised, or use them to keep track of your parolees and their general doings. As a Security Officer, remember that correlation does not equal causation. Someone may have just been at the wrong place at the wrong time! As a Security Officer, remember that your belt can hold more than one stun baton. As a Security Officer, remember harm beating someone in the head with a blunt object can deconvert them form a being a revolutionary! This sadly doesn't work against either cult, nor does this protect them from getting reconverted unlike a mindshield implant. @@ -136,47 +141,50 @@ As a Security Officer, your security HUDglasses can not only see crewmates' job As a Security Officer, mindshield implants can only prevent someone from being turned into a cultist: unlike revolutionaries, it will not de-cult them if they have already been converted. As a Security Officer, examining someone while wearing your security HUDglasses can allow you to swiftly edit their records and criminal status. Be sure to set someone to WANTED if you can't catch up to them, as it'll alert other officers of who's the bad guy, and cause the little security droids to chase after them for you. As a Security Officer, you can take out the power cell on your baton to replace it with a better or fully charged one. Just use a screwdriver on your baton to remove the old cell. -As a Security Officer, you can just about any firearm on your vest, this even works with other non-standard armor-substitutes like security winter coats! +As a Security Officer, you can place just about any firearm on your vest slot, and this even works with other non-standard armor-substitutes like security winter coats! As the Detective, people leave fingerprints everywhere and on everything. With the exception of white latex, gloves will hide them. All is not lost, however, as gloves leave fibers specific to their kind such as black or nitrile, pointing to a general department. -As the Detective, you can use your forensics scanner from a distance. Use this to scan boxes or other storage containers. +As the Detective, you can use your forensics scanner from a distance. Use this to scan boxes or other storage containers which might vacuum up your scanner on interaction. As the Detective, your revolver can be loaded with .357 ammunition. Use a screwdriver to permanently modify your revolver into using this type of ammunition, be warned however, firing it has a decent chance to cause the revolver to misfire and shoot you in the foot. As the Lawyer, try to negotiate with the Warden if sentences seem too high for the crime. As the Lawyer, you can try to convince the Captain and Head of Security to hold trials for prisoners in the courtroom. As the Head of Personnel, you are not higher ranking than other heads of staff, even though you are expected to take the Captain's place first should he go missing. If the situation seems too rough for you, consider allowing another head to become temporary Captain. -As the Head of Personnel, you are just as large a target as the Captain because of the potential power your ID and computer can hand out and your comparative vulnerability. +As the Head of Personnel, you are just as large a target as the Captain because of the potential power your ID and computer can hand out with your comparative vulnerability. As the Mime, your invisible wall power blocks people as well as projectiles. You can use it in a pinch to delay your pursuer. As the Mime, you can use :r and :l to speak through your ventriloquist dummy. Sadly, this only works if your vow is broken, but at least you don't have to sacrifice your dignity by actually talking. As the Mime, your oath of silence is your source of power. Breaking it robs you of your powers and of your honor. -As the Mime, breaking your vow of silence is seen as incredibly dishonorable. Most people will seek to trouble and generally ignore a talking Mime. +As the Mime, breaking your vow of silence is seen as incredibly dishonorable. Most people will generally seek to trouble or even harm a talking Mime. +As the Mime, your PDA can infect others' with a virus that mutes their ringtone. Finally, peace and quiet. As the Clown, if you lose your banana peel, you can still slip people with your PDA! Honk! As the Clown, eating bananas heals you slightly. Honk! As the Clown, your Holy Grail is the mineral bananium, which can be given to the Roboticist to build you a fun and robust mech beloved by everyone. As the Clown, you can use your stamp on a sheet of flattened cardboard as the first step of making a honkbot. Fun for the whole crew! -As the Clown, your number one way to win over the crew's favor is by telling jokes and putting forth effort into being comedic. Everyone loves a good clown, but everyone despises a bad one. +As the Clown, your number one way to win over the crew's favor is by putting forth proper effort to be comedic. Everyone loves a good clown, but on a similar note everyone despises a bad one. +As the Clown, your PDA can infect others' with a virus that makes their ringtone a bike horn. You can get more charges by slipping people with your PDA! Honk! As the Chaplain, your null rod has a lot of functions: while being an incredibly powerful weapon with an array of potential utilities depending upon the skin you chose for it, it also nulls cultist and wizard magic entirely, making you immune to them both and in some cases even harming the caster so long as you keep it in a pocket or in your hands. As the Chaplain, you can bless any water container by hitting it with your bible to turn it into holy water. Holy water has a myriad of uses against both cults and large amounts of it are a great contributor to success against them. As the Chaplain, your null rod will kill clockwork marauders in two hits while actively hindering their overall combat capabilities just by being nearby to them. As the Chaplain, your bible is also a container that can store a singular small item. Depending on your God, your starting bible may come with a surprise! -As the Chaplain, you are much more likely to get a response by praying to the Gods than most people as your prayers will send a special noise cue directly to them! To further your chances of getting a response even further, pretty up your altar with crayon runes and wire art, and be sure to put a decent amount of effort into your prayers themselves. The Gods don't like lazy bums. +As the Chaplain, you are much more likely to get a response by praying to the Gods than most people as your prayers will send a special noise cue directly to them! To further your chances of getting a response even further, pretty up your altar with crayon runes and wire art, and be sure to put a decent amount of effort into your prayers themselves! The Gods always love a good ritual display. As a Botanist, you can hack the MegaSeed Vendor to get access to more exotic seeds. These seeds can alternatively be ordered from cargo. As a Botanist, you can mutate the plants growing in your hydroponics trays with unstable mutagen or, as an alternative, crude radioactives from chemistry to get special variations. As a Botanist, you should look into increasing the potency of your plants. This is shown by the size of the plant's sprite, and can increase the amount of chemicals, points gained from grinding them in the biogenerator, and lets people know you are a proficient botanist. As a Botanist, you can combine production trait chemicals and mix your own complex chemicals inside of the plants themselves using precursors. Chlorine (blumpkin) + radium and phosphorus (glowshrooms) equals unstable mutagen! As a Botanist, earthsblood is an incredibly powerful chemical found in Ambrosia Gaia, it heals all types of damages very rapidly but causes lingering brain damage and has a nasty overdose. You can combine the chemicals from watermelons (water), grass (hydrogen), and cherries (sugar) to mix mannitol in with your earthsblood to completely counteract its main drawback! -As a Botanist, Ambrosia Gaia is a plant mutated from Ambrosia Deus, which is a plant mutated from Ambrosia Vulgaris. The reagent contained within this plant known as earthsblood makes for a vastly superior fertilizer than most, giving decent stat boosts to most stats, and automatically killing weeds and pests! +As a Botanist, Ambrosia Gaia is a plant mutated from Ambrosia Deus, which in turn is mutated from Ambrosia Vulgaris. The reagent contained within this plant known as earthsblood makes for a vastly superior fertilizer than most, giving decent stat boosts to most stats, and automatically killing weeds and pests! As a Cook, you can load your food into snack vending machines. As a Cook, you can rename your custom made food with a pen. -As a Cook, any food you make will be much healthier than the junk food found in vendors. Having the crew routinely eating from you will provide minor buffs. +As a Cook, most any food you make will be much healthier than the junk food found in vendors. Having the crew routinely eating from you will provide minor buffs. As a Cook, being in the kitchen will make you remember the basics of Close Quarters Cooking (CQC). It is highly effective at removing Assistants from your workplace. -As a Cook, your Kitchenmate can vend out trays that fit on your belt slot. These trays pick up 7 food items at a time and are a quick way to transport large meals. +As a Cook, your KitchenMate can vend out trays that fit on your belt slot. These trays pick up 7 food items at a time and are a quick way to transport large meals. As a Cook, the advanced roasting stick is used to cook food at a distance, and can be used on SME, singularity, and other objects that cook food normally. As a Cook, the deep frier is a tool which can turn very large quantities of seemingly useless objects into food, albeit nutritionally poor and awful tasting food, but hey, food is food. -As the Bartender, the drinks you start with only give you the basics. If you want more advanced mixtures, look into working with chemistry, hydroponics, or even mining for things to grind up and throw in! +As the Bartender, the drinks you start with only give you the basics. If you want more advanced mixtures, look into working with chemistry, hydroponics, and even mining for things to grind up and throw in! As the Bartender, you can use a circular saw on your shotgun to make it easier to store. Make sure to empty them prior lest you blast yourself in the face! -As a Janitor, if someone steals your janicart, you can instead use your spray bottles, soap, and arsenal of slippery objects to exact your bloody revenge.. ..or just order another one from Cargo. +As a Janitor, if someone steals your janicart, you can instead use your spray bottles, soap, and arsenal of slippery objects to exact your bloody revenge... or just order another one from Cargo. As a Janitor, the trash bag can be used to hold more than trash. Tools, medical equipment, smuggled nuclear disks... You name it! As a Janitor, mousetraps can be used as bomb triggers to booby-trap containers. -As the Curator, for what it's worth, your toys and position are fairly robust. You can order a claymore, a whip, or a free space suit all at roundstart. The claymore is fairly underwhelming, however the whip is an incredibly robust weapon capable of always disarming, and that space suit is also better than the ones in EVA. +As a Janitor, you can use the cartridge preinstalled into your PDA to get coordinates of various janitorial equipments around the station, such as mops or your janicart. +As the Curator, for what it's worth, your toys and position are fairly robust. You can order a claymore, a whip, or a free space suit all at roundstart. The claymore is has decent force, while the whip is an incredibly robust weapon capable of disarming, and the space suit is better than the ones in EVA. As the Curator, be sure to keep the shelves stocked and the library clean for crew. As a Cargo Technician, you can hack MULEbots to make them faster, run over people in their way, and even let you ride them! As a Cargo Technician, you can order contraband items from the supply shuttle console by de-constructing it and using a multitool on the circuit board, the re-assembling it. @@ -187,30 +195,32 @@ As the Quartermaster, be sure to check the manifests on crates you receive to ma As the Quartermaster, you can construct an express supply console that instantly delivers crates by drop pod. The impact will cause a small explosion as well. As a Shaft Miner, the northern side of Lavaland has a lot more rare minerals than on the south. As a Shaft Miner, every monster on Lavaland has a pattern you can exploit to minimize damage from the encounters. -As a Shaft Miner, you can harvest goliath plates from goliaths and upgrade your explorer's suit, mining hardsuits as well as Firefighter APLUs with them, greatly reducing incoming melee damage. +As a Shaft Miner, you can harvest goliath plates from goliaths and upgrade your explorer suit, mining hardsuits as well as Firefighter APLUs with them, greatly reducing incoming melee damage. As a Shaft Miner, always have a GPS on you, so a fellow miner or cyborg can come to save you if you die. As a Shaft Miner, you can craft a variety of equipment from the local fauna. Bone axes, lava boats and ash drake armour are just a few of them! -As a Traitor, the cryptographic sequencer (emag) can not only open lockers, crates, APCs and more. It can also do things like hack cyborgs, and even cause bots to go berserk. Use it on the right machines, and you can even contact the Syndicate. Experiment! +As a Traitor, the cryptographic sequencer (emag) can not only open lockers, crates, APCs and more. It can also do things like hack cyborgs and cause bots to go berserk. Use it on the right machines, and you can even contact the Syndicate. Experiment! As a Traitor, subverting the AI to serve you can make it an extremely powerful ally. However, be careful of the wording in the laws you give it, as it may use your poorly written laws against you! As a Traitor, the Captain and the Head of Security are two of the most difficult to kill targets on the station. If either one is your target, plan carefully. As a Traitor, you can manufacture and recycle revolver bullets at a hacked autolathe, making the revolver an extremely powerful tool if you manage to nab an autolathe for yourself. As a Traitor, you may sometimes be assigned to hunt other traitors, and in turn be hunted by others. As a Traitor, the syndicate encryption key is very useful for coordinating plans with your fellow traitors -- or, of course, betraying them. As a Traitor, plasma can be injected into many things to sabotage them. Power cells, light bulbs, cigars and e-cigs will all explode when used. +as a Traitor, swiping another traitor's uplink against your own while it is unlocked will drain the funds from theirs, regardless of its lock status. As a Nuclear Operative, communication is key! Use :t or :h to speak to your fellow operatives and coordinate an attack plan. -As a Nuclear Operative, you should look into purchasing one of the three Syndicate cyborgs in your uplink, as they can provide useful tactical support, function as walking access machines, are immune to conventional stuns, and can easily take down the AI. +As a Nuclear Operative, you should look into purchasing one of the three Syndicate cyborgs in your uplink, as they can provide useful tactical support by opening airlocks without trouble, easily sabotaging electrical systems, and killing the AI with comical ease. As a Nuclear Operative, stick together! While your equipment is robust, your fellow operatives are much better at saving your life: they can drag you away from danger while stunned and provide cover fire. As a Nuclear Operative, you might end up in a situation where the AI has bolted you into a room. Having some spare C4 in your pocket can save your life. As a Monkey, you can crawl through air or scrubber vents by alt+left clicking them. You must drop everything you are wearing and holding to do this, however. As a Monkey, you can still wear a few human items, such as backpacks, gas masks and hats, and still have two free hands. As the Malfunctioning AI, you can shunt to an APC if the situation gets bad. This disables your doomsday device if it is active. As the Malfunctioning AI, you should either order your cyborgs to dismantle the robotics console or blow it up yourself in order to protect them. Do note that this will prevent you from hacking any cyborg made in the future. -As the Malfunctioning AI, look into flooding the station with plasma fires to kill off large portions of the crew, letting you pick off the remaining few with space suits who escaped. -Xenomorphs? Any source of burn damage severely harms them. Science can craft deadly tech shells like pulse slugs and laser scatter shot that are highly effective against any alien threat. +As the Malfunctioning AI, look into flooding the station with plasma to kill off large portions of the crew, letting you pick off the remaining few with space suits who escaped. +As the Malfunctioning AI, keep in mind that hacked cyborgs will explode violently enough to create breaches and gib bystandars when detonated as opposed to the comparatively gentle boom of the uncomprimised. +When fighting Aliens, any source of burn damage severely harms them. Science can craft deadly tech shells that are highly effective against any alien threat. When fighting Aliens, it can be a good idea to turn off the gravity due to the every caste of alien's lack of zero-gravity control, especially Hunters and Drones, which are completely and utterly helpless. -When fighting Aliens, consider a shield. A raised shield can halt their attempts to slash at you, and their disarms will always remove an item in your hand before knocking you over, always having something in your hand, no matter how small or worthless, can save your life. +When fighting Aliens, consider investing in a shield. A raised shield can halt their attempts to slash at you, and their disarms will always attempt to remove an item in your hand before knocking you over, meaing having something in your hand - no matter how small or worthless - can save your life. As an Alien, your melee prowess is unmatched, but your ranged abilities are sorely lacking. Make use of corners to force a melee confrontation! -As an Alien, you take double damage from all burn attacks, such as lasers, welding tools, and fires. Furthermore, fire can destroy your resin and eggs. Expose areas to space to starve away any flamethrower fires before they can do damage! +As an Alien, you take double damage from all burn attacks, such as lasers, welding tools, and fires. Furthermore, fire can destroy your resin and eggs. Expose areas to space to starve away any flames before they can do damage! As an Alien, resin floors not only regenerate your plasma supply, but also passively heal you. Fight on resin floors to gain a home turf advantage! As an Alien, the facehugger is by far your most powerful weapon because of its ability to instantly win a fight. Remember however that certain helmets, such as biohoods or space helmets will completely block facehugger attacks. As an Alien, you are unable to pick up or use any human items or machinery. Instead, you should focus on sabotaging APCs, computers, cameras and either stowing, spacing, or melting any weapons you find. @@ -234,9 +244,9 @@ As a Revolutionary, cargo can be your best friend or your worst nightmare. In th As a Revolutionary, your main power comes from how quickly you spread. Convert people as fast as you can and overwhelm the heads of staff before security can arm up. As a Changeling, the Extract DNA sting counts for your genome absorb objective, but does not let you respec your powers. As a Changeling, you can absorb someone by strangling them and using the Absorb verb; this gives you the ability to rechoose your powers, the DNA of whoever you absorbed, the memory of the absorbed, and some samples of things the absorbed said. -As a Changeling, absorbing someone will give you their full memory. This can include things such as a Traitor's uplink, thus absorbing one will allow you to access the Traitor uplink and buy toys for your Changeling self to abuse. -As a Changeling, absorbing another Changeling will permanently boost your chemical reserve, allow you to pick more abilities, and make the victim unable to revive. Be careful when exposing your identity to other Changelings, as they may be out of those wonderful benefits. -As a Changeling, BZ gas will dramatically slow down or even halt your natural chemical regeneration, be sure to avoid it at all costs as some lunatics may try and flood portions of the station to deal with you. +As a Changeling, absorbing someone will give you their full memory. This can include things such as a Traitor's uplink. +As a Changeling, absorbing another Changeling will permanently boost your chemical reserve, allow you to pick more abilities, and make the victim unable to revive. Be careful when exposing your identity to other Changelings, as they may be out for those wonderful benefits. +As a Changeling, BZ gas will dramatically slow down or even halt your natural chemical regeneration. As a Changeling, death is not the end for you! You can revive after 40 seconds from being dead by triggering your stasis ability, and then waiting for the prompt to resurrect yourself to show up. As a Changeling, your Regenerate Limbs power will quickly heal all of your wounds, but they'll still leave scars. Changelings can use Fleshmend to get rid of scars, or you can ingest Carpotoxin to get rid of them like a normal person. As a Cultist, do not cause too much chaos before your objective is completed. If the shuttle gets called too soon, you may not have enough time to win. @@ -293,21 +303,20 @@ You can light a cigar on a supermatter crystal. Using sticky tape on items can make them stick to people and walls! Be careful, grenades might stick to your hand during the moment of truth! In a pinch, stripping yourself naked will give you a sizeable resistance to being tackled. What do you value more, your freedom or your dignity? Wearing riot armor makes you significantly more effective at performing tackle takedowns, but will use extra stamina with each leap! It will also significantly protect you from other tackles! -Epipens contain a powerful coagulant that drastically reduces bleeding on all bleeding wounds. If you don't have time to properly treat someone with lots of slashes or piercings, stick them with a pen to buy some time! +Emergency epinephrine pens contain a powerful coagulant that drastically reduces bleeding on all bleeding wounds. If you don't have time to properly treat someone with lots of slashes or piercings, stick them with a pen to buy some time! Anything you can light a cigarette with, you can use to cauterize a bleeding wound. Technically, that includes the supermatter. -Suit storage units, when hacked, entirely purge radiation from any carbon mob put inside of them when cycling, at the cost of some horrific burns, this is a very effective strategy to clean someone up after they bathed in the engine. -Laser pointers can be upgraded by replacing its micro laser with a better one from RnD! Use a screwdriver on it to remove the old laser. Upgrading the laser pointer gives you better odds of stunning a cyborg, and even blinding people with sunglasses. -Being out of combat mode makes makes you deal less damage to people and objects when attacking. This stacks with the penalty incurred by resting. -Resting makes you deal less damage to people and objects when attacking. This stacks with the penalty incurred by being out of combat mode. -You do not regenerate as much stamina while in combat mode. Resting (being on the ground) makes you regenerate stamina faster. +Suit storage units, when hacked, entirely purge radiation from any carbon mob put inside of them when cycling, at the cost of some horrific burns, this is a very effective strategy to clean someone of radiation after an engine bath. +Laser pointers can be upgraded by replacing its micro-laser with a higher-tiered one from Research! Use a screwdriver on it to remove the old laser. Upgrading the laser pointer gives you better odds of stunning a cyborg, and even lets you blind people wear sunglasses. +Resting makes you deal less damage to people and objects when attacking. +Resting makes you regenerate stamina faster. Keybinds can be reassigned in character setup on the keybindings tab. This is extremely useful, especially if you know how to use independent binds. -If your suit sensors have been shorted out, you can use cable coil to fix them by using the coil on your suit. Your suit needs to be in proper condition, however. -Most clothing when damaged can be repaired using cloth, but there may be some clothes out there that will require different stacks of materials. +If your suit sensors have been shorted out, you can fix them by using the coil on your suit. +Most clothing damage can be repaired using cloth, but there may be some clothes out there that will require different stacks of materials. You should under no circumstances, teleport bread. Food made from upgraded machines has a higher quality. Food with a high enough quality can give good moodlets even if your species dislikes the kind of food! Frying something makes it edible, while still maintaining its original functionality. Slimepeople are damaged by most things that heal toxin damage, and healed by most things that deal it. You can recognise people with this functionality through them having a cyan coloured species name when examined! EMPs can be created by mixing uranium and iron. The power of the pulse is determined by the distance from its epicentre, and the maximum distance is determined by the volume of the reaction! -Lizards start with a disabled mutation that allows them to breath fire. This can be unlocked through the usage of genetics! -Several loadout items can be unlocked through progress in parts of the game. The progress for these can be tracked in the loadout menu. - +Some lizardpeople start with an unactivated mutation that allows them to breath fire. This can be unlocked through the usage of genetics! +Some loadout items can be unlocked through progress in parts of the game. The progress for these can be tracked in the loadout menu. +It's easy to forget that everyone else you're playing with is a real person trying to have as much fun as you are. Be nice to your fellow spacemen. diff --git a/strings/traumas.json b/strings/traumas.json index e5048d41b2..195a28364b 100644 --- a/strings/traumas.json +++ b/strings/traumas.json @@ -70,7 +70,7 @@ "NO PRED CAN eVER CATCH MI", "SCIENCE GIB SHINK RAY PLS", "KILL PUNPUN 4 FUN xDD", - "i play @pick(roles) to only ORDER not DO", + "i play @pick(importantroles) to only ORDER not DO", "CRAGO ORDER @pick(cargo) PLS", "erp?", "i want to digest u!!!", @@ -98,6 +98,7 @@ "nerf blob!1", "iM NOT A FUWRRYY!!!", "FOURTEEN INCHES SOFT!!!", + "SPLUUUUUUUUUUUUUUUUUUUUUUURTS!!!!!!!!!!", "@pick(semicolon)N-NYAAAAAA~", "@pick(bug)", "@pick(semicolon)wtf??????????? @pick(bug)", @@ -133,7 +134,10 @@ "@pick(semicolon)Assaltign a sec osficer aren't crime if ur @pick(roles)", ";SEC I SPILED MU JICE HELELPH HELPJ JLEP HELP", "@pick(semicolon) atmos is chemistyr is radation fast air is FASTER cheemsitry and FASTER RADIATION AND FASTER DEATH!!!", - "@pick(semicolon) FUC'KING MuNKEY WAch TALKN SHIT" + "@pick(semicolon) FUC'KING MuNKEY WAch TALKN SHIT", + "@pick(semicolon)How do I set up the. SHow do I set u p the Singu. how I the scrungulartiy????", + "@pick(semicolon)@pick(roles) is suSpicious!!!", + "@pick(semicolon)NOOO!!!OOOOOOO!! @pick(roles) HALP!!" ], "mutations": [ @@ -184,7 +188,11 @@ "haylo", "EEGEE", "mr terry", - "berry" + "berry", + "are pee", + "mayne", + "air ret", + "dise" ], "create_verbs": [ @@ -199,7 +207,8 @@ "treaitors", "sheadow lings", "abdoocters", - "revinent" + "revinent", + "ninja" ], "bug": [ @@ -266,20 +275,63 @@ "YOUR LIFE IS IMPORTANT. KEEP IT." ], - "roles": [ + "importantroles": [ "heds", "ceptin", "hop", - "arrdee", + "hos", + "see emo", + "cee ee", + "arr dee", + "q m", "sek" ], + "roles": [ + "ceptin", + "hop", + "hos", + "see emo", + "cee ee", + "arr dee", + "q m", + "assistent", + "cargo", + "mine r", + "bart ender", + "chef", + "botonist", + "janny", + "clon", + "mime", + "librarian", + "chap", + "ai", + "borg", + "egnineer", + "atmos", + "docter", + "paradocter", + "cheemsist", + "viroligist", + "genetocist", + "science", + "robotocist", + "wardon", + "det", + "shitcurity", + "prihsoner" + ], + "cargo": [ "GUNS", "HATS", "PIZEH", "MEMES", - "GLOWY CYSTAL" + "GLOWY CYSTAL", + "SINGLO", + "TESLO", + "NULLZ" ], "s_roles": [ @@ -289,6 +341,7 @@ "admen", "mantor", "bluh daymon", - "wizzerd" + "wizzerd", + "nookies" ] } diff --git a/tgstation.dme b/tgstation.dme index 298443fd4e..c4de2a1799 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -17,7 +17,7 @@ #include "_maps\_basemap.dm" #include "code\_compile_options.dm" #include "code\world.dm" -#include "code\__DEFINES\_extools.dm" +#include "code\__DEFINES\_auxtools.dm" #include "code\__DEFINES\_globals.dm" #include "code\__DEFINES\_protect.dm" #include "code\__DEFINES\_tick.dm" @@ -103,12 +103,14 @@ #include "code\__DEFINES\rockpaperscissors.dm" #include "code\__DEFINES\role_preferences.dm" #include "code\__DEFINES\rust_g.dm" +#include "code\__DEFINES\rust_g_overrides.dm" #include "code\__DEFINES\say.dm" #include "code\__DEFINES\security_levels.dm" #include "code\__DEFINES\shuttles.dm" #include "code\__DEFINES\sight.dm" #include "code\__DEFINES\sound.dm" #include "code\__DEFINES\spaceman_dmm.dm" +#include "code\__DEFINES\spans.dm" #include "code\__DEFINES\species.dm" #include "code\__DEFINES\stat.dm" #include "code\__DEFINES\stat_tracking.dm" @@ -177,6 +179,8 @@ #include "code\__HELPERS\icon_smoothing.dm" #include "code\__HELPERS\icons.dm" #include "code\__HELPERS\level_traits.dm" +#include "code\__HELPERS\lighting.dm" +#include "code\__HELPERS\markov.dm" #include "code\__HELPERS\matrices.dm" #include "code\__HELPERS\mobs.dm" #include "code\__HELPERS\mouse_control.dm" @@ -291,20 +295,32 @@ #include "code\controllers\subsystem.dm" #include "code\controllers\configuration\config_entry.dm" #include "code\controllers\configuration\configuration.dm" +#include "code\controllers\configuration\entries\admin.dm" +#include "code\controllers\configuration\entries\alert.dm" +#include "code\controllers\configuration\entries\antag_rep.dm" #include "code\controllers\configuration\entries\comms.dm" +#include "code\controllers\configuration\entries\connections.dm" #include "code\controllers\configuration\entries\dbconfig.dm" +#include "code\controllers\configuration\entries\debris.dm" #include "code\controllers\configuration\entries\donator.dm" #include "code\controllers\configuration\entries\dynamic.dm" -#include "code\controllers\configuration\entries\fail2topic.dm" -#include "code\controllers\configuration\entries\game_options.dm" +#include "code\controllers\configuration\entries\fetish_content.dm" +#include "code\controllers\configuration\entries\gamemodes.dm" #include "code\controllers\configuration\entries\general.dm" +#include "code\controllers\configuration\entries\jexp.dm" #include "code\controllers\configuration\entries\logging.dm" +#include "code\controllers\configuration\entries\movespeed.dm" #include "code\controllers\configuration\entries\persistence.dm" #include "code\controllers\configuration\entries\plushies.dm" #include "code\controllers\configuration\entries\policy.dm" #include "code\controllers\configuration\entries\resources.dm" #include "code\controllers\configuration\entries\respawns.dm" +#include "code\controllers\configuration\entries\security.dm" +#include "code\controllers\configuration\entries\server.dm" #include "code\controllers\configuration\entries\stamina_combat.dm" +#include "code\controllers\configuration\entries\threat.dm" +#include "code\controllers\configuration\entries\urls.dm" +#include "code\controllers\configuration\entries\vote.dm" #include "code\controllers\subsystem\achievements.dm" #include "code\controllers\subsystem\activity.dm" #include "code\controllers\subsystem\adjacent_air.dm" @@ -448,6 +464,8 @@ #include "code\datums\achievements\skill_achievements.dm" #include "code\datums\actions\beam_rifle.dm" #include "code\datums\actions\ninja.dm" +#include "code\datums\atmosphere\_atmosphere.dm" +#include "code\datums\atmosphere\planetary.dm" #include "code\datums\brain_damage\brain_trauma.dm" #include "code\datums\brain_damage\hypnosis.dm" #include "code\datums\brain_damage\imaginary_friend.dm" @@ -648,6 +666,7 @@ #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\getrev.dm" #include "code\datums\helper_datums\icon_snapshot.dm" +#include "code\datums\helper_datums\stack_end_detector.dm" #include "code\datums\helper_datums\teleport.dm" #include "code\datums\looping_sounds\_looping_sound.dm" #include "code\datums\looping_sounds\item_sounds.dm" @@ -862,6 +881,7 @@ #include "code\game\machinery\mass_driver.dm" #include "code\game\machinery\navbeacon.dm" #include "code\game\machinery\PDApainter.dm" +#include "code\game\machinery\prisonlabor.dm" #include "code\game\machinery\quantum_pad.dm" #include "code\game\machinery\recharger.dm" #include "code\game\machinery\rechargestation.dm" @@ -1084,6 +1104,7 @@ #include "code\game\objects\items\dna_injector.dm" #include "code\game\objects\items\documents.dm" #include "code\game\objects\items\dualsaber.dm" +#include "code\game\objects\items\dyekit.dm" #include "code\game\objects\items\eightball.dm" #include "code\game\objects\items\electrostaff.dm" #include "code\game\objects\items\extinguisher.dm" @@ -1223,6 +1244,7 @@ #include "code\game\objects\items\robot\robot_upgrades.dm" #include "code\game\objects\items\stacks\bscrystal.dm" #include "code\game\objects\items\stacks\cash.dm" +#include "code\game\objects\items\stacks\license_plates.dm" #include "code\game\objects\items\stacks\medical.dm" #include "code\game\objects\items\stacks\rods.dm" #include "code\game\objects\items\stacks\stack.dm" @@ -1375,6 +1397,7 @@ #include "code\game\turfs\closed.dm" #include "code\game\turfs\open.dm" #include "code\game\turfs\turf.dm" +#include "code\game\turfs\open\floor\catwalk_plating.dm" #include "code\game\turfs\simulated\chasm.dm" #include "code\game\turfs\simulated\dirtystation.dm" #include "code\game\turfs\simulated\floor.dm" @@ -2355,6 +2378,7 @@ #include "code\modules\jobs\job_types\medical_doctor.dm" #include "code\modules\jobs\job_types\mime.dm" #include "code\modules\jobs\job_types\paramedic.dm" +#include "code\modules\jobs\job_types\prisoner.dm" #include "code\modules\jobs\job_types\quartermaster.dm" #include "code\modules\jobs\job_types\research_director.dm" #include "code\modules\jobs\job_types\roboticist.dm" @@ -2774,6 +2798,9 @@ #include "code\modules\mob\living\simple_animal\friendly\drone\say.dm" #include "code\modules\mob\living\simple_animal\friendly\drone\verbs.dm" #include "code\modules\mob\living\simple_animal\friendly\drone\visuals_icons.dm" +#include "code\modules\mob\living\simple_animal\gremlin\gremlin.dm" +#include "code\modules\mob\living\simple_animal\gremlin\gremlin_act.dm" +#include "code\modules\mob\living\simple_animal\gremlin\gremlin_event.dm" #include "code\modules\mob\living\simple_animal\guardian\guardian.dm" #include "code\modules\mob\living\simple_animal\guardian\types\assassin.dm" #include "code\modules\mob\living\simple_animal\guardian\types\charger.dm" @@ -2810,6 +2837,7 @@ #include "code\modules\mob\living\simple_animal\hostile\nanotrasen.dm" #include "code\modules\mob\living\simple_animal\hostile\netherworld.dm" #include "code\modules\mob\living\simple_animal\hostile\pirate.dm" +#include "code\modules\mob\living\simple_animal\hostile\plaguerat.dm" #include "code\modules\mob\living\simple_animal\hostile\regalrat.dm" #include "code\modules\mob\living\simple_animal\hostile\russian.dm" #include "code\modules\mob\living\simple_animal\hostile\sharks.dm" @@ -3621,6 +3649,7 @@ #include "code\modules\vehicles\atv.dm" #include "code\modules\vehicles\bicycle.dm" #include "code\modules\vehicles\lavaboat.dm" +#include "code\modules\vehicles\motorized_wheelchair.dm" #include "code\modules\vehicles\pimpin_ride.dm" #include "code\modules\vehicles\ridden.dm" #include "code\modules\vehicles\scooter.dm" @@ -3632,7 +3661,6 @@ #include "code\modules\vehicles\wheelchair.dm" #include "code\modules\vehicles\cars\car.dm" #include "code\modules\vehicles\cars\clowncar.dm" -#include "code\modules\vehicles\motorized_wheelchair.dm" #include "code\modules\vending\_vending.dm" #include "code\modules\vending\assist.dm" #include "code\modules\vending\autodrobe.dm" diff --git a/tgui/packages/tgui/index.js b/tgui/packages/tgui/index.js index e3e4df7036..f5d40a2b04 100644 --- a/tgui/packages/tgui/index.js +++ b/tgui/packages/tgui/index.js @@ -16,6 +16,7 @@ import './styles/themes/paper.scss'; import './styles/themes/retro.scss'; import './styles/themes/syndicate.scss'; import './styles/themes/wizard.scss'; +import './styles/themes/clockcult.scss'; import { perf } from 'common/perf'; import { setupHotReloading } from 'tgui-dev-server/link/client'; diff --git a/tools/build/README.md b/tools/build/README.md index f367857158..51121dbde6 100644 --- a/tools/build/README.md +++ b/tools/build/README.md @@ -13,6 +13,14 @@ This build script is the recommended way to compile the game, including not only The script will skip build steps whose inputs have not changed since the last run. +## Getting list of available targets + +You can get a list of all targets that you can build by running the following command: + +``` +tools/build/build --help +``` + ## Dependencies - On Windows, `BUILD.bat` will automatically install a private (vendored) copy of Node. @@ -22,3 +30,5 @@ The script will skip build steps whose inputs have not changed since the last ru ## Why? We used to include compiled versions of the tgui JavaScript code in the Git repository so that the project could be compiled using BYOND only. These pre-compiled files tended to have merge conflicts for no good reason. Using a build script lets us avoid this problem, while keeping builds convenient for people who are not modifying tgui. + +This build script is based on [Juke Build](https://github.com/stylemistake/juke-build) - please follow the link and read the documentation for the project to understand how it works and how to contribute to this build script. diff --git a/tools/build/binaries/README.md b/tools/build/binaries/README.md deleted file mode 100644 index 625f337d98..0000000000 --- a/tools/build/binaries/README.md +++ /dev/null @@ -1 +0,0 @@ -This directory is used to store temporary files to create binaries on linux \ No newline at end of file diff --git a/tools/build/build b/tools/build/build index cd4d804e8f..0e202e1bba 100755 --- a/tools/build/build +++ b/tools/build/build @@ -1,6 +1,4 @@ #!/bin/sh - -#Build TGUI set -e cd "$(dirname "$0")" exec ../bootstrap/node build.js "$@" diff --git a/tools/build/build.bat b/tools/build/build.bat index f5d9bd48f3..56e3bf1171 100644 --- a/tools/build/build.bat +++ b/tools/build/build.bat @@ -1 +1,2 @@ -@"%~dp0\..\bootstrap\node" "%~dp0\build.js" +@echo off +"%~dp0\..\bootstrap\node.bat" --experimental-modules "%~dp0\build.js" %* diff --git a/tools/build/build.js b/tools/build/build.js index 33767ebd72..f8d3a9a7dd 100755 --- a/tools/build/build.js +++ b/tools/build/build.js @@ -1,225 +1,293 @@ #!/usr/bin/env node /** + * Build script for /tg/station 13 codebase. + * + * This script uses Juke Build, read the docs here: + * https://github.com/stylemistake/juke-build + * * @file - * @copyright 2020 Aleksej Komarov + * @copyright 2021 Aleksej Komarov * @license MIT */ -// Change working directory to project root -process.chdir(require('path').resolve(__dirname, '../../')); +import fs from 'fs'; +import { DreamDaemon, DreamMaker } from './lib/byond.js'; +import { yarn } from './lib/yarn.js'; +import Juke from './juke/index.js'; -// Validate NodeJS version -const NODE_VERSION = parseInt(process.versions.node.match(/(\d+)/)[1]); -const NODE_VERSION_TARGET = parseInt(require('fs') - .readFileSync('dependencies.sh', 'utf-8') - .match(/NODE_VERSION=(\d+)/)[1]); -if (NODE_VERSION < NODE_VERSION_TARGET) { - console.error('Your current Node.js version is out of date.'); - console.error('You have two options:'); - console.error(' a) Go to https://nodejs.org/ and install the latest LTS release of Node.js'); - console.error(' b) Uninstall Node.js (our build system automatically downloads one)'); - process.exit(1); -} +Juke.chdir('../..', import.meta.url); +Juke.setup({ file: import.meta.url }).then((code) => process.exit(code)); -const STANDARD_BUILD = "Standard Build" -const TGS_BUILD = "TGS Build" -const ALL_MAPS_BUILD = "CI All Maps Build" -const TEST_RUN_BUILD = "CI Integration Tests Build" -const NO_DM_BUILD = "Except DM Build" +const DME_NAME = 'tgstation'; -let BUILD_MODE = STANDARD_BUILD; -if (process.env.CBT_BUILD_MODE) { - switch (process.env.CBT_BUILD_MODE) { - case "ALL_MAPS": - BUILD_MODE = ALL_MAPS_BUILD - break; - case "TEST_RUN": - BUILD_MODE = TEST_RUN_BUILD - break; - case "TGS": - BUILD_MODE = TGS_BUILD - break; - case "NO_DM": - BUILD_MODE = NO_DM_BUILD - break; - default: - BUILD_MODE = process.env.CBT_BUILD_MODE - break; - } -} -console.log(`Starting CBT in ${BUILD_MODE} mode.`) +export const DefineParameter = new Juke.Parameter({ + type: 'string[]', + alias: 'D', +}); -const DME_NAME = 'tgstation' +export const PortParameter = new Juke.Parameter({ + type: 'string', + alias: 'p', +}); -// Main -// -------------------------------------------------------- +export const CiParameter = new Juke.Parameter({ + type: 'boolean', +}); -const { resolveGlob, stat } = require('./cbt/fs'); -const { exec } = require('./cbt/process'); -const { Task, runTasks } = require('./cbt/task'); -const { regQuery } = require('./cbt/winreg'); -const fs = require('fs'); +export const DmMapsIncludeTarget = new Juke.Target({ + executes: async () => { + const folders = [ + ...Juke.glob('_maps/RandomRuins/**/*.dmm'), + ...Juke.glob('_maps/RandomZLevels/**/*.dmm'), + ...Juke.glob('_maps/shuttles/**/*.dmm'), + ...Juke.glob('_maps/templates/**/*.dmm'), + ]; + const content = folders + .map((file) => file.replace('_maps/', '')) + .map((file) => `#include "${file}"`) + .join('\n') + '\n'; + fs.writeFileSync('_maps/templates.dm', content); + }, +}); -const yarn = args => { - const yarnPath = resolveGlob('./tgui/.yarn/releases/yarn-*.cjs')[0] - .replace('/tgui/', '/'); - return exec('node', [yarnPath, ...args], { - cwd: './tgui', - }); -}; +export const DmTarget = new Juke.Target({ + dependsOn: ({ get }) => [ + get(DefineParameter).includes('ALL_MAPS') && DmMapsIncludeTarget, + ], + inputs: [ + '_maps/map_files/generic/**', + 'code/**', + 'goon/**', + 'html/**', + 'icons/**', + 'interface/**', + `${DME_NAME}.dme`, + ], + outputs: [ + `${DME_NAME}.dmb`, + `${DME_NAME}.rsc`, + ], + parameters: [DefineParameter], + executes: async ({ get }) => { + const defines = get(DefineParameter); + if (defines.length > 0) { + Juke.logger.info('Using defines:', defines.join(', ')); + } + await DreamMaker(`${DME_NAME}.dme`, { + defines: ['CBT', ...defines], + }); + }, +}); -/** Installs all tgui dependencies */ -const taskYarn = new Task('yarn') - // The following dependencies skip what could be considered an important - // step in Yarn: it verifies the integrity of cache. With this setup, if - // cache ever becomes corrupted, your only option is to clean build. - .depends('tgui/.yarn/+(cache|releases|plugins|sdks)/**/*') - .depends('tgui/**/package.json') - .depends('tgui/yarn.lock') - // Phony target (automatically created at the end of the task) - .provides('tgui/.yarn/install-target') - .build(() => yarn(['install'])); +export const DmTestTarget = new Juke.Target({ + dependsOn: ({ get }) => [ + get(DefineParameter).includes('ALL_MAPS') && DmMapsIncludeTarget, + ], + executes: async ({ get }) => { + const defines = get(DefineParameter); + if (defines.length > 0) { + Juke.logger.info('Using defines:', defines.join(', ')); + } + fs.copyFileSync(`${DME_NAME}.dme`, `${DME_NAME}.test.dme`); + await DreamMaker(`${DME_NAME}.test.dme`, { + defines: ['CBT', 'CIBUILDING', ...defines], + }); + Juke.rm('data/logs/ci', { recursive: true }); + await DreamDaemon( + `${DME_NAME}.test.dmb`, + '-close', '-trusted', '-verbose', + '-params', 'log-directory=ci' + ); + Juke.rm('*.test.*'); + try { + const cleanRun = fs.readFileSync('data/logs/ci/clean_run.lk', 'utf-8'); + console.log(cleanRun); + } + catch (err) { + Juke.logger.error('Test run was not clean, exiting'); + throw new Juke.ExitCode(1); + } + }, +}); -/** Builds svg fonts */ -const taskTgfont = new Task('tgfont') - .depends('tgui/.yarn/install-target') - .depends('tgui/packages/tgfont/**/*.+(js|cjs|svg)') - .depends('tgui/packages/tgfont/package.json') - .provides('tgui/packages/tgfont/dist/tgfont.css') - .provides('tgui/packages/tgfont/dist/tgfont.eot') - .provides('tgui/packages/tgfont/dist/tgfont.woff2') - .build(() => yarn(['workspace', 'tgfont', 'build'])); +export const YarnTarget = new Juke.Target({ + inputs: [ + 'tgui/.yarn/+(cache|releases|plugins|sdks)/**/*', + 'tgui/**/package.json', + 'tgui/yarn.lock', + ], + outputs: [ + 'tgui/.yarn/install-target', + ], + executes: async () => { + await yarn('install'); + }, +}); -/** Builds tgui */ -const taskTgui = new Task('tgui') - .depends('tgui/.yarn/install-target') - .depends('tgui/webpack.config.js') - .depends('tgui/**/package.json') - .depends('tgui/packages/**/*.+(js|cjs|ts|tsx|scss)') - .provides('tgui/public/tgui.bundle.css') - .provides('tgui/public/tgui.bundle.js') - .provides('tgui/public/tgui-common.bundle.js') - .provides('tgui/public/tgui-panel.bundle.css') - .provides('tgui/public/tgui-panel.bundle.js') - .build(async () => { - await yarn(['run', 'webpack-cli', '--mode=production']); - }); +export const TgFontTarget = new Juke.Target({ + dependsOn: [YarnTarget], + inputs: [ + 'tgui/.yarn/install-target', + 'tgui/packages/tgfont/**/*.+(js|cjs|svg)', + 'tgui/packages/tgfont/package.json', + ], + outputs: [ + 'tgui/packages/tgfont/dist/tgfont.css', + 'tgui/packages/tgfont/dist/tgfont.eot', + 'tgui/packages/tgfont/dist/tgfont.woff2', + ], + executes: async () => { + await yarn('workspace', 'tgfont', 'build'); + }, +}); + +export const TguiTarget = new Juke.Target({ + dependsOn: [YarnTarget], + inputs: [ + 'tgui/.yarn/install-target', + 'tgui/webpack.config.js', + 'tgui/**/package.json', + 'tgui/packages/**/*.+(js|cjs|ts|tsx|scss)', + ], + outputs: [ + 'tgui/public/tgui.bundle.css', + 'tgui/public/tgui.bundle.js', + 'tgui/public/tgui-panel.bundle.css', + 'tgui/public/tgui-panel.bundle.js', + ], + executes: async () => { + await yarn('webpack-cli', '--mode=production'); + }, +}); + +export const TguiEslintTarget = new Juke.Target({ + dependsOn: [YarnTarget], + executes: async ({ args }) => { + await yarn( + 'eslint', 'packages', + '--fix', '--ext', '.js,.cjs,.ts,.tsx', + ...args + ); + }, +}); + +export const TguiTscTarget = new Juke.Target({ + dependsOn: [YarnTarget], + executes: async () => { + await yarn('tsc'); + }, +}); + +export const TguiTestTarget = new Juke.Target({ + dependsOn: [YarnTarget], + executes: async ({ args }) => { + await yarn('jest', ...args); + }, +}); + +export const TguiLintTarget = new Juke.Target({ + dependsOn: [YarnTarget, TguiEslintTarget, TguiTscTarget, TguiTestTarget], +}); + +export const TguiDevTarget = new Juke.Target({ + dependsOn: [YarnTarget], + executes: async ({ args }) => { + await yarn('node', 'packages/tgui-dev-server/index.js', ...args); + }, +}); + +export const TguiAnalyzeTarget = new Juke.Target({ + dependsOn: [YarnTarget], + executes: async () => { + await yarn('webpack-cli', '--mode=production', '--analyze'); + }, +}); + +export const TestTarget = new Juke.Target({ + dependsOn: [DmTestTarget, TguiTestTarget], +}); + +export const LintTarget = new Juke.Target({ + dependsOn: [TguiLintTarget], +}); + +export const BuildTarget = new Juke.Target({ + dependsOn: [TguiTarget, TgFontTarget, DmTarget], +}); + +export const ServerTarget = new Juke.Target({ + dependsOn: [BuildTarget], + executes: async ({ get }) => { + const port = get(PortParameter) || '1337'; + await DreamDaemon(`${DME_NAME}.dmb`, port, '-trusted'); + }, +}); + +export const AllTarget = new Juke.Target({ + dependsOn: [TestTarget, LintTarget, BuildTarget], +}); + +/** + * Removes the immediate build junk to produce clean builds. + */ +export const CleanTarget = new Juke.Target({ + executes: async () => { + Juke.rm('*.dmb'); + Juke.rm('*.rsc'); + Juke.rm('*.mdme'); + Juke.rm('*.mdme*'); + Juke.rm('*.m.*'); + Juke.rm('_maps/templates.dm'); + Juke.rm('tgui/public/.tmp', { recursive: true }); + Juke.rm('tgui/public/*.map'); + Juke.rm('tgui/public/*.chunk.*'); + Juke.rm('tgui/public/*.bundle.*'); + Juke.rm('tgui/public/*.hot-update.*'); + Juke.rm('tgui/packages/tgfont/dist', { recursive: true }); + Juke.rm('tgui/.yarn/cache', { recursive: true }); + Juke.rm('tgui/.yarn/unplugged', { recursive: true }); + Juke.rm('tgui/.yarn/webpack', { recursive: true }); + Juke.rm('tgui/.yarn/build-state.yml'); + Juke.rm('tgui/.yarn/install-state.gz'); + Juke.rm('tgui/.yarn/install-target'); + Juke.rm('tgui/.pnp.*'); + }, +}); + +/** + * Removes more junk at expense of much slower initial builds. + */ +export const DistCleanTarget = new Juke.Target({ + dependsOn: [CleanTarget], + executes: async () => { + Juke.logger.info('Cleaning up data/logs'); + Juke.rm('data/logs', { recursive: true }); + Juke.logger.info('Cleaning up bootstrap cache'); + Juke.rm('tools/bootstrap/.cache', { recursive: true }); + Juke.logger.info('Cleaning up global yarn cache'); + await yarn('cache', 'clean', '--all'); + }, +}); /** * Prepends the defines to the .dme. * Does not clean them up, as this is intended for TGS which * clones new copies anyway. */ -const taskPrependDefines = (...defines) => new Task('prepend-defines') - .build(async () => { - const dmeContents = fs.readFileSync(`${DME_NAME}.dme`); - const textToWrite = defines.map(define => `#define ${define}\n`); - fs.writeFileSync(`${DME_NAME}.dme`, `${textToWrite}\n${dmeContents}`); - }); +const prependDefines = (...defines) => { + const dmeContents = fs.readFileSync(`${DME_NAME}.dme`); + const textToWrite = defines.map(define => `#define ${define}\n`); + fs.writeFileSync(`${DME_NAME}.dme`, `${textToWrite}\n${dmeContents}`); +}; -const taskDm = (...injectedDefines) => new Task('dm') - .depends('_maps/map_files/generic/**') - .depends('code/**') - .depends('goon/**') - .depends('html/**') - .depends('icons/**') - .depends('interface/**') - .depends(process.platform === 'win32' ? 'byond-extools.*' : 'libbyond-extools.*') - .depends('tgui/public/tgui.html') - .depends('tgui/public/*.bundle.*') - .depends(`${DME_NAME}.dme`) - .provides(`${DME_NAME}.dmb`) - .provides(`${DME_NAME}.rsc`) - .build(async () => { - const dmPath = await (async () => { - // Search in array of paths - const paths = [ - ...((process.env.DM_EXE && process.env.DM_EXE.split(',')) || []), - 'C:\\Program Files\\BYOND\\bin\\dm.exe', - 'C:\\Program Files (x86)\\BYOND\\bin\\dm.exe', - ['reg', 'HKLM\\Software\\Dantom\\BYOND', 'installpath'], - ['reg', 'HKLM\\SOFTWARE\\WOW6432Node\\Dantom\\BYOND', 'installpath'], - ]; - const isFile = path => { - try { - const fstat = stat(path); - return fstat && fstat.isFile(); - } - catch (err) {} - return false; - }; - for (let path of paths) { - // Resolve a registry key - if (Array.isArray(path)) { - const [type, ...args] = path; - path = await regQuery(...args); - } - if (!path) { - continue; - } - // Check if path exists - if (isFile(path)) { - return path; - } - if (isFile(path + '/dm.exe')) { - return path + '/dm.exe'; - } - if (isFile(path + '/bin/dm.exe')) { - return path + '/bin/dm.exe'; - } - } - // Default paths - return ( - process.platform === 'win32' && 'dm.exe' - || 'DreamMaker' - ); - })(); - if (injectedDefines.length) { - const injectedContent = injectedDefines - .map(x => `#define ${x}\n`) - .join('') - // Create mdme file - fs.writeFileSync(`${DME_NAME}.mdme`, injectedContent) - // Add the actual dme content - const dme_content = fs.readFileSync(`${DME_NAME}.dme`) - fs.appendFileSync(`${DME_NAME}.mdme`, dme_content) - await exec(dmPath, [`${DME_NAME}.mdme`]); - // Rename dmb - fs.renameSync(`${DME_NAME}.mdme.dmb`, `${DME_NAME}.dmb`) - // Rename rsc - fs.renameSync(`${DME_NAME}.mdme.rsc`, `${DME_NAME}.rsc`) - // Remove mdme - fs.unlinkSync(`${DME_NAME}.mdme`) - } - else { - await exec(dmPath, [`${DME_NAME}.dme`]); - } - }); +export const TgsTarget = new Juke.Target({ + dependsOn: [TguiTarget, TgFontTarget], + executes: async () => { + Juke.logger.info('Prepending TGS define'); + prependDefines('TGS'); + }, +}); -// Frontend -let tasksToRun = [ - taskYarn, - taskTgfont, - taskTgui, -]; -switch (BUILD_MODE) { - case STANDARD_BUILD: - tasksToRun.push(taskDm('CBT')); - break; - case TGS_BUILD: - tasksToRun.push(taskPrependDefines('TGS')); - break; - case ALL_MAPS_BUILD: - tasksToRun.push(taskDm('CBT','CIBUILDING','CITESTING','ALL_MAPS')); - break; - case TEST_RUN_BUILD: - tasksToRun.push(taskDm('CBT','CIBUILDING')); - break; - case NO_DM_BUILD: - break; - default: - console.error(`Unknown build mode : ${BUILD_MODE}`) - break; -} +const TGS_MODE = process.env.CBT_BUILD_MODE === 'TGS'; -runTasks(tasksToRun); +export default TGS_MODE ? TgsTarget : BuildTarget; diff --git a/tools/build/build.sh b/tools/build/build.sh deleted file mode 100755 index 5d050764d1..0000000000 --- a/tools/build/build.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/sh - -#Detect OS and use corresponding package manager for dependencies. Currently only works for arch, debian/ubuntu, and RHEL/fedora/CentOS -if [[ -f '/etc/arch-release' ]]; then - echo -ne '\n y' | sudo pacman --needed -Sy base-devel git curl nodejs unzip -fi -if [[ -f '/etc/debian version' ]]; then - sudo dpkg --add-architecture i386 - sudo apt-get update - sudo apt-get install -y build-essential git curl lib32z1 pkg-config libssl-dev:i386 libssl-dev nodejs unzip g++-multilib libc6-i386 libstdc++6:i386 -fi -if [[ -f '/etc/centos-release' ]] || [[ -f '/etc/fedora-release' ]]; then #DNF should work for both of these - sudo dnf --refresh install make automake gcc gcc-c++ kernel-devel git curl unzip glibc-devel.i686 openssl-devel.i686 libgcc.i686 libstdc++-devel.i686 -fi - -cd binaries - -#Install rust if not present -if ! [ -x "$has_cargo" ]; then - echo "Installing rust..." - curl https://sh.rustup.rs -sSf | sh -s -- -y - . ~/.profile -fi - -#Download/update rust-g repo -if [ ! -d "rust-g" ]; then - echo "Cloning rust-g..." - git clone https://github.com/tgstation/rust-g - cd rust-g - ~/.cargo/bin/rustup target add i686-unknown-linux-gnu -else - echo "Fetching rust-g..." - cd rust-g - git fetch - ~/.cargo/bin/rustup target add i686-unknown-linux-gnu -fi - -#Compile and move rust-g binary to repo root -echo "Deploying rust-g..." -git checkout "$RUST_G_VERSION" -env PKG_CONFIG_ALLOW_CROSS=1 ~/.cargo/bin/cargo build --release --target=i686-unknown-linux-gnu -mv target/i686-unknown-linux-gnu/release/librust_g.so ../../../../librust_g.so -cd .. - -#Download/update auxmos repo -if [ ! -d "auxmos" ]; then - echo "Cloning auxmos..." - git clone https://github.com/Putnam3145/auxmos - cd auxmos - ~/.cargo/bin/rustup target add i686-unknown-linux-gnu -else - echo "Fetching auxmos..." - cd auxmos - git fetch - ~/.cargo/bin/rustup target add i686-unknown-linux-gnu -fi - -#Compile and move auxmos binary to repo root -echo "Deploying auxmos..." -git checkout "$AUXMOS_VERSION" -env PKG_CONFIG_ALLOW_CROSS=1 ~/.cargo/bin/cargo rustc --release --target=i686-unknown-linux-gnu --features "all_reaction_hooks" -- -C target-cpu=native -mv target/i686-unknown-linux-gnu/release/libauxmos.so ../../../../libauxmos.so -cd ../.. - -#Install BYOND -cd ../.. -./tools/ci/install_byond.sh -source $HOME/BYOND/byond/bin/byondsetup - -cd tools/build - -#Build TGUI -set -e -cd "$(dirname "$0")" -exec ../bootstrap/node build.js "$@" diff --git a/tools/build/cbt/fs.js b/tools/build/cbt/fs.js deleted file mode 100644 index 68a5a8bfbf..0000000000 --- a/tools/build/cbt/fs.js +++ /dev/null @@ -1,135 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -const fs = require('fs'); -const glob = require('./glob'); - -class File { - constructor(path) { - this.path = path; - } - - get stat() { - if (this._stat === undefined) { - this._stat = stat(this.path); - } - return this._stat; - } - - exists() { - return this.stat !== null; - } - - get mtime() { - return this.stat && this.stat.mtime; - } - - touch() { - const time = new Date(); - try { - fs.utimesSync(this.path, time, time); - } - catch (err) { - fs.closeSync(fs.openSync(this.path, 'w')); - } - } -} - -class Glob { - constructor(path) { - this.path = path; - } - - toFiles() { - const paths = glob.sync(this.path, { - strict: false, - silent: true, - }); - return paths - .map(path => new File(path)) - .filter(file => file.exists()); - } -} - -/** - * If true, source is newer than target. - * @param {File[]} sources - * @param {File[]} targets - */ -const compareFiles = (sources, targets) => { - let bestSource = null; - let bestTarget = null; - for (const file of sources) { - if (!bestSource || file.mtime > bestSource.mtime) { - bestSource = file; - } - } - for (const file of targets) { - if (!file.exists()) { - return `target '${file.path}' is missing`; - } - if (!bestTarget || file.mtime < bestTarget.mtime) { - bestTarget = file; - } - } - // Doesn't need rebuild if there is no source, but target exists. - if (!bestSource) { - if (bestTarget) { - return false; - } - return 'no known sources or targets'; - } - // Always needs a rebuild if no targets were specified (e.g. due to GLOB). - if (!bestTarget) { - return 'no targets were specified'; - } - // Needs rebuild if source is newer than target - if (bestSource.mtime > bestTarget.mtime) { - return `source '${bestSource.path}' is newer than target '${bestTarget.path}'`; - } - return false; -}; - -/** - * Returns file stats for the provided path, or null if file is - * not accessible. - */ -const stat = path => { - try { - return fs.statSync(path); - } - catch { - return null; - } -}; - -/** - * Resolves a glob pattern and returns files that are safe - * to call `stat` on. - */ -const resolveGlob = globPath => { - const unsafePaths = glob.sync(globPath, { - strict: false, - silent: true, - }); - const safePaths = []; - for (let path of unsafePaths) { - try { - fs.statSync(path); - safePaths.push(path); - } - catch {} - } - return safePaths; -}; - -module.exports = { - File, - Glob, - compareFiles, - stat, - resolveGlob, -}; diff --git a/tools/build/cbt/glob.js b/tools/build/cbt/glob.js deleted file mode 100644 index df6e153b38..0000000000 --- a/tools/build/cbt/glob.js +++ /dev/null @@ -1,3281 +0,0 @@ -'use strict'; - -var fs = require('fs'); -var path$1 = require('path'); -var util = require('util'); -var events = require('events'); -var assert = require('assert'); - -function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } - -var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs); -var path__default = /*#__PURE__*/_interopDefaultLegacy(path$1); -var util__default = /*#__PURE__*/_interopDefaultLegacy(util); -var events__default = /*#__PURE__*/_interopDefaultLegacy(events); -var assert__default = /*#__PURE__*/_interopDefaultLegacy(assert); - -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - - -var isWindows = process.platform === 'win32'; - - -// JavaScript implementation of realpath, ported from node pre-v6 - -var DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG); - -function rethrow() { - // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and - // is fairly slow to generate. - var callback; - if (DEBUG) { - var backtrace = new Error; - callback = debugCallback; - } else - callback = missingCallback; - - return callback; - - function debugCallback(err) { - if (err) { - backtrace.message = err.message; - err = backtrace; - missingCallback(err); - } - } - - function missingCallback(err) { - if (err) { - if (process.throwDeprecation) - throw err; // Forgot a callback but don't know where? Use NODE_DEBUG=fs - else if (!process.noDeprecation) { - var msg = 'fs: missing callback ' + (err.stack || err.message); - if (process.traceDeprecation) - console.trace(msg); - else - console.error(msg); - } - } - } -} - -function maybeCallback(cb) { - return typeof cb === 'function' ? cb : rethrow(); -} - -var normalize = path__default['default'].normalize; - -// Regexp that finds the next partion of a (partial) path -// result is [base_with_slash, base], e.g. ['somedir/', 'somedir'] -if (isWindows) { - var nextPartRe = /(.*?)(?:[\/\\]+|$)/g; -} else { - var nextPartRe = /(.*?)(?:[\/]+|$)/g; -} - -// Regex to find the device root, including trailing slash. E.g. 'c:\\'. -if (isWindows) { - var splitRootRe = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/; -} else { - var splitRootRe = /^[\/]*/; -} - -var realpathSync = function realpathSync(p, cache) { - // make p is absolute - p = path__default['default'].resolve(p); - - if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { - return cache[p]; - } - - var original = p, - seenLinks = {}, - knownHard = {}; - - // current character position in p - var pos; - // the partial path so far, including a trailing slash if any - var current; - // the partial path without a trailing slash (except when pointing at a root) - var base; - // the partial path scanned in the previous round, with slash - var previous; - - start(); - - function start() { - // Skip over roots - var m = splitRootRe.exec(p); - pos = m[0].length; - current = m[0]; - base = m[0]; - previous = ''; - - // On windows, check that the root exists. On unix there is no need. - if (isWindows && !knownHard[base]) { - fs__default['default'].lstatSync(base); - knownHard[base] = true; - } - } - - // walk down the path, swapping out linked pathparts for their real - // values - // NB: p.length changes. - while (pos < p.length) { - // find the next part - nextPartRe.lastIndex = pos; - var result = nextPartRe.exec(p); - previous = current; - current += result[0]; - base = previous + result[1]; - pos = nextPartRe.lastIndex; - - // continue if not a symlink - if (knownHard[base] || (cache && cache[base] === base)) { - continue; - } - - var resolvedLink; - if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { - // some known symbolic link. no need to stat again. - resolvedLink = cache[base]; - } else { - var stat = fs__default['default'].lstatSync(base); - if (!stat.isSymbolicLink()) { - knownHard[base] = true; - if (cache) cache[base] = base; - continue; - } - - // read the link if it wasn't read before - // dev/ino always return 0 on windows, so skip the check. - var linkTarget = null; - if (!isWindows) { - var id = stat.dev.toString(32) + ':' + stat.ino.toString(32); - if (seenLinks.hasOwnProperty(id)) { - linkTarget = seenLinks[id]; - } - } - if (linkTarget === null) { - fs__default['default'].statSync(base); - linkTarget = fs__default['default'].readlinkSync(base); - } - resolvedLink = path__default['default'].resolve(previous, linkTarget); - // track this, if given a cache. - if (cache) cache[base] = resolvedLink; - if (!isWindows) seenLinks[id] = linkTarget; - } - - // resolve the link, then start over - p = path__default['default'].resolve(resolvedLink, p.slice(pos)); - start(); - } - - if (cache) cache[original] = p; - - return p; -}; - - -var realpath = function realpath(p, cache, cb) { - if (typeof cb !== 'function') { - cb = maybeCallback(cache); - cache = null; - } - - // make p is absolute - p = path__default['default'].resolve(p); - - if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { - return process.nextTick(cb.bind(null, null, cache[p])); - } - - var original = p, - seenLinks = {}, - knownHard = {}; - - // current character position in p - var pos; - // the partial path so far, including a trailing slash if any - var current; - // the partial path without a trailing slash (except when pointing at a root) - var base; - // the partial path scanned in the previous round, with slash - var previous; - - start(); - - function start() { - // Skip over roots - var m = splitRootRe.exec(p); - pos = m[0].length; - current = m[0]; - base = m[0]; - previous = ''; - - // On windows, check that the root exists. On unix there is no need. - if (isWindows && !knownHard[base]) { - fs__default['default'].lstat(base, function(err) { - if (err) return cb(err); - knownHard[base] = true; - LOOP(); - }); - } else { - process.nextTick(LOOP); - } - } - - // walk down the path, swapping out linked pathparts for their real - // values - function LOOP() { - // stop if scanned past end of path - if (pos >= p.length) { - if (cache) cache[original] = p; - return cb(null, p); - } - - // find the next part - nextPartRe.lastIndex = pos; - var result = nextPartRe.exec(p); - previous = current; - current += result[0]; - base = previous + result[1]; - pos = nextPartRe.lastIndex; - - // continue if not a symlink - if (knownHard[base] || (cache && cache[base] === base)) { - return process.nextTick(LOOP); - } - - if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { - // known symbolic link. no need to stat again. - return gotResolvedLink(cache[base]); - } - - return fs__default['default'].lstat(base, gotStat); - } - - function gotStat(err, stat) { - if (err) return cb(err); - - // if not a symlink, skip to the next path part - if (!stat.isSymbolicLink()) { - knownHard[base] = true; - if (cache) cache[base] = base; - return process.nextTick(LOOP); - } - - // stat & read the link if not read before - // call gotTarget as soon as the link target is known - // dev/ino always return 0 on windows, so skip the check. - if (!isWindows) { - var id = stat.dev.toString(32) + ':' + stat.ino.toString(32); - if (seenLinks.hasOwnProperty(id)) { - return gotTarget(null, seenLinks[id], base); - } - } - fs__default['default'].stat(base, function(err) { - if (err) return cb(err); - - fs__default['default'].readlink(base, function(err, target) { - if (!isWindows) seenLinks[id] = target; - gotTarget(err, target); - }); - }); - } - - function gotTarget(err, target, base) { - if (err) return cb(err); - - var resolvedLink = path__default['default'].resolve(previous, target); - if (cache) cache[base] = resolvedLink; - gotResolvedLink(resolvedLink); - } - - function gotResolvedLink(resolvedLink) { - // resolve the link, then start over - p = path__default['default'].resolve(resolvedLink, p.slice(pos)); - start(); - } -}; - -var old = { - realpathSync: realpathSync, - realpath: realpath -}; - -var fs_realpath = realpath$1; -realpath$1.realpath = realpath$1; -realpath$1.sync = realpathSync$1; -realpath$1.realpathSync = realpathSync$1; -realpath$1.monkeypatch = monkeypatch; -realpath$1.unmonkeypatch = unmonkeypatch; - - -var origRealpath = fs__default['default'].realpath; -var origRealpathSync = fs__default['default'].realpathSync; - -var version = process.version; -var ok = /^v[0-5]\./.test(version); - - -function newError (er) { - return er && er.syscall === 'realpath' && ( - er.code === 'ELOOP' || - er.code === 'ENOMEM' || - er.code === 'ENAMETOOLONG' - ) -} - -function realpath$1 (p, cache, cb) { - if (ok) { - return origRealpath(p, cache, cb) - } - - if (typeof cache === 'function') { - cb = cache; - cache = null; - } - origRealpath(p, cache, function (er, result) { - if (newError(er)) { - old.realpath(p, cache, cb); - } else { - cb(er, result); - } - }); -} - -function realpathSync$1 (p, cache) { - if (ok) { - return origRealpathSync(p, cache) - } - - try { - return origRealpathSync(p, cache) - } catch (er) { - if (newError(er)) { - return old.realpathSync(p, cache) - } else { - throw er - } - } -} - -function monkeypatch () { - fs__default['default'].realpath = realpath$1; - fs__default['default'].realpathSync = realpathSync$1; -} - -function unmonkeypatch () { - fs__default['default'].realpath = origRealpath; - fs__default['default'].realpathSync = origRealpathSync; -} - -var concatMap = function (xs, fn) { - var res = []; - for (var i = 0; i < xs.length; i++) { - var x = fn(xs[i], i); - if (isArray(x)) res.push.apply(res, x); - else res.push(x); - } - return res; -}; - -var isArray = Array.isArray || function (xs) { - return Object.prototype.toString.call(xs) === '[object Array]'; -}; - -var balancedMatch = balanced; -function balanced(a, b, str) { - if (a instanceof RegExp) a = maybeMatch(a, str); - if (b instanceof RegExp) b = maybeMatch(b, str); - - var r = range(a, b, str); - - return r && { - start: r[0], - end: r[1], - pre: str.slice(0, r[0]), - body: str.slice(r[0] + a.length, r[1]), - post: str.slice(r[1] + b.length) - }; -} - -function maybeMatch(reg, str) { - var m = str.match(reg); - return m ? m[0] : null; -} - -balanced.range = range; -function range(a, b, str) { - var begs, beg, left, right, result; - var ai = str.indexOf(a); - var bi = str.indexOf(b, ai + 1); - var i = ai; - - if (ai >= 0 && bi > 0) { - begs = []; - left = str.length; - - while (i >= 0 && !result) { - if (i == ai) { - begs.push(i); - ai = str.indexOf(a, i + 1); - } else if (begs.length == 1) { - result = [ begs.pop(), bi ]; - } else { - beg = begs.pop(); - if (beg < left) { - left = beg; - right = bi; - } - - bi = str.indexOf(b, i + 1); - } - - i = ai < bi && ai >= 0 ? ai : bi; - } - - if (begs.length) { - result = [ left, right ]; - } - } - - return result; -} - -var braceExpansion = expandTop; - -var escSlash = '\0SLASH'+Math.random()+'\0'; -var escOpen = '\0OPEN'+Math.random()+'\0'; -var escClose = '\0CLOSE'+Math.random()+'\0'; -var escComma = '\0COMMA'+Math.random()+'\0'; -var escPeriod = '\0PERIOD'+Math.random()+'\0'; - -function numeric(str) { - return parseInt(str, 10) == str - ? parseInt(str, 10) - : str.charCodeAt(0); -} - -function escapeBraces(str) { - return str.split('\\\\').join(escSlash) - .split('\\{').join(escOpen) - .split('\\}').join(escClose) - .split('\\,').join(escComma) - .split('\\.').join(escPeriod); -} - -function unescapeBraces(str) { - return str.split(escSlash).join('\\') - .split(escOpen).join('{') - .split(escClose).join('}') - .split(escComma).join(',') - .split(escPeriod).join('.'); -} - - -// Basically just str.split(","), but handling cases -// where we have nested braced sections, which should be -// treated as individual members, like {a,{b,c},d} -function parseCommaParts(str) { - if (!str) - return ['']; - - var parts = []; - var m = balancedMatch('{', '}', str); - - if (!m) - return str.split(','); - - var pre = m.pre; - var body = m.body; - var post = m.post; - var p = pre.split(','); - - p[p.length-1] += '{' + body + '}'; - var postParts = parseCommaParts(post); - if (post.length) { - p[p.length-1] += postParts.shift(); - p.push.apply(p, postParts); - } - - parts.push.apply(parts, p); - - return parts; -} - -function expandTop(str) { - if (!str) - return []; - - // I don't know why Bash 4.3 does this, but it does. - // Anything starting with {} will have the first two bytes preserved - // but *only* at the top level, so {},a}b will not expand to anything, - // but a{},b}c will be expanded to [a}c,abc]. - // One could argue that this is a bug in Bash, but since the goal of - // this module is to match Bash's rules, we escape a leading {} - if (str.substr(0, 2) === '{}') { - str = '\\{\\}' + str.substr(2); - } - - return expand(escapeBraces(str), true).map(unescapeBraces); -} - -function embrace(str) { - return '{' + str + '}'; -} -function isPadded(el) { - return /^-?0\d/.test(el); -} - -function lte(i, y) { - return i <= y; -} -function gte(i, y) { - return i >= y; -} - -function expand(str, isTop) { - var expansions = []; - - var m = balancedMatch('{', '}', str); - if (!m || /\$$/.test(m.pre)) return [str]; - - var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); - var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); - var isSequence = isNumericSequence || isAlphaSequence; - var isOptions = m.body.indexOf(',') >= 0; - if (!isSequence && !isOptions) { - // {a},b} - if (m.post.match(/,.*\}/)) { - str = m.pre + '{' + m.body + escClose + m.post; - return expand(str); - } - return [str]; - } - - var n; - if (isSequence) { - n = m.body.split(/\.\./); - } else { - n = parseCommaParts(m.body); - if (n.length === 1) { - // x{{a,b}}y ==> x{a}y x{b}y - n = expand(n[0], false).map(embrace); - if (n.length === 1) { - var post = m.post.length - ? expand(m.post, false) - : ['']; - return post.map(function(p) { - return m.pre + n[0] + p; - }); - } - } - } - - // at this point, n is the parts, and we know it's not a comma set - // with a single entry. - - // no need to expand pre, since it is guaranteed to be free of brace-sets - var pre = m.pre; - var post = m.post.length - ? expand(m.post, false) - : ['']; - - var N; - - if (isSequence) { - var x = numeric(n[0]); - var y = numeric(n[1]); - var width = Math.max(n[0].length, n[1].length); - var incr = n.length == 3 - ? Math.abs(numeric(n[2])) - : 1; - var test = lte; - var reverse = y < x; - if (reverse) { - incr *= -1; - test = gte; - } - var pad = n.some(isPadded); - - N = []; - - for (var i = x; test(i, y); i += incr) { - var c; - if (isAlphaSequence) { - c = String.fromCharCode(i); - if (c === '\\') - c = ''; - } else { - c = String(i); - if (pad) { - var need = width - c.length; - if (need > 0) { - var z = new Array(need + 1).join('0'); - if (i < 0) - c = '-' + z + c.slice(1); - else - c = z + c; - } - } - } - N.push(c); - } - } else { - N = concatMap(n, function(el) { return expand(el, false) }); - } - - for (var j = 0; j < N.length; j++) { - for (var k = 0; k < post.length; k++) { - var expansion = pre + N[j] + post[k]; - if (!isTop || isSequence || expansion) - expansions.push(expansion); - } - } - - return expansions; -} - -var minimatch_1 = minimatch; -minimatch.Minimatch = Minimatch; - -var path = { sep: '/' }; -try { - path = path__default['default']; -} catch (er) {} - -var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}; - - -var plTypes = { - '!': { open: '(?:(?!(?:', close: '))[^/]*?)'}, - '?': { open: '(?:', close: ')?' }, - '+': { open: '(?:', close: ')+' }, - '*': { open: '(?:', close: ')*' }, - '@': { open: '(?:', close: ')' } -}; - -// any single thing other than / -// don't need to escape / when using new RegExp() -var qmark = '[^/]'; - -// * => any number of characters -var star = qmark + '*?'; - -// ** when dots are allowed. Anything goes, except .. and . -// not (^ or / followed by one or two dots followed by $ or /), -// followed by anything, any number of times. -var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?'; - -// not a ^ or / followed by a dot, -// followed by anything, any number of times. -var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?'; - -// characters that need to be escaped in RegExp. -var reSpecials = charSet('().*{}+?[]^$\\!'); - -// "abc" -> { a:true, b:true, c:true } -function charSet (s) { - return s.split('').reduce(function (set, c) { - set[c] = true; - return set - }, {}) -} - -// normalizes slashes. -var slashSplit = /\/+/; - -minimatch.filter = filter; -function filter (pattern, options) { - options = options || {}; - return function (p, i, list) { - return minimatch(p, pattern, options) - } -} - -function ext (a, b) { - a = a || {}; - b = b || {}; - var t = {}; - Object.keys(b).forEach(function (k) { - t[k] = b[k]; - }); - Object.keys(a).forEach(function (k) { - t[k] = a[k]; - }); - return t -} - -minimatch.defaults = function (def) { - if (!def || !Object.keys(def).length) return minimatch - - var orig = minimatch; - - var m = function minimatch (p, pattern, options) { - return orig.minimatch(p, pattern, ext(def, options)) - }; - - m.Minimatch = function Minimatch (pattern, options) { - return new orig.Minimatch(pattern, ext(def, options)) - }; - - return m -}; - -Minimatch.defaults = function (def) { - if (!def || !Object.keys(def).length) return Minimatch - return minimatch.defaults(def).Minimatch -}; - -function minimatch (p, pattern, options) { - if (typeof pattern !== 'string') { - throw new TypeError('glob pattern string required') - } - - if (!options) options = {}; - - // shortcut: comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - return false - } - - // "" only matches "" - if (pattern.trim() === '') return p === '' - - return new Minimatch(pattern, options).match(p) -} - -function Minimatch (pattern, options) { - if (!(this instanceof Minimatch)) { - return new Minimatch(pattern, options) - } - - if (typeof pattern !== 'string') { - throw new TypeError('glob pattern string required') - } - - if (!options) options = {}; - pattern = pattern.trim(); - - // windows support: need to use /, not \ - if (path.sep !== '/') { - pattern = pattern.split(path.sep).join('/'); - } - - this.options = options; - this.set = []; - this.pattern = pattern; - this.regexp = null; - this.negate = false; - this.comment = false; - this.empty = false; - - // make the set of regexps etc. - this.make(); -} - -Minimatch.prototype.debug = function () {}; - -Minimatch.prototype.make = make; -function make () { - // don't do it more than once. - if (this._made) return - - var pattern = this.pattern; - var options = this.options; - - // empty patterns and comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - this.comment = true; - return - } - if (!pattern) { - this.empty = true; - return - } - - // step 1: figure out negation, etc. - this.parseNegate(); - - // step 2: expand braces - var set = this.globSet = this.braceExpand(); - - if (options.debug) this.debug = console.error; - - this.debug(this.pattern, set); - - // step 3: now we have a set, so turn each one into a series of path-portion - // matching patterns. - // These will be regexps, except in the case of "**", which is - // set to the GLOBSTAR object for globstar behavior, - // and will not contain any / characters - set = this.globParts = set.map(function (s) { - return s.split(slashSplit) - }); - - this.debug(this.pattern, set); - - // glob --> regexps - set = set.map(function (s, si, set) { - return s.map(this.parse, this) - }, this); - - this.debug(this.pattern, set); - - // filter out everything that didn't compile properly. - set = set.filter(function (s) { - return s.indexOf(false) === -1 - }); - - this.debug(this.pattern, set); - - this.set = set; -} - -Minimatch.prototype.parseNegate = parseNegate; -function parseNegate () { - var pattern = this.pattern; - var negate = false; - var options = this.options; - var negateOffset = 0; - - if (options.nonegate) return - - for (var i = 0, l = pattern.length - ; i < l && pattern.charAt(i) === '!' - ; i++) { - negate = !negate; - negateOffset++; - } - - if (negateOffset) this.pattern = pattern.substr(negateOffset); - this.negate = negate; -} - -// Brace expansion: -// a{b,c}d -> abd acd -// a{b,}c -> abc ac -// a{0..3}d -> a0d a1d a2d a3d -// a{b,c{d,e}f}g -> abg acdfg acefg -// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg -// -// Invalid sets are not expanded. -// a{2..}b -> a{2..}b -// a{b}c -> a{b}c -minimatch.braceExpand = function (pattern, options) { - return braceExpand(pattern, options) -}; - -Minimatch.prototype.braceExpand = braceExpand; - -function braceExpand (pattern, options) { - if (!options) { - if (this instanceof Minimatch) { - options = this.options; - } else { - options = {}; - } - } - - pattern = typeof pattern === 'undefined' - ? this.pattern : pattern; - - if (typeof pattern === 'undefined') { - throw new TypeError('undefined pattern') - } - - if (options.nobrace || - !pattern.match(/\{.*\}/)) { - // shortcut. no need to expand. - return [pattern] - } - - return braceExpansion(pattern) -} - -// parse a component of the expanded set. -// At this point, no pattern may contain "/" in it -// so we're going to return a 2d array, where each entry is the full -// pattern, split on '/', and then turned into a regular expression. -// A regexp is made at the end which joins each array with an -// escaped /, and another full one which joins each regexp with |. -// -// Following the lead of Bash 4.1, note that "**" only has special meaning -// when it is the *only* thing in a path portion. Otherwise, any series -// of * is equivalent to a single *. Globstar behavior is enabled by -// default, and can be disabled by setting options.noglobstar. -Minimatch.prototype.parse = parse; -var SUBPARSE = {}; -function parse (pattern, isSub) { - if (pattern.length > 1024 * 64) { - throw new TypeError('pattern is too long') - } - - var options = this.options; - - // shortcuts - if (!options.noglobstar && pattern === '**') return GLOBSTAR - if (pattern === '') return '' - - var re = ''; - var hasMagic = !!options.nocase; - var escaping = false; - // ? => one single character - var patternListStack = []; - var negativeLists = []; - var stateChar; - var inClass = false; - var reClassStart = -1; - var classStart = -1; - // . and .. never match anything that doesn't start with ., - // even when options.dot is set. - var patternStart = pattern.charAt(0) === '.' ? '' // anything - // not (start or / followed by . or .. followed by / or end) - : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' - : '(?!\\.)'; - var self = this; - - function clearStateChar () { - if (stateChar) { - // we had some state-tracking character - // that wasn't consumed by this pass. - switch (stateChar) { - case '*': - re += star; - hasMagic = true; - break - case '?': - re += qmark; - hasMagic = true; - break - default: - re += '\\' + stateChar; - break - } - self.debug('clearStateChar %j %j', stateChar, re); - stateChar = false; - } - } - - for (var i = 0, len = pattern.length, c - ; (i < len) && (c = pattern.charAt(i)) - ; i++) { - this.debug('%s\t%s %s %j', pattern, i, re, c); - - // skip over any that are escaped. - if (escaping && reSpecials[c]) { - re += '\\' + c; - escaping = false; - continue - } - - switch (c) { - case '/': - // completely not allowed, even escaped. - // Should already be path-split by now. - return false - - case '\\': - clearStateChar(); - escaping = true; - continue - - // the various stateChar values - // for the "extglob" stuff. - case '?': - case '*': - case '+': - case '@': - case '!': - this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c); - - // all of those are literals inside a class, except that - // the glob [!a] means [^a] in regexp - if (inClass) { - this.debug(' in class'); - if (c === '!' && i === classStart + 1) c = '^'; - re += c; - continue - } - - // if we already have a stateChar, then it means - // that there was something like ** or +? in there. - // Handle the stateChar, then proceed with this one. - self.debug('call clearStateChar %j', stateChar); - clearStateChar(); - stateChar = c; - // if extglob is disabled, then +(asdf|foo) isn't a thing. - // just clear the statechar *now*, rather than even diving into - // the patternList stuff. - if (options.noext) clearStateChar(); - continue - - case '(': - if (inClass) { - re += '('; - continue - } - - if (!stateChar) { - re += '\\('; - continue - } - - patternListStack.push({ - type: stateChar, - start: i - 1, - reStart: re.length, - open: plTypes[stateChar].open, - close: plTypes[stateChar].close - }); - // negation is (?:(?!js)[^/]*) - re += stateChar === '!' ? '(?:(?!(?:' : '(?:'; - this.debug('plType %j %j', stateChar, re); - stateChar = false; - continue - - case ')': - if (inClass || !patternListStack.length) { - re += '\\)'; - continue - } - - clearStateChar(); - hasMagic = true; - var pl = patternListStack.pop(); - // negation is (?:(?!js)[^/]*) - // The others are (?:) - re += pl.close; - if (pl.type === '!') { - negativeLists.push(pl); - } - pl.reEnd = re.length; - continue - - case '|': - if (inClass || !patternListStack.length || escaping) { - re += '\\|'; - escaping = false; - continue - } - - clearStateChar(); - re += '|'; - continue - - // these are mostly the same in regexp and glob - case '[': - // swallow any state-tracking char before the [ - clearStateChar(); - - if (inClass) { - re += '\\' + c; - continue - } - - inClass = true; - classStart = i; - reClassStart = re.length; - re += c; - continue - - case ']': - // a right bracket shall lose its special - // meaning and represent itself in - // a bracket expression if it occurs - // first in the list. -- POSIX.2 2.8.3.2 - if (i === classStart + 1 || !inClass) { - re += '\\' + c; - escaping = false; - continue - } - - // handle the case where we left a class open. - // "[z-a]" is valid, equivalent to "\[z-a\]" - if (inClass) { - // split where the last [ was, make sure we don't have - // an invalid re. if so, re-walk the contents of the - // would-be class to re-translate any characters that - // were passed through as-is - // TODO: It would probably be faster to determine this - // without a try/catch and a new RegExp, but it's tricky - // to do safely. For now, this is safe and works. - var cs = pattern.substring(classStart + 1, i); - try { - RegExp('[' + cs + ']'); - } catch (er) { - // not a valid class! - var sp = this.parse(cs, SUBPARSE); - re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'; - hasMagic = hasMagic || sp[1]; - inClass = false; - continue - } - } - - // finish up the class. - hasMagic = true; - inClass = false; - re += c; - continue - - default: - // swallow any state char that wasn't consumed - clearStateChar(); - - if (escaping) { - // no need - escaping = false; - } else if (reSpecials[c] - && !(c === '^' && inClass)) { - re += '\\'; - } - - re += c; - - } // switch - } // for - - // handle the case where we left a class open. - // "[abc" is valid, equivalent to "\[abc" - if (inClass) { - // split where the last [ was, and escape it - // this is a huge pita. We now have to re-walk - // the contents of the would-be class to re-translate - // any characters that were passed through as-is - cs = pattern.substr(classStart + 1); - sp = this.parse(cs, SUBPARSE); - re = re.substr(0, reClassStart) + '\\[' + sp[0]; - hasMagic = hasMagic || sp[1]; - } - - // handle the case where we had a +( thing at the *end* - // of the pattern. - // each pattern list stack adds 3 chars, and we need to go through - // and escape any | chars that were passed through as-is for the regexp. - // Go through and escape them, taking care not to double-escape any - // | chars that were already escaped. - for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { - var tail = re.slice(pl.reStart + pl.open.length); - this.debug('setting tail', re, pl); - // maybe some even number of \, then maybe 1 \, followed by a | - tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) { - if (!$2) { - // the | isn't already escaped, so escape it. - $2 = '\\'; - } - - // need to escape all those slashes *again*, without escaping the - // one that we need for escaping the | character. As it works out, - // escaping an even number of slashes can be done by simply repeating - // it exactly after itself. That's why this trick works. - // - // I am sorry that you have to see this. - return $1 + $1 + $2 + '|' - }); - - this.debug('tail=%j\n %s', tail, tail, pl, re); - var t = pl.type === '*' ? star - : pl.type === '?' ? qmark - : '\\' + pl.type; - - hasMagic = true; - re = re.slice(0, pl.reStart) + t + '\\(' + tail; - } - - // handle trailing things that only matter at the very end. - clearStateChar(); - if (escaping) { - // trailing \\ - re += '\\\\'; - } - - // only need to apply the nodot start if the re starts with - // something that could conceivably capture a dot - var addPatternStart = false; - switch (re.charAt(0)) { - case '.': - case '[': - case '(': addPatternStart = true; - } - - // Hack to work around lack of negative lookbehind in JS - // A pattern like: *.!(x).!(y|z) needs to ensure that a name - // like 'a.xyz.yz' doesn't match. So, the first negative - // lookahead, has to look ALL the way ahead, to the end of - // the pattern. - for (var n = negativeLists.length - 1; n > -1; n--) { - var nl = negativeLists[n]; - - var nlBefore = re.slice(0, nl.reStart); - var nlFirst = re.slice(nl.reStart, nl.reEnd - 8); - var nlLast = re.slice(nl.reEnd - 8, nl.reEnd); - var nlAfter = re.slice(nl.reEnd); - - nlLast += nlAfter; - - // Handle nested stuff like *(*.js|!(*.json)), where open parens - // mean that we should *not* include the ) in the bit that is considered - // "after" the negated section. - var openParensBefore = nlBefore.split('(').length - 1; - var cleanAfter = nlAfter; - for (i = 0; i < openParensBefore; i++) { - cleanAfter = cleanAfter.replace(/\)[+*?]?/, ''); - } - nlAfter = cleanAfter; - - var dollar = ''; - if (nlAfter === '' && isSub !== SUBPARSE) { - dollar = '$'; - } - var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast; - re = newRe; - } - - // if the re is not "" at this point, then we need to make sure - // it doesn't match against an empty path part. - // Otherwise a/* will match a/, which it should not. - if (re !== '' && hasMagic) { - re = '(?=.)' + re; - } - - if (addPatternStart) { - re = patternStart + re; - } - - // parsing just a piece of a larger pattern. - if (isSub === SUBPARSE) { - return [re, hasMagic] - } - - // skip the regexp for non-magical patterns - // unescape anything in it, though, so that it'll be - // an exact match against a file etc. - if (!hasMagic) { - return globUnescape(pattern) - } - - var flags = options.nocase ? 'i' : ''; - try { - var regExp = new RegExp('^' + re + '$', flags); - } catch (er) { - // If it was an invalid regular expression, then it can't match - // anything. This trick looks for a character after the end of - // the string, which is of course impossible, except in multi-line - // mode, but it's not a /m regex. - return new RegExp('$.') - } - - regExp._glob = pattern; - regExp._src = re; - - return regExp -} - -minimatch.makeRe = function (pattern, options) { - return new Minimatch(pattern, options || {}).makeRe() -}; - -Minimatch.prototype.makeRe = makeRe; -function makeRe () { - if (this.regexp || this.regexp === false) return this.regexp - - // at this point, this.set is a 2d array of partial - // pattern strings, or "**". - // - // It's better to use .match(). This function shouldn't - // be used, really, but it's pretty convenient sometimes, - // when you just want to work with a regex. - var set = this.set; - - if (!set.length) { - this.regexp = false; - return this.regexp - } - var options = this.options; - - var twoStar = options.noglobstar ? star - : options.dot ? twoStarDot - : twoStarNoDot; - var flags = options.nocase ? 'i' : ''; - - var re = set.map(function (pattern) { - return pattern.map(function (p) { - return (p === GLOBSTAR) ? twoStar - : (typeof p === 'string') ? regExpEscape(p) - : p._src - }).join('\\\/') - }).join('|'); - - // must match entire pattern - // ending in a * or ** will make it less strict. - re = '^(?:' + re + ')$'; - - // can match anything, as long as it's not this. - if (this.negate) re = '^(?!' + re + ').*$'; - - try { - this.regexp = new RegExp(re, flags); - } catch (ex) { - this.regexp = false; - } - return this.regexp -} - -minimatch.match = function (list, pattern, options) { - options = options || {}; - var mm = new Minimatch(pattern, options); - list = list.filter(function (f) { - return mm.match(f) - }); - if (mm.options.nonull && !list.length) { - list.push(pattern); - } - return list -}; - -Minimatch.prototype.match = match; -function match (f, partial) { - this.debug('match', f, this.pattern); - // short-circuit in the case of busted things. - // comments, etc. - if (this.comment) return false - if (this.empty) return f === '' - - if (f === '/' && partial) return true - - var options = this.options; - - // windows: need to use /, not \ - if (path.sep !== '/') { - f = f.split(path.sep).join('/'); - } - - // treat the test path as a set of pathparts. - f = f.split(slashSplit); - this.debug(this.pattern, 'split', f); - - // just ONE of the pattern sets in this.set needs to match - // in order for it to be valid. If negating, then just one - // match means that we have failed. - // Either way, return on the first hit. - - var set = this.set; - this.debug(this.pattern, 'set', set); - - // Find the basename of the path by looking for the last non-empty segment - var filename; - var i; - for (i = f.length - 1; i >= 0; i--) { - filename = f[i]; - if (filename) break - } - - for (i = 0; i < set.length; i++) { - var pattern = set[i]; - var file = f; - if (options.matchBase && pattern.length === 1) { - file = [filename]; - } - var hit = this.matchOne(file, pattern, partial); - if (hit) { - if (options.flipNegate) return true - return !this.negate - } - } - - // didn't get any hits. this is success if it's a negative - // pattern, failure otherwise. - if (options.flipNegate) return false - return this.negate -} - -// set partial to true to test if, for example, -// "/a/b" matches the start of "/*/b/*/d" -// Partial means, if you run out of file before you run -// out of pattern, then that's fine, as long as all -// the parts match. -Minimatch.prototype.matchOne = function (file, pattern, partial) { - var options = this.options; - - this.debug('matchOne', - { 'this': this, file: file, pattern: pattern }); - - this.debug('matchOne', file.length, pattern.length); - - for (var fi = 0, - pi = 0, - fl = file.length, - pl = pattern.length - ; (fi < fl) && (pi < pl) - ; fi++, pi++) { - this.debug('matchOne loop'); - var p = pattern[pi]; - var f = file[fi]; - - this.debug(pattern, p, f); - - // should be impossible. - // some invalid regexp stuff in the set. - if (p === false) return false - - if (p === GLOBSTAR) { - this.debug('GLOBSTAR', [pattern, p, f]); - - // "**" - // a/**/b/**/c would match the following: - // a/b/x/y/z/c - // a/x/y/z/b/c - // a/b/x/b/x/c - // a/b/c - // To do this, take the rest of the pattern after - // the **, and see if it would match the file remainder. - // If so, return success. - // If not, the ** "swallows" a segment, and try again. - // This is recursively awful. - // - // a/**/b/**/c matching a/b/x/y/z/c - // - a matches a - // - doublestar - // - matchOne(b/x/y/z/c, b/**/c) - // - b matches b - // - doublestar - // - matchOne(x/y/z/c, c) -> no - // - matchOne(y/z/c, c) -> no - // - matchOne(z/c, c) -> no - // - matchOne(c, c) yes, hit - var fr = fi; - var pr = pi + 1; - if (pr === pl) { - this.debug('** at the end'); - // a ** at the end will just swallow the rest. - // We have found a match. - // however, it will not swallow /.x, unless - // options.dot is set. - // . and .. are *never* matched by **, for explosively - // exponential reasons. - for (; fi < fl; fi++) { - if (file[fi] === '.' || file[fi] === '..' || - (!options.dot && file[fi].charAt(0) === '.')) return false - } - return true - } - - // ok, let's see if we can swallow whatever we can. - while (fr < fl) { - var swallowee = file[fr]; - - this.debug('\nglobstar while', file, fr, pattern, pr, swallowee); - - // XXX remove this slice. Just pass the start index. - if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { - this.debug('globstar found match!', fr, fl, swallowee); - // found a match. - return true - } else { - // can't swallow "." or ".." ever. - // can only swallow ".foo" when explicitly asked. - if (swallowee === '.' || swallowee === '..' || - (!options.dot && swallowee.charAt(0) === '.')) { - this.debug('dot detected!', file, fr, pattern, pr); - break - } - - // ** swallows a segment, and continue. - this.debug('globstar swallow a segment, and continue'); - fr++; - } - } - - // no match was found. - // However, in partial mode, we can't say this is necessarily over. - // If there's more *pattern* left, then - if (partial) { - // ran out of file - this.debug('\n>>> no match, partial?', file, fr, pattern, pr); - if (fr === fl) return true - } - return false - } - - // something other than ** - // non-magic patterns just have to match exactly - // patterns with magic have been turned into regexps. - var hit; - if (typeof p === 'string') { - if (options.nocase) { - hit = f.toLowerCase() === p.toLowerCase(); - } else { - hit = f === p; - } - this.debug('string match', p, f, hit); - } else { - hit = f.match(p); - this.debug('pattern match', p, f, hit); - } - - if (!hit) return false - } - - // Note: ending in / means that we'll get a final "" - // at the end of the pattern. This can only match a - // corresponding "" at the end of the file. - // If the file ends in /, then it can only match a - // a pattern that ends in /, unless the pattern just - // doesn't have any more for it. But, a/b/ should *not* - // match "a/b/*", even though "" matches against the - // [^/]*? pattern, except in partial mode, where it might - // simply not be reached yet. - // However, a/b/ should still satisfy a/* - - // now either we fell off the end of the pattern, or we're done. - if (fi === fl && pi === pl) { - // ran out of pattern and filename at the same time. - // an exact hit! - return true - } else if (fi === fl) { - // ran out of file, but still had pattern left. - // this is ok if we're doing the match as part of - // a glob fs traversal. - return partial - } else if (pi === pl) { - // ran out of pattern, still have file left. - // this is only acceptable if we're on the very last - // empty segment of a file with a trailing slash. - // a/* should match a/b/ - var emptyFileEnd = (fi === fl - 1) && (file[fi] === ''); - return emptyFileEnd - } - - // should be unreachable. - throw new Error('wtf?') -}; - -// replace stuff like \* with * -function globUnescape (s) { - return s.replace(/\\(.)/g, '$1') -} - -function regExpEscape (s) { - return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') -} - -function createCommonjsModule(fn, module) { - return module = { exports: {} }, fn(module, module.exports), module.exports; -} - -var inherits_browser = createCommonjsModule(function (module) { -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - if (superCtor) { - ctor.super_ = superCtor; - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - } - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - if (superCtor) { - ctor.super_ = superCtor; - var TempCtor = function () {}; - TempCtor.prototype = superCtor.prototype; - ctor.prototype = new TempCtor(); - ctor.prototype.constructor = ctor; - } - }; -} -}); - -var inherits = createCommonjsModule(function (module) { -try { - var util = util__default['default']; - /* istanbul ignore next */ - if (typeof util.inherits !== 'function') throw ''; - module.exports = util.inherits; -} catch (e) { - /* istanbul ignore next */ - module.exports = inherits_browser; -} -}); - -function posix(path) { - return path.charAt(0) === '/'; -} - -function win32(path) { - // https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56 - var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; - var result = splitDeviceRe.exec(path); - var device = result[1] || ''; - var isUnc = Boolean(device && device.charAt(1) !== ':'); - - // UNC paths are always absolute - return Boolean(result[2] || isUnc); -} - -var pathIsAbsolute = process.platform === 'win32' ? win32 : posix; -var posix_1 = posix; -var win32_1 = win32; -pathIsAbsolute.posix = posix_1; -pathIsAbsolute.win32 = win32_1; - -var alphasort_1 = alphasort; -var alphasorti_1 = alphasorti; -var setopts_1 = setopts; -var ownProp_1 = ownProp; -var makeAbs_1 = makeAbs; -var finish_1 = finish; -var mark_1 = mark; -var isIgnored_1 = isIgnored; -var childrenIgnored_1 = childrenIgnored; - -function ownProp (obj, field) { - return Object.prototype.hasOwnProperty.call(obj, field) -} - - - - -var Minimatch$1 = minimatch_1.Minimatch; - -function alphasorti (a, b) { - return a.toLowerCase().localeCompare(b.toLowerCase()) -} - -function alphasort (a, b) { - return a.localeCompare(b) -} - -function setupIgnores (self, options) { - self.ignore = options.ignore || []; - - if (!Array.isArray(self.ignore)) - self.ignore = [self.ignore]; - - if (self.ignore.length) { - self.ignore = self.ignore.map(ignoreMap); - } -} - -// ignore patterns are always in dot:true mode. -function ignoreMap (pattern) { - var gmatcher = null; - if (pattern.slice(-3) === '/**') { - var gpattern = pattern.replace(/(\/\*\*)+$/, ''); - gmatcher = new Minimatch$1(gpattern, { dot: true }); - } - - return { - matcher: new Minimatch$1(pattern, { dot: true }), - gmatcher: gmatcher - } -} - -function setopts (self, pattern, options) { - if (!options) - options = {}; - - // base-matching: just use globstar for that. - if (options.matchBase && -1 === pattern.indexOf("/")) { - if (options.noglobstar) { - throw new Error("base matching requires globstar") - } - pattern = "**/" + pattern; - } - - self.silent = !!options.silent; - self.pattern = pattern; - self.strict = options.strict !== false; - self.realpath = !!options.realpath; - self.realpathCache = options.realpathCache || Object.create(null); - self.follow = !!options.follow; - self.dot = !!options.dot; - self.mark = !!options.mark; - self.nodir = !!options.nodir; - if (self.nodir) - self.mark = true; - self.sync = !!options.sync; - self.nounique = !!options.nounique; - self.nonull = !!options.nonull; - self.nosort = !!options.nosort; - self.nocase = !!options.nocase; - self.stat = !!options.stat; - self.noprocess = !!options.noprocess; - self.absolute = !!options.absolute; - - self.maxLength = options.maxLength || Infinity; - self.cache = options.cache || Object.create(null); - self.statCache = options.statCache || Object.create(null); - self.symlinks = options.symlinks || Object.create(null); - - setupIgnores(self, options); - - self.changedCwd = false; - var cwd = process.cwd(); - if (!ownProp(options, "cwd")) - self.cwd = cwd; - else { - self.cwd = path__default['default'].resolve(options.cwd); - self.changedCwd = self.cwd !== cwd; - } - - self.root = options.root || path__default['default'].resolve(self.cwd, "/"); - self.root = path__default['default'].resolve(self.root); - if (process.platform === "win32") - self.root = self.root.replace(/\\/g, "/"); - - // TODO: is an absolute `cwd` supposed to be resolved against `root`? - // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test') - self.cwdAbs = pathIsAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd); - if (process.platform === "win32") - self.cwdAbs = self.cwdAbs.replace(/\\/g, "/"); - self.nomount = !!options.nomount; - - // disable comments and negation in Minimatch. - // Note that they are not supported in Glob itself anyway. - options.nonegate = true; - options.nocomment = true; - - self.minimatch = new Minimatch$1(pattern, options); - self.options = self.minimatch.options; -} - -function finish (self) { - var nou = self.nounique; - var all = nou ? [] : Object.create(null); - - for (var i = 0, l = self.matches.length; i < l; i ++) { - var matches = self.matches[i]; - if (!matches || Object.keys(matches).length === 0) { - if (self.nonull) { - // do like the shell, and spit out the literal glob - var literal = self.minimatch.globSet[i]; - if (nou) - all.push(literal); - else - all[literal] = true; - } - } else { - // had matches - var m = Object.keys(matches); - if (nou) - all.push.apply(all, m); - else - m.forEach(function (m) { - all[m] = true; - }); - } - } - - if (!nou) - all = Object.keys(all); - - if (!self.nosort) - all = all.sort(self.nocase ? alphasorti : alphasort); - - // at *some* point we statted all of these - if (self.mark) { - for (var i = 0; i < all.length; i++) { - all[i] = self._mark(all[i]); - } - if (self.nodir) { - all = all.filter(function (e) { - var notDir = !(/\/$/.test(e)); - var c = self.cache[e] || self.cache[makeAbs(self, e)]; - if (notDir && c) - notDir = c !== 'DIR' && !Array.isArray(c); - return notDir - }); - } - } - - if (self.ignore.length) - all = all.filter(function(m) { - return !isIgnored(self, m) - }); - - self.found = all; -} - -function mark (self, p) { - var abs = makeAbs(self, p); - var c = self.cache[abs]; - var m = p; - if (c) { - var isDir = c === 'DIR' || Array.isArray(c); - var slash = p.slice(-1) === '/'; - - if (isDir && !slash) - m += '/'; - else if (!isDir && slash) - m = m.slice(0, -1); - - if (m !== p) { - var mabs = makeAbs(self, m); - self.statCache[mabs] = self.statCache[abs]; - self.cache[mabs] = self.cache[abs]; - } - } - - return m -} - -// lotta situps... -function makeAbs (self, f) { - var abs = f; - if (f.charAt(0) === '/') { - abs = path__default['default'].join(self.root, f); - } else if (pathIsAbsolute(f) || f === '') { - abs = f; - } else if (self.changedCwd) { - abs = path__default['default'].resolve(self.cwd, f); - } else { - abs = path__default['default'].resolve(f); - } - - if (process.platform === 'win32') - abs = abs.replace(/\\/g, '/'); - - return abs -} - - -// Return true, if pattern ends with globstar '**', for the accompanying parent directory. -// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents -function isIgnored (self, path) { - if (!self.ignore.length) - return false - - return self.ignore.some(function(item) { - return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) - }) -} - -function childrenIgnored (self, path) { - if (!self.ignore.length) - return false - - return self.ignore.some(function(item) { - return !!(item.gmatcher && item.gmatcher.match(path)) - }) -} - -var common = { - alphasort: alphasort_1, - alphasorti: alphasorti_1, - setopts: setopts_1, - ownProp: ownProp_1, - makeAbs: makeAbs_1, - finish: finish_1, - mark: mark_1, - isIgnored: isIgnored_1, - childrenIgnored: childrenIgnored_1 -}; - -var sync = globSync; -globSync.GlobSync = GlobSync; -var setopts$1 = common.setopts; -var ownProp$1 = common.ownProp; -var childrenIgnored$1 = common.childrenIgnored; -var isIgnored$1 = common.isIgnored; - -function globSync (pattern, options) { - if (typeof options === 'function' || arguments.length === 3) - throw new TypeError('callback provided to sync glob\n'+ - 'See: https://github.com/isaacs/node-glob/issues/167') - - return new GlobSync(pattern, options).found -} - -function GlobSync (pattern, options) { - if (!pattern) - throw new Error('must provide pattern') - - if (typeof options === 'function' || arguments.length === 3) - throw new TypeError('callback provided to sync glob\n'+ - 'See: https://github.com/isaacs/node-glob/issues/167') - - if (!(this instanceof GlobSync)) - return new GlobSync(pattern, options) - - setopts$1(this, pattern, options); - - if (this.noprocess) - return this - - var n = this.minimatch.set.length; - this.matches = new Array(n); - for (var i = 0; i < n; i ++) { - this._process(this.minimatch.set[i], i, false); - } - this._finish(); -} - -GlobSync.prototype._finish = function () { - assert__default['default'](this instanceof GlobSync); - if (this.realpath) { - var self = this; - this.matches.forEach(function (matchset, index) { - var set = self.matches[index] = Object.create(null); - for (var p in matchset) { - try { - p = self._makeAbs(p); - var real = fs_realpath.realpathSync(p, self.realpathCache); - set[real] = true; - } catch (er) { - if (er.syscall === 'stat') - set[self._makeAbs(p)] = true; - else - throw er - } - } - }); - } - common.finish(this); -}; - - -GlobSync.prototype._process = function (pattern, index, inGlobStar) { - assert__default['default'](this instanceof GlobSync); - - // Get the first [n] parts of pattern that are all strings. - var n = 0; - while (typeof pattern[n] === 'string') { - n ++; - } - // now n is the index of the first one that is *not* a string. - - // See if there's anything else - var prefix; - switch (n) { - // if not, then this is rather simple - case pattern.length: - this._processSimple(pattern.join('/'), index); - return - - case 0: - // pattern *starts* with some non-trivial item. - // going to readdir(cwd), but not include the prefix in matches. - prefix = null; - break - - default: - // pattern has some string bits in the front. - // whatever it starts with, whether that's 'absolute' like /foo/bar, - // or 'relative' like '../baz' - prefix = pattern.slice(0, n).join('/'); - break - } - - var remain = pattern.slice(n); - - // get the list of entries. - var read; - if (prefix === null) - read = '.'; - else if (pathIsAbsolute(prefix) || pathIsAbsolute(pattern.join('/'))) { - if (!prefix || !pathIsAbsolute(prefix)) - prefix = '/' + prefix; - read = prefix; - } else - read = prefix; - - var abs = this._makeAbs(read); - - //if ignored, skip processing - if (childrenIgnored$1(this, read)) - return - - var isGlobStar = remain[0] === minimatch_1.GLOBSTAR; - if (isGlobStar) - this._processGlobStar(prefix, read, abs, remain, index, inGlobStar); - else - this._processReaddir(prefix, read, abs, remain, index, inGlobStar); -}; - - -GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { - var entries = this._readdir(abs, inGlobStar); - - // if the abs isn't a dir, then nothing can match! - if (!entries) - return - - // It will only match dot entries if it starts with a dot, or if - // dot is set. Stuff like @(.foo|.bar) isn't allowed. - var pn = remain[0]; - var negate = !!this.minimatch.negate; - var rawGlob = pn._glob; - var dotOk = this.dot || rawGlob.charAt(0) === '.'; - - var matchedEntries = []; - for (var i = 0; i < entries.length; i++) { - var e = entries[i]; - if (e.charAt(0) !== '.' || dotOk) { - var m; - if (negate && !prefix) { - m = !e.match(pn); - } else { - m = e.match(pn); - } - if (m) - matchedEntries.push(e); - } - } - - var len = matchedEntries.length; - // If there are no matched entries, then nothing matches. - if (len === 0) - return - - // if this is the last remaining pattern bit, then no need for - // an additional stat *unless* the user has specified mark or - // stat explicitly. We know they exist, since readdir returned - // them. - - if (remain.length === 1 && !this.mark && !this.stat) { - if (!this.matches[index]) - this.matches[index] = Object.create(null); - - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i]; - if (prefix) { - if (prefix.slice(-1) !== '/') - e = prefix + '/' + e; - else - e = prefix + e; - } - - if (e.charAt(0) === '/' && !this.nomount) { - e = path__default['default'].join(this.root, e); - } - this._emitMatch(index, e); - } - // This was the last one, and no stats were needed - return - } - - // now test all matched entries as stand-ins for that part - // of the pattern. - remain.shift(); - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i]; - var newPattern; - if (prefix) - newPattern = [prefix, e]; - else - newPattern = [e]; - this._process(newPattern.concat(remain), index, inGlobStar); - } -}; - - -GlobSync.prototype._emitMatch = function (index, e) { - if (isIgnored$1(this, e)) - return - - var abs = this._makeAbs(e); - - if (this.mark) - e = this._mark(e); - - if (this.absolute) { - e = abs; - } - - if (this.matches[index][e]) - return - - if (this.nodir) { - var c = this.cache[abs]; - if (c === 'DIR' || Array.isArray(c)) - return - } - - this.matches[index][e] = true; - - if (this.stat) - this._stat(e); -}; - - -GlobSync.prototype._readdirInGlobStar = function (abs) { - // follow all symlinked directories forever - // just proceed as if this is a non-globstar situation - if (this.follow) - return this._readdir(abs, false) - - var entries; - var lstat; - try { - lstat = fs__default['default'].lstatSync(abs); - } catch (er) { - if (er.code === 'ENOENT') { - // lstat failed, doesn't exist - return null - } - } - - var isSym = lstat && lstat.isSymbolicLink(); - this.symlinks[abs] = isSym; - - // If it's not a symlink or a dir, then it's definitely a regular file. - // don't bother doing a readdir in that case. - if (!isSym && lstat && !lstat.isDirectory()) - this.cache[abs] = 'FILE'; - else - entries = this._readdir(abs, false); - - return entries -}; - -GlobSync.prototype._readdir = function (abs, inGlobStar) { - - if (inGlobStar && !ownProp$1(this.symlinks, abs)) - return this._readdirInGlobStar(abs) - - if (ownProp$1(this.cache, abs)) { - var c = this.cache[abs]; - if (!c || c === 'FILE') - return null - - if (Array.isArray(c)) - return c - } - - try { - return this._readdirEntries(abs, fs__default['default'].readdirSync(abs)) - } catch (er) { - this._readdirError(abs, er); - return null - } -}; - -GlobSync.prototype._readdirEntries = function (abs, entries) { - // if we haven't asked to stat everything, then just - // assume that everything in there exists, so we can avoid - // having to stat it a second time. - if (!this.mark && !this.stat) { - for (var i = 0; i < entries.length; i ++) { - var e = entries[i]; - if (abs === '/') - e = abs + e; - else - e = abs + '/' + e; - this.cache[e] = true; - } - } - - this.cache[abs] = entries; - - // mark and cache dir-ness - return entries -}; - -GlobSync.prototype._readdirError = function (f, er) { - // handle errors, and cache the information - switch (er.code) { - case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 - case 'ENOTDIR': // totally normal. means it *does* exist. - var abs = this._makeAbs(f); - this.cache[abs] = 'FILE'; - if (abs === this.cwdAbs) { - var error = new Error(er.code + ' invalid cwd ' + this.cwd); - error.path = this.cwd; - error.code = er.code; - throw error - } - break - - case 'ENOENT': // not terribly unusual - case 'ELOOP': - case 'ENAMETOOLONG': - case 'UNKNOWN': - this.cache[this._makeAbs(f)] = false; - break - - default: // some unusual error. Treat as failure. - this.cache[this._makeAbs(f)] = false; - if (this.strict) - throw er - if (!this.silent) - console.error('glob error', er); - break - } -}; - -GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { - - var entries = this._readdir(abs, inGlobStar); - - // no entries means not a dir, so it can never have matches - // foo.txt/** doesn't match foo.txt - if (!entries) - return - - // test without the globstar, and with every child both below - // and replacing the globstar. - var remainWithoutGlobStar = remain.slice(1); - var gspref = prefix ? [ prefix ] : []; - var noGlobStar = gspref.concat(remainWithoutGlobStar); - - // the noGlobStar pattern exits the inGlobStar state - this._process(noGlobStar, index, false); - - var len = entries.length; - var isSym = this.symlinks[abs]; - - // If it's a symlink, and we're in a globstar, then stop - if (isSym && inGlobStar) - return - - for (var i = 0; i < len; i++) { - var e = entries[i]; - if (e.charAt(0) === '.' && !this.dot) - continue - - // these two cases enter the inGlobStar state - var instead = gspref.concat(entries[i], remainWithoutGlobStar); - this._process(instead, index, true); - - var below = gspref.concat(entries[i], remain); - this._process(below, index, true); - } -}; - -GlobSync.prototype._processSimple = function (prefix, index) { - // XXX review this. Shouldn't it be doing the mounting etc - // before doing stat? kinda weird? - var exists = this._stat(prefix); - - if (!this.matches[index]) - this.matches[index] = Object.create(null); - - // If it doesn't exist, then just mark the lack of results - if (!exists) - return - - if (prefix && pathIsAbsolute(prefix) && !this.nomount) { - var trail = /[\/\\]$/.test(prefix); - if (prefix.charAt(0) === '/') { - prefix = path__default['default'].join(this.root, prefix); - } else { - prefix = path__default['default'].resolve(this.root, prefix); - if (trail) - prefix += '/'; - } - } - - if (process.platform === 'win32') - prefix = prefix.replace(/\\/g, '/'); - - // Mark this as a match - this._emitMatch(index, prefix); -}; - -// Returns either 'DIR', 'FILE', or false -GlobSync.prototype._stat = function (f) { - var abs = this._makeAbs(f); - var needDir = f.slice(-1) === '/'; - - if (f.length > this.maxLength) - return false - - if (!this.stat && ownProp$1(this.cache, abs)) { - var c = this.cache[abs]; - - if (Array.isArray(c)) - c = 'DIR'; - - // It exists, but maybe not how we need it - if (!needDir || c === 'DIR') - return c - - if (needDir && c === 'FILE') - return false - - // otherwise we have to stat, because maybe c=true - // if we know it exists, but not what it is. - } - var stat = this.statCache[abs]; - if (!stat) { - var lstat; - try { - lstat = fs__default['default'].lstatSync(abs); - } catch (er) { - if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { - this.statCache[abs] = false; - return false - } - } - - if (lstat && lstat.isSymbolicLink()) { - try { - stat = fs__default['default'].statSync(abs); - } catch (er) { - stat = lstat; - } - } else { - stat = lstat; - } - } - - this.statCache[abs] = stat; - - var c = true; - if (stat) - c = stat.isDirectory() ? 'DIR' : 'FILE'; - - this.cache[abs] = this.cache[abs] || c; - - if (needDir && c === 'FILE') - return false - - return c -}; - -GlobSync.prototype._mark = function (p) { - return common.mark(this, p) -}; - -GlobSync.prototype._makeAbs = function (f) { - return common.makeAbs(this, f) -}; - -// Returns a wrapper function that returns a wrapped callback -// The wrapper function should do some stuff, and return a -// presumably different callback function. -// This makes sure that own properties are retained, so that -// decorations and such are not lost along the way. -var wrappy_1 = wrappy; -function wrappy (fn, cb) { - if (fn && cb) return wrappy(fn)(cb) - - if (typeof fn !== 'function') - throw new TypeError('need wrapper function') - - Object.keys(fn).forEach(function (k) { - wrapper[k] = fn[k]; - }); - - return wrapper - - function wrapper() { - var args = new Array(arguments.length); - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i]; - } - var ret = fn.apply(this, args); - var cb = args[args.length-1]; - if (typeof ret === 'function' && ret !== cb) { - Object.keys(cb).forEach(function (k) { - ret[k] = cb[k]; - }); - } - return ret - } -} - -var once_1 = wrappy_1(once); -var strict = wrappy_1(onceStrict); - -once.proto = once(function () { - Object.defineProperty(Function.prototype, 'once', { - value: function () { - return once(this) - }, - configurable: true - }); - - Object.defineProperty(Function.prototype, 'onceStrict', { - value: function () { - return onceStrict(this) - }, - configurable: true - }); -}); - -function once (fn) { - var f = function () { - if (f.called) return f.value - f.called = true; - return f.value = fn.apply(this, arguments) - }; - f.called = false; - return f -} - -function onceStrict (fn) { - var f = function () { - if (f.called) - throw new Error(f.onceError) - f.called = true; - return f.value = fn.apply(this, arguments) - }; - var name = fn.name || 'Function wrapped with `once`'; - f.onceError = name + " shouldn't be called more than once"; - f.called = false; - return f -} -once_1.strict = strict; - -var reqs = Object.create(null); - - -var inflight_1 = wrappy_1(inflight); - -function inflight (key, cb) { - if (reqs[key]) { - reqs[key].push(cb); - return null - } else { - reqs[key] = [cb]; - return makeres(key) - } -} - -function makeres (key) { - return once_1(function RES () { - var cbs = reqs[key]; - var len = cbs.length; - var args = slice(arguments); - - // XXX It's somewhat ambiguous whether a new callback added in this - // pass should be queued for later execution if something in the - // list of callbacks throws, or if it should just be discarded. - // However, it's such an edge case that it hardly matters, and either - // choice is likely as surprising as the other. - // As it happens, we do go ahead and schedule it for later execution. - try { - for (var i = 0; i < len; i++) { - cbs[i].apply(null, args); - } - } finally { - if (cbs.length > len) { - // added more in the interim. - // de-zalgo, just in case, but don't call again. - cbs.splice(0, len); - process.nextTick(function () { - RES.apply(null, args); - }); - } else { - delete reqs[key]; - } - } - }) -} - -function slice (args) { - var length = args.length; - var array = []; - - for (var i = 0; i < length; i++) array[i] = args[i]; - return array -} - -// Approach: -// -// 1. Get the minimatch set -// 2. For each pattern in the set, PROCESS(pattern, false) -// 3. Store matches per-set, then uniq them -// -// PROCESS(pattern, inGlobStar) -// Get the first [n] items from pattern that are all strings -// Join these together. This is PREFIX. -// If there is no more remaining, then stat(PREFIX) and -// add to matches if it succeeds. END. -// -// If inGlobStar and PREFIX is symlink and points to dir -// set ENTRIES = [] -// else readdir(PREFIX) as ENTRIES -// If fail, END -// -// with ENTRIES -// If pattern[n] is GLOBSTAR -// // handle the case where the globstar match is empty -// // by pruning it out, and testing the resulting pattern -// PROCESS(pattern[0..n] + pattern[n+1 .. $], false) -// // handle other cases. -// for ENTRY in ENTRIES (not dotfiles) -// // attach globstar + tail onto the entry -// // Mark that this entry is a globstar match -// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) -// -// else // not globstar -// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) -// Test ENTRY against pattern[n] -// If fails, continue -// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) -// -// Caveat: -// Cache all stats and readdirs results to minimize syscall. Since all -// we ever care about is existence and directory-ness, we can just keep -// `true` for files, and [children,...] for directories, or `false` for -// things that don't exist. - -var glob_1 = glob; - -var EE = events__default['default'].EventEmitter; -var setopts$2 = common.setopts; -var ownProp$2 = common.ownProp; - - -var childrenIgnored$2 = common.childrenIgnored; -var isIgnored$2 = common.isIgnored; - - - -function glob (pattern, options, cb) { - if (typeof options === 'function') cb = options, options = {}; - if (!options) options = {}; - - if (options.sync) { - if (cb) - throw new TypeError('callback provided to sync glob') - return sync(pattern, options) - } - - return new Glob(pattern, options, cb) -} - -glob.sync = sync; -var GlobSync$1 = glob.GlobSync = sync.GlobSync; - -// old api surface -glob.glob = glob; - -function extend (origin, add) { - if (add === null || typeof add !== 'object') { - return origin - } - - var keys = Object.keys(add); - var i = keys.length; - while (i--) { - origin[keys[i]] = add[keys[i]]; - } - return origin -} - -glob.hasMagic = function (pattern, options_) { - var options = extend({}, options_); - options.noprocess = true; - - var g = new Glob(pattern, options); - var set = g.minimatch.set; - - if (!pattern) - return false - - if (set.length > 1) - return true - - for (var j = 0; j < set[0].length; j++) { - if (typeof set[0][j] !== 'string') - return true - } - - return false -}; - -glob.Glob = Glob; -inherits(Glob, EE); -function Glob (pattern, options, cb) { - if (typeof options === 'function') { - cb = options; - options = null; - } - - if (options && options.sync) { - if (cb) - throw new TypeError('callback provided to sync glob') - return new GlobSync$1(pattern, options) - } - - if (!(this instanceof Glob)) - return new Glob(pattern, options, cb) - - setopts$2(this, pattern, options); - this._didRealPath = false; - - // process each pattern in the minimatch set - var n = this.minimatch.set.length; - - // The matches are stored as {: true,...} so that - // duplicates are automagically pruned. - // Later, we do an Object.keys() on these. - // Keep them as a list so we can fill in when nonull is set. - this.matches = new Array(n); - - if (typeof cb === 'function') { - cb = once_1(cb); - this.on('error', cb); - this.on('end', function (matches) { - cb(null, matches); - }); - } - - var self = this; - this._processing = 0; - - this._emitQueue = []; - this._processQueue = []; - this.paused = false; - - if (this.noprocess) - return this - - if (n === 0) - return done() - - var sync = true; - for (var i = 0; i < n; i ++) { - this._process(this.minimatch.set[i], i, false, done); - } - sync = false; - - function done () { - --self._processing; - if (self._processing <= 0) { - if (sync) { - process.nextTick(function () { - self._finish(); - }); - } else { - self._finish(); - } - } - } -} - -Glob.prototype._finish = function () { - assert__default['default'](this instanceof Glob); - if (this.aborted) - return - - if (this.realpath && !this._didRealpath) - return this._realpath() - - common.finish(this); - this.emit('end', this.found); -}; - -Glob.prototype._realpath = function () { - if (this._didRealpath) - return - - this._didRealpath = true; - - var n = this.matches.length; - if (n === 0) - return this._finish() - - var self = this; - for (var i = 0; i < this.matches.length; i++) - this._realpathSet(i, next); - - function next () { - if (--n === 0) - self._finish(); - } -}; - -Glob.prototype._realpathSet = function (index, cb) { - var matchset = this.matches[index]; - if (!matchset) - return cb() - - var found = Object.keys(matchset); - var self = this; - var n = found.length; - - if (n === 0) - return cb() - - var set = this.matches[index] = Object.create(null); - found.forEach(function (p, i) { - // If there's a problem with the stat, then it means that - // one or more of the links in the realpath couldn't be - // resolved. just return the abs value in that case. - p = self._makeAbs(p); - fs_realpath.realpath(p, self.realpathCache, function (er, real) { - if (!er) - set[real] = true; - else if (er.syscall === 'stat') - set[p] = true; - else - self.emit('error', er); // srsly wtf right here - - if (--n === 0) { - self.matches[index] = set; - cb(); - } - }); - }); -}; - -Glob.prototype._mark = function (p) { - return common.mark(this, p) -}; - -Glob.prototype._makeAbs = function (f) { - return common.makeAbs(this, f) -}; - -Glob.prototype.abort = function () { - this.aborted = true; - this.emit('abort'); -}; - -Glob.prototype.pause = function () { - if (!this.paused) { - this.paused = true; - this.emit('pause'); - } -}; - -Glob.prototype.resume = function () { - if (this.paused) { - this.emit('resume'); - this.paused = false; - if (this._emitQueue.length) { - var eq = this._emitQueue.slice(0); - this._emitQueue.length = 0; - for (var i = 0; i < eq.length; i ++) { - var e = eq[i]; - this._emitMatch(e[0], e[1]); - } - } - if (this._processQueue.length) { - var pq = this._processQueue.slice(0); - this._processQueue.length = 0; - for (var i = 0; i < pq.length; i ++) { - var p = pq[i]; - this._processing--; - this._process(p[0], p[1], p[2], p[3]); - } - } - } -}; - -Glob.prototype._process = function (pattern, index, inGlobStar, cb) { - assert__default['default'](this instanceof Glob); - assert__default['default'](typeof cb === 'function'); - - if (this.aborted) - return - - this._processing++; - if (this.paused) { - this._processQueue.push([pattern, index, inGlobStar, cb]); - return - } - - //console.error('PROCESS %d', this._processing, pattern) - - // Get the first [n] parts of pattern that are all strings. - var n = 0; - while (typeof pattern[n] === 'string') { - n ++; - } - // now n is the index of the first one that is *not* a string. - - // see if there's anything else - var prefix; - switch (n) { - // if not, then this is rather simple - case pattern.length: - this._processSimple(pattern.join('/'), index, cb); - return - - case 0: - // pattern *starts* with some non-trivial item. - // going to readdir(cwd), but not include the prefix in matches. - prefix = null; - break - - default: - // pattern has some string bits in the front. - // whatever it starts with, whether that's 'absolute' like /foo/bar, - // or 'relative' like '../baz' - prefix = pattern.slice(0, n).join('/'); - break - } - - var remain = pattern.slice(n); - - // get the list of entries. - var read; - if (prefix === null) - read = '.'; - else if (pathIsAbsolute(prefix) || pathIsAbsolute(pattern.join('/'))) { - if (!prefix || !pathIsAbsolute(prefix)) - prefix = '/' + prefix; - read = prefix; - } else - read = prefix; - - var abs = this._makeAbs(read); - - //if ignored, skip _processing - if (childrenIgnored$2(this, read)) - return cb() - - var isGlobStar = remain[0] === minimatch_1.GLOBSTAR; - if (isGlobStar) - this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb); - else - this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb); -}; - -Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { - var self = this; - this._readdir(abs, inGlobStar, function (er, entries) { - return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) - }); -}; - -Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { - - // if the abs isn't a dir, then nothing can match! - if (!entries) - return cb() - - // It will only match dot entries if it starts with a dot, or if - // dot is set. Stuff like @(.foo|.bar) isn't allowed. - var pn = remain[0]; - var negate = !!this.minimatch.negate; - var rawGlob = pn._glob; - var dotOk = this.dot || rawGlob.charAt(0) === '.'; - - var matchedEntries = []; - for (var i = 0; i < entries.length; i++) { - var e = entries[i]; - if (e.charAt(0) !== '.' || dotOk) { - var m; - if (negate && !prefix) { - m = !e.match(pn); - } else { - m = e.match(pn); - } - if (m) - matchedEntries.push(e); - } - } - - //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) - - var len = matchedEntries.length; - // If there are no matched entries, then nothing matches. - if (len === 0) - return cb() - - // if this is the last remaining pattern bit, then no need for - // an additional stat *unless* the user has specified mark or - // stat explicitly. We know they exist, since readdir returned - // them. - - if (remain.length === 1 && !this.mark && !this.stat) { - if (!this.matches[index]) - this.matches[index] = Object.create(null); - - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i]; - if (prefix) { - if (prefix !== '/') - e = prefix + '/' + e; - else - e = prefix + e; - } - - if (e.charAt(0) === '/' && !this.nomount) { - e = path__default['default'].join(this.root, e); - } - this._emitMatch(index, e); - } - // This was the last one, and no stats were needed - return cb() - } - - // now test all matched entries as stand-ins for that part - // of the pattern. - remain.shift(); - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i]; - if (prefix) { - if (prefix !== '/') - e = prefix + '/' + e; - else - e = prefix + e; - } - this._process([e].concat(remain), index, inGlobStar, cb); - } - cb(); -}; - -Glob.prototype._emitMatch = function (index, e) { - if (this.aborted) - return - - if (isIgnored$2(this, e)) - return - - if (this.paused) { - this._emitQueue.push([index, e]); - return - } - - var abs = pathIsAbsolute(e) ? e : this._makeAbs(e); - - if (this.mark) - e = this._mark(e); - - if (this.absolute) - e = abs; - - if (this.matches[index][e]) - return - - if (this.nodir) { - var c = this.cache[abs]; - if (c === 'DIR' || Array.isArray(c)) - return - } - - this.matches[index][e] = true; - - var st = this.statCache[abs]; - if (st) - this.emit('stat', e, st); - - this.emit('match', e); -}; - -Glob.prototype._readdirInGlobStar = function (abs, cb) { - if (this.aborted) - return - - // follow all symlinked directories forever - // just proceed as if this is a non-globstar situation - if (this.follow) - return this._readdir(abs, false, cb) - - var lstatkey = 'lstat\0' + abs; - var self = this; - var lstatcb = inflight_1(lstatkey, lstatcb_); - - if (lstatcb) - fs__default['default'].lstat(abs, lstatcb); - - function lstatcb_ (er, lstat) { - if (er && er.code === 'ENOENT') - return cb() - - var isSym = lstat && lstat.isSymbolicLink(); - self.symlinks[abs] = isSym; - - // If it's not a symlink or a dir, then it's definitely a regular file. - // don't bother doing a readdir in that case. - if (!isSym && lstat && !lstat.isDirectory()) { - self.cache[abs] = 'FILE'; - cb(); - } else - self._readdir(abs, false, cb); - } -}; - -Glob.prototype._readdir = function (abs, inGlobStar, cb) { - if (this.aborted) - return - - cb = inflight_1('readdir\0'+abs+'\0'+inGlobStar, cb); - if (!cb) - return - - //console.error('RD %j %j', +inGlobStar, abs) - if (inGlobStar && !ownProp$2(this.symlinks, abs)) - return this._readdirInGlobStar(abs, cb) - - if (ownProp$2(this.cache, abs)) { - var c = this.cache[abs]; - if (!c || c === 'FILE') - return cb() - - if (Array.isArray(c)) - return cb(null, c) - } - fs__default['default'].readdir(abs, readdirCb(this, abs, cb)); -}; - -function readdirCb (self, abs, cb) { - return function (er, entries) { - if (er) - self._readdirError(abs, er, cb); - else - self._readdirEntries(abs, entries, cb); - } -} - -Glob.prototype._readdirEntries = function (abs, entries, cb) { - if (this.aborted) - return - - // if we haven't asked to stat everything, then just - // assume that everything in there exists, so we can avoid - // having to stat it a second time. - if (!this.mark && !this.stat) { - for (var i = 0; i < entries.length; i ++) { - var e = entries[i]; - if (abs === '/') - e = abs + e; - else - e = abs + '/' + e; - this.cache[e] = true; - } - } - - this.cache[abs] = entries; - return cb(null, entries) -}; - -Glob.prototype._readdirError = function (f, er, cb) { - if (this.aborted) - return - - // handle errors, and cache the information - switch (er.code) { - case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 - case 'ENOTDIR': // totally normal. means it *does* exist. - var abs = this._makeAbs(f); - this.cache[abs] = 'FILE'; - if (abs === this.cwdAbs) { - var error = new Error(er.code + ' invalid cwd ' + this.cwd); - error.path = this.cwd; - error.code = er.code; - this.emit('error', error); - this.abort(); - } - break - - case 'ENOENT': // not terribly unusual - case 'ELOOP': - case 'ENAMETOOLONG': - case 'UNKNOWN': - this.cache[this._makeAbs(f)] = false; - break - - default: // some unusual error. Treat as failure. - this.cache[this._makeAbs(f)] = false; - if (this.strict) { - this.emit('error', er); - // If the error is handled, then we abort - // if not, we threw out of here - this.abort(); - } - if (!this.silent) - console.error('glob error', er); - break - } - - return cb() -}; - -Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { - var self = this; - this._readdir(abs, inGlobStar, function (er, entries) { - self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb); - }); -}; - - -Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { - //console.error('pgs2', prefix, remain[0], entries) - - // no entries means not a dir, so it can never have matches - // foo.txt/** doesn't match foo.txt - if (!entries) - return cb() - - // test without the globstar, and with every child both below - // and replacing the globstar. - var remainWithoutGlobStar = remain.slice(1); - var gspref = prefix ? [ prefix ] : []; - var noGlobStar = gspref.concat(remainWithoutGlobStar); - - // the noGlobStar pattern exits the inGlobStar state - this._process(noGlobStar, index, false, cb); - - var isSym = this.symlinks[abs]; - var len = entries.length; - - // If it's a symlink, and we're in a globstar, then stop - if (isSym && inGlobStar) - return cb() - - for (var i = 0; i < len; i++) { - var e = entries[i]; - if (e.charAt(0) === '.' && !this.dot) - continue - - // these two cases enter the inGlobStar state - var instead = gspref.concat(entries[i], remainWithoutGlobStar); - this._process(instead, index, true, cb); - - var below = gspref.concat(entries[i], remain); - this._process(below, index, true, cb); - } - - cb(); -}; - -Glob.prototype._processSimple = function (prefix, index, cb) { - // XXX review this. Shouldn't it be doing the mounting etc - // before doing stat? kinda weird? - var self = this; - this._stat(prefix, function (er, exists) { - self._processSimple2(prefix, index, er, exists, cb); - }); -}; -Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { - - //console.error('ps2', prefix, exists) - - if (!this.matches[index]) - this.matches[index] = Object.create(null); - - // If it doesn't exist, then just mark the lack of results - if (!exists) - return cb() - - if (prefix && pathIsAbsolute(prefix) && !this.nomount) { - var trail = /[\/\\]$/.test(prefix); - if (prefix.charAt(0) === '/') { - prefix = path__default['default'].join(this.root, prefix); - } else { - prefix = path__default['default'].resolve(this.root, prefix); - if (trail) - prefix += '/'; - } - } - - if (process.platform === 'win32') - prefix = prefix.replace(/\\/g, '/'); - - // Mark this as a match - this._emitMatch(index, prefix); - cb(); -}; - -// Returns either 'DIR', 'FILE', or false -Glob.prototype._stat = function (f, cb) { - var abs = this._makeAbs(f); - var needDir = f.slice(-1) === '/'; - - if (f.length > this.maxLength) - return cb() - - if (!this.stat && ownProp$2(this.cache, abs)) { - var c = this.cache[abs]; - - if (Array.isArray(c)) - c = 'DIR'; - - // It exists, but maybe not how we need it - if (!needDir || c === 'DIR') - return cb(null, c) - - if (needDir && c === 'FILE') - return cb() - - // otherwise we have to stat, because maybe c=true - // if we know it exists, but not what it is. - } - var stat = this.statCache[abs]; - if (stat !== undefined) { - if (stat === false) - return cb(null, stat) - else { - var type = stat.isDirectory() ? 'DIR' : 'FILE'; - if (needDir && type === 'FILE') - return cb() - else - return cb(null, type, stat) - } - } - - var self = this; - var statcb = inflight_1('stat\0' + abs, lstatcb_); - if (statcb) - fs__default['default'].lstat(abs, statcb); - - function lstatcb_ (er, lstat) { - if (lstat && lstat.isSymbolicLink()) { - // If it's a symlink, then treat it as the target, unless - // the target does not exist, then treat it as a file. - return fs__default['default'].stat(abs, function (er, stat) { - if (er) - self._stat2(f, abs, null, lstat, cb); - else - self._stat2(f, abs, er, stat, cb); - }) - } else { - self._stat2(f, abs, er, lstat, cb); - } - } -}; - -Glob.prototype._stat2 = function (f, abs, er, stat, cb) { - if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { - this.statCache[abs] = false; - return cb() - } - - var needDir = f.slice(-1) === '/'; - this.statCache[abs] = stat; - - if (abs.slice(-1) === '/' && stat && !stat.isDirectory()) - return cb(null, false, stat) - - var c = true; - if (stat) - c = stat.isDirectory() ? 'DIR' : 'FILE'; - this.cache[abs] = this.cache[abs] || c; - - if (needDir && c === 'FILE') - return cb() - - return cb(null, c, stat) -}; - -var glob$1 = glob_1; - -module.exports = glob$1; diff --git a/tools/build/cbt/process.js b/tools/build/cbt/process.js deleted file mode 100644 index ecd150b8d4..0000000000 --- a/tools/build/cbt/process.js +++ /dev/null @@ -1,102 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -const { spawn } = require('child_process'); -const { resolve: resolvePath } = require('path'); -const { stat } = require('./fs'); - -/** - * @type {import('child_process').ChildProcessWithoutNullStreams} - */ -const children = new Set(); - -const killChildren = () => { - for (const child of children) { - child.kill('SIGTERM'); - children.delete(child); - console.log('killed child process'); - } -}; - -const trap = (signals, handler) => { - let readline; - if (process.platform === 'win32') { - readline = require('readline').createInterface({ - input: process.stdin, - output: process.stdout, - }); - } - for (const signal of signals) { - const handleSignal = () => handler(signal); - if (signal === 'EXIT') { - process.on('exit', handleSignal); - continue; - } - if (readline) { - readline.on('SIG' + signal, handleSignal); - } - process.on('SIG' + signal, handleSignal); - } -}; - -trap(['EXIT', 'BREAK', 'HUP', 'INT', 'TERM'], signal => { - if (signal !== 'EXIT') { - console.log('Received', signal); - } - killChildren(); - if (signal !== 'EXIT') { - process.exit(1); - } -}); - -const exceptionHandler = err => { - console.log(err); - killChildren(); - process.exit(1); -}; - -process.on('unhandledRejection', exceptionHandler); -process.on('uncaughtException', exceptionHandler); - -class ExitError extends Error {} - -/** - * @param {string} executable - * @param {string[]} args - * @param {import('child_process').SpawnOptionsWithoutStdio} options - */ -const exec = (executable, args, options) => { - return new Promise((resolve, reject) => { - // If executable exists relative to the current directory, - // use that executable, otherwise spawn should fall back to - // running it from PATH. - if (stat(executable)) { - executable = resolvePath(executable); - } - const child = spawn(executable, args, options); - children.add(child); - child.stdout.pipe(process.stdout, { end: false }); - child.stderr.pipe(process.stderr, { end: false }); - child.stdin.end(); - child.on('error', err => reject(err)); - child.on('exit', code => { - children.delete(child); - if (code !== 0) { - const error = new ExitError('Process exited with code: ' + code); - error.code = code; - reject(error); - } - else { - resolve(code); - } - }); - }); -}; - -module.exports = { - exec, - ExitError, -}; diff --git a/tools/build/cbt/task.js b/tools/build/cbt/task.js deleted file mode 100644 index f0782bfe1e..0000000000 --- a/tools/build/cbt/task.js +++ /dev/null @@ -1,107 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -const { compareFiles, Glob, File } = require('./fs'); - -class Task { - constructor(name) { - this.name = name; - this.sources = []; - this.targets = []; - this.script = null; - } - - depends(path) { - if (path.includes('*')) { - this.sources.push(new Glob(path)); - } - else { - this.sources.push(new File(path)); - } - return this; - } - - provides(path) { - if (path.includes('*')) { - this.targets.push(new Glob(path)); - } - else { - this.targets.push(new File(path)); - } - return this; - } - - build(script) { - this.script = script; - return this; - } - - async run() { - /** - * @returns {File[]} - */ - const getFiles = files => files - .flatMap(file => { - if (file instanceof Glob) { - return file.toFiles(); - } - if (file instanceof File) { - return file; - } - }) - .filter(Boolean); - // Normalize all our dependencies by converting globs to files - const fileSources = getFiles(this.sources); - const fileTargets = getFiles(this.targets); - // Consider dependencies first, and skip the task if it - // doesn't need a rebuild. - let needsRebuild = 'no targets'; - if (fileTargets.length > 0) { - needsRebuild = compareFiles(fileSources, fileTargets); - if (!needsRebuild) { - console.warn(` => Skipping '${this.name}' (up to date)`); - return; - } - } - if (!this.script) { - return; - } - if (process.env.DEBUG && needsRebuild) { - console.debug(` Reason: ${needsRebuild}`); - } - console.warn(` => Starting '${this.name}'`); - const startedAt = Date.now(); - // Run the script - await this.script(); - // Touch all targets so that they don't rebuild again - if (fileTargets.length > 0) { - for (const file of fileTargets) { - file.touch(); - } - } - const time = ((Date.now() - startedAt) / 1000) + 's'; - console.warn(` => Finished '${this.name}' in ${time}`); - } -} - -const runTasks = async tasks => { - const startedAt = Date.now(); - // Run all if none of the tasks were specified in command line - const runAll = !tasks.some(task => process.argv.includes(task.name)); - for (const task of tasks) { - if (runAll || process.argv.includes(task.name)) { - await task.run(); - } - } - const time = ((Date.now() - startedAt) / 1000) + 's'; - console.log(` => Done in ${time}`); - process.exit(); -}; - -module.exports = { - Task, - runTasks, -}; diff --git a/tools/build/juke/index.d.ts b/tools/build/juke/index.d.ts new file mode 100644 index 0000000000..cdc30ea577 --- /dev/null +++ b/tools/build/juke/index.d.ts @@ -0,0 +1,248 @@ +// Generated by dts-bundle-generator v5.9.0 + +/// + +import _chalk from 'chalk'; +import { SpawnOptionsWithoutStdio } from 'child_process'; +import EventEmitter from 'events'; + +/** + * Change the current working directory of the Node.js process. + * + * Second argument is a file (or directory), relative to which chdir will be + * performed. This is usually `import.meta.url`. + */ +export declare const chdir: (directory: string, relativeTo?: string | undefined) => void; +export declare const logger: { + log: (...args: unknown[]) => void; + error: (...args: unknown[]) => void; + action: (...args: unknown[]) => void; + warn: (...args: unknown[]) => void; + info: (...args: unknown[]) => void; + debug: (...args: unknown[]) => void; +}; +export declare type ParameterType = (string | string[] | number | number[] | boolean | boolean[]); +export declare type StringType = ("string" | "string[]" | "number" | "number[]" | "boolean" | "boolean[]"); +export declare type TypeByString = (T extends "string" ? string : T extends "string[]" ? string[] : T extends "number" ? number : T extends "number[]" ? number[] : T extends "boolean" ? boolean : T extends "boolean[]" ? boolean[] : never); +export declare type ParameterConfig = { + /** + * Parameter name, as it would be used in CLI. + */ + name?: string; + /** + * Parameter type, one of: + * - `string` + * - `string[]` + * - `number` + * - `number[]` + * - `boolean` + * - `boolean[]` + */ + type: T; + /** + * Short flag for use in CLI, can only be a single character. + */ + alias?: string; +}; +export interface Parameter { + type: StringType; + name?: string; + alias?: string; + __internalType?: T; + isString(): this is Parameter; + isNumber(): this is Parameter; + isBoolean(): this is Parameter; + isArray(): this is Parameter; + toKebabCase(): string | undefined; + toConstCase(): string | undefined; + toCamelCase(): string | undefined; +} +export declare type ParameterCtor = { + new (config: ParameterConfig): Parameter>; +}; +export declare const Parameter: ParameterCtor; +export declare type ParameterCreator = (config: ParameterConfig) => Parameter>; +export declare const createParameter: ParameterCreator; +export declare type ExecutionContext = { + /** Get parameter value. */ + get: (parameter: Parameter) => (T extends Array ? T : T | null); + args: string[]; +}; +export declare type BooleanLike = boolean | null | undefined; +export declare type WithExecutionContext = (context: ExecutionContext) => R | Promise; +export declare type WithOptionalExecutionContext = R | WithExecutionContext; +export declare type DependsOn = WithOptionalExecutionContext<(Target | BooleanLike)[]>; +export declare type ExecutesFn = WithExecutionContext; +export declare type OnlyWhenFn = WithExecutionContext; +export declare type FileIo = WithOptionalExecutionContext<(string | BooleanLike)[]>; +export declare type TargetConfig = { + /** + * Target name. This parameter is required. + */ + name?: string; + /** + * Dependencies for this target. They will be ran before executing this + * target, and may run in parallel. + */ + dependsOn?: DependsOn; + /** + * Function that is delegated to the execution engine for building this + * target. It is normally an async function, which accepts a single + * argument - execution context (contains `get` for interacting with + * parameters). + * + * @example + * executes: async ({ get }) => { + * console.log(get(Parameter)); + * }, + */ + executes?: ExecutesFn; + /** + * Files that are consumed by this target. + */ + inputs?: FileIo; + /** + * Files that are produced by this target. Additionally, they are also + * touched every time target finishes executing in order to stop + * this target from re-running. + */ + outputs?: FileIo; + /** + * Parameters that are local to this task. Can be retrieved via `get` + * in the executor function. + */ + parameters?: Parameter[]; + /** + * Target will run only when this function returns true. It accepts a + * single argument - execution context. + */ + onlyWhen?: OnlyWhenFn; +}; +export declare class Target { + name?: string; + dependsOn: DependsOn; + executes?: ExecutesFn; + inputs: FileIo; + outputs: FileIo; + parameters: Parameter[]; + onlyWhen?: OnlyWhenFn; + constructor(target: TargetConfig); +} +export declare type TargetCreator = (target: TargetConfig) => Target; +export declare const createTarget: TargetCreator; +export declare type RunnerConfig = { + targets?: Target[]; + default?: Target; + parameters?: Parameter[]; + singleTarget?: boolean; +}; +export declare const runner: { + config: RunnerConfig; + targets: Target[]; + parameters: Parameter[]; + workers: Worker[]; + configure(config: RunnerConfig): void; + start(): Promise; +}; +declare class Worker { + readonly target: Target; + readonly context: ExecutionContext; + readonly dependsOn: Target[]; + dependencies: Set; + generator?: AsyncGenerator; + emitter: EventEmitter; + hasFailed: boolean; + constructor(target: Target, context: ExecutionContext, dependsOn: Target[]); + resolveDependency(target: Target): void; + rejectDependency(target: Target): void; + start(): void; + onFinish(fn: () => void): void; + onFail(fn: () => void): void; + private debugLog; + private process; +} +export declare class ExitCode extends Error { + code: number | null; + signal: string | null; + constructor(code: number | null, signal?: string | null); +} +export declare type ExecOptions = SpawnOptionsWithoutStdio & { + /** + * If `true`, this exec call will not pipe its output to stdio. + * @default false + */ + silent?: boolean; + /** + * Throw an exception on non-zero exit code. + * @default true + */ + throw?: boolean; +}; +export declare type ExecReturn = { + /** Exit code of the program. */ + code: number | null; + /** Signal received by the program which caused it to exit. */ + signal: NodeJS.Signals | null; + /** Output collected from `stdout` */ + stdout: string; + /** Output collected from `stderr` */ + stderr: string; + /** A combined output collected from `stdout` and `stderr`. */ + combined: string; +}; +export declare const exec: (executable: string, args?: string[], options?: ExecOptions) => Promise; +/** + * Unix style pathname pattern expansion. + * + * Perform a search matching a specified pattern according to the rules of + * the `glob` npm package. Path can be either absolute or relative, and can + * contain shell-style wildcards. Broken symlinks are included in the results + * (as in the shell). Whether or not the results are sorted depends on the + * file system. + * + * @returns A possibly empty list of file paths. + */ +export declare const glob: (globPath: string) => string[]; +export declare type RmOptions = { + /** + * If true, perform a recursive directory removal. + */ + recursive?: boolean; + /** + * If true, exceptions will be ignored if file or directory does not exist. + */ + force?: boolean; +}; +/** + * Removes files and directories (synchronously). Supports globs. + */ +export declare const rm: (path: string, options?: RmOptions) => void; +export declare const chalk: _chalk.Chalk & _chalk.ChalkFunction & { + supportsColor: false | _chalk.ColorSupport; + Level: _chalk.Level; + Color: ("black" | "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white" | "gray" | "grey" | "blackBright" | "redBright" | "greenBright" | "yellowBright" | "blueBright" | "magentaBright" | "cyanBright" | "whiteBright") | ("bgBlack" | "bgRed" | "bgGreen" | "bgYellow" | "bgBlue" | "bgMagenta" | "bgCyan" | "bgWhite" | "bgGray" | "bgGrey" | "bgBlackBright" | "bgRedBright" | "bgGreenBright" | "bgYellowBright" | "bgBlueBright" | "bgMagentaBright" | "bgCyanBright" | "bgWhiteBright"); + ForegroundColor: "black" | "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white" | "gray" | "grey" | "blackBright" | "redBright" | "greenBright" | "yellowBright" | "blueBright" | "magentaBright" | "cyanBright" | "whiteBright"; + BackgroundColor: "bgBlack" | "bgRed" | "bgGreen" | "bgYellow" | "bgBlue" | "bgMagenta" | "bgCyan" | "bgWhite" | "bgGray" | "bgGrey" | "bgBlackBright" | "bgRedBright" | "bgGreenBright" | "bgYellowBright" | "bgBlueBright" | "bgMagentaBright" | "bgCyanBright" | "bgWhiteBright"; + Modifiers: "bold" | "reset" | "dim" | "italic" | "underline" | "inverse" | "hidden" | "strikethrough" | "visible"; + stderr: _chalk.Chalk & { + supportsColor: false | _chalk.ColorSupport; + }; +}; +export declare type SetupConfig = { + file: string; + /** + * If true, CLI will only accept a single target to run and will receive all + * passed arguments as is (not only flags). + */ + singleTarget?: boolean; +}; +/** + * Configures Juke Build and starts executing targets. + * + * @param config Juke Build configuration. + * @returns Exit code of the whole runner process. + */ +export declare const setup: (config: SetupConfig) => Promise; +export declare const sleep: (time: number) => Promise; + +export {}; diff --git a/tools/build/juke/index.js b/tools/build/juke/index.js new file mode 100644 index 0000000000..4ee8fbf0bf --- /dev/null +++ b/tools/build/juke/index.js @@ -0,0 +1,5128 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __defProps = Object.defineProperties; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropDescs = Object.getOwnPropertyDescriptors; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getOwnPropSymbols = Object.getOwnPropertySymbols; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __propIsEnum = Object.prototype.propertyIsEnumerable; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __spreadValues = (a, b) => { + for (var prop in b || (b = {})) + if (__hasOwnProp.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + if (__getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(b)) { + if (__propIsEnum.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + } + return a; +}; +var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); +var __markAsModule = (target) => __defProp(target, "__esModule", { value: true }); +var __objRest = (source, exclude) => { + var target = {}; + for (var prop in source) + if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0) + target[prop] = source[prop]; + if (source != null && __getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(source)) { + if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop)) + target[prop] = source[prop]; + } + return target; +}; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[Object.keys(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __export = (target, all) => { + __markAsModule(target); + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __reExport = (target, module2, desc) => { + if (module2 && typeof module2 === "object" || typeof module2 === "function") { + for (let key of __getOwnPropNames(module2)) + if (!__hasOwnProp.call(target, key) && key !== "default") + __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable }); + } + return target; +}; +var __toModule = (module2) => { + return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2); +}; + +// pnp:color-name-npm-1.1.4-025792b0ea-b044585952.zip/node_modules/color-name/index.js +var require_color_name = __commonJS({ + "pnp:color-name-npm-1.1.4-025792b0ea-b044585952.zip/node_modules/color-name/index.js"(exports, module2) { + "use strict"; + module2.exports = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] + }; + } +}); + +// pnp:color-convert-npm-2.0.1-79730e935b-79e6bdb9fd.zip/node_modules/color-convert/conversions.js +var require_conversions = __commonJS({ + "pnp:color-convert-npm-2.0.1-79730e935b-79e6bdb9fd.zip/node_modules/color-convert/conversions.js"(exports, module2) { + var cssKeywords = require_color_name(); + var reverseKeywords = {}; + for (const key of Object.keys(cssKeywords)) { + reverseKeywords[cssKeywords[key]] = key; + } + var convert = { + rgb: { channels: 3, labels: "rgb" }, + hsl: { channels: 3, labels: "hsl" }, + hsv: { channels: 3, labels: "hsv" }, + hwb: { channels: 3, labels: "hwb" }, + cmyk: { channels: 4, labels: "cmyk" }, + xyz: { channels: 3, labels: "xyz" }, + lab: { channels: 3, labels: "lab" }, + lch: { channels: 3, labels: "lch" }, + hex: { channels: 1, labels: ["hex"] }, + keyword: { channels: 1, labels: ["keyword"] }, + ansi16: { channels: 1, labels: ["ansi16"] }, + ansi256: { channels: 1, labels: ["ansi256"] }, + hcg: { channels: 3, labels: ["h", "c", "g"] }, + apple: { channels: 3, labels: ["r16", "g16", "b16"] }, + gray: { channels: 1, labels: ["gray"] } + }; + module2.exports = convert; + for (const model of Object.keys(convert)) { + if (!("channels" in convert[model])) { + throw new Error("missing channels property: " + model); + } + if (!("labels" in convert[model])) { + throw new Error("missing channel labels property: " + model); + } + if (convert[model].labels.length !== convert[model].channels) { + throw new Error("channel and label counts mismatch: " + model); + } + const { channels, labels } = convert[model]; + delete convert[model].channels; + delete convert[model].labels; + Object.defineProperty(convert[model], "channels", { value: channels }); + Object.defineProperty(convert[model], "labels", { value: labels }); + } + convert.rgb.hsl = function(rgb) { + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + const min = Math.min(r, g, b); + const max = Math.max(r, g, b); + const delta = max - min; + let h; + let s; + if (max === min) { + h = 0; + } else if (r === max) { + h = (g - b) / delta; + } else if (g === max) { + h = 2 + (b - r) / delta; + } else if (b === max) { + h = 4 + (r - g) / delta; + } + h = Math.min(h * 60, 360); + if (h < 0) { + h += 360; + } + const l = (min + max) / 2; + if (max === min) { + s = 0; + } else if (l <= 0.5) { + s = delta / (max + min); + } else { + s = delta / (2 - max - min); + } + return [h, s * 100, l * 100]; + }; + convert.rgb.hsv = function(rgb) { + let rdif; + let gdif; + let bdif; + let h; + let s; + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + const v = Math.max(r, g, b); + const diff = v - Math.min(r, g, b); + const diffc = function(c) { + return (v - c) / 6 / diff + 1 / 2; + }; + if (diff === 0) { + h = 0; + s = 0; + } else { + s = diff / v; + rdif = diffc(r); + gdif = diffc(g); + bdif = diffc(b); + if (r === v) { + h = bdif - gdif; + } else if (g === v) { + h = 1 / 3 + rdif - bdif; + } else if (b === v) { + h = 2 / 3 + gdif - rdif; + } + if (h < 0) { + h += 1; + } else if (h > 1) { + h -= 1; + } + } + return [ + h * 360, + s * 100, + v * 100 + ]; + }; + convert.rgb.hwb = function(rgb) { + const r = rgb[0]; + const g = rgb[1]; + let b = rgb[2]; + const h = convert.rgb.hsl(rgb)[0]; + const w = 1 / 255 * Math.min(r, Math.min(g, b)); + b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); + return [h, w * 100, b * 100]; + }; + convert.rgb.cmyk = function(rgb) { + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + const k = Math.min(1 - r, 1 - g, 1 - b); + const c = (1 - r - k) / (1 - k) || 0; + const m = (1 - g - k) / (1 - k) || 0; + const y = (1 - b - k) / (1 - k) || 0; + return [c * 100, m * 100, y * 100, k * 100]; + }; + function comparativeDistance(x, y) { + return (x[0] - y[0]) ** 2 + (x[1] - y[1]) ** 2 + (x[2] - y[2]) ** 2; + } + convert.rgb.keyword = function(rgb) { + const reversed = reverseKeywords[rgb]; + if (reversed) { + return reversed; + } + let currentClosestDistance = Infinity; + let currentClosestKeyword; + for (const keyword of Object.keys(cssKeywords)) { + const value = cssKeywords[keyword]; + const distance = comparativeDistance(rgb, value); + if (distance < currentClosestDistance) { + currentClosestDistance = distance; + currentClosestKeyword = keyword; + } + } + return currentClosestKeyword; + }; + convert.keyword.rgb = function(keyword) { + return cssKeywords[keyword]; + }; + convert.rgb.xyz = function(rgb) { + let r = rgb[0] / 255; + let g = rgb[1] / 255; + let b = rgb[2] / 255; + r = r > 0.04045 ? ((r + 0.055) / 1.055) ** 2.4 : r / 12.92; + g = g > 0.04045 ? ((g + 0.055) / 1.055) ** 2.4 : g / 12.92; + b = b > 0.04045 ? ((b + 0.055) / 1.055) ** 2.4 : b / 12.92; + const x = r * 0.4124 + g * 0.3576 + b * 0.1805; + const y = r * 0.2126 + g * 0.7152 + b * 0.0722; + const z = r * 0.0193 + g * 0.1192 + b * 0.9505; + return [x * 100, y * 100, z * 100]; + }; + convert.rgb.lab = function(rgb) { + const xyz = convert.rgb.xyz(rgb); + let x = xyz[0]; + let y = xyz[1]; + let z = xyz[2]; + x /= 95.047; + y /= 100; + z /= 108.883; + x = x > 8856e-6 ? x ** (1 / 3) : 7.787 * x + 16 / 116; + y = y > 8856e-6 ? y ** (1 / 3) : 7.787 * y + 16 / 116; + z = z > 8856e-6 ? z ** (1 / 3) : 7.787 * z + 16 / 116; + const l = 116 * y - 16; + const a = 500 * (x - y); + const b = 200 * (y - z); + return [l, a, b]; + }; + convert.hsl.rgb = function(hsl) { + const h = hsl[0] / 360; + const s = hsl[1] / 100; + const l = hsl[2] / 100; + let t2; + let t3; + let val; + if (s === 0) { + val = l * 255; + return [val, val, val]; + } + if (l < 0.5) { + t2 = l * (1 + s); + } else { + t2 = l + s - l * s; + } + const t1 = 2 * l - t2; + const rgb = [0, 0, 0]; + for (let i = 0; i < 3; i++) { + t3 = h + 1 / 3 * -(i - 1); + if (t3 < 0) { + t3++; + } + if (t3 > 1) { + t3--; + } + if (6 * t3 < 1) { + val = t1 + (t2 - t1) * 6 * t3; + } else if (2 * t3 < 1) { + val = t2; + } else if (3 * t3 < 2) { + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + } else { + val = t1; + } + rgb[i] = val * 255; + } + return rgb; + }; + convert.hsl.hsv = function(hsl) { + const h = hsl[0]; + let s = hsl[1] / 100; + let l = hsl[2] / 100; + let smin = s; + const lmin = Math.max(l, 0.01); + l *= 2; + s *= l <= 1 ? l : 2 - l; + smin *= lmin <= 1 ? lmin : 2 - lmin; + const v = (l + s) / 2; + const sv = l === 0 ? 2 * smin / (lmin + smin) : 2 * s / (l + s); + return [h, sv * 100, v * 100]; + }; + convert.hsv.rgb = function(hsv) { + const h = hsv[0] / 60; + const s = hsv[1] / 100; + let v = hsv[2] / 100; + const hi = Math.floor(h) % 6; + const f = h - Math.floor(h); + const p = 255 * v * (1 - s); + const q = 255 * v * (1 - s * f); + const t = 255 * v * (1 - s * (1 - f)); + v *= 255; + switch (hi) { + case 0: + return [v, t, p]; + case 1: + return [q, v, p]; + case 2: + return [p, v, t]; + case 3: + return [p, q, v]; + case 4: + return [t, p, v]; + case 5: + return [v, p, q]; + } + }; + convert.hsv.hsl = function(hsv) { + const h = hsv[0]; + const s = hsv[1] / 100; + const v = hsv[2] / 100; + const vmin = Math.max(v, 0.01); + let sl; + let l; + l = (2 - s) * v; + const lmin = (2 - s) * vmin; + sl = s * vmin; + sl /= lmin <= 1 ? lmin : 2 - lmin; + sl = sl || 0; + l /= 2; + return [h, sl * 100, l * 100]; + }; + convert.hwb.rgb = function(hwb) { + const h = hwb[0] / 360; + let wh = hwb[1] / 100; + let bl = hwb[2] / 100; + const ratio = wh + bl; + let f; + if (ratio > 1) { + wh /= ratio; + bl /= ratio; + } + const i = Math.floor(6 * h); + const v = 1 - bl; + f = 6 * h - i; + if ((i & 1) !== 0) { + f = 1 - f; + } + const n = wh + f * (v - wh); + let r; + let g; + let b; + switch (i) { + default: + case 6: + case 0: + r = v; + g = n; + b = wh; + break; + case 1: + r = n; + g = v; + b = wh; + break; + case 2: + r = wh; + g = v; + b = n; + break; + case 3: + r = wh; + g = n; + b = v; + break; + case 4: + r = n; + g = wh; + b = v; + break; + case 5: + r = v; + g = wh; + b = n; + break; + } + return [r * 255, g * 255, b * 255]; + }; + convert.cmyk.rgb = function(cmyk) { + const c = cmyk[0] / 100; + const m = cmyk[1] / 100; + const y = cmyk[2] / 100; + const k = cmyk[3] / 100; + const r = 1 - Math.min(1, c * (1 - k) + k); + const g = 1 - Math.min(1, m * (1 - k) + k); + const b = 1 - Math.min(1, y * (1 - k) + k); + return [r * 255, g * 255, b * 255]; + }; + convert.xyz.rgb = function(xyz) { + const x = xyz[0] / 100; + const y = xyz[1] / 100; + const z = xyz[2] / 100; + let r; + let g; + let b; + r = x * 3.2406 + y * -1.5372 + z * -0.4986; + g = x * -0.9689 + y * 1.8758 + z * 0.0415; + b = x * 0.0557 + y * -0.204 + z * 1.057; + r = r > 31308e-7 ? 1.055 * r ** (1 / 2.4) - 0.055 : r * 12.92; + g = g > 31308e-7 ? 1.055 * g ** (1 / 2.4) - 0.055 : g * 12.92; + b = b > 31308e-7 ? 1.055 * b ** (1 / 2.4) - 0.055 : b * 12.92; + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); + return [r * 255, g * 255, b * 255]; + }; + convert.xyz.lab = function(xyz) { + let x = xyz[0]; + let y = xyz[1]; + let z = xyz[2]; + x /= 95.047; + y /= 100; + z /= 108.883; + x = x > 8856e-6 ? x ** (1 / 3) : 7.787 * x + 16 / 116; + y = y > 8856e-6 ? y ** (1 / 3) : 7.787 * y + 16 / 116; + z = z > 8856e-6 ? z ** (1 / 3) : 7.787 * z + 16 / 116; + const l = 116 * y - 16; + const a = 500 * (x - y); + const b = 200 * (y - z); + return [l, a, b]; + }; + convert.lab.xyz = function(lab) { + const l = lab[0]; + const a = lab[1]; + const b = lab[2]; + let x; + let y; + let z; + y = (l + 16) / 116; + x = a / 500 + y; + z = y - b / 200; + const y2 = y ** 3; + const x2 = x ** 3; + const z2 = z ** 3; + y = y2 > 8856e-6 ? y2 : (y - 16 / 116) / 7.787; + x = x2 > 8856e-6 ? x2 : (x - 16 / 116) / 7.787; + z = z2 > 8856e-6 ? z2 : (z - 16 / 116) / 7.787; + x *= 95.047; + y *= 100; + z *= 108.883; + return [x, y, z]; + }; + convert.lab.lch = function(lab) { + const l = lab[0]; + const a = lab[1]; + const b = lab[2]; + let h; + const hr = Math.atan2(b, a); + h = hr * 360 / 2 / Math.PI; + if (h < 0) { + h += 360; + } + const c = Math.sqrt(a * a + b * b); + return [l, c, h]; + }; + convert.lch.lab = function(lch) { + const l = lch[0]; + const c = lch[1]; + const h = lch[2]; + const hr = h / 360 * 2 * Math.PI; + const a = c * Math.cos(hr); + const b = c * Math.sin(hr); + return [l, a, b]; + }; + convert.rgb.ansi16 = function(args, saturation = null) { + const [r, g, b] = args; + let value = saturation === null ? convert.rgb.hsv(args)[2] : saturation; + value = Math.round(value / 50); + if (value === 0) { + return 30; + } + let ansi = 30 + (Math.round(b / 255) << 2 | Math.round(g / 255) << 1 | Math.round(r / 255)); + if (value === 2) { + ansi += 60; + } + return ansi; + }; + convert.hsv.ansi16 = function(args) { + return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]); + }; + convert.rgb.ansi256 = function(args) { + const r = args[0]; + const g = args[1]; + const b = args[2]; + if (r === g && g === b) { + if (r < 8) { + return 16; + } + if (r > 248) { + return 231; + } + return Math.round((r - 8) / 247 * 24) + 232; + } + const ansi = 16 + 36 * Math.round(r / 255 * 5) + 6 * Math.round(g / 255 * 5) + Math.round(b / 255 * 5); + return ansi; + }; + convert.ansi16.rgb = function(args) { + let color = args % 10; + if (color === 0 || color === 7) { + if (args > 50) { + color += 3.5; + } + color = color / 10.5 * 255; + return [color, color, color]; + } + const mult = (~~(args > 50) + 1) * 0.5; + const r = (color & 1) * mult * 255; + const g = (color >> 1 & 1) * mult * 255; + const b = (color >> 2 & 1) * mult * 255; + return [r, g, b]; + }; + convert.ansi256.rgb = function(args) { + if (args >= 232) { + const c = (args - 232) * 10 + 8; + return [c, c, c]; + } + args -= 16; + let rem; + const r = Math.floor(args / 36) / 5 * 255; + const g = Math.floor((rem = args % 36) / 6) / 5 * 255; + const b = rem % 6 / 5 * 255; + return [r, g, b]; + }; + convert.rgb.hex = function(args) { + const integer = ((Math.round(args[0]) & 255) << 16) + ((Math.round(args[1]) & 255) << 8) + (Math.round(args[2]) & 255); + const string = integer.toString(16).toUpperCase(); + return "000000".substring(string.length) + string; + }; + convert.hex.rgb = function(args) { + const match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); + if (!match) { + return [0, 0, 0]; + } + let colorString = match[0]; + if (match[0].length === 3) { + colorString = colorString.split("").map((char) => { + return char + char; + }).join(""); + } + const integer = parseInt(colorString, 16); + const r = integer >> 16 & 255; + const g = integer >> 8 & 255; + const b = integer & 255; + return [r, g, b]; + }; + convert.rgb.hcg = function(rgb) { + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + const max = Math.max(Math.max(r, g), b); + const min = Math.min(Math.min(r, g), b); + const chroma = max - min; + let grayscale; + let hue; + if (chroma < 1) { + grayscale = min / (1 - chroma); + } else { + grayscale = 0; + } + if (chroma <= 0) { + hue = 0; + } else if (max === r) { + hue = (g - b) / chroma % 6; + } else if (max === g) { + hue = 2 + (b - r) / chroma; + } else { + hue = 4 + (r - g) / chroma; + } + hue /= 6; + hue %= 1; + return [hue * 360, chroma * 100, grayscale * 100]; + }; + convert.hsl.hcg = function(hsl) { + const s = hsl[1] / 100; + const l = hsl[2] / 100; + const c = l < 0.5 ? 2 * s * l : 2 * s * (1 - l); + let f = 0; + if (c < 1) { + f = (l - 0.5 * c) / (1 - c); + } + return [hsl[0], c * 100, f * 100]; + }; + convert.hsv.hcg = function(hsv) { + const s = hsv[1] / 100; + const v = hsv[2] / 100; + const c = s * v; + let f = 0; + if (c < 1) { + f = (v - c) / (1 - c); + } + return [hsv[0], c * 100, f * 100]; + }; + convert.hcg.rgb = function(hcg) { + const h = hcg[0] / 360; + const c = hcg[1] / 100; + const g = hcg[2] / 100; + if (c === 0) { + return [g * 255, g * 255, g * 255]; + } + const pure = [0, 0, 0]; + const hi = h % 1 * 6; + const v = hi % 1; + const w = 1 - v; + let mg = 0; + switch (Math.floor(hi)) { + case 0: + pure[0] = 1; + pure[1] = v; + pure[2] = 0; + break; + case 1: + pure[0] = w; + pure[1] = 1; + pure[2] = 0; + break; + case 2: + pure[0] = 0; + pure[1] = 1; + pure[2] = v; + break; + case 3: + pure[0] = 0; + pure[1] = w; + pure[2] = 1; + break; + case 4: + pure[0] = v; + pure[1] = 0; + pure[2] = 1; + break; + default: + pure[0] = 1; + pure[1] = 0; + pure[2] = w; + } + mg = (1 - c) * g; + return [ + (c * pure[0] + mg) * 255, + (c * pure[1] + mg) * 255, + (c * pure[2] + mg) * 255 + ]; + }; + convert.hcg.hsv = function(hcg) { + const c = hcg[1] / 100; + const g = hcg[2] / 100; + const v = c + g * (1 - c); + let f = 0; + if (v > 0) { + f = c / v; + } + return [hcg[0], f * 100, v * 100]; + }; + convert.hcg.hsl = function(hcg) { + const c = hcg[1] / 100; + const g = hcg[2] / 100; + const l = g * (1 - c) + 0.5 * c; + let s = 0; + if (l > 0 && l < 0.5) { + s = c / (2 * l); + } else if (l >= 0.5 && l < 1) { + s = c / (2 * (1 - l)); + } + return [hcg[0], s * 100, l * 100]; + }; + convert.hcg.hwb = function(hcg) { + const c = hcg[1] / 100; + const g = hcg[2] / 100; + const v = c + g * (1 - c); + return [hcg[0], (v - c) * 100, (1 - v) * 100]; + }; + convert.hwb.hcg = function(hwb) { + const w = hwb[1] / 100; + const b = hwb[2] / 100; + const v = 1 - b; + const c = v - w; + let g = 0; + if (c < 1) { + g = (v - c) / (1 - c); + } + return [hwb[0], c * 100, g * 100]; + }; + convert.apple.rgb = function(apple) { + return [apple[0] / 65535 * 255, apple[1] / 65535 * 255, apple[2] / 65535 * 255]; + }; + convert.rgb.apple = function(rgb) { + return [rgb[0] / 255 * 65535, rgb[1] / 255 * 65535, rgb[2] / 255 * 65535]; + }; + convert.gray.rgb = function(args) { + return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255]; + }; + convert.gray.hsl = function(args) { + return [0, 0, args[0]]; + }; + convert.gray.hsv = convert.gray.hsl; + convert.gray.hwb = function(gray) { + return [0, 100, gray[0]]; + }; + convert.gray.cmyk = function(gray) { + return [0, 0, 0, gray[0]]; + }; + convert.gray.lab = function(gray) { + return [gray[0], 0, 0]; + }; + convert.gray.hex = function(gray) { + const val = Math.round(gray[0] / 100 * 255) & 255; + const integer = (val << 16) + (val << 8) + val; + const string = integer.toString(16).toUpperCase(); + return "000000".substring(string.length) + string; + }; + convert.rgb.gray = function(rgb) { + const val = (rgb[0] + rgb[1] + rgb[2]) / 3; + return [val / 255 * 100]; + }; + } +}); + +// pnp:color-convert-npm-2.0.1-79730e935b-79e6bdb9fd.zip/node_modules/color-convert/route.js +var require_route = __commonJS({ + "pnp:color-convert-npm-2.0.1-79730e935b-79e6bdb9fd.zip/node_modules/color-convert/route.js"(exports, module2) { + var conversions = require_conversions(); + function buildGraph() { + const graph = {}; + const models = Object.keys(conversions); + for (let len = models.length, i = 0; i < len; i++) { + graph[models[i]] = { + distance: -1, + parent: null + }; + } + return graph; + } + function deriveBFS(fromModel) { + const graph = buildGraph(); + const queue = [fromModel]; + graph[fromModel].distance = 0; + while (queue.length) { + const current = queue.pop(); + const adjacents = Object.keys(conversions[current]); + for (let len = adjacents.length, i = 0; i < len; i++) { + const adjacent = adjacents[i]; + const node = graph[adjacent]; + if (node.distance === -1) { + node.distance = graph[current].distance + 1; + node.parent = current; + queue.unshift(adjacent); + } + } + } + return graph; + } + function link(from, to) { + return function(args) { + return to(from(args)); + }; + } + function wrapConversion(toModel, graph) { + const path2 = [graph[toModel].parent, toModel]; + let fn = conversions[graph[toModel].parent][toModel]; + let cur = graph[toModel].parent; + while (graph[cur].parent) { + path2.unshift(graph[cur].parent); + fn = link(conversions[graph[cur].parent][cur], fn); + cur = graph[cur].parent; + } + fn.conversion = path2; + return fn; + } + module2.exports = function(fromModel) { + const graph = deriveBFS(fromModel); + const conversion = {}; + const models = Object.keys(graph); + for (let len = models.length, i = 0; i < len; i++) { + const toModel = models[i]; + const node = graph[toModel]; + if (node.parent === null) { + continue; + } + conversion[toModel] = wrapConversion(toModel, graph); + } + return conversion; + }; + } +}); + +// pnp:color-convert-npm-2.0.1-79730e935b-79e6bdb9fd.zip/node_modules/color-convert/index.js +var require_color_convert = __commonJS({ + "pnp:color-convert-npm-2.0.1-79730e935b-79e6bdb9fd.zip/node_modules/color-convert/index.js"(exports, module2) { + var conversions = require_conversions(); + var route = require_route(); + var convert = {}; + var models = Object.keys(conversions); + function wrapRaw(fn) { + const wrappedFn = function(...args) { + const arg0 = args[0]; + if (arg0 === void 0 || arg0 === null) { + return arg0; + } + if (arg0.length > 1) { + args = arg0; + } + return fn(args); + }; + if ("conversion" in fn) { + wrappedFn.conversion = fn.conversion; + } + return wrappedFn; + } + function wrapRounded(fn) { + const wrappedFn = function(...args) { + const arg0 = args[0]; + if (arg0 === void 0 || arg0 === null) { + return arg0; + } + if (arg0.length > 1) { + args = arg0; + } + const result = fn(args); + if (typeof result === "object") { + for (let len = result.length, i = 0; i < len; i++) { + result[i] = Math.round(result[i]); + } + } + return result; + }; + if ("conversion" in fn) { + wrappedFn.conversion = fn.conversion; + } + return wrappedFn; + } + models.forEach((fromModel) => { + convert[fromModel] = {}; + Object.defineProperty(convert[fromModel], "channels", { value: conversions[fromModel].channels }); + Object.defineProperty(convert[fromModel], "labels", { value: conversions[fromModel].labels }); + const routes = route(fromModel); + const routeModels = Object.keys(routes); + routeModels.forEach((toModel) => { + const fn = routes[toModel]; + convert[fromModel][toModel] = wrapRounded(fn); + convert[fromModel][toModel].raw = wrapRaw(fn); + }); + }); + module2.exports = convert; + } +}); + +// pnp:ansi-styles-npm-4.3.0-245c7d42c7-513b44c3b2.zip/node_modules/ansi-styles/index.js +var require_ansi_styles = __commonJS({ + "pnp:ansi-styles-npm-4.3.0-245c7d42c7-513b44c3b2.zip/node_modules/ansi-styles/index.js"(exports, module2) { + "use strict"; + var wrapAnsi16 = (fn, offset) => (...args) => { + const code = fn(...args); + return `[${code + offset}m`; + }; + var wrapAnsi256 = (fn, offset) => (...args) => { + const code = fn(...args); + return `[${38 + offset};5;${code}m`; + }; + var wrapAnsi16m = (fn, offset) => (...args) => { + const rgb = fn(...args); + return `[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; + }; + var ansi2ansi = (n) => n; + var rgb2rgb = (r, g, b) => [r, g, b]; + var setLazyProperty = (object, property, get) => { + Object.defineProperty(object, property, { + get: () => { + const value = get(); + Object.defineProperty(object, property, { + value, + enumerable: true, + configurable: true + }); + return value; + }, + enumerable: true, + configurable: true + }); + }; + var colorConvert; + var makeDynamicStyles = (wrap, targetSpace, identity, isBackground) => { + if (colorConvert === void 0) { + colorConvert = require_color_convert(); + } + const offset = isBackground ? 10 : 0; + const styles = {}; + for (const [sourceSpace, suite] of Object.entries(colorConvert)) { + const name = sourceSpace === "ansi16" ? "ansi" : sourceSpace; + if (sourceSpace === targetSpace) { + styles[name] = wrap(identity, offset); + } else if (typeof suite === "object") { + styles[name] = wrap(suite[targetSpace], offset); + } + } + return styles; + }; + function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + blackBright: [90, 39], + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49] + } + }; + styles.color.gray = styles.color.blackBright; + styles.bgColor.bgGray = styles.bgColor.bgBlackBright; + styles.color.grey = styles.color.blackBright; + styles.bgColor.bgGrey = styles.bgColor.bgBlackBright; + for (const [groupName, group] of Object.entries(styles)) { + for (const [styleName, style] of Object.entries(group)) { + styles[styleName] = { + open: `[${style[0]}m`, + close: `[${style[1]}m` + }; + group[styleName] = styles[styleName]; + codes.set(style[0], style[1]); + } + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); + } + Object.defineProperty(styles, "codes", { + value: codes, + enumerable: false + }); + styles.color.close = ""; + styles.bgColor.close = ""; + setLazyProperty(styles.color, "ansi", () => makeDynamicStyles(wrapAnsi16, "ansi16", ansi2ansi, false)); + setLazyProperty(styles.color, "ansi256", () => makeDynamicStyles(wrapAnsi256, "ansi256", ansi2ansi, false)); + setLazyProperty(styles.color, "ansi16m", () => makeDynamicStyles(wrapAnsi16m, "rgb", rgb2rgb, false)); + setLazyProperty(styles.bgColor, "ansi", () => makeDynamicStyles(wrapAnsi16, "ansi16", ansi2ansi, true)); + setLazyProperty(styles.bgColor, "ansi256", () => makeDynamicStyles(wrapAnsi256, "ansi256", ansi2ansi, true)); + setLazyProperty(styles.bgColor, "ansi16m", () => makeDynamicStyles(wrapAnsi16m, "rgb", rgb2rgb, true)); + return styles; + } + Object.defineProperty(module2, "exports", { + enumerable: true, + get: assembleStyles + }); + } +}); + +// pnp:has-flag-npm-4.0.0-32af9f0536-261a135703.zip/node_modules/has-flag/index.js +var require_has_flag = __commonJS({ + "pnp:has-flag-npm-4.0.0-32af9f0536-261a135703.zip/node_modules/has-flag/index.js"(exports, module2) { + "use strict"; + module2.exports = (flag, argv = process.argv) => { + const prefix = flag.startsWith("-") ? "" : flag.length === 1 ? "-" : "--"; + const position = argv.indexOf(prefix + flag); + const terminatorPosition = argv.indexOf("--"); + return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition); + }; + } +}); + +// pnp:supports-color-npm-7.2.0-606bfcf7da-3dda818de0.zip/node_modules/supports-color/index.js +var require_supports_color = __commonJS({ + "pnp:supports-color-npm-7.2.0-606bfcf7da-3dda818de0.zip/node_modules/supports-color/index.js"(exports, module2) { + "use strict"; + var os = require("os"); + var tty = require("tty"); + var hasFlag = require_has_flag(); + var { env } = process; + var forceColor; + if (hasFlag("no-color") || hasFlag("no-colors") || hasFlag("color=false") || hasFlag("color=never")) { + forceColor = 0; + } else if (hasFlag("color") || hasFlag("colors") || hasFlag("color=true") || hasFlag("color=always")) { + forceColor = 1; + } + if ("FORCE_COLOR" in env) { + if (env.FORCE_COLOR === "true") { + forceColor = 1; + } else if (env.FORCE_COLOR === "false") { + forceColor = 0; + } else { + forceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3); + } + } + function translateLevel(level) { + if (level === 0) { + return false; + } + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; + } + function supportsColor(haveStream, streamIsTTY) { + if (forceColor === 0) { + return 0; + } + if (hasFlag("color=16m") || hasFlag("color=full") || hasFlag("color=truecolor")) { + return 3; + } + if (hasFlag("color=256")) { + return 2; + } + if (haveStream && !streamIsTTY && forceColor === void 0) { + return 0; + } + const min = forceColor || 0; + if (env.TERM === "dumb") { + return min; + } + if (process.platform === "win32") { + const osRelease = os.release().split("."); + if (Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } + return 1; + } + if ("CI" in env) { + if (["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI", "GITHUB_ACTIONS", "BUILDKITE"].some((sign) => sign in env) || env.CI_NAME === "codeship") { + return 1; + } + return min; + } + if ("TEAMCITY_VERSION" in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } + if (env.COLORTERM === "truecolor") { + return 3; + } + if ("TERM_PROGRAM" in env) { + const version2 = parseInt((env.TERM_PROGRAM_VERSION || "").split(".")[0], 10); + switch (env.TERM_PROGRAM) { + case "iTerm.app": + return version2 >= 3 ? 3 : 2; + case "Apple_Terminal": + return 2; + } + } + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } + if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } + if ("COLORTERM" in env) { + return 1; + } + return min; + } + function getSupportLevel(stream) { + const level = supportsColor(stream, stream && stream.isTTY); + return translateLevel(level); + } + module2.exports = { + supportsColor: getSupportLevel, + stdout: translateLevel(supportsColor(true, tty.isatty(1))), + stderr: translateLevel(supportsColor(true, tty.isatty(2))) + }; + } +}); + +// pnp:chalk-npm-4.1.2-ba8b67ab80-fe75c9d5c7.zip/node_modules/chalk/source/util.js +var require_util = __commonJS({ + "pnp:chalk-npm-4.1.2-ba8b67ab80-fe75c9d5c7.zip/node_modules/chalk/source/util.js"(exports, module2) { + "use strict"; + var stringReplaceAll = (string, substring, replacer) => { + let index = string.indexOf(substring); + if (index === -1) { + return string; + } + const substringLength = substring.length; + let endIndex = 0; + let returnValue = ""; + do { + returnValue += string.substr(endIndex, index - endIndex) + substring + replacer; + endIndex = index + substringLength; + index = string.indexOf(substring, endIndex); + } while (index !== -1); + returnValue += string.substr(endIndex); + return returnValue; + }; + var stringEncaseCRLFWithFirstIndex = (string, prefix, postfix, index) => { + let endIndex = 0; + let returnValue = ""; + do { + const gotCR = string[index - 1] === "\r"; + returnValue += string.substr(endIndex, (gotCR ? index - 1 : index) - endIndex) + prefix + (gotCR ? "\r\n" : "\n") + postfix; + endIndex = index + 1; + index = string.indexOf("\n", endIndex); + } while (index !== -1); + returnValue += string.substr(endIndex); + return returnValue; + }; + module2.exports = { + stringReplaceAll, + stringEncaseCRLFWithFirstIndex + }; + } +}); + +// pnp:chalk-npm-4.1.2-ba8b67ab80-fe75c9d5c7.zip/node_modules/chalk/source/templates.js +var require_templates = __commonJS({ + "pnp:chalk-npm-4.1.2-ba8b67ab80-fe75c9d5c7.zip/node_modules/chalk/source/templates.js"(exports, module2) { + "use strict"; + var TEMPLATE_REGEX = /(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; + var STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; + var STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; + var ESCAPE_REGEX = /\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi; + var ESCAPES = new Map([ + ["n", "\n"], + ["r", "\r"], + ["t", " "], + ["b", "\b"], + ["f", "\f"], + ["v", "\v"], + ["0", "\0"], + ["\\", "\\"], + ["e", ""], + ["a", "\x07"] + ]); + function unescape(c) { + const u = c[0] === "u"; + const bracket = c[1] === "{"; + if (u && !bracket && c.length === 5 || c[0] === "x" && c.length === 3) { + return String.fromCharCode(parseInt(c.slice(1), 16)); + } + if (u && bracket) { + return String.fromCodePoint(parseInt(c.slice(2, -1), 16)); + } + return ESCAPES.get(c) || c; + } + function parseArguments(name, arguments_) { + const results = []; + const chunks = arguments_.trim().split(/\s*,\s*/g); + let matches; + for (const chunk of chunks) { + const number = Number(chunk); + if (!Number.isNaN(number)) { + results.push(number); + } else if (matches = chunk.match(STRING_REGEX)) { + results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, character) => escape ? unescape(escape) : character)); + } else { + throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); + } + } + return results; + } + function parseStyle(style) { + STYLE_REGEX.lastIndex = 0; + const results = []; + let matches; + while ((matches = STYLE_REGEX.exec(style)) !== null) { + const name = matches[1]; + if (matches[2]) { + const args = parseArguments(name, matches[2]); + results.push([name].concat(args)); + } else { + results.push([name]); + } + } + return results; + } + function buildStyle(chalk5, styles) { + const enabled = {}; + for (const layer of styles) { + for (const style of layer.styles) { + enabled[style[0]] = layer.inverse ? null : style.slice(1); + } + } + let current = chalk5; + for (const [styleName, styles2] of Object.entries(enabled)) { + if (!Array.isArray(styles2)) { + continue; + } + if (!(styleName in current)) { + throw new Error(`Unknown Chalk style: ${styleName}`); + } + current = styles2.length > 0 ? current[styleName](...styles2) : current[styleName]; + } + return current; + } + module2.exports = (chalk5, temporary) => { + const styles = []; + const chunks = []; + let chunk = []; + temporary.replace(TEMPLATE_REGEX, (m, escapeCharacter, inverse, style, close, character) => { + if (escapeCharacter) { + chunk.push(unescape(escapeCharacter)); + } else if (style) { + const string = chunk.join(""); + chunk = []; + chunks.push(styles.length === 0 ? string : buildStyle(chalk5, styles)(string)); + styles.push({ inverse, styles: parseStyle(style) }); + } else if (close) { + if (styles.length === 0) { + throw new Error("Found extraneous } in Chalk template literal"); + } + chunks.push(buildStyle(chalk5, styles)(chunk.join(""))); + chunk = []; + styles.pop(); + } else { + chunk.push(character); + } + }); + chunks.push(chunk.join("")); + if (styles.length > 0) { + const errMessage = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? "" : "s"} (\`}\`)`; + throw new Error(errMessage); + } + return chunks.join(""); + }; + } +}); + +// pnp:chalk-npm-4.1.2-ba8b67ab80-fe75c9d5c7.zip/node_modules/chalk/source/index.js +var require_source = __commonJS({ + "pnp:chalk-npm-4.1.2-ba8b67ab80-fe75c9d5c7.zip/node_modules/chalk/source/index.js"(exports, module2) { + "use strict"; + var ansiStyles = require_ansi_styles(); + var { stdout: stdoutColor, stderr: stderrColor } = require_supports_color(); + var { + stringReplaceAll, + stringEncaseCRLFWithFirstIndex + } = require_util(); + var { isArray } = Array; + var levelMapping = [ + "ansi", + "ansi", + "ansi256", + "ansi16m" + ]; + var styles = Object.create(null); + var applyOptions = (object, options = {}) => { + if (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) { + throw new Error("The `level` option should be an integer from 0 to 3"); + } + const colorLevel = stdoutColor ? stdoutColor.level : 0; + object.level = options.level === void 0 ? colorLevel : options.level; + }; + var ChalkClass = class { + constructor(options) { + return chalkFactory(options); + } + }; + var chalkFactory = (options) => { + const chalk6 = {}; + applyOptions(chalk6, options); + chalk6.template = (...arguments_) => chalkTag(chalk6.template, ...arguments_); + Object.setPrototypeOf(chalk6, Chalk.prototype); + Object.setPrototypeOf(chalk6.template, chalk6); + chalk6.template.constructor = () => { + throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead."); + }; + chalk6.template.Instance = ChalkClass; + return chalk6.template; + }; + function Chalk(options) { + return chalkFactory(options); + } + for (const [styleName, style] of Object.entries(ansiStyles)) { + styles[styleName] = { + get() { + const builder = createBuilder(this, createStyler(style.open, style.close, this._styler), this._isEmpty); + Object.defineProperty(this, styleName, { value: builder }); + return builder; + } + }; + } + styles.visible = { + get() { + const builder = createBuilder(this, this._styler, true); + Object.defineProperty(this, "visible", { value: builder }); + return builder; + } + }; + var usedModels = ["rgb", "hex", "keyword", "hsl", "hsv", "hwb", "ansi", "ansi256"]; + for (const model of usedModels) { + styles[model] = { + get() { + const { level } = this; + return function(...arguments_) { + const styler = createStyler(ansiStyles.color[levelMapping[level]][model](...arguments_), ansiStyles.color.close, this._styler); + return createBuilder(this, styler, this._isEmpty); + }; + } + }; + } + for (const model of usedModels) { + const bgModel = "bg" + model[0].toUpperCase() + model.slice(1); + styles[bgModel] = { + get() { + const { level } = this; + return function(...arguments_) { + const styler = createStyler(ansiStyles.bgColor[levelMapping[level]][model](...arguments_), ansiStyles.bgColor.close, this._styler); + return createBuilder(this, styler, this._isEmpty); + }; + } + }; + } + var proto = Object.defineProperties(() => { + }, __spreadProps(__spreadValues({}, styles), { + level: { + enumerable: true, + get() { + return this._generator.level; + }, + set(level) { + this._generator.level = level; + } + } + })); + var createStyler = (open, close, parent) => { + let openAll; + let closeAll; + if (parent === void 0) { + openAll = open; + closeAll = close; + } else { + openAll = parent.openAll + open; + closeAll = close + parent.closeAll; + } + return { + open, + close, + openAll, + closeAll, + parent + }; + }; + var createBuilder = (self, _styler, _isEmpty) => { + const builder = (...arguments_) => { + if (isArray(arguments_[0]) && isArray(arguments_[0].raw)) { + return applyStyle(builder, chalkTag(builder, ...arguments_)); + } + return applyStyle(builder, arguments_.length === 1 ? "" + arguments_[0] : arguments_.join(" ")); + }; + Object.setPrototypeOf(builder, proto); + builder._generator = self; + builder._styler = _styler; + builder._isEmpty = _isEmpty; + return builder; + }; + var applyStyle = (self, string) => { + if (self.level <= 0 || !string) { + return self._isEmpty ? "" : string; + } + let styler = self._styler; + if (styler === void 0) { + return string; + } + const { openAll, closeAll } = styler; + if (string.indexOf("") !== -1) { + while (styler !== void 0) { + string = stringReplaceAll(string, styler.close, styler.open); + styler = styler.parent; + } + } + const lfIndex = string.indexOf("\n"); + if (lfIndex !== -1) { + string = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex); + } + return openAll + string + closeAll; + }; + var template; + var chalkTag = (chalk6, ...strings) => { + const [firstString] = strings; + if (!isArray(firstString) || !isArray(firstString.raw)) { + return strings.join(" "); + } + const arguments_ = strings.slice(1); + const parts = [firstString.raw[0]]; + for (let i = 1; i < firstString.length; i++) { + parts.push(String(arguments_[i - 1]).replace(/[{}\\]/g, "\\$&"), String(firstString.raw[i])); + } + if (template === void 0) { + template = require_templates(); + } + return template(chalk6, parts.join("")); + }; + Object.defineProperties(Chalk.prototype, styles); + var chalk5 = Chalk(); + chalk5.supportsColor = stdoutColor; + chalk5.stderr = Chalk({ level: stderrColor ? stderrColor.level : 0 }); + chalk5.stderr.supportsColor = stderrColor; + module2.exports = chalk5; + } +}); + +// pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/lowercase.js +var require_lowercase = __commonJS({ + "pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/lowercase.js"(exports, module2) { + "use strict"; + function lowercase(str) { + str = String(str); + if (!str) { + return str; + } + return str.toLowerCase(); + } + lowercase.isLowercase = function(str) { + return str && !/[A-Z]+/.test(str); + }; + module2.exports = lowercase; + } +}); + +// pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/uppercase.js +var require_uppercase = __commonJS({ + "pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/uppercase.js"(exports, module2) { + "use strict"; + function uppercase(str) { + str = String(str); + if (!str) { + return str; + } + return str.toUpperCase(); + } + uppercase.isUppercase = function(str) { + return str && !/[a-z]+/.test(str); + }; + module2.exports = uppercase; + } +}); + +// pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/camelcase.js +var require_camelcase = __commonJS({ + "pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/camelcase.js"(exports, module2) { + "use strict"; + var lowercase = require_lowercase(); + var uppercase = require_uppercase(); + var replacing = { + from: /[\-_:\.\s]([a-zA-Z])([a-zA-Z]*)/g, + to: function(match, $1, $2, offset, src) { + const len = $1.length; + return uppercase($1) + $2; + } + }; + function camelcase2(str) { + if (camelcase2.isCamelcase(str)) { + return str; + } + str = String(str).replace(/^[\-_:\.\s]/, ""); + if (!str) { + return str; + } + if (uppercase.isUppercase(str)) { + str = lowercase(str); + } + return lowercase(str[0]) + str.replace(replacing.from, replacing.to).slice(1).replace(/^([A-Z]+)([A-Z])/, (match, $1, $2) => lowercase($1) + $2); + } + camelcase2.isCamelcase = function(str) { + return str && /^[a-zA-Z]+$/.test(str) && lowercase(str[0]) === str[0]; + }; + module2.exports = camelcase2; + } +}); + +// pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/capitalcase.js +var require_capitalcase = __commonJS({ + "pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/capitalcase.js"(exports, module2) { + "use strict"; + var uppercase = require_uppercase(); + function capitalcase(str) { + str = String(str); + if (!str) { + return str; + } + return uppercase(str[0]) + str.slice(1); + } + module2.exports = capitalcase; + } +}); + +// pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/snakecase.js +var require_snakecase = __commonJS({ + "pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/snakecase.js"(exports, module2) { + "use strict"; + var lowercase = require_lowercase(); + var uppercase = require_uppercase(); + var JOINER = "_"; + var replacing = { + from: /([A-Z]+)/g, + to(match, $1, offset, src) { + const prefix = offset === 0 ? "" : JOINER; + const len = $1.length; + if (len === 1) { + return prefix + lowercase($1); + } + const next = src.slice(offset + $1.length); + const isOneWord = uppercase.isUppercase($1) && next[0] === JOINER; + if (isOneWord) { + return prefix + lowercase($1); + } + const replaced = lowercase($1.substr(0, len - 1)) + JOINER + lowercase($1[len - 1]); + return prefix + replaced; + } + }; + function snakecase(str) { + if (snakecase.isSnakecase(str)) { + return str; + } + str = String(str).replace(/[\-.:\s]/g, JOINER); + if (!str) { + return str; + } + if (uppercase.isUppercase(str)) { + str = lowercase(str); + } + return str.replace(replacing.from, replacing.to).replace(/_+/g, "_"); + } + snakecase.isSnakecase = function(str) { + return str && /^[a-z_]+$/.test(str); + }; + module2.exports = snakecase; + } +}); + +// pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/constcase.js +var require_constcase = __commonJS({ + "pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/constcase.js"(exports, module2) { + "use strict"; + var uppercase = require_uppercase(); + var snakecase = require_snakecase(); + function constcase2(str) { + if (constcase2.isConstcase(str)) { + return str; + } + return uppercase(snakecase(str)); + } + constcase2.isConstcase = function(str) { + return str && /^[A-Z_]+$/.test(str); + }; + module2.exports = constcase2; + } +}); + +// pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/cramcase.js +var require_cramcase = __commonJS({ + "pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/cramcase.js"(exports, module2) { + "use strict"; + var snakecase = require_snakecase(); + function cramcase(str) { + return snakecase(str).replace(/_/g, ""); + } + module2.exports = cramcase; + } +}); + +// pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/decapitalcase.js +var require_decapitalcase = __commonJS({ + "pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/decapitalcase.js"(exports, module2) { + "use strict"; + var lowercase = require_lowercase(); + function capitalcase(str) { + str = String(str); + if (!str) { + return str; + } + return lowercase(str[0]) + str.slice(1); + } + module2.exports = capitalcase; + } +}); + +// pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/dotcase.js +var require_dotcase = __commonJS({ + "pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/dotcase.js"(exports, module2) { + "use strict"; + var snakecase = require_snakecase(); + function dotcase(str) { + return snakecase(str).replace(/_/g, "."); + } + module2.exports = dotcase; + } +}); + +// pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/enumcase.js +var require_enumcase = __commonJS({ + "pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/enumcase.js"(exports, module2) { + "use strict"; + var snakecase = require_snakecase(); + function enumcase(str) { + return snakecase(str).replace(/_/g, ":"); + } + module2.exports = enumcase; + } +}); + +// pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/pascalcase.js +var require_pascalcase = __commonJS({ + "pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/pascalcase.js"(exports, module2) { + "use strict"; + var camelcase2 = require_camelcase(); + var capitalcase = require_capitalcase(); + function pascalcase(str) { + return capitalcase(camelcase2(str)); + } + module2.exports = pascalcase; + } +}); + +// pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/pathcase.js +var require_pathcase = __commonJS({ + "pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/pathcase.js"(exports, module2) { + "use strict"; + var snakecase = require_snakecase(); + function pathcase(str) { + return snakecase(str).replace(/_/g, "/"); + } + module2.exports = pathcase; + } +}); + +// pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/trimcase.js +var require_trimcase = __commonJS({ + "pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/trimcase.js"(exports, module2) { + "use strict"; + function trimcase(str) { + return String(str).trim(); + } + module2.exports = trimcase; + } +}); + +// pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/sentencecase.js +var require_sentencecase = __commonJS({ + "pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/sentencecase.js"(exports, module2) { + "use strict"; + var lowercase = require_lowercase(); + var trimcase = require_trimcase(); + var snakecase = require_snakecase(); + var capitalcase = require_capitalcase(); + var JOINER = " "; + function sentencecase(str) { + str = String(str).replace(/^[\-_\.\s]/g, JOINER); + if (!str) { + return str; + } + return capitalcase(snakecase(trimcase(str)).replace(/_/g, JOINER)); + } + module2.exports = sentencecase; + } +}); + +// pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/spacecase.js +var require_spacecase = __commonJS({ + "pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/spacecase.js"(exports, module2) { + "use strict"; + var snakecase = require_snakecase(); + function spacecase(str) { + return snakecase(str).replace(/_/g, " "); + } + module2.exports = spacecase; + } +}); + +// pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/spinalcase.js +var require_spinalcase = __commonJS({ + "pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/spinalcase.js"(exports, module2) { + "use strict"; + var snakecase = require_snakecase(); + function spinalcase2(str) { + return snakecase(str).replace(/_/g, "-"); + } + module2.exports = spinalcase2; + } +}); + +// pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/titlecase.js +var require_titlecase = __commonJS({ + "pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/titlecase.js"(exports, module2) { + "use strict"; + var snakecase = require_snakecase(); + var lowercase = require_lowercase(); + var trimcase = require_trimcase(); + var capitalcase = require_capitalcase(); + var LOWERCASE_WORDS = "a,the,and,or,not,but,for,of".split(","); + function titlecase(str) { + return snakecase(str).split(/_/g).map(trimcase).map(function(word) { + var lower = !!~LOWERCASE_WORDS.indexOf(word); + if (lower) { + return lowercase(word); + } else { + return capitalcase(word); + } + }).join(" "); + } + module2.exports = titlecase; + } +}); + +// pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/index.js +var require_lib = __commonJS({ + "pnp:stringcase-npm-4.3.1-2f1c329337-741a448632.zip/node_modules/stringcase/lib/index.js"(exports, module2) { + "use strict"; + var camelcase2 = require_camelcase(); + var capitalcase = require_capitalcase(); + var constcase2 = require_constcase(); + var cramcase = require_cramcase(); + var decapitalcase = require_decapitalcase(); + var dotcase = require_dotcase(); + var enumcase = require_enumcase(); + var lowercase = require_lowercase(); + var pascalcase = require_pascalcase(); + var pathcase = require_pathcase(); + var sentencecase = require_sentencecase(); + var snakecase = require_snakecase(); + var spacecase = require_spacecase(); + var spinalcase2 = require_spinalcase(); + var titlecase = require_titlecase(); + var trimcase = require_trimcase(); + var uppercase = require_uppercase(); + exports.camelcase = camelcase2; + exports.capitalcase = capitalcase; + exports.constcase = constcase2; + exports.cramcase = cramcase; + exports.decapitalcase = decapitalcase; + exports.dotcase = dotcase; + exports.enumcase = enumcase; + exports.lowercase = lowercase; + exports.pascalcase = pascalcase; + exports.pathcase = pathcase; + exports.sentencecase = sentencecase; + exports.snakecase = snakecase; + exports.spacecase = spacecase; + exports.spinalcase = spinalcase2; + exports.titlecase = titlecase; + exports.trimcase = trimcase; + exports.uppercase = uppercase; + module2.exports = { + camelcase: camelcase2, + capitalcase, + constcase: constcase2, + cramcase, + decapitalcase, + dotcase, + enumcase, + lowercase, + pascalcase, + pathcase, + sentencecase, + snakecase, + spacecase, + spinalcase: spinalcase2, + titlecase, + trimcase, + uppercase + }; + } +}); + +// pnp:fs.realpath-npm-1.0.0-c8f05d8126-99ddea01a7.zip/node_modules/fs.realpath/old.js +var require_old = __commonJS({ + "pnp:fs.realpath-npm-1.0.0-c8f05d8126-99ddea01a7.zip/node_modules/fs.realpath/old.js"(exports) { + var pathModule = require("path"); + var isWindows = process.platform === "win32"; + var fs4 = require("fs"); + var DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG); + function rethrow() { + var callback; + if (DEBUG) { + var backtrace = new Error(); + callback = debugCallback; + } else + callback = missingCallback; + return callback; + function debugCallback(err) { + if (err) { + backtrace.message = err.message; + err = backtrace; + missingCallback(err); + } + } + function missingCallback(err) { + if (err) { + if (process.throwDeprecation) + throw err; + else if (!process.noDeprecation) { + var msg = "fs: missing callback " + (err.stack || err.message); + if (process.traceDeprecation) + console.trace(msg); + else + console.error(msg); + } + } + } + } + function maybeCallback(cb) { + return typeof cb === "function" ? cb : rethrow(); + } + var normalize = pathModule.normalize; + if (isWindows) { + nextPartRe = /(.*?)(?:[\/\\]+|$)/g; + } else { + nextPartRe = /(.*?)(?:[\/]+|$)/g; + } + var nextPartRe; + if (isWindows) { + splitRootRe = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/; + } else { + splitRootRe = /^[\/]*/; + } + var splitRootRe; + exports.realpathSync = function realpathSync(p, cache) { + p = pathModule.resolve(p); + if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { + return cache[p]; + } + var original = p, seenLinks = {}, knownHard = {}; + var pos; + var current; + var base; + var previous; + start(); + function start() { + var m = splitRootRe.exec(p); + pos = m[0].length; + current = m[0]; + base = m[0]; + previous = ""; + if (isWindows && !knownHard[base]) { + fs4.lstatSync(base); + knownHard[base] = true; + } + } + while (pos < p.length) { + nextPartRe.lastIndex = pos; + var result = nextPartRe.exec(p); + previous = current; + current += result[0]; + base = previous + result[1]; + pos = nextPartRe.lastIndex; + if (knownHard[base] || cache && cache[base] === base) { + continue; + } + var resolvedLink; + if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { + resolvedLink = cache[base]; + } else { + var stat = fs4.lstatSync(base); + if (!stat.isSymbolicLink()) { + knownHard[base] = true; + if (cache) + cache[base] = base; + continue; + } + var linkTarget = null; + if (!isWindows) { + var id = stat.dev.toString(32) + ":" + stat.ino.toString(32); + if (seenLinks.hasOwnProperty(id)) { + linkTarget = seenLinks[id]; + } + } + if (linkTarget === null) { + fs4.statSync(base); + linkTarget = fs4.readlinkSync(base); + } + resolvedLink = pathModule.resolve(previous, linkTarget); + if (cache) + cache[base] = resolvedLink; + if (!isWindows) + seenLinks[id] = linkTarget; + } + p = pathModule.resolve(resolvedLink, p.slice(pos)); + start(); + } + if (cache) + cache[original] = p; + return p; + }; + exports.realpath = function realpath(p, cache, cb) { + if (typeof cb !== "function") { + cb = maybeCallback(cache); + cache = null; + } + p = pathModule.resolve(p); + if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { + return process.nextTick(cb.bind(null, null, cache[p])); + } + var original = p, seenLinks = {}, knownHard = {}; + var pos; + var current; + var base; + var previous; + start(); + function start() { + var m = splitRootRe.exec(p); + pos = m[0].length; + current = m[0]; + base = m[0]; + previous = ""; + if (isWindows && !knownHard[base]) { + fs4.lstat(base, function(err) { + if (err) + return cb(err); + knownHard[base] = true; + LOOP(); + }); + } else { + process.nextTick(LOOP); + } + } + function LOOP() { + if (pos >= p.length) { + if (cache) + cache[original] = p; + return cb(null, p); + } + nextPartRe.lastIndex = pos; + var result = nextPartRe.exec(p); + previous = current; + current += result[0]; + base = previous + result[1]; + pos = nextPartRe.lastIndex; + if (knownHard[base] || cache && cache[base] === base) { + return process.nextTick(LOOP); + } + if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { + return gotResolvedLink(cache[base]); + } + return fs4.lstat(base, gotStat); + } + function gotStat(err, stat) { + if (err) + return cb(err); + if (!stat.isSymbolicLink()) { + knownHard[base] = true; + if (cache) + cache[base] = base; + return process.nextTick(LOOP); + } + if (!isWindows) { + var id = stat.dev.toString(32) + ":" + stat.ino.toString(32); + if (seenLinks.hasOwnProperty(id)) { + return gotTarget(null, seenLinks[id], base); + } + } + fs4.stat(base, function(err2) { + if (err2) + return cb(err2); + fs4.readlink(base, function(err3, target) { + if (!isWindows) + seenLinks[id] = target; + gotTarget(err3, target); + }); + }); + } + function gotTarget(err, target, base2) { + if (err) + return cb(err); + var resolvedLink = pathModule.resolve(previous, target); + if (cache) + cache[base2] = resolvedLink; + gotResolvedLink(resolvedLink); + } + function gotResolvedLink(resolvedLink) { + p = pathModule.resolve(resolvedLink, p.slice(pos)); + start(); + } + }; + } +}); + +// pnp:fs.realpath-npm-1.0.0-c8f05d8126-99ddea01a7.zip/node_modules/fs.realpath/index.js +var require_fs = __commonJS({ + "pnp:fs.realpath-npm-1.0.0-c8f05d8126-99ddea01a7.zip/node_modules/fs.realpath/index.js"(exports, module2) { + module2.exports = realpath; + realpath.realpath = realpath; + realpath.sync = realpathSync; + realpath.realpathSync = realpathSync; + realpath.monkeypatch = monkeypatch; + realpath.unmonkeypatch = unmonkeypatch; + var fs4 = require("fs"); + var origRealpath = fs4.realpath; + var origRealpathSync = fs4.realpathSync; + var version2 = process.version; + var ok = /^v[0-5]\./.test(version2); + var old = require_old(); + function newError(er) { + return er && er.syscall === "realpath" && (er.code === "ELOOP" || er.code === "ENOMEM" || er.code === "ENAMETOOLONG"); + } + function realpath(p, cache, cb) { + if (ok) { + return origRealpath(p, cache, cb); + } + if (typeof cache === "function") { + cb = cache; + cache = null; + } + origRealpath(p, cache, function(er, result) { + if (newError(er)) { + old.realpath(p, cache, cb); + } else { + cb(er, result); + } + }); + } + function realpathSync(p, cache) { + if (ok) { + return origRealpathSync(p, cache); + } + try { + return origRealpathSync(p, cache); + } catch (er) { + if (newError(er)) { + return old.realpathSync(p, cache); + } else { + throw er; + } + } + } + function monkeypatch() { + fs4.realpath = realpath; + fs4.realpathSync = realpathSync; + } + function unmonkeypatch() { + fs4.realpath = origRealpath; + fs4.realpathSync = origRealpathSync; + } + } +}); + +// pnp:concat-map-npm-0.0.1-85a921b7ee-902a9f5d89.zip/node_modules/concat-map/index.js +var require_concat_map = __commonJS({ + "pnp:concat-map-npm-0.0.1-85a921b7ee-902a9f5d89.zip/node_modules/concat-map/index.js"(exports, module2) { + module2.exports = function(xs, fn) { + var res = []; + for (var i = 0; i < xs.length; i++) { + var x = fn(xs[i], i); + if (isArray(x)) + res.push.apply(res, x); + else + res.push(x); + } + return res; + }; + var isArray = Array.isArray || function(xs) { + return Object.prototype.toString.call(xs) === "[object Array]"; + }; + } +}); + +// pnp:balanced-match-npm-1.0.0-951a2ad706-9b67bfe558.zip/node_modules/balanced-match/index.js +var require_balanced_match = __commonJS({ + "pnp:balanced-match-npm-1.0.0-951a2ad706-9b67bfe558.zip/node_modules/balanced-match/index.js"(exports, module2) { + "use strict"; + module2.exports = balanced; + function balanced(a, b, str) { + if (a instanceof RegExp) + a = maybeMatch(a, str); + if (b instanceof RegExp) + b = maybeMatch(b, str); + var r = range(a, b, str); + return r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + a.length, r[1]), + post: str.slice(r[1] + b.length) + }; + } + function maybeMatch(reg, str) { + var m = str.match(reg); + return m ? m[0] : null; + } + balanced.range = range; + function range(a, b, str) { + var begs, beg, left, right, result; + var ai = str.indexOf(a); + var bi = str.indexOf(b, ai + 1); + var i = ai; + if (ai >= 0 && bi > 0) { + begs = []; + left = str.length; + while (i >= 0 && !result) { + if (i == ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } else if (begs.length == 1) { + result = [begs.pop(), bi]; + } else { + beg = begs.pop(); + if (beg < left) { + left = beg; + right = bi; + } + bi = str.indexOf(b, i + 1); + } + i = ai < bi && ai >= 0 ? ai : bi; + } + if (begs.length) { + result = [left, right]; + } + } + return result; + } + } +}); + +// pnp:brace-expansion-npm-1.1.11-fb95eb05ad-faf34a7bb0.zip/node_modules/brace-expansion/index.js +var require_brace_expansion = __commonJS({ + "pnp:brace-expansion-npm-1.1.11-fb95eb05ad-faf34a7bb0.zip/node_modules/brace-expansion/index.js"(exports, module2) { + var concatMap = require_concat_map(); + var balanced = require_balanced_match(); + module2.exports = expandTop; + var escSlash = "\0SLASH" + Math.random() + "\0"; + var escOpen = "\0OPEN" + Math.random() + "\0"; + var escClose = "\0CLOSE" + Math.random() + "\0"; + var escComma = "\0COMMA" + Math.random() + "\0"; + var escPeriod = "\0PERIOD" + Math.random() + "\0"; + function numeric(str) { + return parseInt(str, 10) == str ? parseInt(str, 10) : str.charCodeAt(0); + } + function escapeBraces(str) { + return str.split("\\\\").join(escSlash).split("\\{").join(escOpen).split("\\}").join(escClose).split("\\,").join(escComma).split("\\.").join(escPeriod); + } + function unescapeBraces(str) { + return str.split(escSlash).join("\\").split(escOpen).join("{").split(escClose).join("}").split(escComma).join(",").split(escPeriod).join("."); + } + function parseCommaParts(str) { + if (!str) + return [""]; + var parts = []; + var m = balanced("{", "}", str); + if (!m) + return str.split(","); + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(","); + p[p.length - 1] += "{" + body + "}"; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length - 1] += postParts.shift(); + p.push.apply(p, postParts); + } + parts.push.apply(parts, p); + return parts; + } + function expandTop(str) { + if (!str) + return []; + if (str.substr(0, 2) === "{}") { + str = "\\{\\}" + str.substr(2); + } + return expand(escapeBraces(str), true).map(unescapeBraces); + } + function embrace(str) { + return "{" + str + "}"; + } + function isPadded(el) { + return /^-?0\d/.test(el); + } + function lte(i, y) { + return i <= y; + } + function gte(i, y) { + return i >= y; + } + function expand(str, isTop) { + var expansions = []; + var m = balanced("{", "}", str); + if (!m || /\$$/.test(m.pre)) + return [str]; + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(",") >= 0; + if (!isSequence && !isOptions) { + if (m.post.match(/,.*\}/)) { + str = m.pre + "{" + m.body + escClose + m.post; + return expand(str); + } + return [str]; + } + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + n = expand(n[0], false).map(embrace); + if (n.length === 1) { + var post = m.post.length ? expand(m.post, false) : [""]; + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + var pre = m.pre; + var post = m.post.length ? expand(m.post, false) : [""]; + var N; + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length); + var incr = n.length == 3 ? Math.abs(numeric(n[2])) : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + N = []; + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === "\\") + c = ""; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join("0"); + if (i < 0) + c = "-" + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = concatMap(n, function(el) { + return expand(el, false); + }); + } + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + return expansions; + } + } +}); + +// pnp:minimatch-npm-3.0.4-6e76f51c23-66ac295f8a.zip/node_modules/minimatch/minimatch.js +var require_minimatch = __commonJS({ + "pnp:minimatch-npm-3.0.4-6e76f51c23-66ac295f8a.zip/node_modules/minimatch/minimatch.js"(exports, module2) { + module2.exports = minimatch; + minimatch.Minimatch = Minimatch; + var path2 = { sep: "/" }; + try { + path2 = require("path"); + } catch (er) { + } + var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}; + var expand = require_brace_expansion(); + var plTypes = { + "!": { open: "(?:(?!(?:", close: "))[^/]*?)" }, + "?": { open: "(?:", close: ")?" }, + "+": { open: "(?:", close: ")+" }, + "*": { open: "(?:", close: ")*" }, + "@": { open: "(?:", close: ")" } + }; + var qmark = "[^/]"; + var star = qmark + "*?"; + var twoStarDot = "(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?"; + var twoStarNoDot = "(?:(?!(?:\\/|^)\\.).)*?"; + var reSpecials = charSet("().*{}+?[]^$\\!"); + function charSet(s) { + return s.split("").reduce(function(set, c) { + set[c] = true; + return set; + }, {}); + } + var slashSplit = /\/+/; + minimatch.filter = filter; + function filter(pattern, options) { + options = options || {}; + return function(p, i, list) { + return minimatch(p, pattern, options); + }; + } + function ext(a, b) { + a = a || {}; + b = b || {}; + var t = {}; + Object.keys(b).forEach(function(k) { + t[k] = b[k]; + }); + Object.keys(a).forEach(function(k) { + t[k] = a[k]; + }); + return t; + } + minimatch.defaults = function(def) { + if (!def || !Object.keys(def).length) + return minimatch; + var orig = minimatch; + var m = function minimatch2(p, pattern, options) { + return orig.minimatch(p, pattern, ext(def, options)); + }; + m.Minimatch = function Minimatch2(pattern, options) { + return new orig.Minimatch(pattern, ext(def, options)); + }; + return m; + }; + Minimatch.defaults = function(def) { + if (!def || !Object.keys(def).length) + return Minimatch; + return minimatch.defaults(def).Minimatch; + }; + function minimatch(p, pattern, options) { + if (typeof pattern !== "string") { + throw new TypeError("glob pattern string required"); + } + if (!options) + options = {}; + if (!options.nocomment && pattern.charAt(0) === "#") { + return false; + } + if (pattern.trim() === "") + return p === ""; + return new Minimatch(pattern, options).match(p); + } + function Minimatch(pattern, options) { + if (!(this instanceof Minimatch)) { + return new Minimatch(pattern, options); + } + if (typeof pattern !== "string") { + throw new TypeError("glob pattern string required"); + } + if (!options) + options = {}; + pattern = pattern.trim(); + if (path2.sep !== "/") { + pattern = pattern.split(path2.sep).join("/"); + } + this.options = options; + this.set = []; + this.pattern = pattern; + this.regexp = null; + this.negate = false; + this.comment = false; + this.empty = false; + this.make(); + } + Minimatch.prototype.debug = function() { + }; + Minimatch.prototype.make = make; + function make() { + if (this._made) + return; + var pattern = this.pattern; + var options = this.options; + if (!options.nocomment && pattern.charAt(0) === "#") { + this.comment = true; + return; + } + if (!pattern) { + this.empty = true; + return; + } + this.parseNegate(); + var set = this.globSet = this.braceExpand(); + if (options.debug) + this.debug = console.error; + this.debug(this.pattern, set); + set = this.globParts = set.map(function(s) { + return s.split(slashSplit); + }); + this.debug(this.pattern, set); + set = set.map(function(s, si, set2) { + return s.map(this.parse, this); + }, this); + this.debug(this.pattern, set); + set = set.filter(function(s) { + return s.indexOf(false) === -1; + }); + this.debug(this.pattern, set); + this.set = set; + } + Minimatch.prototype.parseNegate = parseNegate; + function parseNegate() { + var pattern = this.pattern; + var negate = false; + var options = this.options; + var negateOffset = 0; + if (options.nonegate) + return; + for (var i = 0, l = pattern.length; i < l && pattern.charAt(i) === "!"; i++) { + negate = !negate; + negateOffset++; + } + if (negateOffset) + this.pattern = pattern.substr(negateOffset); + this.negate = negate; + } + minimatch.braceExpand = function(pattern, options) { + return braceExpand(pattern, options); + }; + Minimatch.prototype.braceExpand = braceExpand; + function braceExpand(pattern, options) { + if (!options) { + if (this instanceof Minimatch) { + options = this.options; + } else { + options = {}; + } + } + pattern = typeof pattern === "undefined" ? this.pattern : pattern; + if (typeof pattern === "undefined") { + throw new TypeError("undefined pattern"); + } + if (options.nobrace || !pattern.match(/\{.*\}/)) { + return [pattern]; + } + return expand(pattern); + } + Minimatch.prototype.parse = parse; + var SUBPARSE = {}; + function parse(pattern, isSub) { + if (pattern.length > 1024 * 64) { + throw new TypeError("pattern is too long"); + } + var options = this.options; + if (!options.noglobstar && pattern === "**") + return GLOBSTAR; + if (pattern === "") + return ""; + var re = ""; + var hasMagic = !!options.nocase; + var escaping = false; + var patternListStack = []; + var negativeLists = []; + var stateChar; + var inClass = false; + var reClassStart = -1; + var classStart = -1; + var patternStart = pattern.charAt(0) === "." ? "" : options.dot ? "(?!(?:^|\\/)\\.{1,2}(?:$|\\/))" : "(?!\\.)"; + var self = this; + function clearStateChar() { + if (stateChar) { + switch (stateChar) { + case "*": + re += star; + hasMagic = true; + break; + case "?": + re += qmark; + hasMagic = true; + break; + default: + re += "\\" + stateChar; + break; + } + self.debug("clearStateChar %j %j", stateChar, re); + stateChar = false; + } + } + for (var i = 0, len = pattern.length, c; i < len && (c = pattern.charAt(i)); i++) { + this.debug("%s %s %s %j", pattern, i, re, c); + if (escaping && reSpecials[c]) { + re += "\\" + c; + escaping = false; + continue; + } + switch (c) { + case "/": + return false; + case "\\": + clearStateChar(); + escaping = true; + continue; + case "?": + case "*": + case "+": + case "@": + case "!": + this.debug("%s %s %s %j <-- stateChar", pattern, i, re, c); + if (inClass) { + this.debug(" in class"); + if (c === "!" && i === classStart + 1) + c = "^"; + re += c; + continue; + } + self.debug("call clearStateChar %j", stateChar); + clearStateChar(); + stateChar = c; + if (options.noext) + clearStateChar(); + continue; + case "(": + if (inClass) { + re += "("; + continue; + } + if (!stateChar) { + re += "\\("; + continue; + } + patternListStack.push({ + type: stateChar, + start: i - 1, + reStart: re.length, + open: plTypes[stateChar].open, + close: plTypes[stateChar].close + }); + re += stateChar === "!" ? "(?:(?!(?:" : "(?:"; + this.debug("plType %j %j", stateChar, re); + stateChar = false; + continue; + case ")": + if (inClass || !patternListStack.length) { + re += "\\)"; + continue; + } + clearStateChar(); + hasMagic = true; + var pl = patternListStack.pop(); + re += pl.close; + if (pl.type === "!") { + negativeLists.push(pl); + } + pl.reEnd = re.length; + continue; + case "|": + if (inClass || !patternListStack.length || escaping) { + re += "\\|"; + escaping = false; + continue; + } + clearStateChar(); + re += "|"; + continue; + case "[": + clearStateChar(); + if (inClass) { + re += "\\" + c; + continue; + } + inClass = true; + classStart = i; + reClassStart = re.length; + re += c; + continue; + case "]": + if (i === classStart + 1 || !inClass) { + re += "\\" + c; + escaping = false; + continue; + } + if (inClass) { + var cs = pattern.substring(classStart + 1, i); + try { + RegExp("[" + cs + "]"); + } catch (er) { + var sp = this.parse(cs, SUBPARSE); + re = re.substr(0, reClassStart) + "\\[" + sp[0] + "\\]"; + hasMagic = hasMagic || sp[1]; + inClass = false; + continue; + } + } + hasMagic = true; + inClass = false; + re += c; + continue; + default: + clearStateChar(); + if (escaping) { + escaping = false; + } else if (reSpecials[c] && !(c === "^" && inClass)) { + re += "\\"; + } + re += c; + } + } + if (inClass) { + cs = pattern.substr(classStart + 1); + sp = this.parse(cs, SUBPARSE); + re = re.substr(0, reClassStart) + "\\[" + sp[0]; + hasMagic = hasMagic || sp[1]; + } + for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { + var tail = re.slice(pl.reStart + pl.open.length); + this.debug("setting tail", re, pl); + tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function(_, $1, $2) { + if (!$2) { + $2 = "\\"; + } + return $1 + $1 + $2 + "|"; + }); + this.debug("tail=%j\n %s", tail, tail, pl, re); + var t = pl.type === "*" ? star : pl.type === "?" ? qmark : "\\" + pl.type; + hasMagic = true; + re = re.slice(0, pl.reStart) + t + "\\(" + tail; + } + clearStateChar(); + if (escaping) { + re += "\\\\"; + } + var addPatternStart = false; + switch (re.charAt(0)) { + case ".": + case "[": + case "(": + addPatternStart = true; + } + for (var n = negativeLists.length - 1; n > -1; n--) { + var nl = negativeLists[n]; + var nlBefore = re.slice(0, nl.reStart); + var nlFirst = re.slice(nl.reStart, nl.reEnd - 8); + var nlLast = re.slice(nl.reEnd - 8, nl.reEnd); + var nlAfter = re.slice(nl.reEnd); + nlLast += nlAfter; + var openParensBefore = nlBefore.split("(").length - 1; + var cleanAfter = nlAfter; + for (i = 0; i < openParensBefore; i++) { + cleanAfter = cleanAfter.replace(/\)[+*?]?/, ""); + } + nlAfter = cleanAfter; + var dollar = ""; + if (nlAfter === "" && isSub !== SUBPARSE) { + dollar = "$"; + } + var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast; + re = newRe; + } + if (re !== "" && hasMagic) { + re = "(?=.)" + re; + } + if (addPatternStart) { + re = patternStart + re; + } + if (isSub === SUBPARSE) { + return [re, hasMagic]; + } + if (!hasMagic) { + return globUnescape(pattern); + } + var flags = options.nocase ? "i" : ""; + try { + var regExp = new RegExp("^" + re + "$", flags); + } catch (er) { + return new RegExp("$."); + } + regExp._glob = pattern; + regExp._src = re; + return regExp; + } + minimatch.makeRe = function(pattern, options) { + return new Minimatch(pattern, options || {}).makeRe(); + }; + Minimatch.prototype.makeRe = makeRe; + function makeRe() { + if (this.regexp || this.regexp === false) + return this.regexp; + var set = this.set; + if (!set.length) { + this.regexp = false; + return this.regexp; + } + var options = this.options; + var twoStar = options.noglobstar ? star : options.dot ? twoStarDot : twoStarNoDot; + var flags = options.nocase ? "i" : ""; + var re = set.map(function(pattern) { + return pattern.map(function(p) { + return p === GLOBSTAR ? twoStar : typeof p === "string" ? regExpEscape(p) : p._src; + }).join("\\/"); + }).join("|"); + re = "^(?:" + re + ")$"; + if (this.negate) + re = "^(?!" + re + ").*$"; + try { + this.regexp = new RegExp(re, flags); + } catch (ex) { + this.regexp = false; + } + return this.regexp; + } + minimatch.match = function(list, pattern, options) { + options = options || {}; + var mm = new Minimatch(pattern, options); + list = list.filter(function(f) { + return mm.match(f); + }); + if (mm.options.nonull && !list.length) { + list.push(pattern); + } + return list; + }; + Minimatch.prototype.match = match; + function match(f, partial) { + this.debug("match", f, this.pattern); + if (this.comment) + return false; + if (this.empty) + return f === ""; + if (f === "/" && partial) + return true; + var options = this.options; + if (path2.sep !== "/") { + f = f.split(path2.sep).join("/"); + } + f = f.split(slashSplit); + this.debug(this.pattern, "split", f); + var set = this.set; + this.debug(this.pattern, "set", set); + var filename; + var i; + for (i = f.length - 1; i >= 0; i--) { + filename = f[i]; + if (filename) + break; + } + for (i = 0; i < set.length; i++) { + var pattern = set[i]; + var file = f; + if (options.matchBase && pattern.length === 1) { + file = [filename]; + } + var hit = this.matchOne(file, pattern, partial); + if (hit) { + if (options.flipNegate) + return true; + return !this.negate; + } + } + if (options.flipNegate) + return false; + return this.negate; + } + Minimatch.prototype.matchOne = function(file, pattern, partial) { + var options = this.options; + this.debug("matchOne", { "this": this, file, pattern }); + this.debug("matchOne", file.length, pattern.length); + for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) { + this.debug("matchOne loop"); + var p = pattern[pi]; + var f = file[fi]; + this.debug(pattern, p, f); + if (p === false) + return false; + if (p === GLOBSTAR) { + this.debug("GLOBSTAR", [pattern, p, f]); + var fr = fi; + var pr = pi + 1; + if (pr === pl) { + this.debug("** at the end"); + for (; fi < fl; fi++) { + if (file[fi] === "." || file[fi] === ".." || !options.dot && file[fi].charAt(0) === ".") + return false; + } + return true; + } + while (fr < fl) { + var swallowee = file[fr]; + this.debug("\nglobstar while", file, fr, pattern, pr, swallowee); + if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { + this.debug("globstar found match!", fr, fl, swallowee); + return true; + } else { + if (swallowee === "." || swallowee === ".." || !options.dot && swallowee.charAt(0) === ".") { + this.debug("dot detected!", file, fr, pattern, pr); + break; + } + this.debug("globstar swallow a segment, and continue"); + fr++; + } + } + if (partial) { + this.debug("\n>>> no match, partial?", file, fr, pattern, pr); + if (fr === fl) + return true; + } + return false; + } + var hit; + if (typeof p === "string") { + if (options.nocase) { + hit = f.toLowerCase() === p.toLowerCase(); + } else { + hit = f === p; + } + this.debug("string match", p, f, hit); + } else { + hit = f.match(p); + this.debug("pattern match", p, f, hit); + } + if (!hit) + return false; + } + if (fi === fl && pi === pl) { + return true; + } else if (fi === fl) { + return partial; + } else if (pi === pl) { + var emptyFileEnd = fi === fl - 1 && file[fi] === ""; + return emptyFileEnd; + } + throw new Error("wtf?"); + }; + function globUnescape(s) { + return s.replace(/\\(.)/g, "$1"); + } + function regExpEscape(s) { + return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + } + } +}); + +// pnp:inherits-npm-2.0.4-c66b3957a0-4a48a73384.zip/node_modules/inherits/inherits_browser.js +var require_inherits_browser = __commonJS({ + "pnp:inherits-npm-2.0.4-c66b3957a0-4a48a73384.zip/node_modules/inherits/inherits_browser.js"(exports, module2) { + if (typeof Object.create === "function") { + module2.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + } + }; + } else { + module2.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor; + var TempCtor = function() { + }; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + } + }; + } + } +}); + +// pnp:inherits-npm-2.0.4-c66b3957a0-4a48a73384.zip/node_modules/inherits/inherits.js +var require_inherits = __commonJS({ + "pnp:inherits-npm-2.0.4-c66b3957a0-4a48a73384.zip/node_modules/inherits/inherits.js"(exports, module2) { + try { + util = require("util"); + if (typeof util.inherits !== "function") + throw ""; + module2.exports = util.inherits; + } catch (e) { + module2.exports = require_inherits_browser(); + } + var util; + } +}); + +// pnp:path-is-absolute-npm-1.0.1-31bc695ffd-060840f92c.zip/node_modules/path-is-absolute/index.js +var require_path_is_absolute = __commonJS({ + "pnp:path-is-absolute-npm-1.0.1-31bc695ffd-060840f92c.zip/node_modules/path-is-absolute/index.js"(exports, module2) { + "use strict"; + function posix(path2) { + return path2.charAt(0) === "/"; + } + function win32(path2) { + var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; + var result = splitDeviceRe.exec(path2); + var device = result[1] || ""; + var isUnc = Boolean(device && device.charAt(1) !== ":"); + return Boolean(result[2] || isUnc); + } + module2.exports = process.platform === "win32" ? win32 : posix; + module2.exports.posix = posix; + module2.exports.win32 = win32; + } +}); + +// pnp:glob-npm-7.1.7-5698ad9c48-b61f48973b.zip/node_modules/glob/common.js +var require_common = __commonJS({ + "pnp:glob-npm-7.1.7-5698ad9c48-b61f48973b.zip/node_modules/glob/common.js"(exports) { + exports.setopts = setopts; + exports.ownProp = ownProp; + exports.makeAbs = makeAbs; + exports.finish = finish; + exports.mark = mark; + exports.isIgnored = isIgnored; + exports.childrenIgnored = childrenIgnored; + function ownProp(obj, field) { + return Object.prototype.hasOwnProperty.call(obj, field); + } + var path2 = require("path"); + var minimatch = require_minimatch(); + var isAbsolute = require_path_is_absolute(); + var Minimatch = minimatch.Minimatch; + function alphasort(a, b) { + return a.localeCompare(b, "en"); + } + function setupIgnores(self, options) { + self.ignore = options.ignore || []; + if (!Array.isArray(self.ignore)) + self.ignore = [self.ignore]; + if (self.ignore.length) { + self.ignore = self.ignore.map(ignoreMap); + } + } + function ignoreMap(pattern) { + var gmatcher = null; + if (pattern.slice(-3) === "/**") { + var gpattern = pattern.replace(/(\/\*\*)+$/, ""); + gmatcher = new Minimatch(gpattern, { dot: true }); + } + return { + matcher: new Minimatch(pattern, { dot: true }), + gmatcher + }; + } + function setopts(self, pattern, options) { + if (!options) + options = {}; + if (options.matchBase && pattern.indexOf("/") === -1) { + if (options.noglobstar) { + throw new Error("base matching requires globstar"); + } + pattern = "**/" + pattern; + } + self.silent = !!options.silent; + self.pattern = pattern; + self.strict = options.strict !== false; + self.realpath = !!options.realpath; + self.realpathCache = options.realpathCache || Object.create(null); + self.follow = !!options.follow; + self.dot = !!options.dot; + self.mark = !!options.mark; + self.nodir = !!options.nodir; + if (self.nodir) + self.mark = true; + self.sync = !!options.sync; + self.nounique = !!options.nounique; + self.nonull = !!options.nonull; + self.nosort = !!options.nosort; + self.nocase = !!options.nocase; + self.stat = !!options.stat; + self.noprocess = !!options.noprocess; + self.absolute = !!options.absolute; + self.maxLength = options.maxLength || Infinity; + self.cache = options.cache || Object.create(null); + self.statCache = options.statCache || Object.create(null); + self.symlinks = options.symlinks || Object.create(null); + setupIgnores(self, options); + self.changedCwd = false; + var cwd = process.cwd(); + if (!ownProp(options, "cwd")) + self.cwd = cwd; + else { + self.cwd = path2.resolve(options.cwd); + self.changedCwd = self.cwd !== cwd; + } + self.root = options.root || path2.resolve(self.cwd, "/"); + self.root = path2.resolve(self.root); + if (process.platform === "win32") + self.root = self.root.replace(/\\/g, "/"); + self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd); + if (process.platform === "win32") + self.cwdAbs = self.cwdAbs.replace(/\\/g, "/"); + self.nomount = !!options.nomount; + options.nonegate = true; + options.nocomment = true; + self.minimatch = new Minimatch(pattern, options); + self.options = self.minimatch.options; + } + function finish(self) { + var nou = self.nounique; + var all = nou ? [] : Object.create(null); + for (var i = 0, l = self.matches.length; i < l; i++) { + var matches = self.matches[i]; + if (!matches || Object.keys(matches).length === 0) { + if (self.nonull) { + var literal = self.minimatch.globSet[i]; + if (nou) + all.push(literal); + else + all[literal] = true; + } + } else { + var m = Object.keys(matches); + if (nou) + all.push.apply(all, m); + else + m.forEach(function(m2) { + all[m2] = true; + }); + } + } + if (!nou) + all = Object.keys(all); + if (!self.nosort) + all = all.sort(alphasort); + if (self.mark) { + for (var i = 0; i < all.length; i++) { + all[i] = self._mark(all[i]); + } + if (self.nodir) { + all = all.filter(function(e) { + var notDir = !/\/$/.test(e); + var c = self.cache[e] || self.cache[makeAbs(self, e)]; + if (notDir && c) + notDir = c !== "DIR" && !Array.isArray(c); + return notDir; + }); + } + } + if (self.ignore.length) + all = all.filter(function(m2) { + return !isIgnored(self, m2); + }); + self.found = all; + } + function mark(self, p) { + var abs = makeAbs(self, p); + var c = self.cache[abs]; + var m = p; + if (c) { + var isDir = c === "DIR" || Array.isArray(c); + var slash = p.slice(-1) === "/"; + if (isDir && !slash) + m += "/"; + else if (!isDir && slash) + m = m.slice(0, -1); + if (m !== p) { + var mabs = makeAbs(self, m); + self.statCache[mabs] = self.statCache[abs]; + self.cache[mabs] = self.cache[abs]; + } + } + return m; + } + function makeAbs(self, f) { + var abs = f; + if (f.charAt(0) === "/") { + abs = path2.join(self.root, f); + } else if (isAbsolute(f) || f === "") { + abs = f; + } else if (self.changedCwd) { + abs = path2.resolve(self.cwd, f); + } else { + abs = path2.resolve(f); + } + if (process.platform === "win32") + abs = abs.replace(/\\/g, "/"); + return abs; + } + function isIgnored(self, path3) { + if (!self.ignore.length) + return false; + return self.ignore.some(function(item) { + return item.matcher.match(path3) || !!(item.gmatcher && item.gmatcher.match(path3)); + }); + } + function childrenIgnored(self, path3) { + if (!self.ignore.length) + return false; + return self.ignore.some(function(item) { + return !!(item.gmatcher && item.gmatcher.match(path3)); + }); + } + } +}); + +// pnp:glob-npm-7.1.7-5698ad9c48-b61f48973b.zip/node_modules/glob/sync.js +var require_sync = __commonJS({ + "pnp:glob-npm-7.1.7-5698ad9c48-b61f48973b.zip/node_modules/glob/sync.js"(exports, module2) { + module2.exports = globSync; + globSync.GlobSync = GlobSync; + var fs4 = require("fs"); + var rp = require_fs(); + var minimatch = require_minimatch(); + var Minimatch = minimatch.Minimatch; + var Glob2 = require_glob().Glob; + var util = require("util"); + var path2 = require("path"); + var assert = require("assert"); + var isAbsolute = require_path_is_absolute(); + var common = require_common(); + var setopts = common.setopts; + var ownProp = common.ownProp; + var childrenIgnored = common.childrenIgnored; + var isIgnored = common.isIgnored; + function globSync(pattern, options) { + if (typeof options === "function" || arguments.length === 3) + throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167"); + return new GlobSync(pattern, options).found; + } + function GlobSync(pattern, options) { + if (!pattern) + throw new Error("must provide pattern"); + if (typeof options === "function" || arguments.length === 3) + throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167"); + if (!(this instanceof GlobSync)) + return new GlobSync(pattern, options); + setopts(this, pattern, options); + if (this.noprocess) + return this; + var n = this.minimatch.set.length; + this.matches = new Array(n); + for (var i = 0; i < n; i++) { + this._process(this.minimatch.set[i], i, false); + } + this._finish(); + } + GlobSync.prototype._finish = function() { + assert(this instanceof GlobSync); + if (this.realpath) { + var self = this; + this.matches.forEach(function(matchset, index) { + var set = self.matches[index] = Object.create(null); + for (var p in matchset) { + try { + p = self._makeAbs(p); + var real = rp.realpathSync(p, self.realpathCache); + set[real] = true; + } catch (er) { + if (er.syscall === "stat") + set[self._makeAbs(p)] = true; + else + throw er; + } + } + }); + } + common.finish(this); + }; + GlobSync.prototype._process = function(pattern, index, inGlobStar) { + assert(this instanceof GlobSync); + var n = 0; + while (typeof pattern[n] === "string") { + n++; + } + var prefix; + switch (n) { + case pattern.length: + this._processSimple(pattern.join("/"), index); + return; + case 0: + prefix = null; + break; + default: + prefix = pattern.slice(0, n).join("/"); + break; + } + var remain = pattern.slice(n); + var read; + if (prefix === null) + read = "."; + else if (isAbsolute(prefix) || isAbsolute(pattern.join("/"))) { + if (!prefix || !isAbsolute(prefix)) + prefix = "/" + prefix; + read = prefix; + } else + read = prefix; + var abs = this._makeAbs(read); + if (childrenIgnored(this, read)) + return; + var isGlobStar = remain[0] === minimatch.GLOBSTAR; + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar); + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar); + }; + GlobSync.prototype._processReaddir = function(prefix, read, abs, remain, index, inGlobStar) { + var entries = this._readdir(abs, inGlobStar); + if (!entries) + return; + var pn = remain[0]; + var negate = !!this.minimatch.negate; + var rawGlob = pn._glob; + var dotOk = this.dot || rawGlob.charAt(0) === "."; + var matchedEntries = []; + for (var i = 0; i < entries.length; i++) { + var e = entries[i]; + if (e.charAt(0) !== "." || dotOk) { + var m; + if (negate && !prefix) { + m = !e.match(pn); + } else { + m = e.match(pn); + } + if (m) + matchedEntries.push(e); + } + } + var len = matchedEntries.length; + if (len === 0) + return; + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null); + for (var i = 0; i < len; i++) { + var e = matchedEntries[i]; + if (prefix) { + if (prefix.slice(-1) !== "/") + e = prefix + "/" + e; + else + e = prefix + e; + } + if (e.charAt(0) === "/" && !this.nomount) { + e = path2.join(this.root, e); + } + this._emitMatch(index, e); + } + return; + } + remain.shift(); + for (var i = 0; i < len; i++) { + var e = matchedEntries[i]; + var newPattern; + if (prefix) + newPattern = [prefix, e]; + else + newPattern = [e]; + this._process(newPattern.concat(remain), index, inGlobStar); + } + }; + GlobSync.prototype._emitMatch = function(index, e) { + if (isIgnored(this, e)) + return; + var abs = this._makeAbs(e); + if (this.mark) + e = this._mark(e); + if (this.absolute) { + e = abs; + } + if (this.matches[index][e]) + return; + if (this.nodir) { + var c = this.cache[abs]; + if (c === "DIR" || Array.isArray(c)) + return; + } + this.matches[index][e] = true; + if (this.stat) + this._stat(e); + }; + GlobSync.prototype._readdirInGlobStar = function(abs) { + if (this.follow) + return this._readdir(abs, false); + var entries; + var lstat; + var stat; + try { + lstat = fs4.lstatSync(abs); + } catch (er) { + if (er.code === "ENOENT") { + return null; + } + } + var isSym = lstat && lstat.isSymbolicLink(); + this.symlinks[abs] = isSym; + if (!isSym && lstat && !lstat.isDirectory()) + this.cache[abs] = "FILE"; + else + entries = this._readdir(abs, false); + return entries; + }; + GlobSync.prototype._readdir = function(abs, inGlobStar) { + var entries; + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs); + if (ownProp(this.cache, abs)) { + var c = this.cache[abs]; + if (!c || c === "FILE") + return null; + if (Array.isArray(c)) + return c; + } + try { + return this._readdirEntries(abs, fs4.readdirSync(abs)); + } catch (er) { + this._readdirError(abs, er); + return null; + } + }; + GlobSync.prototype._readdirEntries = function(abs, entries) { + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i++) { + var e = entries[i]; + if (abs === "/") + e = abs + e; + else + e = abs + "/" + e; + this.cache[e] = true; + } + } + this.cache[abs] = entries; + return entries; + }; + GlobSync.prototype._readdirError = function(f, er) { + switch (er.code) { + case "ENOTSUP": + case "ENOTDIR": + var abs = this._makeAbs(f); + this.cache[abs] = "FILE"; + if (abs === this.cwdAbs) { + var error = new Error(er.code + " invalid cwd " + this.cwd); + error.path = this.cwd; + error.code = er.code; + throw error; + } + break; + case "ENOENT": + case "ELOOP": + case "ENAMETOOLONG": + case "UNKNOWN": + this.cache[this._makeAbs(f)] = false; + break; + default: + this.cache[this._makeAbs(f)] = false; + if (this.strict) + throw er; + if (!this.silent) + console.error("glob error", er); + break; + } + }; + GlobSync.prototype._processGlobStar = function(prefix, read, abs, remain, index, inGlobStar) { + var entries = this._readdir(abs, inGlobStar); + if (!entries) + return; + var remainWithoutGlobStar = remain.slice(1); + var gspref = prefix ? [prefix] : []; + var noGlobStar = gspref.concat(remainWithoutGlobStar); + this._process(noGlobStar, index, false); + var len = entries.length; + var isSym = this.symlinks[abs]; + if (isSym && inGlobStar) + return; + for (var i = 0; i < len; i++) { + var e = entries[i]; + if (e.charAt(0) === "." && !this.dot) + continue; + var instead = gspref.concat(entries[i], remainWithoutGlobStar); + this._process(instead, index, true); + var below = gspref.concat(entries[i], remain); + this._process(below, index, true); + } + }; + GlobSync.prototype._processSimple = function(prefix, index) { + var exists = this._stat(prefix); + if (!this.matches[index]) + this.matches[index] = Object.create(null); + if (!exists) + return; + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix); + if (prefix.charAt(0) === "/") { + prefix = path2.join(this.root, prefix); + } else { + prefix = path2.resolve(this.root, prefix); + if (trail) + prefix += "/"; + } + } + if (process.platform === "win32") + prefix = prefix.replace(/\\/g, "/"); + this._emitMatch(index, prefix); + }; + GlobSync.prototype._stat = function(f) { + var abs = this._makeAbs(f); + var needDir = f.slice(-1) === "/"; + if (f.length > this.maxLength) + return false; + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs]; + if (Array.isArray(c)) + c = "DIR"; + if (!needDir || c === "DIR") + return c; + if (needDir && c === "FILE") + return false; + } + var exists; + var stat = this.statCache[abs]; + if (!stat) { + var lstat; + try { + lstat = fs4.lstatSync(abs); + } catch (er) { + if (er && (er.code === "ENOENT" || er.code === "ENOTDIR")) { + this.statCache[abs] = false; + return false; + } + } + if (lstat && lstat.isSymbolicLink()) { + try { + stat = fs4.statSync(abs); + } catch (er) { + stat = lstat; + } + } else { + stat = lstat; + } + } + this.statCache[abs] = stat; + var c = true; + if (stat) + c = stat.isDirectory() ? "DIR" : "FILE"; + this.cache[abs] = this.cache[abs] || c; + if (needDir && c === "FILE") + return false; + return c; + }; + GlobSync.prototype._mark = function(p) { + return common.mark(this, p); + }; + GlobSync.prototype._makeAbs = function(f) { + return common.makeAbs(this, f); + }; + } +}); + +// pnp:wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip/node_modules/wrappy/wrappy.js +var require_wrappy = __commonJS({ + "pnp:wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip/node_modules/wrappy/wrappy.js"(exports, module2) { + module2.exports = wrappy; + function wrappy(fn, cb) { + if (fn && cb) + return wrappy(fn)(cb); + if (typeof fn !== "function") + throw new TypeError("need wrapper function"); + Object.keys(fn).forEach(function(k) { + wrapper[k] = fn[k]; + }); + return wrapper; + function wrapper() { + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + var ret = fn.apply(this, args); + var cb2 = args[args.length - 1]; + if (typeof ret === "function" && ret !== cb2) { + Object.keys(cb2).forEach(function(k) { + ret[k] = cb2[k]; + }); + } + return ret; + } + } + } +}); + +// pnp:once-npm-1.4.0-ccf03ef07a-cd0a885013.zip/node_modules/once/once.js +var require_once = __commonJS({ + "pnp:once-npm-1.4.0-ccf03ef07a-cd0a885013.zip/node_modules/once/once.js"(exports, module2) { + var wrappy = require_wrappy(); + module2.exports = wrappy(once); + module2.exports.strict = wrappy(onceStrict); + once.proto = once(function() { + Object.defineProperty(Function.prototype, "once", { + value: function() { + return once(this); + }, + configurable: true + }); + Object.defineProperty(Function.prototype, "onceStrict", { + value: function() { + return onceStrict(this); + }, + configurable: true + }); + }); + function once(fn) { + var f = function() { + if (f.called) + return f.value; + f.called = true; + return f.value = fn.apply(this, arguments); + }; + f.called = false; + return f; + } + function onceStrict(fn) { + var f = function() { + if (f.called) + throw new Error(f.onceError); + f.called = true; + return f.value = fn.apply(this, arguments); + }; + var name = fn.name || "Function wrapped with `once`"; + f.onceError = name + " shouldn't be called more than once"; + f.called = false; + return f; + } + } +}); + +// pnp:inflight-npm-1.0.6-ccedb4b908-f4f76aa072.zip/node_modules/inflight/inflight.js +var require_inflight = __commonJS({ + "pnp:inflight-npm-1.0.6-ccedb4b908-f4f76aa072.zip/node_modules/inflight/inflight.js"(exports, module2) { + var wrappy = require_wrappy(); + var reqs = Object.create(null); + var once = require_once(); + module2.exports = wrappy(inflight); + function inflight(key, cb) { + if (reqs[key]) { + reqs[key].push(cb); + return null; + } else { + reqs[key] = [cb]; + return makeres(key); + } + } + function makeres(key) { + return once(function RES() { + var cbs = reqs[key]; + var len = cbs.length; + var args = slice(arguments); + try { + for (var i = 0; i < len; i++) { + cbs[i].apply(null, args); + } + } finally { + if (cbs.length > len) { + cbs.splice(0, len); + process.nextTick(function() { + RES.apply(null, args); + }); + } else { + delete reqs[key]; + } + } + }); + } + function slice(args) { + var length = args.length; + var array = []; + for (var i = 0; i < length; i++) + array[i] = args[i]; + return array; + } + } +}); + +// pnp:glob-npm-7.1.7-5698ad9c48-b61f48973b.zip/node_modules/glob/glob.js +var require_glob = __commonJS({ + "pnp:glob-npm-7.1.7-5698ad9c48-b61f48973b.zip/node_modules/glob/glob.js"(exports, module2) { + module2.exports = glob2; + var fs4 = require("fs"); + var rp = require_fs(); + var minimatch = require_minimatch(); + var Minimatch = minimatch.Minimatch; + var inherits = require_inherits(); + var EE = require("events").EventEmitter; + var path2 = require("path"); + var assert = require("assert"); + var isAbsolute = require_path_is_absolute(); + var globSync = require_sync(); + var common = require_common(); + var setopts = common.setopts; + var ownProp = common.ownProp; + var inflight = require_inflight(); + var util = require("util"); + var childrenIgnored = common.childrenIgnored; + var isIgnored = common.isIgnored; + var once = require_once(); + function glob2(pattern, options, cb) { + if (typeof options === "function") + cb = options, options = {}; + if (!options) + options = {}; + if (options.sync) { + if (cb) + throw new TypeError("callback provided to sync glob"); + return globSync(pattern, options); + } + return new Glob2(pattern, options, cb); + } + glob2.sync = globSync; + var GlobSync = glob2.GlobSync = globSync.GlobSync; + glob2.glob = glob2; + function extend(origin, add) { + if (add === null || typeof add !== "object") { + return origin; + } + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; + } + glob2.hasMagic = function(pattern, options_) { + var options = extend({}, options_); + options.noprocess = true; + var g = new Glob2(pattern, options); + var set = g.minimatch.set; + if (!pattern) + return false; + if (set.length > 1) + return true; + for (var j = 0; j < set[0].length; j++) { + if (typeof set[0][j] !== "string") + return true; + } + return false; + }; + glob2.Glob = Glob2; + inherits(Glob2, EE); + function Glob2(pattern, options, cb) { + if (typeof options === "function") { + cb = options; + options = null; + } + if (options && options.sync) { + if (cb) + throw new TypeError("callback provided to sync glob"); + return new GlobSync(pattern, options); + } + if (!(this instanceof Glob2)) + return new Glob2(pattern, options, cb); + setopts(this, pattern, options); + this._didRealPath = false; + var n = this.minimatch.set.length; + this.matches = new Array(n); + if (typeof cb === "function") { + cb = once(cb); + this.on("error", cb); + this.on("end", function(matches) { + cb(null, matches); + }); + } + var self = this; + this._processing = 0; + this._emitQueue = []; + this._processQueue = []; + this.paused = false; + if (this.noprocess) + return this; + if (n === 0) + return done(); + var sync = true; + for (var i = 0; i < n; i++) { + this._process(this.minimatch.set[i], i, false, done); + } + sync = false; + function done() { + --self._processing; + if (self._processing <= 0) { + if (sync) { + process.nextTick(function() { + self._finish(); + }); + } else { + self._finish(); + } + } + } + } + Glob2.prototype._finish = function() { + assert(this instanceof Glob2); + if (this.aborted) + return; + if (this.realpath && !this._didRealpath) + return this._realpath(); + common.finish(this); + this.emit("end", this.found); + }; + Glob2.prototype._realpath = function() { + if (this._didRealpath) + return; + this._didRealpath = true; + var n = this.matches.length; + if (n === 0) + return this._finish(); + var self = this; + for (var i = 0; i < this.matches.length; i++) + this._realpathSet(i, next); + function next() { + if (--n === 0) + self._finish(); + } + }; + Glob2.prototype._realpathSet = function(index, cb) { + var matchset = this.matches[index]; + if (!matchset) + return cb(); + var found = Object.keys(matchset); + var self = this; + var n = found.length; + if (n === 0) + return cb(); + var set = this.matches[index] = Object.create(null); + found.forEach(function(p, i) { + p = self._makeAbs(p); + rp.realpath(p, self.realpathCache, function(er, real) { + if (!er) + set[real] = true; + else if (er.syscall === "stat") + set[p] = true; + else + self.emit("error", er); + if (--n === 0) { + self.matches[index] = set; + cb(); + } + }); + }); + }; + Glob2.prototype._mark = function(p) { + return common.mark(this, p); + }; + Glob2.prototype._makeAbs = function(f) { + return common.makeAbs(this, f); + }; + Glob2.prototype.abort = function() { + this.aborted = true; + this.emit("abort"); + }; + Glob2.prototype.pause = function() { + if (!this.paused) { + this.paused = true; + this.emit("pause"); + } + }; + Glob2.prototype.resume = function() { + if (this.paused) { + this.emit("resume"); + this.paused = false; + if (this._emitQueue.length) { + var eq = this._emitQueue.slice(0); + this._emitQueue.length = 0; + for (var i = 0; i < eq.length; i++) { + var e = eq[i]; + this._emitMatch(e[0], e[1]); + } + } + if (this._processQueue.length) { + var pq = this._processQueue.slice(0); + this._processQueue.length = 0; + for (var i = 0; i < pq.length; i++) { + var p = pq[i]; + this._processing--; + this._process(p[0], p[1], p[2], p[3]); + } + } + } + }; + Glob2.prototype._process = function(pattern, index, inGlobStar, cb) { + assert(this instanceof Glob2); + assert(typeof cb === "function"); + if (this.aborted) + return; + this._processing++; + if (this.paused) { + this._processQueue.push([pattern, index, inGlobStar, cb]); + return; + } + var n = 0; + while (typeof pattern[n] === "string") { + n++; + } + var prefix; + switch (n) { + case pattern.length: + this._processSimple(pattern.join("/"), index, cb); + return; + case 0: + prefix = null; + break; + default: + prefix = pattern.slice(0, n).join("/"); + break; + } + var remain = pattern.slice(n); + var read; + if (prefix === null) + read = "."; + else if (isAbsolute(prefix) || isAbsolute(pattern.join("/"))) { + if (!prefix || !isAbsolute(prefix)) + prefix = "/" + prefix; + read = prefix; + } else + read = prefix; + var abs = this._makeAbs(read); + if (childrenIgnored(this, read)) + return cb(); + var isGlobStar = remain[0] === minimatch.GLOBSTAR; + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb); + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb); + }; + Glob2.prototype._processReaddir = function(prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this; + this._readdir(abs, inGlobStar, function(er, entries) { + return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb); + }); + }; + Glob2.prototype._processReaddir2 = function(prefix, read, abs, remain, index, inGlobStar, entries, cb) { + if (!entries) + return cb(); + var pn = remain[0]; + var negate = !!this.minimatch.negate; + var rawGlob = pn._glob; + var dotOk = this.dot || rawGlob.charAt(0) === "."; + var matchedEntries = []; + for (var i = 0; i < entries.length; i++) { + var e = entries[i]; + if (e.charAt(0) !== "." || dotOk) { + var m; + if (negate && !prefix) { + m = !e.match(pn); + } else { + m = e.match(pn); + } + if (m) + matchedEntries.push(e); + } + } + var len = matchedEntries.length; + if (len === 0) + return cb(); + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null); + for (var i = 0; i < len; i++) { + var e = matchedEntries[i]; + if (prefix) { + if (prefix !== "/") + e = prefix + "/" + e; + else + e = prefix + e; + } + if (e.charAt(0) === "/" && !this.nomount) { + e = path2.join(this.root, e); + } + this._emitMatch(index, e); + } + return cb(); + } + remain.shift(); + for (var i = 0; i < len; i++) { + var e = matchedEntries[i]; + var newPattern; + if (prefix) { + if (prefix !== "/") + e = prefix + "/" + e; + else + e = prefix + e; + } + this._process([e].concat(remain), index, inGlobStar, cb); + } + cb(); + }; + Glob2.prototype._emitMatch = function(index, e) { + if (this.aborted) + return; + if (isIgnored(this, e)) + return; + if (this.paused) { + this._emitQueue.push([index, e]); + return; + } + var abs = isAbsolute(e) ? e : this._makeAbs(e); + if (this.mark) + e = this._mark(e); + if (this.absolute) + e = abs; + if (this.matches[index][e]) + return; + if (this.nodir) { + var c = this.cache[abs]; + if (c === "DIR" || Array.isArray(c)) + return; + } + this.matches[index][e] = true; + var st = this.statCache[abs]; + if (st) + this.emit("stat", e, st); + this.emit("match", e); + }; + Glob2.prototype._readdirInGlobStar = function(abs, cb) { + if (this.aborted) + return; + if (this.follow) + return this._readdir(abs, false, cb); + var lstatkey = "lstat\0" + abs; + var self = this; + var lstatcb = inflight(lstatkey, lstatcb_); + if (lstatcb) + fs4.lstat(abs, lstatcb); + function lstatcb_(er, lstat) { + if (er && er.code === "ENOENT") + return cb(); + var isSym = lstat && lstat.isSymbolicLink(); + self.symlinks[abs] = isSym; + if (!isSym && lstat && !lstat.isDirectory()) { + self.cache[abs] = "FILE"; + cb(); + } else + self._readdir(abs, false, cb); + } + }; + Glob2.prototype._readdir = function(abs, inGlobStar, cb) { + if (this.aborted) + return; + cb = inflight("readdir\0" + abs + "\0" + inGlobStar, cb); + if (!cb) + return; + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs, cb); + if (ownProp(this.cache, abs)) { + var c = this.cache[abs]; + if (!c || c === "FILE") + return cb(); + if (Array.isArray(c)) + return cb(null, c); + } + var self = this; + fs4.readdir(abs, readdirCb(this, abs, cb)); + }; + function readdirCb(self, abs, cb) { + return function(er, entries) { + if (er) + self._readdirError(abs, er, cb); + else + self._readdirEntries(abs, entries, cb); + }; + } + Glob2.prototype._readdirEntries = function(abs, entries, cb) { + if (this.aborted) + return; + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i++) { + var e = entries[i]; + if (abs === "/") + e = abs + e; + else + e = abs + "/" + e; + this.cache[e] = true; + } + } + this.cache[abs] = entries; + return cb(null, entries); + }; + Glob2.prototype._readdirError = function(f, er, cb) { + if (this.aborted) + return; + switch (er.code) { + case "ENOTSUP": + case "ENOTDIR": + var abs = this._makeAbs(f); + this.cache[abs] = "FILE"; + if (abs === this.cwdAbs) { + var error = new Error(er.code + " invalid cwd " + this.cwd); + error.path = this.cwd; + error.code = er.code; + this.emit("error", error); + this.abort(); + } + break; + case "ENOENT": + case "ELOOP": + case "ENAMETOOLONG": + case "UNKNOWN": + this.cache[this._makeAbs(f)] = false; + break; + default: + this.cache[this._makeAbs(f)] = false; + if (this.strict) { + this.emit("error", er); + this.abort(); + } + if (!this.silent) + console.error("glob error", er); + break; + } + return cb(); + }; + Glob2.prototype._processGlobStar = function(prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this; + this._readdir(abs, inGlobStar, function(er, entries) { + self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb); + }); + }; + Glob2.prototype._processGlobStar2 = function(prefix, read, abs, remain, index, inGlobStar, entries, cb) { + if (!entries) + return cb(); + var remainWithoutGlobStar = remain.slice(1); + var gspref = prefix ? [prefix] : []; + var noGlobStar = gspref.concat(remainWithoutGlobStar); + this._process(noGlobStar, index, false, cb); + var isSym = this.symlinks[abs]; + var len = entries.length; + if (isSym && inGlobStar) + return cb(); + for (var i = 0; i < len; i++) { + var e = entries[i]; + if (e.charAt(0) === "." && !this.dot) + continue; + var instead = gspref.concat(entries[i], remainWithoutGlobStar); + this._process(instead, index, true, cb); + var below = gspref.concat(entries[i], remain); + this._process(below, index, true, cb); + } + cb(); + }; + Glob2.prototype._processSimple = function(prefix, index, cb) { + var self = this; + this._stat(prefix, function(er, exists) { + self._processSimple2(prefix, index, er, exists, cb); + }); + }; + Glob2.prototype._processSimple2 = function(prefix, index, er, exists, cb) { + if (!this.matches[index]) + this.matches[index] = Object.create(null); + if (!exists) + return cb(); + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix); + if (prefix.charAt(0) === "/") { + prefix = path2.join(this.root, prefix); + } else { + prefix = path2.resolve(this.root, prefix); + if (trail) + prefix += "/"; + } + } + if (process.platform === "win32") + prefix = prefix.replace(/\\/g, "/"); + this._emitMatch(index, prefix); + cb(); + }; + Glob2.prototype._stat = function(f, cb) { + var abs = this._makeAbs(f); + var needDir = f.slice(-1) === "/"; + if (f.length > this.maxLength) + return cb(); + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs]; + if (Array.isArray(c)) + c = "DIR"; + if (!needDir || c === "DIR") + return cb(null, c); + if (needDir && c === "FILE") + return cb(); + } + var exists; + var stat = this.statCache[abs]; + if (stat !== void 0) { + if (stat === false) + return cb(null, stat); + else { + var type = stat.isDirectory() ? "DIR" : "FILE"; + if (needDir && type === "FILE") + return cb(); + else + return cb(null, type, stat); + } + } + var self = this; + var statcb = inflight("stat\0" + abs, lstatcb_); + if (statcb) + fs4.lstat(abs, statcb); + function lstatcb_(er, lstat) { + if (lstat && lstat.isSymbolicLink()) { + return fs4.stat(abs, function(er2, stat2) { + if (er2) + self._stat2(f, abs, null, lstat, cb); + else + self._stat2(f, abs, er2, stat2, cb); + }); + } else { + self._stat2(f, abs, er, lstat, cb); + } + } + }; + Glob2.prototype._stat2 = function(f, abs, er, stat, cb) { + if (er && (er.code === "ENOENT" || er.code === "ENOTDIR")) { + this.statCache[abs] = false; + return cb(); + } + var needDir = f.slice(-1) === "/"; + this.statCache[abs] = stat; + if (abs.slice(-1) === "/" && stat && !stat.isDirectory()) + return cb(null, false, stat); + var c = true; + if (stat) + c = stat.isDirectory() ? "DIR" : "FILE"; + this.cache[abs] = this.cache[abs] || c; + if (needDir && c === "FILE") + return cb(); + return cb(null, c, stat); + }; + } +}); + +// pnp:/Users/style/Documents/Projects/juke-build/src/index.ts +__export(exports, { + ExitCode: () => ExitCode, + Parameter: () => Parameter, + Target: () => Target, + chalk: () => chalk4, + chdir: () => chdir, + createParameter: () => createParameter, + createTarget: () => createTarget, + exec: () => exec, + glob: () => glob, + logger: () => logger, + rm: () => rm, + runner: () => runner, + setup: () => setup, + sleep: () => sleep +}); +var import_chalk4 = __toModule(require_source()); +var import_module = __toModule(require("module")); + +// pnp:/Users/style/Documents/Projects/juke-build/package.json +var version = "0.8.1"; + +// pnp:/Users/style/Documents/Projects/juke-build/src/chdir.ts +var import_fs = __toModule(require("fs")); +var import_path = __toModule(require("path")); +var import_url = __toModule(require("url")); +var chdir = (directory, relativeTo) => { + if (relativeTo) { + if (relativeTo.startsWith("file://")) { + relativeTo = import_url.default.fileURLToPath(relativeTo); + } + try { + const stat = import_fs.default.statSync(relativeTo); + if (!stat.isDirectory()) { + relativeTo = import_path.default.dirname(relativeTo); + } + } catch { + relativeTo = import_path.default.dirname(relativeTo); + } + directory = import_path.default.resolve(relativeTo, directory); + } + process.chdir(directory); +}; + +// pnp:/Users/style/Documents/Projects/juke-build/src/exec.ts +var import_chalk = __toModule(require_source()); +var import_child_process = __toModule(require("child_process")); +var import_fs2 = __toModule(require("fs")); +var import_path2 = __toModule(require("path")); +var children = new Set(); +var killChildren = () => { + for (const child of children) { + child.kill("SIGTERM"); + children.delete(child); + console.log("killed child process"); + } +}; +var trap = (signals, handler) => { + let readline; + if (process.platform === "win32") { + readline = require("readline").createInterface({ + input: process.stdin, + output: process.stdout + }); + } + for (const signal of signals) { + const handleSignal = () => handler(signal); + if (signal === "EXIT") { + process.on("exit", handleSignal); + continue; + } + if (readline) { + readline.on("SIG" + signal, handleSignal); + } + process.on("SIG" + signal, handleSignal); + } +}; +var ExitCode = class extends Error { + constructor(code, signal) { + super("Process exited with code: " + code); + this.code = null; + this.signal = null; + this.code = code; + this.signal = signal || null; + } +}; +var exec = (executable, args = [], options = {}) => { + const _a = options, { + silent = false, + throw: canThrow = true + } = _a, spawnOptions = __objRest(_a, [ + "silent", + "throw" + ]); + return new Promise((resolve, reject) => { + if (import_fs2.default.existsSync(executable)) { + executable = (0, import_path2.resolve)(executable); + } + if (process.env.JUKE_DEBUG) { + console.log(import_chalk.default.grey("$", executable, ...args)); + } + const child = (0, import_child_process.spawn)(executable, args, spawnOptions); + children.add(child); + let stdout = ""; + let stderr = ""; + let combined = ""; + child.stdout.on("data", (data) => { + if (!silent) { + process.stdout.write(data); + } + stdout += data; + combined += data; + }); + child.stderr.on("data", (data) => { + if (!silent) { + process.stderr.write(data); + } + stderr += data; + combined += data; + }); + child.on("error", (err) => reject(err)); + child.on("exit", (code, signal) => { + children.delete(child); + if (code !== 0 && canThrow) { + const error = new ExitCode(code); + error.code = code; + error.signal = signal; + reject(error); + return; + } + resolve({ + code, + signal, + stdout, + stderr, + combined + }); + }); + }); +}; + +// pnp:/Users/style/Documents/Projects/juke-build/src/logger.ts +var import_chalk2 = __toModule(require_source()); +var logger = { + log: (...args) => { + console.log(...args); + }, + error: (...args) => { + console.log(import_chalk2.default.bold(import_chalk2.default.redBright("=>"), import_chalk2.default.whiteBright(...args))); + }, + action: (...args) => { + console.log(import_chalk2.default.bold(import_chalk2.default.greenBright("=>"), import_chalk2.default.whiteBright(...args))); + }, + warn: (...args) => { + console.log(import_chalk2.default.bold(import_chalk2.default.yellowBright("=>"), import_chalk2.default.whiteBright(...args))); + }, + info: (...args) => { + console.log(import_chalk2.default.bold(import_chalk2.default.blueBright("::"), import_chalk2.default.whiteBright(...args))); + }, + debug: (...args) => { + if (process.env.JUKE_DEBUG) { + console.log(import_chalk2.default.gray(...args)); + } + } +}; + +// pnp:/Users/style/Documents/Projects/juke-build/src/string.ts +var import_stringcase = __toModule(require_lib()); +var toKebabCase = (str) => (0, import_stringcase.spinalcase)(str); +var toCamelCase = (str) => (0, import_stringcase.camelcase)(str); +var toConstCase = (str) => (0, import_stringcase.constcase)(str); + +// pnp:/Users/style/Documents/Projects/juke-build/src/parameter.ts +var Parameter = class { + constructor(config) { + this.type = config.type; + this.name = config.name; + this.alias = config.alias; + } + isString() { + return this.type === "string" || this.type === "string[]"; + } + isNumber() { + return this.type === "number" || this.type === "number[]"; + } + isBoolean() { + return this.type === "boolean" || this.type === "boolean[]"; + } + isArray() { + return this.type.endsWith("[]"); + } + toKebabCase() { + if (!this.name) + return; + return toKebabCase(this.name); + } + toConstCase() { + if (!this.name) + return; + return toConstCase(this.name); + } + toCamelCase() { + if (!this.name) + return; + return toCamelCase(this.name); + } +}; +var createParameter = (config) => new Parameter(config); + +// pnp:/Users/style/Documents/Projects/juke-build/src/runner.ts +var import_chalk3 = __toModule(require_source()); +var import_events = __toModule(require("events")); + +// pnp:/Users/style/Documents/Projects/juke-build/src/argparse.ts +var stringToBoolean = (str) => str !== void 0 && str !== null && str !== "false" && str !== "0" && str !== "null"; +var prepareArgs = (args, singleTarget = false) => { + let inGlobalContext = true; + const globalFlags = []; + const taskArgs = []; + let currentTaskArgs; + while (args.length !== 0) { + const arg = args.shift(); + if (!arg) { + continue; + } + if (arg === "--") { + inGlobalContext = false; + continue; + } + if (arg.startsWith("-")) { + if (inGlobalContext) { + globalFlags.push(arg); + } else if (currentTaskArgs) { + currentTaskArgs.push(arg); + } + continue; + } + inGlobalContext = false; + if (singleTarget) { + if (!currentTaskArgs) { + currentTaskArgs = [arg]; + } else { + currentTaskArgs.push(arg); + } + continue; + } + if (currentTaskArgs) { + taskArgs.push(currentTaskArgs); + } + currentTaskArgs = [arg]; + } + if (currentTaskArgs) { + taskArgs.push(currentTaskArgs); + } + return { globalFlags, taskArgs }; +}; +var parseArgs = (args, parameters) => { + args = [...args]; + const parameterMap = new Map(); + const pushValue = (key, value) => { + const values = parameterMap.get(key); + if (!values) { + parameterMap.set(key, [value]); + return; + } + values.push(value); + }; + let currentSet = []; + let currentSetType; + while (true) { + if (currentSet.length === 0) { + const arg2 = args.shift(); + if (!arg2) { + break; + } + if (arg2.startsWith("--")) { + currentSet = [arg2.substr(2)]; + currentSetType = "long"; + } else if (arg2.startsWith("-")) { + currentSet = Array.from(arg2); + currentSetType = "short"; + } else { + currentSet = []; + currentSetType = void 0; + } + } + const arg = currentSet.shift(); + if (currentSetType === "short") { + const parameter = parameters.find((p) => p.alias === arg); + if (!parameter) { + continue; + } + if (parameter.isBoolean()) { + pushValue(parameter, true); + continue; + } + if (currentSet.length === 0) { + continue; + } + const string = currentSet.join(""); + currentSet = []; + if (parameter.isNumber()) { + pushValue(parameter, parseFloat(string)); + continue; + } + pushValue(parameter, string); + continue; + } + if (currentSetType === "long") { + const equalsIndex = arg.indexOf("="); + let name = arg; + let value = null; + if (equalsIndex >= 0) { + name = arg.substr(0, equalsIndex); + value = arg.substr(equalsIndex + 1); + if (value === "") { + value = null; + } + } + const parameter = parameters.find((p) => p.name === name || p.toKebabCase() === name || p.toCamelCase() === name); + if (!parameter) { + continue; + } + if (parameter.isBoolean()) { + const noEqualsSign = equalsIndex < 0; + pushValue(parameter, noEqualsSign || stringToBoolean(value)); + continue; + } + if (value === null) { + continue; + } + if (parameter.isNumber()) { + pushValue(parameter, parseFloat(value)); + continue; + } + pushValue(parameter, value); + continue; + } + } + for (const [key, value] of Object.entries(process.env)) { + const parameter = parameters.find((p) => p.name === key || p.toConstCase() === key); + if (!parameter || parameterMap.has(parameter)) { + continue; + } + let values = []; + if (value !== void 0) { + if (parameter.isArray()) { + values = value.split(","); + } else { + values = [value]; + } + } + for (const value2 of values) { + if (parameter.isBoolean()) { + pushValue(parameter, stringToBoolean(value2)); + continue; + } + if (value2 === "") { + continue; + } + if (parameter.isNumber()) { + pushValue(parameter, parseFloat(value2)); + continue; + } + pushValue(parameter, value2); + continue; + } + } + return parameterMap; +}; + +// pnp:/Users/style/Documents/Projects/juke-build/src/fs.ts +var import_fs3 = __toModule(require("fs")); +var import_glob = __toModule(require_glob()); +var File = class { + constructor(path2) { + this.path = path2; + } + get stat() { + if (this._stat === void 0) { + try { + this._stat = import_fs3.default.statSync(this.path); + } catch { + this._stat = null; + } + } + return this._stat; + } + exists() { + return this.stat !== null; + } + get mtime() { + return this.stat && this.stat.mtime; + } + touch() { + const time = new Date(); + try { + import_fs3.default.utimesSync(this.path, time, time); + } catch (err) { + import_fs3.default.closeSync(import_fs3.default.openSync(this.path, "w")); + } + } +}; +var Glob = class { + constructor(path2) { + this.path = path2; + this.path = path2; + } + toFiles() { + const paths = import_glob.glob.sync(this.path, { + strict: false, + silent: true + }); + return paths.map((path2) => new File(path2)).filter((file) => file.exists()); + } +}; +var compareFiles = (sources, targets) => { + let bestSource = null; + let bestTarget = null; + for (const file of sources) { + if (!bestSource || file.mtime > bestSource.mtime) { + bestSource = file; + } + } + for (const file of targets) { + if (!file.exists()) { + return `target '${file.path}' is missing`; + } + if (!bestTarget || file.mtime < bestTarget.mtime) { + bestTarget = file; + } + } + if (!bestSource) { + if (bestTarget) { + return false; + } + return "no known sources or targets"; + } + if (!bestTarget) { + return "no targets were specified"; + } + if (bestSource.mtime > bestTarget.mtime) { + return `source '${bestSource.path}' is newer than target '${bestTarget.path}'`; + } + return false; +}; +var glob = (globPath) => { + const unsafePaths = import_glob.glob.sync(globPath, { + strict: false, + silent: true + }); + const safePaths = []; + for (let path2 of unsafePaths) { + try { + import_fs3.default.lstatSync(path2); + safePaths.push(path2); + } catch { + } + } + return safePaths; +}; +var rm = (path2, options = {}) => { + for (const p of glob(path2)) { + try { + if (options.recursive && import_fs3.default.rmSync) { + import_fs3.default.rmSync(p, options); + } else if (options.recursive) { + import_fs3.default.rmdirSync(p, { recursive: true }); + } else { + import_fs3.default.unlinkSync(p); + } + } catch (err) { + if (!options.force) { + throw err; + } + } + } +}; + +// pnp:/Users/style/Documents/Projects/juke-build/src/runner.ts +var runner = new class Runner { + constructor() { + this.config = {}; + this.targets = []; + this.parameters = []; + this.workers = []; + } + configure(config) { + this.config = config; + this.targets = config.targets || []; + this.parameters = config.parameters || []; + } + async start() { + const startedAt = Date.now(); + const { globalFlags, taskArgs } = prepareArgs(process.argv.slice(2), this.config.singleTarget); + const globalParameterMap = parseArgs(globalFlags, this.parameters); + const targetsToRun = new Map(); + const showListOfTargets = () => { + logger.info("Available targets:"); + for (const target of this.targets) { + logger.log(" - " + import_chalk3.default.cyan(target.name)); + } + logger.info("Available parameters:"); + for (const parameter of this.parameters) { + logger.log(" --" + parameter.name + (parameter.alias ? `, -${parameter.alias}` : "") + ` (type: ${parameter.type})`); + } + }; + if (globalFlags.includes("-h") || globalFlags.includes("--help")) { + showListOfTargets(); + process.exit(1); + } + for (const [taskName, ...args] of taskArgs) { + const target = this.targets.find((t) => t.name === taskName); + if (!target) { + const nameStr = import_chalk3.default.cyan(taskName); + logger.error(`Task '${nameStr}' was not found.`); + showListOfTargets(); + process.exit(1); + } + targetsToRun.set(target, { args }); + } + if (targetsToRun.size === 0) { + if (!this.config.default) { + logger.error(`No task was provided in arguments.`); + showListOfTargets(); + process.exit(1); + } + targetsToRun.set(this.config.default, { + args: [] + }); + } + let toVisit = Array.from(targetsToRun.entries()); + while (true) { + const node = toVisit.shift(); + if (!node) { + break; + } + const [target, meta] = node; + if (!meta.context) { + const localParameterMap = parseArgs(meta.args, target.parameters); + meta.context = { + get: (parameter) => { + let value = localParameterMap.get(parameter); + if (value === void 0) { + value = globalParameterMap.get(parameter); + } + if (parameter.isArray()) { + return value || []; + } else { + const returnValue = value && value[0]; + return returnValue !== void 0 ? returnValue : null; + } + }, + args: meta.args + }; + } + if (!meta.dependsOn) { + const optionalDependsOn = (typeof target.dependsOn === "function" ? await target.dependsOn(meta.context) : target.dependsOn) || []; + meta.dependsOn = optionalDependsOn.filter((dep) => typeof dep === "object" && dep !== null); + } + for (const dependency of meta.dependsOn) { + if (!targetsToRun.has(dependency)) { + const depMeta = { args: meta.args }; + targetsToRun.set(dependency, depMeta); + toVisit.push([dependency, depMeta]); + } else { + logger.debug("Dropped a possible circular dependency", dependency); + } + } + } + for (const [target, meta] of targetsToRun.entries()) { + const context = meta.context; + const dependsOn = meta.dependsOn; + const spawnedWorker = new Worker(target, context, dependsOn); + this.workers.push(spawnedWorker); + spawnedWorker.onFinish(() => { + for (const worker of this.workers) { + if (worker === spawnedWorker) { + continue; + } + worker.resolveDependency(target); + } + }); + spawnedWorker.onFail(() => { + for (const worker of this.workers) { + if (worker === spawnedWorker) { + continue; + } + worker.rejectDependency(target); + } + }); + } + const resolutions = await Promise.all(this.workers.map((worker) => new Promise((resolve) => { + worker.onFinish(() => resolve(true)); + worker.onFail(() => resolve(false)); + worker.start(); + }))); + const hasFailedWorkers = resolutions.includes(false); + if (!hasFailedWorkers) { + const time = (Date.now() - startedAt) / 1e3 + "s"; + const timeStr = import_chalk3.default.magenta(time); + logger.action(`Done in ${timeStr}`); + } + return Number(hasFailedWorkers); + } +}(); +var Worker = class { + constructor(target, context, dependsOn) { + this.target = target; + this.context = context; + this.dependsOn = dependsOn; + this.emitter = new import_events.default(); + this.hasFailed = false; + this.dependencies = new Set(dependsOn); + this.debugLog("ready"); + } + resolveDependency(target) { + var _a; + this.dependencies.delete(target); + (_a = this.generator) == null ? void 0 : _a.next(); + } + rejectDependency(target) { + var _a; + this.dependencies.delete(target); + this.hasFailed = true; + (_a = this.generator) == null ? void 0 : _a.next(); + } + start() { + this.generator = this.process(); + this.generator.next(); + } + onFinish(fn) { + this.emitter.once("finish", fn); + } + onFail(fn) { + this.emitter.once("fail", fn); + } + debugLog(...args) { + logger.debug(`${this.target.name}:`, ...args); + } + async *process() { + const nameStr = import_chalk3.default.cyan(this.target.name); + this.debugLog("Waiting for dependencies"); + while (true) { + if (this.dependencies.size === 0) { + break; + } + yield; + } + if (this.hasFailed) { + const nameStr2 = import_chalk3.default.cyan(this.target.name); + logger.error(`Target '${nameStr2}' failed`); + this.emitter.emit("fail"); + return; + } + if (this.target.onlyWhen) { + const result = await this.target.onlyWhen(this.context); + if (!result) { + logger.info(`Skipping '${nameStr}' (condition unmet)`); + this.emitter.emit("finish"); + return; + } + this.debugLog("Needs rebuild based on onlyWhen condition"); + } + this.debugLog("Comparing inputs and outputs"); + const fileMapper = async (fileIo) => { + const optionalPaths = (typeof fileIo === "function" ? await fileIo(this.context) : fileIo) || []; + const paths = optionalPaths.filter((path2) => typeof path2 === "string"); + return paths.flatMap((path2) => path2.includes("*") ? new Glob(path2).toFiles() : new File(path2)); + }; + const inputs = await fileMapper(this.target.inputs); + const outputs = await fileMapper(this.target.outputs); + if (inputs.length > 0) { + const needsRebuild = compareFiles(inputs, outputs); + if (!needsRebuild) { + logger.info(`Skipping '${nameStr}' (up to date)`); + this.emitter.emit("finish"); + return; + } else { + this.debugLog("Needs rebuild, reason:", needsRebuild); + } + } else { + this.debugLog("Nothing to compare"); + } + if (this.hasFailed) { + const nameStr2 = import_chalk3.default.cyan(this.target.name); + logger.error(`Target '${nameStr2}' failed (at file comparison stage)`); + this.emitter.emit("fail"); + return; + } + if (this.target.executes) { + logger.action(`Starting '${nameStr}'`); + const startedAt = Date.now(); + try { + await this.target.executes(this.context); + } catch (err) { + const time2 = (Date.now() - startedAt) / 1e3 + "s"; + const timeStr2 = import_chalk3.default.magenta(time2); + if (err instanceof ExitCode) { + const codeStr = import_chalk3.default.red(err.code); + logger.error(`Target '${nameStr}' failed in ${timeStr2}, exit code: ${codeStr}`); + } else { + logger.error(`Target '${nameStr}' failed in ${timeStr2}, unhandled exception:`); + console.error(err); + } + this.emitter.emit("fail"); + return; + } + const time = (Date.now() - startedAt) / 1e3 + "s"; + const timeStr = import_chalk3.default.magenta(time); + logger.action(`Finished '${nameStr}' in ${timeStr}`); + } + if (outputs.length > 0) { + for (const file of outputs) { + file.touch(); + } + } + this.emitter.emit("finish"); + } +}; + +// pnp:/Users/style/Documents/Projects/juke-build/src/target.ts +var Target = class { + constructor(target) { + this.name = target.name; + this.dependsOn = target.dependsOn || []; + this.executes = target.executes; + this.inputs = target.inputs || []; + this.outputs = target.outputs || []; + this.parameters = target.parameters || []; + this.onlyWhen = target.onlyWhen; + } +}; +var createTarget = (config) => new Target(config); + +// pnp:/Users/style/Documents/Projects/juke-build/src/index.ts +var chalk4 = import_chalk4.default; +var lastExitCode = null; +var setup = async (config) => { + logger.info(`Juke Build version ${version}`); + if (!config.file) { + logger.error(`Field 'file' is required in Juke.setup()`); + process.exit(1); + } + let buildModule = await import(config.file); + const isCommonJs = Boolean((0, import_module.createRequire)(config.file).cache[config.file]); + if (isCommonJs) { + buildModule = buildModule.default; + } + const targets = []; + const parameters = []; + for (const name of Object.keys(buildModule)) { + if (name === "default") { + continue; + } + const obj = buildModule[name]; + if (obj instanceof Target) { + if (!obj.name) { + obj.name = name !== "Target" ? toKebabCase(name.replace(/Target$/, "")) : "target"; + } + targets.push(obj); + continue; + } + if (obj instanceof Parameter) { + if (!obj.name) { + obj.name = name !== "Parameter" ? toKebabCase(name.replace(/Parameter$/, "")) : "parameter"; + } + parameters.push(obj); + continue; + } + } + const DefaultTarget = buildModule.default || buildModule.DefaultTarget || buildModule.Default; + if (DefaultTarget && !(DefaultTarget instanceof Target)) { + logger.error(`Default export is not a valid 'Target' object.`); + process.exit(1); + } + runner.configure({ + parameters, + targets, + default: DefaultTarget, + singleTarget: config.singleTarget + }); + return runner.start().then((code) => { + lastExitCode = code; + return code; + }); +}; +var sleep = (time) => new Promise((resolve) => setTimeout(resolve, time)); +trap(["EXIT", "BREAK", "HUP", "INT", "TERM"], (signal) => { + if (signal !== "EXIT") { + console.log("Received", signal); + } + killChildren(); + if (signal !== "EXIT") { + process.exit(1); + } else if (lastExitCode !== null) { + process.exit(lastExitCode); + } +}); +var exceptionHandler = (err) => { + console.log(err); + killChildren(); + process.exit(1); +}; +process.on("unhandledRejection", exceptionHandler); +process.on("uncaughtException", exceptionHandler); +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + ExitCode, + Parameter, + Target, + chalk, + chdir, + createParameter, + createTarget, + exec, + glob, + logger, + rm, + runner, + setup, + sleep +}); diff --git a/tools/build/juke/package.json b/tools/build/juke/package.json new file mode 100644 index 0000000000..0fef86e339 --- /dev/null +++ b/tools/build/juke/package.json @@ -0,0 +1,4 @@ +{ + "private": true, + "type": "commonjs" +} diff --git a/tools/build/lib/byond.js b/tools/build/lib/byond.js new file mode 100644 index 0000000000..952b60c4e9 --- /dev/null +++ b/tools/build/lib/byond.js @@ -0,0 +1,115 @@ +import fs from 'fs'; +import path from 'path'; +import Juke from '../juke/index.js'; +import { regQuery } from './winreg.js'; + +/** + * Cached path to DM compiler + */ +let dmPath; + +const getDmPath = async () => { + if (dmPath) { + return dmPath; + } + dmPath = await (async () => { + // Search in array of paths + const paths = [ + ...((process.env.DM_EXE && process.env.DM_EXE.split(',')) || []), + 'C:\\Program Files\\BYOND\\bin\\dm.exe', + 'C:\\Program Files (x86)\\BYOND\\bin\\dm.exe', + ['reg', 'HKLM\\Software\\Dantom\\BYOND', 'installpath'], + ['reg', 'HKLM\\SOFTWARE\\WOW6432Node\\Dantom\\BYOND', 'installpath'], + ]; + const isFile = path => { + try { + return fs.statSync(path).isFile(); + } + catch (err) { + return false; + } + }; + for (let path of paths) { + // Resolve a registry key + if (Array.isArray(path)) { + const [type, ...args] = path; + path = await regQuery(...args); + } + if (!path) { + continue; + } + // Check if path exists + if (isFile(path)) { + return path; + } + if (isFile(path + '/dm.exe')) { + return path + '/dm.exe'; + } + if (isFile(path + '/bin/dm.exe')) { + return path + '/bin/dm.exe'; + } + } + // Default paths + return ( + process.platform === 'win32' && 'dm.exe' + || 'DreamMaker' + ); + })(); + return dmPath; +}; + +/** + * @param {string} dmeFile + * @param {{ defines?: string[] }} options + */ +export const DreamMaker = async (dmeFile, options = {}) => { + const dmPath = await getDmPath(); + // Get project basename + const dmeBaseName = dmeFile.replace(/\.dme$/, ''); + // Make sure output files are writable + const testOutputFile = (name) => { + try { + fs.closeSync(fs.openSync(name, 'r+')); + } + catch (err) { + if (err && err.code === 'ENOENT') { + return; + } + if (err && err.code === 'EBUSY') { + Juke.logger.error(`File '${name}' is locked by the DreamDaemon process.`); + Juke.logger.error(`Stop the currently running server and try again.`); + throw new Juke.ExitCode(1); + } + throw err; + } + }; + testOutputFile(`${dmeBaseName}.dmb`); + testOutputFile(`${dmeBaseName}.rsc`); + // Compile + const { defines } = options; + if (defines && defines.length > 0) { + const injectedContent = defines + .map(x => `#define ${x}\n`) + .join(''); + fs.writeFileSync(`${dmeBaseName}.m.dme`, injectedContent); + const dmeContent = fs.readFileSync(`${dmeBaseName}.dme`); + fs.appendFileSync(`${dmeBaseName}.m.dme`, dmeContent); + await Juke.exec(dmPath, [`${dmeBaseName}.m.dme`]); + fs.writeFileSync(`${dmeBaseName}.dmb`, fs.readFileSync(`${dmeBaseName}.m.dmb`)); + fs.writeFileSync(`${dmeBaseName}.rsc`, fs.readFileSync(`${dmeBaseName}.m.rsc`)); + fs.unlinkSync(`${dmeBaseName}.m.dmb`); + fs.unlinkSync(`${dmeBaseName}.m.rsc`); + fs.unlinkSync(`${dmeBaseName}.m.dme`); + } + else { + await Juke.exec(dmPath, [dmeFile]); + } +}; + +export const DreamDaemon = async (dmbFile, ...args) => { + const dmPath = await getDmPath(); + const baseDir = path.dirname(dmPath); + const ddExeName = process.platform === 'win32' ? 'dd.exe' : 'DreamDaemon'; + const ddExePath = baseDir === '.' ? ddExeName : path.join(baseDir, ddExeName); + return Juke.exec(ddExePath, [dmbFile, ...args]); +}; diff --git a/tools/build/cbt/winreg.js b/tools/build/lib/winreg.js similarity index 81% rename from tools/build/cbt/winreg.js rename to tools/build/lib/winreg.js index a19aa66f48..0916ea3a31 100644 --- a/tools/build/cbt/winreg.js +++ b/tools/build/lib/winreg.js @@ -4,14 +4,14 @@ * Adapted from `tgui/packages/tgui-dev-server/winreg.js`. * * @file - * @copyright 2020 Aleksej Komarov + * @copyright 2021 Aleksej Komarov * @license MIT */ -const { exec } = require('child_process'); -const { promisify } = require('util'); +import { exec } from 'child_process'; +import { promisify } from 'util'; -const regQuery = async (path, key) => { +export const regQuery = async (path, key) => { if (process.platform !== 'win32') { return null; } @@ -40,7 +40,3 @@ const regQuery = async (path, key) => { return null; } }; - -module.exports = { - regQuery, -}; diff --git a/tools/build/lib/yarn.js b/tools/build/lib/yarn.js new file mode 100644 index 0000000000..8b93f4cfc9 --- /dev/null +++ b/tools/build/lib/yarn.js @@ -0,0 +1,13 @@ +import Juke from '../juke/index.js'; + +let yarnPath; + +export const yarn = (...args) => { + if (!yarnPath) { + yarnPath = Juke.glob('./tgui/.yarn/releases/*.cjs')[0] + .replace('/tgui/', '/'); + } + return Juke.exec('node', [yarnPath, ...args], { + cwd: './tgui', + }); +}; diff --git a/tools/build/package.json b/tools/build/package.json new file mode 100644 index 0000000000..e986b24bba --- /dev/null +++ b/tools/build/package.json @@ -0,0 +1,4 @@ +{ + "private": true, + "type": "module" +} diff --git a/tools/ci/check_grep.sh b/tools/ci/check_grep.sh index 9638215bb8..079f79704d 100755 --- a/tools/ci/check_grep.sh +++ b/tools/ci/check_grep.sh @@ -6,6 +6,10 @@ shopt -s globstar st=0 +if git grep -P "\r\n"; then + echo "ERROR: CRLF line endings detected. Please stop using the webeditor, and fix it using a desktop Git client." + st = 1 +fi; if grep -El '^\".+\" = \(.+\)' _maps/**/*.dmm; then echo "ERROR: Non-TGM formatted map detected. Please convert it using Map Merger!" st=1 diff --git a/tools/ci/install_auxmos.sh b/tools/ci/install_auxmos.sh new file mode 100644 index 0000000000..bfdbe7199b --- /dev/null +++ b/tools/ci/install_auxmos.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +set -euo pipefail + +source dependencies.sh + +mkdir -p ~/.byond/bin +wget -O ~/.byond/bin/libauxmos.so "https://github.com/Putnam3145/auxmos/releases/download/${AUXMOS_VERSION}/libauxmos.so" +chmod +x ~/.byond/bin/libauxmos.so +ldd ~/.byond/bin/libauxmos.so diff --git a/tools/ci/install_rust_g.sh b/tools/ci/install_rust_g.sh old mode 100755 new mode 100644 diff --git a/tools/ci/run_server.sh b/tools/ci/run_server.sh index ef548370f1..4d943846f0 100755 --- a/tools/ci/run_server.sh +++ b/tools/ci/run_server.sh @@ -7,11 +7,6 @@ mkdir ci_test/config #test config cp tools/ci/ci_config.txt ci_test/config/config.txt -#throw extools into ldd -cp libbyond-extools.so ~/.byond/bin/libbyond-extools.so -chmod +x ~/.byond/bin/libbyond-extools.so -ldd ~/.byond/bin/libbyond-extools.so - cd ci_test DreamDaemon tgstation.dmb -close -trusted -verbose -params "log-directory=ci" cd .. diff --git a/tools/deploy.sh b/tools/deploy.sh index d09b606a86..f6fc14d67d 100755 --- a/tools/deploy.sh +++ b/tools/deploy.sh @@ -22,8 +22,6 @@ fi cp tgstation.dmb tgstation.rsc $1/ cp -r _maps/* $1/_maps/ -cp -r icons/runtime/* $1/icons/runtime/ -cp -r sound/runtime/* $1/sound/runtime/ cp -r strings/* $1/strings/ #remove .dm files from _maps diff --git a/tools/requirements.txt b/tools/requirements.txt index 81b49fedfd..a9abe5e826 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -1,6 +1,6 @@ pygit2==1.0.1 bidict==0.13.1 -Pillow==8.2.0 +Pillow==8.3.2 # changelogs PyYaml==5.4 diff --git a/tools/tgs4_scripts/PreCompile.sh b/tools/tgs4_scripts/PreCompile.sh index 6463b1a0d6..6130736b4e 100755 --- a/tools/tgs4_scripts/PreCompile.sh +++ b/tools/tgs4_scripts/PreCompile.sh @@ -84,7 +84,7 @@ fi echo "Deploying auxmos..." git checkout "$AUXMOS_VERSION" -env PKG_CONFIG_ALLOW_CROSS=1 ~/.cargo/bin/cargo rustc --release --target=i686-unknown-linux-gnu --features "all_reaction_hooks" -- -C target-cpu=native +env PKG_CONFIG_ALLOW_CROSS=1 ~/.cargo/bin/cargo rustc --release --target=i686-unknown-linux-gnu --features all_reaction_hooks,explosive_decompression -- -C target-cpu=native mv -f target/i686-unknown-linux-gnu/release/libauxmos.so "$1/libauxmos.so" cd ..