diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml index f36055dab0..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 @@ -88,7 +102,7 @@ jobs: mysql -u root -proot tg_ci < SQL/tgstation_schema.sql mysql -u root -proot -e 'CREATE DATABASE tg_ci_prefixed;' mysql -u root -proot tg_ci_prefixed < SQL/tgstation_schema_prefixed.sql - - name: Install rust dependencies + - name: Install rust-g run: | sudo dpkg --add-architecture i386 sudo apt update || true @@ -96,15 +110,14 @@ jobs: 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 -DCIBUILDING + tools/build/build --ci -DCIBUILDING bash tools/ci/run_server.sh - env: - CBT_BUILD_MODE: TEST_RUN test_windows: if: "!contains(github.event.head_commit.message, '[ci skip]')" @@ -112,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_library.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_library.dmm index d1dcf9f11d..829761b042 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_library.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_library.dmm @@ -64,10 +64,6 @@ /obj/item/paper/fluff/ruins/oldstation/protosing, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/buried_library) -"av" = ( -/obj/structure/bookcase/random, -/turf/open/space/basic, -/area/ruin/unpowered/buried_library) "aw" = ( /turf/open/floor/plating, /area/ruin/unpowered/buried_library) @@ -220,7 +216,6 @@ /area/ruin/unpowered/buried_library) "bq" = ( /obj/structure/mineral_door/wood, -/obj/structure/barricade/wooden/crude/snow, /turf/open/floor/wood, /area/ruin/unpowered/buried_library) "br" = ( @@ -369,7 +364,7 @@ bi aC ae aQ -aq +ah bi aq bg @@ -394,7 +389,7 @@ ae bi aM ae -aq +ah bm aq aA @@ -440,7 +435,7 @@ aa ad bi bi -av +aq aA bi aG @@ -465,7 +460,7 @@ aa ad ac as -av +aq aF aD aD @@ -550,7 +545,7 @@ aD bi ae bm -ah +aq ag br ac @@ -573,9 +568,9 @@ ae af bp bi -ah +aq bi -ah +aq bp ac ad @@ -596,9 +591,9 @@ ah ao ah az -ah +aq bi -ah +aq bi bn ao @@ -621,7 +616,7 @@ ah aA ah ao -ah +aq bi bi bl @@ -646,7 +641,7 @@ ah ao aV bi -ah +aq bp bi bm diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_mining_site.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_mining_site.dmm index b4f7fec16f..dfe6a1b335 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_mining_site.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_mining_site.dmm @@ -53,8 +53,8 @@ /turf/open/floor/wood, /area/ruin/unpowered) "m" = ( -/obj/structure/barricade/wooden/crude/snow, /obj/structure/mineral_door/wood, +/obj/effect/decal/cleanable/trail_holder, /turf/open/floor/wood, /area/ruin/unpowered) "n" = ( @@ -68,6 +68,7 @@ /obj/machinery/light/broken{ dir = 4 }, +/obj/effect/decal/cleanable/trail_holder, /turf/open/floor/wood, /area/ruin/unpowered) "q" = ( @@ -95,6 +96,10 @@ /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 @@ -569,7 +574,7 @@ b l f f -f +s s b b @@ -595,7 +600,7 @@ b b b f -f +s p b b @@ -622,7 +627,7 @@ i b b b -f +s b b b @@ -649,7 +654,7 @@ i i i b -f +s b i i @@ -676,7 +681,7 @@ i i i b -f +s b i i @@ -703,7 +708,7 @@ i i i b -f +s b i i @@ -757,7 +762,7 @@ i i n h -n +N h n i 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/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index cf15bd05e1..26253018ff 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -68,118 +68,109 @@ "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, +/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" + }, +/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, +/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" + }, +/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 +198,106 @@ /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" + }, /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" + }, +/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 +307,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 +340,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/reinforced, +/turf/open/floor/plating, +/area/security/prison/upper) "aaO" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -314,25 +354,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 +376,38 @@ /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" + }, +/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 +447,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 +478,89 @@ /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/machinery/door/airlock/security/glass{ + name = "Prison Laundry" }, -/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, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/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, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) +"abg" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Cell Block" + }, +/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/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/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" + }, +/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{ @@ -504,14 +611,17 @@ /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 +629,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 +654,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 +662,30 @@ /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 - }, -/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, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) "abG" = ( /obj/structure/lattice/catwalk, /turf/open/space/basic, @@ -633,43 +722,33 @@ /turf/open/floor/plasteel/dark, /area/security/office) "abK" = ( -/obj/structure/chair/stool, -/obj/machinery/light/small{ +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/machinery/button/door{ - id = "permabolt3"; - name = "Cell Bolt Control"; - normaldoorcontrol = 1; - pixel_y = 25; - specialfunctions = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/dark, /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 +810,7 @@ }, /obj/machinery/firealarm{ dir = 4; - pixel_x = -26 + pixel_x = -24 }, /turf/open/floor/plasteel/showroomfloor, /area/security/office) @@ -788,52 +867,46 @@ /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/structure/cable{ + icon_state = "4-8" }, -/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/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plasteel, +/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 +1022,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,66 +1113,59 @@ /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/machinery/button/door{ - id = "permabolt1"; - name = "Cell Bolt Control"; - normaldoorcontrol = 1; - pixel_y = 25; - specialfunctions = 4 +/obj/effect/landmark/start/prisoner, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" }, -/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" + }, +/turf/open/floor/plasteel/dark, /area/security/prison) +"acD" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "Prison Gate"; + name = "prison blast door" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/security/prison/upper) "acE" = ( -/obj/structure/bed, -/obj/machinery/camera{ - c_tag = "Prison Cell 2"; - network = list("ss13","prison") +/obj/structure/chair{ + 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/light{ + dir = 4; + light_color = "#c1caff" }, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, /area/security/prison) "acF" = ( /obj/machinery/light_switch{ @@ -1110,37 +1178,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 +1204,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 +1240,7 @@ }, /obj/machinery/firealarm{ dir = 8; - pixel_x = 28 + pixel_x = 24 }, /turf/open/floor/plasteel/dark, /area/command/heads_quarters/hos) @@ -1276,77 +1338,53 @@ }, /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/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/structure/window/reinforced{ + dir = 8 }, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/security/execution/transfer) +/obj/structure/table, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) "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{ +/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/effect/turf_decal/tile/red{ dir = 4 }, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, /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 +1484,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" = ( @@ -1538,89 +1565,80 @@ }, /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, +/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 +1647,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" = ( @@ -1796,56 +1814,35 @@ /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{ +/obj/item/storage/box/handcuffs{ + pixel_y = 10 + }, +/obj/item/storage/box/prisoner{ + pixel_y = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/effect/turf_decal/stripes/line{ +/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/plating, -/area/security/execution/transfer) +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) "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, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/machinery/computer/prisoner/management, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, -/area/security/execution/transfer) -"aee" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) +/area/security/prison) "aef" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -1857,76 +1854,71 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/table, -/obj/item/restraints/handcuffs, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/security/prison) "aeg" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/security/execution/transfer) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) "aeh" = ( -/obj/machinery/button/door{ - id = "permacell3"; - name = "Cell 3 Lockdown"; - pixel_x = -4; - pixel_y = 25; - req_access_txt = "2" - }, -/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, -/area/security/prison) -"aei" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aej" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"aek" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/computer/security/telescreen/prison{ - pixel_y = 30 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/light{ + dir = 1 + }, /obj/effect/turf_decal/tile/red{ dir = 1 }, +/turf/open/floor/plasteel, +/area/security/prison) +"aei" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/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 }, /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" +"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/flasher{ id = "PCell 2"; pixel_x = 6; @@ -1938,21 +1930,24 @@ /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/effect/turf_decal/tile/red{ + dir = 4 + }, /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{ @@ -1986,37 +1981,26 @@ /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 +2008,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,72 +2207,15 @@ }, /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{ @@ -2293,26 +2227,17 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, /obj/structure/cable{ - icon_state = "2-8" + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-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 +2257,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 +2284,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" }, @@ -2717,61 +2638,45 @@ /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 }, +/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/execution/transfer) +/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/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" +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 }, /turf/open/floor/plasteel/dark, -/area/security/execution/transfer) +/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 }, -/obj/machinery/atmospherics/pipe/simple/general/hidden{ - dir = 4 - }, /turf/open/floor/plasteel/dark, -/area/security/execution/transfer) +/area/security/prison) "afz" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -2783,24 +2688,34 @@ /obj/structure/cable{ icon_state = "1-2" }, +/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) +/obj/structure/reagent_dispensers/peppertank{ + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/prison) "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 +2746,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 @@ -3082,39 +2992,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{ @@ -3972,19 +3902,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" @@ -4424,12 +4341,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{ @@ -5847,15 +5758,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"; @@ -7078,11 +6980,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" }, @@ -7690,7 +7587,7 @@ }, /obj/machinery/firealarm{ dir = 8; - pixel_x = 24; + pixel_x = 26; pixel_y = -28 }, /turf/open/floor/plasteel, @@ -8832,11 +8729,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" }, @@ -9151,7 +9043,7 @@ }, /obj/machinery/firealarm{ dir = 8; - pixel_x = 28 + pixel_x = 24 }, /turf/open/floor/plasteel/dark, /area/security/brig) @@ -9225,7 +9117,7 @@ }, /obj/machinery/firealarm{ dir = 8; - pixel_x = 28 + pixel_x = 24 }, /turf/open/floor/plasteel, /area/security/processing) @@ -50585,6 +50477,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, @@ -51302,6 +51200,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, @@ -51826,6 +51738,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, @@ -51882,6 +51810,20 @@ "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" + }, +/turf/open/floor/plating, +/area/security/prison/upper) "cNE" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall, @@ -52112,6 +52054,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 @@ -52379,6 +52325,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" @@ -52508,6 +52461,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, @@ -52519,6 +52479,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" @@ -52636,6 +52606,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, @@ -52703,6 +52689,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) @@ -52749,6 +52745,17 @@ }, /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, @@ -52781,24 +52788,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 @@ -52806,6 +52827,11 @@ /obj/machinery/meter, /turf/open/floor/plasteel, /area/engineering/atmos) +"dCd" = ( +/obj/structure/table, +/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{ @@ -52856,6 +52882,27 @@ }, /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/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "dJL" = ( /obj/structure/cable{ icon_state = "1-2" @@ -52875,6 +52922,24 @@ /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) +"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{ @@ -52888,6 +52953,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" @@ -52914,6 +52985,32 @@ }, /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" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "dQD" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -52921,6 +53018,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 @@ -52945,6 +53062,22 @@ /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" + }, +/turf/open/floor/plasteel/freezer, +/area/security/prison/cells) "dYZ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -52969,6 +53102,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 @@ -52981,6 +53121,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 @@ -53044,6 +53188,25 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"ejr" = ( +/obj/machinery/door/airlock/security{ + name = "Permanent Cell 4" + }, +/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 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "eky" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/snacks/baguette, @@ -53062,6 +53225,17 @@ }, /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 @@ -53087,6 +53261,47 @@ /obj/structure/table/wood/poker, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"eoJ" = ( +/obj/machinery/door/airlock/security{ + name = "Permanent Cell 5" + }, +/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 + }, +/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{ @@ -53098,21 +53313,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"; @@ -53144,6 +53365,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{ @@ -53151,6 +53383,37 @@ }, /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, +/turf/open/floor/plasteel, +/area/security/prison/upper) "evR" = ( /turf/open/floor/plating, /area/maintenance/bar) @@ -53280,6 +53543,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" @@ -53288,6 +53564,31 @@ icon_state = "panelscorched" }, /area/maintenance/starboard/aft) +"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" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) "eFx" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -53324,6 +53625,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{ @@ -53334,6 +53643,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{ @@ -53363,10 +53688,49 @@ /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) "eTA" = ( /obj/structure/table/wood/fancy, /obj/item/reagent_containers/food/condiment/saltshaker{ @@ -53437,6 +53801,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 @@ -53448,11 +53821,66 @@ /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/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/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 @@ -53461,6 +53889,10 @@ icon_state = "platingdmg1" }, /area/maintenance/port/fore) +"fcj" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/space) "fcn" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/maintenance{ @@ -53478,11 +53910,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" @@ -53498,6 +53980,19 @@ }, /turf/open/floor/wood, /area/service/bar) +"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 = "1-8" + }, +/turf/open/floor/plating, +/area/security/execution/transfer) "fgl" = ( /obj/structure/closet/crate/bin, /obj/item/coin/silver, @@ -53526,6 +54021,23 @@ }, /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" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "fjS" = ( /obj/structure/closet/radiation, /turf/open/floor/plasteel, @@ -53586,6 +54098,19 @@ }, /turf/open/floor/wood/wood_diagonal, /area/maintenance/port/fore) +"fmR" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/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 @@ -53915,6 +54440,16 @@ }, /turf/open/floor/plasteel, /area/service/hydroponics) +"fFR" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/security/prison) "fGf" = ( /obj/machinery/smartfridge/disks{ pixel_y = 2 @@ -53958,6 +54493,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 @@ -53969,6 +54515,46 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/security/courtroom) +"fMF" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Prison Laundry" + }, +/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, +/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/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/cells) "fNN" = ( /obj/machinery/door/firedoor, /obj/structure/cable{ @@ -54113,11 +54699,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{ @@ -54131,6 +54712,13 @@ }, /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 @@ -54149,6 +54737,35 @@ }, /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, +/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 @@ -54158,6 +54775,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{ @@ -54180,6 +54807,18 @@ }, /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, @@ -54187,6 +54826,26 @@ "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/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "giT" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -54217,6 +54876,13 @@ /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{ @@ -54242,6 +54908,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 @@ -54287,10 +54957,38 @@ /obj/machinery/meter, /turf/closed/wall/r_wall, /area/engineering/atmos) +"gxK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/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) @@ -54336,16 +55034,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" = ( @@ -54412,6 +55110,15 @@ /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 @@ -54453,6 +55160,25 @@ }, /turf/open/floor/wood, /area/maintenance/bar) +"gMB" = ( +/obj/machinery/door/airlock/security{ + name = "Permanent Cell 6" + }, +/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 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "gMD" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 6 @@ -54477,15 +55203,15 @@ /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" }, -/obj/structure/sign/poster/official/high_class_martini{ - pixel_x = -32 - }, /turf/open/floor/carpet/royalblue, /area/maintenance/starboard/aft) "gOZ" = ( @@ -54494,6 +55220,13 @@ }, /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" @@ -54511,6 +55244,23 @@ }, /turf/open/floor/carpet, /area/service/library) +"gSj" = ( +/obj/machinery/door/airlock/security{ + name = "Permanent Cell 3" + }, +/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, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "gTx" = ( /obj/effect/turf_decal/bot_white/left, /obj/effect/turf_decal/tile/neutral{ @@ -54532,6 +55282,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" @@ -54545,6 +55300,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 @@ -54576,6 +55344,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)"; @@ -54607,6 +55387,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 @@ -54653,6 +55448,9 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"hkA" = ( +/turf/open/floor/plasteel/dark, +/area/security/prison) "hlS" = ( /obj/structure/cable{ icon_state = "1-2" @@ -54683,6 +55481,15 @@ }, /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 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "hnU" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -54718,6 +55525,16 @@ }, /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{ @@ -54750,11 +55567,44 @@ }, /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 @@ -54777,6 +55627,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."; @@ -54807,6 +55664,21 @@ /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/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/security/prison/cells) "hMs" = ( /obj/structure/table, /obj/item/storage/box/bodybags, @@ -54837,6 +55709,12 @@ }, /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/space) "hQX" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ @@ -54923,6 +55801,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 @@ -54947,6 +55830,16 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"ifM" = ( +/obj/machinery/shower{ + dir = 8; + pixel_y = -4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/security/prison/cells) "ihR" = ( /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) @@ -55003,6 +55896,19 @@ }, /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 + }, +/turf/open/floor/plasteel/dark, +/area/security/execution/transfer) "imk" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/orange/visible{ @@ -55050,6 +55956,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 @@ -55111,6 +56032,15 @@ /obj/structure/table/optable, /turf/open/floor/plasteel/white, /area/medical/surgery) +"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{ @@ -55131,12 +56061,41 @@ }, /turf/open/floor/wood, /area/maintenance/bar) +"iBj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille, +/turf/open/floor/plating, +/area/space) +"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" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "iDo" = ( /obj/structure/grille, /turf/open/space/basic, @@ -55213,6 +56172,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" @@ -55478,11 +56445,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, @@ -55499,6 +56461,14 @@ /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 @@ -55515,6 +56485,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" @@ -55555,10 +56528,25 @@ }, /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 @@ -55596,10 +56584,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/airlock/security{ + name = "Prison Yard" + }, +/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" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) "jxF" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -55758,6 +56799,20 @@ /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" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "jHt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment{ @@ -55793,6 +56848,16 @@ /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" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "jIW" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -55807,6 +56872,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{ @@ -55828,12 +56924,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, @@ -55866,12 +56956,64 @@ }, /turf/open/floor/plating/rust, /area/maintenance/port/fore) -"jRw" = ( -/obj/machinery/computer/arcade/minesweeper{ +"jNN" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) +"jOB" = ( +/obj/machinery/door/airlock/security{ + name = "Prison Forestry" + }, +/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 + }, +/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) +/area/security/prison/upper) +"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 @@ -55892,6 +57034,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" @@ -55908,6 +57083,20 @@ }, /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; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "jVX" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -55919,6 +57108,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" @@ -55959,6 +57155,42 @@ /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/light/small{ + brightness = 3; + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "kdF" = ( /obj/structure/window/reinforced{ dir = 1 @@ -55993,15 +57225,19 @@ /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" + }, +/turf/open/floor/plating, +/area/security/prison/upper) "kfv" = ( /obj/structure/cable{ icon_state = "4-8" @@ -56011,6 +57247,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) @@ -56026,12 +57272,18 @@ }, /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{ @@ -56056,6 +57308,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{ @@ -56105,6 +57373,13 @@ }, /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, @@ -56119,6 +57394,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 @@ -56156,6 +57441,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, @@ -56177,6 +57483,27 @@ /obj/machinery/gear_painter, /turf/open/floor/plasteel, /area/commons/fitness) +"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 @@ -56192,6 +57519,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" @@ -56335,6 +57673,18 @@ /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, +/turf/open/floor/plasteel, +/area/security/prison/upper) "kGv" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible, /obj/machinery/atmospherics/pipe/simple/dark/visible{ @@ -56358,6 +57708,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" @@ -56390,6 +57745,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/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "kMt" = ( /obj/machinery/computer/prisoner/gulag_teleporter_computer, /turf/open/floor/plasteel, @@ -56409,6 +57794,13 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"kOE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "kOL" = ( /obj/structure/table/glass, /turf/open/floor/wood/wood_large, @@ -56521,6 +57913,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 @@ -56554,6 +57964,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 @@ -56604,6 +58035,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{ @@ -56611,6 +58049,17 @@ }, /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, +/turf/open/floor/plasteel, +/area/security/prison/upper) "lip" = ( /obj/structure/closet{ name = "Suit Closet" @@ -56636,6 +58085,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; @@ -56656,6 +58111,18 @@ /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 = "2-8" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "lnk" = ( /obj/item/radio/intercom{ pixel_y = 25 @@ -56670,6 +58137,11 @@ 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, @@ -56721,12 +58193,31 @@ }, /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 @@ -56739,12 +58230,49 @@ }, /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) "lwN" = ( /obj/structure/cable{ icon_state = "1-8" @@ -56770,6 +58298,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 @@ -56789,6 +58336,26 @@ dir = 1 }, /area/hallway/secondary/entry) +"lBk" = ( +/obj/machinery/door/airlock/security{ + name = "Prison Yard" + }, +/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 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) "lBz" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -56812,6 +58379,39 @@ }, /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/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/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"; @@ -56821,6 +58421,9 @@ }, /turf/open/floor/plating, /area/service/abandoned_gambling_den) +"lJA" = ( +/turf/closed/wall, +/area/security/prison/cells) "lJC" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -56830,6 +58433,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 @@ -56839,6 +58449,16 @@ "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; @@ -56871,6 +58491,13 @@ }, /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, @@ -56932,6 +58559,13 @@ /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, @@ -56946,6 +58580,18 @@ /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 @@ -56986,6 +58632,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, @@ -57019,10 +58676,40 @@ 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 @@ -57066,10 +58753,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"; @@ -57112,11 +58848,28 @@ }, /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 @@ -57174,6 +58927,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 @@ -57196,6 +58960,14 @@ }, /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, @@ -57204,10 +58976,51 @@ /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) +"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 + }, +/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 @@ -57222,6 +59035,29 @@ }, /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; @@ -57232,6 +59068,16 @@ }, /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" @@ -57246,6 +59092,21 @@ }, /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, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) "myh" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -57279,6 +59140,30 @@ }, /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 @@ -57334,6 +59219,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{ @@ -57342,9 +59239,25 @@ /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/door/airlock/security/glass{ + name = "Cell Block" + }, +/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 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "mJf" = ( /obj/structure/cable{ icon_state = "0-8" @@ -57363,6 +59276,16 @@ /obj/item/electronics/airlock, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"mJy" = ( +/obj/structure/table, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/security/prison/upper) +"mJH" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/security/prison/cells) "mLS" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating{ @@ -57477,6 +59400,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{ @@ -57485,6 +59415,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) @@ -57536,6 +59478,28 @@ }, /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) @@ -57560,6 +59524,17 @@ /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" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "ngs" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -57590,6 +59565,25 @@ }, /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/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "nkP" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance{ @@ -57640,17 +59634,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" @@ -57773,6 +59803,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{ @@ -57837,6 +59882,11 @@ }, /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 @@ -57860,6 +59910,23 @@ }, /turf/open/floor/wood, /area/maintenance/starboard/aft) +"nRO" = ( +/obj/machinery/door/airlock/security{ + name = "Permanent Cell 2" + }, +/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, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "nSt" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -57872,6 +59939,10 @@ }, /turf/open/floor/plasteel, /area/commons/dorms) +"nSI" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/security/prison/upper) "nTG" = ( /obj/structure/chair{ dir = 1 @@ -57929,6 +60000,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, @@ -57963,6 +60044,21 @@ /obj/item/clothing/head/hardhat/cakehat, /turf/open/floor/wood, /area/service/bar) +"obq" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/security/prison/upper) +"obs" = ( +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/turf/open/floor/padded, +/area/security/execution/transfer) "oby" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -58015,6 +60111,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 @@ -58071,6 +60173,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 @@ -58096,6 +60203,33 @@ /obj/machinery/holopad, /turf/open/floor/plasteel, /area/security/prison) +"ooF" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/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{ @@ -58117,6 +60251,21 @@ }, /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, @@ -58209,6 +60358,22 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) +"ozh" = ( +/obj/machinery/door/window/eastright{ + dir = 8; + name = "Holding Cell" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) "oAB" = ( /obj/structure/fireplace{ pixel_y = -6 @@ -58263,6 +60428,11 @@ "oHB" = ( /turf/open/floor/plasteel/dark, /area/commons/dorms) +"oIl" = ( +/obj/structure/weightmachine/weightlifter, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "oIJ" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -58291,6 +60461,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" @@ -58308,6 +60486,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, @@ -58318,17 +60509,6 @@ }, /turf/closed/wall, /area/medical/medbay/central) -"oSl" = ( -/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/range) "oTH" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/shower, @@ -58351,10 +60531,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, @@ -58366,6 +60558,28 @@ }, /turf/closed/wall/r_wall, /area/engineering/atmos) +"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, @@ -58418,6 +60632,24 @@ }, /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, +/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) @@ -58427,6 +60659,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" @@ -58493,6 +60742,16 @@ }, /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{ @@ -58608,6 +60867,12 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"pwF" = ( +/obj/machinery/shower{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/security/prison/cells) "pzG" = ( /obj/item/radio/intercom{ name = "Station Intercom (General)"; @@ -58653,6 +60918,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, @@ -58686,6 +60963,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 @@ -58695,6 +60990,17 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"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{ @@ -58730,6 +61036,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{ @@ -58737,6 +61052,28 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"pIR" = ( +/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, +/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{ @@ -58805,6 +61142,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 @@ -58829,6 +61185,39 @@ }, /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" + }, +/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" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "pUy" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -58870,6 +61259,23 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"pZD" = ( +/obj/machinery/door/airlock/security{ + name = "Permanent Cell 1" + }, +/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, +/turf/open/floor/plasteel/dark, +/area/security/prison/cells) "qae" = ( /obj/effect/decal/cleanable/vomit, /obj/effect/decal/cleanable/dirt, @@ -58884,6 +61290,20 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/service/bar) +"qbk" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) +"qcU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/security/prison/upper) "qeb" = ( /obj/structure/cable{ icon_state = "0-8" @@ -58938,6 +61358,20 @@ /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) "qje" = ( /obj/structure/sign/mining{ pixel_y = 7 @@ -58993,11 +61427,6 @@ 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, @@ -59015,6 +61444,18 @@ }, /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; @@ -59049,6 +61490,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 @@ -59058,6 +61519,14 @@ }, /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 @@ -59073,6 +61542,9 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"qCc" = ( +/turf/closed/wall, +/area/maintenance/prison/port) "qCw" = ( /obj/structure/chair/stool{ pixel_y = 8 @@ -59113,6 +61585,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 @@ -59128,6 +61614,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{ @@ -59140,6 +61635,16 @@ /obj/structure/lattice, /turf/open/space, /area/space/nearstation) +"qLo" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/security/prison/cells) "qLy" = ( /obj/structure/chair/sofa/left{ dir = 8 @@ -59177,6 +61682,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 @@ -59197,6 +61725,36 @@ }, /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" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "qSf" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable{ @@ -59256,9 +61814,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 @@ -59266,10 +61827,42 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"qYa" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/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 @@ -59313,11 +61906,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" }, @@ -59330,6 +61918,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{ @@ -59345,6 +61939,10 @@ }, /turf/open/floor/plasteel/dark, /area/service/hydroponics) +"ref" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/security/prison) "reA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -59356,6 +61954,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 @@ -59437,6 +62069,17 @@ /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 @@ -59451,6 +62094,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, @@ -59490,6 +62145,27 @@ /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" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) "rvr" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -59507,12 +62183,12 @@ /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 @@ -59540,6 +62216,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{ @@ -59559,12 +62250,41 @@ }, /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 + }, +/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{ @@ -59587,6 +62307,19 @@ }, /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 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "rDh" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -59605,6 +62338,15 @@ /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 @@ -59697,6 +62439,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; @@ -59711,6 +62459,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,10 +62560,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 @@ -59827,6 +62577,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" @@ -59845,12 +62600,60 @@ /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" + }, +/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" @@ -59905,6 +62708,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 @@ -59932,6 +62746,13 @@ /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, @@ -59940,6 +62761,18 @@ }, /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, @@ -59960,6 +62793,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" @@ -59969,6 +62814,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{ @@ -59989,6 +62839,37 @@ 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" + }, +/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, +/turf/open/floor/plasteel, +/area/security/prison/upper) "sCa" = ( /obj/structure/rack, /obj/item/circuitboard/machine/monkey_recycler, @@ -60039,6 +62920,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{ @@ -60051,6 +62938,13 @@ }, /turf/open/floor/plasteel, /area/service/hydroponics) +"sIn" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/prison/starboard) "sJw" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -60083,6 +62977,12 @@ }, /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, @@ -60102,6 +63002,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 @@ -60115,6 +63021,12 @@ /obj/item/storage/secure/briefcase, /turf/open/floor/plasteel, /area/commons/locker) +"sNj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "sOs" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -60240,10 +63152,44 @@ }, /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" @@ -60254,6 +63200,37 @@ /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 @@ -60280,11 +63257,24 @@ /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" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "tif" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -60303,6 +63293,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 +63326,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 +63357,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 @@ -60364,6 +63387,28 @@ /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" @@ -60412,6 +63457,48 @@ /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" @@ -60459,6 +63546,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) @@ -60532,6 +63623,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 @@ -60549,6 +63652,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"; @@ -60591,6 +63711,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, @@ -60607,6 +63733,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 @@ -60618,6 +63761,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, @@ -60676,6 +63825,20 @@ 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" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "tWj" = ( /obj/structure/window/reinforced, /turf/open/floor/wood, @@ -60694,6 +63857,12 @@ }, /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 @@ -60750,6 +63919,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)"; @@ -60777,6 +63959,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 @@ -60816,6 +64001,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, @@ -60878,6 +64073,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 @@ -60902,6 +64106,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" @@ -61046,12 +64261,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 @@ -61088,8 +64297,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 @@ -61132,11 +64352,43 @@ /obj/machinery/door/window, /turf/open/floor/wood, /area/service/theater) +"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) "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, +/mob/living/simple_animal/mouse/brown/Tom, +/turf/open/floor/plating, +/area/security/prison/upper) "uOJ" = ( /obj/structure/cable{ icon_state = "1-8" @@ -61198,6 +64450,12 @@ }, /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{ @@ -61239,6 +64497,11 @@ }, /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 @@ -61338,6 +64601,27 @@ }, /turf/open/floor/plating, /area/maintenance/fore) +"vhy" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/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 @@ -61345,6 +64629,28 @@ /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" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "vjm" = ( /obj/structure/table/wood, /obj/item/reagent_containers/rag, @@ -61353,6 +64659,12 @@ }, /turf/open/floor/wood, /area/maintenance/bar) +"vli" = ( +/obj/structure/lattice, +/obj/structure/grille, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "vmQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -61483,6 +64795,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" @@ -61586,6 +64917,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" @@ -61621,6 +64968,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" @@ -61662,6 +65028,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{ @@ -61729,6 +65098,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{ @@ -61781,6 +65161,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"; @@ -61791,6 +65179,25 @@ }, /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, +/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, @@ -61808,6 +65215,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 @@ -61836,6 +65255,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" @@ -61854,6 +65282,21 @@ /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 @@ -61868,6 +65311,17 @@ /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 @@ -61902,6 +65356,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" @@ -61912,6 +65373,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/port/fore) +"wll" = ( +/obj/structure/toilet{ + dir = 1 + }, +/obj/structure/window/reinforced/tinted{ + dir = 4 + }, +/turf/open/floor/padded, +/area/security/execution/transfer) "wly" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance{ @@ -61934,6 +65404,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 @@ -61954,6 +65433,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) @@ -62075,6 +65570,28 @@ }, /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" + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "wBd" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 @@ -62113,6 +65630,12 @@ /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, +/turf/open/floor/plating, +/area/space) "wII" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/maintenance, @@ -62190,6 +65713,38 @@ 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 + }, +/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, @@ -62222,11 +65777,9 @@ /turf/open/floor/plasteel, /area/commons/fitness/pool) "wYc" = ( -/obj/machinery/vr_sleeper{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/prison) +/obj/structure/table, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison/upper) "wYn" = ( /obj/structure/plasticflaps/opaque, /obj/structure/sign/poster/contraband/free_drone{ @@ -62281,6 +65834,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{ @@ -62301,6 +65868,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 @@ -62363,13 +65937,14 @@ /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, +/turf/open/floor/plating, +/area/security/prison/upper) "xiw" = ( /obj/machinery/door/airlock{ name = "Service Hall"; @@ -62381,6 +65956,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; @@ -62415,6 +66010,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, @@ -62514,6 +66134,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" @@ -62530,6 +66157,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"; @@ -62574,6 +66211,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, @@ -62581,6 +66224,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 @@ -62622,6 +66279,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{ @@ -62635,13 +66330,48 @@ }, /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, +/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 + }, +/turf/open/floor/plasteel, +/area/security/prison/upper) "xPk" = ( /obj/structure/bed, /obj/machinery/button/door{ @@ -62703,6 +66433,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{ @@ -62752,6 +66497,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, @@ -62816,6 +66568,22 @@ }, /turf/open/floor/mineral/titanium/blue, /area/commons/toilet/locker) +"yco" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/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 @@ -62847,6 +66615,12 @@ /obj/machinery/status_display/evac, /turf/closed/wall, /area/hallway/primary/central) +"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, @@ -62874,6 +66648,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 @@ -80918,7 +84700,7 @@ cNd cNd cNd cNd -cNd +naI cNd cNd cNd @@ -81189,11 +84971,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +gXs +gXs +gXs +gXs +gXs aaS aaS aaS @@ -81446,6 +85228,7 @@ aaa aaa aaa aaa +gXs aaa aaa aaa @@ -81453,13 +85236,12 @@ aaa aaa aaa aaa +gXs aaa aaa aaa aaa -aaa -aaa -aaa +gXs aaa aaa aaa @@ -81703,6 +85485,7 @@ aaa aaa aaa aaa +gXs aaa aaa aaa @@ -81710,13 +85493,12 @@ aaa aaa aaa aaa +gXs aaa aaa aaa aaa -aaa -aaa -aaa +gXs aaa aaa aaa @@ -81955,6 +85737,12 @@ aaa aaa aaa aaa +gXs +gXs +gXs +gXs +gXs +gXs aaa aaa aaa @@ -81962,18 +85750,12 @@ aaa aaa aaa aaa +gXs aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +gXs aaa aaa aaa @@ -82212,25 +85994,25 @@ aaa aaa aaa aaa +gXs aaa aaa aaa aaa +gXs +aaa +aaa +aaa +gXs +gXs +gXs +gXs +gXs aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +gXs aaa aaa aaa @@ -82469,25 +86251,25 @@ aaa aaa aaa aaa +gXs aaa aaa aaa aaa +gXs +aaa +aaa +aaa +gXs +aaa +aaa +aaa +gXs aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +gXs aaa aaa aaa @@ -82722,32 +86504,32 @@ aaa aaa aaa aaa +gXs +gXs +gXs +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 -aaa -aaa -aaa +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs +gXs ali ali alU @@ -82978,33 +86760,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 +gXs 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 @@ -83234,31 +87016,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 +gXs aaa aaa aaa @@ -83491,6 +87273,18 @@ cNd cNd aaa aaa +gXs +eRz +aaa +aaa +aaa +aaa +gXs +gXs +aaa +gXs +aaa +gXs aaa aaa aaa @@ -83498,24 +87292,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 @@ -83749,33 +87531,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 @@ -83996,44 +87778,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 +wll +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 @@ -84253,44 +88035,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 +giE +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 @@ -84510,44 +88292,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 +czP +eoJ +lJA +czP +ejr +abc +tJE +hEL +mbC +rgu +fbr +mCm +abc +abc +abu +abu +abu +abc aaa aaa aaa @@ -84767,44 +88549,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 @@ -85026,42 +88808,42 @@ cNd cNd aaa aaa +eRz +eRz +eRz +sMu +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 @@ -85283,42 +89065,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 +adI +adI +adI +qCc +qCc +wgu +qCc +qCc +qCc +czP +gMB +lJA +tnH +wVt +gSj +vYF +txs +szn +jKc +mjJ +eJu +eSJ +qNU +moe +acb +gcm +tqk aaa aaa aaa @@ -85540,42 +89322,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 @@ -85797,37 +89579,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 @@ -86054,37 +89836,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 +wVt +nRO +vYF +txs +szn +ksa +dQS +afu +acd pDe dly mnC @@ -86311,38 +90093,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 +gxK +nko +vFZ +szn +noJ +uql afw -abc -abc +acd +acd dly xxp mcp @@ -86465,7 +90247,7 @@ aaa aaa iDo ctv -aaT +iDo aaa aaa aaa @@ -86568,38 +90350,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 @@ -86722,7 +90504,7 @@ aaa aaa iDo iDo -aaT +iDo aaa aaa aaa @@ -86825,38 +90607,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 +kkb +tLC +aaN +peD +kGj +acG +lux +gPY +ktW +qQK +uuw +dPs +acG kgr -abe -abw -acc -acB -acZ -adE -aee +nFA +wVt +pZD +vYF +txs +szn +pIR aeL afy agh -abc +acd kCa hnU vda @@ -87081,39 +90863,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 +acG +jOB +acG +acG +acG +acG +acG aay -abd +oss abv -acb +lJA acA acI adD aed -aeK -afx +uql +afv agg -abc +acd ovv dCV idK @@ -87338,39 +91120,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 +uql afA -afA -abc +acd +acd kuA laq kdP @@ -87593,41 +91375,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 +ldY +lRb lRb vIi fsj @@ -87853,34 +91635,34 @@ 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 +aem aeO afJ sXV @@ -88110,35 +91892,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 @@ -88368,32 +92150,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 +hkA +hkA +aai aek acp aav @@ -88625,32 +92407,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 @@ -88882,33 +92664,33 @@ 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 @@ -89139,32 +92921,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 @@ -89396,35 +93178,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 @@ -89653,32 +93435,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 @@ -89912,33 +93694,33 @@ 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 +afG aim ajL akj @@ -90169,30 +93951,30 @@ aaa aaa aaa aaa +eRz aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aag -aaf -aai -wYc -wYc +jnk +sIn +eZS +iBj +fcj +iBq +vHK +dCd +aaP +xpH aaG wYc aaP -aaX +acG keM xib -acd +acG acD -acY -adG +cNi +adI aeq aeV agj @@ -90426,30 +94208,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 @@ -90684,29 +94466,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 @@ -90939,31 +94721,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 @@ -91198,23 +94980,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 @@ -91456,22 +95238,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 @@ -91714,21 +95496,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 @@ -91968,24 +95750,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 @@ -92229,20 +96011,20 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaf -aaa -aaf -aaf +eRz +eRz +eRz +eRz +eRz +vli +eRz +eRz +eRz +eRz +aaT +eRz +aaT +aaT aaT gXs abG @@ -92488,18 +96270,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 @@ -92746,17 +96528,17 @@ aaa aaa aaa aaa +gXs +aaa +gXs aaa aaa -aaa -aaa -aaa -aaa +gXs aaa aaf aaa aaf -aaf +ktS adR abo adR @@ -93003,17 +96785,17 @@ aaa aaa aaa aaa +gXs +aaa +gXs aaa aaa -aaa -aaa -aaa -aaa +gXs aaa aaf aaa aaf -aaf +ktS adR aaY abJ @@ -93262,15 +97044,15 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa +gXs +gXs +gXs +gXs aaf aaf aaf aaf -aaa +gXs abo abk abk @@ -93519,7 +97301,7 @@ aaa aaa aaa aaa -aaa +gXs aaa aaa aaa @@ -93776,7 +97558,7 @@ aaa aaa aaa aaa -aaa +gXs aaa aaa aaa @@ -93784,7 +97566,7 @@ aaa aaa aaa aaf -aaa +gXs abo abO abO @@ -94033,7 +97815,7 @@ aaa aaa aaa aaa -aaa +gXs aaa aaa aaa @@ -94290,11 +98072,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +gXs +gXs +gXs +gXs +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/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 536d5f4aa3..2287ac292d 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -2708,6 +2708,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 +2737,7 @@ /obj/machinery/light/small{ dir = 4 }, +/obj/effect/landmark/start/prisoner, /turf/open/floor/plasteel/freezer, /area/security/prison) "agP" = ( @@ -53485,6 +53487,13 @@ "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 @@ -54548,8 +54557,8 @@ 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) @@ -55484,7 +55493,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" = ( @@ -55906,6 +55915,7 @@ id = "xenoigniter"; luminosity = 2 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/engine, /area/science/xenobiology) "iPz" = ( @@ -59460,6 +59470,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" = ( @@ -60664,6 +60675,7 @@ /area/maintenance/department/science) "tfP" = ( /obj/item/beacon, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/engine, /area/science/xenobiology) "tfZ" = ( @@ -60985,6 +60997,10 @@ }, /turf/closed/wall/r_wall, /area/science/xenobiology) +"tVZ" = ( +/obj/effect/landmark/start/prisoner, +/turf/open/floor/plasteel/dark, +/area/security/prison) "tXn" = ( /obj/structure/sink{ dir = 4; @@ -83032,13 +83048,13 @@ aaa aem aeq aeE -aeU +tVZ afo afD aga aga agz -aie +dHg aiH ahm ahD @@ -114714,13 +114730,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 be117d82da..fc227f62c9 100644 Binary files a/auxmos.dll and b/auxmos.dll differ diff --git a/auxmos.pdb b/auxmos.pdb index 2552298fdd..a2db349011 100644 Binary files a/auxmos.pdb and b/auxmos.pdb differ diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 3ab70126e3..66912fa787 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -437,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/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/maths.dm b/code/__DEFINES/maths.dm index f56cd76a71..37a2fe3746 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -222,6 +222,10 @@ /// k is the rate at which is approaches L, x_0 is the point where the function = 0 #define LOGISTIC_FUNCTION(L,k,x,x_0) (L/(1+(NUM_E**(-k*(x-x_0))))) // ) +/// A function that "linearly" approaches a maximum value of L +/// k is the rate at which it approaches L (), x_0 is the point where the function = 0 +#define HYPERBOLIC_GROWTH(L,k,x,x_0) ((-(L * L) / ((k * x) + L - (k * x_0))) + L) +// ) /// Make sure something is a boolean TRUE/FALSE 1/0 value, since things like bitfield & bitflag doesn't always give 1s and 0s. #define FORCE_BOOLEAN(x) ((x)? TRUE : FALSE) // ) 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/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/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..cd94e5790b 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -343,3 +343,7 @@ #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" 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/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/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/_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/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/_onclick/click.dm b/code/_onclick/click.dm index 9321427387..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 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/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 index 3b5b437742..1f9b5d460f 100644 --- a/code/controllers/configuration/entries/admin.dm +++ b/code/controllers/configuration/entries/admin.dm @@ -39,7 +39,9 @@ /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_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 diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 8ecd7c0c60..d828457fa7 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -333,3 +333,12 @@ 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 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/air.dm b/code/controllers/subsystem/air.dm index 260a4c1b29..91e92feee9 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() @@ -54,14 +55,22 @@ 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. + // 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 = 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 = 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 @@ -221,6 +230,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)) @@ -278,7 +288,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-- @@ -378,6 +389,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() @@ -402,7 +431,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) 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/research.dm b/code/controllers/subsystem/research.dm index 946980389c..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) 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/atmosphere/planetary.dm b/code/datums/atmosphere/planetary.dm index 248873562f..a8b77f7394 100644 --- a/code/datums/atmosphere/planetary.dm +++ b/code/datums/atmosphere/planetary.dm @@ -12,9 +12,7 @@ GAS_CO2=10, ) restricted_gases = list( - GAS_PLASMA=0.1, - GAS_BZ=1.2, - GAS_METHANE=1.0, + GAS_BZ=0.1, GAS_METHYL_BROMIDE=0.1, ) restricted_chance = 30 @@ -23,7 +21,7 @@ maximum_pressure = LAVALAND_EQUIPMENT_EFFECT_PRESSURE - 1 minimum_temp = BODYTEMP_COLD_DAMAGE_LIMIT + 1 - maximum_temp = 350 + maximum_temp = 320 /datum/atmosphere/icemoon id = ICEMOON_DEFAULT_ATMOS @@ -38,8 +36,6 @@ GAS_CO2=10, ) restricted_gases = list( - GAS_PLASMA=0.1, - GAS_METHANE=1.0, GAS_METHYL_BROMIDE=0.1, ) restricted_chance = 10 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/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/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/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/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/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/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/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/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 62696a0853..d58edbd025 100755 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -1,7 +1,7 @@ /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 @@ -12,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, @@ -48,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) . = ..() @@ -100,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) @@ -133,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 @@ -141,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)) @@ -152,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 @@ -164,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) . = ..() 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 af7b69516d..7177249dbc 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -568,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) @@ -879,7 +885,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb /obj/item/MouseEntered(location, control, params) 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) || isobserver(usr)) + 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. @@ -900,7 +906,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb remove_outline() /obj/item/proc/apply_outline(colour = null) - if(!(item_flags & IN_INVENTORY || item_flags & IN_STORAGE) || QDELETED(src)) + if(!(item_flags & IN_INVENTORY || item_flags & IN_STORAGE) || QDELETED(src) || isobserver(usr)) return if(usr.client) if(!usr.client.prefs.outline_enabled) 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/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/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/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/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/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/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 6b1220743f..e62b5421d4 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -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/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/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/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/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm index 973b615f4a..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 @@ -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) @@ -318,19 +318,19 @@ 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/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/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/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/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/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/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/preferences.dm b/code/modules/client/preferences.dm index 40640f1d5b..cb262e57f3 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -119,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 @@ -505,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 @@ -1711,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) @@ -3016,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 @@ -3080,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 4d62bb149d..96ffd09af8 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -683,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 @@ -875,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) @@ -1044,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/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/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/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/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/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/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/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/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..13c18c21ca --- /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 = 2 + 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/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/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/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 429f00161b..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 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/species.dm b/code/modules/mob/living/carbon/human/species.dm index 6f94be2d41..80edd142b7 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 @@ -678,6 +682,7 @@ 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/human_parts.dmi' @@ -713,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) @@ -723,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 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 2888507baa..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 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/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/simple_animal/gremlin/gremlin.dm b/code/modules/mob/living/simple_animal/gremlin/gremlin.dm index 003afad4f2..61436cea1c 100644 --- a/code/modules/mob/living/simple_animal/gremlin/gremlin.dm +++ b/code/modules/mob/living/simple_animal/gremlin/gremlin.dm @@ -147,6 +147,7 @@ GLOBAL_LIST(bad_gremlin_items) /mob/living/simple_animal/hostile/gremlin/death(gibbed) walk(src,0) + QDEL_NULL(access_card) return ..() /mob/living/simple_animal/hostile/gremlin/Life() 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/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 ca0a74d749..a6c3133c8b 100644 --- a/code/modules/movespeed/modifiers/reagents.dm +++ b/code/modules/movespeed/modifiers/reagents.dm @@ -7,7 +7,7 @@ /datum/movespeed_modifier/reagent/ephedrine // strong painkiller effect that caps out at slightly above runspeed multiplicative_slowdown = -1.5 - priority = -100 + priority = 500 complex_calculation = TRUE absolute_max_tiles_per_second = 7 @@ -21,14 +21,14 @@ // 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 = -100 + priority = 500 complex_calculation = TRUE - absolute_max_tiles_per_second = 8 + 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 = -100 + priority = 500 complex_calculation = TRUE absolute_max_tiles_per_second = 7.5 diff --git a/code/modules/movespeed/modifiers/status_effects.dm b/code/modules/movespeed/modifiers/status_effects.dm index 260ee17c21..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 @@ -55,7 +55,7 @@ /datum/movespeed_modifier/status_effect/slime/light_pink // decently good painkiller + speedup effect blacklisted_movetypes = FLYING | FLOATING - priority = -150 // someday we really need to make these defines lmao + 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/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/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 148535af76..d7c918007e 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -41,8 +41,9 @@ #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 +#define GAS_RELEASE_MODIFIER 800 //Higher == less gas released by reaction +#define MAX_OXY_MULT 2 //The ratio between oxygen and plasma will approach this as temperature increases +#define OXY_POINT 80 // the temperature above which oxygen output > plasma output #define REACTION_POWER_MODIFIER 0.55 //Higher == more overall power @@ -538,14 +539,19 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //Power * 0.55 * a value between 1 and 0.8 var/device_energy = power * REACTION_POWER_MODIFIER - var/effective_temperature = min(removed.return_temperature(), 2500 * dynamic_heat_modifier) + var/cur_temp = removed.return_temperature() // more readable, better-performing anyway - 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 + effective_temperature * dynamic_heat_modifier) - T0C) / OXYGEN_RELEASE_MODIFIER, 0)) + // we don't want to cap the temperature like the old supermatter but we do want to stop adding more when it's too hot + var/max_temp_increase = min(cur_temp, 2500 * dynamic_heat_modifier) + ((device_energy * dynamic_heat_modifier) / THERMAL_RELEASE_CAP_MODIFIER) + + // oxygen ratio increases as temperature does + var/oxy_ratio = HYPERBOLIC_GROWTH(MAX_OXY_MULT, 1 / OXY_POINT, cur_temp, (-OXY_POINT / 2)) + // total moles also increases as temperature does + var/released_plasma = min(max((device_energy * dynamic_heat_modifier) / GAS_RELEASE_MODIFIER, 0) / (1+oxy_ratio), 2) + + removed.adjust_moles(GAS_PLASMA, released_plasma) + + removed.adjust_moles(GAS_O2, released_plasma * oxy_ratio) if(removed.return_temperature() < max_temp_increase) removed.adjust_heat(device_energy * dynamic_heat_modifier * THERMAL_RELEASE_MODIFIER) @@ -599,13 +605,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)) @@ -1058,9 +1064,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/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/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index afad323a27..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 @@ -1120,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/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index a9bdff64b2..02b19909b0 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -554,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 a07c5f7a2a..72a9779726 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -1451,7 +1451,7 @@ /datum/reagent/medicine/changelingadrenaline/on_mob_life(mob/living/carbon/metabolizer, delta_time, times_fired) ..() metabolizer.AdjustAllImmobility(-20 * REM * delta_time) - metabolizer.adjustStaminaLoss(-10 * REM * delta_time, 0) + metabolizer.adjustStaminaLoss(-30 * REM * delta_time, 0) metabolizer.Jitter(10 * REM * delta_time) metabolizer.Dizzy(10 * REM * delta_time) return TRUE @@ -1477,7 +1477,7 @@ /datum/reagent/medicine/changelinghaste name = "Changeling Haste" - description = "Drastically increases movement speed, but deals toxin damage." + description = "Drastically increases movement speed." color = "#AE151D" metabolization_rate = 2.5 * REAGENTS_METABOLISM @@ -1489,12 +1489,6 @@ L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste) ..() -/datum/reagent/medicine/changelinghaste/on_mob_life(mob/living/carbon/metabolizer, delta_time, times_fired) - metabolizer.adjustToxLoss(2 * REM * delta_time, 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/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 143025aed1..9d2e4a8e31 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 = "firstaid" + item_state = "firstaid" 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/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/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index 0c34a251ae..c408ad096e 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -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 ..() 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/tooltip/tooltip.dm b/code/modules/tooltip/tooltip.dm index ca1b163968..65e44cfbc6 100644 --- a/code/modules/tooltip/tooltip.dm +++ b/code/modules/tooltip/tooltip.dm @@ -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 7cc72ed1c1..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 "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/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/teleporters.dm b/code/modules/unit_tests/teleporters.dm index 0fc9bdb082..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/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/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_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_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/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/config/entries/admin.txt b/config/entries/admin.txt index 883bda9422..e583790b82 100644 --- a/config/entries/admin.txt +++ b/config/entries/admin.txt @@ -52,8 +52,12 @@ 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 +#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 diff --git a/config/entries/general.txt b/config/entries/general.txt index 3584af63c7..b3130565e4 100644 --- a/config/entries/general.txt +++ b/config/entries/general.txt @@ -491,3 +491,9 @@ ALLOW_CUSTOM_SKINTONES ## 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 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/dependencies.sh b/dependencies.sh index cdbdcd98df..aca82a3a05 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -8,20 +8,20 @@ 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.3 +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 4b63384ba2..223ee53a83 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,148 @@ -->
+

12 September 2021

+

LetterN updated:

+ +

timothyteakettle updated:

+ + +

11 September 2021

+

LetterN updated:

+ +

Putnam3145 updated:

+ +

SandPoot updated:

+ +

timothyteakettle updated:

+ +

zeroisthebiggay updated:

+ + +

10 September 2021

+

BlueWildrose updated:

+ +

keronshb updated:

+ +

zeroisthebiggay updated:

+ + +

08 September 2021

+

keronshb updated:

+ + +

07 September 2021

+

bunny232 updated:

+ +

keronshb updated:

+ +

zeroisthebiggay updated:

+ + +

05 September 2021

+

DeltaFire15 updated:

+ + +

04 September 2021

+

Putnam3145 updated:

+ +

WanderingFox95 updated:

+ +

keronshb updated:

+ +

timothyteakettle updated:

+ + +

03 September 2021

+

timothyteakettle updated:

+ + +

01 September 2021

+

BlueWildrose updated:

+ +

ma44 updated:

+ +

zeroisthebiggay updated:

+ +

28 August 2021

DeltaFire15 updated: