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.
-[](https://travis-ci.org/Citadel-Station-13/Citadel-Station-13)
+[](https://github.com/Citadel-Station-13/Citadel-Station-13/actions?query=workflow%3A%22CI+Suite%22)
[](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Percentage of issues still open")
[](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/RandomZLevels/away_mission/TheBeach.dmm b/_maps/RandomZLevels/away_mission/TheBeach.dmm
index 80a649bcc8..2c65f2dd8a 100644
--- a/_maps/RandomZLevels/away_mission/TheBeach.dmm
+++ b/_maps/RandomZLevels/away_mission/TheBeach.dmm
@@ -272,7 +272,7 @@
/obj/structure/mirror{
pixel_y = 28
},
-/turf/open/floor/wood,
+/turf/open/floor/wood/wood_diagonal,
/area/awaymission/beach)
"bd" = (
/turf/open/floor/wood,
@@ -312,7 +312,7 @@
pixel_x = 24;
specialfunctions = 4
},
-/turf/open/floor/wood,
+/turf/open/floor/wood/wood_diagonal,
/area/awaymission/beach)
"bj" = (
/obj/machinery/button/door{
@@ -322,7 +322,7 @@
pixel_x = -24;
specialfunctions = 4
},
-/turf/open/floor/wood,
+/turf/open/floor/wood/wood_diagonal,
/area/awaymission/beach)
"bk" = (
/obj/structure/closet/secure_closet/personal/cabinet,
@@ -392,14 +392,14 @@
id_tag = "changlinhut2";
name = "changing room"
},
-/turf/open/floor/wood,
+/turf/open/floor/wood/wood_diagonal,
/area/awaymission/beach)
"bt" = (
/obj/machinery/door/airlock/sandstone{
id_tag = "changlinhut1";
name = "changing room"
},
-/turf/open/floor/wood,
+/turf/open/floor/wood/wood_diagonal,
/area/awaymission/beach)
"bu" = (
/obj/item/reagent_containers/food/drinks/bottle/wine,
@@ -477,9 +477,9 @@
/turf/open/floor/plating/beach/sand,
/area/awaymission/beach)
"bF" = (
-/obj/structure/bedsheetbin,
/obj/effect/turf_decal/sand,
/obj/structure/table/wood,
+/obj/structure/bedsheetbin/towel,
/turf/open/floor/plating/beach/sand,
/area/awaymission/beach)
"bG" = (
@@ -773,7 +773,7 @@
/area/awaymission/beach)
"cv" = (
/obj/effect/turf_decal/stripes/white/corner{
- dir = 4
+ dir = 1
},
/turf/open/floor/plating/beach/sand,
/area/awaymission/beach)
@@ -1001,6 +1001,16 @@
/obj/item/clothing/glasses/heat,
/turf/open/floor/plating/beach/sand,
/area/awaymission/beach)
+"iv" = (
+/obj/structure/dresser{
+ density = 0;
+ pixel_y = 18
+ },
+/turf/open/floor/wood/wood_diagonal,
+/area/awaymission/beach)
+"kr" = (
+/turf/open/floor/wood/wood_diagonal,
+/area/awaymission/beach)
"np" = (
/obj/machinery/shower{
dir = 8
@@ -7586,8 +7596,8 @@ ak
ak
ak
aX
-bb
-bd
+iv
+kr
aX
ak
ba
@@ -8442,7 +8452,7 @@ aJ
aE
ak
aX
-bb
+iv
bj
bt
ba
@@ -8550,7 +8560,7 @@ ak
aS
aX
bc
-bd
+kr
aX
ak
ba
@@ -9090,7 +9100,7 @@ ak
ak
ba
ba
-ak
+bF
ak
ak
ak
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index cf15bd05e1..ea760cd55a 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -68,118 +68,123 @@
"aai" = (
/turf/closed/wall/r_wall,
/area/security/prison)
-"aaj" = (
-/obj/structure/cable{
- icon_state = "1-4"
+"aam" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 8
},
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10
},
/turf/open/floor/plasteel,
-/area/security/prison)
-"aam" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/security/prison)
+/area/security/prison/upper)
"aan" = (
-/obj/machinery/hydroponics/soil,
-/obj/item/seeds/ambrosia,
-/obj/machinery/newscaster{
- pixel_y = 32
- },
-/turf/open/floor/grass,
-/area/security/prison)
-"aao" = (
-/obj/machinery/hydroponics/soil,
-/obj/item/plant_analyzer,
-/obj/structure/sign/warning/electricshock{
- pixel_y = 32
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/grass,
-/area/security/prison)
-"aap" = (
-/obj/machinery/hydroponics/soil,
-/obj/item/seeds/carrot,
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/grass,
-/area/security/prison)
-"aaq" = (
-/obj/machinery/camera{
- c_tag = "Prison Common Room";
- network = list("ss13","prison")
+/obj/structure/closet/crate/bin,
+/obj/effect/spawner/lootdrop/prison_contraband,
+/obj/item/trash/sosjerky,
+/obj/item/trash/boritos,
+/obj/item/trash/can,
+/obj/effect/turf_decal/tile/green{
+ dir = 8
},
+/obj/effect/turf_decal/tile/green,
/obj/effect/turf_decal/tile/green{
dir = 1
},
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/item/radio/intercom{
+ desc = "Talk through this. It looks like it has been modified to not broadcast.";
+ name = "Prison Intercom (General)";
+ pixel_x = -27;
+ pixel_y = -27;
+ prison_radio = 1
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"aao" = (
/obj/effect/turf_decal/tile/green,
/obj/effect/turf_decal/tile/green{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"aap" = (
/obj/effect/turf_decal/tile/green{
dir = 8
},
-/obj/structure/sink{
- pixel_y = 20
- },
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/effect/turf_decal/tile/green{
+ dir = 1
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
-/area/security/prison)
-"aar" = (
-/obj/machinery/hydroponics/soil,
-/obj/item/seeds/glowshroom,
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/grass,
-/area/security/prison)
-"aas" = (
-/obj/structure/sign/warning/electricshock{
- pixel_y = 32
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
-/area/security/prison)
+/area/security/prison/upper)
"aat" = (
-/turf/open/floor/plasteel,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plasteel/dark,
/area/security/prison)
"aau" = (
-/obj/machinery/biogenerator,
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 8
+ },
/turf/open/floor/plasteel,
-/area/security/prison)
+/area/security/prison/upper)
"aav" = (
/obj/structure/cable{
icon_state = "1-2"
},
/turf/open/floor/plasteel,
/area/security/prison)
-"aaw" = (
-/obj/machinery/light{
+"aax" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"aay" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
dir = 8
},
-/turf/open/floor/grass,
-/area/security/prison)
-"aax" = (
-/mob/living/simple_animal/mouse/brown/Tom,
-/turf/open/floor/grass,
-/area/security/prison)
-"aay" = (
-/turf/open/floor/plating,
-/area/security/prison)
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
"aaz" = (
/obj/machinery/disposal/bin,
/obj/structure/sign/plaques/deempisi{
@@ -207,29 +212,109 @@
/turf/open/floor/plasteel,
/area/service/bar)
"aaA" = (
-/obj/machinery/seed_extractor,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
-/area/security/prison)
-"aaB" = (
-/obj/structure/window/reinforced,
-/obj/machinery/hydroponics/soil,
-/obj/item/seeds/potato,
-/turf/open/floor/grass,
-/area/security/prison)
+/area/security/prison/upper)
"aaC" = (
-/obj/machinery/hydroponics/soil,
-/obj/structure/window/reinforced,
-/obj/item/seeds/tower,
-/turf/open/floor/grass,
-/area/security/prison)
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/obj/machinery/holopad,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/effect/decal/cleanable/blood/old,
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"aaD" = (
-/obj/structure/window/reinforced,
-/obj/machinery/hydroponics/soil,
-/obj/item/seeds/grass,
-/turf/open/floor/grass,
-/area/security/prison)
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"aaE" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Prison Cafeteria"
+ },
+/obj/machinery/door/firedoor,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
+"aaF" = (
/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"aaG" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/security/prison/upper)
+"aaH" = (
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
+"aaI" = (
+/obj/machinery/washing_machine,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/security/prison/upper)
+"aaK" = (
/obj/effect/turf_decal/tile/green{
dir = 4
},
@@ -239,40 +324,12 @@
/obj/effect/turf_decal/tile/green{
dir = 1
},
-/turf/open/floor/plasteel,
-/area/security/prison)
-"aaF" = (
-/obj/structure/window/reinforced,
-/obj/machinery/hydroponics/soil,
-/obj/item/cultivator,
-/turf/open/floor/grass,
-/area/security/prison)
-"aaG" = (
-/obj/machinery/light{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/machinery/vr_sleeper{
- dir = 8
- },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
-/area/security/prison)
-"aaH" = (
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
-"aaI" = (
-/obj/structure/bookcase,
-/turf/open/floor/plasteel,
-/area/security/prison)
-"aaJ" = (
-/obj/structure/chair/stool,
-/turf/open/floor/plasteel,
-/area/security/prison)
-"aaK" = (
-/obj/machinery/computer/arcade/battle{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/prison)
+/area/security/prison/upper)
"aaL" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/preopen{
@@ -300,9 +357,9 @@
/turf/open/floor/plating,
/area/command/heads_quarters/hos)
"aaN" = (
-/obj/structure/chair/sofa/right,
-/turf/open/floor/plasteel,
-/area/security/prison)
+/obj/effect/spawner/structure/window,
+/turf/open/floor/plating,
+/area/security/prison/upper)
"aaO" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/preopen{
@@ -314,25 +371,17 @@
/turf/open/floor/plating,
/area/command/heads_quarters/hos)
"aaP" = (
-/obj/machinery/computer/cryopod{
- dir = 8;
- pixel_x = 26
- },
-/obj/machinery/cryopod{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/prison)
+/obj/structure/table,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/cafeteria,
+/area/security/prison/upper)
"aaQ" = (
/turf/closed/wall,
/area/security/warden)
"aaR" = (
-/obj/structure/lattice,
-/obj/structure/sign/warning/securearea{
- pixel_y = -32
- },
-/turf/open/space,
-/area/space/nearstation)
+/obj/structure/table/reinforced,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"aaS" = (
/obj/structure/grille,
/obj/structure/lattice,
@@ -344,31 +393,41 @@
/turf/open/space,
/area/space/nearstation)
"aaU" = (
-/obj/machinery/computer/arcade/orion_trail{
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/turf/open/floor/plasteel,
-/area/security/prison)
-"aaV" = (
-/obj/structure/table/wood,
-/obj/item/storage/dice,
-/turf/open/floor/plasteel,
-/area/security/prison)
-"aaW" = (
-/obj/effect/landmark/event_spawn,
-/obj/structure/chair/comfy/brown{
- color = "#596479";
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/prison)
-"aaX" = (
-/obj/structure/window/reinforced,
-/obj/machinery/cryopod{
+/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/turf/open/floor/plasteel,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/door/firedoor,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/machinery/door/airlock/security/glass{
+ id_tag = "permaouter";
+ name = "Permabrig Transfer";
+ req_access_txt = "2"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/dark,
/area/security/prison)
+"aaV" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10
+ },
+/turf/closed/wall,
+/area/security/prison/upper)
+"aaW" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/closed/wall,
+/area/security/prison/upper)
"aaY" = (
/obj/effect/turf_decal/bot,
/obj/structure/closet/crate/secure/weapon{
@@ -408,11 +467,21 @@
/turf/open/space,
/area/space/nearstation)
"abb" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
+/obj/effect/turf_decal/tile/red{
+ dir = 4
},
-/turf/closed/wall,
-/area/security/execution/transfer)
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
"abc" = (
/turf/closed/wall,
/area/security/execution/transfer)
@@ -429,31 +498,82 @@
/turf/closed/wall,
/area/security/execution/transfer)
"abf" = (
-/obj/machinery/vending/sustenance,
-/turf/open/floor/plasteel,
-/area/security/prison)
-"abg" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
},
-/turf/closed/wall,
-/area/security/execution/transfer)
-"abh" = (
-/obj/machinery/holopad,
-/turf/open/floor/plasteel,
-/area/security/prison)
-"abi" = (
-/obj/machinery/shower{
+/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/soap/nanotrasen,
-/turf/open/floor/plasteel/freezer,
-/area/security/prison)
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/door/airlock/grunge{
+ name = "Prison Laundry";
+ wiretypepath = /datum/wires/airlock/security
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
+"abg" = (
+/obj/machinery/door/firedoor,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel/dark,
+/area/security/prison/cells)
+"abh" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/machinery/light,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/effect/decal/cleanable/blood/old,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"abi" = (
+/obj/machinery/button/flasher{
+ id = "visitorflash";
+ pixel_x = -6;
+ pixel_y = 24
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/machinery/button/door{
+ id = "visitation";
+ name = "Visitation Shutters";
+ pixel_x = -6;
+ pixel_y = 36;
+ req_access_txt = "2"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
"abj" = (
-/obj/structure/bedsheetbin/color,
-/obj/structure/table,
-/turf/open/floor/plasteel/freezer,
-/area/security/prison)
+/obj/structure/chair/office{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
"abk" = (
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
@@ -496,22 +616,18 @@
},
/turf/open/floor/plasteel/dark,
/area/command/heads_quarters/hos)
-"abs" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/machinery/power/tracker,
-/turf/open/floor/plasteel/airless/solarpanel,
-/area/solars/port/fore)
"abt" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
+/obj/effect/turf_decal/tile/red{
+ dir = 8
},
-/obj/effect/turf_decal/stripes/line{
- dir = 9
+/obj/effect/turf_decal/tile/red,
+/obj/machinery/light,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/turf/open/floor/plasteel/dark,
-/area/security/execution/transfer)
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
"abu" = (
/obj/machinery/door/poddoor{
id = "executionspaceblast"
@@ -519,27 +635,23 @@
/turf/open/floor/plating,
/area/security/execution/transfer)
"abv" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
+/obj/machinery/camera{
+ c_tag = "Prison Cell Block East";
+ dir = 8;
+ network = list("ss13","prison")
},
-/obj/effect/turf_decal/stripes/line{
- dir = 5
+/obj/effect/turf_decal/tile/red{
+ dir = 8
},
-/turf/open/floor/plasteel/dark,
-/area/security/execution/transfer)
-"abw" = (
-/obj/machinery/light/small{
- dir = 1
+/obj/effect/turf_decal/tile/red,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 9
},
-/obj/machinery/flasher{
- id = "executionflash";
- pixel_y = 25
+/obj/structure/cable{
+ icon_state = "1-8"
},
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/security/execution/transfer)
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
"abx" = (
/obj/machinery/camera/motion{
c_tag = "Armory External Motion Sensor";
@@ -548,10 +660,6 @@
/obj/structure/lattice/catwalk,
/turf/open/space/basic,
/area/ai_monitored/security/armory)
-"aby" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/security/execution/transfer)
"abz" = (
/obj/machinery/light/small{
dir = 4;
@@ -560,43 +668,35 @@
/turf/open/floor/engine,
/area/science/xenobiology)
"abA" = (
-/obj/machinery/light,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable{
+ icon_state = "2-4"
},
-/turf/open/floor/plasteel,
-/area/security/prison)
-"abB" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
+/obj/structure/cable{
+ icon_state = "0-2"
},
-/turf/open/floor/plasteel,
-/area/security/prison)
-"abC" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "Prison Gate";
+ name = "Prison Lockdown Shutters"
},
-/turf/open/floor/plasteel,
-/area/security/prison)
-"abD" = (
-/obj/machinery/light,
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/plasteel,
+/turf/open/floor/plating,
/area/security/prison)
"abE" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/structure/chair/stool,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
},
/turf/open/floor/plasteel,
-/area/security/prison)
+/area/security/prison/upper)
"abF" = (
-/turf/open/floor/plasteel/freezer,
-/area/security/prison)
+/obj/structure/table,
+/obj/item/flashlight/lamp,
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
"abG" = (
/obj/structure/lattice/catwalk,
/turf/open/space/basic,
@@ -633,43 +733,27 @@
/turf/open/floor/plasteel/dark,
/area/security/office)
"abK" = (
-/obj/structure/chair/stool,
-/obj/machinery/light/small{
- dir = 1
+/obj/structure/window/reinforced{
+ dir = 8
},
-/obj/machinery/button/door{
- id = "permabolt3";
- name = "Cell Bolt Control";
- normaldoorcontrol = 1;
- pixel_y = 25;
- specialfunctions = 4
+/obj/structure/chair{
+ dir = 4
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/turf/open/floor/plasteel,
/area/security/prison)
"abL" = (
/obj/structure/chair/stool,
-/obj/machinery/light/small{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
dir = 1
},
-/obj/machinery/button/door{
- id = "permabolt2";
- name = "Cell Bolt Control";
- normaldoorcontrol = 1;
- pixel_y = 25;
- specialfunctions = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
/turf/open/floor/plasteel,
-/area/security/prison)
-"abM" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/prison)
+/area/security/prison/upper)
"abN" = (
/obj/effect/landmark/secequipment,
/obj/effect/turf_decal/tile/red{
@@ -731,7 +815,7 @@
},
/obj/machinery/firealarm{
dir = 4;
- pixel_x = -26
+ pixel_x = -24
},
/turf/open/floor/plasteel/showroomfloor,
/area/security/office)
@@ -757,13 +841,6 @@
/obj/structure/grille,
/turf/open/space,
/area/space/nearstation)
-"abZ" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/solars/port/fore)
"aca" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -788,52 +865,52 @@
/turf/closed/wall,
/area/security/prison)
"ace" = (
-/obj/machinery/door/poddoor/preopen{
- id = "permacell3";
- name = "cell blast door"
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
},
-/obj/machinery/door/airlock/public/glass{
- id_tag = "permabolt3";
- name = "Cell 3"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/turf/open/floor/plasteel,
-/area/security/prison)
-"acf" = (
-/obj/machinery/door/poddoor/preopen{
- id = "permacell2";
- name = "cell blast door"
- },
-/obj/machinery/door/airlock/public/glass{
- id_tag = "permabolt2";
- name = "Cell 2"
+/obj/structure/cable{
+ icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/turf/open/floor/plasteel,
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plasteel/dark,
/area/security/prison)
"acg" = (
+/obj/machinery/door/poddoor/shutters{
+ id = "visitation";
+ name = "Visitation Shutters"
+ },
+/obj/machinery/door/window/southleft,
+/obj/structure/table/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
+"ach" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/door/poddoor/preopen{
- id = "permacell1";
- name = "cell blast door"
+/obj/machinery/camera{
+ c_tag = "Prison Visitation";
+ dir = 8;
+ network = list("ss13","prison")
},
-/obj/machinery/door/airlock/public/glass{
- id_tag = "permabolt1";
- name = "Cell 1"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/turf/open/floor/plasteel,
-/area/security/prison)
-"ach" = (
-/obj/machinery/door/airlock{
- name = "Unisex Restroom"
- },
-/turf/open/floor/plasteel/freezer,
-/area/security/prison)
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
"aci" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/structure/cable{
@@ -949,10 +1026,12 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/security/armory)
"acp" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/obj/structure/cable{
icon_state = "2-4"
},
@@ -1038,64 +1117,64 @@
/obj/item/stack/cable_coil/random,
/turf/open/space,
/area/space/nearstation)
-"acz" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/plasteel/dark,
-/area/security/execution/transfer)
"acA" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
},
-/turf/open/floor/plasteel/dark,
-/area/security/execution/transfer)
-"acB" = (
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel/dark,
-/area/security/execution/transfer)
-"acC" = (
-/obj/structure/bed,
-/obj/machinery/camera{
- c_tag = "Prison Cell 3";
- network = list("ss13","prison")
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
},
-/obj/item/radio/intercom{
- desc = "Talk through this. It looks like it has been modified to not broadcast.";
- name = "Prison Intercom (General)";
- pixel_y = 24;
- prison_radio = 1
- },
-/turf/open/floor/plasteel,
-/area/security/prison)
-"acD" = (
-/obj/structure/chair/stool,
-/obj/machinery/light/small{
+/obj/effect/turf_decal/tile/neutral{
dir = 1
},
+/obj/effect/landmark/start/prisoner,
/obj/machinery/button/door{
- id = "permabolt1";
- name = "Cell Bolt Control";
- normaldoorcontrol = 1;
- pixel_y = 25;
- specialfunctions = 4
+ id = "permacells1";
+ name = "Privacy Shutters";
+ pixel_x = 25
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/dark,
+/area/security/prison/cells)
+"acC" = (
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
/area/security/prison)
-"acE" = (
-/obj/structure/bed,
-/obj/machinery/camera{
- c_tag = "Prison Cell 2";
- network = list("ss13","prison")
+"acD" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/preopen{
+ id = "Prison Gate";
+ name = "prison blast door"
},
-/obj/item/radio/intercom{
- desc = "Talk through this. It looks like it has been modified to not broadcast.";
- name = "Prison Intercom (General)";
- pixel_y = 24;
- prison_radio = 1
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "Prison Gate";
+ name = "Prison Lockdown Shutters"
+ },
+/turf/open/floor/plating,
+/area/security/prison/upper)
+"acE" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/obj/machinery/light{
+ dir = 4;
+ light_color = "#c1caff"
},
/turf/open/floor/plasteel,
/area/security/prison)
@@ -1110,37 +1189,25 @@
/turf/open/floor/plasteel/dark,
/area/command/heads_quarters/hos)
"acG" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/security/prison)
+/turf/closed/wall,
+/area/security/prison/upper)
"acH" = (
-/obj/structure/bed,
-/obj/machinery/camera{
- c_tag = "Prison Cell 1";
- network = list("ss13","prison")
+/obj/structure/window/reinforced/tinted{
+ dir = 8
},
-/obj/item/radio/intercom{
- desc = "Talk through this. It looks like it has been modified to not broadcast.";
- name = "Prison Intercom (General)";
- pixel_y = 24;
- prison_radio = 1
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
},
-/turf/open/floor/plasteel,
-/area/security/prison)
-"acI" = (
-/obj/machinery/door/poddoor/preopen{
- id = "executionfireblast"
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/general/hidden,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/window/westright{
- dir = 1;
- name = "Transfer Room";
- req_access_txt = "2"
- },
-/obj/effect/turf_decal/tile/neutral{
+/obj/effect/turf_decal/tile/blue{
dir = 1
},
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"acI" = (
+/obj/effect/spawner/lootdrop/prison_contraband,
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 4
@@ -1148,28 +1215,34 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/structure/bed,
+/obj/item/bedsheet/red,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/turf/open/floor/plasteel/dark,
-/area/security/execution/transfer)
+/area/security/prison/cells)
"acJ" = (
+/obj/structure/chair/stool,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 9
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"acK" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
-/area/security/prison)
-"acK" = (
-/obj/structure/mirror{
- pixel_x = 25
- },
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/structure/sink{
- dir = 4;
- pixel_x = 11
- },
-/turf/open/floor/plasteel/freezer,
-/area/security/prison)
+/area/security/prison/upper)
"acL" = (
/obj/machinery/disposal/bin,
/obj/structure/disposalpipe/trunk,
@@ -1178,7 +1251,7 @@
},
/obj/machinery/firealarm{
dir = 8;
- pixel_x = 28
+ pixel_x = 24
},
/turf/open/floor/plasteel/dark,
/area/command/heads_quarters/hos)
@@ -1256,16 +1329,6 @@
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
-"acV" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/solars/port/fore)
"acW" = (
/obj/structure/cable{
icon_state = "0-2"
@@ -1276,77 +1339,74 @@
},
/turf/open/floor/plasteel/airless/solarpanel,
/area/solars/port/fore)
-"acX" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/door/poddoor/preopen{
- id = "executionfireblast"
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/plating,
-/area/security/execution/transfer)
"acY" = (
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/obj/structure/table,
-/obj/item/paper,
-/obj/item/pen,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/security/prison)
-"acZ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "executionfireblast"
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/plating,
-/area/security/execution/transfer)
"ada" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/machinery/flasher{
- id = "PCell 3";
- pixel_x = -28
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
},
-/turf/open/floor/plasteel,
-/area/security/prison)
-"adb" = (
-/obj/structure/table,
-/obj/item/paper,
-/obj/item/pen,
-/turf/open/floor/plasteel,
-/area/security/prison)
-"adc" = (
-/obj/machinery/flasher{
- id = "PCell 1";
- pixel_x = -28
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/prison)
-"add" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/machinery/flasher{
- id = "PCell 2";
- pixel_x = -28
- },
-/turf/open/floor/plasteel,
-/area/security/prison)
-"ade" = (
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison)
+"adb" = (
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"adc" = (
+/obj/machinery/light,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"add" = (
+/obj/structure/table,
+/obj/item/clothing/shoes/sneakers/orange{
+ pixel_x = -6;
+ pixel_y = 10
+ },
+/obj/item/clothing/shoes/sneakers/orange{
+ pixel_x = -6;
+ pixel_y = -2
+ },
+/obj/item/clothing/shoes/sneakers/orange{
+ pixel_x = -6;
+ pixel_y = 4
+ },
+/obj/item/clothing/shoes/sneakers/orange{
+ pixel_x = -6;
+ pixel_y = -8
+ },
+/obj/item/clothing/under/rank/prisoner{
+ pixel_x = 8;
+ pixel_y = 5
+ },
+/obj/machinery/camera{
+ c_tag = "Permabrig Processing";
+ dir = 8;
+ network = list("ss13","prison")
},
/turf/open/floor/plasteel,
/area/security/prison)
"adf" = (
-/obj/structure/toilet/secret/prison{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/turf/open/floor/plasteel/freezer,
-/area/security/prison)
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
"adg" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
@@ -1446,18 +1506,7 @@
/turf/open/floor/plasteel,
/area/security/prison)
"adp" = (
-/obj/structure/table,
/obj/effect/turf_decal/tile/red,
-/obj/item/radio/headset{
- desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast.";
- name = "prisoner headset";
- prison_radio = 1
- },
-/obj/item/radio/headset{
- desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast.";
- name = "prisoner headset";
- prison_radio = 1
- },
/turf/open/floor/plasteel,
/area/security/prison)
"adq" = (
@@ -1496,24 +1545,6 @@
/obj/effect/landmark/barthpot,
/turf/open/floor/wood,
/area/service/library)
-"adw" = (
-/obj/structure/cable,
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/solars/port/fore)
-"adx" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/solars/port/fore)
"ady" = (
/obj/structure/lattice/catwalk,
/turf/open/space,
@@ -1538,89 +1569,81 @@
},
/turf/open/floor/plasteel,
/area/security/office)
-"adC" = (
-/obj/structure/table,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/item/razor,
-/obj/item/toy/plush/borgplushie{
- desc = "A horrible abomination to God in plushie form. Legends say this is used to torture prisoners by repeatedly beating them in the head with it.. ..It feels sorta heavy.";
- force = 1;
- name = "dogborg plushie";
- throwforce = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/security/execution/transfer)
"adD" = (
-/obj/machinery/button/flasher{
- id = "executionflash";
- pixel_x = 24;
- pixel_y = 5
- },
-/obj/machinery/button/door{
- id = "executionspaceblast";
- name = "Vent to Space";
- pixel_x = 25;
- pixel_y = -5;
- req_access_txt = "7"
- },
-/obj/machinery/atmospherics/pipe/simple/general/hidden,
-/turf/open/floor/plasteel/dark,
-/area/security/execution/transfer)
-"adE" = (
-/obj/structure/table,
-/obj/item/folder/red{
- pixel_x = 3
- },
-/obj/item/taperecorder{
- pixel_x = -3
- },
-/obj/item/assembly/flash/handheld,
-/obj/item/reagent_containers/spray/pepper,
-/turf/open/floor/plasteel/dark,
-/area/security/execution/transfer)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/closed/wall/r_wall,
+/area/security/prison/cells)
"adF" = (
+/obj/machinery/door/airlock/security/glass{
+ id_tag = "permaouter";
+ name = "Permabrig Transfer";
+ req_access_txt = "2"
+ },
+/obj/machinery/door/firedoor,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall,
-/area/security/prison)
-"adG" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/security/prison)
-"adH" = (
-/obj/machinery/door/airlock/security/glass{
- name = "Long-Term Cell 3";
- req_access_txt = "2"
- },
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 1
},
-/turf/open/floor/plasteel,
-/area/security/prison)
-"adI" = (
-/obj/machinery/door/airlock/security/glass{
- name = "Long-Term Cell 2";
- req_access_txt = "2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/security/prison)
-"adJ" = (
-/obj/machinery/door/airlock/security/glass{
- name = "Long-Term Cell 1";
- req_access_txt = "2"
- },
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel/dark,
+/area/security/prison)
+"adH" = (
+/obj/machinery/door/airlock/security/glass{
+ id_tag = "permaouter";
+ name = "Permabrig Transfer";
+ req_access_txt = "2"
+ },
+/obj/machinery/door/firedoor,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 1
},
-/turf/open/floor/plasteel,
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plasteel/dark,
/area/security/prison)
+"adI" = (
+/turf/closed/wall/r_wall,
+/area/security/prison/upper)
+"adJ" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Permabrig Visitation";
+ req_access_txt = "2"
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
"adK" = (
/obj/effect/turf_decal/tile/red{
dir = 4
@@ -1629,14 +1652,14 @@
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = -26
- },
/obj/machinery/camera{
c_tag = "Brig EVA Storage";
dir = 4
},
+/obj/machinery/firealarm{
+ dir = 4;
+ pixel_x = -24
+ },
/turf/open/floor/plasteel/dark,
/area/security/brig)
"adL" = (
@@ -1789,170 +1812,141 @@
/obj/structure/lattice/catwalk,
/turf/open/space,
/area/solars/starboard/fore)
-"adZ" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/solars/port/fore)
-"aea" = (
-/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
-/obj/machinery/atmospherics/components/unary/portables_connector/visible,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/security/execution/transfer)
"aeb" = (
/obj/structure/table,
-/obj/item/flashlight/lamp,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/security/execution/transfer)
-"aec" = (
-/obj/structure/window/reinforced{
- dir = 4
+/obj/item/storage/box/handcuffs{
+ pixel_y = 10
},
-/obj/machinery/portable_atmospherics/canister/carbon_dioxide,
-/obj/machinery/atmospherics/components/unary/portables_connector/visible,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
+/obj/item/storage/box/prisoner{
+ pixel_y = 4
},
-/turf/open/floor/plating,
-/area/security/execution/transfer)
-"aed" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/obj/machinery/button/ignition{
- id = "executionburn";
- pixel_x = 24;
- pixel_y = 5
- },
-/obj/machinery/button/door{
- id = "executionfireblast";
- name = "Transfer Area Lockdown";
- pixel_x = 25;
- pixel_y = -5;
- req_access_txt = "2"
- },
-/obj/machinery/atmospherics/pipe/simple/general/hidden,
-/turf/open/floor/plasteel/dark,
-/area/security/execution/transfer)
-"aee" = (
-/obj/structure/chair{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/security/execution/transfer)
-"aef" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
/obj/effect/turf_decal/tile/red{
dir = 1
},
/obj/effect/turf_decal/tile/red{
dir = 8
},
-/obj/structure/table,
-/obj/item/restraints/handcuffs,
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/dark,
/area/security/prison)
-"aeg" = (
+"aed" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/security/execution/transfer)
-"aeh" = (
-/obj/machinery/button/door{
- id = "permacell3";
- name = "Cell 3 Lockdown";
- pixel_x = -4;
- pixel_y = 25;
- req_access_txt = "2"
+/obj/effect/turf_decal/delivery,
+/obj/machinery/disposal/deliveryChute,
+/obj/structure/plasticflaps/opaque{
+ name = "Prisoner Transfer"
},
-/obj/machinery/button/flasher{
- id = "PCell 3";
- pixel_x = 6;
- pixel_y = 24
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/turf/open/floor/plasteel,
+/obj/structure/disposalpipe/trunk,
+/turf/open/floor/plasteel/dark,
/area/security/prison)
-"aei" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/security/prison)
-"aej" = (
+"aef" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/red{
- dir = 1
+/obj/structure/cable{
+ icon_state = "1-2"
},
/turf/open/floor/plasteel,
/area/security/prison)
-"aek" = (
-/obj/machinery/light{
+"aeg" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
dir = 1
},
-/obj/machinery/computer/security/telescreen/prison{
- pixel_y = 30
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
+"aeh" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
+"aei" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "Prison Gate";
+ name = "Prison Lockdown Shutters"
+ },
+/turf/open/floor/plating,
+/area/security/prison)
+"aej" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/machinery/light_switch{
+ pixel_y = 23
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
+"aek" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
/obj/effect/turf_decal/tile/red{
dir = 1
},
/obj/effect/turf_decal/tile/red{
dir = 4
},
+/obj/machinery/firealarm{
+ pixel_y = 24
+ },
/turf/open/floor/plasteel,
/area/security/prison)
"ael" = (
-/obj/machinery/button/door{
- id = "permacell2";
- name = "Cell 2 Lockdown";
- pixel_x = -4;
- pixel_y = 25;
- req_access_txt = "2"
- },
-/obj/machinery/button/flasher{
- id = "PCell 2";
- pixel_x = 6;
- pixel_y = 24
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/effect/turf_decal/tile/red{
dir = 4
},
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/security/prison)
"aem" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/security/prison)
"aen" = (
-/obj/machinery/computer/security/telescreen/prison{
- pixel_y = 30
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/machinery/camera{
- c_tag = "Prison Hallway";
+ c_tag = "Prison Hallway East";
network = list("ss13","prison")
},
/obj/effect/turf_decal/tile/red{
@@ -1982,41 +1976,24 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/security/prison)
"aeq" = (
-/obj/machinery/button/door{
- id = "permacell1";
- name = "Cell 1 Lockdown";
- pixel_x = -4;
- pixel_y = 25;
- req_access_txt = "2"
- },
-/obj/machinery/button/flasher{
- id = "PCell 1";
- pixel_x = 6;
- pixel_y = 24
- },
-/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
/obj/effect/turf_decal/tile/red{
dir = 4
},
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/security/prison)
"aer" = (
-/obj/machinery/firealarm{
- pixel_y = 24
- },
/obj/machinery/power/apc{
areastring = "/area/security/prison";
dir = 4;
name = "Prison Wing APC";
pixel_x = 24
},
-/obj/structure/cable{
- icon_state = "0-8"
- },
/obj/effect/turf_decal/tile/red{
dir = 1
},
@@ -2024,6 +2001,13 @@
/obj/effect/turf_decal/tile/red{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
/turf/open/floor/plasteel,
/area/security/prison)
"aes" = (
@@ -2216,103 +2200,31 @@
},
/turf/open/floor/plasteel/airless/solarpanel,
/area/solars/starboard/fore)
-"aeH" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
- },
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/security/execution/transfer)
-"aeI" = (
-/obj/structure/rack,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
-/obj/item/flashlight{
- pixel_x = 1;
- pixel_y = 5
- },
-/obj/item/tank/internals/anesthetic{
- pixel_x = -3;
- pixel_y = 1
- },
-/obj/item/tank/internals/oxygen/red{
- pixel_x = 3
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/security/execution/transfer)
-"aeJ" = (
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/security/execution/transfer)
-"aeK" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/general/hidden,
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel/dark,
-/area/security/execution/transfer)
"aeL" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel/dark,
-/area/security/execution/transfer)
+/area/security/prison)
"aeM" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
+/obj/structure/cable{
+ icon_state = "2-4"
},
/obj/structure/cable{
- icon_state = "2-8"
+ icon_state = "1-4"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
},
/turf/open/floor/plasteel,
/area/security/prison)
-"aeN" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/security{
- aiControlDisabled = 1;
- name = "Prisoner Transfer Centre";
- req_access_txt = "2"
- },
-/turf/open/floor/plasteel/dark,
-/area/security/execution/transfer)
"aeO" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -2332,22 +2244,24 @@
/obj/structure/cable{
icon_state = "2-4"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
/obj/effect/turf_decal/tile/red{
dir = 1
},
/obj/effect/turf_decal/tile/red{
dir = 4
},
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/security/prison)
"aeQ" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/obj/structure/cable{
icon_state = "4-8"
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/security/prison)
"aeR" = (
@@ -2357,16 +2271,10 @@
/turf/open/floor/plating,
/area/hallway/secondary/exit)
"aeS" = (
-/obj/structure/closet/secure_closet/brig,
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 8
},
-/obj/item/radio/headset{
- desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast.";
- name = "prisoner headset";
- prison_radio = 1
- },
/obj/structure/cable{
icon_state = "1-2"
},
@@ -2376,10 +2284,12 @@
/obj/structure/cable{
icon_state = "1-4"
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/obj/structure/cable{
icon_state = "4-8"
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/security/prison)
"aeU" = (
@@ -2691,6 +2601,10 @@
/obj/structure/cable{
icon_state = "0-4"
},
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "Prison Gate";
+ name = "Prison Lockdown Shutters"
+ },
/turf/open/floor/plating,
/area/security/brig)
"afr" = (
@@ -2717,90 +2631,73 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel/dark,
/area/command/heads_quarters/hos)
-"aft" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/security/execution/transfer)
"afu" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/security/execution/transfer)
-"afv" = (
-/obj/machinery/atmospherics/pipe/simple/general/hidden{
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
dir = 4
},
-/turf/open/floor/plasteel/dark,
-/area/security/execution/transfer)
-"afw" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- layer = 2.4
- },
-/obj/machinery/door/window/southleft{
- base_state = "right";
- dir = 4;
- icon_state = "right";
- name = "Armory";
- req_access_txt = "2"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plating,
-/area/security/execution/transfer)
-"afx" = (
-/obj/machinery/light_switch{
- pixel_x = 25
- },
-/obj/machinery/atmospherics/pipe/simple/general/hidden{
- dir = 9
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/dark,
-/area/security/execution/transfer)
-"afy" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/general/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/security/execution/transfer)
-"afz" = (
/obj/effect/turf_decal/tile/red{
dir = 1
},
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/bot_white,
+/obj/structure/closet/secure_closet/brig,
+/turf/open/floor/plasteel/dark,
+/area/security/prison)
+"afv" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
+/turf/open/floor/plasteel/dark,
+/area/security/prison)
+"afw" = (
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 8
},
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/structure/reagent_dispensers/peppertank{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison)
+"afy" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison)
+"afA" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
/turf/open/floor/plasteel,
/area/security/prison)
-"afA" = (
-/turf/closed/wall/r_wall,
-/area/security/execution/transfer)
"afB" = (
/obj/item/radio/intercom{
dir = 4;
name = "Station Intercom (General)";
pixel_x = 27
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 4
},
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/security/prison)
"afC" = (
@@ -2831,21 +2728,16 @@
/turf/open/floor/plating,
/area/hallway/secondary/exit)
"afF" = (
-/obj/structure/table,
-/obj/item/assembly/signaler,
-/obj/item/clothing/suit/straight_jacket,
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 8
},
+/obj/machinery/light{
+ light_color = "#d1dfff"
+ },
/turf/open/floor/plasteel,
/area/security/prison)
"afG" = (
-/obj/structure/table,
-/obj/item/storage/box/hug,
-/obj/item/razor{
- pixel_x = -6
- },
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 8
@@ -2899,9 +2791,6 @@
pixel_y = -27
},
/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
/turf/open/floor/plasteel,
/area/security/prison)
"afK" = (
@@ -3082,39 +2971,59 @@
/area/security/range)
"agf" = (
/obj/structure/table,
-/obj/item/stack/sheet/metal,
-/obj/item/storage/box/bodybags,
-/obj/item/pen,
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -24
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
},
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/item/clothing/gloves/color/orange,
+/obj/item/restraints/handcuffs,
+/obj/item/reagent_containers/spray/pepper,
/turf/open/floor/plasteel/dark,
-/area/security/execution/transfer)
+/area/security/prison)
"agg" = (
-/obj/structure/closet/secure_closet/injection,
-/obj/structure/cable,
-/obj/machinery/power/apc{
- areastring = "/area/security/execution/transfer";
- name = "Prisoner Transfer Centre";
- pixel_y = -27
+/obj/structure/table,
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
},
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/item/clothing/suit/straight_jacket,
+/obj/item/electropack/shockcollar,
+/obj/item/assembly/signaler,
/turf/open/floor/plasteel/dark,
-/area/security/execution/transfer)
+/area/security/prison)
"agh" = (
/obj/structure/table,
-/obj/item/electropack,
-/obj/item/screwdriver,
-/obj/item/wrench,
-/obj/item/clothing/head/helmet,
-/obj/item/assembly/signaler,
-/obj/machinery/light/small,
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
+/obj/item/storage/box/hug,
+/obj/item/razor{
+ pixel_x = -6
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/machinery/light{
+ light_color = "#d1dfff"
},
/turf/open/floor/plasteel/dark,
-/area/security/execution/transfer)
+/area/security/prison)
"agi" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/security/glass{
@@ -3494,7 +3403,11 @@
/obj/structure/cable{
icon_state = "1-8"
},
-/turf/open/floor/plasteel,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "Prison Gate";
+ name = "Prison Lockdown Shutters"
+ },
+/turf/open/floor/plasteel/dark,
/area/security/brig)
"agP" = (
/obj/structure/cable{
@@ -3846,6 +3759,10 @@
/obj/structure/cable{
icon_state = "0-4"
},
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "Prison Gate";
+ name = "Prison Lockdown Shutters"
+ },
/turf/open/floor/plating,
/area/security/brig)
"ahw" = (
@@ -3857,6 +3774,10 @@
icon_state = "1-4"
},
/obj/structure/cable,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "Prison Gate";
+ name = "Prison Lockdown Shutters"
+ },
/turf/open/floor/plating,
/area/security/brig)
"ahx" = (
@@ -3972,19 +3893,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/security/processing)
-"ahE" = (
-/obj/structure/closet/secure_closet/brig,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/item/radio/headset{
- desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast.";
- name = "prisoner headset";
- prison_radio = 1
- },
-/turf/open/floor/plasteel,
-/area/security/prison)
"ahF" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -4407,9 +4315,6 @@
/turf/open/floor/plating,
/area/security/brig)
"aik" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
/obj/effect/turf_decal/tile/red{
dir = 1
},
@@ -4424,12 +4329,6 @@
},
/turf/open/floor/plasteel,
/area/security/office)
-"ail" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/security/range)
"aim" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
@@ -5070,9 +4969,6 @@
/turf/open/floor/plasteel,
/area/commons/vacant_room/office/b)
"aju" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
/obj/structure/cable{
icon_state = "2-4"
},
@@ -5392,13 +5288,6 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/maintenance/solars/port/fore)
-"ajW" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/solars/port/fore)
"ajX" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -5847,15 +5736,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/engine,
/area/science/xenobiology)
-"akQ" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plasteel,
-/area/security/prison)
"akR" = (
/obj/machinery/camera{
c_tag = "Security Office";
@@ -6629,19 +6509,6 @@
},
/turf/open/floor/plasteel/dark,
/area/security/courtroom)
-"amv" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/solars/port/fore)
"amw" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -7078,11 +6945,6 @@
id = "Cell 2";
name = "Cell 2 Locker"
},
-/obj/item/radio/headset{
- desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast.";
- name = "prisoner headset";
- prison_radio = 1
- },
/obj/structure/cable{
icon_state = "1-4"
},
@@ -7690,7 +7552,7 @@
},
/obj/machinery/firealarm{
dir = 8;
- pixel_x = 24;
+ pixel_x = 26;
pixel_y = -28
},
/turf/open/floor/plasteel,
@@ -8495,16 +8357,6 @@
},
/turf/open/floor/plasteel,
/area/security/processing)
-"aqJ" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/solars/port/fore)
"aqN" = (
/obj/structure/closet/secure_closet/warden,
/obj/structure/sign/poster/official/ion_rifle{
@@ -8832,11 +8684,6 @@
id = "Cell 3";
name = "Cell 3 Locker"
},
-/obj/item/radio/headset{
- desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast.";
- name = "prisoner headset";
- prison_radio = 1
- },
/obj/structure/cable{
icon_state = "1-4"
},
@@ -9151,7 +8998,7 @@
},
/obj/machinery/firealarm{
dir = 8;
- pixel_x = 28
+ pixel_x = 24
},
/turf/open/floor/plasteel/dark,
/area/security/brig)
@@ -9225,7 +9072,7 @@
},
/obj/machinery/firealarm{
dir = 8;
- pixel_x = 28
+ pixel_x = 24
},
/turf/open/floor/plasteel,
/area/security/processing)
@@ -41516,10 +41363,6 @@
"bXs" = (
/turf/open/floor/plasteel/white,
/area/science/circuit)
-"bXv" = (
-/obj/item/stack/rods,
-/turf/open/space,
-/area/space)
"bXw" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plasteel,
@@ -42169,7 +42012,8 @@
/area/maintenance/port/aft)
"bZm" = (
/obj/structure/disposaloutlet{
- dir = 8
+ dir = 8;
+ name = "Prisoner Outlet"
},
/obj/structure/disposalpipe/trunk{
dir = 4
@@ -50585,6 +50429,12 @@
/obj/effect/landmark/event_spawn,
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
+"czP" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/closed/wall,
+/area/security/prison/cells)
"czQ" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/disposalpipe/segment,
@@ -51302,6 +51152,20 @@
/obj/machinery/deepfryer,
/turf/open/floor/plasteel/cafeteria,
/area/service/kitchen)
+"cCr" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
"cCs" = (
/obj/structure/closet/emcloset,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -51826,6 +51690,22 @@
/obj/structure/sign/poster/official/cohiba_robusto_ad,
/turf/closed/wall,
/area/service/lawoffice)
+"cJA" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
"cJW" = (
/obj/machinery/computer/gateway_control,
/turf/open/floor/plasteel,
@@ -51882,6 +51762,24 @@
"cNd" = (
/turf/open/space/basic,
/area/space/station_ruins)
+"cNi" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/preopen{
+ id = "Prison Gate";
+ name = "prison blast door"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "Prison Gate";
+ name = "Prison Lockdown Shutters"
+ },
+/turf/open/floor/plating,
+/area/security/prison/upper)
"cNE" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall,
@@ -52042,13 +51940,13 @@
/obj/structure/sign/warning/securearea{
pixel_x = -32
},
-/obj/machinery/door/poddoor/preopen{
- id = "Prison Gate";
- name = "prison blast door"
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "Prison Gate";
+ name = "Prison Lockdown Shutters"
+ },
+/turf/open/floor/plasteel/dark,
/area/security/prison)
"cPb" = (
/turf/open/floor/wood/wood_diagonal,
@@ -52112,6 +52010,10 @@
/obj/item/folder/blue,
/turf/open/floor/plasteel/dark,
/area/hallway/primary/central)
+"cSp" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/closed/wall/r_wall,
+/area/security/prison/upper)
"cSA" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -52379,6 +52281,13 @@
},
/turf/open/floor/plasteel,
/area/engineering/main)
+"cTo" = (
+/obj/structure/table/wood,
+/obj/item/storage/dice,
+/obj/item/instrument/piano_synth,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"cTD" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -52508,6 +52417,13 @@
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"cVE" = (
+/obj/machinery/computer/cryopod{
+ pixel_y = 26
+ },
+/obj/effect/turf_decal/loading_area,
+/turf/open/floor/plasteel/dark,
+/area/security/prison/cells)
"cVK" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/turf/open/floor/plasteel/white,
@@ -52519,6 +52435,16 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
+"cYf" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"cZe" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -52636,6 +52562,22 @@
},
/turf/open/floor/plasteel,
/area/science/circuit)
+"dfj" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/manifold{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/turf/open/floor/plating,
+/area/security/execution/transfer)
"dfL" = (
/obj/structure/reagent_dispensers/keg/gargle,
/turf/open/floor/wood,
@@ -52703,6 +52645,16 @@
},
/turf/open/floor/plasteel/dark,
/area/medical/paramedic)
+"dnX" = (
+/obj/effect/turf_decal/stripes/white/line,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"dqb" = (
/turf/open/floor/plasteel,
/area/commons/fitness/pool)
@@ -52749,6 +52701,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 +52744,38 @@
/turf/open/floor/plating,
/area/security/brig)
"dyS" = (
-/obj/effect/turf_decal/tile/green{
- dir = 8
+/obj/machinery/door/airlock/public/glass{
+ name = "Prison Cafeteria"
},
-/obj/effect/turf_decal/tile/green{
- dir = 1
- },
-/obj/effect/turf_decal/tile/green,
-/obj/effect/turf_decal/tile/green{
+/obj/machinery/door/firedoor,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/turf/open/floor/plasteel,
-/area/security/prison)
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
"dzi" = (
/obj/structure/cable{
icon_state = "2-4"
},
/turf/open/floor/carpet,
/area/commons/cryopod)
+"dzK" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"dAe" = (
/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
dir = 1
@@ -52806,6 +52783,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 +52838,29 @@
},
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"dIZ" = (
+/turf/open/floor/padded,
+/area/security/execution/transfer)
+"dJu" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/decal/cleanable/blood/old,
+/obj/machinery/button/door{
+ id = "permacells3";
+ name = "Privacy Shutters";
+ pixel_x = 25
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/cells)
"dJL" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -52875,6 +52880,28 @@
/obj/structure/chair/stool/bar,
/turf/open/floor/wood,
/area/maintenance/bar)
+"dLi" = (
+/obj/machinery/hydroponics/soil,
+/obj/item/cultivator,
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"dLl" = (
+/obj/item/stack/rods,
+/turf/open/space,
+/area/space)
+"dLZ" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"dMj" = (
/obj/machinery/space_heater,
/obj/effect/turf_decal/stripes/line{
@@ -52888,6 +52915,12 @@
},
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"dNP" = (
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 9
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"dPk" = (
/obj/structure/closet{
name = "Costume Closet"
@@ -52914,6 +52947,36 @@
},
/turf/open/floor/plating,
/area/maintenance/fore)
+"dPs" = (
+/obj/machinery/hydroponics/soil,
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"dPE" = (
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"dQD" = (
/obj/machinery/atmospherics/components/binary/pump{
dir = 8;
@@ -52921,6 +52984,26 @@
},
/turf/open/floor/plasteel,
/area/maintenance/disposal/incinerator)
+"dQS" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison)
+"dSh" = (
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"dTI" = (
/obj/structure/urinal{
pixel_y = 32
@@ -52945,6 +53028,27 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/command/gateway)
+"dYQ" = (
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/effect/decal/cleanable/blood/old,
+/obj/machinery/button/electrochromatic{
+ id = "!permabrigshowers";
+ pixel_x = -25
+ },
+/turf/open/floor/plasteel/freezer,
+/area/security/prison/cells)
"dYZ" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -52969,6 +53073,13 @@
},
/turf/open/space,
/area/solars/starboard/fore)
+"ebo" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/turf/open/floor/plasteel/dark,
+/area/security/execution/transfer)
"ecg" = (
/turf/open/floor/plasteel/yellowsiding/corner{
dir = 4
@@ -52981,6 +53092,10 @@
},
/turf/open/floor/plasteel/dark,
/area/medical/morgue)
+"ecB" = (
+/obj/item/toy/beach_ball/holoball,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"edj" = (
/obj/structure/sign/poster/contraband/random{
pixel_y = 32
@@ -53044,6 +53159,26 @@
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
+"ejr" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/door/airlock/grunge{
+ name = "Permanent Cell 4";
+ wiretypepath = /datum/wires/airlock/security
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/cells)
"eky" = (
/obj/structure/table/wood,
/obj/item/reagent_containers/food/snacks/baguette,
@@ -53062,6 +53197,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 +53233,48 @@
/obj/structure/table/wood/poker,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"eoJ" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/door/airlock/grunge{
+ name = "Permanent Cell 5";
+ wiretypepath = /datum/wires/airlock/security
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/cells)
+"eoR" = (
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"epj" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
"epD" = (
/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
/obj/machinery/light{
@@ -53098,21 +53286,27 @@
},
/turf/open/floor/plasteel,
/area/commons/fitness)
-"eqd" = (
-/obj/item/electropack/shockcollar,
-/obj/item/assembly/signaler,
-/turf/open/floor/plating,
-/area/security/prison)
+"epG" = (
+/obj/machinery/firealarm{
+ dir = 1;
+ pixel_y = -24
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"eqq" = (
/obj/machinery/atmospherics/pipe/manifold/orange/visible,
/turf/open/floor/plasteel,
/area/engineering/atmos)
"eqA" = (
-/obj/machinery/shower{
- dir = 8
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/turf/open/floor/plasteel/freezer,
-/area/security/prison)
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
"esK" = (
/obj/machinery/door/airlock/maintenance/abandoned{
name = "Chemical Storage";
@@ -53144,6 +53338,17 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/wood,
/area/service/library)
+"etr" = (
+/obj/structure/chair/stool,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"eus" = (
/obj/machinery/portable_atmospherics/scrubber,
/obj/effect/turf_decal/stripes/line{
@@ -53151,6 +53356,40 @@
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
+"evc" = (
+/obj/machinery/hydroponics/soil,
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/machinery/camera{
+ c_tag = "Prison Forestry";
+ dir = 4;
+ network = list("ss13","prison")
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"evh" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/camera{
+ c_tag = "Prison Workshop";
+ dir = 4;
+ network = list("ss13","prison")
+ },
+/obj/item/stack/sticky_tape,
+/obj/item/stack/sheet/cardboard{
+ amount = 14
+ },
+/obj/item/stack/packageWrap,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"evR" = (
/turf/open/floor/plating,
/area/maintenance/bar)
@@ -53165,6 +53404,17 @@
},
/turf/open/floor/plating,
/area/commons/fitness)
+"ewG" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "permacells5";
+ name = "Privacy Shutters"
+ },
+/turf/open/floor/plating,
+/area/security/prison/cells)
"ewN" = (
/obj/machinery/hydroponics/soil{
pixel_y = 8
@@ -53273,6 +53523,16 @@
/obj/item/clothing/under/rank/civilian/lawyer/red,
/turf/open/floor/plasteel,
/area/commons/fitness)
+"eCB" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/turf/open/floor/plating,
+/area/security/prison/upper)
"eCR" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -53280,6 +53540,19 @@
},
/turf/closed/wall/r_wall,
/area/engineering/gravity_generator)
+"eDf" = (
+/obj/structure/window/reinforced/tinted{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"eDz" = (
/obj/structure/cable/white{
icon_state = "2-8"
@@ -53288,6 +53561,37 @@
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"
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison)
"eFx" = (
/obj/effect/turf_decal/tile/red{
dir = 1
@@ -53324,6 +53628,14 @@
/obj/effect/spawner/structure/window/shuttle,
/turf/open/floor/plating/airless,
/area/space/nearstation)
+"eIW" = (
+/obj/structure/table,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
"eJa" = (
/obj/structure/table/wood/poker,
/obj/item/toy/cards/deck{
@@ -53334,6 +53646,22 @@
},
/turf/open/floor/wood,
/area/service/bar)
+"eJu" = (
+/obj/machinery/button/door{
+ id = "executionspaceblast";
+ name = "Vent to Space";
+ pixel_x = 25;
+ pixel_y = -5;
+ req_access_txt = "7"
+ },
+/obj/machinery/button/flasher{
+ id = "executionflash";
+ pixel_x = 24;
+ pixel_y = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel/dark,
+/area/security/execution/transfer)
"eMs" = (
/obj/structure/rack,
/obj/effect/spawner/lootdrop/maintenance{
@@ -53363,10 +53691,59 @@
/obj/structure/grille,
/turf/open/space/basic,
/area/space/nearstation)
+"eRS" = (
+/obj/structure/table,
+/obj/item/folder/red{
+ pixel_x = 3
+ },
+/obj/item/taperecorder{
+ pixel_x = -3
+ },
+/obj/item/assembly/flash/handheld,
+/obj/item/reagent_containers/spray/pepper,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/execution/transfer)
"eSe" = (
/obj/structure/closet/secure_closet/personal/cabinet,
/turf/open/floor/carpet,
/area/commons/dorms)
+"eSJ" = (
+/obj/machinery/button/ignition{
+ id = "executionburn";
+ pixel_x = 24;
+ pixel_y = 5
+ },
+/obj/machinery/button/door{
+ id = "executionfireblast";
+ name = "Transfer Area Lockdown";
+ pixel_x = 25;
+ pixel_y = -5;
+ req_access_txt = "2"
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel/dark,
+/area/security/execution/transfer)
+"eTt" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/lattice/catwalk,
+/turf/open/space,
+/area/solars/port/fore)
"eTA" = (
/obj/structure/table/wood/fancy,
/obj/item/reagent_containers/food/condiment/saltshaker{
@@ -53423,13 +53800,13 @@
/area/cargo/miningdock)
"eWL" = (
/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor/preopen{
- id = "Prison Gate";
- name = "prison blast door"
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "Prison Gate";
+ name = "Prison Lockdown Shutters"
+ },
+/turf/open/floor/plasteel/dark,
/area/security/prison)
"eXz" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
@@ -53437,6 +53814,15 @@
},
/turf/open/floor/plasteel,
/area/security/processing)
+"eXI" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"eXL" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
dir = 10
@@ -53448,11 +53834,62 @@
/obj/effect/landmark/start/paramedic,
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
+"eZI" = (
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 10
+ },
+/obj/machinery/light{
+ dir = 4;
+ light_color = "#e8eaff"
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"eZS" = (
+/obj/effect/turf_decal/bot_white,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/spawner/lootdrop/maintenance,
+/turf/open/floor/plating,
+/area/maintenance/prison/starboard)
"fbp" = (
/obj/structure/tank_dispenser,
/obj/effect/turf_decal/bot,
/turf/open/floor/engine,
/area/science/storage)
+"fbr" = (
+/obj/machinery/door/window/southleft{
+ base_state = "right";
+ dir = 4;
+ icon_state = "right";
+ name = "Transfer Chamber Configuration";
+ req_access_txt = "2"
+ },
+/obj/machinery/atmospherics/pipe/simple{
+ dir = 10
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating,
+/area/security/execution/transfer)
+"fbY" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/structure/bed,
+/obj/item/bedsheet/red,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/cells)
"fcd" = (
/obj/structure/chair/sofa/right{
dir = 8
@@ -53461,6 +53898,11 @@
icon_state = "platingdmg1"
},
/area/maintenance/port/fore)
+"fcj" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plating,
+/area/maintenance/prison/starboard)
"fcn" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/door/airlock/maintenance{
@@ -53478,11 +53920,61 @@
},
/turf/closed/wall/r_wall,
/area/science/mixing)
+"fdJ" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
"fdQ" = (
/obj/structure/bed,
/obj/effect/spawner/lootdrop/bedsheet,
/turf/open/floor/plating,
/area/maintenance/fore)
+"fdR" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/machinery/power/apc{
+ areastring = "/area/security/prison/cells";
+ damage_deflection = 21;
+ desc = "A control terminal for the area's electrical systems. It's secured with a durable antitampering plasteel cage.";
+ dir = 4;
+ name = "Armored Prison Wing Cells APC";
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
+"fdS" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/light{
+ dir = 1;
+ light_color = "#cee5d2"
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"feE" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -53498,6 +53990,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 +54031,26 @@
},
/turf/closed/wall,
/area/maintenance/disposal/incinerator)
+"fiR" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"fjS" = (
/obj/structure/closet/radiation,
/turf/open/floor/plasteel,
@@ -53586,6 +54111,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 +54453,12 @@
},
/turf/open/floor/plasteel,
/area/service/hydroponics)
+"fFR" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
"fGf" = (
/obj/machinery/smartfridge/disks{
pixel_y = 2
@@ -53958,6 +54502,17 @@
/obj/effect/landmark/start/atmospheric_technician,
/turf/open/floor/plasteel,
/area/engineering/atmos)
+"fKN" = (
+/obj/structure/table,
+/obj/structure/bedsheetbin,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/security/prison/upper)
"fLN" = (
/obj/machinery/chem_dispenser/drinks/beer{
dir = 1
@@ -53969,6 +54524,49 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/dark,
/area/security/courtroom)
+"fMF" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/door/airlock/grunge{
+ name = "Prison Laundry";
+ wiretypepath = /datum/wires/airlock/security
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
+"fMY" = (
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"fNB" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/effect/spawner/structure/window/reinforced/tinted/electrochromatic{
+ electrochromatic_id = "!permabrigshowers"
+ },
+/turf/open/floor/plating,
+/area/security/prison/cells)
"fNN" = (
/obj/machinery/door/firedoor,
/obj/structure/cable{
@@ -54113,11 +54711,6 @@
},
/turf/open/floor/plating,
/area/construction)
-"gbu" = (
-/obj/structure/bed,
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/plating,
-/area/security/prison)
"gbT" = (
/obj/item/storage/box/lights/mixed,
/obj/machinery/power/apc{
@@ -54131,6 +54724,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 +54749,38 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"gcV" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"gcX" = (
+/obj/structure/table,
+/obj/item/flashlight/lamp,
+/obj/item/stack/sheet/metal,
+/obj/item/storage/box/bodybags,
+/obj/item/pen,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple,
+/turf/open/floor/plasteel/dark,
+/area/security/execution/transfer)
+"gcY" = (
+/obj/structure/weightmachine/weightlifter,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"geg" = (
/obj/machinery/light/small{
dir = 8
@@ -54158,6 +54790,16 @@
/obj/item/reagent_containers/food/snacks/egg/yellow,
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"gfw" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/turf/open/floor/plating,
+/area/security/prison/upper)
"gfC" = (
/obj/effect/turf_decal/tile/red,
/obj/structure/chair{
@@ -54180,6 +54822,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 +54841,28 @@
"giy" = (
/turf/open/floor/carpet/arcade,
/area/commons/arcade)
+"giE" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/landmark/start/prisoner,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/button/door{
+ id = "permacells4";
+ name = "Privacy Shutters";
+ pixel_y = 25
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/cells)
"giT" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -54217,6 +54893,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 +54925,10 @@
},
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
+"grd" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall,
+/area/security/prison/upper)
"grr" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
@@ -54287,10 +54974,43 @@
/obj/machinery/meter,
/turf/closed/wall/r_wall,
/area/engineering/atmos)
+"gxK" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "permacells3";
+ name = "Privacy Shutters"
+ },
+/turf/open/floor/plating,
+/area/security/prison/cells)
"gyr" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/security/brig)
+"gyy" = (
+/obj/machinery/door/airlock/security{
+ name = "Isolation Cell";
+ req_access_txt = "2"
+ },
+/obj/machinery/door/firedoor,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/execution/transfer)
"gyQ" = (
/turf/open/floor/plasteel/freezer,
/area/commons/toilet)
@@ -54336,16 +55056,16 @@
/turf/open/floor/plasteel/dark,
/area/command/gateway)
"gDP" = (
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = 28
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
},
/obj/item/radio/intercom{
pixel_y = 20
},
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = 24
+ },
/turf/open/floor/plasteel,
/area/security/processing)
"gDZ" = (
@@ -54412,6 +55132,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 +55182,26 @@
},
/turf/open/floor/wood,
/area/maintenance/bar)
+"gMB" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/door/airlock/grunge{
+ name = "Permanent Cell 6";
+ wiretypepath = /datum/wires/airlock/security
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/cells)
"gMD" = (
/obj/machinery/atmospherics/pipe/simple/green/visible{
dir = 6
@@ -54477,15 +55226,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 +55243,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 +55267,24 @@
},
/turf/open/floor/carpet,
/area/service/library)
+"gSj" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/door/airlock/grunge{
+ name = "Permanent Cell 3";
+ wiretypepath = /datum/wires/airlock/security
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/cells)
"gTx" = (
/obj/effect/turf_decal/bot_white/left,
/obj/effect/turf_decal/tile/neutral{
@@ -54532,6 +55306,11 @@
},
/turf/closed/wall/r_wall,
/area/engineering/gravity_generator)
+"gVc" = (
+/obj/machinery/vending/sustenance,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"gWd" = (
/obj/structure/cable{
icon_state = "1-4"
@@ -54545,6 +55324,19 @@
/obj/structure/lattice,
/turf/open/space/basic,
/area/space/nearstation)
+"gXu" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"gYo" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -54576,6 +55368,18 @@
dir = 8
},
/area/medical/surgery)
+"gZT" = (
+/obj/machinery/power/apc{
+ areastring = "/area/maintenance/prison/port";
+ dir = 8;
+ name = "Prison Port Maintenance APC";
+ pixel_x = -25
+ },
+/obj/effect/turf_decal/bot,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/maintenance/prison/port)
"haM" = (
/obj/item/radio/intercom{
name = "Station Intercom (General)";
@@ -54607,6 +55411,21 @@
icon_state = "platingdmg1"
},
/area/maintenance/starboard/aft)
+"hch" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
"hcA" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -54617,6 +55436,19 @@
/obj/effect/turf_decal/tile/blue,
/turf/open/floor/plasteel,
/area/commons/fitness)
+"hcT" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/lattice/catwalk,
+/turf/open/space,
+/area/solars/port/fore)
"hgG" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/obj/structure/extinguisher_cabinet{
@@ -54653,6 +55485,26 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"hkA" = (
+/obj/structure/table,
+/obj/item/clothing/under/rank/prisoner/skirt{
+ pixel_x = -13;
+ pixel_y = 5
+ },
+/obj/item/clothing/under/rank/prisoner/skirt{
+ pixel_x = 9;
+ pixel_y = 5
+ },
+/obj/item/clothing/under/rank/prisoner{
+ pixel_x = -2;
+ pixel_y = 5
+ },
+/obj/machinery/flasher{
+ id = "waitingflash";
+ pixel_y = -28
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
"hlS" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -54683,6 +55535,18 @@
},
/turf/open/floor/wood/wood_diagonal,
/area/maintenance/port/fore)
+"hnp" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"hnU" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -54718,6 +55582,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 +55624,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 +55684,13 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"hEL" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/turf/open/floor/plating,
+/area/security/execution/transfer)
"hGH" = (
/obj/machinery/door/airlock{
desc = "Private study room where nerds are probably playing Dungeons and Dragons 13e, or a place for blood cult rituals.";
@@ -54807,6 +55721,23 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel/dark,
/area/hallway/primary/central)
+"hJO" = (
+/obj/structure/closet/crate/trashcart,
+/obj/effect/spawner/lootdrop/prison_contraband,
+/obj/item/trash/chips,
+/obj/item/trash/candy,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/security/prison/upper)
+"hKo" = (
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/effect/spawner/structure/window/reinforced/tinted/electrochromatic{
+ electrochromatic_id = "!permabrigshowers"
+ },
+/turf/open/floor/plating,
+/area/security/prison/cells)
"hMs" = (
/obj/structure/table,
/obj/item/storage/box/bodybags,
@@ -54837,6 +55768,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/maintenance/prison/port)
"hQX" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
@@ -54873,6 +55810,11 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/turf/open/floor/plating,
/area/service/abandoned_gambling_den)
+"hSf" = (
+/obj/structure/cable,
+/obj/structure/lattice/catwalk,
+/turf/open/space,
+/area/solars/port/fore)
"hSl" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -54923,6 +55865,11 @@
"ibK" = (
/turf/open/floor/plasteel,
/area/security/processing)
+"icS" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/grille,
+/turf/open/floor/plating,
+/area/maintenance/prison/port)
"idK" = (
/obj/effect/turf_decal/tile/red{
dir = 1
@@ -54947,6 +55894,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)
@@ -54995,6 +55952,18 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
+"ikv" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
"iky" = (
/obj/effect/turf_decal/weather/dirt,
/obj/effect/decal/cleanable/dirt,
@@ -55003,6 +55972,22 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"ili" = (
+/obj/structure/table,
+/obj/item/electropack,
+/obj/item/screwdriver,
+/obj/item/wrench,
+/obj/item/clothing/head/helmet,
+/obj/item/assembly/signaler,
+/obj/machinery/light/small,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4
+ },
+/obj/machinery/light_switch{
+ pixel_y = 23
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/execution/transfer)
"imk" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/simple/orange/visible{
@@ -55050,6 +56035,21 @@
},
/turf/open/floor/plasteel,
/area/commons/fitness/pool)
+"iqi" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/camera{
+ c_tag = "Prison Laundry";
+ dir = 4;
+ network = list("ss13","prison")
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/security/prison/upper)
"iql" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -55111,6 +56111,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 +56140,44 @@
},
/turf/open/floor/wood,
/area/maintenance/bar)
+"iBj" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/grille,
+/turf/open/floor/plating,
+/area/maintenance/prison/starboard)
+"iBq" = (
+/obj/machinery/portable_atmospherics/canister/air,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/maintenance/prison/starboard)
"iBv" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
},
/turf/open/floor/plasteel,
/area/commons/fitness/pool)
+"iCN" = (
+/obj/machinery/door/airlock{
+ name = "Permabrig Showers"
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/cells)
"iDo" = (
/obj/structure/grille,
/turf/open/space/basic,
@@ -55213,6 +56254,14 @@
},
/turf/open/floor/plasteel,
/area/commons/fitness/pool)
+"iMy" = (
+/obj/structure/chair/sofa/right,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"iNn" = (
/obj/machinery/camera{
c_tag = "Kitchen Cold Room"
@@ -55478,11 +56527,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/white,
/area/medical/medbay/lobby)
-"jjC" = (
-/obj/structure/table/wood,
-/obj/item/toy/cards/deck,
-/turf/open/floor/plasteel,
-/area/security/prison)
"jkx" = (
/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/machinery/computer/slot_machine,
@@ -55499,6 +56543,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 +56567,9 @@
},
/turf/open/floor/plasteel,
/area/commons/fitness)
+"jnk" = (
+/turf/closed/wall/r_wall,
+/area/maintenance/prison/starboard)
"jnV" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -55555,10 +56610,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 +56666,63 @@
/obj/structure/closet/athletic_mixed,
/turf/open/floor/plasteel,
/area/commons/fitness)
+"jvB" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"jvO" = (
+/obj/structure/rack,
+/obj/item/flashlight{
+ pixel_x = 1;
+ pixel_y = 5
+ },
+/obj/item/tank/internals/anesthetic{
+ pixel_x = -3;
+ pixel_y = 1
+ },
+/obj/item/tank/internals/oxygen/red{
+ pixel_x = 3
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/simple{
+ dir = 6
+ },
+/turf/open/floor/plating,
+/area/security/execution/transfer)
"jwH" = (
/obj/machinery/holopad,
/turf/open/floor/plasteel,
/area/service/hydroponics)
+"jxx" = (
+/obj/machinery/door/firedoor,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/door/airlock/public/glass{
+ name = "Prison Yard"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
"jxF" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -55708,10 +56831,6 @@
dir = 1
},
/area/commons/fitness)
-"jFd" = (
-/obj/effect/spawner/structure/window,
-/turf/open/floor/plating,
-/area/maintenance/port/fore)
"jFB" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
@@ -55758,6 +56877,23 @@
/obj/effect/landmark/start/assistant,
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
+"jHp" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"jHt" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/disposalpipe/segment{
@@ -55793,6 +56929,19 @@
/obj/structure/lattice,
/turf/open/space/basic,
/area/space/nearstation)
+"jIH" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"jIW" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -55807,6 +56956,37 @@
},
/turf/open/floor/wood,
/area/maintenance/port/aft)
+"jJP" = (
+/obj/structure/sign/warning/securearea{
+ pixel_x = 32
+ },
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space/nearstation)
+"jKc" = (
+/obj/structure/closet/secure_closet/injection,
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/obj/machinery/power/apc{
+ areastring = "/area/security/execution/transfer";
+ dir = 1;
+ name = "Prisoner Transfer Centre";
+ pixel_y = 23
+ },
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/execution/transfer)
+"jKm" = (
+/obj/structure/chair/comfy/brown{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"jKP" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable{
@@ -55828,12 +57008,6 @@
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/turf/open/floor/plasteel,
/area/engineering/engine_smes)
-"jLv" = (
-/obj/structure/sign/warning/securearea{
- pixel_x = 32
- },
-/turf/open/space,
-/area/space)
"jLJ" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/machinery/light/small,
@@ -55866,12 +57040,67 @@
},
/turf/open/floor/plating/rust,
/area/maintenance/port/fore)
-"jRw" = (
-/obj/machinery/computer/arcade/minesweeper{
- dir = 4
+"jNN" = (
+/obj/structure/cable{
+ icon_state = "1-8"
},
/turf/open/floor/plasteel,
/area/security/prison)
+"jOB" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/door/airlock/medical/glass{
+ name = "Prison Forestry"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
+"jRw" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"jRV" = (
+/turf/open/floor/plasteel,
+/area/security/prison)
+"jRW" = (
+/obj/item/reagent_containers/glass/bucket,
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/sink{
+ dir = 8;
+ pixel_x = -12
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"jSD" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -55892,6 +57121,39 @@
},
/turf/open/floor/plasteel,
/area/science/circuit)
+"jSY" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"jTy" = (
+/obj/machinery/washing_machine,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/cafeteria,
+/area/security/prison/upper)
+"jUN" = (
+/obj/structure/table/reinforced,
+/obj/structure/reagent_dispensers/servingdish,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"jUV" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -55908,6 +57170,22 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"jVP" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/cafeteria,
+/area/security/prison/upper)
+"jVV" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"jVX" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
dir = 4
@@ -55919,6 +57197,13 @@
dir = 1
},
/area/engineering/atmos)
+"jYl" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"jZT" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -55959,6 +57244,43 @@
/obj/machinery/atmospherics/pipe/simple/dark/visible,
/turf/open/space/basic,
/area/space/nearstation)
+"kcB" = (
+/obj/effect/turf_decal/tile/red,
+/obj/machinery/camera{
+ c_tag = "Prison Isolation Cell";
+ dir = 8;
+ network = list("ss13","prison");
+ view_range = 5
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/execution/transfer)
+"kcR" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/button/door{
+ id = "permacells4";
+ name = "Privacy Shutters";
+ pixel_y = 25
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/cells)
"kdF" = (
/obj/structure/window/reinforced{
dir = 1
@@ -55993,15 +57315,23 @@
/turf/open/floor/plasteel,
/area/commons/dorms)
"keM" = (
-/obj/machinery/light/small{
- dir = 1
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/preopen{
+ id = "Prison Gate";
+ name = "prison blast door"
},
-/obj/structure/window/reinforced{
- dir = 8
+/obj/structure/cable{
+ icon_state = "2-4"
},
-/obj/machinery/washing_machine,
-/turf/open/floor/plasteel/freezer,
-/area/security/prison)
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "Prison Gate";
+ name = "Prison Lockdown Shutters"
+ },
+/turf/open/floor/plating,
+/area/security/prison/upper)
"kfv" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -56011,6 +57341,16 @@
},
/turf/open/floor/plating,
/area/engineering/storage/tech)
+"kfG" = (
+/obj/structure/table/wood,
+/obj/item/toy/cards/deck,
+/obj/item/instrument/harmonica,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"kfS" = (
/turf/closed/wall/rust,
/area/maintenance/starboard/aft)
@@ -56026,12 +57366,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 +57402,22 @@
},
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
+"khO" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/security{
+ aiControlDisabled = 1;
+ name = "Prisoner Transfer Centre";
+ req_access_txt = "2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/execution/transfer)
"khV" = (
/obj/machinery/vending/cola/red,
/obj/structure/sign/poster/contraband/robust_softdrinks{
@@ -56105,6 +57467,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 +57488,16 @@
/obj/structure/grille,
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"kma" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/turf/open/floor/plating,
+/area/security/prison/cells)
"kmw" = (
/obj/structure/chair/comfy/black{
dir = 1
@@ -56156,6 +57535,27 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel/dark,
/area/hallway/primary/central)
+"knA" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
"kob" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/disposalpipe/segment,
@@ -56177,6 +57577,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 +57613,17 @@
"ktS" = (
/turf/open/space/basic,
/area/space/nearstation)
+"ktW" = (
+/obj/machinery/hydroponics/soil,
+/obj/item/plant_analyzer,
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"kuh" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -56335,6 +57767,21 @@
/obj/effect/landmark/stationroom/box/engine,
/turf/open/space/basic,
/area/space)
+"kGj" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/machinery/light,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"kGv" = (
/obj/machinery/atmospherics/pipe/simple/yellow/visible,
/obj/machinery/atmospherics/pipe/simple/dark/visible{
@@ -56358,6 +57805,11 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"kGL" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/grille/broken,
+/turf/open/floor/plating,
+/area/maintenance/prison/starboard)
"kHd" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -56390,6 +57842,36 @@
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
+"kLK" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/security/prison/upper)
+"kMn" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/camera{
+ c_tag = "Permabrig North";
+ dir = 4;
+ network = list("ss13","prison")
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/disposalpipe/trunk{
+ dir = 4
+ },
+/obj/structure/disposaloutlet{
+ dir = 4;
+ name = "Prisoner Delivery"
+ },
+/obj/effect/turf_decal/delivery,
+/obj/structure/window/reinforced,
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
"kMt" = (
/obj/machinery/computer/prisoner/gulag_teleporter_computer,
/turf/open/floor/plasteel,
@@ -56409,6 +57891,14 @@
},
/turf/open/floor/plating,
/area/maintenance/port/aft)
+"kOE" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"kOL" = (
/obj/structure/table/glass,
/turf/open/floor/wood/wood_large,
@@ -56521,6 +58011,24 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
+"kYm" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/light{
+ dir = 4;
+ light_color = "#e8eaff"
+ },
+/obj/structure/chair/stool,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"kZS" = (
/obj/machinery/light{
dir = 8
@@ -56554,6 +58062,27 @@
},
/turf/closed/wall/r_wall,
/area/command/gateway)
+"ldT" = (
+/obj/structure/chair/office{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
+"ldY" = (
+/obj/machinery/door/airlock/security{
+ name = "Firing Range";
+ req_access_txt = "2"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel,
+/area/security/prison)
"leE" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -56604,6 +58133,13 @@
},
/turf/open/floor/plasteel,
/area/commons/dorms)
+"lht" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/security/prison/upper)
"lhQ" = (
/obj/machinery/power/floodlight,
/obj/structure/cable{
@@ -56611,6 +58147,20 @@
},
/turf/open/floor/plating,
/area/engineering/atmos)
+"lic" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"lip" = (
/obj/structure/closet{
name = "Suit Closet"
@@ -56636,6 +58186,12 @@
/obj/item/clothing/under/rank/civilian/lawyer/red,
/turf/open/floor/plasteel,
/area/commons/locker)
+"liJ" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/execution/transfer)
"ljV" = (
/obj/machinery/airalarm{
dir = 8;
@@ -56656,6 +58212,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 +58238,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 +58294,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 +58331,60 @@
},
/turf/open/floor/plasteel,
/area/commons/dorms)
+"lux" = (
+/obj/structure/closet/crate/hydroponics,
+/obj/item/paper/guides/jobs/hydroponics,
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/item/seeds/onion,
+/obj/item/seeds/garlic,
+/obj/item/seeds/potato,
+/obj/item/seeds/tomato,
+/obj/item/seeds/carrot,
+/obj/item/seeds/grass,
+/obj/item/seeds/ambrosia,
+/obj/item/seeds/wheat,
+/obj/item/seeds/pumpkin,
+/obj/effect/spawner/lootdrop/prison_contraband,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"lva" = (
/obj/effect/turf_decal/stripes/corner{
dir = 1
},
/turf/open/floor/plasteel,
/area/service/hydroponics)
+"lvc" = (
+/obj/structure/window/reinforced/tinted{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"lvw" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "permacells6";
+ name = "Privacy Shutters"
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/security/prison/cells)
"lwN" = (
/obj/structure/cable{
icon_state = "1-8"
@@ -56770,6 +58410,25 @@
/obj/structure/sign/nanotrasen,
/turf/closed/wall,
/area/science/circuit)
+"lAD" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/camera{
+ c_tag = "Prison Cell Block Central";
+ dir = 1;
+ network = list("ss13","prison")
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
"lAH" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -56789,6 +58448,26 @@
dir = 1
},
/area/hallway/secondary/entry)
+"lBk" = (
+/obj/machinery/door/firedoor,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/door/airlock/public/glass{
+ name = "Prison Yard"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
"lBz" = (
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
@@ -56812,6 +58491,50 @@
},
/turf/open/floor/plasteel,
/area/commons/fitness/pool)
+"lCt" = (
+/obj/machinery/light/small{
+ dir = 1;
+ light_color = "#ffc1c1"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"lDm" = (
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
+"lEf" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "permacells4";
+ name = "Privacy Shutters"
+ },
+/turf/open/floor/plating,
+/area/security/prison/cells)
+"lGm" = (
+/obj/machinery/shower{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plasteel/freezer,
+/area/security/prison/cells)
"lGV" = (
/obj/machinery/button/door{
id = "maintdiy";
@@ -56821,6 +58544,23 @@
},
/turf/open/floor/plating,
/area/service/abandoned_gambling_den)
+"lHK" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
+"lJA" = (
+/turf/closed/wall,
+/area/security/prison/cells)
"lJC" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
@@ -56830,6 +58570,13 @@
},
/turf/open/floor/plating,
/area/security/office)
+"lJS" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/turf/open/floor/plasteel,
+/area/security/prison)
"lKj" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 8
@@ -56839,6 +58586,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 +58628,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 +58696,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 +58717,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 +58769,17 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/security/brig)
+"lZp" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
"lZs" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/closet,
@@ -57019,10 +58813,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 +58890,59 @@
/obj/structure/bed,
/turf/open/floor/plasteel,
/area/commons/fitness/pool)
+"mhv" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Visitation Observation";
+ req_access_txt = "2"
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
"mjr" = (
/obj/structure/reagent_dispensers/keg/milk,
/turf/open/floor/wood,
/area/service/bar)
+"mjJ" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/execution/transfer)
+"mke" = (
+/obj/machinery/camera{
+ c_tag = "Prison Common Room";
+ dir = 8;
+ network = list("ss13","prison")
+ },
+/obj/machinery/vr_sleeper{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"mkv" = (
/obj/machinery/camera{
c_tag = "Gravity Generator Room";
@@ -57112,11 +58985,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 +59064,17 @@
icon_state = "wood-broken5"
},
/area/maintenance/bar)
+"mpY" = (
+/obj/item/reagent_containers/glass/bucket,
+/obj/item/mop,
+/obj/item/reagent_containers/glass/bottle/ammonia,
+/obj/structure/sink{
+ dir = 4;
+ pixel_x = 12
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/security/prison/upper)
"mqo" = (
/obj/effect/turf_decal/tile/blue{
dir = 4
@@ -57196,6 +59097,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 +59113,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 +59172,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 +59205,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 +59229,33 @@
},
/turf/open/floor/plating,
/area/security/office)
+"mxZ" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/structure/closet/crate/trashcart/laundry,
+/obj/item/clothing/under/rank/prisoner,
+/obj/item/clothing/under/rank/prisoner,
+/obj/item/clothing/under/rank/prisoner/skirt,
+/obj/item/clothing/under/rank/prisoner/skirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/item/clothing/shoes/sneakers/orange{
+ pixel_y = 8
+ },
+/obj/item/clothing/shoes/sneakers/orange{
+ pixel_y = 8
+ },
+/obj/item/clothing/shoes/sneakers/orange{
+ pixel_y = 8
+ },
+/obj/item/clothing/shoes/sneakers/orange{
+ pixel_y = 8
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/security/prison/upper)
"myh" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -57279,6 +59289,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 +59368,18 @@
/obj/effect/decal/cleanable/cobweb,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"mHH" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"mHU" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/light_construct{
@@ -57342,9 +59388,13 @@
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"mIZ" = (
-/obj/structure/falsewall,
-/turf/open/floor/plating,
-/area/security/prison)
+/obj/machinery/door/firedoor,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel/dark,
+/area/security/prison/cells)
"mJf" = (
/obj/structure/cable{
icon_state = "0-8"
@@ -57363,6 +59413,21 @@
/obj/item/electronics/airlock,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"mJy" = (
+/obj/structure/table,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/item/restraints/handcuffs,
+/obj/item/taperecorder,
+/obj/item/folder/red,
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
+"mJH" = (
+/obj/structure/cable,
+/obj/effect/spawner/structure/window/reinforced/tinted/electrochromatic{
+ electrochromatic_id = "!permabrigshowers"
+ },
+/turf/open/floor/plating,
+/area/security/prison/cells)
"mLS" = (
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plating{
@@ -57477,6 +59542,13 @@
},
/turf/open/floor/plasteel,
/area/commons/locker)
+"mZu" = (
+/obj/machinery/door/airlock{
+ name = "Cleaning Closet"
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/security/prison/upper)
"mZx" = (
/obj/structure/table/glass,
/obj/item/storage/box/matches{
@@ -57485,6 +59557,18 @@
},
/turf/open/floor/wood/wood_large,
/area/service/chapel/main)
+"naj" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/preopen{
+ id = "executionfireblast"
+ },
+/obj/machinery/door/firedoor,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/security/execution/transfer)
"naI" = (
/turf/open/space,
/area/space/station_ruins)
@@ -57536,6 +59620,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 +59666,18 @@
/obj/machinery/vending/autodrobe,
/turf/open/floor/wood,
/area/maintenance/bar)
+"ngq" = (
+/obj/effect/turf_decal/tile/green,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"ngs" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable{
@@ -57590,6 +59708,26 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"nko" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/landmark/start/prisoner,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/button/door{
+ id = "permacells2";
+ name = "Privacy Shutters";
+ pixel_x = 25
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/cells)
"nkP" = (
/obj/structure/rack,
/obj/effect/spawner/lootdrop/maintenance{
@@ -57640,17 +59778,53 @@
},
/turf/open/floor/plasteel/dark,
/area/maintenance/starboard/fore)
+"noJ" = (
+/obj/structure/closet/secure_closet/brig,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/bot_white,
+/turf/open/floor/plasteel/dark,
+/area/security/prison)
"noL" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
},
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"noR" = (
+/obj/structure/sink/kitchen{
+ pixel_y = 28
+ },
+/obj/structure/chair/stool,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/white,
+/area/security/prison/upper)
"noT" = (
/turf/open/floor/wood{
icon_state = "wood-broken4"
},
/area/maintenance/starboard/aft)
+"nqu" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/turf/open/floor/plating,
+/area/security/prison/upper)
"nsf" = (
/obj/structure/cable/white{
icon_state = "0-2"
@@ -57773,6 +59947,21 @@
},
/turf/open/space/basic,
/area/space/nearstation)
+"nFA" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
"nGf" = (
/obj/machinery/hydroponics/constructable,
/obj/machinery/light{
@@ -57837,6 +60026,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 +60054,24 @@
},
/turf/open/floor/wood,
/area/maintenance/starboard/aft)
+"nRO" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/door/airlock/grunge{
+ name = "Permanent Cell 2";
+ wiretypepath = /datum/wires/airlock/security
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/cells)
"nSt" = (
/obj/effect/turf_decal/tile/neutral{
dir = 4
@@ -57872,6 +60084,11 @@
},
/turf/open/floor/plasteel,
/area/commons/dorms)
+"nSI" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plasteel/white,
+/area/security/prison/upper)
"nTG" = (
/obj/structure/chair{
dir = 1
@@ -57929,6 +60146,16 @@
/obj/machinery/atmospherics/pipe/simple/dark/visible,
/turf/open/space,
/area/space/nearstation)
+"nZs" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"nZE" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/tile/neutral,
@@ -57963,6 +60190,22 @@
/obj/item/clothing/head/hardhat/cakehat,
/turf/open/floor/wood,
/area/service/bar)
+"obq" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/effect/spawner/structure/window,
+/turf/open/floor/plating,
+/area/security/prison/upper)
+"obs" = (
+/obj/machinery/light/small{
+ dir = 1;
+ light_color = "#ffc1c1"
+ },
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/padded,
+/area/security/execution/transfer)
"oby" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -58015,6 +60258,12 @@
},
/turf/open/floor/plasteel,
/area/commons/fitness/pool)
+"oiY" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"okK" = (
/obj/machinery/light/small{
dir = 8
@@ -58071,6 +60320,11 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"olH" = (
+/obj/structure/closet/crate,
+/obj/effect/spawner/lootdrop/prison_contraband,
+/turf/open/floor/plasteel/white,
+/area/security/prison/upper)
"omk" = (
/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
dir = 1
@@ -58096,6 +60350,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 +60398,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 +60505,22 @@
},
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
+"ozh" = (
+/obj/machinery/door/window/eastright{
+ dir = 8;
+ name = "Holding Cell";
+ req_access_txt = "2"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/button/flasher{
+ id = "waitingflash";
+ pixel_x = 6;
+ pixel_y = 24
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
"oAB" = (
/obj/structure/fireplace{
pixel_y = -6
@@ -58263,6 +60575,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 +60608,14 @@
},
/turf/open/floor/wood,
/area/maintenance/bar)
+"oKB" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"oLl" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -58308,6 +60633,19 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/dark,
/area/hallway/primary/central)
+"oPY" = (
+/obj/structure/window/reinforced/tinted{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"oQP" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/grimy,
@@ -58318,17 +60656,15 @@
},
/turf/closed/wall,
/area/medical/medbay/central)
-"oSl" = (
-/obj/machinery/door/airlock/security{
- name = "Firing Range";
- req_access_txt = "2"
+"oTx" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "permacells2";
+ name = "Privacy Shutters"
},
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel,
-/area/security/range)
+/turf/open/floor/plating,
+/area/security/prison/cells)
"oTH" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/shower,
@@ -58351,10 +60687,22 @@
/obj/machinery/disposal/bin,
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"oUF" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/turf/open/floor/plating,
+/area/security/prison/upper)
"oVo" = (
/obj/structure/pool/ladder,
/turf/open/pool,
/area/commons/fitness/pool)
+"oVL" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"oVN" = (
/obj/machinery/meter,
/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
@@ -58366,6 +60714,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 +60788,27 @@
},
/turf/open/floor/wood,
/area/service/library)
+"peD" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"peE" = (
+/obj/structure/table/reinforced,
+/obj/structure/reagent_dispensers/servingdish,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"pgf" = (
/turf/open/floor/mineral/titanium/blue,
/area/commons/dorms)
@@ -58427,6 +60818,23 @@
},
/turf/open/floor/plating,
/area/security/range)
+"pgq" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Prison Common Room"
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
"pgZ" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -58493,6 +60901,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{
@@ -58553,6 +60971,19 @@
},
/turf/open/floor/wood/wood_diagonal,
/area/maintenance/port/fore)
+"pry" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/lattice/catwalk,
+/turf/open/space,
+/area/solars/port/fore)
"psf" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/obj/structure/sign/poster/official/the_owl{
@@ -58608,6 +61039,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 +61090,18 @@
},
/turf/open/floor/plasteel,
/area/security/brig)
+"pBd" = (
+/obj/machinery/power/apc{
+ areastring = "/area/maintenance/prison/starboard";
+ dir = 8;
+ name = "Prison Starboard Maintenance APC";
+ pixel_x = -25
+ },
+/obj/effect/turf_decal/bot,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/maintenance/prison/starboard)
"pBp" = (
/obj/effect/landmark/event_spawn,
/turf/closed/wall,
@@ -58686,6 +61135,24 @@
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"pFj" = (
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/machinery/light/small{
+ dir = 4;
+ light_color = "#d8b1b1"
+ },
+/turf/open/floor/plasteel,
+/area/security/execution/transfer)
+"pFt" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
"pFY" = (
/obj/effect/turf_decal/stripes/line{
dir = 6
@@ -58695,6 +61162,21 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
+"pGs" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/maintenance/prison/starboard)
+"pGA" = (
+/obj/machinery/hydroponics/soil,
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/green,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"pHl" = (
/obj/structure/table,
/obj/item/storage/box/beakers{
@@ -58730,6 +61212,15 @@
},
/turf/open/floor/plasteel/dark,
/area/hallway/primary/central)
+"pHK" = (
+/obj/machinery/camera{
+ c_tag = "Prison Yard";
+ dir = 4;
+ network = list("ss13","prison")
+ },
+/obj/structure/chair/stool,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"pHO" = (
/obj/effect/turf_decal/tile/blue,
/obj/structure/sign/poster/contraband/fun_police{
@@ -58737,6 +61228,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{
@@ -58780,6 +61293,14 @@
},
/turf/open/floor/plasteel,
/area/commons/fitness)
+"pPE" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "permacells1";
+ name = "Privacy Shutters"
+ },
+/turf/open/floor/plating,
+/area/security/prison/cells)
"pPI" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 4
@@ -58805,6 +61326,25 @@
"pQN" = (
/turf/open/floor/plasteel/dark,
/area/hallway/primary/central)
+"pRi" = (
+/obj/structure/table,
+/obj/item/razor,
+/obj/item/toy/plush/borgplushie{
+ desc = "A horrible abomination to God in plushie form. Legends say this is used to torture prisoners by repeatedly beating them in the head with it.. ..It feels sorta heavy.";
+ force = 1;
+ name = "dogborg plushie";
+ throwforce = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple,
+/turf/open/floor/plasteel/dark,
+/area/security/execution/transfer)
"pRj" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
@@ -58829,6 +61369,43 @@
},
/turf/open/space,
/area/solars/starboard/aft)
+"pTT" = (
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"pUf" = (
+/obj/machinery/airalarm{
+ pixel_y = 23
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"pUy" = (
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
@@ -58870,6 +61447,24 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"pZD" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/door/airlock/grunge{
+ name = "Permanent Cell 1";
+ wiretypepath = /datum/wires/airlock/security
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/cells)
"qae" = (
/obj/effect/decal/cleanable/vomit,
/obj/effect/decal/cleanable/dirt,
@@ -58884,6 +61479,23 @@
/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,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"qeb" = (
/obj/structure/cable{
icon_state = "0-8"
@@ -58938,6 +61550,27 @@
/obj/effect/spawner/structure/window,
/turf/open/floor/wood,
/area/service/library)
+"qgj" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
+"qhA" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/lattice/catwalk,
+/turf/open/space,
+/area/solars/port/fore)
"qje" = (
/obj/structure/sign/mining{
pixel_y = 7
@@ -58993,11 +61626,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 +61643,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 +61689,26 @@
/obj/structure/grille/broken,
/turf/open/space/basic,
/area/space/nearstation)
+"qvc" = (
+/obj/structure/table,
+/obj/structure/window,
+/obj/item/reagent_containers/food/condiment/saltshaker{
+ layer = 3.1;
+ pixel_x = -2;
+ pixel_y = 2
+ },
+/obj/item/reagent_containers/food/condiment/peppermill{
+ desc = "Often used to flavor food or make people sneeze. Fashionably moved to the left side of the table.";
+ pixel_x = -8;
+ pixel_y = 2
+ },
+/obj/item/reagent_containers/food/condiment/enzyme{
+ pixel_x = 9;
+ pixel_y = 3
+ },
+/obj/item/book/manual/chef_recipes,
+/turf/open/floor/plasteel/white,
+/area/security/prison/upper)
"qvf" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -59058,6 +61718,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 +61741,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 +61784,20 @@
},
/turf/open/floor/plasteel/dark,
/area/maintenance/starboard/aft)
+"qFK" = (
+/obj/machinery/biogenerator,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"qGw" = (
/obj/structure/chair/pew/right{
dir = 8
@@ -59128,6 +61813,15 @@
"qIO" = (
/turf/open/floor/plating/rust,
/area/maintenance/starboard/aft)
+"qIW" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/machinery/atmospherics/components/unary/outlet_injector/on{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/execution/transfer)
"qJr" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
@@ -59140,6 +61834,18 @@
/obj/structure/lattice,
/turf/open/space,
/area/space/nearstation)
+"qLo" = (
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/effect/spawner/structure/window/reinforced/tinted/electrochromatic{
+ electrochromatic_id = "!permabrigshowers"
+ },
+/turf/open/floor/plating,
+/area/security/prison/cells)
"qLy" = (
/obj/structure/chair/sofa/left{
dir = 8
@@ -59177,6 +61883,29 @@
/obj/effect/decal/cleanable/blood/gibs/core,
/turf/open/floor/plasteel/dark,
/area/maintenance/starboard/aft)
+"qNU" = (
+/obj/machinery/door/poddoor/preopen{
+ id = "executionfireblast"
+ },
+/obj/machinery/door/firedoor,
+/obj/machinery/door/window/westright{
+ dir = 2;
+ name = "Transfer Room";
+ req_access_txt = "2"
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel/dark,
+/area/security/execution/transfer)
"qOc" = (
/obj/effect/turf_decal/tile/green{
dir = 8
@@ -59197,6 +61926,37 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/port)
+"qOY" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/effect/spawner/lootdrop/maintenance,
+/turf/open/floor/plating,
+/area/maintenance/prison/starboard)
+"qQK" = (
+/obj/machinery/hydroponics/soil,
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"qRI" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"qSf" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/cable{
@@ -59256,9 +62016,12 @@
/turf/open/pool,
/area/commons/fitness/pool)
"qXg" = (
-/obj/structure/chair/sofa/left,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/vending/cola/red{
+ onstation = 0
+ },
/turf/open/floor/plasteel,
-/area/security/prison)
+/area/security/prison/upper)
"qXJ" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
dir = 9
@@ -59266,10 +62029,38 @@
/obj/structure/lattice,
/turf/open/space/basic,
/area/space/nearstation)
+"qYa" = (
+/obj/effect/turf_decal/bot_white,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/spawner/lootdrop/maintenance,
+/turf/open/floor/plating,
+/area/maintenance/prison/port)
"qZD" = (
/obj/effect/decal/cleanable/egg_smudge,
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"qZQ" = (
+/obj/structure/holohoop{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"qZT" = (
+/obj/machinery/shower{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel/freezer,
+/area/security/prison/cells)
"raH" = (
/obj/machinery/atmospherics/pipe/manifold/orange/hidden{
dir = 8
@@ -59313,11 +62104,6 @@
id = "Cell 1";
name = "Cell 1 Locker"
},
-/obj/item/radio/headset{
- desc = "An updated, modular intercom that fits over the head. Takes encryption keys. It looks like it has been modified to not broadcast.";
- name = "prisoner headset";
- prison_radio = 1
- },
/obj/structure/cable{
icon_state = "1-4"
},
@@ -59330,6 +62116,12 @@
},
/turf/open/floor/plasteel,
/area/security/brig)
+"rcV" = (
+/obj/structure/sign/warning/securearea{
+ pixel_y = -32
+ },
+/turf/open/space/basic,
+/area/space)
"rdl" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/cyan/visible{
@@ -59345,6 +62137,15 @@
},
/turf/open/floor/plasteel/dark,
/area/service/hydroponics)
+"ref" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plasteel/dark,
+/area/security/prison)
"reA" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -59356,6 +62157,40 @@
/obj/machinery/vending/games,
/turf/open/floor/plasteel,
/area/commons/fitness)
+"reE" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
+"rgu" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 4;
+ layer = 2.4
+ },
+/turf/open/floor/plating,
+/area/security/execution/transfer)
"rgL" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
@@ -59437,6 +62272,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 +62297,18 @@
/obj/item/clothing/under/dress/sundress,
/turf/open/floor/plasteel,
/area/commons/fitness)
+"rsn" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/preopen{
+ id = "executionfireblast"
+ },
+/obj/machinery/door/firedoor,
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/machinery/atmospherics/pipe/simple,
+/turf/open/floor/plating,
+/area/security/execution/transfer)
"rsp" = (
/obj/effect/turf_decal/stripes/line,
/obj/structure/table,
@@ -59490,6 +62348,28 @@
/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/plasteel,
/area/commons/dorms)
+"ruu" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/door/firedoor,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/machinery/door/airlock/security/glass{
+ id_tag = "permaouter";
+ name = "Permabrig Transfer";
+ req_access_txt = "2"
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plasteel/dark,
+/area/security/prison)
"rvr" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -59507,12 +62387,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
@@ -59522,6 +62402,13 @@
icon_state = "platingdmg2"
},
/area/maintenance/port/fore)
+"rwA" = (
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/structure/lattice/catwalk,
+/turf/open/space,
+/area/solars/port/fore)
"rxD" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
@@ -59540,6 +62427,21 @@
},
/turf/open/floor/wood/wood_large,
/area/service/chapel/main)
+"ryi" = (
+/obj/machinery/airalarm{
+ pixel_y = 23
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
"ryr" = (
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
@@ -59550,6 +62452,27 @@
},
/turf/open/floor/plasteel,
/area/commons/fitness)
+"ryN" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
"rAR" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
@@ -59559,12 +62482,42 @@
},
/turf/open/floor/plasteel,
/area/security/brig)
+"rAW" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/flasher{
+ id = "executionflash";
+ pixel_y = -25
+ },
+/obj/machinery/light/small,
+/turf/open/floor/plasteel/dark,
+/area/security/execution/transfer)
"rBq" = (
/obj/item/clothing/head/kitty,
/obj/item/clothing/under/costume/maid,
/obj/item/clothing/mask/muzzle,
/turf/open/floor/plating,
/area/maintenance/bar)
+"rBK" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/light/small,
+/turf/open/floor/plasteel/dark,
+/area/security/prison/cells)
+"rBY" = (
+/obj/structure/bed,
+/turf/open/floor/padded,
+/area/security/execution/transfer)
"rCl" = (
/obj/machinery/door/firedoor,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
@@ -59587,6 +62540,22 @@
},
/turf/open/floor/plasteel,
/area/security/brig)
+"rDc" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"rDh" = (
/obj/effect/turf_decal/tile/blue{
dir = 8
@@ -59605,6 +62574,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
@@ -59622,6 +62600,16 @@
},
/turf/open/floor/plating,
/area/maintenance/port/aft)
+"rGZ" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/lattice/catwalk,
+/turf/open/space,
+/area/solars/port/fore)
"rIA" = (
/obj/machinery/light{
dir = 8
@@ -59676,6 +62664,11 @@
/obj/machinery/status_display/evac,
/turf/closed/wall,
/area/ai_monitored/command/storage/eva)
+"rQy" = (
+/obj/structure/lattice,
+/obj/structure/grille,
+/turf/open/space/basic,
+/area/space)
"rQJ" = (
/obj/machinery/light/small{
dir = 8
@@ -59697,6 +62690,12 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"rTj" = (
+/obj/structure/chair{
+ dir = 4
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/security/prison/upper)
"rTo" = (
/obj/machinery/atmospherics/components/binary/pump{
dir = 8;
@@ -59711,6 +62710,12 @@
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
/area/medical/medbay/central)
+"rUr" = (
+/obj/effect/spawner/lootdrop/prison_contraband,
+/obj/structure/rack,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/maintenance/prison/port)
"rVy" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
@@ -59773,6 +62778,13 @@
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"rYM" = (
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/machinery/power/tracker,
+/turf/open/floor/plasteel/airless/solarpanel,
+/area/solars/port/fore)
"rZE" = (
/obj/structure/table,
/obj/item/flashlight/lamp,
@@ -59806,10 +62818,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall/r_wall,
/area/engineering/engine_smes)
-"saX" = (
-/obj/item/reagent_containers/glass/bucket,
-/turf/open/floor/grass,
-/area/security/prison)
"sci" = (
/obj/machinery/vr_sleeper{
dir = 4
@@ -59827,6 +62835,11 @@
dir = 4
},
/area/commons/fitness)
+"sew" = (
+/obj/structure/table,
+/obj/machinery/microwave,
+/turf/open/floor/plasteel/white,
+/area/security/prison/upper)
"seP" = (
/obj/structure/cable{
icon_state = "0-8"
@@ -59845,12 +62858,61 @@
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/fore)
+"sfz" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/structure/bed,
+/obj/item/bedsheet/red,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/cells)
"shR" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/turf/open/floor/plating/airless,
/area/space/nearstation)
+"siz" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"ske" = (
+/obj/machinery/camera{
+ c_tag = "Permabrig South";
+ dir = 1;
+ network = list("ss13","prison")
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"slk" = (
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
@@ -59905,6 +62967,17 @@
},
/turf/open/floor/plating,
/area/service/abandoned_gambling_den)
+"ssc" = (
+/obj/effect/turf_decal/stripes/white/line,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 9
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"ssB" = (
/obj/effect/turf_decal/tile/green{
dir = 1
@@ -59932,6 +63005,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 +63020,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 +63052,18 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
+"szf" = (
+/obj/machinery/firealarm{
+ pixel_y = 24
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"szn" = (
+/turf/closed/wall/r_wall,
+/area/security/prison/cells)
"sAk" = (
/obj/structure/cable{
icon_state = "1-8"
@@ -59969,6 +63073,11 @@
},
/turf/open/floor/plasteel,
/area/security/brig)
+"sAm" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"sAH" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/neutral{
@@ -59989,6 +63098,43 @@
icon_state = "wood-broken6"
},
/area/maintenance/bar)
+"sAT" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/machinery/firealarm{
+ pixel_y = 24
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"sBM" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"sCa" = (
/obj/structure/rack,
/obj/item/circuitboard/machine/monkey_recycler,
@@ -60039,6 +63185,12 @@
},
/turf/open/floor/plasteel,
/area/commons/dorms)
+"sHd" = (
+/obj/machinery/door/window/southleft{
+ name = "Permabrig Kitchen"
+ },
+/turf/open/floor/plasteel/white,
+/area/security/prison/upper)
"sHx" = (
/obj/structure/table,
/obj/item/book/manual/hydroponics_pod_people{
@@ -60051,6 +63203,14 @@
},
/turf/open/floor/plasteel,
/area/service/hydroponics)
+"sIn" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plating,
+/area/maintenance/prison/starboard)
"sJw" = (
/obj/effect/turf_decal/stripes/line{
dir = 10
@@ -60083,6 +63243,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 +63268,12 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"sMu" = (
+/obj/structure/lattice,
+/obj/structure/lattice,
+/obj/structure/grille,
+/turf/open/space/basic,
+/area/space/nearstation)
"sMG" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 4
@@ -60115,6 +63287,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 +63418,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 +63466,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 +63523,27 @@
/turf/open/floor/plating,
/area/maintenance/port/fore)
"thB" = (
-/obj/structure/sign/warning/securearea{
- pixel_y = -32
+/obj/effect/turf_decal/tile/green{
+ dir = 4
},
-/turf/open/space,
-/area/space)
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 1;
+ light_color = "#cee5d2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"tif" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -60303,6 +63562,19 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/turf/open/floor/plasteel,
/area/commons/dorms)
+"tkx" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
"tkB" = (
/obj/structure/sign/poster/official/help_others{
pixel_y = -32
@@ -60323,6 +63595,22 @@
},
/turf/open/floor/plating,
/area/security/range)
+"tnH" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 1;
+ light_color = "#cee5d2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
"tnL" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
@@ -60338,6 +63626,10 @@
},
/turf/open/floor/carpet,
/area/commons/cryopod)
+"tqk" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/turf/closed/wall,
+/area/security/execution/transfer)
"tqB" = (
/obj/effect/turf_decal/stripes/line{
dir = 5
@@ -60364,6 +63656,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 +63726,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 +63815,10 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/engineering/atmos)
+"tAS" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"tBV" = (
/turf/closed/wall,
/area/medical/storage)
@@ -60484,6 +63844,29 @@
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/lobby)
+"tCs" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/structure/window/reinforced/tinted{
+ dir = 4
+ },
+/obj/structure/toilet{
+ dir = 1
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plasteel/dark,
+/area/security/prison/cells)
"tEK" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -60532,6 +63915,18 @@
dir = 1
},
/area/hallway/secondary/entry)
+"tHO" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/bag/tray/cafeteria,
+/obj/item/storage/bag/tray/cafeteria,
+/obj/item/storage/bag/tray/cafeteria,
+/obj/item/storage/bag/tray/cafeteria,
+/obj/item/storage/bag/tray/cafeteria,
+/obj/item/storage/bag/tray/cafeteria,
+/obj/item/storage/bag/tray/cafeteria,
+/obj/item/storage/bag/tray/cafeteria,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"tIE" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
@@ -60549,6 +63944,23 @@
/obj/structure/musician/piano,
/turf/open/floor/wood,
/area/service/theater)
+"tJE" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Isolation Cell";
+ req_access_txt = "2"
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/execution/transfer)
"tJK" = (
/obj/machinery/door/airlock/engineering{
name = "Gravity Generator";
@@ -60591,6 +64003,12 @@
},
/turf/open/floor/plasteel,
/area/commons/dorms)
+"tLC" = (
+/obj/machinery/vr_sleeper{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"tMl" = (
/obj/effect/turf_decal/loading_area,
/turf/open/floor/plasteel/showroomfloor,
@@ -60607,6 +64025,23 @@
},
/turf/open/floor/plasteel,
/area/engineering/gravity_generator)
+"tOk" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
"tOq" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
@@ -60618,6 +64053,12 @@
/obj/structure/table/wood,
/turf/open/floor/wood,
/area/maintenance/bar)
+"tPY" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/security/prison/upper)
"tRe" = (
/obj/machinery/chem_master,
/turf/open/floor/plasteel/white,
@@ -60676,6 +64117,21 @@
icon_state = "wood-broken5"
},
/area/maintenance/port/fore)
+"tWe" = (
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"tWj" = (
/obj/structure/window/reinforced,
/turf/open/floor/wood,
@@ -60694,6 +64150,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 +64212,19 @@
},
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
+"ueN" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/cafeteria,
+/area/security/prison/upper)
"ueZ" = (
/obj/item/radio/intercom{
name = "Station Intercom (General)";
@@ -60777,6 +64252,9 @@
dir = 4
},
/area/commons/fitness)
+"ugi" = (
+/turf/open/floor/plasteel/cafeteria,
+/area/security/prison/upper)
"ugp" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
dir = 4
@@ -60816,6 +64294,16 @@
/obj/effect/decal/cleanable/blood/gibs/human/lizard/body,
/turf/open/floor/plasteel/dark,
/area/maintenance/starboard/aft)
+"uhK" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/turf/open/floor/plating,
+/area/security/prison/upper)
"ujv" = (
/obj/structure/sign/departments/restroom,
/turf/closed/wall,
@@ -60878,6 +64366,15 @@
},
/turf/open/floor/plasteel/grimy,
/area/security/detectives_office)
+"uql" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison)
"uqu" = (
/obj/machinery/hydroponics/soil{
pixel_y = 8
@@ -60902,6 +64399,17 @@
/obj/machinery/atmospherics/components/binary/valve,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"uuw" = (
+/obj/machinery/hydroponics/soil,
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"uuG" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -61046,12 +64554,6 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/commons/fitness/pool)
-"uEI" = (
-/obj/structure/chair/comfy/brown{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/security/prison)
"uFp" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -61088,8 +64590,19 @@
/turf/open/floor/plasteel,
/area/security/processing)
"uGI" = (
-/turf/open/floor/grass,
-/area/security/prison)
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"uHc" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -61132,11 +64645,58 @@
/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)
+"uLB" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/turf_decal/bot,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
"uOd" = (
/turf/open/floor/plasteel/white/side{
dir = 4
},
/area/service/theater)
+"uOm" = (
+/obj/machinery/light/small{
+ dir = 1;
+ light_color = "#ffc1c1"
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/blood/old,
+/mob/living/simple_animal/mouse/brown/Tom,
+/turf/open/floor/plating,
+/area/security/prison/upper)
"uOJ" = (
/obj/structure/cable{
icon_state = "1-8"
@@ -61198,6 +64758,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 +64805,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 +64909,38 @@
},
/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"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"vhC" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
+"vim" = (
+/obj/machinery/computer/arcade/minesweeper,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"viF" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -61345,6 +64948,31 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
+"viH" = (
+/obj/machinery/camera{
+ c_tag = "Permabrig Central";
+ dir = 8;
+ network = list("ss13","prison")
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"vjm" = (
/obj/structure/table/wood,
/obj/item/reagent_containers/rag,
@@ -61483,6 +65111,25 @@
},
/turf/open/floor/wood,
/area/service/library)
+"vws" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
+"vwQ" = (
+/obj/structure/bookcase,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"vxh" = (
/turf/open/floor/plating{
icon_state = "platingdmg1"
@@ -61586,6 +65233,22 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"vCS" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/machinery/atmospherics/pipe/simple,
+/turf/open/floor/plasteel/dark,
+/area/security/execution/transfer)
"vEi" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -61621,6 +65284,25 @@
},
/turf/open/floor/plasteel,
/area/engineering/gravity_generator)
+"vFZ" = (
+/obj/effect/spawner/lootdrop/prison_contraband,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/structure/bed,
+/obj/item/bedsheet/red,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/cells)
"vGn" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -61662,6 +65344,9 @@
},
/turf/open/floor/plasteel,
/area/commons/fitness)
+"vHK" = (
+/turf/closed/wall,
+/area/maintenance/prison/starboard)
"vHT" = (
/obj/machinery/door/firedoor,
/obj/structure/sign/departments/evac{
@@ -61729,6 +65414,17 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/maintenance/fore)
+"vMi" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"vOC" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/simple/dark/visible{
@@ -61781,6 +65477,14 @@
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
+"vRN" = (
+/obj/structure/closet/crate,
+/obj/item/stack/license_plates/empty/fifty,
+/obj/item/stack/license_plates/empty/fifty,
+/obj/item/stack/license_plates/empty/fifty,
+/obj/item/stack/license_plates/empty/fifty,
+/turf/open/floor/plating,
+/area/security/prison/upper)
"vTP" = (
/obj/machinery/door/airlock/external{
name = "Labor Camp Shuttle Airlock";
@@ -61791,6 +65495,29 @@
},
/turf/open/floor/plating,
/area/security/processing)
+"vYF" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/light/small{
+ brightness = 3;
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/cells)
+"vYY" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"vZA" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable,
@@ -61808,6 +65535,18 @@
},
/turf/open/floor/plasteel,
/area/commons/fitness/pool)
+"waX" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/execution/transfer)
"wbE" = (
/obj/effect/turf_decal/tile/blue{
alpha = 255
@@ -61836,6 +65575,15 @@
"wcR" = (
/turf/open/floor/plasteel/yellowsiding/corner,
/area/commons/fitness/pool)
+"wcS" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
"wdr" = (
/obj/machinery/door/window/southleft{
name = "Target Storage"
@@ -61854,6 +65602,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 +65631,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 +65676,13 @@
"wkN" = (
/turf/closed/wall,
/area/science/circuit)
+"wkU" = (
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"wlg" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -61934,6 +65715,15 @@
},
/turf/open/floor/plating,
/area/engineering/main)
+"wnX" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/freezer,
+/area/security/prison/cells)
"woR" = (
/obj/machinery/cryopod{
dir = 1
@@ -61954,6 +65744,22 @@
},
/turf/open/floor/plating,
/area/construction/mining/aux_base)
+"wpV" = (
+/obj/machinery/seed_extractor,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 1;
+ light_color = "#d1dfff"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"wql" = (
/turf/closed/wall/r_wall,
/area/command/gateway)
@@ -62075,6 +65881,31 @@
},
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
+"wAj" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
+"wAN" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"wBd" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
@@ -62089,6 +65920,22 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"wDq" = (
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space)
+"wGc" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison)
"wHk" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -62113,6 +65960,13 @@
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"wIl" = (
+/obj/structure/bed,
+/obj/effect/spawner/lootdrop/bedsheet,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plating,
+/area/maintenance/prison/port)
"wII" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/door/airlock/maintenance,
@@ -62190,6 +66044,41 @@
icon_state = "platingdmg3"
},
/area/maintenance/starboard/aft)
+"wVq" = (
+/obj/machinery/door/airlock/security{
+ name = "Prison Workshop"
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
+"wVt" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
"wVN" = (
/obj/structure/falsewall,
/turf/open/floor/plating,
@@ -62222,11 +66111,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 +66168,20 @@
/obj/item/coin/gold,
/turf/open/floor/plasteel,
/area/commons/fitness)
+"xbP" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"xcl" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/simple/dark/visible{
@@ -62301,6 +66202,13 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"xfW" = (
+/obj/machinery/vr_sleeper{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"xgk" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -62363,13 +66271,18 @@
/turf/open/floor/plating,
/area/construction)
"xib" = (
-/obj/machinery/door/window/westleft{
- base_state = "right";
- icon_state = "right";
- name = "Unisex Showers"
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/preopen{
+ id = "Prison Gate";
+ name = "prison blast door"
},
-/turf/open/floor/plasteel/freezer,
-/area/security/prison)
+/obj/structure/cable,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "Prison Gate";
+ name = "Prison Lockdown Shutters"
+ },
+/turf/open/floor/plating,
+/area/security/prison/upper)
"xiw" = (
/obj/machinery/door/airlock{
name = "Service Hall";
@@ -62381,6 +66294,26 @@
},
/turf/open/floor/plating,
/area/hallway/secondary/service)
+"xjU" = (
+/obj/machinery/door/airlock/security{
+ name = "Permabrig Visitation"
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel/dark,
+/area/security/prison/upper)
"xkd" = (
/obj/machinery/light/small{
dir = 4;
@@ -62388,6 +66321,22 @@
},
/turf/open/floor/plasteel,
/area/commons/fitness)
+"xkk" = (
+/obj/machinery/door/firedoor,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/sign/warning/securearea{
+ pixel_x = -32;
+ pixel_y = 32
+ },
+/obj/effect/turf_decal/delivery,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "Prison Gate";
+ name = "Prison Lockdown Shutters"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/range)
"xlX" = (
/obj/structure/table/reinforced,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -62415,6 +66364,31 @@
},
/turf/open/floor/plasteel,
/area/security/brig)
+"xnF" = (
+/obj/machinery/door/airlock/security{
+ name = "Isolation Cell";
+ req_access_txt = "2"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/execution/transfer)
+"xpH" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/cafeteria,
+/area/security/prison/upper)
"xqG" = (
/obj/structure/table/reinforced,
/obj/effect/turf_decal/tile/bar,
@@ -62456,6 +66430,17 @@
},
/turf/open/floor/plasteel,
/area/maintenance/disposal/incinerator)
+"xuu" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "Prison Gate";
+ name = "Prison Lockdown Shutters"
+ },
+/turf/open/floor/plating,
+/area/security/brig)
"xwB" = (
/obj/structure/chair/stool{
pixel_y = 8
@@ -62514,6 +66499,13 @@
},
/turf/open/floor/plasteel,
/area/commons/dorms)
+"xAA" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"xBk" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -62530,6 +66522,16 @@
/obj/item/radio/headset/headset_cargo,
/turf/open/floor/plasteel,
/area/cargo/storage)
+"xBJ" = (
+/obj/effect/turf_decal/stripes/white/line{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"xDM" = (
/obj/machinery/camera{
c_tag = "Locker Room South";
@@ -62574,6 +66576,12 @@
},
/turf/open/floor/wood/wood_large,
/area/service/chapel/main)
+"xFj" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"xFM" = (
/obj/item/clothing/gloves/color/rainbow,
/obj/item/clothing/head/soft/rainbow,
@@ -62581,6 +66589,20 @@
/obj/item/clothing/under/color/rainbow,
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"xGm" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/cells)
"xGQ" = (
/obj/structure/sign/plaques/golden{
pixel_y = 32
@@ -62622,6 +66644,44 @@
},
/turf/open/floor/plating,
/area/security/office)
+"xKl" = (
+/obj/machinery/computer/security/telescreen/prison{
+ pixel_y = 30
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
+"xLQ" = (
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/power/apc/highcap/five_k{
+ areastring = "/area/security/prison/upper";
+ damage_deflection = 21;
+ desc = "A control terminal for the area's electrical systems. It's secured with a durable antitampering plasteel cage.";
+ dir = 1;
+ name = "Armored Upper Prison Wing APC";
+ pixel_y = 23
+ },
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"xLX" = (
/obj/structure/lattice/catwalk,
/obj/item/stack/marker_beacon{
@@ -62635,13 +66695,54 @@
},
/turf/open/floor/plating/airless,
/area/space/nearstation)
-"xOx" = (
-/obj/structure/chair/comfy/brown{
- color = "#596479";
- dir = 1
+"xMg" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/cafeteria,
+/area/security/prison/upper)
+"xMS" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plasteel/cafeteria,
+/area/security/prison/upper)
+"xNV" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "4-8"
},
/turf/open/floor/plasteel,
-/area/security/prison)
+/area/security/prison/cells)
+"xOx" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/flasher{
+ id = "visitorflash";
+ pixel_x = 16;
+ pixel_y = 24
+ },
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
"xPk" = (
/obj/structure/bed,
/obj/machinery/button/door{
@@ -62703,6 +66804,21 @@
/obj/effect/landmark/carpspawn,
/turf/open/space,
/area/space/station_ruins)
+"xUC" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple{
+ dir = 10
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/execution/transfer)
"xUL" = (
/obj/effect/turf_decal/bot_white/right,
/obj/effect/turf_decal/tile/neutral{
@@ -62738,6 +66854,13 @@
},
/turf/open/floor/plasteel,
/area/security/brig)
+"xVZ" = (
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/structure/lattice/catwalk,
+/turf/open/space,
+/area/solars/port/fore)
"xWq" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/sign/warning/vacuum/external{
@@ -62752,6 +66875,13 @@
},
/turf/open/floor/plasteel/grimy,
/area/maintenance/starboard/aft)
+"xWS" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/turf/open/floor/plating,
+/area/security/prison/upper)
"xXi" = (
/obj/machinery/vending/clothing,
/turf/open/floor/plasteel,
@@ -62816,6 +66946,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 +66993,34 @@
/obj/machinery/status_display/evac,
/turf/closed/wall,
/area/hallway/primary/central)
+"yeU" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/landmark/start/prisoner,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/button/door{
+ id = "permacells5";
+ name = "Privacy Shutters";
+ pixel_y = 25
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison/cells)
+"yeZ" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
+ },
+/turf/closed/wall,
+/area/security/execution/transfer)
"yfX" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/turf/open/floor/carpet/arcade,
@@ -62874,6 +67048,14 @@
},
/turf/open/floor/plasteel/dark,
/area/hallway/primary/central)
+"yhI" = (
+/obj/machinery/computer/arcade/battle,
+/obj/machinery/firealarm{
+ pixel_y = 24
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/security/prison/upper)
(1,1,1) = {"
cNd
@@ -77076,12 +81258,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aaS
aaS
aaS
@@ -77097,9 +81273,15 @@ aaS
aba
aaS
aaS
+gXs
+gXs
+gXs
+eRz
+eRz
+eRz
aaf
aaf
-aaf
+aaT
aaf
aaf
alU
@@ -77333,12 +81515,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
abY
aaa
aaf
@@ -77351,7 +81527,7 @@ acy
aaa
aaf
aaa
-bXv
+dLl
aaa
aaS
aaa
@@ -77359,6 +81535,12 @@ aaa
aaa
aaa
aaa
+gXs
+aaa
+aaa
+aaa
+aaa
+aaa
alU
ash
atU
@@ -77590,31 +81772,31 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
abY
aaa
acW
-acV
+eTt
adA
aaa
acW
-acV
+eTt
adA
aaa
acW
-acV
+eTt
adA
aaa
aaS
+gXs
+gXs
+gXs
+gXs
+eRz
+eRz
aaf
aaf
-aaf
-aaf
+aaT
+aaT
aaf
alU
atn
@@ -77844,34 +82026,34 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aae
aaa
aaa
abY
aaf
acW
-adx
+hcT
adA
aaa
acW
-adx
+hcT
adA
aaa
acW
-adx
+hcT
adA
aaf
aaf
aaa
aaa
+gXs
aaa
aaa
+ktS
+aaa
+aaa
+gXs
+aaa
aaa
alU
alU
@@ -78104,31 +82286,31 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
abY
aaa
acW
-adx
+hcT
adA
aaf
acW
-adx
+hcT
adA
aaf
acW
-adx
+hcT
adA
aaa
aaf
aaa
aaa
+gXs
aaa
aaa
+ktS
+aaa
+aaa
+gXs
+aaa
aaa
gXs
ali
@@ -78361,27 +82543,27 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aaf
aaf
acW
-adx
+hcT
adA
aaa
acW
-adx
+hcT
adA
aaa
acW
-adx
+hcT
adA
aaf
aaf
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
aaf
aaf
aaf
@@ -78615,32 +82797,32 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aaS
aaS
aaS
aaf
aaa
acW
-adx
+hcT
adA
aaa
acW
-adx
+hcT
adA
aaa
acW
-adx
+hcT
adA
aaa
aaf
aaa
aaa
+aaa
+gXs
+aaa
+ktS
+aaa
+aaa
ajV
alR
alR
@@ -78872,29 +83054,29 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aaS
aaa
aaf
aaa
aaa
aaa
-adZ
+rwA
aaa
aaa
aaa
-adZ
+rwA
aaa
aaa
aaa
-adZ
+rwA
aaa
aaa
+aaf
+aaa
+aaa
+aaa
+gXs
+aaa
ajV
ajV
ajV
@@ -79129,18 +83311,12 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aaS
aaf
-abs
-abZ
-abZ
-adw
+rYM
+qhA
+qhA
+hSf
ady
ady
ady
@@ -79152,6 +83328,12 @@ ady
ady
cfK
uDO
+uDO
+uDO
+uDO
+uDO
+uDO
+uDO
ajq
akB
akB
@@ -79386,29 +83568,29 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aaS
aaa
aaf
aaa
aaa
aaa
-ajW
+xVZ
aaa
aaa
aaa
-ajW
+xVZ
aaa
aaa
aaa
-ajW
+xVZ
aaa
aaa
+aaf
+aaa
+aaa
+aaa
+gXs
+aaa
ajV
ajV
ajV
@@ -79643,32 +83825,32 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aaS
aba
aaS
aaf
aaa
acW
-amv
+pry
adA
aaa
acW
-amv
+pry
adA
aaa
acW
-amv
+pry
adA
aaa
aaf
aaa
aaa
+aaa
+gXs
+aaa
+ktS
+aaa
+aaa
ajV
alR
alR
@@ -79903,30 +84085,30 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aaf
aaf
acW
-amv
+pry
adA
aaa
acW
-amv
+pry
adA
aaa
acW
-amv
+pry
adA
aaf
aaf
aaa
aaa
aaa
+gXs
+aaa
+ktS
+aaa
+aaa
+aaa
alU
amF
alF
@@ -80160,27 +84342,27 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aaS
aaa
acW
-amv
+pry
adA
aaf
acW
-amv
+pry
adA
aaf
acW
-amv
+pry
adA
aaa
aaf
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
aaf
aaf
aaf
@@ -80417,30 +84599,30 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aaS
aaf
acW
-amv
+pry
adA
aaa
acW
-amv
+pry
adA
aaa
acW
-amv
+pry
adA
aaf
aaf
aaa
aaa
aaa
+aaa
+aaa
+ktS
+wDq
+aaa
+aaa
alU
alU
alU
@@ -80674,30 +84856,30 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aaS
aaa
acW
-aqJ
+rGZ
adA
aaa
acW
-aqJ
+rGZ
adA
aaa
acW
-aqJ
+rGZ
adA
aaa
aaS
aaa
aaa
aaa
+aaa
+aaa
+ktS
+rQy
+aaa
+aaa
alU
lLA
mzT
@@ -80918,18 +85100,12 @@ cNd
cNd
cNd
cNd
+naI
cNd
cNd
cNd
cNd
cNd
-cNd
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aaa
aaa
aaa
@@ -80952,7 +85128,13 @@ aaa
aaf
aaa
aaS
-aaf
+gXs
+gXs
+gXs
+gXs
+gXs
+eRz
+aaT
aaf
aaf
alU
@@ -81183,17 +85365,11 @@ cNd
cNd
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+gXs
+gXs
+gXs
+gXs
+gXs
aaS
aaS
aaS
@@ -81212,6 +85388,12 @@ aaS
aaa
aaa
aaa
+gXs
+aaa
+ktS
+aaa
+aaa
+aaa
alU
enJ
enJ
@@ -81446,6 +85628,7 @@ aaa
aaa
aaa
aaa
+gXs
aaa
aaa
aaa
@@ -81453,17 +85636,16 @@ aaa
aaa
aaa
aaa
+gXs
aaa
aaa
aaa
aaa
+gXs
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
+gXs
aaa
aaa
aaa
@@ -81703,6 +85885,7 @@ aaa
aaa
aaa
aaa
+gXs
aaa
aaa
aaa
@@ -81710,23 +85893,22 @@ aaa
aaa
aaa
aaa
+gXs
+aaa
+aaa
+aaa
+aaa
+gXs
+aaa
+aaa
+aaa
+gXs
aaa
aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-jFd
+ali
fDn
gFs
aKY
@@ -81955,6 +86137,12 @@ aaa
aaa
aaa
aaa
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
aaa
aaa
aaa
@@ -81962,22 +86150,16 @@ aaa
aaa
aaa
aaa
+gXs
aaa
aaa
aaa
aaa
+gXs
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+gXs
aaa
aaa
aaa
@@ -82212,29 +86394,29 @@ aaa
aaa
aaa
aaa
+gXs
aaa
aaa
aaa
aaa
+gXs
+aaa
+aaa
+aaa
+eRz
+eRz
+eRz
+gXs
+gXs
aaa
aaa
aaa
aaa
+eRz
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+gXs
aaa
aaa
aaa
@@ -82469,29 +86651,29 @@ aaa
aaa
aaa
aaa
+gXs
aaa
aaa
aaa
aaa
+gXs
+aaa
+aaa
+aaa
+eRz
+aaa
+aaa
+aaa
+gXs
aaa
aaa
aaa
aaa
+eRz
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+gXs
aaa
aaa
aaa
@@ -82722,32 +86904,32 @@ aaa
aaa
aaa
aaa
+gXs
+gXs
+gXs
+aaa
+gXs
aaa
aaa
aaa
aaa
+gXs
aaa
aaa
aaa
+eRz
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+gXs
+gXs
+gXs
+gXs
+gXs
+eRz
+gXs
+gXs
+gXs
ali
ali
alU
@@ -82978,33 +87160,33 @@ cNd
aaa
aaa
aaa
+eRz
+eRz
+eRz
+eRz
+eRz
+eRz
+eRz
+eRz
+eRz
+eRz
+eRz
+aaa
+aaa
+aaa
+gXs
+aaa
+aaa
+aaa
+gXs
aaa
aaa
aaa
aaa
+eRz
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aae
-aaa
-aaa
ali
anL
avY
@@ -83234,31 +87416,31 @@ cNd
cNd
aaa
aaa
+gXs
+eRz
+aaa
+gXs
aaa
aaa
+gXs
aaa
aaa
+gXs
+aaa
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
+aaa
+aae
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+eRz
aaa
aaa
aaa
@@ -83491,6 +87673,18 @@ cNd
cNd
aaa
aaa
+gXs
+eRz
+aaa
+aaa
+aaa
+aaa
+gXs
+gXs
+aaa
+gXs
+aaa
+gXs
aaa
aaa
aaa
@@ -83498,24 +87692,12 @@ aaa
aaa
aaa
aaa
+gXs
aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+gXs
aaa
aaa
aaa
@@ -83749,33 +87931,33 @@ cNd
aaa
aaa
aaa
+eRz
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+rcV
+szn
+hKo
+fNB
+szn
+qLo
+mJH
+szn
+szn
+szn
+szn
+szn
+szn
+mbC
+mbC
+mbC
+mbC
+gXs
+jJP
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
ali
ali
alU
@@ -83996,44 +88178,44 @@ cNd
cNd
cNd
cNd
+cNd
+cNd
+cNd
+cNd
aaa
aaa
aaa
aaa
+gDl
+aaa
+eRz
+gXs
+gXs
+szn
+suC
+qZT
+dYQ
+lGm
+pwF
+lJA
+mvV
+tso
+lJA
+mvV
+tso
+abc
+dIZ
+dIZ
+mbC
+abc
+abc
+hEL
+abc
aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+gXs
aaa
aaa
aaa
@@ -84253,44 +88435,44 @@ cNd
cNd
cNd
cNd
+cNd
+cNd
+cNd
+cNd
+aaa
+gXs
aaa
aaa
aaa
aaa
+eRz
+aaa
+aaa
+szn
+mAT
+ifM
+wnX
+mAT
+mAT
+lJA
+yeU
+rBK
+lJA
+giE
+rBK
+abc
+obs
+rBY
+mbC
+jvO
+dfj
+fgd
+abc
aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+gXs
aaa
aaa
aaa
@@ -84510,44 +88692,44 @@ cNd
cNd
cNd
cNd
+cNd
+cNd
+cNd
+cNd
aaa
+gXs
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+fIs
+fIs
+fIs
+eRz
+gXs
+gXs
+szn
+lJA
+czP
+iCN
+lJA
+lJA
+lJA
+ewG
+eoJ
+lJA
+lEf
+ejr
+abc
+tJE
+hEL
+mbC
+rgu
+fbr
+mCm
+abc
+abc
+abu
+abu
+abu
+abc
aaa
aaa
aaa
@@ -84767,44 +88949,44 @@ cNd
cNd
cNd
cNd
+cNd
+cNd
+cNd
+cNd
+aaa
+gXs
+gXs
+fIs
aaa
aaa
+gXs
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+gXs
+kma
+fdJ
+hch
+reE
+tdd
+cJA
+tOk
+knA
+vws
+tkx
+epj
+lDm
+xnF
+pFj
+kcB
+gyy
+xUC
+vCS
+gcX
+pRi
+rsn
+qIW
+aca
+ebo
+yeZ
aaa
aaa
aaa
@@ -85026,42 +89208,42 @@ cNd
cNd
aaa
aaa
+eRz
+eRz
+eRz
+eRz
+eRz
+eRz
+gXs
+gXs
+gXs
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aae
-aaa
-aaa
-aaa
-aaa
+gXs
+yco
+lZp
+qgj
+lYI
+hzC
+ggT
+fdR
+qwA
+oqf
+wcS
+pFt
+lAD
+lJA
+lJA
+lJA
+szn
+ili
+waX
+mCo
+eRS
+naj
+liJ
+acc
+rAW
+abe
aaa
aaa
aaa
@@ -85283,42 +89465,42 @@ cNd
cNd
aaa
aaa
+eRz
+aaa
+gXs
+gXs
aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+adI
+oUF
+eCB
+adI
+qCc
+qCc
+wgu
+qCc
+qCc
+qCc
+lvw
+gMB
+lJA
+tnH
+wVt
+gSj
+vYF
+txs
+szn
+jKc
+mjJ
+eJu
+eSJ
+qNU
+moe
+acb
+gcm
+tqk
aaa
aaa
aaa
@@ -85540,42 +89722,42 @@ cNd
cNd
aaa
aaa
+eRz
aaa
aaa
+gXs
+aaa
+gXs
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-jLv
-aaa
-aaa
-aaa
-gWo
-gWo
-gWo
-dYZ
-gWo
-gWo
+adI
+hzs
+evh
+ycL
+qCc
+rUr
+jlQ
+gZT
+hQw
+qCc
+kcR
+rBK
+lJA
+weW
+xNV
+gxK
+dJu
+fbY
+szn
+abd
+khO
+enB
+enB
+enB
+enB
+enB
+enB
+sKA
gXs
gXs
gXs
@@ -85797,37 +89979,37 @@ cNd
cNd
aaa
aaa
+sMu
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-abc
-abc
-abc
+adI
+xWS
+adI
+xWS
+adI
+adI
+lCt
+qcU
+vRN
+qCc
+icS
+mqQ
+qYa
+wIl
+qCc
+sfz
+tbR
+lJA
+ryi
+cCr
+lJA
+lJA
+lJA
+szn
+noJ
+uql
afu
-abc
+acd
wdr
itQ
pgn
@@ -86054,37 +90236,37 @@ cNd
cNd
aaa
aaa
+eRz
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-abc
-aea
-aeH
-aft
-abc
+oUF
+llb
+eXI
+gLu
+vwQ
+acG
+hzs
+hnp
+jVV
+qCc
+qCc
+qCc
+qCc
+qCc
+qCc
+acG
+acG
+lJA
+maP
+lHK
+nRO
+vYF
+txs
+szn
+ksa
+dQS
+afu
+acd
pDe
dly
mnC
@@ -86311,38 +90493,38 @@ cNd
cNd
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+eRz
aaa
gXs
-gXs
-gXs
-abc
-abu
-abu
-abu
-abc
-abc
-aec
-aeJ
+adI
+lNQ
+eDF
+jYl
+lUU
+acG
+acG
+aaW
+wVq
+acG
+qFK
+jRW
+dLi
+evc
+qto
+pGA
+acG
+mnu
+xGm
+xNV
+oTx
+nko
+vFZ
+szn
+noJ
+uql
afw
-abc
-abc
+acd
+acd
dly
xxp
mcp
@@ -86465,7 +90647,7 @@ aaa
aaa
iDo
ctv
-aaT
+iDo
aaa
aaa
aaa
@@ -86568,38 +90750,38 @@ cNd
cNd
aaa
aaa
+eRz
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aae
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-gXs
-aai
-aai
-aai
+oUF
+iMy
+cTo
+ltm
+kkb
+xfW
+aaN
+kMn
+rDc
+grd
+wpV
+tYg
+tAS
+sAm
+jrR
+teq
+acG
+cVE
abb
abt
-aca
-acz
-acX
-adC
+lJA
+lJA
+lJA
+szn
aeb
-aeI
+uql
afv
agf
-abc
+acd
dly
xxp
mcp
@@ -86722,7 +90904,7 @@ aaa
aaa
iDo
iDo
-aaT
+iDo
aaa
aaa
aaa
@@ -86825,38 +91007,38 @@ cNd
cNd
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aai
-eqd
+eRz
+gXs
+gXs
+adI
+mwN
+kfG
+uJY
+vhC
+tLC
+aaN
+uLB
+kGj
+acG
+lux
+gPY
+ktW
+qQK
+uuw
+dPs
+acG
kgr
-abe
-abw
-acc
-acB
-acZ
-adE
-aee
+nFA
+wVt
+pZD
+vYF
+tCs
+szn
+pIR
aeL
afy
agh
-abc
+acd
kCa
hnU
vda
@@ -87081,39 +91263,39 @@ cNd
cNd
cNd
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
gXs
-aai
-gbu
+eRz
+aaa
+aaa
+oUF
+xFj
+jKm
+cYf
+kkb
+tAS
+pgq
+peD
+sBM
+acG
+aaN
+jOB
+acG
+acG
+acG
+acG
+acG
aay
-abd
+oss
abv
-acb
+pPE
acA
acI
adD
aed
-aeK
-afx
+wGc
+afv
agg
-abc
+acd
ovv
dCV
idK
@@ -87338,39 +91520,39 @@ cNd
cNd
cNd
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaf
-aaf
-aai
-acd
+gXs
+sMu
+gXs
+gXs
+adI
+adI
+yhI
+lLu
+dLZ
+vYY
+mui
+gcV
+lic
+aau
+xbP
+mHH
+fMF
+ueN
+iqi
+fKN
+acG
mIZ
abg
-enB
-aby
-aby
-aby
-aby
+lJA
+lJA
+lJA
+lJA
+szn
aeg
-aeN
+ryN
afA
-afA
-abc
+acd
+acd
kuA
laq
kdP
@@ -87593,41 +91775,41 @@ cNd
cNd
cNd
cNd
-cNd
+gXs
+gXs
+gXs
+eRz
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaf
-aaf
-aaf
-aai
-aai
+oUF
+vim
+kYm
+mke
+hpY
+obq
+fiR
+dPE
+pTT
+jIH
+rqq
+acG
+mxZ
+xMS
+pnb
abf
aaK
jRw
aaU
-acd
+eDJ
acC
ada
adF
aef
aeM
-afz
-oSl
-ail
+aav
+ldY
+xkk
lRb
vIi
fsj
@@ -87853,35 +92035,35 @@ cNd
cNd
aaa
aaa
+eRz
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aag
+rcV
+adI
+adI
+adI
+acG
+acG
+acG
+lBk
+jxx
+acG
thB
-aai
-aai
-aai
-aai
+rqq
+acG
+acG
+jTy
aaI
-aat
-aat
-aat
-aat
+acG
+gXu
+wAN
+ruu
ace
-aat
+ref
aat
adH
-aei
-aeO
+aem
+ikv
afJ
sXV
sXV
@@ -88110,35 +92292,35 @@ cNd
cNd
aaa
aaa
+eRz
+eRz
+gXs
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aag
-aaf
-aai
+gXs
+adI
+msp
+pHK
+wkU
+sNj
+rDm
+acG
+sAT
+rqq
aan
-aaw
-aaB
-qmn
-aaJ
-aat
+acG
+acG
+acG
+acG
+xLQ
abh
-aat
acd
+ozh
abK
acY
-adG
+aai
aeh
-aeO
+lJS
ado
afq
afH
@@ -88368,32 +92550,32 @@ cNd
aaa
aaa
aaa
+eRz
aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aag
-aaa
+xWS
+gcY
+oVL
+dSh
+xBJ
+fMY
+acG
+pUf
aam
aap
-saX
+aau
aaD
aau
-aat
-aat
-aat
+vMi
+oKB
+vhy
abA
-acd
-acd
-acd
-acd
+jNN
+jRV
+hkA
+aai
aek
acp
aav
@@ -88625,32 +92807,32 @@ cNd
aaa
aaa
aaa
+eRz
+eRz
+eRz
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aag
-aaf
-aai
+uKW
+tAS
+tAS
+eoR
+tAS
+ooF
+acG
+viH
+siz
aao
aax
aaC
aaA
-aat
-aat
-aat
+ngq
+tWe
+jHp
aei
-acd
+fFR
acE
add
-adF
+aai
aej
aeQ
adp
@@ -88882,36 +93064,36 @@ cNd
aaa
aaa
aaa
+gXs
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aag
-aaa
-aam
-aar
+eRz
+gXs
+gXs
+uKW
+oIl
+tAS
+eoR
+ecB
+dnX
+acG
+acG
+mZu
+acG
uGI
aaF
-aat
-aat
+qbk
+ske
aaW
-aat
-abB
-acf
-abM
+xjU
+acG
+acG
+acG
acG
adI
-aem
+xKl
omX
afG
-aim
+xuu
afL
ahu
aie
@@ -89139,32 +93321,32 @@ cNd
aaa
aaa
aaa
+gXs
+aaa
+eRz
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aag
-aaf
-aai
-aaq
+uhK
+xAA
+jSY
+hxg
+acK
+ssc
+acG
+uOm
+nLP
+acG
dyS
aaE
-aat
+aaN
aaN
aaV
rvS
-aat
-acd
+etr
+tyb
abL
adb
-acd
+adI
ael
aeO
afF
@@ -89396,35 +93578,35 @@ cNd
aaa
aaa
aaa
+gXs
+aaa
+eRz
aaa
aaa
-aaa
-aaa
-aae
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aag
-aaa
-aam
-aaj
-aat
-aat
-aat
+adI
+oIl
+uUb
+eZI
+qZQ
+dNP
+acG
+hJO
+mpY
+acG
+szf
+rDm
+gVc
qXg
-jjC
+acG
xOx
-abD
-acd
-acd
-acd
-acd
+oPY
+ncU
+lvc
+epG
+adI
aen
aeO
-ahE
+afG
afq
aii
afM
@@ -89653,32 +93835,32 @@ cNd
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aag
-aaf
-aai
-aas
-aat
-aat
-aat
-aat
-uEI
-aat
-abC
-acd
+gXs
+gXs
+eRz
+gXs
+gXs
+adI
+jnk
+emf
+vHK
+vHK
+vHK
+vHK
+vHK
+acG
+acG
+fdS
+qRI
+jvB
+iwU
+acG
+ltw
+eDf
+oXV
acH
adc
-acd
+adI
aeo
aev
aeS
@@ -89912,34 +94094,34 @@ aaa
aaa
aaa
aaa
+eRz
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aag
-aaa
-aam
-akQ
-aav
-aav
-aav
-aav
-aav
-aav
+jnk
+qOY
+pBd
+kGL
+fcj
+jqK
+vHK
+rTj
+rTj
+goJ
+kLK
+rTj
+hvC
+acG
+oiY
abE
acg
acJ
-ade
+adb
adJ
aep
aeT
-ahE
-aim
+afG
+xuu
ajL
akj
afM
@@ -90169,30 +94351,30 @@ aaa
aaa
aaa
aaa
+eRz
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aag
-aaf
-aai
-wYc
-wYc
+jnk
+sIn
+eZS
+iBj
+pGs
+iBq
+vHK
+dCd
+aaP
+xpH
aaG
wYc
aaP
-aaX
+acG
keM
xib
-acd
+acG
acD
-acY
-adG
+cNi
+adI
aeq
aeV
agj
@@ -90426,30 +94608,30 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aag
-aaa
-aai
-aai
-aai
-aai
-aai
-aai
-aai
+eRz
+eRz
+gXs
+gXs
+jnk
+jnk
+jnk
+jnk
+vHK
+vHK
+vHK
+xMg
+tPY
+ugi
+lht
+jVP
+tPY
+acG
abj
abF
-acd
-acd
-acd
-acd
+eIW
+mJy
+ldT
+cSp
aeP
afC
agk
@@ -90684,29 +94866,29 @@ aaa
aaa
aaa
aaa
+eRz
aaa
aaa
+gXs
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaf
-aaf
-aaa
-aaf
-aai
+gXs
+adI
+olH
+mte
+lpx
+nZs
+nZs
+nZs
+sYV
+nZs
+maU
+acG
abi
eqA
ach
-acK
+wAj
adf
-acd
+mhv
aer
afB
agi
@@ -90939,31 +95121,31 @@ aaa
aaa
aaa
aaa
+gDl
+aaa
+eRz
aaa
aaa
+gXs
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
-aaf
+adI
+noR
+nSI
+sHd
+tAS
+tHO
aaR
-aai
-aai
-aai
-aai
-aai
-aai
-aai
+jUN
+peE
+aaR
+adI
+adI
+adI
+adI
+adI
+adI
+adI
aaZ
aaZ
aiX
@@ -91198,23 +95380,23 @@ aaa
aaa
aaa
aaa
+eRz
+eRz
+eRz
+eRz
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaf
-aaa
-aaf
-aaf
+adI
+sew
+suS
+qvc
+adb
+kOE
+dxv
+fmR
+dzK
+adb
+adI
aaT
aaf
abx
@@ -91456,22 +95638,22 @@ aaa
aaa
aaa
aaa
+gXs
+gXs
+eRz
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaf
-aaa
-aaf
-aaf
+rcV
+adI
+adI
+adI
+adI
+oUF
+gfw
+adI
+adI
+nqu
+uZY
+adI
aaT
gXs
abG
@@ -91714,21 +95896,21 @@ aaa
aaa
aaa
aaa
+gXs
+eRz
aaa
aaa
aaa
aaa
+gXs
aaa
aaa
aaa
aaa
+gXs
aaa
+gXs
aaa
-aaa
-aaf
-aaa
-aaf
-aaf
abY
gXs
abG
@@ -91968,24 +96150,24 @@ aaa
aaa
aaa
aaa
+gXs
+gXs
+gXs
+gXs
+eRz
+aaa
+gXs
+aaa
+aaa
+gXs
aaa
aaa
aaa
aaa
+gXs
aaa
+gXs
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaf
-aaa
-aaf
-aaf
aaT
gXs
abG
@@ -92229,18 +96411,18 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaf
-aaa
+eRz
+eRz
+eRz
+eRz
+eRz
+eRz
+eRz
+eRz
+eRz
+eRz
+aaT
+eRz
aaf
aaf
aaT
@@ -92488,18 +96670,18 @@ aaa
aaa
aaa
aaa
+gXs
+gXs
+gXs
+gXs
+gXs
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+gXs
aaa
aaf
aaa
aaf
-aaf
+ktS
abY
gXs
abG
@@ -92746,17 +96928,17 @@ aaa
aaa
aaa
aaa
+gXs
+aaa
+gXs
aaa
aaa
-aaa
-aaa
-aaa
-aaa
+gXs
aaa
aaf
aaa
aaf
-aaf
+ktS
adR
abo
adR
@@ -93003,17 +97185,17 @@ aaa
aaa
aaa
aaa
+gXs
+aaa
+gXs
aaa
aaa
-aaa
-aaa
-aaa
-aaa
+gXs
aaa
aaf
aaa
aaf
-aaf
+ktS
adR
aaY
abJ
@@ -93262,15 +97444,15 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
+gXs
+gXs
+gXs
+gXs
aaf
aaf
aaf
aaf
-aaa
+gXs
abo
abk
abk
@@ -93519,7 +97701,7 @@ aaa
aaa
aaa
aaa
-aaa
+gXs
aaa
aaa
aaa
@@ -93776,7 +97958,7 @@ aaa
aaa
aaa
aaa
-aaa
+gXs
aaa
aaa
aaa
@@ -93784,7 +97966,7 @@ aaa
aaa
aaa
aaf
-aaa
+gXs
abo
abO
abO
@@ -94033,7 +98215,7 @@ aaa
aaa
aaa
aaa
-aaa
+gXs
aaa
aaa
aaa
@@ -94290,11 +98472,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..d3c8c90947 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -2055,12 +2055,12 @@
/turf/open/floor/plating,
/area/ai_monitored/turret_protected/AIsatextAP)
"afd" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
/obj/structure/cable/yellow{
icon_state = "4-8"
},
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat_interior)
"afe" = (
@@ -2076,6 +2076,9 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat_interior)
"aff" = (
@@ -2091,6 +2094,9 @@
/obj/effect/turf_decal/tile/blue{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat_interior)
"afg" = (
@@ -2108,14 +2114,18 @@
/obj/effect/turf_decal/tile/blue{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat_interior)
"afh" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
},
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat_interior)
@@ -2127,24 +2137,21 @@
/obj/structure/cable/yellow{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plating,
/area/ai_monitored/turret_protected/AIsatextAS)
"afj" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
/obj/structure/cable/yellow{
icon_state = "4-8"
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
/turf/open/floor/plating,
/area/ai_monitored/turret_protected/AIsatextAS)
"afk" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
/obj/structure/cable/yellow{
icon_state = "4-8"
},
@@ -2155,15 +2162,21 @@
c_tag = "MiniSat Maintenance Starboard Aft";
network = list("minisat")
},
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
/turf/open/floor/plating,
/area/ai_monitored/turret_protected/AIsatextAS)
"afl" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
/obj/structure/cable/yellow{
icon_state = "4-8"
},
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
/turf/open/floor/plating,
/area/ai_monitored/turret_protected/AIsatextAS)
"afm" = (
@@ -2708,6 +2721,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
},
+/obj/effect/landmark/start/prisoner,
/turf/open/floor/plasteel,
/area/security/prison)
"agN" = (
@@ -2736,6 +2750,7 @@
/obj/machinery/light/small{
dir = 4
},
+/obj/effect/landmark/start/prisoner,
/turf/open/floor/plasteel/freezer,
/area/security/prison)
"agP" = (
@@ -8590,7 +8605,7 @@
dir = 10
},
/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
+/area/command/bridge)
"atN" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 5
@@ -9640,7 +9655,7 @@
dir = 8
},
/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
+/area/command/bridge)
"avR" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -9746,7 +9761,7 @@
req_access_txt = "10;13"
},
/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat_interior)
+/area/command/bridge)
"awd" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -10367,7 +10382,7 @@
},
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
-/area/hallway/primary/fore)
+/area/security/brig)
"axF" = (
/obj/item/kirbyplants{
icon_state = "plant-10"
@@ -10570,7 +10585,7 @@
},
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/aisat_interior)
+/area/command/bridge)
"ayf" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -22902,7 +22917,7 @@
req_access_txt = "10;13"
},
/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat_interior)
+/area/command/bridge)
"baI" = (
/obj/structure/cable{
icon_state = "0-8"
@@ -26842,10 +26857,10 @@
/turf/open/space,
/area/solars/starboard)
"bkQ" = (
-/obj/machinery/vending/snack,
/obj/effect/turf_decal/stripes/line{
dir = 9
},
+/obj/structure/closet/emcloset,
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"bkR" = (
@@ -36801,15 +36816,9 @@
/turf/open/floor/plating,
/area/maintenance/department/science)
"bFE" = (
-/obj/docking_port/stationary{
- dwidth = 2;
- height = 6;
- id = "monastery_shuttle_asteroid";
- name = "monastery";
- width = 5
- },
-/turf/open/space,
-/area/space/nearstation)
+/obj/structure/reagent_dispensers/watertank,
+/turf/open/floor/plating,
+/area/maintenance/department/crew_quarters/dorms)
"bFF" = (
/obj/machinery/atmospherics/components/unary/tank/air{
dir = 1
@@ -37338,21 +37347,19 @@
/turf/open/floor/plating,
/area/service/chapel/dock)
"bGF" = (
-/obj/machinery/door/airlock/external{
- name = "Pod Docking Bay"
+/obj/docking_port/stationary{
+ dwidth = 2;
+ height = 6;
+ id = "monastery_shuttle_asteroid";
+ name = "monastery";
+ width = 5
},
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/turf/open/floor/plating,
-/area/service/chapel/dock)
+/turf/open/space,
+/area/space/nearstation)
"bGG" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on,
-/obj/structure/window/reinforced,
-/obj/structure/window/reinforced{
- dir = 8;
- layer = 2.9
- },
-/turf/open/floor/plating/airless,
-/area/service/chapel/dock)
+/obj/effect/spawner/lootdrop/grille_or_trash,
+/turf/open/floor/plating,
+/area/maintenance/department/security/brig)
"bGH" = (
/obj/structure/window/reinforced,
/turf/open/space,
@@ -37856,38 +37863,39 @@
/turf/open/floor/plasteel,
/area/science/mixing)
"bHI" = (
-/obj/structure/grille/broken,
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/structure/reagent_dispensers/fueltank,
+/turf/open/floor/plating,
+/area/maintenance/department/cargo)
"bHJ" = (
+/obj/machinery/door/airlock/external{
+ name = "Pod Docking Bay"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/turf/open/floor/plating,
/area/service/chapel/dock)
"bHK" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
+/obj/item/cigbutt,
/turf/open/floor/plating,
-/area/service/chapel/dock)
+/area/maintenance/department/cargo)
"bHL" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/service/chapel/dock)
-"bHM" = (
-/turf/closed/wall/r_wall,
-/area/service/chapel/dock)
-"bHN" = (
+/obj/machinery/atmospherics/components/unary/outlet_injector/on,
/obj/structure/window/reinforced,
/obj/structure/window/reinforced{
dir = 8;
layer = 2.9
},
-/obj/structure/lattice,
-/turf/open/space/basic,
-/area/space/nearstation)
+/turf/open/floor/plating/airless,
+/area/service/chapel/dock)
+"bHM" = (
+/turf/closed/wall/r_wall,
+/area/service/chapel/dock)
+"bHN" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/vending/cola/random,
+/turf/open/floor/plasteel,
+/area/hallway/secondary/entry)
"bHP" = (
/obj/effect/decal/cleanable/cobweb,
/turf/open/floor/plasteel/dark,
@@ -38426,50 +38434,36 @@
/turf/open/space/basic,
/area/space/nearstation)
"bIU" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/closed/wall,
-/area/service/chapel/dock)
+/obj/machinery/vending/snack/random,
+/turf/open/floor/plasteel,
+/area/hallway/secondary/entry)
"bIV" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/sign/warning/vacuum/external,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 6
+ },
/turf/open/floor/plating,
/area/service/chapel/dock)
"bIW" = (
-/obj/machinery/computer/shuttle/monastery_shuttle,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
},
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plating,
/area/service/chapel/dock)
"bIX" = (
-/obj/machinery/atmospherics/components/unary/tank/air,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/service/chapel/dock)
+/obj/structure/grille/broken,
+/turf/open/space/basic,
+/area/space/nearstation)
"bIY" = (
+/obj/structure/window/reinforced,
/obj/structure/window/reinforced{
dir = 8;
layer = 2.9
},
+/obj/structure/lattice,
/turf/open/space/basic,
-/area/space)
+/area/space/nearstation)
"bIZ" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -38984,44 +38978,58 @@
/turf/open/space/basic,
/area/space/nearstation)
"bKa" = (
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
+/obj/machinery/door/airlock/external{
+ name = "Pod Docking Bay"
},
-/turf/open/floor/plasteel/dark,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/turf/open/floor/plating,
/area/service/chapel/dock)
"bKb" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/sign/warning/vacuum/external,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plating,
/area/service/chapel/dock)
"bKc" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/machinery/computer/shuttle/monastery_shuttle,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
},
/turf/open/floor/plasteel/dark,
/area/service/chapel/dock)
"bKd" = (
-/obj/machinery/power/apc{
- dir = 4;
- name = "Monastery Docking Bay APC";
- pixel_x = 24
+/obj/machinery/atmospherics/components/unary/tank/air,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
},
-/obj/structure/cable{
- icon_state = "0-8"
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/dark,
/area/service/chapel/dock)
"bKe" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel/white{
- heat_capacity = 1e+006
+/obj/structure/lattice,
+/obj/structure/window/reinforced{
+ dir = 8;
+ layer = 2.9
},
-/area/service/chapel/dock)
+/turf/open/space/basic,
+/area/space/nearstation)
"bKf" = (
+/obj/structure/chair,
/turf/open/floor/plasteel/white{
heat_capacity = 1e+006
},
@@ -39492,52 +39500,40 @@
/turf/open/floor/plating,
/area/science/mixing)
"bLn" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4
+ },
+/obj/structure/extinguisher_cabinet{
+ pixel_x = -24
+ },
/turf/open/floor/plasteel/dark,
/area/service/chapel/dock)
"bLo" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
+ icon_state = "2-4"
},
/turf/open/floor/plasteel/dark,
/area/service/chapel/dock)
"bLp" = (
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel/dark,
/area/service/chapel/dock)
"bLq" = (
-/obj/machinery/door/airlock/grunge{
- name = "Monastery Transit"
+/obj/machinery/power/apc{
+ dir = 4;
+ name = "Monastery Docking Bay APC";
+ pixel_y = 24
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
+/obj/structure/cable{
+ icon_state = "0-8"
},
/turf/open/floor/plasteel/dark,
/area/service/chapel/dock)
"bLr" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
/turf/open/floor/plasteel/white{
heat_capacity = 1e+006
},
@@ -39986,9 +39982,6 @@
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -39999,12 +39992,12 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark,
/area/service/chapel/dock)
"bMt" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -40012,39 +40005,27 @@
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
+ },
/turf/open/floor/plasteel/dark,
/area/service/chapel/dock)
"bMu" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/turf/open/floor/plasteel/dark,
/area/service/chapel/dock)
"bMv" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/service/chapel/dock)
-"bMw" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white{
- heat_capacity = 1e+006
+/obj/effect/turf_decal/stripes/corner,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
},
+/turf/open/floor/plasteel/dark,
/area/service/chapel/dock)
"bMx" = (
/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
/turf/open/floor/plasteel/white{
heat_capacity = 1e+006
},
@@ -40454,12 +40435,6 @@
/turf/open/floor/plating,
/area/service/chapel/asteroid/monastery)
"bNt" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/obj/structure/extinguisher_cabinet{
- pixel_x = -24
- },
/obj/machinery/light/small,
/obj/machinery/camera{
c_tag = "Monastery Dock";
@@ -40476,21 +40451,18 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/structure/table/wood,
+/obj/item/clothing/under/misc/burial,
/turf/open/floor/plasteel/dark,
/area/service/chapel/dock)
"bNu" = (
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/dark,
/area/service/chapel/dock)
"bNv" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
/obj/item/radio/intercom{
name = "Station Intercom (General)";
pixel_x = 27
@@ -40506,6 +40478,8 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/structure/table/wood,
+/obj/item/reagent_containers/food/snacks/grown/poppy,
/turf/open/floor/plasteel/dark,
/area/service/chapel/dock)
"bNw" = (
@@ -40544,13 +40518,26 @@
/obj/structure/lattice/catwalk,
/turf/open/space,
/area/space/nearstation)
-"bNE" = (
-/obj/machinery/light/small{
+"bNC" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/turf/open/floor/plating{
- icon_state = "panelscorched"
+/turf/open/floor/plasteel/dark,
+/area/service/library)
+"bNE" = (
+/obj/machinery/atmospherics/pipe/manifold/general/hidden{
+ dir = 1
},
+/obj/machinery/meter,
+/turf/open/floor/plating,
/area/maintenance/department/chapel/monastery)
"bNF" = (
/obj/item/stack/medical/suture,
@@ -40905,19 +40892,12 @@
/turf/open/floor/plasteel/dark,
/area/service/chapel/dock)
"bOy" = (
-/obj/effect/turf_decal/tile/neutral{
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/chair{
dir = 1
},
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
/turf/open/floor/plasteel/dark,
/area/service/chapel/dock)
"bOz" = (
@@ -41309,7 +41289,7 @@
req_access_txt = "23"
},
/turf/open/floor/plating,
-/area/engineering/storage/tech)
+/area/maintenance/department/engine)
"bPG" = (
/obj/machinery/light{
dir = 8
@@ -44347,8 +44327,8 @@
/turf/open/floor/plating,
/area/maintenance/department/engine)
"bWl" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
+/obj/structure/disposalpipe/junction/yjunction{
+ dir = 8
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
@@ -46226,8 +46206,12 @@
/turf/open/floor/engine,
/area/maintenance/disposal/incinerator)
"caS" = (
-/turf/closed/wall,
-/area/service/chapel/asteroid/monastery)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/holopad,
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"caT" = (
/obj/structure/grille,
/obj/structure/window/reinforced/tinted/fulltile,
@@ -46526,6 +46510,9 @@
"cbT" = (
/obj/item/shovel,
/obj/effect/landmark/xeno_spawn,
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
/turf/open/floor/plating,
/area/maintenance/department/engine)
"cbV" = (
@@ -46898,6 +46885,7 @@
"cdE" = (
/obj/structure/chair,
/obj/item/cigbutt,
+/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/maintenance/department/engine)
"cdI" = (
@@ -46969,6 +46957,11 @@
},
/turf/open/floor/plating,
/area/engineering/main)
+"cdV" = (
+/obj/structure/window/reinforced/fulltile,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plating,
+/area/service/library/lounge)
"cdW" = (
/obj/structure/reflector/box/anchored,
/turf/open/floor/plasteel/dark,
@@ -48318,48 +48311,26 @@
/turf/open/floor/plating,
/area/service/chapel/main/monastery)
"cjH" = (
-/obj/machinery/door/airlock/grunge{
- name = "Chapel Garden"
+/obj/item/kirbyplants{
+ icon_state = "plant-21"
},
/turf/open/floor/plasteel/dark,
/area/service/chapel/main/monastery)
"cjO" = (
-/obj/effect/decal/cleanable/cobweb{
- icon_state = "cobweb2"
- },
-/obj/item/stack/sheet/glass/fifty{
- layer = 4
- },
-/obj/item/stack/sheet/metal{
- amount = 20;
- layer = 3.1
- },
-/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
-"cjP" = (
-/obj/item/kirbyplants{
- icon_state = "plant-22"
- },
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = 26
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
},
/turf/open/floor/plasteel/dark,
-/area/service/library/lounge)
+/area/security/courtroom)
+"cjP" = (
+/obj/structure/table,
+/obj/item/storage/fancy/donut_box,
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"cjQ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/carpet,
+/obj/structure/bookcase/random/nonfiction,
+/turf/open/floor/plasteel/dark,
/area/service/library)
-"cjR" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/carpet,
-/area/service/library/lounge)
"cjV" = (
/obj/machinery/camera/preset/toxins,
/turf/open/floor/plating/asteroid/airless,
@@ -48401,71 +48372,47 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/plasteel/dark,
/area/service/chapel/main/monastery)
-"cke" = (
-/obj/machinery/power/smes{
- charge = 5e+006
- },
-/obj/structure/cable,
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
"ckf" = (
-/obj/machinery/power/terminal{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
-"ckg" = (
-/obj/item/wrench,
-/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
-"ckh" = (
-/obj/item/stack/cable_coil,
-/obj/item/stack/cable_coil,
-/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
-"cki" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 1;
- name = "Air Out"
- },
-/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
-"ckj" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
-"ckk" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = 24
- },
-/obj/item/stack/rods/fifty,
-/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
-"ckl" = (
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/machinery/photocopier,
+/obj/structure/table,
+/obj/item/book/manual/wiki/security_space_law,
/turf/open/floor/plasteel/dark,
-/area/service/library/lounge)
-"ckm" = (
+/area/security/courtroom)
+"ckh" = (
+/obj/structure/chair,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
+"ckj" = (
+/obj/structure/chair,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
+"cko" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/carpet,
/area/service/library)
-"cko" = (
-/obj/structure/bookcase/random/religion,
-/turf/open/floor/plasteel/dark,
-/area/service/library)
"ckp" = (
-/obj/structure/bookcase/random/religion,
-/obj/effect/decal/cleanable/cobweb{
- icon_state = "cobweb2"
- },
+/obj/structure/closet/crate/bin,
/turf/open/floor/plasteel/dark,
/area/service/library/lounge)
"ckt" = (
@@ -48502,74 +48449,66 @@
/turf/open/floor/plasteel/dark,
/area/service/chapel/main/monastery)
"cky" = (
-/obj/machinery/power/smes{
- charge = 5e+006
+/obj/structure/cable{
+ icon_state = "0-4"
},
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
-"ckz" = (
-/obj/machinery/atmospherics/pipe/simple/general/hidden{
- dir = 6
+/obj/machinery/power/apc{
+ areastring = "/area/security/courtroom";
+ dir = 8;
+ name = "Courtroom APC";
+ pixel_x = -25
},
-/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"ckA" = (
-/obj/machinery/atmospherics/pipe/manifold/general/hidden{
- dir = 1
- },
-/obj/machinery/meter,
-/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/chair,
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"ckB" = (
-/obj/machinery/atmospherics/pipe/manifold/general/hidden{
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
+"ckD" = (
+/obj/structure/statue/sandstone/venus{
+ dir = 8
+ },
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = 28
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
+"ckE" = (
+/obj/structure/grille/broken,
+/obj/structure/disposalpipe/segment{
dir = 4
},
/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
-"ckC" = (
-/obj/item/extinguisher,
+/area/maintenance/department/engine)
+"ckF" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
-"ckD" = (
+/area/maintenance/department/engine)
+"ckG" = (
/obj/structure/chair/wood/normal,
/obj/machinery/firealarm{
dir = 4;
pixel_x = -28
},
-/turf/open/floor/plasteel/dark,
-/area/service/library/lounge)
-"ckE" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
+/obj/machinery/camera{
+ c_tag = "Monastery Library";
+ dir = 4;
+ network = list("ss13","monastery")
},
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/service/chapel/main/monastery)
-"ckF" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/carpet,
-/area/service/library/lounge)
-"ckG" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
+/obj/machinery/light/small{
dir = 8
},
/turf/open/floor/plasteel/dark,
@@ -48578,8 +48517,8 @@
/turf/open/floor/plasteel/dark,
/area/service/library)
"ckI" = (
-/obj/machinery/light/small{
- dir = 4
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
},
/turf/open/floor/plasteel/dark,
/area/service/library/lounge)
@@ -48613,57 +48552,39 @@
},
/turf/open/floor/plasteel/dark,
/area/service/chapel/main/monastery)
-"ckO" = (
-/obj/structure/closet/emcloset,
-/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
-"ckP" = (
-/obj/machinery/atmospherics/components/unary/tank/air{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
"ckQ" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/mineral/iron,
-/area/maintenance/department/chapel/monastery)
-"ckR" = (
-/obj/structure/reagent_dispensers/watertank,
-/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
-"ckS" = (
-/obj/structure/table/wood,
-/obj/item/folder/yellow,
-/obj/item/pen,
-/obj/machinery/camera{
- c_tag = "Monastery Library";
- dir = 4;
- network = list("ss13","monastery")
+/obj/machinery/door/airlock/public/glass{
+ name = "Courtroom"
},
-/turf/open/floor/plasteel/dark,
-/area/service/library/lounge)
-"ckT" = (
-/obj/machinery/door/airlock/grunge{
- name = "Library"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel/dark,
-/area/service/library/lounge)
+/area/security/courtroom)
+"ckS" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/security/courtroom)
"ckU" = (
-/obj/machinery/bookbinder,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/machinery/libraryscanner,
/turf/open/floor/plasteel/dark,
/area/service/library/lounge)
"ckV" = (
-/obj/structure/bookcase/random/reference,
-/turf/open/floor/plasteel/dark,
+/obj/effect/landmark/barthpot,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/carpet,
/area/service/library/lounge)
"ckW" = (
-/obj/structure/bookcase/random/nonfiction,
-/turf/open/floor/plasteel/dark,
-/area/service/library)
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/closed/wall,
+/area/maintenance/department/engine)
"ckX" = (
-/obj/structure/bookcase/random/fiction,
+/obj/structure/table/wood,
+/obj/machinery/computer/libraryconsole,
/turf/open/floor/plasteel/dark,
/area/service/library/lounge)
"clb" = (
@@ -48673,36 +48594,18 @@
},
/turf/open/floor/plating,
/area/service/chapel/main/monastery)
-"cld" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/closed/wall,
-/area/maintenance/department/chapel/monastery)
"cle" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall,
-/area/maintenance/department/chapel/monastery)
+/obj/structure/statue/sandstone/venus,
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"clf" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/item/storage/box/lights/bulbs,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
-"clg" = (
-/obj/structure/chair/wood/normal{
- dir = 1
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 8
},
/turf/open/floor/plasteel/dark,
-/area/service/library/lounge)
+/area/security/courtroom)
"cli" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 8
},
/turf/open/floor/plasteel/dark,
@@ -48714,25 +48617,23 @@
/turf/open/floor/plating/asteroid/airless,
/area/asteroid/nearstation/bomb_site)
"clk" = (
-/obj/machinery/light/small{
- dir = 8
+/obj/machinery/light{
+ dir = 4
},
-/obj/machinery/libraryscanner,
/turf/open/floor/plasteel/dark,
-/area/service/library/lounge)
+/area/security/courtroom)
"clm" = (
-/obj/structure/closet/crate/bin,
+/obj/machinery/photocopier,
/turf/open/floor/plasteel/dark,
/area/service/library/lounge)
"cln" = (
-/obj/structure/bookcase/random/adult,
-/turf/open/floor/plasteel/dark,
+/obj/machinery/newscaster{
+ pixel_x = -32;
+ pixel_y = -32
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/carpet,
/area/service/library/lounge)
-"clp" = (
-/obj/structure/table/wood,
-/obj/machinery/computer/libraryconsole/bookmanagement,
-/turf/open/floor/plasteel/dark,
-/area/service/library)
"cls" = (
/obj/effect/spawner/lootdrop/maintenance,
/turf/closed/mineral,
@@ -50325,8 +50226,9 @@
/turf/open/floor/plasteel,
/area/engineering/atmos)
"cqH" = (
-/obj/machinery/light/small{
- dir = 8
+/obj/machinery/airalarm{
+ dir = 4;
+ pixel_x = -22
},
/turf/open/floor/plasteel/dark,
/area/service/chapel/dock)
@@ -50352,11 +50254,10 @@
/turf/open/floor/plasteel,
/area/command/heads_quarters/ce)
"cqW" = (
-/obj/structure/chair,
-/turf/open/floor/plasteel/white{
- heat_capacity = 1e+006
- },
-/area/service/chapel/dock)
+/obj/structure/closet/crate,
+/obj/effect/spawner/lootdrop/maintenance,
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
"cqX" = (
/obj/structure/disposalpipe/segment,
/obj/structure/lattice,
@@ -50713,7 +50614,7 @@
"csy" = (
/obj/effect/spawner/lootdrop/maintenance,
/obj/structure/disposalpipe/segment{
- dir = 6
+ dir = 4
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
@@ -51049,12 +50950,13 @@
/turf/open/floor/plating,
/area/service/chapel/main/monastery)
"ctS" = (
-/obj/structure/disposaloutlet,
-/obj/structure/disposalpipe/trunk{
- dir = 1
+/obj/structure/closet,
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 3;
+ name = "3maintenance loot spawner"
},
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
"ctX" = (
/obj/machinery/vending/wardrobe/chap_wardrobe,
/turf/open/floor/carpet,
@@ -51547,9 +51449,6 @@
/turf/open/floor/plasteel/dark,
/area/service/chapel/main/monastery)
"cvy" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -51560,6 +51459,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/turf/open/floor/plasteel/dark,
/area/service/chapel/main/monastery)
"cvA" = (
@@ -51591,9 +51491,7 @@
icon_state = "1-4"
},
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/item/kirbyplants{
- icon_state = "plant-21"
- },
+/obj/machinery/light/small,
/turf/open/floor/plasteel/dark,
/area/service/chapel/main/monastery)
"cvF" = (
@@ -51616,15 +51514,9 @@
/turf/open/floor/plasteel/dark,
/area/service/chapel/main/monastery)
"cvH" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -51635,10 +51527,18 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Monastery Cloister Aft";
+ dir = 1;
+ network = list("ss13","monastery")
+ },
+/obj/machinery/light/small,
/turf/open/floor/plasteel/dark,
/area/service/chapel/main/monastery)
"cvI" = (
-/obj/machinery/light/small,
/obj/structure/cable{
icon_state = "4-8"
},
@@ -51646,21 +51546,6 @@
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/camera{
- c_tag = "Monastery Cloister Aft";
- dir = 1;
- network = list("ss13","monastery")
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
/turf/open/floor/plasteel/dark,
/area/service/chapel/main/monastery)
"cvJ" = (
@@ -51671,38 +51556,16 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
/turf/open/floor/plasteel/dark,
/area/service/chapel/main/monastery)
"cvK" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/structure/closet,
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 8;
+ name = "8maintenance loot spawner"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/service/chapel/main/monastery)
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
"cvR" = (
/obj/machinery/light/small{
dir = 8
@@ -51731,52 +51594,16 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/dark,
/area/service/chapel/main/monastery)
-"cvX" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/closed/wall/mineral/iron,
-/area/maintenance/department/chapel/monastery)
-"cvY" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/closed/wall/mineral/iron,
-/area/maintenance/department/chapel/monastery)
-"cvZ" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/closed/wall/mineral/iron,
-/area/maintenance/department/chapel/monastery)
-"cwa" = (
-/turf/closed/wall/mineral/iron,
-/area/maintenance/department/chapel/monastery)
"cwc" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/door/airlock/maintenance{
- name = "Monastery Maintenance";
- req_one_access_txt = "22;24;10;11;37"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
+/turf/closed/wall/mineral/iron,
+/area/security/courtroom)
"cwe" = (
/turf/closed/wall/mineral/iron,
/area/service/library/lounge)
"cwg" = (
-/obj/machinery/door/airlock/grunge{
- name = "Library"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/dark,
-/area/service/library/lounge)
+/obj/structure/grille,
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
"cwj" = (
/obj/item/storage/box/matches{
pixel_x = -3;
@@ -51800,69 +51627,42 @@
/turf/open/floor/plasteel/dark,
/area/service/chapel/main/monastery)
"cwm" = (
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
-"cwn" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/item/storage/toolbox/mechanical,
-/obj/machinery/light/small{
+/obj/machinery/light{
dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
+"cwn" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
},
-/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"cwo" = (
-/obj/machinery/power/apc{
- dir = 1;
- name = "Monastery Maintenance APC";
- pixel_y = 23
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 4
},
-/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"cwp" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/machinery/camera{
+ c_tag = "Courtroom North"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+/obj/machinery/airalarm{
+ pixel_y = 22
},
-/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"cwr" = (
/obj/item/kirbyplants{
icon_state = "plant-22"
},
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/power/apc{
- dir = 4;
- name = "Library Lounge APC";
- pixel_x = 24
- },
-/obj/machinery/airalarm{
- pixel_y = 22
+/obj/item/radio/intercom{
+ name = "Station Intercom (General)";
+ pixel_y = 26
},
/turf/open/floor/plasteel/dark,
/area/service/library/lounge)
@@ -51899,9 +51699,6 @@
/obj/structure/table/wood,
/turf/open/floor/plasteel/dark,
/area/service/chapel/main/monastery)
-"cwA" = (
-/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
"cwE" = (
/obj/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -51927,17 +51724,12 @@
/turf/open/floor/plasteel/dark,
/area/service/chapel/main/monastery)
"cwH" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
+/obj/structure/chair,
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"cwK" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/carpet,
-/area/service/library/lounge)
+/turf/closed/wall,
+/area/security/courtroom)
"cwM" = (
/obj/structure/window/reinforced{
dir = 4;
@@ -51957,12 +51749,14 @@
/turf/open/space/basic,
/area/space/nearstation)
"cwS" = (
-/obj/structure/reagent_dispensers/fueltank,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
-/area/maintenance/department/chapel/monastery)
+/area/security/courtroom)
"cwU" = (
/obj/structure/table/wood,
-/obj/machinery/computer/libraryconsole,
+/obj/item/folder/yellow,
+/obj/item/pen,
/turf/open/floor/plasteel/dark,
/area/service/library/lounge)
"cxb" = (
@@ -51974,14 +51768,12 @@
/turf/open/floor/plasteel,
/area/science/mixing)
"cxe" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
+/obj/structure/disposalpipe/segment{
+ dir = 5
},
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/carpet,
-/area/service/library/lounge)
+/obj/effect/spawner/lootdrop/maintenance,
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
"cxg" = (
/obj/structure/window/reinforced{
dir = 1;
@@ -52011,14 +51803,6 @@
},
/turf/open/space/basic,
/area/space/nearstation)
-"cxn" = (
-/obj/machinery/newscaster{
- pixel_x = -32;
- pixel_y = -32
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/carpet,
-/area/service/library/lounge)
"cxt" = (
/obj/effect/turf_decal/box/corners{
dir = 8
@@ -52036,265 +51820,134 @@
/turf/open/floor/plasteel/dark,
/area/science/explab)
"cxz" = (
-/obj/machinery/door/airlock/grunge{
- name = "Library"
+/obj/structure/disposalpipe/segment{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/dark,
-/area/service/library/lounge)
+/obj/structure/grille/broken,
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
"cxB" = (
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
+"cxD" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
+"cxE" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
},
/turf/closed/wall,
/area/service/library/lounge)
-"cxC" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/service/library/lounge)
-"cxD" = (
-/obj/effect/turf_decal/stripes/corner,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/service/library/lounge)
-"cxE" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+"cxL" = (
+/obj/effect/landmark/xeno_spawn,
+/obj/structure/disposalpipe/segment{
dir = 10
},
-/turf/closed/wall,
-/area/service/library/lounge)
-"cxJ" = (
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
+"cxM" = (
/obj/structure/window/reinforced/fulltile,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/service/library/lounge)
-"cxK" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/service/library/lounge)
-"cxL" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/service/library/lounge)
-"cxM" = (
-/obj/structure/window/reinforced/fulltile,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/service/library/lounge)
"cxX" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
+/obj/machinery/power/smes{
+ charge = 5e+006
},
-/obj/machinery/camera{
- c_tag = "Monastery Archives Access Tunnel";
- dir = 4;
- network = list("ss13","monastery")
+/obj/structure/cable{
+ icon_state = "0-2"
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/service/library/lounge)
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
"cxY" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
+/obj/machinery/power/terminal{
dir = 8
},
-/turf/open/floor/plasteel/dark,
-/area/service/library/lounge)
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
"cyl" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral{
+/obj/item/storage/toolbox/mechanical,
+/obj/machinery/light/small{
dir = 1
},
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/service/library/lounge)
-"cym" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "2-4"
},
-/obj/effect/turf_decal/tile/neutral{
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
+"cym" = (
+/obj/machinery/power/apc{
+ dir = 1;
+ name = "Monastery Maintenance APC";
+ pixel_y = 23
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/effect/decal/cleanable/cobweb{
+ icon_state = "cobweb2"
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
+"cyy" = (
+/obj/item/storage/box/lights/bulbs,
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
+"cyz" = (
+/obj/machinery/light/small{
dir = 1
},
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
+/obj/machinery/portable_atmospherics/canister/air,
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
+"cyA" = (
+/obj/machinery/power/smes{
+ charge = 5e+006
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
+/obj/structure/cable,
+/obj/structure/cable{
+ icon_state = "0-2"
},
-/turf/open/floor/plasteel/dark,
-/area/service/library/lounge)
-"cyy" = (
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
+"cyB" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
},
/turf/closed/wall,
/area/service/library/lounge)
-"cyz" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
+"cyL" = (
+/obj/machinery/power/terminal{
+ dir = 8
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
+ dir = 6
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
+"cyM" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/service/library/lounge)
-"cyA" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/service/library/lounge)
-"cyB" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/closed/wall,
-/area/service/library/lounge)
-"cyL" = (
-/obj/structure/lattice,
-/obj/structure/lattice,
-/turf/closed/mineral,
-/area/service/chapel/asteroid/monastery)
-"cyM" = (
-/obj/structure/lattice,
-/turf/closed/mineral,
-/area/service/chapel/asteroid/monastery)
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
"cyP" = (
-/obj/structure/bookcase/random/nonfiction,
-/obj/machinery/light/small{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/general/hidden{
+ dir = 10
},
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
+"cyQ" = (
+/obj/machinery/vending/games,
/turf/open/floor/plasteel/dark,
/area/service/library)
-"cyQ" = (
+"cyR" = (
/obj/item/kirbyplants{
icon_state = "plant-22"
},
@@ -52307,48 +51960,52 @@
},
/turf/open/floor/plasteel/dark,
/area/service/library)
-"cyR" = (
+"cyT" = (
/obj/item/kirbyplants{
icon_state = "plant-22"
},
/turf/open/floor/plasteel/dark,
/area/service/library)
-"cyS" = (
-/obj/structure/bookcase/random/religion,
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/service/library)
-"cyT" = (
-/obj/structure/table/wood,
-/obj/item/paper_bin{
- layer = 2.9;
- pixel_x = -2;
- pixel_y = 4
- },
-/obj/item/pen,
-/turf/open/floor/plasteel/dark,
-/area/service/library)
"cyU" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/service/library)
"cyY" = (
+/obj/structure/reagent_dispensers/watertank,
+/obj/item/extinguisher,
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
+"cyZ" = (
/obj/machinery/light/small{
dir = 8
},
/turf/open/floor/plasteel/dark,
/area/service/library)
-"cyZ" = (
-/obj/structure/displaycase/trophy,
-/turf/open/floor/plasteel/dark,
-/area/service/library)
"czl" = (
-/obj/structure/chair/wood/normal,
-/turf/open/floor/carpet,
-/area/service/library)
-"czo" = (
+/obj/item/stack/cable_coil,
+/obj/item/stack/sheet/glass/fifty{
+ layer = 4
+ },
+/obj/item/stack/sheet/metal{
+ amount = 20;
+ layer = 3.1
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
+"czp" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
+"czq" = (
/obj/structure/table/wood,
/obj/item/flashlight/lamp/green{
pixel_x = 1;
@@ -52356,28 +52013,26 @@
},
/turf/open/floor/plasteel/dark,
/area/service/library)
-"czp" = (
-/obj/structure/table/wood,
-/obj/item/barcodescanner,
-/turf/open/floor/plasteel/dark,
-/area/service/library)
-"czq" = (
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/turf/open/floor/plasteel/dark,
-/area/service/library)
"czr" = (
-/obj/structure/table/wood/fancy,
-/turf/open/floor/carpet,
-/area/service/library)
+/obj/machinery/atmospherics/pipe/simple/general/hidden{
+ dir = 6
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
"czt" = (
-/obj/structure/table/wood/fancy,
-/obj/item/storage/photo_album,
+/obj/machinery/atmospherics/pipe/manifold/general/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
+"czv" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/carpet,
/area/service/library)
-"czu" = (
+"czw" = (
/obj/structure/table/wood,
/obj/item/paper_bin{
layer = 2.9;
@@ -52386,38 +52041,26 @@
},
/turf/open/floor/plasteel/dark,
/area/service/library)
-"czv" = (
-/obj/structure/chair/wood/normal{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/service/library)
-"czw" = (
-/obj/machinery/newscaster{
- pixel_x = 32
- },
-/turf/open/floor/plasteel/dark,
-/area/service/library)
"czB" = (
-/obj/structure/table/wood/fancy,
-/obj/item/storage/fancy/candle_box,
-/turf/open/floor/carpet,
-/area/service/library)
+/obj/structure/reagent_dispensers/fueltank,
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
"czC" = (
-/obj/structure/table/wood/fancy,
-/obj/item/flashlight/lantern{
- icon_state = "lantern-on";
- pixel_y = 8
- },
-/turf/open/floor/carpet,
-/area/service/library)
+/obj/structure/closet/emcloset,
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
"czD" = (
-/obj/structure/table/wood,
-/obj/item/folder/yellow,
-/obj/item/pen,
-/turf/open/floor/plasteel/dark,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/carpet,
/area/service/library)
"czH" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
+"czI" = (
/obj/machinery/light/small{
dir = 8
},
@@ -52428,73 +52071,71 @@
},
/turf/open/floor/plasteel/dark,
/area/service/library)
-"czI" = (
+"czM" = (
/obj/structure/chair/wood/normal{
dir = 1
},
/turf/open/floor/carpet,
/area/service/library)
-"czL" = (
+"czN" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/dark,
/area/service/library)
-"czM" = (
+"czO" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/dark,
/area/service/library)
-"czN" = (
+"czP" = (
+/obj/machinery/atmospherics/components/unary/tank/air{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
+"czQ" = (
/obj/structure/table/wood,
/obj/item/storage/bag/books,
/turf/open/floor/plasteel/dark,
/area/service/library)
-"czO" = (
-/obj/structure/table/wood,
-/obj/item/instrument/saxophone,
-/turf/open/floor/plasteel/dark,
-/area/service/library)
-"czP" = (
-/obj/structure/table/wood,
-/obj/item/stack/packageWrap,
-/obj/item/coin/gold,
-/turf/open/floor/plasteel/dark,
-/area/service/library)
-"czQ" = (
-/obj/machinery/light/small{
+"czV" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/machinery/camera{
- c_tag = "Monastery Archives Starboard";
- dir = 8;
- network = list("ss13","monastery")
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/plasteel/dark,
+/area/service/chapel/main/monastery)
+"czW" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
/turf/open/floor/plasteel/dark,
-/area/service/library)
-"czV" = (
+/area/service/chapel/main/monastery)
+"czY" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
},
/turf/open/floor/plasteel/dark,
/area/service/library)
-"czW" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/service/library)
-"czY" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/service/library)
-"czZ" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/service/library)
"cAa" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plasteel/dark,
@@ -52513,56 +52154,39 @@
/turf/open/floor/plasteel/dark,
/area/service/library)
"cAi" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/service/library)
+/turf/closed/mineral,
+/area/service/chapel/asteroid/monastery)
"cAj" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/service/library)
+/turf/closed/wall,
+/area/maintenance/department/chapel/monastery)
"cAr" = (
-/obj/machinery/light/small{
- dir = 8
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/machinery/door/window/northright{
- base_state = "left";
- dir = 2;
- icon_state = "left";
- name = "Curator Desk Door";
- req_access_txt = "37"
+/obj/machinery/door/airlock/maintenance{
+ name = "Monastery Maintenance";
+ req_one_access_txt = "22;24;10;11;37"
},
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
-/turf/open/floor/plasteel/dark,
-/area/service/library)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
"cAs" = (
/obj/structure/table/wood,
-/obj/item/kirbyplants{
- icon_state = "plant-05";
- pixel_y = 10
- },
+/obj/item/clothing/head/pharaoh,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -52593,9 +52217,28 @@
/turf/open/floor/plasteel/dark,
/area/service/library)
"cAu" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/machinery/door/window/northright{
+ base_state = "left";
+ dir = 2;
+ icon_state = "left";
+ name = "Curator Desk Door";
+ req_access_txt = "37"
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library)
+"cAv" = (
/obj/structure/table/wood,
-/obj/item/clothing/head/pharaoh,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/item/kirbyplants{
+ icon_state = "plant-05";
+ pixel_y = 10
+ },
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -52608,7 +52251,7 @@
},
/turf/open/floor/plasteel/dark,
/area/service/library)
-"cAv" = (
+"cAy" = (
/obj/structure/table/wood,
/obj/item/camera,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -52624,38 +52267,7 @@
},
/turf/open/floor/plasteel/dark,
/area/service/library)
-"cAy" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/machinery/door/window/northright{
- dir = 2;
- name = "Curator Desk Door";
- req_access_txt = "37"
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/service/library)
"cAB" = (
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/service/library)
-"cAC" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/chair/wood/wings{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/service/library)
-"cAD" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/chair/wood/wings{
dir = 1
@@ -52663,32 +52275,46 @@
/obj/effect/landmark/start/librarian,
/turf/open/floor/plasteel/dark,
/area/service/library)
+"cAC" = (
+/obj/effect/turf_decal/tile/purple{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library)
+"cAD" = (
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
"cAH" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/closed/wall,
+/area/maintenance/department/chapel/monastery)
+"cAJ" = (
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/turf/open/space/basic,
+/area/space)
+"cAK" = (
/obj/machinery/light/small,
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
},
/turf/open/floor/plasteel/dark,
/area/service/library)
-"cAJ" = (
+"cAM" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
},
/turf/open/floor/plasteel/dark,
/area/service/library)
-"cAK" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/open/floor/plasteel/dark,
-/area/service/library)
-"cAM" = (
-/obj/machinery/light/small,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/service/library)
"cAQ" = (
/obj/structure/cable{
icon_state = "1-8"
@@ -52699,31 +52325,57 @@
/turf/open/floor/plating,
/area/engineering/main)
"cAS" = (
-/obj/machinery/vending/wardrobe/curator_wardrobe,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/plasteel/dark,
-/area/service/library)
+/area/service/chapel/main/monastery)
"cAT" = (
-/obj/structure/destructible/cult/tome,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
/turf/open/floor/plasteel/dark,
-/area/service/library)
+/area/service/chapel/main/monastery)
"cAU" = (
-/obj/structure/rack{
- icon = 'icons/obj/stationobjs.dmi';
- icon_state = "minibar";
- name = "skeletal minibar"
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
},
-/obj/item/book/codex_gigas,
-/obj/machinery/camera{
- c_tag = "Monastery Archives Aft";
- dir = 1;
- network = list("ss13","monastery")
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
},
/turf/open/floor/plasteel/dark,
-/area/service/library)
+/area/service/chapel/main/monastery)
"cAV" = (
-/obj/structure/bookcase{
- name = "Forbidden Knowledge"
- },
+/obj/machinery/vending/wardrobe/curator_wardrobe,
/turf/open/floor/plasteel/dark,
/area/service/library)
"cBi" = (
@@ -52927,15 +52579,6 @@
/obj/effect/turf_decal/bot/right,
/turf/open/floor/plasteel/white,
/area/engineering/gravity_generator)
-"cCR" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/components/unary/outlet_injector/on{
- dir = 1
- },
-/turf/open/floor/plating/airless,
-/area/maintenance/department/chapel/monastery)
"cCS" = (
/obj/machinery/rnd/production/techfab/department/security,
/turf/open/floor/plasteel/dark,
@@ -52958,9 +52601,14 @@
/turf/open/floor/plasteel,
/area/engineering/main)
"cCW" = (
-/obj/machinery/vending/games,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel/dark,
-/area/service/library)
+/area/service/chapel/main/monastery)
"cCX" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -53009,6 +52657,15 @@
icon_state = "platingdmg3"
},
/area/maintenance/department/security/brig)
+"cIN" = (
+/obj/machinery/door/airlock/grunge{
+ name = "Library"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
"cJo" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 5
@@ -53143,6 +52800,12 @@
},
/turf/open/floor/plasteel/dark,
/area/science/lab)
+"cTI" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"cXP" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
@@ -53436,6 +53099,13 @@
},
/turf/open/floor/plasteel/white/corner,
/area/hallway/secondary/exit/departure_lounge)
+"dwq" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/chair/wood/wings{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"dxc" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -53482,9 +53152,26 @@
},
/turf/open/floor/plasteel/dark,
/area/engineering/main)
+"dET" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"dFJ" = (
/turf/open/floor/engine,
/area/engineering/supermatter)
+"dHg" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 8
+ },
+/obj/effect/landmark/start/prisoner,
+/turf/open/floor/plasteel,
+/area/security/prison)
"dHo" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -53595,6 +53282,10 @@
/obj/machinery/shieldwallgen/xenobiologyaccess,
/turf/open/floor/plating,
/area/maintenance/department/engine)
+"dRT" = (
+/obj/structure/bookcase/random/reference,
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
"dSp" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/engine_waste{
dir = 1
@@ -53611,6 +53302,12 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
+"dVp" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_y = -32
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"dVI" = (
/obj/machinery/atmospherics/components/binary/pump{
dir = 4;
@@ -53649,6 +53346,13 @@
},
/turf/open/floor/plasteel/dark,
/area/security/prison)
+"dYI" = (
+/obj/machinery/airalarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"dZj" = (
/obj/machinery/atmospherics/pipe/manifold/green/visible,
/obj/machinery/airalarm/engine{
@@ -53689,6 +53393,10 @@
/obj/machinery/status_display/supply,
/turf/closed/wall,
/area/cargo/office)
+"eeG" = (
+/obj/machinery/bookbinder,
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
"eeQ" = (
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -53710,6 +53418,10 @@
icon_state = "panelscorched"
},
/area/maintenance/department/science)
+"egu" = (
+/obj/structure/bookcase/random/religion,
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"egK" = (
/obj/structure/girder,
/turf/open/floor/plating{
@@ -53724,6 +53436,14 @@
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
+"ehR" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/chair,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"eiV" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
dir = 4
@@ -53735,6 +53455,7 @@
/obj/effect/decal/cleanable/cobweb{
icon_state = "cobweb2"
},
+/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
"elk" = (
@@ -53914,6 +53635,18 @@
},
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
+"eKC" = (
+/obj/machinery/door/airlock/grunge{
+ name = "Library"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
"eLt" = (
/obj/structure/closet/firecloset,
/obj/effect/turf_decal/tile/neutral{
@@ -53937,14 +53670,7 @@
},
/area/maintenance/department/science)
"eNc" = (
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 3;
- name = "3maintenance loot spawner"
- },
-/obj/structure/rack,
-/turf/open/floor/plating{
- icon_state = "panelscorched"
- },
+/turf/open/floor/plating,
/area/maintenance/department/chapel/monastery)
"eNq" = (
/obj/effect/turf_decal/stripes/line{
@@ -54258,6 +53984,18 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
+"fug" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/machinery/power/apc{
+ dir = 4;
+ name = "Library APC";
+ pixel_x = 24
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"fuP" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -54347,13 +54085,13 @@
/turf/open/floor/plasteel,
/area/maintenance/department/engine)
"fAx" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
"fBt" = (
@@ -54485,8 +54223,8 @@
},
/area/hallway/secondary/exit/departure_lounge)
"fWv" = (
-/obj/structure/bookcase/random/religion,
-/turf/open/floor/plasteel/dark,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/carpet,
/area/service/library/lounge)
"fZK" = (
/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
@@ -54543,13 +54281,19 @@
},
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
+"geL" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
+ },
+/turf/closed/wall/r_wall,
+/area/ai_monitored/turret_protected/AIsatextAS)
"geN" = (
/obj/machinery/igniter{
id = "xenoigniter";
luminosity = 2
},
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 4
},
/turf/open/floor/engine,
/area/science/xenobiology)
@@ -54575,6 +54319,25 @@
},
/turf/open/floor/plasteel/dark,
/area/engineering/main)
+"ggN" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
"giI" = (
/obj/machinery/light/small{
dir = 1
@@ -54741,6 +54504,10 @@
},
/turf/open/floor/plasteel/dark/telecomms,
/area/tcommsat/server)
+"gqi" = (
+/obj/structure/bookcase/random/religion,
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
"gue" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
@@ -54938,6 +54705,14 @@
},
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
+"gJV" = (
+/obj/machinery/door/window/southleft{
+ dir = 1;
+ name = "Court Cell";
+ req_access_txt = "2"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"gKz" = (
/obj/structure/table/wood,
/obj/item/kirbyplants{
@@ -55002,6 +54777,20 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"gPs" = (
+/obj/machinery/door/airlock/grunge{
+ name = "Library"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"gPV" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
@@ -55047,6 +54836,9 @@
},
/turf/open/floor/plating,
/area/maintenance/department/science)
+"gXv" = (
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
"gXZ" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/camera{
@@ -55076,6 +54868,12 @@
/obj/machinery/door/poddoor/incinerator_atmos_main,
/turf/open/floor/engine/vacuum,
/area/maintenance/disposal/incinerator)
+"het" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
"heC" = (
/obj/machinery/power/apc/highcap/five_k{
dir = 8;
@@ -55162,6 +54960,18 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
+"hlj" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library)
+"hlw" = (
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"hnu" = (
/obj/machinery/button/door{
id = "lawyer_shutters";
@@ -55195,6 +55005,13 @@
/obj/effect/turf_decal/stripes/corner,
/turf/open/floor/engine,
/area/engineering/main)
+"hpF" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"hqo" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -55210,6 +55027,16 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"hrk" = (
+/obj/item/beacon,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"hvW" = (
/obj/machinery/door/poddoor/preopen{
id = "xenobio4";
@@ -55294,6 +55121,20 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/port)
+"hBu" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"hDG" = (
/obj/machinery/door/airlock/engineering{
name = "Auxillary Base Construction";
@@ -55484,7 +55325,7 @@
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
"hVx" = (
@@ -55602,11 +55443,11 @@
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"ijF" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/structure/bookcase/random/nonfiction,
+/obj/machinery/light/small{
+ dir = 1
},
-/turf/open/floor/carpet,
+/turf/open/floor/plasteel/dark,
/area/service/library)
"ijU" = (
/obj/effect/spawner/lootdrop/organ_spawner,
@@ -55692,6 +55533,10 @@
},
/turf/open/floor/plasteel,
/area/engineering/main)
+"ipv" = (
+/obj/structure/chair/wood/normal,
+/turf/open/floor/carpet,
+/area/service/library)
"iqc" = (
/turf/open/floor/plasteel/stairs/right,
/area/maintenance/department/crew_quarters/dorms)
@@ -55761,6 +55606,9 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
+"iye" = (
+/turf/closed/wall,
+/area/service/chapel/asteroid/monastery)
"iyg" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -55777,6 +55625,12 @@
},
/turf/open/floor/plasteel/dark,
/area/engineering/main)
+"iyL" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
+/turf/closed/wall,
+/area/service/library/lounge)
"izB" = (
/obj/machinery/door/airlock/external{
name = "Escape Pod"
@@ -55787,11 +55641,16 @@
/turf/open/floor/plating,
/area/commons/dorms)
"izF" = (
-/obj/structure/closet/emcloset,
-/turf/open/floor/plasteel/white{
- heat_capacity = 1e+006
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "2-8"
},
-/area/service/chapel/dock)
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/chapel/main/monastery)
"iAx" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -55837,6 +55696,11 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/turf/open/floor/plating,
/area/security/execution/transfer)
+"iEP" = (
+/obj/structure/table/wood/fancy,
+/obj/item/storage/fancy/candle_box,
+/turf/open/floor/carpet,
+/area/service/library)
"iEQ" = (
/obj/structure/table,
/obj/item/storage/box/lights/mixed,
@@ -55846,6 +55710,12 @@
/obj/effect/spawner/lootdrop/keg,
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/dorms)
+"iEX" = (
+/obj/structure/table/wood,
+/obj/item/storage/briefcase,
+/obj/item/folder/red,
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"iFI" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -55906,6 +55776,7 @@
id = "xenoigniter";
luminosity = 2
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/engine,
/area/science/xenobiology)
"iPz" = (
@@ -55997,16 +55868,64 @@
/area/maintenance/department/cargo)
"iXx" = (
/obj/machinery/light/small,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plating{
icon_state = "panelscorched"
},
/area/maintenance/department/chapel/monastery)
+"iYp" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
+"iYQ" = (
+/obj/structure/chair{
+ dir = 4;
+ name = "Prosecution"
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red,
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"jcT" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"jee" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10
+ },
+/turf/closed/wall,
+/area/service/library/lounge)
"jen" = (
/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
dir = 4
@@ -56039,16 +55958,14 @@
},
/area/hallway/secondary/exit/departure_lounge)
"jgr" = (
-/obj/machinery/door/airlock/grunge{
- name = "Library"
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/dark,
-/area/service/library)
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
"jhk" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -56087,6 +56004,16 @@
/obj/machinery/atmospherics/components/binary/pump,
/turf/closed/wall/r_wall,
/area/tcommsat/computer)
+"jqZ" = (
+/obj/structure/table/wood,
+/obj/item/paper_bin{
+ layer = 2.9;
+ pixel_x = -2;
+ pixel_y = 4
+ },
+/obj/item/pen,
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"jrG" = (
/obj/effect/turf_decal/stripes/corner{
dir = 1
@@ -56207,6 +56134,22 @@
},
/turf/open/floor/plasteel,
/area/security/brig)
+"jzw" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
"jzz" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/sign/warning/vacuum/external,
@@ -56283,11 +56226,8 @@
/turf/open/floor/plating,
/area/maintenance/department/science)
"jFO" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/carpet,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
/area/service/library/lounge)
"jHP" = (
/obj/structure/table,
@@ -56331,6 +56271,12 @@
/area/maintenance/department/science)
"jSa" = (
/obj/machinery/door/airlock/maintenance,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plating,
/area/service/chapel/main/monastery)
"jTh" = (
@@ -56374,8 +56320,8 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"jXh" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
+/obj/structure/chair/wood/normal{
+ dir = 1
},
/turf/open/floor/plasteel/dark,
/area/service/library/lounge)
@@ -56441,6 +56387,12 @@
},
/turf/open/floor/engine,
/area/engineering/main)
+"keD" = (
+/obj/structure/table/wood,
+/obj/item/storage/briefcase,
+/obj/item/folder/blue,
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"kfh" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
@@ -56467,6 +56419,12 @@
},
/turf/open/floor/plasteel,
/area/science/mixing)
+"kix" = (
+/obj/structure/chair/wood/normal{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"kjK" = (
/obj/machinery/door/airlock/maintenance_hatch{
name = "MiniSat Maintenance";
@@ -56635,6 +56593,17 @@
},
/turf/open/floor/plasteel/dark,
/area/hallway/secondary/exit/departure_lounge)
+"kAX" = (
+/obj/structure/table/wood,
+/obj/item/gavelblock,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"kDf" = (
/obj/machinery/light/small,
/turf/open/floor/carpet/black,
@@ -56742,12 +56711,15 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"kJo" = (
-/obj/structure/cable{
- icon_state = "1-4"
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
-/area/maintenance/department/security/brig)
+/area/maintenance/department/chapel/monastery)
"kJw" = (
/obj/machinery/door/airlock/maintenance/abandoned{
name = "Firing Range Target"
@@ -56756,6 +56728,22 @@
icon_state = "platingdmg3"
},
/area/maintenance/department/security/brig)
+"kJN" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/obj/machinery/camera{
+ c_tag = "Courtroom South";
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"kKI" = (
/obj/effect/spawner/lootdrop/maintenance,
/obj/structure/closet,
@@ -56777,6 +56765,15 @@
},
/turf/open/floor/engine,
/area/science/xenobiology)
+"kOW" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/carpet,
+/area/service/library/lounge)
"kPi" = (
/obj/structure/table,
/obj/machinery/microwave,
@@ -56803,6 +56800,12 @@
},
/turf/open/floor/plasteel/white,
/area/medical/treatment_center)
+"kQH" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"kQZ" = (
/obj/structure/closet,
/obj/item/stack/spacecash/c10,
@@ -56827,6 +56830,26 @@
},
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
+"kRY" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
"kSb" = (
/obj/structure/chair/office/light{
dir = 8
@@ -56918,6 +56941,9 @@
/obj/item/kirbyplants{
icon_state = "plant-10"
},
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
+ },
/turf/open/floor/plasteel/dark,
/area/service/chapel/main/monastery)
"kYM" = (
@@ -57042,15 +57068,6 @@
/obj/effect/decal/cleanable/oil,
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
-"lqy" = (
-/obj/machinery/door/airlock/grunge{
- name = "Library"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/dark,
-/area/service/library/lounge)
"lrM" = (
/obj/structure/cable{
icon_state = "2-8"
@@ -57059,10 +57076,8 @@
/turf/open/floor/plasteel,
/area/engineering/main)
"lxI" = (
-/obj/effect/landmark/xeno_spawn,
-/turf/open/floor/plating{
- icon_state = "platingdmg1"
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plating,
/area/maintenance/department/chapel/monastery)
"lzJ" = (
/obj/structure/closet/crate/bin,
@@ -57078,6 +57093,28 @@
"lAs" = (
/turf/closed/wall,
/area/cargo/sorting)
+"lAL" = (
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/structure/chair{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"lAR" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -57101,6 +57138,12 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/turf/open/floor/engine,
/area/science/xenobiology)
+"lEh" = (
+/obj/structure/bookcase{
+ name = "Forbidden Knowledge"
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"lEn" = (
/obj/structure/window/reinforced{
dir = 1
@@ -57210,6 +57253,12 @@
},
/turf/open/floor/plating,
/area/maintenance/department/science)
+"lQo" = (
+/obj/machinery/newscaster{
+ pixel_x = 32
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"lQQ" = (
/obj/machinery/door/poddoor/preopen{
id = "bridgespace";
@@ -57245,6 +57294,12 @@
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
+"lUz" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"lUO" = (
/obj/structure/sign/warning/radiation,
/turf/closed/wall/r_wall,
@@ -57291,6 +57346,20 @@
},
/turf/open/floor/engine,
/area/science/xenobiology)
+"lXv" = (
+/obj/structure/chair{
+ dir = 8;
+ name = "Defense"
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/green,
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"lXJ" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
dir = 4
@@ -57342,6 +57411,19 @@
/obj/machinery/portable_atmospherics/canister/toxins,
/turf/open/floor/plating,
/area/engineering/main)
+"mck" = (
+/obj/structure/table/wood,
+/obj/item/paper_bin{
+ layer = 2.9;
+ pixel_x = -2;
+ pixel_y = 4
+ },
+/obj/item/pen{
+ pixel_x = -2;
+ pixel_y = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"mdL" = (
/obj/structure/table,
/obj/item/paper_bin,
@@ -57640,6 +57722,17 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/tcommsat/computer)
+"mEe" = (
+/obj/structure/table/wood,
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"mEu" = (
/obj/machinery/atmospherics/pipe/simple/cyan/visible{
dir = 4
@@ -57661,12 +57754,10 @@
/turf/open/floor/wood,
/area/maintenance/department/engine)
"mIa" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
/obj/machinery/light/small{
dir = 8
},
+/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/maintenance/department/engine)
"mJp" = (
@@ -57680,8 +57771,11 @@
/turf/open/water/decorative,
/area/hallway/secondary/entry)
"mKc" = (
-/obj/structure/bookcase/random/nonfiction,
-/turf/open/floor/plasteel/dark,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/carpet,
/area/service/library/lounge)
"mKk" = (
/obj/structure/cable{
@@ -57689,6 +57783,11 @@
},
/turf/open/floor/plating/airless,
/area/space/nearstation)
+"mKP" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/security/courtroom)
"mLB" = (
/obj/structure/cable{
icon_state = "1-4"
@@ -57741,12 +57840,38 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating/airless,
/area/space/nearstation)
+"mWN" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
"mXq" = (
/obj/item/taperecorder,
/obj/item/cartridge/lawyer,
/obj/structure/table/wood,
/turf/open/floor/wood,
/area/service/lawoffice)
+"mXJ" = (
+/obj/structure/table/wood/fancy,
+/turf/open/floor/carpet,
+/area/service/library)
"mZE" = (
/turf/open/space/basic,
/area/space/nearstation)
@@ -57835,6 +57960,11 @@
/obj/effect/spawner/lootdrop/costume,
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
+"nix" = (
+/obj/structure/lattice,
+/obj/structure/lattice,
+/turf/closed/mineral,
+/area/service/chapel/asteroid/monastery)
"niy" = (
/obj/structure/table,
/obj/item/reagent_containers/food/snacks/cookie,
@@ -57853,6 +57983,11 @@
},
/turf/open/floor/plasteel/dark,
/area/hallway/secondary/exit/departure_lounge)
+"njI" = (
+/obj/structure/table/wood,
+/obj/machinery/computer/libraryconsole/bookmanagement,
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"nku" = (
/obj/machinery/door/airlock/centcom{
name = "Crematorium";
@@ -57899,6 +58034,13 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
+"nso" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/obj/machinery/light,
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"nsy" = (
/obj/structure/table,
/obj/item/stack/sheet/metal/fifty,
@@ -58097,10 +58239,14 @@
/turf/open/floor/engine,
/area/science/explab)
"nKo" = (
-/obj/structure/lattice,
-/obj/structure/lattice,
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 9
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
"nLl" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -58156,6 +58302,25 @@
},
/turf/open/floor/plating/airless,
/area/space/nearstation)
+"nOF" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
"nOY" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -58211,6 +58376,10 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
+"nUc" = (
+/obj/structure/disposaloutlet,
+/turf/open/floor/plating,
+/area/space/nearstation)
"nUQ" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/engine,
@@ -58219,10 +58388,33 @@
/obj/item/spear,
/turf/open/floor/plating,
/area/maintenance/department/engine)
+"nWD" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/machinery/door/window/northright{
+ dir = 2;
+ name = "Curator Desk Door";
+ req_access_txt = "37"
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"nWP" = (
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plating,
/area/maintenance/department/engine)
+"nXR" = (
+/obj/structure/table/wood/fancy,
+/obj/item/flashlight/lantern{
+ icon_state = "lantern-on";
+ pixel_y = 8
+ },
+/turf/open/floor/carpet,
+/area/service/library)
"nYb" = (
/obj/structure/table_frame/wood,
/turf/open/floor/wood,
@@ -58232,6 +58424,12 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/hallway/secondary/exit/departure_lounge)
+"nYC" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"nZw" = (
/obj/machinery/door/airlock/abandoned{
name = "Backup Laboratory"
@@ -58259,11 +58457,14 @@
/obj/item/pen,
/turf/open/floor/plating,
/area/maintenance/department/science)
-"odM" = (
-/obj/effect/landmark/barthpot,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+"odz" = (
+/obj/structure/table/wood/fancy,
+/obj/item/storage/photo_album,
/turf/open/floor/carpet,
-/area/service/library/lounge)
+/area/service/library)
+"odM" = (
+/turf/closed/wall/r_wall,
+/area/security/courtroom)
"oep" = (
/obj/structure/table/glass,
/obj/item/paper_bin,
@@ -58380,6 +58581,12 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
+"osW" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"osY" = (
/obj/structure/flora/ausbushes/reedbush{
pixel_x = -2;
@@ -58442,6 +58649,13 @@
},
/turf/open/floor/plasteel/dark,
/area/service/chapel/office)
+"oxo" = (
+/obj/structure/bookcase/random/religion,
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"oxw" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -58455,6 +58669,7 @@
/area/commons/storage/primary)
"ozO" = (
/obj/machinery/door/airlock/maintenance,
+/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/maintenance/department/engine)
"oAw" = (
@@ -58572,6 +58787,22 @@
},
/turf/open/floor/plating,
/area/engineering/main)
+"oHk" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/carpet,
+/area/service/library/lounge)
+"oIU" = (
+/obj/structure/table/wood,
+/obj/item/folder/yellow,
+/obj/item/pen,
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"oKa" = (
/obj/structure/rack,
/obj/effect/spawner/lootdrop/maintenance{
@@ -58618,7 +58849,6 @@
dir = 8
},
/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 3;
name = "Waste to Space"
},
/turf/open/floor/plasteel/dark,
@@ -58750,6 +58980,12 @@
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
+"oWD" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"oXe" = (
/obj/structure/table/glass,
/obj/item/mmi,
@@ -58798,12 +59034,6 @@
/turf/open/floor/plating/airless,
/area/engineering/main)
"pbm" = (
-/obj/machinery/door/airlock/external{
- name = "Pod Docking Bay"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
/turf/open/floor/plating,
/area/service/chapel/dock)
"pbI" = (
@@ -58831,7 +59061,7 @@
dir = 5
},
/turf/open/floor/plating,
-/area/science/explab)
+/area/maintenance/department/cargo)
"peE" = (
/obj/structure/cable{
icon_state = "1-4"
@@ -58889,15 +59119,9 @@
/turf/open/floor/plating,
/area/maintenance/disposal)
"pia" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/structure/rack,
-/obj/machinery/light/small{
- dir = 4
- },
-/turf/open/floor/plating{
- icon_state = "panelscorched"
- },
-/area/maintenance/department/chapel/monastery)
+/obj/structure/disposalpipe/segment,
+/turf/open/space/basic,
+/area/space)
"pjH" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -59119,6 +59343,13 @@
},
/turf/open/floor/wood,
/area/command/heads_quarters/hop)
+"pJy" = (
+/obj/item/radio/intercom{
+ name = "Station Intercom (General)";
+ pixel_y = -26
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"pKd" = (
/obj/effect/spawner/lootdrop/maintenance{
lootcount = 2;
@@ -59236,12 +59467,16 @@
/turf/open/floor/plasteel,
/area/service/hydroponics)
"pXc" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/cable{
- icon_state = "1-4"
+ icon_state = "1-2"
},
-/turf/open/floor/carpet,
-/area/service/library)
+/obj/machinery/door/airlock/public/glass{
+ name = "Courtroom"
+ },
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"pXg" = (
/obj/structure/table/glass,
/obj/structure/window/reinforced,
@@ -59460,6 +59695,7 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/engine,
/area/science/xenobiology)
"qAx" = (
@@ -59470,10 +59706,13 @@
/turf/open/floor/plasteel,
/area/commons/fitness/recreation)
"qAM" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/item/cigbutt,
-/turf/open/floor/plating,
-/area/maintenance/department/cargo)
+/obj/machinery/door/airlock/grunge{
+ name = "Library"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
"qBv" = (
/obj/item/clothing/head/ushanka,
/turf/open/floor/plating,
@@ -59524,6 +59763,15 @@
dir = 1
},
/area/hallway/secondary/entry)
+"qGf" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/atmospherics/components/unary/outlet_injector/on{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/maintenance/department/chapel/monastery)
"qGu" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -59576,6 +59824,20 @@
/obj/effect/decal/cleanable/cobweb,
/turf/open/floor/plating,
/area/maintenance/department/science)
+"qLb" = (
+/obj/structure/table/wood,
+/obj/item/book/manual/wiki/security_space_law,
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"qLI" = (
/obj/structure/table,
/obj/item/stack/sheet/glass/fifty{
@@ -59609,7 +59871,10 @@
/turf/open/floor/plating,
/area/security/execution/transfer)
"qOE" = (
-/turf/open/floor/plasteel/dark,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/turf/open/floor/carpet,
/area/service/library/lounge)
"qOH" = (
/obj/structure/cable{
@@ -59722,9 +59987,10 @@
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
"qWo" = (
-/turf/open/floor/plating{
- icon_state = "platingdmg3"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10
},
+/turf/closed/wall,
/area/maintenance/department/chapel/monastery)
"qWG" = (
/obj/structure/closet/emcloset/anchored,
@@ -59796,6 +60062,10 @@
},
/turf/open/floor/plasteel/dark/telecomms,
/area/tcommsat/server)
+"qYW" = (
+/obj/structure/bookcase/random/nonfiction,
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
"rar" = (
/obj/machinery/door/firedoor,
/obj/structure/disposalpipe/segment{
@@ -59917,12 +60187,16 @@
/turf/open/floor/plating/airless,
/area/space/nearstation)
"rnE" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/machinery/door/airlock/grunge{
+ name = "Library"
},
-/obj/structure/lattice,
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
"roc" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -59932,10 +60206,18 @@
/obj/machinery/light/small{
dir = 4
},
+/obj/structure/closet/emcloset,
/turf/open/floor/plasteel/white{
heat_capacity = 1e+006
},
/area/service/chapel/dock)
+"rpx" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"rrb" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -60021,6 +60303,12 @@
},
/turf/open/floor/plasteel/cafeteria,
/area/service/kitchen)
+"rzm" = (
+/obj/structure/table/wood,
+/obj/item/stack/packageWrap,
+/obj/item/coin/gold,
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"rzp" = (
/obj/structure/table,
/obj/item/stack/sheet/metal/fifty,
@@ -60153,6 +60441,19 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall/r_wall,
/area/science/mixing)
+"rRv" = (
+/obj/structure/bookcase/random/religion,
+/obj/effect/decal/cleanable/cobweb{
+ icon_state = "cobweb2"
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
+"rSE" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
"rSH" = (
/obj/item/trash/can,
/turf/open/floor/wood,
@@ -60252,6 +60553,17 @@
},
/turf/open/space,
/area/space/nearstation)
+"sgD" = (
+/obj/structure/bookcase/random/adult,
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
+"shw" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/carpet,
+/area/service/library)
"shH" = (
/turf/closed/wall/r_wall,
/area/space/nearstation)
@@ -60313,6 +60625,13 @@
},
/turf/open/floor/plasteel/dark,
/area/maintenance/department/crew_quarters/dorms)
+"sqt" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 5
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"sqQ" = (
/turf/open/floor/plating,
/area/maintenance/disposal)
@@ -60468,6 +60787,17 @@
},
/turf/open/floor/plasteel,
/area/engineering/main)
+"sKq" = (
+/obj/machinery/door/airlock/grunge{
+ name = "Library"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"sNk" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -60664,6 +60994,7 @@
/area/maintenance/department/science)
"tfP" = (
/obj/item/beacon,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/engine,
/area/science/xenobiology)
"tfZ" = (
@@ -60687,7 +61018,7 @@
},
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
-/area/science/explab)
+/area/maintenance/department/cargo)
"tix" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -60869,11 +61200,15 @@
},
/area/maintenance/department/science)
"tyL" = (
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 2;
+ name = "2maintenance loot spawner"
},
-/turf/open/floor/plating,
-/area/maintenance/department/security/brig)
+/obj/structure/rack,
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
+ },
+/area/maintenance/department/chapel/monastery)
"tzj" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/turf/open/floor/plasteel/white,
@@ -60957,6 +61292,11 @@
icon_state = "panelscorched"
},
/area/maintenance/department/engine)
+"tRZ" = (
+/obj/structure/lattice,
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space/nearstation)
"tSL" = (
/turf/open/floor/plating{
icon_state = "panelscorched"
@@ -60985,6 +61325,26 @@
},
/turf/closed/wall/r_wall,
/area/science/xenobiology)
+"tVY" = (
+/obj/structure/chair{
+ dir = 4;
+ name = "Prosecution"
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
+"tVZ" = (
+/obj/effect/landmark/start/prisoner,
+/turf/open/floor/plasteel/dark,
+/area/security/prison)
"tXn" = (
/obj/structure/sink{
dir = 4;
@@ -61108,11 +61468,15 @@
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
"ukn" = (
-/obj/structure/disposalpipe/segment{
+/obj/effect/spawner/lootdrop/maintenance,
+/obj/structure/rack,
+/obj/machinery/light/small{
dir = 4
},
-/turf/closed/wall,
-/area/maintenance/department/engine)
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
+ },
+/area/maintenance/department/chapel/monastery)
"ukp" = (
/obj/machinery/atmospherics/components/binary/pump{
dir = 4;
@@ -61137,6 +61501,24 @@
},
/turf/open/floor/plasteel,
/area/commons/storage/primary)
+"ulQ" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Courtroom";
+ req_access_txt = "42"
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"ulY" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall/r_wall,
@@ -61322,12 +61704,37 @@
},
/turf/open/floor/plasteel,
/area/tcommsat/computer)
+"uzy" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
"uzB" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
},
/turf/open/floor/engine,
/area/science/xenobiology)
+"uAA" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"uAU" = (
/obj/structure/table/wood,
/obj/item/folder/blue,
@@ -61363,10 +61770,27 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating/airless,
/area/space/nearstation)
+"uIh" = (
+/obj/structure/chair{
+ dir = 8;
+ name = "Defense"
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/green,
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"uIn" = (
/obj/machinery/power/terminal{
dir = 1
},
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
/turf/open/floor/plating,
/area/maintenance/department/engine)
"uIB" = (
@@ -61432,6 +61856,12 @@
},
/turf/open/floor/engine,
/area/engineering/main)
+"uTZ" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"uUQ" = (
/obj/machinery/door/airlock/maintenance{
name = "Engineering Maintenance";
@@ -61458,6 +61888,13 @@
/obj/item/stamp/law,
/turf/open/floor/carpet,
/area/service/lawoffice)
+"uXp" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"uXG" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -61504,9 +61941,7 @@
/turf/open/floor/plating,
/area/maintenance/department/engine)
"vco" = (
-/obj/machinery/light/small{
- dir = 8
- },
+/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/maintenance/department/chapel/monastery)
"veF" = (
@@ -61532,6 +61967,11 @@
},
/turf/open/floor/plasteel/dark,
/area/science/mixing)
+"vgg" = (
+/obj/structure/table/wood,
+/obj/item/barcodescanner,
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"vgp" = (
/obj/machinery/door/firedoor,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
@@ -61628,6 +62068,25 @@
/obj/structure/lattice,
/turf/open/space/basic,
/area/space/nearstation)
+"vrn" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
"vsk" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -61712,6 +62171,10 @@
},
/turf/open/floor/plasteel,
/area/engineering/main)
+"vxV" = (
+/obj/item/kirbyplants/random,
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"vzp" = (
/obj/effect/turf_decal/tile/brown,
/obj/item/stack/ore/iron,
@@ -61807,6 +62270,10 @@
},
/turf/open/floor/plating,
/area/maintenance/department/science)
+"vHh" = (
+/obj/structure/lattice,
+/turf/closed/mineral,
+/area/service/chapel/asteroid/monastery)
"vIa" = (
/turf/open/floor/plasteel/yellowsiding/corner{
dir = 4
@@ -61838,19 +62305,30 @@
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
"vOw" = (
-/obj/machinery/door/airlock/grunge{
- name = "Library"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
+/obj/structure/lattice,
+/obj/structure/disposalpipe/segment,
+/turf/open/space/basic,
+/area/space/nearstation)
+"vQN" = (
+/obj/effect/turf_decal/stripes/corner,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
},
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/door/firedoor,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
/turf/open/floor/plasteel/dark,
-/area/service/library)
+/area/service/library/lounge)
"vRi" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -61889,6 +62367,20 @@
},
/turf/open/floor/plasteel,
/area/engineering/main)
+"vTc" = (
+/obj/structure/rack{
+ icon = 'icons/obj/stationobjs.dmi';
+ icon_state = "minibar";
+ name = "skeletal minibar"
+ },
+/obj/item/book/codex_gigas,
+/obj/machinery/camera{
+ c_tag = "Monastery Archives Aft";
+ dir = 1;
+ network = list("ss13","monastery")
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"vTL" = (
/obj/machinery/vending/tool,
/obj/effect/turf_decal/tile/neutral{
@@ -61968,6 +62460,17 @@
/obj/machinery/meter,
/turf/open/floor/plating,
/area/maintenance/department/engine)
+"wdY" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Monastery Archives Starboard";
+ dir = 8;
+ network = list("ss13","monastery")
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"weL" = (
/obj/machinery/light/small,
/turf/open/floor/plating,
@@ -62082,6 +62585,13 @@
},
/turf/open/floor/plasteel/white,
/area/science/explab)
+"wnE" = (
+/obj/machinery/light/small,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"wnJ" = (
/obj/structure/sign/warning,
/turf/closed/wall,
@@ -62157,6 +62667,11 @@
},
/turf/open/floor/plasteel/dark,
/area/security/brig)
+"wyf" = (
+/obj/structure/chair,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"wzb" = (
/obj/structure/chair,
/turf/open/floor/wood,
@@ -62194,6 +62709,10 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
+"wDq" = (
+/obj/structure/bookcase/random/fiction,
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
"wDZ" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 1
@@ -62392,6 +62911,11 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"wWJ" = (
+/obj/structure/closet/secure_closet/courtroom,
+/obj/item/gavelhammer,
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"wXu" = (
/obj/machinery/disposal/bin,
/obj/structure/window/reinforced{
@@ -62488,9 +63012,9 @@
/turf/open/floor/plasteel,
/area/science/explab)
"xhj" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/carpet,
-/area/service/library/lounge)
+/obj/structure/table,
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
"xhE" = (
/obj/structure/extinguisher_cabinet{
pixel_x = 27
@@ -62509,23 +63033,19 @@
/turf/open/floor/plasteel,
/area/engineering/main)
"xja" = (
-/obj/machinery/light/small{
- dir = 4
- },
-/obj/machinery/power/apc{
- dir = 4;
- name = "Library APC";
- pixel_x = 24
- },
-/obj/structure/cable,
+/obj/structure/displaycase/trophy,
/turf/open/floor/plasteel/dark,
/area/service/library)
"xjc" = (
/obj/structure/cable{
- icon_state = "2-8"
+ icon_state = "1-4"
},
-/turf/open/floor/plasteel/dark,
-/area/service/library)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/carpet,
+/area/service/library/lounge)
"xje" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/door/firedoor,
@@ -62560,6 +63080,33 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
+"xkB" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/courtroom)
+"xld" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/camera{
+ c_tag = "Monastery Archives Access Tunnel";
+ dir = 4;
+ network = list("ss13","monastery")
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
"xlg" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/heat_exchanging/junction,
@@ -62717,6 +63264,10 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
+"xEb" = (
+/obj/structure/destructible/cult/tome,
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"xEx" = (
/obj/machinery/portable_atmospherics/scrubber/huge,
/obj/effect/turf_decal/stripes/line,
@@ -62740,6 +63291,11 @@
/obj/effect/landmark/carpspawn,
/turf/open/space,
/area/space/station_ruins)
+"xGY" = (
+/obj/structure/table/wood,
+/obj/item/instrument/saxophone,
+/turf/open/floor/plasteel/dark,
+/area/service/library)
"xIx" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 5
@@ -62784,10 +63340,22 @@
/turf/open/floor/plasteel/dark,
/area/service/lawoffice)
"xNx" = (
-/obj/structure/lattice,
-/obj/structure/disposalpipe/junction/flip,
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/item/kirbyplants{
+ icon_state = "plant-22"
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/machinery/power/apc{
+ dir = 4;
+ name = "Library Lounge APC";
+ pixel_x = 24
+ },
+/obj/machinery/airalarm{
+ pixel_y = 22
+ },
+/turf/open/floor/plasteel/dark,
+/area/service/library/lounge)
"xNy" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/stripes/line{
@@ -62831,6 +63399,12 @@
/area/space/nearstation)
"xSd" = (
/obj/machinery/light/small,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plating,
/area/maintenance/department/chapel/monastery)
"xSX" = (
@@ -62847,14 +63421,8 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
"xVt" = (
-/obj/effect/spawner/lootdrop/maintenance{
- lootcount = 2;
- name = "2maintenance loot spawner"
- },
-/obj/structure/rack,
-/turf/open/floor/plating{
- icon_state = "panelscorched"
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/closed/wall,
/area/maintenance/department/chapel/monastery)
"xWl" = (
/obj/item/pen,
@@ -62868,9 +63436,13 @@
/turf/open/floor/plasteel,
/area/science/xenobiology)
"xYV" = (
-/turf/open/floor/plating{
- icon_state = "panelscorched"
+/obj/item/stack/rods/fifty,
+/obj/item/wrench,
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 8;
+ name = "Air to Distro"
},
+/turf/open/floor/plating,
/area/maintenance/department/chapel/monastery)
"ybX" = (
/obj/structure/table,
@@ -76746,31 +77318,31 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
rmC
rmC
rmC
@@ -77003,31 +77575,31 @@ cxg
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
rmC
rmC
rmC
@@ -77260,31 +77832,31 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
+rmC
rmC
rmC
rmC
@@ -77502,11 +78074,11 @@ cbK
ceP
cdC
ciO
-bWV
-bWV
-cgf
+cfm
+cfm
+chF
cjl
-bWV
+cfm
cwl
cwz
bWV
@@ -77523,17 +78095,17 @@ aaa
aaa
aaa
aaa
-cfN
-cfN
-cfN
aaa
aaa
aaa
aaa
aaa
aaa
-cfN
-cfN
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -77759,11 +78331,11 @@ cuK
ceP
bXJ
cve
-bWV
+cfm
bXJ
ckd
ceP
-bWV
+cfm
bWV
bWV
bWV
@@ -77777,22 +78349,22 @@ aaa
aaa
aaa
aaa
-cfN
-cfN
-cfN
-cfN
-cfN
-cyM
aaa
aaa
aaa
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -77929,7 +78501,7 @@ aaa
aaa
aaa
aaa
-aaa
+cFB
aaa
aaa
aaa
@@ -78018,13 +78590,30 @@ cfm
cfm
cfm
cjH
-chF
-cuQ
-cvX
-cke
+czV
+ceP
+cwc
+xhj
cky
-cld
-cCR
+cwK
+odM
+odM
+odM
+odM
+odM
+odM
+aaa
+aaa
+aaa
+aaa
+cfN
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -78032,26 +78621,9 @@ aaa
aaa
aaa
aaa
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-aht
aaa
aaa
aaa
-cfN
-cyM
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
aaa
aaa
aaa
@@ -78277,12 +78849,26 @@ chf
cfD
cvu
cvE
-cvY
-ckf
+cwc
ckf
+uAA
cle
-cjm
-cjm
+ckS
+cxB
+xkB
+cxB
+vxV
+odM
+odM
+aaa
+aaa
+cfN
+cfN
+cfN
+aaa
+cfN
+cfN
+cfN
aaa
aaa
aaa
@@ -78291,24 +78877,10 @@ aaa
aaa
cfN
cfN
-cfN
-cyM
-cfN
-cyM
-aaa
-aht
aaa
aaa
aaa
aaa
-aht
-aaa
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
aaa
aaa
aaa
@@ -78534,38 +79106,38 @@ cfE
cfE
cfo
cvF
-cvZ
+cwc
cwm
ckj
cwH
-ckO
-cjm
+ckS
+tVY
+iYQ
+cxB
+cxB
+wWJ
+odM
+aaa
+aaa
cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+vHh
aaa
aaa
aaa
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
aaa
aaa
-cfN
-cfN
-cfN
-aht
-aaa
-aht
-aaa
-aht
-aht
-aht
-aht
-aht
-aht
-aaa
-cfN
-cfN
-cyM
-cfN
-cfN
-cfN
aaa
aaa
aaa
@@ -78749,8 +79321,8 @@ aaa
aaa
aaa
aaa
-bHI
-aby
+aaa
+bIX
aby
aby
bGH
@@ -78790,39 +79362,39 @@ cgG
cgG
bWV
cfn
-ciR
-cwa
+cAS
+cwc
cwn
-ckg
-ckz
-ckP
-cjm
-cfN
-cfN
-cfN
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+ckj
+cwH
+ckS
+mck
+iEX
+cxB
+cxB
+dVp
+odM
aht
-aaa
aht
-aaa
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
aht
aaa
aaa
aaa
-aaa
-aht
-aaa
-aaa
-aaa
-aht
+cfN
+vHh
+cfN
+cfN
+cfN
+cfN
+cfN
cfN
cfN
-aaa
aaa
aaa
aaa
@@ -79005,11 +79577,11 @@ aaa
aaa
aaa
aaa
+aaa
bGD
bGD
bIT
bJZ
-bIT
bMr
bNs
bOw
@@ -79047,40 +79619,40 @@ ciT
cvh
cgG
cfn
-cvF
-cwa
+cAT
+pXc
cwo
ckh
ckA
-ckP
-cjm
+mKP
+hpF
+sqt
+cTI
+qLb
+kJN
+odM
+aaa
cfN
cfN
cfN
+vHh
cfN
+vHh
aaa
-aaa
-aaa
-aaa
-aaa
-cjp
-cyU
-cjp
-cyU
-cjp
-cjp
-cyU
-cjp
-cyU
-cjp
-cyU
-aht
-aht
aht
aaa
aaa
aaa
aaa
+aht
+aaa
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+aaa
aaa
aaa
aaa
@@ -79262,10 +79834,10 @@ aaa
aaa
aaa
aaa
+aaa
+bGE
bGE
bGE
-bIU
-bHM
bHM
bHM
bHM
@@ -79307,43 +79879,43 @@ cfn
cvH
cwc
cwp
-cki
+cxB
ckB
-ckP
-cjm
-caS
-caS
-caS
+ulQ
+hrk
caS
+osW
+kAX
+nso
+odM
+aaa
+cfN
+cfN
+cfN
+aht
+aaa
+aht
+aaa
+aht
aht
aht
aht
aht
-cjp
-cjp
-ckH
-cyY
-ckH
-ckH
-ckH
-ckH
-czH
-ckH
-cyR
-cyU
-aaa
-aaa
aht
aaa
+cfN
+cfN
+vHh
+cfN
+cfN
+cfN
aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+rmC
+rmC
+rmC
rmC
rmC
rmC
@@ -79518,7 +80090,7 @@ aaa
aaa
aaa
aaa
-bFE
+aaa
bGF
bHJ
pbm
@@ -79564,43 +80136,43 @@ cvw
cvI
ckQ
clf
-cwA
-cwA
+wyf
+ehR
cwS
-cjm
-cfN
-caS
-cfN
+rpx
+uXp
+lUz
+mEe
+dET
+odM
aaa
aaa
aaa
aaa
+aht
+aaa
+aht
aaa
-cjp
-cCW
-ckH
-cyZ
-ckH
-czl
-czr
-czr
-czI
-ckH
-ckH
-cjp
-cjp
-cyU
aht
aaa
aaa
aaa
aaa
+aht
+aaa
+aaa
+aaa
+aht
+cfN
+cfN
aaa
aaa
aaa
aaa
aaa
-aaa
+rmC
+rmC
+rmC
rmC
rmC
rmC
@@ -79776,8 +80348,8 @@ aaa
aaa
aaa
aaa
+aaa
bGE
-bHK
bIV
bKb
bLo
@@ -79818,36 +80390,36 @@ cgH
cvi
cgG
cfn
-ciR
-cwa
+cAS
+cwc
cjO
-ckk
-ckC
-ckR
-cjm
-cfN
-caS
-caS
-aht
-aht
-aht
-aht
-aht
+cwH
+cwH
+ckS
+keD
+mck
+cxB
+cxB
+pJy
+odM
+aaa
+aaa
+aaa
+aaa
cjp
-ckW
-ckH
-ckH
-ckH
-czl
-czr
-czB
-czI
-czV
-ckH
-cAr
-cAB
cyU
cjp
+cyU
+cjp
+cjp
+cyU
+cjp
+cyU
+cjp
+cyU
+aht
+aht
+aht
aaa
aaa
aaa
@@ -79855,9 +80427,9 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
+rmC
+rmC
+rmC
rmC
rmC
rmC
@@ -80033,7 +80605,7 @@ aaa
aaa
aaa
aaa
-bGG
+aaa
bHL
bIW
bKc
@@ -80076,41 +80648,41 @@ cid
cgG
cfn
ciR
-cwe
-cwe
-cwe
-cwe
-cwe
-cwe
-cwe
-cwe
-cfN
-aaa
-aaa
-aaa
-aaa
-aaa
+cwc
+cwm
+cwH
+cwH
+ckS
+uIh
+lXv
+cxB
+lAL
+hlw
+odM
+aht
+aht
+aht
+cjp
cjp
-cyP
ckH
cyZ
ckH
-czl
-czt
-czC
-czI
-czW
-cAg
-cAs
ckH
-cAH
-cjp
+ckH
+ckH
+czI
+ckH
+cyT
cyU
aaa
aaa
+aht
+aaa
+aaa
+aaa
+aaa
aaa
aaa
-cfN
aaa
aaa
aaa
@@ -80236,7 +80808,7 @@ wxb
aiu
xuv
aoe
-ajD
+bGG
hKX
aiu
apB
@@ -80245,7 +80817,7 @@ aBa
oTC
ait
aaa
-abN
+bBW
aaa
aHA
aKz
@@ -80290,9 +80862,9 @@ aaa
aaa
aaa
aaa
+aaa
bGH
bGE
-bIX
bKd
bLp
bMu
@@ -80333,42 +80905,42 @@ cvj
bWV
cfn
cvJ
-cwe
+cwc
cjP
-ckl
+cxB
ckD
ckS
-clg
-clk
-cwe
-cwe
cxB
-cxJ
-cxJ
-cxJ
-cyy
+clk
+cxB
+gJV
+cxB
+odM
+aaa
+aaa
+aaa
cjp
cyQ
ckH
+xja
+ckH
+ipv
+mXJ
+mXJ
+czM
ckH
ckH
-ckH
-ckH
-ckH
-ckH
-czW
-cAg
-cAt
-ckH
-czW
-cAS
+cjp
+cjp
cyU
aht
-aht
-aht
-cyM
-cfN
-cfN
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -80491,7 +81063,7 @@ aut
aiu
giO
aDm
-kJo
+ujI
fAx
aDm
aDm
@@ -80547,10 +81119,10 @@ aaa
aaa
aaa
aaa
+aaa
bGI
bHM
bHM
-bNw
bLq
bMv
bNw
@@ -80589,43 +81161,43 @@ ciV
cjq
cgG
cfn
-ckE
-ckT
-xhj
+ciR
+cwc
xhj
+cxB
cwK
odM
-xhj
-cxn
-xhj
-lqy
-cxC
-cxK
-cxX
-cyl
-cyz
-jgr
+odM
+odM
+odM
+odM
+odM
+odM
+aht
+aht
+aht
+cjp
cjQ
-cjQ
-cjQ
-cjQ
-cjQ
-cjQ
-cjQ
-czL
+ckH
+ckH
+ckH
+ipv
+mXJ
+iEP
+czM
czY
-cAi
+ckH
cAu
cAC
-cAJ
-cAT
cyU
+cjp
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
-cfN
-cfN
-cfN
aaa
aaa
aaa
@@ -80748,9 +81320,9 @@ auu
aiu
ekU
aiu
-asr
-tyL
+aqh
ajD
+bGG
nPA
mtu
aCc
@@ -80805,11 +81377,11 @@ aaa
aaa
aaa
aaa
-bHN
+aaa
+bIY
bGE
-bKe
bLr
-bMw
+bMx
bNx
bNw
bOw
@@ -80845,45 +81417,45 @@ ciE
ciW
cjr
cgG
-cvw
-cvK
-cwg
-cjR
-jFO
-ckF
-jFO
-cxe
+czW
+ceJ
+cwe
jFO
jFO
-cxz
-cxD
-cxL
-cxY
-cym
-cyA
-vOw
+cwe
+cwe
+cwe
+cwe
+cwe
+cfN
+aaa
+aaa
+aaa
+aaa
+aaa
+cjp
ijF
-pXc
-ckm
-ckm
-ckm
-ckm
-ckm
+ckH
+xja
+ckH
+ipv
+odz
+nXR
czM
-czZ
-cAj
+cAa
+cAg
cAv
-cAD
+ckH
cAK
-cAU
+cjp
cyU
aaa
aaa
aaa
+aaa
cfN
-cfN
-cfN
-cfN
+aaa
+aaa
aaa
aaa
rmC
@@ -81061,12 +81633,12 @@ aaa
aaa
aaa
aaa
-aht
+aaa
+aaa
aqG
bGE
-cqW
bKf
-bMw
+bMx
bNy
bNw
bOw
@@ -81103,7 +81675,7 @@ cgG
cgG
bWV
cfn
-ceP
+cAU
cwe
cwr
clm
@@ -81120,7 +81692,7 @@ cxM
cyB
cjp
cyR
-ick
+ckH
ckH
ckH
ckH
@@ -81134,14 +81706,14 @@ ckH
cAa
cAV
cyU
+aht
+aht
+aht
+vHh
+cfN
+cfN
aaa
aaa
-cfN
-cfN
-cfN
-cfN
-cfN
-aaa
aaa
rmC
rmC
@@ -81317,11 +81889,11 @@ aaa
aaa
aaa
aaa
-aht
+aaa
+aaa
aht
aqG
bGE
-izF
ros
bMx
bNz
@@ -81360,44 +81932,44 @@ chn
cfE
cfE
cvy
-cfG
-cwe
-cwe
+cCW
+qAM
+fWv
fWv
qOE
ckV
-qOE
+fWv
cln
-cwe
-cfN
-aaa
-aaa
-aaa
-aaa
-aaa
-cjp
-cyS
-ick
-cyZ
-ckH
-czo
-czu
+fWv
+cIN
+ggN
+nOF
+xld
+jzw
+vrn
+sKq
+czD
+czD
+czD
+czD
+czD
+czD
czD
czN
-cAa
-cAg
+kQH
+bNC
cAs
-ckH
+dwq
cAM
-cjp
+xEb
cyU
aaa
aaa
+aaa
cfN
cfN
cfN
-cfN
-cfN
+aaa
aaa
aaa
rmC
@@ -81576,11 +82148,11 @@ aaa
aaa
aaa
aaa
+aaa
aqG
bGE
bGE
bHM
-bHM
bNA
bHM
bSZ
@@ -81617,40 +82189,40 @@ cho
cvk
cdx
kXx
-csS
-cfm
-cwe
-fWv
-qOE
+izF
+rnE
+xjc
mKc
-qOE
-cln
-cwe
-caS
-aht
-aht
-aht
-aht
-aht
-cjp
+oHk
+mKc
+kOW
+mKc
+mKc
+eKC
+vQN
+uzy
+mWN
+kRY
+iYp
+gPs
cko
-ick
-ckH
-ckH
-clp
+shw
+czv
+czv
+czv
czv
czv
czO
cli
-ckH
+hBu
cAy
cAB
+uTZ
+vTc
cyU
-cjp
-aht
-aht
-aht
-cyM
+aaa
+aaa
+aaa
cfN
cfN
cfN
@@ -81834,9 +82406,9 @@ aaa
aaa
aaa
aaa
-bIY
-bIY
-aht
+aaa
+cwR
+bKe
aht
bNB
abI
@@ -81873,45 +82445,45 @@ cfm
ciF
cuQ
cfm
-cfm
+chF
jSa
-cfm
cwe
+xNx
ckp
ckI
ckX
-ckI
-cln
+het
+eeG
cwe
-cfN
-cfN
-aaa
-aaa
-aaa
-aaa
+cwe
+jee
+cdV
+cdV
+cdV
+iyL
cjp
cyT
ick
-cyZ
-ckH
-czp
ckH
ckH
-czP
ckH
ckH
-cjp
-cjp
+ckH
+ckH
+hlj
+cAg
+cAt
+ckH
+hlj
+lEh
cyU
-aht
-aaa
aaa
aaa
cfN
cfN
cfN
cfN
-aaa
+cfN
aaa
aaa
rmC
@@ -82130,39 +82702,40 @@ cio
chq
ciX
cfm
+cAi
+jgr
+cjm
+cwe
+gqi
+gXv
+dRT
+gXv
+sgD
+cwe
cfN
-cwA
-cfN
-cwe
-cwe
-cwe
-cwe
-cwe
-cwe
-cwe
-caS
-caS
-aht
-aht
-aht
-aht
+aaa
+aaa
+aaa
+aaa
+aaa
cjp
-cjp
-xjc
+oxo
+ick
xja
ckH
czq
czw
-ckH
+oIU
czQ
+hlj
+cAg
+cAv
ckH
-cyR
+wnE
+cjp
cyU
aaa
aaa
-aht
-aaa
-aaa
cfN
cfN
cfN
@@ -82170,7 +82743,6 @@ cfN
cfN
aaa
aaa
-aaa
rmC
rmC
rmC
@@ -82387,47 +82959,47 @@ cgM
chr
chL
cfm
-cfN
+cAi
xSd
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-aaa
-aaa
-aaa
-aaa
-aht
-cjp
-cyU
-cjp
-cyU
-cjp
-cjp
-cyU
-cjp
-cyU
-cjp
-cyU
+cjm
+cwe
+gqi
+gXv
+qYW
+gXv
+sgD
+cwe
+iye
aht
aht
aht
aht
-cyM
+aht
+cjp
+egu
+ick
+ckH
+ckH
+njI
+kix
+kix
+xGY
+oWD
+ckH
+nWD
+cAC
+cyU
+cjp
+aht
+aht
+aht
+vHh
cfN
cfN
cfN
cfN
aaa
aaa
-aaa
-aaa
rmC
rmC
rmC
@@ -82644,47 +83216,47 @@ cip
chs
ciY
cfm
-cfN
-cwA
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
+cAi
+jgr
+cjm
+cwe
+rRv
+rSE
+wDq
+rSE
+sgD
+cwe
cfN
cfN
aaa
aaa
aaa
-aht
-aaa
-aaa
-aht
-aaa
-aaa
-aht
-aaa
-aht
aaa
+cjp
+jqZ
+ick
+xja
+ckH
+vgg
+ckH
+ckH
+rzm
+ckH
+ckH
+cjp
+cjp
+cyU
aht
aaa
aaa
aaa
-aaa
-aaa
cfN
cfN
-aaa
cfN
cfN
aaa
aaa
aaa
-aaa
rmC
rmC
rmC
@@ -82901,44 +83473,44 @@ cfm
cht
cfm
cfm
+cAi
+jgr
cfN
-cwA
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-aaa
-aaa
-aaa
+cwe
+cwe
+cwe
+cwe
+cwe
+cwe
+cwe
+iye
+iye
aht
aht
aht
aht
+cjp
+cjp
+nYC
+fug
+ckH
+dYI
+lQo
+ckH
+wdY
+ckH
+cyT
+cyU
aaa
aaa
aht
-aht
-aht
aaa
-aht
aaa
cfN
cfN
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cfN
+cfN
+cfN
aaa
aaa
aaa
@@ -83032,13 +83604,13 @@ aaa
aem
aeq
aeE
-aeU
+tVZ
afo
afD
aga
aga
agz
-aie
+dHg
aiH
ahm
ahD
@@ -83158,9 +83730,8 @@ ciq
chu
ciZ
cfm
-cfN
-cwA
-cfN
+cAi
+kJo
cfN
cfN
cfN
@@ -83174,27 +83745,28 @@ cfN
aaa
aaa
aaa
+aaa
aht
-aaa
-aaa
+cjp
+cyU
+cjp
+cyU
+cjp
+cjp
+cyU
+cjp
+cyU
+cjp
+cyU
aht
-cfN
-cfN
-cyM
-cfN
aht
-aaa
aht
+aht
+vHh
+cfN
cfN
cfN
cfN
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aaa
aaa
aaa
@@ -83415,43 +83987,43 @@ cfm
cfm
cfm
cfm
+cAj
+jgr
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
cfN
-cwA
-cjm
cfN
cfN
cfN
aaa
aaa
-cfN
-cfN
-cfN
-cfN
-aaa
aaa
+aht
aaa
aaa
aht
aaa
-cfN
-cyM
-cfN
-cfN
-cfN
-cfN
-cyM
-cfN
-cyM
-cfN
-cfN
-cfN
-cfN
+aaa
+aht
+aaa
+aht
+aaa
+aht
aaa
aaa
aaa
aaa
aaa
+cfN
+cfN
aaa
+cfN
+cfN
aaa
aaa
aaa
@@ -83663,38 +84235,20 @@ arF
crO
crO
crO
-crO
-crO
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
+aaa
+aaa
+cjm
+cjm
+cjm
+cxX
+cyA
+czl
+czC
+cAj
iXx
cjm
cfN
cfN
-aaa
-aaa
-aaa
-aaa
-cfN
-cfN
-aaa
-aaa
-aaa
-aaa
-aaa
-cyL
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
cfN
cfN
cfN
@@ -83706,13 +84260,31 @@ cfN
aaa
aaa
aaa
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
+aht
+aht
+aht
+aht
+aaa
+aaa
+aht
+aht
+aht
+aaa
+aht
+aaa
+cfN
+cfN
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
rmC
rmC
rmC
@@ -83871,7 +84443,7 @@ aaa
aaa
aaa
aYG
-bbR
+bHN
bbR
bnp
baK
@@ -83917,24 +84489,48 @@ bva
bIZ
bIZ
bIZ
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-xYV
+aht
+aht
+aht
+aht
+aht
cjm
+cvK
+cjm
+cxY
+cyL
+czp
+czH
+cAr
+nKo
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+aaa
+aaa
+aaa
aht
aaa
aaa
+aht
+cfN
+cfN
+vHh
+cfN
+aht
+aaa
+aht
+cfN
+cfN
+cfN
aaa
aaa
aaa
@@ -83944,32 +84540,8 @@ aaa
aaa
aaa
aaa
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
aaa
aaa
-aaa
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
rmC
rmC
rmC
@@ -84128,7 +84700,7 @@ aZx
aZx
aYG
aYG
-baK
+bIU
baK
bnq
baM
@@ -84174,24 +84746,49 @@ caZ
cbS
ccN
bIZ
+xgh
+xgh
+xgh
+xgh
cjm
cjm
+cwg
cjm
-cjm
-cjm
-cjm
-cjm
-cjm
+cyl
+cyM
+czr
+czP
+cAj
+eNc
cjm
cfN
cfN
cfN
+fon
+aaa
cfN
-qWo
-cjm
-cjm
+cfN
+cfN
+cfN
+aaa
+aaa
+aaa
+aaa
aht
aaa
+cfN
+vHh
+cfN
+cfN
+cfN
+cfN
+vHh
+cfN
+vHh
+cfN
+cfN
+cfN
+cfN
aaa
aaa
aaa
@@ -84201,32 +84798,7 @@ aaa
aaa
aaa
aaa
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
aaa
-aaa
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-cfN
-aaa
-aaa
-aaa
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
rmC
rmC
rmC
@@ -84429,51 +85001,51 @@ aaa
bIZ
cba
cbT
-bDi
+bRD
ozO
-cwA
-cwA
-cwA
-cwA
vco
-cwA
-cwA
-cwA
-cwA
+vco
+vco
+vco
+vco
+vco
+cxe
+cjm
+cym
xYV
bNE
-xYV
+czP
qWo
lxI
xVt
-cjm
+qGf
aht
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+aht
+fon
aaa
aaa
cfN
cfN
-cfN
-aaa
aaa
aaa
aaa
aaa
aaa
+nix
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
cfN
cfN
cfN
cfN
-aaa
aaa
aaa
aaa
@@ -84685,27 +85257,28 @@ bva
aaa
bIZ
cbb
-bDi
+bSq
ccO
bva
-cjm
-cjm
-xgh
-xgh
-cjm
-cjm
-cjm
+xgh
+xgh
xgh
xgh
cjm
cjm
+cxz
cjm
+cyy
+cyP
+czt
+czP
cjm
eNc
-pia
+cjm
cjm
aht
aaa
+fon
aaa
aaa
aaa
@@ -84714,23 +85287,22 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
aaa
aaa
aaa
@@ -84942,42 +85514,28 @@ bIZ
aaa
bva
bva
-bNK
+ckE
bva
bva
aht
aht
-fon
-fon
aht
aht
+cjm
+cqW
+cxD
+cjm
+cyz
+cyY
+czB
+cjm
+cjm
+eNc
+tyL
+cjm
+aht
+aaa
mau
-fon
-fon
-aht
-aht
-aht
-cjm
-cjm
-cjm
-cjm
-aht
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aaa
aaa
aaa
@@ -84986,8 +85544,22 @@ aaa
aaa
aaa
aaa
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
aaa
aaa
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
+cfN
aaa
aaa
aaa
@@ -85200,54 +85772,54 @@ aaa
aaa
bIZ
csy
-bQl
-cqX
-xNx
+bIZ
+aht
+aaa
+aaa
+aaa
+aaa
+cjm
ctS
-cFB
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cxD
+cjm
+cjm
+cjm
+cjm
+cjm
+eNc
+eNc
+ukn
+cjm
+aht
aaa
fon
-fon
-aht
-aht
-nKo
aaa
aaa
aaa
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+cfN
+cfN
+cfN
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+cfN
+cfN
+cfN
+cfN
+aaa
+aaa
+aaa
+aaa
rmC
rmC
rmC
@@ -85459,7 +86031,33 @@ bva
bSq
bva
bva
-rnE
+aaa
+aaa
+aaa
+aaa
+cjm
+cjm
+cxL
+vco
+vco
+vco
+vco
+vco
+cAD
+cjm
+cjm
+cjm
+aht
+aaa
+fon
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -85479,32 +86077,6 @@ aaa
aaa
aaa
aaa
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
rmC
rmC
rmC
@@ -85715,15 +86287,41 @@ bXa
bRD
bWl
cdE
-bIZ
-rnE
+ckF
+aaa
+aaa
+aaa
+aaa
+aaa
+cjm
+cjm
+cjm
+cjm
+cjm
+cjm
+cjm
+cAH
+cjm
+aht
+aht
+tRZ
+aht
+mau
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
-nge
-adR
-adR
-adR
aaa
aaa
aaa
@@ -85736,32 +86334,6 @@ aaa
aaa
aaa
aaa
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
rmC
rmC
rmC
@@ -85972,15 +86544,41 @@ bva
bva
bva
bva
+ckW
bva
-ukn
bIZ
bva
bva
-aht
-aht
-aht
-aht
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+cAJ
+pia
+vOw
+pia
+vOw
+pia
+nUc
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -85993,32 +86591,6 @@ aaa
aaa
aaa
aaa
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
rmC
rmC
rmC
@@ -86242,6 +86814,7 @@ aht
adR
aaa
aaa
+cFB
aaa
aaa
aaa
@@ -86312,7 +86885,6 @@ rmC
rmC
rmC
rmC
-rmC
"}
(92,1,1) = {"
rmC
@@ -86499,15 +87071,15 @@ aht
nge
aaa
aaa
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
-rmC
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
rmC
rmC
rmC
@@ -97166,7 +97738,7 @@ aek
aek
aek
aeA
-adF
+geL
afk
ael
afS
@@ -99539,8 +100111,8 @@ aVu
bat
aLf
bcy
-qAM
-aEj
+aKp
+kKI
aEj
bgC
bhi
@@ -99795,8 +100367,8 @@ aYp
aPY
bau
aLf
-aFi
-aMA
+bHK
+aIp
beI
beI
bgD
@@ -100566,7 +101138,7 @@ aYs
aZk
bax
aLf
-aFi
+aMA
bdC
beI
bfx
@@ -105919,7 +106491,7 @@ aaa
aaa
aiT
akn
-ajv
+bFE
aaF
aaU
aaL
@@ -106719,7 +107291,7 @@ aFi
aJs
aFi
aFi
-aFi
+bHI
aEj
aaa
aaa
@@ -114714,13 +115286,13 @@ abI
aby
aaa
xKc
-blX
+lCN
qAk
iPj
tfP
geN
qAk
-blX
+uzB
xKc
aaa
aby
diff --git a/auxmos.dll b/auxmos.dll
index 54fb0c6c98..fc227f62c9 100644
Binary files a/auxmos.dll and b/auxmos.dll differ
diff --git a/auxmos.pdb b/auxmos.pdb
index 031e66d103..a2db349011 100644
Binary files a/auxmos.pdb and b/auxmos.pdb differ
diff --git a/code/__DEFINES/_flags/obj_flags.dm b/code/__DEFINES/_flags/obj_flags.dm
index e48146a1d0..ac772c6e8e 100644
--- a/code/__DEFINES/_flags/obj_flags.dm
+++ b/code/__DEFINES/_flags/obj_flags.dm
@@ -15,6 +15,7 @@
#define BLOCK_Z_IN_UP (1<<12) // Should this object block z uprise from below?
#define SHOVABLE_ONTO (1<<13)//called on turf.shove_act() to consider whether an object should have a niche effect (defined in their own shove_act()) when someone is pushed onto it, or do a sanity CanPass() check.
#define EXAMINE_SKIP (1<<14) /// Makes the Examine proc not read out this item.
+#define IN_STORAGE (1<<15) //is this item in the storage item, such as backpack? used for tooltips
/// Integrity defines for clothing (not flags but close enough)
#define CLOTHING_PRISTINE 0 // We have no damage on the clothing
diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm
index 67d16e6687..1c6b7c21d4 100644
--- a/code/__DEFINES/atmospherics.dm
+++ b/code/__DEFINES/atmospherics.dm
@@ -155,10 +155,10 @@
//LAVALAND
#define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 //what pressure you have to be under to increase the effect of equipment meant for lavaland
-#define LAVALAND_DEFAULT_ATMOS "o2=14;n2=23;TEMP=300"
+#define LAVALAND_DEFAULT_ATMOS "LAVALAND_ATMOS"
//SNOSTATION
-#define ICEMOON_DEFAULT_ATMOS "o2=17;n2=63;TEMP=180"
+#define ICEMOON_DEFAULT_ATMOS "ICEMOON_ATMOS"
//ATMOSIA GAS MONITOR TAGS
#define ATMOS_GAS_MONITOR_INPUT_O2 "o2_in"
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/footsteps.dm b/code/__DEFINES/footsteps.dm
index 215e287adf..cc0c6547b0 100644
--- a/code/__DEFINES/footsteps.dm
+++ b/code/__DEFINES/footsteps.dm
@@ -8,6 +8,7 @@
#define FOOTSTEP_LAVA "lava"
#define FOOTSTEP_MEAT "meat"
#define FOOTSTEP_RUST "rust"
+#define FOOTSTEP_CATWALK "catwalk"
//barefoot sounds
#define FOOTSTEP_WOOD_BAREFOOT "woodbarefoot"
@@ -94,6 +95,12 @@ GLOBAL_LIST_INIT(footstep, list(
'sound/effects/footstep/lava3.ogg'), 100, 0),
FOOTSTEP_MEAT = list(list(
'sound/effects/meatslap.ogg'), 100, 0),
+ FOOTSTEP_CATWALK = list(list(
+ 'sound/effects/footstep/catwalk1.ogg',
+ 'sound/effects/footstep/catwalk2.ogg',
+ 'sound/effects/footstep/catwalk3.ogg',
+ 'sound/effects/footstep/catwalk4.ogg',
+ 'sound/effects/footstep/catwalk5.ogg'), 100, 1),
FOOTSTEP_RUST = list(list(
'sound/effects/footstep/rustystep1.ogg'), 100, 0)
))
diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm
index 35348df3d1..d4ab59cbc1 100644
--- a/code/__DEFINES/jobs.dm
+++ b/code/__DEFINES/jobs.dm
@@ -42,6 +42,7 @@
#define CLOWN (1<<11)
#define MIME (1<<12)
#define ASSISTANT (1<<13)
+#define PRISONER (1<<14)
#define JOB_AVAILABLE 0
#define JOB_UNAVAILABLE_GENERIC 1
@@ -89,3 +90,4 @@
#define JOB_DISPLAY_ORDER_WARDEN 31
#define JOB_DISPLAY_ORDER_DETECTIVE 32
#define JOB_DISPLAY_ORDER_SECURITY_OFFICER 33
+#define JOB_DISPLAY_ORDER_PRISONER 34
diff --git a/code/__DEFINES/layers_planes.dm b/code/__DEFINES/layers_planes.dm
index ea7b1b2e0a..c7be89721e 100644
--- a/code/__DEFINES/layers_planes.dm
+++ b/code/__DEFINES/layers_planes.dm
@@ -64,8 +64,9 @@
#define GAS_PIPE_VISIBLE_LAYER 2.47
#define GAS_FILTER_LAYER 2.48
#define GAS_PUMP_LAYER 2.49
-
#define LOW_OBJ_LAYER 2.5
+///catwalk overlay of /turf/open/floor/plating/plating_catwalk
+#define CATWALK_LAYER 2.51
#define LOW_SIGIL_LAYER 2.52
#define SIGIL_LAYER 2.54
#define HIGH_SIGIL_LAYER 2.56
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 850a2b0f39..6a63ced634 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -347,3 +347,7 @@
// / Breathing types. Lungs can access either by these or by a string, which will be considered a gas ID.
#define BREATH_OXY /datum/breathing_class/oxygen
#define BREATH_PLASMA /datum/breathing_class/plasma
+
+//Gremlins
+#define NPC_TAMPER_ACT_FORGET 1 //Don't try to tamper with this again
+#define NPC_TAMPER_ACT_NOMSG 2 //Don't produce a visible message
diff --git a/code/__DEFINES/qdel.dm b/code/__DEFINES/qdel.dm
index 63259774fa..32e0025ab2 100644
--- a/code/__DEFINES/qdel.dm
+++ b/code/__DEFINES/qdel.dm
@@ -1,30 +1,44 @@
-//defines that give qdel hints. these can be given as a return in destory() or by calling
+//! Defines that give qdel hints.
+//!
+//! These can be given as a return in [/atom/proc/Destroy] or by calling [/proc/qdel].
+
+/// `qdel` should queue the object for deletion.
+#define QDEL_HINT_QUEUE 0
+/// `qdel` should let the object live after calling [/atom/proc/Destroy].
+#define QDEL_HINT_LETMELIVE 1
+/// Functionally the same as the above. `qdel` should assume the object will gc on its own, and not check it.
+#define QDEL_HINT_IWILLGC 2
+/// Qdel should assume this object won't GC, and queue a hard delete using a hard reference.
+#define QDEL_HINT_HARDDEL 3
+// Qdel should assume this object won't gc, and hard delete it posthaste.
+#define QDEL_HINT_HARDDEL_NOW 4
-#define QDEL_HINT_QUEUE 0 //qdel should queue the object for deletion.
-#define QDEL_HINT_LETMELIVE 1 //qdel should let the object live after calling destory.
-#define QDEL_HINT_IWILLGC 2 //functionally the same as the above. qdel should assume the object will gc on its own, and not check it.
-#define QDEL_HINT_HARDDEL 3 //qdel should assume this object won't gc, and queue a hard delete using a hard reference.
-#define QDEL_HINT_HARDDEL_NOW 4 //qdel should assume this object won't gc, and hard del it post haste.
-
-#ifdef LEGACY_REFERENCE_TRACKING
-/** If LEGACY_REFERENCE_TRACKING is enabled, qdel will call this object's find_references() verb.
- *
- * Functionally identical to QDEL_HINT_QUEUE if GC_FAILURE_HARD_LOOKUP is not enabled in _compiler_options.dm.
+#ifdef REFERENCE_TRACKING
+/** If REFERENCE_TRACKING is enabled, qdel will call this object's find_references() verb.
+ *
+ * Functionally identical to [QDEL_HINT_QUEUE] if [GC_FAILURE_HARD_LOOKUP] is not enabled in _compiler_options.dm.
*/
-#define QDEL_HINT_FINDREFERENCE 5
-/// Behavior as QDEL_HINT_FINDREFERENCE, but only if the GC fails and a hard delete is forced.
+#define QDEL_HINT_FINDREFERENCE 5
+/// Behavior as [QDEL_HINT_FINDREFERENCE], but only if the GC fails and a hard delete is forced.
#define QDEL_HINT_IFFAIL_FINDREFERENCE 6
#endif
-
#define GC_QUEUE_CHECK 1
#define GC_QUEUE_HARDDELETE 2
#define GC_QUEUE_COUNT 2 //increase this when adding more steps.
+#define QDEL_ITEM_ADMINS_WARNED (1<<0) //! Set when admins are told about lag causing qdels in this type.
+#define QDEL_ITEM_SUSPENDED_FOR_LAG (1<<1) //! Set when a type can no longer be hard deleted on failure because of lag it causes while this happens.
+
+// Defines for the [gc_destroyed][/datum/var/gc_destroyed] var.
#define GC_QUEUED_FOR_QUEUING -1
#define GC_CURRENTLY_BEING_QDELETED -2
+// Defines for the time left for an item to get its reference cleaned
+#define GC_FILTER_QUEUE 5 MINUTES
+#define GC_DEL_QUEUE 10 SECONDS
+
#define QDELING(X) (X.gc_destroyed)
#define QDELETED(X) (!X || QDELING(X))
#define QDESTROYING(X) (!X || X.gc_destroyed == GC_CURRENTLY_BEING_QDELETED)
diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm
index 44e97ef345..8864e41ae9 100644
--- a/code/__DEFINES/reagents.dm
+++ b/code/__DEFINES/reagents.dm
@@ -76,3 +76,8 @@
//Chemical reaction flags, for determining reaction specialties
#define REACTION_CLEAR_IMPURE (1<<0) //Convert into impure/pure on reaction completion
#define REACTION_CLEAR_INVERSE (1<<1) //Convert into inverse on reaction completion when purity is low enough
+
+//Chemical blacklists for smartdarts
+GLOBAL_LIST_INIT(blacklisted_medchems, list(
+ /datum/reagent/medicine/morphine, /datum/reagent/medicine/haloperidol, //harmful chemicals in medicine
+ ))
diff --git a/code/__DEFINES/rust_g.dm b/code/__DEFINES/rust_g.dm
index 988acd3dae..0da05e7c1d 100644
--- a/code/__DEFINES/rust_g.dm
+++ b/code/__DEFINES/rust_g.dm
@@ -38,6 +38,9 @@
#define RUST_G (__rust_g || __detect_rust_g())
#endif
+/// Gets the version of rust_g
+/proc/rustg_get_version() return call(RUST_G, "get_version")()
+
/**
* This proc generates a cellular automata noise grid which can be used in procedural generation methods.
*
@@ -77,8 +80,8 @@
#define RUSTG_HTTP_METHOD_PATCH "patch"
#define RUSTG_HTTP_METHOD_HEAD "head"
#define RUSTG_HTTP_METHOD_POST "post"
-#define rustg_http_request_blocking(method, url, body, headers) call(RUST_G, "http_request_blocking")(method, url, body, headers)
-#define rustg_http_request_async(method, url, body, headers) call(RUST_G, "http_request_async")(method, url, body, headers)
+#define rustg_http_request_blocking(method, url, body, headers, options) call(RUST_G, "http_request_blocking")(method, url, body, headers, options)
+#define rustg_http_request_async(method, url, body, headers, options) call(RUST_G, "http_request_async")(method, url, body, headers, options)
#define rustg_http_check_request(req_id) call(RUST_G, "http_check_request")(req_id)
#define RUSTG_JOB_NO_RESULTS_YET "NO RESULTS YET"
@@ -99,3 +102,11 @@
#define rustg_sql_disconnect_pool(handle) call(RUST_G, "sql_disconnect_pool")(handle)
#define rustg_sql_check_query(job_id) call(RUST_G, "sql_check_query")("[job_id]")
+#define rustg_url_encode(text) call(RUST_G, "url_encode")(text)
+#define rustg_url_decode(text) call(RUST_G, "url_decode")(text)
+
+#ifdef RUSTG_OVERRIDE_BUILTINS
+ #define url_encode(text) rustg_url_encode(text)
+ #define url_decode(text) rustg_url_decode(text)
+#endif
+
diff --git a/code/__DEFINES/rust_g_overrides.dm b/code/__DEFINES/rust_g_overrides.dm
new file mode 100644
index 0000000000..57de7d96ac
--- /dev/null
+++ b/code/__DEFINES/rust_g_overrides.dm
@@ -0,0 +1,3 @@
+// RUSTG_OVERRIDE_BUILTINS is not used since the file APIs don't work well over Linux.
+#define url_encode(text) rustg_url_encode("[text]")
+#define url_decode(text) rustg_url_decode("[text]")
diff --git a/code/__DEFINES/time.dm b/code/__DEFINES/time.dm
index 01990ddc17..252fe0910e 100644
--- a/code/__DEFINES/time.dm
+++ b/code/__DEFINES/time.dm
@@ -49,10 +49,16 @@ When using time2text(), please use "DDD" to find the weekday. Refrain from using
#define TICKS *world.tick_lag
+#define MILLISECONDS * 0.01
+
#define DS2TICKS(DS) ((DS)/world.tick_lag)
#define TICKS2DS(T) ((T) TICKS)
+#define MS2DS(T) ((T) MILLISECONDS)
+
+#define DS2MS(T) ((T) * 100)
+
#define GAMETIMESTAMP(format, wtime) time2text(wtime, format)
#define WORLDTIME2TEXT(format) GAMETIMESTAMP(format, world.time)
#define WORLDTIMEOFDAY2TEXT(format) GAMETIMESTAMP(format, world.timeofday)
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index eb9bdccc22..665c0340a4 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -343,3 +343,9 @@
#define STICKY_NODROP "sticky-nodrop" //sticky nodrop sounds like a bad soundcloud rapper's name
#define TRAIT_SACRIFICED "sacrificed" //Makes sure that people cant be cult sacrificed twice.
#define TRAIT_SPACEWALK "spacewalk"
+
+
+/// obtained from mapping helper
+#define MAPPING_HELPER_TRAIT "mapping-helper"
+/// Trait associated with mafia
+#define MAFIA_TRAIT "mafia"
diff --git a/code/__HELPERS/_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/markov.dm b/code/__HELPERS/markov.dm
new file mode 100644
index 0000000000..7e195f8b9c
--- /dev/null
+++ b/code/__HELPERS/markov.dm
@@ -0,0 +1,61 @@
+#define MAXIMUM_MARKOV_LENGTH 25000
+
+/proc/markov_chain(var/text, var/order = 4, var/length = 250)
+ if(!text || order < 0 || order > 20 || length < 1 || length > MAXIMUM_MARKOV_LENGTH)
+ return
+
+ var/table = markov_table(text, order)
+ var/markov = markov_text(length, table, order)
+ return markov
+
+/proc/markov_table(var/text, var/look_forward = 4)
+ if(!text)
+ return
+ var/list/table = list()
+
+ for(var/i = 1, i <= length(text), i++)
+ var/char = copytext(text, i, look_forward+i)
+ if(!table[char])
+ table[char] = list()
+
+ for(var/i = 1, i <= (length(text) - look_forward), i++)
+ var/char_index = copytext(text, i, look_forward+i)
+ var/char_count = copytext(text, i+look_forward, (look_forward*2)+i)
+
+ if(table[char_index][char_count])
+ table[char_index][char_count]++
+ else
+ table[char_index][char_count] = 1
+
+ return table
+
+/proc/markov_text(var/length = 250, var/table, var/look_forward = 4)
+ if(!table)
+ return
+ var/char = pick(table)
+ var/o = char
+
+ for(var/i = 0, i <= (length / look_forward), i++)
+ var/newchar = markov_weighted_char(table[char])
+
+ if(newchar)
+ char = newchar
+ o += "[newchar]"
+ else
+ char = pick(table)
+
+ return o
+
+/proc/markov_weighted_char(var/list/array)
+ if(!array || !array.len)
+ return
+
+ var/total = 0
+ for(var/i in array)
+ total += array[i]
+ var/r = rand(1, total)
+ for(var/i in array)
+ var/weight = array[i]
+ if(r <= weight)
+ return i
+ r -= weight
diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm
index 2c13f30707..9a59b2b0a9 100644
--- a/code/__HELPERS/roundend.dm
+++ b/code/__HELPERS/roundend.dm
@@ -218,20 +218,14 @@
to_chat(world, "
The round has ended.")
log_game("The round has ended.")
- if(LAZYLEN(GLOB.round_end_notifiees))
- world.TgsTargetedChatBroadcast("[GLOB.round_end_notifiees.Join(", ")] the round has ended.", FALSE)
+
+ CONFIG_SET(flag/suicide_allowed,TRUE) // EORG suicides allowed
for(var/I in round_end_events)
var/datum/callback/cb = I
cb.InvokeAsync()
LAZYCLEARLIST(round_end_events)
- for(var/client/C in GLOB.clients)
- if(!C.credits)
- C.RollCredits()
- C.playtitlemusic(40)
- CONFIG_SET(flag/suicide_allowed,TRUE) // EORG suicides allowed
-
var/speed_round = FALSE
if(world.time - SSticker.round_start_time <= 300 SECONDS)
speed_round = TRUE
@@ -264,12 +258,15 @@
send2adminchat("Server", "A round of [mode.name] just ended[mode_result == "undefined" ? "." : " with a [mode_result]."] Survival rate: [survival_rate]")
+ if(LAZYLEN(GLOB.round_end_notifiees))
+ world.TgsTargetedChatBroadcast("[GLOB.round_end_notifiees.Join(", ")] the round has ended.", FALSE)
+
if(length(CONFIG_GET(keyed_list/cross_server)))
send_news_report()
//tell the nice people on discord what went on before the salt cannon happens.
world.TgsTargetedChatBroadcast("The current round has ended. Please standby for your shift interlude Nanotrasen News Network's report!", FALSE)
- world.TgsTargetedChatBroadcast(send_news_report(),FALSE)
+ world.TgsTargetedChatBroadcast(send_news_report(), FALSE)
CHECK_TICK
@@ -543,21 +540,24 @@
///Generate a report for how much money is on station, as well as the richest crewmember on the station.
/datum/controller/subsystem/ticker/proc/market_report()
var/list/parts = list()
- parts += "Station Economic Summary:"
+
///This is the richest account on station at roundend.
var/datum/bank_account/mr_moneybags
///This is the station's total wealth at the end of the round.
var/station_vault = 0
///How many players joined the round.
var/total_players = GLOB.joined_player_list.len
- var/list/typecache_bank = typecacheof(list(/datum/bank_account/department, /datum/bank_account/remote))
- for(var/datum/bank_account/current_acc in SSeconomy.generated_accounts)
+ var/static/list/typecache_bank = typecacheof(list(/datum/bank_account/department, /datum/bank_account/remote))
+ for(var/i in SSeconomy.generated_accounts)
+ var/datum/bank_account/current_acc = SSeconomy.generated_accounts[i]
if(typecache_bank[current_acc.type])
continue
station_vault += current_acc.account_balance
if(!mr_moneybags || mr_moneybags.account_balance < current_acc.account_balance)
mr_moneybags = current_acc
- parts += "
| [MINESWEEPERIMG(7)] | " if(19) web += "[MINESWEEPERIMG(8)] | " + CHECK_TICK web += "" web += "
"
dat += "General Settings" dat += "UI Style: [UI_style]" + dat += "Outline: [outline_enabled ? "Enabled" : "Disabled"] " + dat += "Outline Color: Change " dat += "tgui Monitors: [(tgui_lock) ? "Primary" : "All"] " dat += "tgui Style: [(tgui_fancy) ? "Fancy" : "No Frills"] " dat += "Show Runechat Chat Bubbles: [chat_on_map ? "Enabled" : "Disabled"] " @@ -1707,6 +1719,23 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("previous_facehair_style") facial_hair_style = previous_list_item(facial_hair_style, GLOB.facial_hair_styles_list) + if("grad_color") + var/new_grad_color = input(user, "Choose your character's gradient colour:", "Character Preference","#"+grad_color) as color|null + if(new_grad_color) + grad_color = sanitize_hexcolor(new_grad_color, 6) + + if("grad_style") + var/new_grad_style + new_grad_style = input(user, "Choose your character's hair gradient style:", "Character Preference") as null|anything in GLOB.hair_gradients_list + if(new_grad_style) + grad_style = new_grad_style + + if("next_grad_style") + grad_style = next_list_item(grad_style, GLOB.hair_gradients_list) + + if("previous_grad_style") + grad_style = previous_list_item(grad_style, GLOB.hair_gradients_list) + if("cycle_bg") bgstate = next_list_item(bgstate, bgstate_options) @@ -2706,6 +2735,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) buttons_locked = !buttons_locked if("tgui_fancy") tgui_fancy = !tgui_fancy + if("outline_enabled") + outline_enabled = !outline_enabled + if("outline_color") + var/pickedOutlineColor = input(user, "Choose your outline color.", "General Preference", outline_color) as color|null + if(pickedOutlineColor) + outline_color = pickedOutlineColor if("tgui_lock") tgui_lock = !tgui_lock if("winflash") @@ -3006,6 +3041,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.dna.skin_tone_override = use_custom_skin_tone ? skin_tone : null character.hair_style = hair_style character.facial_hair_style = facial_hair_style + character.grad_style = grad_style + character.grad_color = grad_color character.underwear = underwear character.saved_underwear = underwear @@ -3070,6 +3107,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(additional_language && additional_language != "None") var/language_entry = GLOB.roundstart_languages[additional_language] if(language_entry) + character.additional_language = language_entry character.grant_language(language_entry, TRUE, TRUE) //limb stuff, only done when initially spawning in diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index d4d13dc40f..96ffd09af8 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -45,6 +45,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(current_version < 46) //If you remove this, remove force_reset_keybindings() too. force_reset_keybindings_direct(TRUE) addtimer(CALLBACK(src, .proc/force_reset_keybindings), 30) //No mob available when this is run, timer allows user choice. + if(current_version < 30) + outline_enabled = TRUE + outline_color = COLOR_BLUE_GRAY /datum/preferences/proc/update_character(current_version, savefile/S) if(current_version < 19) @@ -377,6 +380,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["ooccolor"] >> ooccolor S["lastchangelog"] >> lastchangelog S["UI_style"] >> UI_style + S["outline_color"] >> outline_color + S["outline_enabled"] >> outline_enabled S["hotkeys"] >> hotkeys S["chat_on_map"] >> chat_on_map S["max_chat_length"] >> max_chat_length @@ -555,6 +560,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["ooccolor"], ooccolor) WRITE_FILE(S["lastchangelog"], lastchangelog) WRITE_FILE(S["UI_style"], UI_style) + WRITE_FILE(S["outline_enabled"], outline_enabled) + WRITE_FILE(S["outline_color"], outline_color) WRITE_FILE(S["hotkeys"], hotkeys) WRITE_FILE(S["chat_on_map"], chat_on_map) WRITE_FILE(S["max_chat_length"], max_chat_length) @@ -676,6 +683,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["skin_tone"] >> skin_tone S["hair_style_name"] >> hair_style S["facial_style_name"] >> facial_hair_style + S["grad_style"] >> grad_style + S["grad_color"] >> grad_color S["underwear"] >> underwear S["undie_color"] >> undie_color S["undershirt"] >> undershirt @@ -868,6 +877,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age)) hair_color = sanitize_hexcolor(hair_color, 6, FALSE) facial_hair_color = sanitize_hexcolor(facial_hair_color, 6, FALSE) + grad_style = sanitize_inlist(grad_style, GLOB.hair_gradients_list, "None") + grad_color = sanitize_hexcolor(grad_color, 6, FALSE) eye_type = sanitize_inlist(eye_type, GLOB.eye_types, DEFAULT_EYES_TYPE) left_eye_color = sanitize_hexcolor(left_eye_color, 6, FALSE) right_eye_color = sanitize_hexcolor(right_eye_color, 6, FALSE) @@ -1037,6 +1048,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["skin_tone"] , skin_tone) WRITE_FILE(S["hair_style_name"] , hair_style) WRITE_FILE(S["facial_style_name"] , facial_hair_style) + WRITE_FILE(S["grad_style"] , grad_style) + WRITE_FILE(S["grad_color"] , grad_color) WRITE_FILE(S["underwear"] , underwear) WRITE_FILE(S["undie_color"] , undie_color) WRITE_FILE(S["undershirt"] , undershirt) diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index cae9a54484..453c22e7f2 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -207,6 +207,10 @@ message_admins("[key_name(src)] (job: [src.job ? "[src.job]" : "None"]) [is_special_character(src) ? "(ANTAG!) " : ""][ghosting ? "ghosted" : "committed suicide"] at [AREACOORD(src)].") /mob/living/proc/canSuicide() + var/area/A = get_area(src) + if(A.area_flags & BLOCK_SUICIDE) + to_chat(src, span_warning("You can't commit suicide here! You can ghost if you'd like.")) + return FALSE if(!CONFIG_GET(flag/suicide_allowed)) to_chat(src, "Suicide is not enabled in the config.") return FALSE @@ -214,11 +218,11 @@ if(CONSCIOUS) return TRUE if(SOFT_CRIT) - to_chat(src, "You can't commit suicide while in a critical condition!") + to_chat(src, span_warning("You can't commit suicide while in a critical condition!")) if(UNCONSCIOUS) - to_chat(src, "You need to be conscious to commit suicide!") + to_chat(src, span_warning("You need to be conscious to commit suicide!")) if(DEAD) - to_chat(src, "You're already dead!") + to_chat(src, span_warning("You're already dead!")) return /mob/living/carbon/canSuicide() diff --git a/code/modules/clothing/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/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 354d488703..35cb2fa1e5 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -446,6 +446,42 @@ icon_state = "flannel_brown" item_state = "flannel_brown" +/obj/item/clothing/suit/jacket/purplehoodie + name = "purple hoodie" + desc = "A soft purple hoodie with a TailorCo brand on the tag." + icon_state = "purplehoodie" + item_state = "purplehoodie" + +/obj/item/clothing/suit/jacket/bluehoodie + name = "blue hoodie" + desc = "A soft blue hoodie with a TailorCo brand on the tag." + icon_state = "bluehoodie" + item_state = "bluehoodie" + +/obj/item/clothing/suit/jacket/heartcoat + name = "heart coat" + desc = "A soft winter coat with a TailorCo brand on the tag." + icon_state = "heartcoat" + item_state = "heartcoat" + +/obj/item/clothing/suit/jacket/gothiccoat + name = "long black jacket" + desc = "A rugged looking coat with a TailorCo brand on the tag." + icon_state = "gothic_coat" + item_state = "gothic_coat" + +/obj/item/clothing/suit/jacket/gothicshirt + name = "black shirt with cuffs" + desc = "A black shirt with a collar and cuffs in a gothic style. A TailorCo brand is listed on the tag." + icon_state = "gothic_shirt" + item_state = "gothic_shirt" + +/obj/item/clothing/suit/jacket/gothicshirtcross + name = "elegant black shirt" + desc = "A black shirt with finely woven cross on the back. A TailorCo brand is listed on the tag." + icon_state = "gothic_shirtcross" + item_state = "gothic_shirtcross" + /obj/item/clothing/suit/jacket/leather name = "leather jacket" desc = "Pompadour not included." diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 4e29483846..78708f54bb 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -6,6 +6,7 @@ var/hoodtype = /obj/item/clothing/head/hooded/winterhood //so the chaplain hoodie or other hoodies can override this ///Alternative mode for hiding the hood, instead of storing the hood in the suit it qdels it, useful for when you deal with hooded suit with storage. var/alternative_mode = FALSE + var/no_t //do not update sprites when pulling up hood so we can avoid oddities with certain mechanics /obj/item/clothing/suit/hooded/Initialize() . = ..() @@ -51,6 +52,8 @@ update_icon() /obj/item/clothing/suit/hooded/update_icon_state() + if(no_t) + return icon_state = "[initial(icon_state)]" if(ishuman(hood?.loc)) var/mob/living/carbon/human/H = hood.loc diff --git a/code/modules/clothing/under/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/events/cat_surgeon.dm b/code/modules/events/cat_surgeon.dm index 2d5651b9b1..76c72a7ec2 100644 --- a/code/modules/events/cat_surgeon.dm +++ b/code/modules/events/cat_surgeon.dm @@ -10,8 +10,28 @@ /datum/round_event/cat_surgeon/start() var/list/spawn_locs = list() + var/list/unsafe_spawn_locs = list() for(var/X in GLOB.xeno_spawn) - spawn_locs += X + if(!isfloorturf(X)) + unsafe_spawn_locs += X + continue + var/turf/open/floor/F = X + var/datum/gas_mixture/A = F.air + var/oxy_moles = A.get_moles(GAS_O2) + if((oxy_moles < 16 || oxy_moles > 50) || A.get_moles(GAS_PLASMA) || A.get_moles(GAS_CO2) >= 10) + unsafe_spawn_locs += F + continue + if((A.return_temperature() <= 270) || (A.return_temperature() >= 360)) + unsafe_spawn_locs += F + continue + var/pressure = A.return_pressure() + if((pressure <= 20) || (pressure >= 550)) + unsafe_spawn_locs += F + continue + spawn_locs += F + + if(!spawn_locs.len) + spawn_locs += unsafe_spawn_locs if(!spawn_locs.len) message_admins("No valid spawn locations found, aborting...") diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm index dc0b07b464..0801e38507 100644 --- a/code/modules/events/mass_hallucination.dm +++ b/code/modules/events/mass_hallucination.dm @@ -9,7 +9,7 @@ /datum/round_event_control/mass_hallucination/admin_setup() if(!check_rights(R_FUN)) return - + forced_hallucination = input(usr, "Choose the hallucination to apply","Send Hallucination") as null|anything in subtypesof(/datum/hallucination) /datum/round_event/mass_hallucination @@ -26,7 +26,7 @@ switch(rand(1,4)) if(1) //same sound for everyone - var/sound = pick("airlock","airlock_pry","console","explosion","far_explosion","mech","glass","alarm","beepsky","mech","wall_decon","door_hack","tesla") + var/sound = pick("airlock","airlock_pry","console","explosion","far_explosion","mech","glass","alarm","beepsky","mech","wall_decon","door_hack","tesla","seth") for(var/mob/living/carbon/C in GLOB.alive_mob_list) new /datum/hallucination/sounds(C, TRUE, sound) if(2) diff --git a/code/modules/events/supermatter_surge.dm b/code/modules/events/supermatter_surge.dm index 6b0a093440..78b5c9e70c 100644 --- a/code/modules/events/supermatter_surge.dm +++ b/code/modules/events/supermatter_surge.dm @@ -27,13 +27,27 @@ if(prob(low_threat_perc)) severity = "low; the supermatter should return to normal operation shortly." else - severity = "medium; the supermatter should return to normal operation, but check NT CIMS to ensure this." + severity = "medium; the supermatter should return to normal operation, but regardless, check if the emitters may need to be turned off temporarily." else - severity = "high; if the supermatter's cooling is not fortified, coolant may need to be added." + severity = "high; the emitters likely need to be turned off, and if the supermatter's cooling loop is not fortified, pre-cooled gas may need to be added." if(100000 to INFINITY) - severity = "extreme; emergency action is likely to be required even if coolant loop is fine." + severity = "extreme; emergency action is likely to be required even if coolant loop is fine. Turn off the emitters and make sure the loop is properly cooling gases." if(power > 20000 || prob(round(power/200))) priority_announce("Supermatter surge detected. Estimated severity is [severity]", "Anomaly Alert") /datum/round_event/supermatter_surge/start() - GLOB.main_supermatter_engine.matter_power += power + var/obj/machinery/power/supermatter_crystal/supermatter = GLOB.main_supermatter_engine + var/power_proportion = supermatter.powerloss_inhibitor/2 // what % of the power goes into matter power, at most 50% + // we reduce the proportion that goes into actual matter power based on powerloss inhibitor + // primarily so the supermatter doesn't tesla the instant these happen + supermatter.matter_power += power * power_proportion + var/datum/gas_mixture/methane_puff = new + var/selected_gas = pick(4;GAS_CO2, 10;GAS_METHANE, 4;GAS_H2O, 1;GAS_BZ, 1;GAS_METHYL_BROMIDE) + methane_puff.set_moles(selected_gas, 500) + methane_puff.set_temperature(500) + var/energy_ratio = (power * 500 * (1-power_proportion)) / methane_puff.thermal_energy() + if(energy_ratio < 1) // energy output we want is lower than current energy, reduce the amount of gas we puff out + methane_puff.set_moles(GAS_METHANE, energy_ratio * 500) + else // energy output we want is higher than current energy, increase its actual heat + methane_puff.set_temperature(energy_ratio * 500) + supermatter.assume_air(methane_puff) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index adbf48470d..5d84901e7f 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -778,7 +778,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( ..() var/turf/source = random_far_turf() if(!sound_type) - sound_type = pick("airlock","airlock pry","console","flash","explosion","far explosion","mech","glass","alarm","beepsky","mech","wall decon","door hack") + sound_type = pick("airlock","airlock pry","console","flash","explosion","far explosion","mech","glass","alarm","beepsky","mech","wall decon","door hack","seth") feedback_details += "Type: [sound_type]" //Strange audio switch(sound_type) @@ -827,6 +827,9 @@ GLOBAL_LIST_INIT(hallucination_list, list( target.playsound_local(source, 'sound/items/screwdriver.ogg', 50, 1) sleep(rand(40,80)) target.playsound_local(source, 'sound/machines/airlockforced.ogg', 30, 1) + //funny announcement man + if("seth") + target.playsound_local(source,'sound/misc/seth.ogg', 50, 1) qdel(src) /datum/hallucination/weird_sounds 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) "
@@ -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/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm
index 9c82cf34d3..38e4fcc6ff 100644
--- a/code/modules/hydroponics/grown/towercap.dm
+++ b/code/modules/hydroponics/grown/towercap.dm
@@ -226,7 +226,7 @@
var/turf/open/O = loc
if(O.air)
var/datum/gas_mixture/loc_air = O.air
- if(loc_air.get_moles(GAS_O2) > 13)
+ if(loc_air.get_moles(GAS_O2) > 3)
return TRUE
return FALSE
diff --git a/code/modules/integrated_electronics/subtypes/access.dm b/code/modules/integrated_electronics/subtypes/access.dm
index 5e03ea1394..ddfed3753b 100644
--- a/code/modules/integrated_electronics/subtypes/access.dm
+++ b/code/modules/integrated_electronics/subtypes/access.dm
@@ -8,7 +8,6 @@
outputs = list(
"registered name" = IC_PINTYPE_STRING,
"assignment" = IC_PINTYPE_STRING,
- "passkey" = IC_PINTYPE_STRING
)
activators = list(
"on read" = IC_PINTYPE_PULSE_OUT
@@ -17,7 +16,6 @@
/obj/item/integrated_circuit/input/card_reader/attackby_react(obj/item/I, mob/living/user, intent)
var/obj/item/card/id/card = I.GetID()
var/list/access = I.GetAccess()
- var/passkey = strtohex(XorEncrypt(json_encode(access), SScircuit.cipherkey))
if(assembly)
assembly.access_card.access |= access
@@ -33,8 +31,6 @@
else
return FALSE
- set_pin_data(IC_OUTPUT, 3, passkey)
-
push_data()
activate_pin(1)
return TRUE
diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm
index 06e1863bc9..35a89b46db 100644
--- a/code/modules/jobs/access.dm
+++ b/code/modules/jobs/access.dm
@@ -355,7 +355,7 @@
return list("Assistant", "Captain", "Head of Personnel", "Bartender", "Cook", "Botanist", "Quartermaster", "Cargo Technician",
"Shaft Miner", "Clown", "Mime", "Janitor", "Curator", "Lawyer", "Chaplain", "Chief Engineer", "Station Engineer",
"Atmospheric Technician", "Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist", "Paramedic",
- "Research Director", "Scientist", "Roboticist", "Head of Security", "Warden", "Detective", "Security Officer")
+ "Research Director", "Scientist", "Roboticist", "Head of Security", "Warden", "Detective", "Security Officer", "Prisoner")
/proc/get_all_job_icons() //For all existing HUD icons
return get_all_jobs() + list("Prisoner")
diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm
index bff56d1d16..de66c32138 100644
--- a/code/modules/jobs/job_types/atmospheric_technician.dm
+++ b/code/modules/jobs/job_types/atmospheric_technician.dm
@@ -39,7 +39,7 @@
backpack = /obj/item/storage/backpack/industrial
satchel = /obj/item/storage/backpack/satchel/eng
duffelbag = /obj/item/storage/backpack/duffelbag/engineering
- box = /obj/item/storage/box/engineer
+ box = /obj/item/storage/box/survival/engineer
pda_slot = SLOT_L_STORE
backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1)
diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm
index 902be0bdc8..804952dbb2 100644
--- a/code/modules/jobs/job_types/chief_engineer.dm
+++ b/code/modules/jobs/job_types/chief_engineer.dm
@@ -54,7 +54,7 @@
backpack = /obj/item/storage/backpack/industrial
satchel = /obj/item/storage/backpack/satchel/eng
duffelbag = /obj/item/storage/backpack/duffelbag/engineering
- box = /obj/item/storage/box/engineer
+ box = /obj/item/storage/box/survival/engineer
pda_slot = SLOT_L_STORE
chameleon_extras = /obj/item/stamp/ce
diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm
index c772a8acae..d612b6a56d 100644
--- a/code/modules/jobs/job_types/head_of_security.dm
+++ b/code/modules/jobs/job_types/head_of_security.dm
@@ -58,7 +58,7 @@
backpack = /obj/item/storage/backpack/security
satchel = /obj/item/storage/backpack/satchel/sec
duffelbag = /obj/item/storage/backpack/duffelbag/sec
- box = /obj/item/storage/box/security
+ box = /obj/item/storage/box/survival/security
implants = list(/obj/item/implant/mindshield)
diff --git a/code/modules/jobs/job_types/prisoner.dm b/code/modules/jobs/job_types/prisoner.dm
new file mode 100644
index 0000000000..2ad2f32537
--- /dev/null
+++ b/code/modules/jobs/job_types/prisoner.dm
@@ -0,0 +1,24 @@
+datum/job/prisoner
+ title = "Prisoner"
+ flag = PRISONER
+ department_head = list("The Security Team")
+ department_flag = CIVILIAN
+ faction = "Station"
+ total_positions = 0
+ spawn_positions = 2
+ supervisors = "the security team"
+
+ outfit = /datum/outfit/job/prisoner
+ plasma_outfit = /datum/outfit/plasmaman/prisoner
+
+ display_order = JOB_DISPLAY_ORDER_PRISONER
+
+/datum/outfit/job/prisoner
+ name = "Prisoner"
+ jobtype = /datum/job/prisoner
+
+ uniform = /obj/item/clothing/under/rank/prisoner
+ shoes = /obj/item/clothing/shoes/sneakers/orange
+ id = /obj/item/card/id/prisoner
+ ears = /obj/item/radio/headset/headset_prisoner
+ belt = null
diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm
index bdae7fe028..3462fb96c9 100644
--- a/code/modules/jobs/job_types/security_officer.dm
+++ b/code/modules/jobs/job_types/security_officer.dm
@@ -133,7 +133,7 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S
backpack = /obj/item/storage/backpack/security
satchel = /obj/item/storage/backpack/satchel/sec
duffelbag = /obj/item/storage/backpack/duffelbag/sec
- box = /obj/item/storage/box/security
+ box = /obj/item/storage/box/survival/security
implants = list(/obj/item/implant/mindshield)
diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm
index 04d3fb53b8..0c04380afe 100644
--- a/code/modules/jobs/job_types/shaft_miner.dm
+++ b/code/modules/jobs/job_types/shaft_miner.dm
@@ -45,7 +45,7 @@
backpack = /obj/item/storage/backpack/explorer
satchel = /obj/item/storage/backpack/satchel/explorer
duffelbag = /obj/item/storage/backpack/duffelbag
- box = /obj/item/storage/box/survival_mining
+ box = /obj/item/storage/box/survival/mining
chameleon_extras = /obj/item/gun/energy/kinetic_accelerator
diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm
index 2396728ad8..25bd2196a0 100644
--- a/code/modules/jobs/job_types/station_engineer.dm
+++ b/code/modules/jobs/job_types/station_engineer.dm
@@ -42,7 +42,7 @@
backpack = /obj/item/storage/backpack/industrial
satchel = /obj/item/storage/backpack/satchel/eng
duffelbag = /obj/item/storage/backpack/duffelbag/engineering
- box = /obj/item/storage/box/engineer
+ box = /obj/item/storage/box/survival/engineer
pda_slot = SLOT_L_STORE
backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1)
diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm
index dae3094ebe..074ccac09f 100644
--- a/code/modules/jobs/job_types/warden.dm
+++ b/code/modules/jobs/job_types/warden.dm
@@ -54,7 +54,7 @@
backpack = /obj/item/storage/backpack/security
satchel = /obj/item/storage/backpack/satchel/sec
duffelbag = /obj/item/storage/backpack/duffelbag/sec
- box = /obj/item/storage/box/security
+ box = /obj/item/storage/box/survival/security
implants = list(/obj/item/implant/mindshield)
diff --git a/code/modules/jobs/jobs.dm b/code/modules/jobs/jobs.dm
index 78b7dd3964..d91b102599 100644
--- a/code/modules/jobs/jobs.dm
+++ b/code/modules/jobs/jobs.dm
@@ -43,6 +43,7 @@ GLOBAL_LIST_INIT(civilian_positions, list(
"Chaplain",
"Clown",
"Mime",
+ "Prisoner",
"Assistant"))
GLOBAL_LIST_INIT(security_positions, list(
diff --git a/code/modules/mafia/_defines.dm b/code/modules/mafia/_defines.dm
index 194851beed..6c0c73e0d0 100644
--- a/code/modules/mafia/_defines.dm
+++ b/code/modules/mafia/_defines.dm
@@ -6,14 +6,16 @@
#define MAFIA_TEAM_SOLO "solo"
//types of town roles for random setup gen
-/// assistants it's just assistants filling up the rest of the roles
+/// Add this if you don't want a role to be a choice in the selection
#define TOWN_OVERFLOW "overflow"
/// roles that learn info about others in the game (chaplain, detective, psych)
#define TOWN_INVEST "invest"
-/// roles that keep other roles safe (doctor, and weirdly enough lawyer counts)
+/// roles that keep other roles safe (doctor, sec officer, and weirdly enough lawyer counts)
#define TOWN_PROTECT "protect"
+/// roles that are only there to kill bad guys.
+#define TOWN_KILLING "killing"
/// roles that don't fit into anything else (hop)
-#define TOWN_MISC "misc"
+#define TOWN_SUPPORT "support"
//other types (mafia team, neutrals)
/// normal vote kill changelings
@@ -25,6 +27,20 @@
/// role that upsets the game aka obsessed, usually worse for town than mafia but they can vote against mafia
#define NEUTRAL_DISRUPT "disrupt"
+//role flags (special status of roles like detection immune)
+///to all forms of detection, shows themselves as an assistant.
+#define ROLE_UNDETECTABLE (1<<0)
+///has the ability to kill at night and thus, blocks the game from ending with other teams alive.
+#define ROLE_CAN_KILL (1<<1)
+///can only be one in a randomly generated game
+#define ROLE_UNIQUE (1<<2)
+///role is public to all other players in the game.
+#define ROLE_REVEALED (1<<3)
+///can not be defended, protected, or any other form of protection. all kills succeed no matter what.
+#define ROLE_VULNERABLE (1<<4)
+///cannot perform any actions that night, preselected actions fail
+#define ROLE_ROLEBLOCKED (1<<5)
+
#define MAFIA_PHASE_SETUP 1
#define MAFIA_PHASE_DAY 2
#define MAFIA_PHASE_VOTING 3
@@ -35,12 +51,12 @@
#define MAFIA_ALIVE 1
#define MAFIA_DEAD 2
+#define COMSIG_MAFIA_ON_VISIT "mafia_onvisit"
+#define MAFIA_VISIT_INTERRUPTED 1
+
#define COMSIG_MAFIA_ON_KILL "mafia_onkill"
#define MAFIA_PREVENT_KILL 1
-#define COMSIG_MAFIA_CAN_PERFORM_ACTION "mafia_can_perform_action"
-#define MAFIA_PREVENT_ACTION 1
-
//in order of events + game end
/// when the shutters fall, before the 45 second wait and night event resolution
diff --git a/code/modules/mafia/controller.dm b/code/modules/mafia/controller.dm
index 54dcaebeec..43d15ebffe 100644
--- a/code/modules/mafia/controller.dm
+++ b/code/modules/mafia/controller.dm
@@ -15,6 +15,8 @@
var/phase = MAFIA_PHASE_SETUP
///how long the game has gone on for, changes with every sunrise. day one, night one, day two, etc.
var/turn = 0
+ ///if enabled, the game has fallen under half pop and is sped up
+ var/speed_up = FALSE
///for debugging and testing a full game, or adminbuse. If this is not empty, it will use this as a setup. clears when game is over
var/list/custom_setup = list()
///first day has no voting, and thus is shorter
@@ -187,8 +189,22 @@
turn += 1
phase = MAFIA_PHASE_DAY
if(!check_victory())
+ if(!speed_up)//lets check if the game should be sped up, if not already.
+ var/living_players = 0
+ for(var/i in all_roles)
+ var/datum/mafia_role/player = i
+ if(player.game_status == MAFIA_ALIVE)
+ living_players += 1
+ if(living_players < all_roles.len / 2)
+ speed_up = TRUE
+ send_message("With only [living_players] living players left, the game timers have been sped up.")
+ day_phase_period /= 2
+ voting_phase_period /= 2
+ judgement_phase_period /= 2
+ judgement_lynch_period /= 2
+ night_phase_period /= 2
if(turn == 1)
- send_message("The selected map is [current_map.name]![current_map.description]")
+ send_message(span_notice("The selected map is [current_map.name]![current_map.description]"))
send_message("Day [turn] started! There is no voting on the first day. Say hello to everybody!")
next_phase_timer = addtimer(CALLBACK(src,.proc/check_trial, FALSE),first_day_phase_period,TIMER_STOPPABLE) //no voting period = no votes = instant night
else
@@ -257,19 +273,19 @@
/datum/mafia_controller/proc/lynch()
for(var/i in judgement_innocent_votes)
var/datum/mafia_role/role = i
- send_message("[role.body.real_name] voted innocent.")
+ send_message(span_green("[role.body.real_name] voted innocent."))
for(var/ii in judgement_abstain_votes)
var/datum/mafia_role/role = ii
- send_message("[role.body.real_name] abstained.")
+ send_message(span_comradio("[role.body.real_name] abstained."))
for(var/iii in judgement_guilty_votes)
var/datum/mafia_role/role = iii
- send_message("[role.body.real_name] voted guilty.")
+ send_message(span_red("[role.body.real_name] voted guilty."))
if(judgement_guilty_votes.len > judgement_innocent_votes.len) //strictly need majority guilty to lynch
- send_message("Guilty wins majority, [on_trial.body.real_name] has been lynched.")
- on_trial.kill(src, lynch = TRUE)
+ send_message(span_red("Guilty wins majority, [on_trial.body.real_name] has been lynched."))
+ on_trial.kill(src,lynch = TRUE)
addtimer(CALLBACK(src, .proc/send_home, on_trial),judgement_lynch_period)
else
- send_message("Innocent wins majority, [on_trial.body.real_name] has been spared.")
+ send_message(span_green("Innocent wins majority, [on_trial.body.real_name] has been spared."))
on_trial.body.forceMove(get_turf(on_trial.assigned_landmark))
on_trial = null
//day votes are already cleared, so this will skip the trial and check victory/lockdown/whatever else
@@ -300,11 +316,14 @@
var/list/total_town = list()
var/list/total_mafia = list()
- var/alive_town = 0
+ //voting power of town + solos (since they don't want mafia to overpower)
+ var/anti_mafia_power = 0
+ //voting power of mafia (greater than anti mafia power + team end not blocked = mafia victory)
var/alive_mafia = 0
var/list/solos_to_ask = list() //need to ask after because first round is counting team sizes
var/list/total_victors = list() //if this list gets filled with anyone, they win. list because side antags can with with people
var/blocked_victory = FALSE //if a solo antagonist is stopping the town or mafia from finishing the game.
+ var/town_can_kill = FALSE //Town has a killing role and it cannot allow mafia to win
///PHASE ONE: TALLY UP ALL NUMBERS OF PEOPLE STILL ALIVE
@@ -313,23 +332,24 @@
if(MAFIA_TEAM_MAFIA)
total_mafia += R
if(R.game_status == MAFIA_ALIVE)
- alive_mafia += R.vote_power
+ alive_mafia += R.vote_potential
if(MAFIA_TEAM_TOWN)
total_town += R
if(R.game_status == MAFIA_ALIVE)
- alive_town += R.vote_power
+ anti_mafia_power += R.vote_potential
+ if(R.role_flags & ROLE_CAN_KILL) //the game cannot autoresolve with killing roles (unless a solo wins anyways, like traitors who are immune)
+ town_can_kill = TRUE
if(MAFIA_TEAM_SOLO)
if(R.game_status == MAFIA_ALIVE)
- if(R.solo_counts_as_town)
- alive_town += R.vote_power
+ anti_mafia_power += R.vote_potential
solos_to_ask += R
///PHASE TWO: SEND STATS TO SOLO ANTAGS, SEE IF THEY WON OR TEAMS CANNOT WIN
for(var/datum/mafia_role/solo in solos_to_ask)
- if(solo.check_total_victory(alive_town, alive_mafia))
+ if(solo.check_total_victory(anti_mafia_power, alive_mafia))
total_victors += solo
- if(solo.block_team_victory(alive_town, alive_mafia))
+ if(solo.block_team_victory(anti_mafia_power, alive_mafia))
blocked_victory = TRUE
//solo victories!
@@ -348,7 +368,7 @@
award_role(townie.winner_award, townie)
start_the_end("!! TOWN VICTORY !!")
return TRUE
- else if(alive_mafia >= alive_town) //guess could change if town nightkill is added
+ else if(alive_mafia >= anti_mafia_power && !town_can_kill)
start_the_end("!! MAFIA VICTORY !!")
for(var/datum/mafia_role/changeling in total_mafia)
award_role(changeling.winner_award, changeling)
@@ -396,6 +416,13 @@
custom_setup = list()
turn = 0
votes = list()
+
+ day_phase_period = initial(day_phase_period)
+ voting_phase_period = initial(voting_phase_period)
+ judgement_phase_period = initial(judgement_phase_period)
+ judgement_lynch_period = initial(judgement_lynch_period)
+ night_phase_period = initial(night_phase_period)
+
//map gen does not deal with landmarks
QDEL_LIST(landmarks)
QDEL_NULL(town_center_landmark)
@@ -451,14 +478,15 @@
SEND_SIGNAL(src,COMSIG_MAFIA_NIGHT_START)
SEND_SIGNAL(src,COMSIG_MAFIA_NIGHT_ACTION_PHASE)
//resolve mafia kill, todo unsnowflake this
- var/datum/mafia_role/R = get_vote_winner("Mafia")
- if(R)
+ var/datum/mafia_role/victim = get_vote_winner("Mafia")
+ if(victim)
var/datum/mafia_role/killer = get_random_voter("Mafia")
- if(SEND_SIGNAL(killer,COMSIG_MAFIA_CAN_PERFORM_ACTION,src,"mafia killing",R) & MAFIA_PREVENT_ACTION)
- send_message("[killer.body.real_name] was unable to attack [R.body.real_name] tonight!",MAFIA_TEAM_MAFIA)
+ if(!victim.can_action(src, killer, "changeling murder"))
+ send_message(span_danger("[killer.body.real_name] was unable to attack [victim.body.real_name] tonight!"),MAFIA_TEAM_MAFIA)
else
- send_message("[killer.body.real_name] has attacked [R.body.real_name]!",MAFIA_TEAM_MAFIA)
- R.kill(src)
+ send_message(span_danger("[killer.body.real_name] has attacked [victim.body.real_name]!"),MAFIA_TEAM_MAFIA)
+ if(victim.kill(src,killer,lynch=FALSE))
+ to_chat(victim.body, span_userdanger("You have been killed by a Changeling!"))
reset_votes("Mafia")
SEND_SIGNAL(src,COMSIG_MAFIA_NIGHT_KILL_PHASE)
SEND_SIGNAL(src,COMSIG_MAFIA_NIGHT_END)
@@ -485,14 +513,14 @@
else
votes[vote_type][voter] = target
if(old_vote && old_vote == target)
- send_message("[voter.body.real_name] retracts their vote for [target.body.real_name]!", team = teams)
+ send_message(span_notice("[voter.body.real_name] retracts their vote for [target.body.real_name]!"), team = teams)
else
- send_message("[voter.body.real_name] voted for [target.body.real_name]!",team = teams)
+ send_message(span_notice("[voter.body.real_name] voted for [target.body.real_name]!"),team = teams)
if(!teams)
- target.body.update_icon() //Update the vote display if it's a public vote
+ target.body.update_appearance() //Update the vote display if it's a public vote
var/datum/mafia_role/old = old_vote
if(old)
- old.body.update_icon()
+ old.body.update_appearance()
/**
* Clears out the votes of a certain type (day votes, mafia kill votes) while leaving others untouched
@@ -504,7 +532,7 @@
bodies_to_update += R.body
votes[vote_type] = list()
for(var/mob/M in bodies_to_update)
- M.update_icon()
+ M.update_appearance()
/**
* Returns how many people voted for the role, in whatever vote (day vote, night kill vote)
@@ -571,6 +599,9 @@
/datum/mafia_controller/proc/create_bodies()
for(var/datum/mafia_role/role in all_roles)
var/mob/living/carbon/human/H = new(get_turf(role.assigned_landmark))
+ ADD_TRAIT(H, TRAIT_NOFIRE, MAFIA_TRAIT)
+ ADD_TRAIT(H, TRAIT_NOBREATH, MAFIA_TRAIT)
+ // ADD_TRAIT(H, TRAIT_CANNOT_CRYSTALIZE, MAFIA_TRAIT) freon tomfoolery
H.equipOutfit(player_outfit)
H.status_flags |= GODMODE
RegisterSignal(H,COMSIG_ATOM_UPDATE_OVERLAYS,.proc/display_votes)
@@ -707,6 +738,7 @@
if(role_count > 0)
debug_setup[found_path] = role_count
custom_setup = debug_setup
+ try_autostart()//don't worry, this fails if there's a game in progress
if("cancel_setup")
custom_setup = list()
switch(action) //both living and dead
@@ -723,28 +755,28 @@
switch(action)
if("mf_signup")
if(!SSticker.HasRoundStarted())
- to_chat(usr, "Wait for the round to start.")
+ to_chat(usr, span_warning("Wait for the round to start."))
return
if(GLOB.mafia_signup[C.ckey])
GLOB.mafia_signup -= C.ckey
- to_chat(usr, "You unregister from Mafia.")
+ to_chat(usr, span_notice("You unregister from Mafia."))
return TRUE
else
GLOB.mafia_signup[C.ckey] = C
- to_chat(usr, "You sign up for Mafia.")
+ to_chat(usr, span_notice("You sign up for Mafia."))
if(phase == MAFIA_PHASE_SETUP)
check_signups()
try_autostart()
return TRUE
if("mf_spectate")
if(C.ckey in spectators)
- to_chat(usr, "You will no longer get messages from the game.")
+ to_chat(usr, span_notice("You will no longer get messages from the game."))
spectators -= C.ckey
else
- to_chat(usr, "You will now get messages from the game.")
+ to_chat(usr, span_notice("You will now get messages from the game."))
spectators += C.ckey
return TRUE
- if(user_role.game_status == MAFIA_DEAD)
+ if(user_role && user_role.game_status == MAFIA_DEAD)
return
//User actions (just living)
switch(action)
@@ -814,58 +846,59 @@
. += L[key]
/**
- * Returns a semirandom setup, with...
- * Town, Two invest roles, one protect role, sometimes a misc role, and the rest assistants for town.
- * Mafia, 2 normal mafia and one special.
- * Neutral, two disruption roles, sometimes one is a killing.
+ * Returns a semirandom setup with 12 roles. balance not guaranteed!
*
- * See _defines.dm in the mafia folder for a rundown on what these groups of roles include.
+ * please check the variables at the top of the proc to see how much of each role types it picks
*/
/datum/mafia_controller/proc/generate_random_setup()
var/invests_left = 2
- var/protects_left = 1
- var/miscs_left = prob(35)
+ var/protects_left = 2
+ var/killings_left = 1
+ var/supports_left = 2
+
var/mafiareg_left = 2
var/mafiaspe_left = 1
- var/killing_role = prob(50)
- var/disruptors = killing_role ? 1 : 2 //still required to calculate overflow
- var/overflow_left = max_player - (invests_left + protects_left + miscs_left + mafiareg_left + mafiaspe_left + killing_role + disruptors)
+
+ // if there is one killing role, there will be less disruptors
+ var/neutral_killing_role = prob(50)
var/list/random_setup = list()
+ var/list/unique_roles_added = list()
for(var/i in 1 to max_player) //should match the number of roles to add
- if(overflow_left)
- add_setup_role(random_setup, TOWN_OVERFLOW)
- overflow_left--
- else if(invests_left)
- add_setup_role(random_setup, TOWN_INVEST)
+ if(invests_left)
+ add_setup_role(random_setup, unique_roles_added, TOWN_INVEST)
invests_left--
else if(protects_left)
- add_setup_role(random_setup, TOWN_PROTECT)
+ add_setup_role(random_setup, unique_roles_added, TOWN_PROTECT)
protects_left--
- else if(miscs_left)
- add_setup_role(random_setup, TOWN_MISC)
- miscs_left--
+ else if(killings_left)
+ add_setup_role(random_setup, unique_roles_added, TOWN_KILLING)
+ killings_left--
+ else if(supports_left)
+ add_setup_role(random_setup, unique_roles_added, TOWN_SUPPORT)
+ supports_left--
else if(mafiareg_left)
- add_setup_role(random_setup, MAFIA_REGULAR)
+ add_setup_role(random_setup, unique_roles_added, MAFIA_REGULAR)
mafiareg_left--
else if(mafiaspe_left)
- add_setup_role(random_setup, MAFIA_SPECIAL)
+ add_setup_role(random_setup, unique_roles_added, MAFIA_SPECIAL)
mafiaspe_left--
- else if(killing_role)
- add_setup_role(random_setup, NEUTRAL_KILL)
- killing_role--
+ else if(neutral_killing_role)
+ add_setup_role(random_setup, unique_roles_added, NEUTRAL_KILL)
+ neutral_killing_role--
else
- add_setup_role(random_setup, NEUTRAL_DISRUPT)
+ add_setup_role(random_setup, unique_roles_added, NEUTRAL_DISRUPT)
+ debug = random_setup
return random_setup
/**
- * Helper proc that adds a random role of a type to a setup. if it doesn't exist in the setup, it adds the path to the list and otherwise bumps the path in the list up one
+ * Helper proc that adds a random role of a type to a setup. if it doesn't exist in the setup, it adds the path to the list and otherwise bumps the path in the list up one. unique roles can only get added once.
*/
-/datum/mafia_controller/proc/add_setup_role(setup_list, wanted_role_type)
+/datum/mafia_controller/proc/add_setup_role(setup_list, banned_roles, wanted_role_type)
var/list/role_type_paths = list()
for(var/path in typesof(/datum/mafia_role))
var/datum/mafia_role/instance = path
- if(initial(instance.role_type) == wanted_role_type)
+ if(initial(instance.role_type) == wanted_role_type && !(path in banned_roles))
role_type_paths += instance
var/mafia_path = pick(role_type_paths)
@@ -880,6 +913,8 @@
setup_list[found_role] += 1
return
setup_list[mafia_path] = 1
+ if(initial(mafia_path_type.role_flags) & ROLE_UNIQUE) //check to see if we should no longer consider this okay to add to the game
+ banned_roles += mafia_path
/**
* Called when enough players have signed up to fill a setup. DOESN'T NECESSARILY MEAN THE GAME WILL START.
@@ -893,6 +928,8 @@
var/list/setup = custom_setup
if(!setup.len)
req_players = max_player //MAFIA_MAX_PLAYER_COUNT
+ else if(low_pop_mode)
+ req_players = required_player
else
req_players = assoc_value_sum(setup)
@@ -909,10 +946,10 @@
GLOB.mafia_signup -= key //not valid to play when we checked so remove them from signups
//if there were not enough players, don't start. we already trimmed the list to now hold only valid signups
+
if(length(possible_keys) < req_players)
return
- else //hacky implementation of max players
- req_players = clamp(length(possible_keys), 1, max_player)
+ req_players = clamp(length(possible_keys), required_player, max_player)
//if there were too many players, still start but only make filtered keys as big as it needs to be (cut excess)
//also removes people who do get into final player list from the signup so they have to sign up again when game ends
@@ -923,8 +960,8 @@
//small message about not getting into this game for clarity on why they didn't get in
for(var/unpicked in possible_keys)
var/client/unpicked_client = GLOB.directory[unpicked]
- to_chat(unpicked_client, "Sorry, the starting mafia game has too many players and you were not picked.")
- to_chat(unpicked_client, "You're still signed up, getting messages from the current round, and have another chance to join when the one starting now finishes.")
+ to_chat(unpicked_client, span_danger("Sorry, the starting mafia game has too many players and you were not picked."))
+ to_chat(unpicked_client, span_warning("You're still signed up, getting messages from the current round, and have another chance to join when the one starting now finishes."))
if(!setup.len) //don't actually have one yet, so generate a max player random setup. it's good to do this here instead of above so it doesn't generate one every time a game could possibly start.
setup = generate_random_setup()
diff --git a/code/modules/mafia/map_pieces.dm b/code/modules/mafia/map_pieces.dm
index 3339c596b4..61b8e5dd3e 100644
--- a/code/modules/mafia/map_pieces.dm
+++ b/code/modules/mafia/map_pieces.dm
@@ -33,7 +33,7 @@
requires_power = FALSE
has_gravity = STANDARD_GRAVITY
flags_1 = NONE
- // block_suicide = TRUE
+ area_flags = BLOCK_SUICIDE | UNIQUE_AREA
/datum/map_template/mafia
var/description = ""
@@ -75,5 +75,5 @@
/datum/map_template/mafia/reebe
name = "Reebe"
- description = "Trouble in Reebe station! Copypaste guranteed by ClockCo™"
+ description = "Based of the place known as reebee. Syndicate spies have infiltrated and everyone has to find out who's who before they destroy the ark!"
mappath = "_maps/map_files/Mafia/mafia_reebe.dmm"
diff --git a/code/modules/mafia/outfits.dm b/code/modules/mafia/outfits.dm
index bbc72bd120..fad628e392 100644
--- a/code/modules/mafia/outfits.dm
+++ b/code/modules/mafia/outfits.dm
@@ -30,6 +30,11 @@
uniform = /obj/item/clothing/under/suit/black
shoes = /obj/item/clothing/shoes/laceup
+/datum/outfit/mafia/chaplain
+ name = "Mafia Chaplain"
+
+ uniform = /obj/item/clothing/under/rank/civilian/chaplain
+
/datum/outfit/mafia/md
name = "Mafia Medical Doctor"
@@ -37,10 +42,14 @@
shoes = /obj/item/clothing/shoes/sneakers/white
suit = /obj/item/clothing/suit/toggle/labcoat
-/datum/outfit/mafia/chaplain
- name = "Mafia Chaplain"
+/datum/outfit/mafia/security
+ name = "Mafia Security Officer"
- uniform = /obj/item/clothing/under/rank/civilian/chaplain
+ uniform = /obj/item/clothing/under/rank/security/officer
+ gloves = /obj/item/clothing/gloves/color/black
+ head = /obj/item/clothing/head/helmet/sec
+ suit = /obj/item/clothing/suit/armor/vest/alt
+ shoes = /obj/item/clothing/shoes/jackboots
/datum/outfit/mafia/lawyer
name = "Mafia Lawyer"
@@ -58,6 +67,26 @@
head = /obj/item/clothing/head/hopcap
glasses = /obj/item/clothing/glasses/sunglasses
+/datum/outfit/mafia/hos
+ name = "Mafia Head of Security"
+
+ uniform = /obj/item/clothing/under/rank/security/head_of_security
+ shoes = /obj/item/clothing/shoes/jackboots
+ suit = /obj/item/clothing/suit/armor/hos/trenchcoat
+ gloves = /obj/item/clothing/gloves/color/black
+ head = /obj/item/clothing/head/beret/sec
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+
+/datum/outfit/mafia/warden
+ name = "Mafia Warden"
+
+ uniform = /obj/item/clothing/under/rank/security/warden
+ shoes = /obj/item/clothing/shoes/jackboots
+ suit = /obj/item/clothing/suit/armor/vest/warden/alt
+ gloves = /obj/item/clothing/gloves/color/black
+ head = /obj/item/clothing/head/warden
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+
//mafia
/datum/outfit/mafia/changeling
diff --git a/code/modules/mafia/roles.dm b/code/modules/mafia/roles.dm
index a210c4994f..a48f890d10 100644
--- a/code/modules/mafia/roles.dm
+++ b/code/modules/mafia/roles.dm
@@ -10,19 +10,21 @@
var/mob/living/carbon/human/body
var/obj/effect/landmark/mafia/assigned_landmark
- ///how many votes submitted when you vote.
+ ///role flags (special status of roles like detection immune)
+ var/role_flags = NONE
+ ///how many votes submitted when you vote. used in voting, but not victory
var/vote_power = 1
- var/detect_immune = FALSE
- var/revealed = FALSE
- var/datum/outfit/revealed_outfit = /datum/outfit/mafia/assistant //the assistants need a special path to call out they were in fact assistant, everything else can just use job equipment
- //action = uses
+ ///how many votes your role COULD count for, now or later. used in checking victory
+ var/vote_potential = 1
+ ///what they get equipped with when they are revealed
+ var/datum/outfit/revealed_outfit = /datum/outfit/mafia/assistant
+ ///action = uses
var/list/actions = list()
var/list/targeted_actions = list()
- //what the role gets when it wins a game
+ ///what the role gets when it wins a game
var/winner_award = /datum/award/achievement/mafia/assistant
- //so mafia have to also kill them to have a majority
- var/solo_counts_as_town = FALSE //(don't set this for town)
+ ///so mafia have to also kill them to have a majority
var/game_status = MAFIA_ALIVE
///icon state in the mafia dmi of the hud of the role, used in the mafia ui
@@ -38,8 +40,30 @@
/datum/mafia_role/New(datum/mafia_controller/game)
. = ..()
-/datum/mafia_role/proc/kill(datum/mafia_controller/game,lynch=FALSE)
- if(SEND_SIGNAL(src,COMSIG_MAFIA_ON_KILL,game,lynch) & MAFIA_PREVENT_KILL)
+/**
+ * Tests if a visitor can actually perform an action on this role. Verbose on purpose!
+ *
+ * Will return false if: Your visit is roleblocked, they have perished, or your visit was interrupted
+ */
+/datum/mafia_role/proc/can_action(datum/mafia_controller/game, datum/mafia_role/visitor, action)
+ if(role_flags & ROLE_ROLEBLOCKED)
+ to_chat(visitor,span_danger("Your [action] was blocked!"))
+ return FALSE
+ if(game_status != MAFIA_ALIVE) //They're already dead
+ to_chat(visitor,span_danger("[body.real_name] perished before you could visit!"))
+ return FALSE
+ if(SEND_SIGNAL(src,COMSIG_MAFIA_ON_VISIT,game,visitor) & MAFIA_VISIT_INTERRUPTED) //visited a warden. something that prevents you by visiting that person
+ to_chat(visitor,span_danger("Your [action] was interrupted!"))
+ return FALSE
+ return TRUE
+
+/**
+ * Tests kill immunities, if nothing prevents the kill, kills this role.
+ *
+ * Does not count as visiting, see visit proc.
+ */
+/datum/mafia_role/proc/kill(datum/mafia_controller/game, datum/mafia_role/attacker, lynch=FALSE)
+ if(SEND_SIGNAL(src,COMSIG_MAFIA_ON_KILL,game,attacker,lynch) & MAFIA_PREVENT_KILL)
return FALSE
game_status = MAFIA_DEAD
body.death()
@@ -55,19 +79,19 @@
/datum/mafia_role/proc/greet()
SEND_SOUND(body, 'sound/ambience/ambifailure.ogg')
- to_chat(body,"You are the [name].")
- to_chat(body,"[desc]")
+ to_chat(body,span_danger("You are the [name]."))
+ to_chat(body,span_danger("[desc]"))
switch(team)
if(MAFIA_TEAM_MAFIA)
- to_chat(body,"You and your co-conspirators win if you outnumber crewmembers.")
+ to_chat(body,span_danger("You and your co-conspirators win if you outnumber crewmembers."))
if(MAFIA_TEAM_TOWN)
- to_chat(body,"You are a crewmember. Find out and lynch the changelings!")
+ to_chat(body,span_danger("You are a crewmember. Find out and lynch the changelings!"))
if(MAFIA_TEAM_SOLO)
- to_chat(body,"You are not aligned to town or mafia. Accomplish your own objectives!")
- to_chat(body, "Be sure to read the wiki page to learn more, if you have no idea what's going on.")
+ to_chat(body,span_danger("You are not aligned to town or mafia. Accomplish your own objectives!"))
+ to_chat(body, "Be sure to read the wiki page to learn more, if you have no idea what's going on.")
/datum/mafia_role/proc/reveal_role(datum/mafia_controller/game, verbose = FALSE)
- if(revealed)
+ if((role_flags & ROLE_REVEALED))
return
if(verbose)
game.send_message("It is revealed that the true role of [body] [game_status == MAFIA_ALIVE ? "is" : "was"] [name]!")
@@ -76,7 +100,7 @@
qdel(thing)
special_reveal_equip(game)
body.equipOutfit(revealed_outfit)
- revealed = TRUE
+ role_flags |= ROLE_REVEALED
/datum/mafia_role/proc/special_reveal_equip(datum/mafia_controller/game)
return
@@ -85,7 +109,7 @@
return
/datum/mafia_role/proc/validate_action_target(datum/mafia_controller/game,action,datum/mafia_role/target)
- if(SEND_SIGNAL(src,COMSIG_MAFIA_CAN_PERFORM_ACTION,game,action,target) & MAFIA_PREVENT_ACTION)
+ if((role_flags & ROLE_ROLEBLOCKED))
return FALSE
return TRUE
@@ -114,9 +138,9 @@
team_desc = "Nobody"
team_span = "comradio"
the = FALSE
- result += "The [name] is aligned with [the ? "the " : ""][team_desc]"
+ result += span_notice("The [span_bold("[name]")] is aligned with [the ? "the " : ""][team_desc]")
result += "\"[desc]\""
- result += "[name] wins when they [win_condition]"
+ result += span_notice("[name] wins when they [win_condition]")
to_chat(clueless, result.Join(""))
/datum/mafia_role/detective
@@ -145,35 +169,39 @@
/datum/mafia_role/detective/handle_action(datum/mafia_controller/game,action,datum/mafia_role/target)
if(!target || target.game_status != MAFIA_ALIVE)
- to_chat(body,"You can only investigate alive people.")
+ to_chat(body,span_warning("You can only investigate alive people."))
return
- to_chat(body,"You will investigate [target.body.real_name] tonight.")
+ to_chat(body,span_warning("You will investigate [target.body.real_name] tonight."))
current_investigation = target
/datum/mafia_role/detective/proc/investigate(datum/mafia_controller/game)
SIGNAL_HANDLER
+ if(!current_investigation)
+ return
+
var/datum/mafia_role/target = current_investigation
- if(target)
- if(target.detect_immune)
- to_chat(body,"Your investigations reveal that [target.body.real_name] is a true member of the station.")
- add_note("N[game.turn] - [target.body.real_name] - Town")
- else
- var/team_text
- var/fluff
- switch(target.team)
- if(MAFIA_TEAM_TOWN)
- team_text = "Town"
- fluff = "a true member of the station."
- if(MAFIA_TEAM_MAFIA)
- team_text = "Mafia"
- fluff = "an unfeeling, hideous changeling!"
- if(MAFIA_TEAM_SOLO)
- team_text = "Solo"
- fluff = "a rogue, with their own objectives..."
- to_chat(body,"Your investigations reveal that [target.body.real_name] is [fluff]")
- add_note("N[game.turn] - [target.body.real_name] - [team_text]")
current_investigation = null
+ if(!target.can_action(game, src, "investigation"))
+ return
+ if((target.role_flags & ROLE_UNDETECTABLE))
+ to_chat(body,span_warning("Your investigations reveal that [target.body.real_name] is a true member of the station."))
+ add_note("N[game.turn] - [target.body.real_name] - Town")
+ else
+ var/team_text
+ var/fluff
+ switch(target.team)
+ if(MAFIA_TEAM_TOWN)
+ team_text = "Town"
+ fluff = "a true member of the station."
+ if(MAFIA_TEAM_MAFIA)
+ team_text = "Mafia"
+ fluff = "an unfeeling, hideous changeling!"
+ if(MAFIA_TEAM_SOLO)
+ team_text = "Solo"
+ fluff = "a rogue, with their own objectives..."
+ to_chat(body,span_warning("Your investigations reveal that [target.body.real_name] is [fluff]"))
+ add_note("N[game.turn] - [target.body.real_name] - [team_text]")
/datum/mafia_role/psychologist
name = "Psychologist"
@@ -195,25 +223,27 @@
/datum/mafia_role/psychologist/validate_action_target(datum/mafia_controller/game, action, datum/mafia_role/target)
. = ..()
- if(!. || !can_use || game.phase == MAFIA_PHASE_NIGHT || target.game_status != MAFIA_ALIVE || target.revealed || target == src)
+ if(!. || !can_use || game.phase == MAFIA_PHASE_NIGHT || target.game_status != MAFIA_ALIVE || (target.role_flags & ROLE_REVEALED) || target == src)
return FALSE
/datum/mafia_role/psychologist/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target)
. = ..()
- to_chat(body,"You will reveal [target.body.real_name] tonight.")
+ to_chat(body,span_warning("You will reveal [target.body.real_name] tonight."))
current_target = target
/datum/mafia_role/psychologist/proc/therapy_reveal(datum/mafia_controller/game)
SIGNAL_HANDLER
- if(SEND_SIGNAL(src,COMSIG_MAFIA_CAN_PERFORM_ACTION,game,"reveal",current_target) & MAFIA_PREVENT_ACTION || game_status != MAFIA_ALIVE) //Got lynched or roleblocked by a lawyer.
- current_target = null
- if(current_target)
- add_note("N[game.turn] - [current_target.body.real_name] - Revealed true identity")
- to_chat(body,"You have revealed the true nature of the [current_target]!")
- current_target.reveal_role(game, verbose = TRUE)
- current_target = null
- can_use = FALSE
+ if(!current_target)
+ return
+ var/datum/mafia_role/target = current_target
+ current_target = null
+ if(!target.can_action(game, src, "role reveal"))
+ return
+ add_note("N[game.turn] - [target.body.real_name] - Revealed true identity")
+ to_chat(body,span_warning("You have revealed the true nature of the [target]!"))
+ target.reveal_role(game, verbose = TRUE)
+ can_use = FALSE
/datum/mafia_role/chaplain
name = "Chaplain"
@@ -225,7 +255,7 @@
winner_award = /datum/award/achievement/mafia/chaplain
targeted_actions = list("Pray")
- var/current_target
+ var/datum/mafia_role/current_target
/datum/mafia_role/chaplain/New(datum/mafia_controller/game)
. = ..()
@@ -235,25 +265,29 @@
. = ..()
if(!.)
return
- return game.phase == MAFIA_PHASE_NIGHT && target.game_status == MAFIA_DEAD && target != src && !target.revealed
+ return game.phase == MAFIA_PHASE_NIGHT && target.game_status == MAFIA_DEAD && target != src && !(target.role_flags & ROLE_REVEALED)
/datum/mafia_role/chaplain/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target)
- to_chat(body,"You will commune with the spirit of [target.body.real_name] tonight.")
+ to_chat(body,span_warning("You will commune with the spirit of [target.body.real_name] tonight."))
current_target = target
/datum/mafia_role/chaplain/proc/commune(datum/mafia_controller/game)
SIGNAL_HANDLER
+ if(!current_target)
+ return
var/datum/mafia_role/target = current_target
+ current_target = null
+ if(!target.can_action(game, src, "communion"))
+ return
if(target)
- to_chat(body,"You invoke spirit of [target.body.real_name] and learn their role was [target.name].")
+ to_chat(body,span_warning("You invoke spirit of [target.body.real_name] and learn their role was [target.name]."))
add_note("N[game.turn] - [target.body.real_name] - [target.name]")
- current_target = null
/datum/mafia_role/md
name = "Medical Doctor"
desc = "You can protect a single person each night from killing."
- revealed_outfit = /datum/outfit/mafia/md // /mafia <- outfit must be readded (just make a new mafia outfits file for all of these)
+ revealed_outfit = /datum/outfit/mafia/md
role_type = TOWN_PROTECT
hud_icon = "hudmedicaldoctor"
revealed_icon = "medicaldoctor"
@@ -271,29 +305,38 @@
. = ..()
if(!.)
return
- if(target.name == "Head of Personnel" && target.revealed)
+ if((target.role_flags & ROLE_VULNERABLE) && (target.role_flags & ROLE_REVEALED)) //do not give the option to protect roles that your protection will fail on
return FALSE
return game.phase == MAFIA_PHASE_NIGHT && target.game_status == MAFIA_ALIVE && target != src
/datum/mafia_role/md/handle_action(datum/mafia_controller/game,action,datum/mafia_role/target)
if(!target || target.game_status != MAFIA_ALIVE)
- to_chat(body,"You can only protect alive people.")
+ to_chat(body,span_warning("You can only protect alive people."))
return
- to_chat(body,"You will protect [target.body.real_name] tonight.")
+ to_chat(body,span_warning("You will protect [target.body.real_name] tonight."))
current_protected = target
/datum/mafia_role/md/proc/protect(datum/mafia_controller/game)
SIGNAL_HANDLER
- if(current_protected)
- RegisterSignal(current_protected,COMSIG_MAFIA_ON_KILL,.proc/prevent_kill)
- add_note("N[game.turn] - Protected [current_protected.body.real_name]")
+ if(!current_protected)
+ return
+ var/datum/mafia_role/target = current_protected
+ //current protected is unset at the end, as this action ends at a different phase
+ if(!target.can_action(game, src, "medical assistance"))
+ return
-/datum/mafia_role/md/proc/prevent_kill(datum/source)
+ RegisterSignal(target,COMSIG_MAFIA_ON_KILL,.proc/prevent_kill)
+ add_note("N[game.turn] - Protected [target.body.real_name]")
+
+/datum/mafia_role/md/proc/prevent_kill(datum/source,datum/mafia_controller/game,datum/mafia_role/attacker,lynch)
SIGNAL_HANDLER
- to_chat(body,"The person you protected tonight was attacked!")
- to_chat(current_protected.body,"You were attacked last night, but someone nursed you back to life!")
+ if((current_protected.role_flags & ROLE_VULNERABLE))
+ to_chat(body,span_warning("The person you protected could not be saved."))
+ return
+ to_chat(body,span_warning("The person you protected tonight was attacked!"))
+ to_chat(current_protected.body,span_greentext("You were attacked last night, but someone nursed you back to life!"))
return MAFIA_PREVENT_KILL
/datum/mafia_role/md/proc/end_protection(datum/mafia_controller/game)
@@ -303,11 +346,77 @@
UnregisterSignal(current_protected,COMSIG_MAFIA_ON_KILL)
current_protected = null
+/datum/mafia_role/officer
+ name = "Security Officer"
+ desc = "You can protect a single person each night. If they are attacked, you will retaliate, killing yourself and the attacker."
+ revealed_outfit = /datum/outfit/mafia/security
+ revealed_icon = "securityofficer"
+ hud_icon = "hudsecurityofficer"
+ role_type = TOWN_PROTECT
+ role_flags = ROLE_CAN_KILL
+ winner_award = /datum/award/achievement/mafia/officer
+
+ targeted_actions = list("Defend")
+ var/datum/mafia_role/current_defended
+
+/datum/mafia_role/officer/New(datum/mafia_controller/game)
+ . = ..()
+ RegisterSignal(game,COMSIG_MAFIA_NIGHT_ACTION_PHASE,.proc/defend)
+ RegisterSignal(game,COMSIG_MAFIA_NIGHT_END,.proc/end_defense)
+
+/datum/mafia_role/officer/validate_action_target(datum/mafia_controller/game,action,datum/mafia_role/target)
+ . = ..()
+ if(!.)
+ return
+ if((role_flags & ROLE_VULNERABLE) && (target.role_flags & ROLE_REVEALED)) //do not give the option to protect roles that your protection will fail on
+ return FALSE
+ return game.phase == MAFIA_PHASE_NIGHT && target.game_status == MAFIA_ALIVE && target != src
+
+/datum/mafia_role/officer/handle_action(datum/mafia_controller/game,action,datum/mafia_role/target)
+ if(!target || target.game_status != MAFIA_ALIVE)
+ to_chat(body,span_warning("You can only defend alive people."))
+ return
+ to_chat(body,span_warning("You will defend [target.body.real_name] tonight."))
+ current_defended = target
+
+/datum/mafia_role/officer/proc/defend(datum/mafia_controller/game)
+ SIGNAL_HANDLER
+
+ if(!current_defended)
+ return
+ var/datum/mafia_role/target = current_defended
+ //current defended is unset at the end, as this action ends at a different phase
+ if(!target.can_action(game, src, "security patrol"))
+ return
+ if(target)
+ RegisterSignal(target,COMSIG_MAFIA_ON_KILL,.proc/retaliate)
+ add_note("N[game.turn] - Defended [target.body.real_name]")
+
+/datum/mafia_role/officer/proc/retaliate(datum/source,datum/mafia_controller/game,datum/mafia_role/attacker,lynch)
+ SIGNAL_HANDLER
+
+ if((current_defended.role_flags & ROLE_VULNERABLE))
+ to_chat(body,span_warning("The person you defended could not be saved. You could not attack the killer."))
+ return
+ to_chat(body,span_userdanger("The person you defended tonight was attacked!"))
+ to_chat(current_defended.body,span_userdanger("You were attacked last night, but security fought off the attacker!"))
+ if(attacker.kill(game,src,FALSE)) //you attack the attacker
+ to_chat(attacker.body, span_userdanger("You have been ambushed by Security!"))
+ kill(game,attacker,FALSE) //the attacker attacks you, they were able to attack the target so they can attack you.
+ return MAFIA_PREVENT_KILL
+
+/datum/mafia_role/officer/proc/end_defense(datum/mafia_controller/game)
+ SIGNAL_HANDLER
+
+ if(current_defended)
+ UnregisterSignal(current_defended,COMSIG_MAFIA_ON_KILL)
+ current_defended = null
+
/datum/mafia_role/lawyer
name = "Lawyer"
desc = "You can choose a person during the day to provide extensive legal advice to during the night, preventing night actions."
revealed_outfit = /datum/outfit/mafia/lawyer
- role_type = TOWN_PROTECT
+ role_type = TOWN_SUPPORT
hud_icon = "hudlawyer"
revealed_icon = "lawyer"
winner_award = /datum/award/achievement/mafia/lawyer
@@ -317,23 +426,30 @@
/datum/mafia_role/lawyer/New(datum/mafia_controller/game)
. = ..()
- RegisterSignal(game,COMSIG_MAFIA_SUNDOWN,.proc/roleblock_text)
- RegisterSignal(game,COMSIG_MAFIA_NIGHT_START,.proc/try_to_roleblock)
+ RegisterSignal(game,COMSIG_MAFIA_SUNDOWN,.proc/roleblock)
RegisterSignal(game,COMSIG_MAFIA_NIGHT_END,.proc/release)
-/datum/mafia_role/lawyer/proc/roleblock_text(datum/mafia_controller/game)
+/datum/mafia_role/lawyer/proc/roleblock(datum/mafia_controller/game)
SIGNAL_HANDLER
- if(SEND_SIGNAL(src,COMSIG_MAFIA_CAN_PERFORM_ACTION,game,"roleblock",current_target) & MAFIA_PREVENT_ACTION || game_status != MAFIA_ALIVE) //Got lynched or roleblocked by another lawyer.
+ if(!current_target)
+ return
+
+ var/datum/mafia_role/target = current_target
+ if(!target.can_action(game, src, "roleblock")) //roleblocking a warden moment
current_target = null
- if(current_target)
- to_chat(current_target.body,"YOU HAVE BEEN BLOCKED! YOU CANNOT PERFORM ANY ACTIONS TONIGHT.")
- add_note("N[game.turn] - [current_target.body.real_name] - Blocked")
+ return
+
+ to_chat(target.body,"YOU HAVE BEEN BLOCKED! YOU CANNOT PERFORM ANY ACTIONS TONIGHT.")
+ add_note("N[game.turn] - [target.body.real_name] - Blocked")
+ target.role_flags |= ROLE_ROLEBLOCKED
/datum/mafia_role/lawyer/validate_action_target(datum/mafia_controller/game, action, datum/mafia_role/target)
. = ..()
if(!.)
return FALSE
+ if(target == src)
+ return FALSE
if(game.phase == MAFIA_PHASE_NIGHT)
return FALSE
if(target.game_status != MAFIA_ALIVE)
@@ -343,53 +459,164 @@
. = ..()
if(target == current_target)
current_target = null
- to_chat(body,"You have decided against blocking anyone tonight.")
+ to_chat(body,span_warning("You have decided against blocking anyone tonight."))
else
current_target = target
- to_chat(body,"You will block [target.body.real_name] tonight.")
-
-/datum/mafia_role/lawyer/proc/try_to_roleblock(datum/mafia_controller/game)
- SIGNAL_HANDLER
-
- if(current_target)
- RegisterSignal(current_target,COMSIG_MAFIA_CAN_PERFORM_ACTION, .proc/prevent_action)
+ to_chat(body,span_warning("You will block [target.body.real_name] tonight."))
/datum/mafia_role/lawyer/proc/release(datum/mafia_controller/game)
SIGNAL_HANDLER
. = ..()
if(current_target)
- UnregisterSignal(current_target, COMSIG_MAFIA_CAN_PERFORM_ACTION)
+ current_target.role_flags &= ~ROLE_ROLEBLOCKED
current_target = null
-/datum/mafia_role/lawyer/proc/prevent_action(datum/source)
- SIGNAL_HANDLER
-
- if(game_status == MAFIA_ALIVE) //in case we got killed while imprisoning sk - bad luck edge
- return MAFIA_PREVENT_ACTION
-
/datum/mafia_role/hop
name = "Head of Personnel"
desc = "You can reveal yourself once per game, tripling your vote power but becoming unable to be protected!"
- revealed_outfit = /datum/outfit/mafia/hop
- role_type = TOWN_MISC
+ role_type = TOWN_SUPPORT
+ role_flags = ROLE_UNIQUE
hud_icon = "hudheadofpersonnel"
revealed_icon = "headofpersonnel"
+ revealed_outfit = /datum/outfit/mafia/hop
winner_award = /datum/award/achievement/mafia/hop
targeted_actions = list("Reveal")
+ vote_potential = 3
/datum/mafia_role/hop/validate_action_target(datum/mafia_controller/game, action, datum/mafia_role/target)
. = ..()
- if(!. || game.phase == MAFIA_PHASE_NIGHT || game.turn == 1 || target.game_status != MAFIA_ALIVE || target != src || revealed)
+ if(!. || game.phase == MAFIA_PHASE_NIGHT || game.turn == 1 || target.game_status != MAFIA_ALIVE || target != src || (role_flags & ROLE_REVEALED))
return FALSE
/datum/mafia_role/hop/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target)
. = ..()
reveal_role(game, TRUE)
- vote_power = 2
+ role_flags |= ROLE_VULNERABLE
+ vote_power = 3
-///MAFIA ROLES/// only one until i rework this to allow more, they're the "anti-town" working to kill off townies to win
+/datum/mafia_role/hos
+ name = "Head of Security"
+ desc = "You can decide to execute during the night, visiting someone killing, and revealing them. If they are innocent, you will die at the start of the next night."
+ role_type = TOWN_KILLING
+ role_flags = ROLE_CAN_KILL | ROLE_UNIQUE
+ revealed_outfit = /datum/outfit/mafia/hos
+ revealed_icon = "headofsecurity"
+ hud_icon = "hudheadofsecurity"
+ winner_award = /datum/award/achievement/mafia/hos
+
+ targeted_actions = list("Execute")
+ var/datum/mafia_role/execute_target
+
+/datum/mafia_role/hos/New(datum/mafia_controller/game)
+ . = ..()
+ RegisterSignal(game,COMSIG_MAFIA_NIGHT_ACTION_PHASE,.proc/execute)
+
+/datum/mafia_role/hos/validate_action_target(datum/mafia_controller/game,action,datum/mafia_role/target)
+ . = ..()
+ if(!.)
+ return
+ return game.phase == MAFIA_PHASE_NIGHT && target.game_status == MAFIA_ALIVE && target != src
+
+/datum/mafia_role/hos/handle_action(datum/mafia_controller/game,action,datum/mafia_role/target)
+ if(execute_target == target)
+ to_chat(body,span_warning("You have decided against executing tonight."))
+ to_chat(body,span_warning("You have decided to execute [target.body.real_name] tonight."))
+ execute_target = target
+
+/datum/mafia_role/hos/proc/execute(datum/mafia_controller/game)
+ SIGNAL_HANDLER
+
+ if(!execute_target)
+ return
+ var/datum/mafia_role/target = execute_target
+ execute_target = null
+ if(!target.can_action(game, src, "execution")) //roleblocking a warden moment
+ return
+ if(!target.kill(game,src,FALSE))//protection
+ to_chat(body,span_danger("Your attempt at executing [target.body.real_name] was prevented, or [target.body.real_name] is immune!"))
+ else
+ to_chat(target.body, span_userdanger("You have been executed by the Head of Security!"))
+ target.reveal_role(game, verbose = TRUE)
+ if(target.team == MAFIA_TEAM_TOWN)
+ to_chat(body,span_userdanger("You have killed an innocent crewmember. You will die tomorrow night."))
+ RegisterSignal(game,COMSIG_MAFIA_SUNDOWN,.proc/internal_affairs)
+ role_flags |= ROLE_VULNERABLE
+
+/datum/mafia_role/hos/proc/internal_affairs(datum/mafia_controller/game)
+ to_chat(body,span_userdanger("You have been killed by Nanotrasen Internal Affairs!"))
+ reveal_role(game, verbose = TRUE)
+ kill(game,src,FALSE) //you technically kill yourself but that shouldn't matter
+
+
+//just helps read better
+#define WARDEN_NOT_LOCKDOWN 0//will NOT kill visitors tonight
+#define WARDEN_WILL_LOCKDOWN 1 //will kill visitors tonight
+
+/datum/mafia_role/warden
+ name = "Warden"
+ desc = "You can lockdown during the night once, killing any visitors. WARNING: This kills fellow town members, too!"
+
+ role_type = TOWN_KILLING
+ role_flags = ROLE_CAN_KILL
+ revealed_outfit = /datum/outfit/mafia/warden
+ revealed_icon = "warden"
+ hud_icon = "hudwarden"
+ winner_award = /datum/award/achievement/mafia/warden
+
+ actions = list("Lockdown")
+ var/charges = 1
+ var/protection_status = WARDEN_NOT_LOCKDOWN
+
+
+/datum/mafia_role/warden/New(datum/mafia_controller/game)
+ . = ..()
+ RegisterSignal(game,COMSIG_MAFIA_SUNDOWN,.proc/night_start)
+ RegisterSignal(game,COMSIG_MAFIA_NIGHT_END,.proc/night_end)
+
+/datum/mafia_role/warden/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target)
+ . = ..()
+ if(!charges)
+ to_chat(body,span_danger("You've already locked down this game!"))
+ return
+ if(game.phase == MAFIA_PHASE_NIGHT)
+ to_chat(body,span_danger("You don't have time to lockdown, night has already arrived."))
+ return
+ if(protection_status == WARDEN_WILL_LOCKDOWN)
+ to_chat(body,span_danger("You decide to not lockdown tonight."))
+ else
+ to_chat(body,span_danger("You decide to lockdown, killing any visitors."))
+ protection_status = !protection_status
+
+/datum/mafia_role/warden/proc/night_start(datum/mafia_controller/game)
+ SIGNAL_HANDLER
+
+ if(protection_status == WARDEN_WILL_LOCKDOWN)
+ to_chat(body,span_danger("Any and all visitors are going to eat buckshot tonight."))
+ RegisterSignal(src,COMSIG_MAFIA_ON_VISIT,.proc/self_defense)
+
+/datum/mafia_role/warden/proc/night_end(datum/mafia_controller/game)
+ SIGNAL_HANDLER
+
+ if(protection_status == WARDEN_WILL_LOCKDOWN)
+ charges--
+ UnregisterSignal(src,COMSIG_MAFIA_ON_KILL)
+ to_chat(body,span_danger("You are no longer protected. You have used up your power."))
+ protection_status = WARDEN_NOT_LOCKDOWN
+
+/datum/mafia_role/warden/proc/self_defense(datum/source,datum/mafia_controller/game,datum/mafia_role/attacker,lynch)
+ SIGNAL_HANDLER
+
+ to_chat(body,span_userdanger("You have shot a visitor!"))
+ to_chat(attacker,span_userdanger("You have visited the warden!"))
+ attacker.kill(game, src, lynch = FALSE)
+ return MAFIA_VISIT_INTERRUPTED
+
+#undef WARDEN_NOT_LOCKDOWN
+#undef WARDEN_WILL_LOCKDOWN
+
+///MAFIA ROLES/// they're the "anti-town" working to kill off townies to win
/datum/mafia_role/mafia
name = "Changeling"
@@ -436,7 +663,7 @@
return game.phase == MAFIA_PHASE_NIGHT && target.game_status == MAFIA_ALIVE && target != src
/datum/mafia_role/mafia/thoughtfeeder/handle_action(datum/mafia_controller/game,action,datum/mafia_role/target)
- to_chat(body,"You will feast on the memories of [target.body.real_name] tonight.")
+ to_chat(body,span_warning("You will feast on the memories of [target.body.real_name] tonight."))
current_investigation = target
/datum/mafia_role/mafia/thoughtfeeder/proc/investigate(datum/mafia_controller/game)
@@ -444,18 +671,15 @@
var/datum/mafia_role/target = current_investigation
current_investigation = null
- if(SEND_SIGNAL(src,COMSIG_MAFIA_CAN_PERFORM_ACTION,game,"thoughtfeed",target) & MAFIA_PREVENT_ACTION)
- to_chat(body,"You were unable to investigate [target.body.real_name].")
+ if(!target.can_action(game, src, "thought feeding"))
add_note("N[game.turn] - [target.body.real_name] - Unable to investigate")
return
- if(target)
- if(target.detect_immune)
- to_chat(body,"[target.body.real_name]'s memories reveal that they are the Assistant.")
- add_note("N[game.turn] - [target.body.real_name] - Assistant")
- else
- to_chat(body,"[target.body.real_name]'s memories reveal that they are the [target.name].")
- add_note("N[game.turn] - [target.body.real_name] - [target.name]")
-
+ if((target.role_flags & ROLE_UNDETECTABLE))
+ to_chat(body,span_warning("[target.body.real_name]'s memories reveal that they are the Assistant."))
+ add_note("N[game.turn] - [target.body.real_name] - Assistant")
+ else
+ to_chat(body,span_warning("[target.body.real_name]'s memories reveal that they are the [target.name]."))
+ add_note("N[game.turn] - [target.body.real_name] - [target.name]")
///SOLO ROLES/// they range from anomalous factors to deranged killers that try to win alone.
@@ -465,15 +689,14 @@
win_condition = "kill everyone."
team = MAFIA_TEAM_SOLO
role_type = NEUTRAL_KILL
+ role_flags = ROLE_CAN_KILL
winner_award = /datum/award/achievement/mafia/traitor
-
- targeted_actions = list("Night Kill")
revealed_outfit = /datum/outfit/mafia/traitor
-
- hud_icon = "hudtraitor"
revealed_icon = "traitor"
+ hud_icon = "hudtraitor"
special_theme = "neutral"
+ targeted_actions = list("Night Kill")
var/datum/mafia_role/current_victim
/datum/mafia_role/traitor/New(datum/mafia_controller/game)
@@ -481,17 +704,17 @@
RegisterSignal(src,COMSIG_MAFIA_ON_KILL,.proc/nightkill_immunity)
RegisterSignal(game,COMSIG_MAFIA_NIGHT_KILL_PHASE,.proc/try_to_kill)
-/datum/mafia_role/traitor/check_total_victory(alive_town, alive_mafia) //serial killers just want teams dead
+/datum/mafia_role/traitor/check_total_victory(alive_town, alive_mafia) //serial killers just want teams dead, they cannot be stopped by killing roles anyways
return alive_town + alive_mafia <= 1
/datum/mafia_role/traitor/block_team_victory(alive_town, alive_mafia) //no team can win until they're dead
return TRUE //while alive, town AND mafia cannot win (though since mafia know who is who it's pretty easy to win from that point)
-/datum/mafia_role/traitor/proc/nightkill_immunity(datum/source,datum/mafia_controller/game,lynch)
+/datum/mafia_role/traitor/proc/nightkill_immunity(datum/source,datum/mafia_controller/game,datum/mafia_role/attacker,lynch)
SIGNAL_HANDLER
if(game.phase == MAFIA_PHASE_NIGHT && !lynch)
- to_chat(body,"You were attacked, but they'll have to try harder than that to put you down.")
+ to_chat(body,span_userdanger("You were attacked, but they'll have to try harder than that to put you down."))
return MAFIA_PREVENT_KILL
/datum/mafia_role/traitor/validate_action_target(datum/mafia_controller/game, action, datum/mafia_role/target)
@@ -504,25 +727,29 @@
/datum/mafia_role/traitor/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target)
. = ..()
current_victim = target
- to_chat(body,"You will attempt to kill [target.body.real_name] tonight.")
+ to_chat(body,span_warning("You will attempt to kill [target.body.real_name] tonight."))
-/datum/mafia_role/traitor/proc/try_to_kill(datum/mafia_controller/source)
- // SIGNAL_HANDLER
+/datum/mafia_role/traitor/proc/try_to_kill(datum/mafia_controller/game)
+ SIGNAL_HANDLER
+ if(!current_victim)
+ return
var/datum/mafia_role/target = current_victim
current_victim = null
- if(SEND_SIGNAL(src,COMSIG_MAFIA_CAN_PERFORM_ACTION,source,"traitor kill",target) & MAFIA_PREVENT_ACTION)
+ if(!target.can_action(game, src, "flickering")) //flickering a warden
return
- if(game_status == MAFIA_ALIVE && target && target.game_status == MAFIA_ALIVE)
- if(!target.kill(source))
- to_chat(body,"Your attempt at killing [target.body] was prevented!")
+ if(game_status == MAFIA_ALIVE)
+ if(!target.kill(game,src,FALSE))
+ to_chat(body,span_danger("Your attempt at killing [target.body.real_name] was prevented!"))
+ else
+ to_chat(target.body, span_userdanger("You have been killed by a Traitor!"))
/datum/mafia_role/nightmare
name = "Nightmare"
- desc = "You're a solo monster that cannot be detected by detective roles. You can flicker lights of another room each night. You can instead decide to hunt, killing everyone in a flickering room. Kill everyone to win."
+ desc = "You're a solo monster that cannot be detected by detective roles. You can flicker lights of another room each night, becoming immune to attacks from those roles. You can instead decide to hunt, killing everyone in a flickering room. Kill everyone to win."
win_condition = "kill everyone."
revealed_outfit = /datum/outfit/mafia/nightmare
- detect_immune = TRUE
+ role_flags = ROLE_UNDETECTABLE | ROLE_CAN_KILL
team = MAFIA_TEAM_SOLO
role_type = NEUTRAL_KILL
special_theme = "neutral"
@@ -536,6 +763,7 @@
/datum/mafia_role/nightmare/New(datum/mafia_controller/game)
. = ..()
+ RegisterSignal(src,COMSIG_MAFIA_ON_KILL,.proc/flickering_immunity)
RegisterSignal(game,COMSIG_MAFIA_NIGHT_KILL_PHASE,.proc/flicker_or_hunt)
/datum/mafia_role/nightmare/check_total_victory(alive_town, alive_mafia) //nightmares just want teams dead
@@ -562,33 +790,42 @@
/datum/mafia_role/nightmare/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target)
. = ..()
if(target == flicker_target)
- to_chat(body,"You will do nothing tonight.")
+ to_chat(body,span_warning("You will do nothing tonight."))
flicker_target = null
flicker_target = target
if(action == "Flicker")
- to_chat(body,"You will attempt to flicker [target.body.real_name]'s room tonight.")
+ to_chat(body,span_warning("You will attempt to flicker [target.body.real_name]'s room tonight."))
else
- to_chat(body,"You will hunt everyone in a flickering room down tonight.")
+ to_chat(body,span_danger("You will hunt everyone in a flickering room down tonight."))
-/datum/mafia_role/nightmare/proc/flicker_or_hunt(datum/mafia_controller/source)
- // SIGNAL_HANDLER
+/datum/mafia_role/nightmare/proc/flickering_immunity(datum/source,datum/mafia_controller/game,datum/mafia_role/attacker,lynch)
+ SIGNAL_HANDLER
+ if(!attacker)
+ return //no chance man, that's a town lynch
- if(game_status != MAFIA_ALIVE || !flicker_target)
- return
- if(SEND_SIGNAL(src,COMSIG_MAFIA_CAN_PERFORM_ACTION,source,"nightmare actions",flicker_target) & MAFIA_PREVENT_ACTION)
- to_chat(flicker_target.body, "Your actions were prevented!")
+ if(attacker in flickering)
+ to_chat(body,span_userdanger("You were attacked by someone in a flickering room. You have danced in the shadows, evading them."))
+ return MAFIA_PREVENT_KILL
+
+/datum/mafia_role/nightmare/proc/flicker_or_hunt(datum/mafia_controller/game)
+ SIGNAL_HANDLER
+
+ if(!flicker_target)
return
var/datum/mafia_role/target = flicker_target
flicker_target = null
+ if(!target.can_action(game, src, "flickering")) //flickering a warden
+ return
+
if(target != src) //flicker instead of hunt
- to_chat(target.body, "The lights begin to flicker and dim. You're in danger.")
+ to_chat(target.body, span_userdanger("The lights begin to flicker and dim. You're in danger."))
flickering += target
return
for(var/r in flickering)
var/datum/mafia_role/role = r
if(role && role.game_status == MAFIA_ALIVE)
- to_chat(role.body, "A shadowy monster appears out of the darkness!")
- role.kill(source)
+ to_chat(role.body, span_userdanger("A shadowy figure appears out of the darkness!"))
+ role.kill(game,src,FALSE)
flickering -= role
//just helps read better
@@ -599,7 +836,6 @@
name = "Fugitive"
desc = "You're on the run. You can become immune to night kills exactly twice, and you win by surviving to the end of the game with anyone."
win_condition = "survive to the end of the game, with anyone"
- solo_counts_as_town = TRUE //should not count towards mafia victory, they should have the option to work with town
revealed_outfit = /datum/outfit/mafia/fugitive
team = MAFIA_TEAM_SOLO
role_type = NEUTRAL_DISRUPT
@@ -622,22 +858,22 @@
/datum/mafia_role/fugitive/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target)
. = ..()
if(!charges)
- to_chat(body,"You're out of supplies and cannot protect yourself anymore.")
+ to_chat(body,span_danger("You're out of supplies and cannot protect yourself anymore."))
return
if(game.phase == MAFIA_PHASE_NIGHT)
- to_chat(body,"You don't have time to prepare, night has already arrived.")
+ to_chat(body,span_danger("You don't have time to prepare, night has already arrived."))
return
if(protection_status == FUGITIVE_WILL_PRESERVE)
- to_chat(body,"You decide to not prepare tonight.")
+ to_chat(body,span_danger("You decide to not prepare tonight."))
else
- to_chat(body,"You decide to prepare for a horrible night.")
+ to_chat(body,span_danger("You decide to prepare for a horrible night."))
protection_status = !protection_status
/datum/mafia_role/fugitive/proc/night_start(datum/mafia_controller/game)
SIGNAL_HANDLER
if(protection_status == FUGITIVE_WILL_PRESERVE)
- to_chat(body,"Your preparations are complete. Nothing could kill you tonight!")
+ to_chat(body,span_danger("Your preparations are complete. Nothing could kill you tonight!"))
RegisterSignal(src,COMSIG_MAFIA_ON_KILL,.proc/prevent_death)
/datum/mafia_role/fugitive/proc/night_end(datum/mafia_controller/game)
@@ -646,13 +882,13 @@
if(protection_status == FUGITIVE_WILL_PRESERVE)
charges--
UnregisterSignal(src,COMSIG_MAFIA_ON_KILL)
- to_chat(body,"You are no longer protected. You have [charges] use[charges == 1 ? "" : "s"] left of your power.")
+ to_chat(body,span_danger("You are no longer protected. You have [charges] use[charges == 1 ? "" : "s"] left of your power."))
protection_status = FUGITIVE_NOT_PRESERVING
-/datum/mafia_role/fugitive/proc/prevent_death(datum/mafia_controller/game)
+/datum/mafia_role/fugitive/proc/prevent_death(datum/source,datum/mafia_controller/game,datum/mafia_role/attacker,lynch)
SIGNAL_HANDLER
- to_chat(body,"You were attacked! Luckily, you were ready for this!")
+ to_chat(body,span_userdanger("You were attacked! Luckily, you were ready for this!"))
return MAFIA_PREVENT_KILL
/datum/mafia_role/fugitive/proc/survived(datum/mafia_controller/game)
@@ -669,8 +905,7 @@
name = "Obsessed"
desc = "You're completely lost in your own mind. You win by lynching your obsession before you get killed in this mess. Obsession assigned on the first night!"
win_condition = "lynch their obsession."
- revealed_outfit = /datum/outfit/mafia/obsessed // /mafia <- outfit must be readded (just make a new mafia outfits file for all of these)
- solo_counts_as_town = TRUE //after winning or whatever, can side with whoever. they've already done their objective!
+ revealed_outfit = /datum/outfit/mafia/obsessed
team = MAFIA_TEAM_SOLO
role_type = NEUTRAL_DISRUPT
special_theme = "neutral"
@@ -678,9 +913,6 @@
revealed_icon = "obsessed"
winner_award = /datum/award/achievement/mafia/obsessed
-
- revealed_outfit = /datum/outfit/mafia/obsessed // /mafia <- outfit must be readded (just make a new mafia outfits file for all of these)
- solo_counts_as_town = TRUE //after winning or whatever, can side with whoever. they've already done their objective!
var/datum/mafia_role/obsession
var/lynched_target = FALSE
@@ -700,12 +932,12 @@
if(!obsession)
obsession = pick(all_roles_shuffle) //okay no town just pick anyone here
//if you still don't have an obsession you're playing a single player game like i can't help your dumb ass
- to_chat(body, "Your obsession is [obsession.body.real_name]! Get them lynched to win!")
+ to_chat(body, span_userdanger("Your obsession is [obsession.body.real_name]! Get them lynched to win!"))
add_note("N[game.turn] - I vowed to watch my obsession, [obsession.body.real_name], hang!") //it'll always be N1 but whatever
RegisterSignal(obsession,COMSIG_MAFIA_ON_KILL,.proc/check_victory)
UnregisterSignal(game,COMSIG_MAFIA_SUNDOWN)
-/datum/mafia_role/obsessed/proc/check_victory(datum/source,datum/mafia_controller/game,lynch)
+/datum/mafia_role/obsessed/proc/check_victory(datum/source,datum/mafia_controller/game,datum/mafia_role/attacker,lynch)
SIGNAL_HANDLER
UnregisterSignal(source,COMSIG_MAFIA_ON_KILL)
@@ -716,14 +948,13 @@
game.award_role(winner_award, src)
reveal_role(game, FALSE)
else
- to_chat(body, "You have failed your objective to lynch [obsession.body]!")
+ to_chat(body, span_userdanger("You have failed your objective to lynch [obsession.body.real_name]!"))
/datum/mafia_role/clown
name = "Clown"
desc = "If you are lynched you take down one of your voters (guilty or abstain) with you and win. HONK!"
win_condition = "get themselves lynched!"
revealed_outfit = /datum/outfit/mafia/clown
- solo_counts_as_town = TRUE
team = MAFIA_TEAM_SOLO
role_type = NEUTRAL_DISRUPT
special_theme = "neutral"
@@ -735,8 +966,8 @@
. = ..()
RegisterSignal(src,COMSIG_MAFIA_ON_KILL,.proc/prank)
-/datum/mafia_role/clown/proc/prank(datum/source,datum/mafia_controller/game,lynch)
- // SIGNAL_HANDLER
+/datum/mafia_role/clown/proc/prank(datum/source,datum/mafia_controller/game,datum/mafia_role/attacker,lynch)
+ SIGNAL_HANDLER
if(lynch)
var/datum/mafia_role/victim = pick(game.judgement_guilty_votes + game.judgement_abstain_votes)
diff --git a/code/modules/mapping/mapping_helpers/_mapping_helpers.dm b/code/modules/mapping/mapping_helpers/_mapping_helpers.dm
index 4de16ba350..a96b81528f 100644
--- a/code/modules/mapping/mapping_helpers/_mapping_helpers.dm
+++ b/code/modules/mapping/mapping_helpers/_mapping_helpers.dm
@@ -8,61 +8,73 @@
..()
return late ? INITIALIZE_HINT_LATELOAD : INITIALIZE_HINT_QDEL
+
//airlock helpers
/obj/effect/mapping_helpers/airlock
layer = DOOR_HELPER_LAYER
+/obj/effect/mapping_helpers/airlock/Initialize(mapload)
+ . = ..()
+ if(!mapload)
+ log_mapping("[src] spawned outside of mapload!")
+ return
+ var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in loc
+ if(!airlock)
+ log_mapping("[src] failed to find an airlock at [AREACOORD(src)]")
+ else
+ payload(airlock)
+
+/obj/effect/mapping_helpers/airlock/proc/payload(obj/machinery/door/airlock/payload)
+ return
+
/obj/effect/mapping_helpers/airlock/cyclelink_helper
name = "airlock cyclelink helper"
icon_state = "airlock_cyclelink_helper"
-/obj/effect/mapping_helpers/airlock/cyclelink_helper/Initialize(mapload)
- . = ..()
- if(!mapload)
- log_mapping("[src] spawned outside of mapload!")
- return
- var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in loc
- if(airlock)
- if(airlock.cyclelinkeddir)
- log_mapping("[src] at [AREACOORD(src)] tried to set [airlock] cyclelinkeddir, but it's already set!")
- else
- airlock.cyclelinkeddir = dir
+/obj/effect/mapping_helpers/airlock/cyclelink_helper/payload(obj/machinery/door/airlock/airlock)
+ if(airlock.cyclelinkeddir)
+ log_mapping("[src] at [AREACOORD(src)] tried to set [airlock] cyclelinkeddir, but it's already set!")
else
- log_mapping("[src] failed to find an airlock at [AREACOORD(src)]")
+ airlock.cyclelinkeddir = dir
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi
+ name = "airlock multi-cyclelink helper"
+ icon_state = "airlock_multicyclelink_helper"
+ var/cycle_id
+
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi/payload(obj/machinery/door/airlock/airlock)
+ if(airlock.closeOtherId)
+ log_mapping("[src] at [AREACOORD(src)] tried to set [airlock] closeOtherId, but it's already set!")
+ else
+ airlock.closeOtherId = cycle_id
/obj/effect/mapping_helpers/airlock/locked
name = "airlock lock helper"
icon_state = "airlock_locked_helper"
-/obj/effect/mapping_helpers/airlock/locked/Initialize(mapload)
- . = ..()
- if(!mapload)
- log_mapping("[src] spawned outside of mapload!")
- return
- var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in loc
- if(airlock)
- if(airlock.locked)
- log_mapping("[src] at [AREACOORD(src)] tried to bolt [airlock] but it's already locked!")
- else
- airlock.locked = TRUE
+/obj/effect/mapping_helpers/airlock/locked/payload(obj/machinery/door/airlock/airlock)
+ if(airlock.locked)
+ log_mapping("[src] at [AREACOORD(src)] tried to bolt [airlock] but it's already locked!")
else
- log_mapping("[src] failed to find an airlock at [AREACOORD(src)]")
+ airlock.locked = TRUE
+
/obj/effect/mapping_helpers/airlock/unres
name = "airlock unresctricted side helper"
icon_state = "airlock_unres_helper"
-/obj/effect/mapping_helpers/airlock/unres/Initialize(mapload)
- . = ..()
- if(!mapload)
- log_mapping("[src] spawned outside of mapload!")
- return
- var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in loc
- if(airlock)
- airlock.unres_sides ^= dir
+/obj/effect/mapping_helpers/airlock/unres/payload(obj/machinery/door/airlock/airlock)
+ airlock.unres_sides ^= dir
+
+/obj/effect/mapping_helpers/airlock/abandoned
+ name = "airlock abandoned helper"
+ icon_state = "airlock_abandoned"
+
+/obj/effect/mapping_helpers/airlock/abandoned/payload(obj/machinery/door/airlock/airlock)
+ if(airlock.abandoned)
+ log_mapping("[src] at [AREACOORD(src)] tried to make [airlock] abandoned but it's already abandoned!")
else
- log_mapping("[src] failed to find an airlock at [AREACOORD(src)]")
+ airlock.abandoned = TRUE
//needs to do its thing before spawn_rivers() is called
@@ -79,9 +91,11 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava)
//This helper applies components to things on the map directly.
/obj/effect/mapping_helpers/component_injector
name = "Component Injector"
+ icon_state = "component"
late = TRUE
- var/target_type
- var/target_name
+ var/all = FALSE //Will inject into all fitting the criteria if true, otherwise first found
+ var/target_type //Will inject into atoms of this type
+ var/target_name //Will inject into atoms with this name
var/component_type
//Late init so everything is likely ready and loaded (no warranty)
@@ -98,8 +112,11 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava)
continue
var/cargs = build_args()
A._AddComponent(cargs)
+ if(!all)
+ qdel(src)
+ return
+ if(all)
qdel(src)
- return
/obj/effect/mapping_helpers/component_injector/proc/build_args()
return list(component_type)
@@ -115,3 +132,276 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava)
CRASH("Wrong disease type passed in.")
var/datum/disease/D = new disease_type()
return list(component_type,D)
+
+// /obj/effect/mapping_helpers/component_injector/areabound
+// name = "Areabound Injector"
+// icon_state = "component_areabound"
+// component_type = /datum/component/areabound
+// target_type = /atom/movable
+
+/obj/effect/mapping_helpers/dead_body_placer
+ name = "Dead Body placer"
+ late = TRUE
+ icon_state = "deadbodyplacer"
+ var/bodycount = 2 //number of bodies to spawn
+
+/obj/effect/mapping_helpers/dead_body_placer/LateInitialize()
+ var/area/a = get_area(src)
+ var/list/trays = list()
+ for (var/i in a.contents)
+ if (istype(i, /obj/structure/bodycontainer/morgue))
+ trays += i
+ if(!trays.len)
+ log_mapping("[src] at [x],[y] could not find any morgues.")
+ return
+ for (var/i = 1 to bodycount)
+ var/obj/structure/bodycontainer/morgue/j = pick(trays)
+ var/mob/living/carbon/human/h = new /mob/living/carbon/human(j, 1)
+ h.death()
+ for (var/part in h.internal_organs) //randomly remove organs from each body, set those we keep to be in stasis
+ if (prob(40))
+ qdel(part)
+ else
+ var/obj/item/organ/O = part
+ O.organ_flags |= ORGAN_FROZEN
+ j.update_appearance()
+ qdel(src)
+
+
+//On Ian's birthday, the hop's office is decorated.
+/obj/effect/mapping_helpers/ianbirthday
+ name = "Ian's Bday Helper"
+ late = TRUE
+ icon_state = "iansbdayhelper"
+ var/balloon_clusters = 2
+
+/obj/effect/mapping_helpers/ianbirthday/LateInitialize()
+ if(locate(/datum/holiday/ianbirthday) in SSevents.holidays)
+ birthday()
+ qdel(src)
+
+/obj/effect/mapping_helpers/ianbirthday/proc/birthday()
+ var/area/a = get_area(src)
+ var/list/table = list()//should only be one aka the front desk, but just in case...
+ var/list/openturfs = list()
+
+ //confetti and a corgi balloon! (and some list stuff for more decorations)
+ for(var/thing in a.contents)
+ if(istype(thing, /obj/structure/table/reinforced))
+ table += thing
+ if(isopenturf(thing))
+ // new /obj/effect/decal/cleanable/confetti(thing)
+ // if(locate(/obj/structure/bed/dogbed/ian) in thing)
+ // new /obj/item/toy/balloon/corgi(thing)
+ // else
+ openturfs += thing
+
+ //cake + knife to cut it!
+ if(length(table))
+ var/turf/food_turf = get_turf(pick(table))
+ new /obj/item/kitchen/knife(food_turf)
+ var/obj/item/reagent_containers/food/snacks/store/cake/birthday/iancake = new(food_turf)
+ iancake.desc = "Happy birthday, Ian!"
+ // remind me to give ian proper baloons!
+ //some balloons! this picks an open turf and pops a few balloons in and around that turf, yay.
+ // for(var/i in 1 to balloon_clusters)
+ // var/turf/clusterspot = pick_n_take(openturfs)
+ // new /obj/item/toy/balloon(clusterspot)
+ // var/balloons_left_to_give = 3 //the amount of balloons around the cluster
+ // var/list/dirs_to_balloon = GLOB.cardinals.Copy()
+ // while(balloons_left_to_give > 0)
+ // balloons_left_to_give--
+ // var/chosen_dir = pick_n_take(dirs_to_balloon)
+ // var/turf/balloonstep = get_step(clusterspot, chosen_dir)
+ // var/placed = FALSE
+ // if(isopenturf(balloonstep))
+ // var/obj/item/toy/balloon/B = new(balloonstep)//this clumps the cluster together
+ // placed = TRUE
+ // if(chosen_dir == NORTH)
+ // B.pixel_y -= 10
+ // if(chosen_dir == SOUTH)
+ // B.pixel_y += 10
+ // if(chosen_dir == EAST)
+ // B.pixel_x -= 10
+ // if(chosen_dir == WEST)
+ // B.pixel_x += 10
+ // if(!placed)
+ // new /obj/item/toy/balloon(clusterspot)
+ //remind me to add wall decor!
+
+/obj/effect/mapping_helpers/ianbirthday/admin//so admins may birthday any room
+ name = "generic birthday setup"
+ icon_state = "bdayhelper"
+
+/obj/effect/mapping_helpers/ianbirthday/admin/LateInitialize()
+ birthday()
+ qdel(src)
+
+//Ian, like most dogs, loves a good new years eve party.
+/obj/effect/mapping_helpers/iannewyear
+ name = "Ian's New Years Helper"
+ late = TRUE
+ icon_state = "iansnewyrshelper"
+
+/obj/effect/mapping_helpers/iannewyear/LateInitialize()
+ if(SSevents.holidays && SSevents.holidays[NEW_YEAR])
+ fireworks()
+ qdel(src)
+
+/obj/effect/mapping_helpers/iannewyear/proc/fireworks()
+ var/area/a = get_area(src)
+ var/list/table = list()//should only be one aka the front desk, but just in case...
+ var/list/openturfs = list()
+
+ for(var/thing in a.contents)
+ if(istype(thing, /obj/structure/table/reinforced))
+ table += thing
+ else if(isopenturf(thing))
+ if(locate(/obj/structure/bed/dogbed/ian) in thing)
+ new /obj/item/clothing/head/festive(thing)
+ var/obj/item/reagent_containers/food/drinks/bottle/champagne/iandrink = new(thing)
+ iandrink.name = "dog champagne"
+ iandrink.pixel_y += 8
+ iandrink.pixel_x += 8
+ else
+ openturfs += thing
+
+ var/turf/fireworks_turf = get_turf(pick(table))
+ var/obj/item/storage/box/matches/matchbox = new(fireworks_turf)
+ matchbox.pixel_y += 8
+ matchbox.pixel_x -= 3
+ // new /obj/item/storage/box/fireworks/dangerous(fireworks_turf) //dangerous version for extra holiday memes.
+
+//lets mappers place notes on airlocks with custom info or a pre-made note from a path
+/obj/effect/mapping_helpers/airlock_note_placer
+ name = "Airlock Note Placer"
+ late = TRUE
+ icon_state = "airlocknoteplacer"
+ var/note_info //for writing out custom notes without creating an extra paper subtype
+ var/note_name //custom note name
+ var/note_path //if you already have something wrote up in a paper subtype, put the path here
+
+/obj/effect/mapping_helpers/airlock_note_placer/LateInitialize()
+ var/turf/turf = get_turf(src)
+ if(note_path && !istype(note_path, /obj/item/paper)) //don't put non-paper in the paper slot thank you
+ log_mapping("[src] at [x],[y] had an improper note_path path, could not place paper note.")
+ qdel(src)
+ if(locate(/obj/machinery/door/airlock) in turf)
+ var/obj/machinery/door/airlock/found_airlock = locate(/obj/machinery/door/airlock) in turf
+ if(note_path)
+ found_airlock.note = note_path
+ found_airlock.update_appearance()
+ qdel(src)
+ if(note_info)
+ var/obj/item/paper/paper = new /obj/item/paper(src)
+ if(note_name)
+ paper.name = note_name
+ paper.info = "[note_info]"
+ found_airlock.note = paper
+ paper.forceMove(found_airlock)
+ found_airlock.update_appearance()
+ qdel(src)
+ log_mapping("[src] at [x],[y] had no note_path or note_info, cannot place paper note.")
+ qdel(src)
+ log_mapping("[src] at [x],[y] could not find an airlock on current turf, cannot place paper note.")
+ qdel(src)
+
+//This helper applies traits to things on the map directly.
+/obj/effect/mapping_helpers/trait_injector
+ name = "Trait Injector"
+ icon_state = "trait"
+ late = TRUE
+ ///Will inject into all fitting the criteria if false, otherwise first found.
+ var/first_match_only = TRUE
+ ///Will inject into atoms of this type.
+ var/target_type
+ ///Will inject into atoms with this name.
+ var/target_name
+ ///Name of the trait, in the lower-case text (NOT the upper-case define) form.
+ var/trait_name
+
+//Late init so everything is likely ready and loaded (no warranty)
+/obj/effect/mapping_helpers/trait_injector/LateInitialize()
+ if(!GLOB.trait_name_map)
+ GLOB.trait_name_map = generate_trait_name_map()
+ if(!GLOB.trait_name_map.Find(trait_name))
+ CRASH("Wrong trait in [type] - [trait_name] is not a trait")
+ var/turf/target_turf = get_turf(src)
+ var/matches_found = 0
+ for(var/a in target_turf.GetAllContents())
+ var/atom/atom_on_turf = a
+ if(atom_on_turf == src)
+ continue
+ if(target_name && atom_on_turf.name != target_name)
+ continue
+ if(target_type && !istype(atom_on_turf,target_type))
+ continue
+ ADD_TRAIT(atom_on_turf, trait_name, MAPPING_HELPER_TRAIT)
+ matches_found++
+ if(first_match_only)
+ qdel(src)
+ return
+ if(!matches_found)
+ stack_trace("Trait mapper found no targets at ([x], [y], [z]). First Match Only: [first_match_only ? "true" : "false"] target type: [target_type] | target name: [target_name] | trait name: [trait_name]")
+ qdel(src)
+
+/// Fetches an external dmi and applies to the target object
+/obj/effect/mapping_helpers/custom_icon
+ name = "Custom Icon Helper"
+ icon_state = "trait"
+ late = TRUE
+ ///Will inject into all fitting the criteria if false, otherwise first found.
+ var/first_match_only = TRUE
+ ///Will inject into atoms of this type.
+ var/target_type
+ ///Will inject into atoms with this name.
+ var/target_name
+ /// This is the var tha will be set with the fetched icon. In case you want to set some secondary icon sheets like inhands and such.
+ var/target_variable = "icon"
+ /// This should return raw dmi in response to http get request. For example: "https://github.com/tgstation/SS13-sprites/raw/master/mob/medu.dmi?raw=true"
+ var/icon_url
+
+/obj/effect/mapping_helpers/custom_icon/LateInitialize()
+ ///TODO put this injector stuff under common root
+ var/I = fetch_icon(icon_url)
+ var/turf/target_turf = get_turf(src)
+ var/matches_found = 0
+ for(var/a in target_turf.GetAllContents())
+ var/atom/atom_on_turf = a
+ if(atom_on_turf == src)
+ continue
+ if(target_name && atom_on_turf.name != target_name)
+ continue
+ if(target_type && !istype(atom_on_turf,target_type))
+ continue
+ atom_on_turf.vars[target_variable] = I
+ matches_found++
+ if(first_match_only)
+ qdel(src)
+ return
+ if(!matches_found)
+ stack_trace("[src] found no targets at ([x], [y], [z]). First Match Only: [first_match_only ? "true" : "false"] target type: [target_type] | target name: [target_name]")
+ qdel(src)
+
+/obj/effect/mapping_helpers/custom_icon/proc/fetch_icon(url)
+ var/static/icon_cache = list()
+ var/static/query_in_progress = FALSE //We're using a single tmp file so keep it linear.
+ if(query_in_progress)
+ UNTIL(!query_in_progress)
+ if(icon_cache[url])
+ return icon_cache[url]
+ log_asset("Custom Icon Helper fetching dmi from: [url]")
+ var/datum/http_request/request = new()
+ var/file_name = "tmp/custom_map_icon.dmi"
+ request.prepare(RUSTG_HTTP_METHOD_GET, url , "", "", file_name)
+ query_in_progress = TRUE
+ request.begin_async()
+ UNTIL(request.is_complete())
+ var/datum/http_response/response = request.into_response()
+ if(response.errored || response.status_code != 200)
+ query_in_progress = FALSE
+ CRASH("Failed to fetch mapped custom icon from url [url], code: [response.status_code], error: [response.error]")
+ var/icon/I = new(file_name)
+ icon_cache[url] = I
+ query_in_progress = FALSE
+ return I
diff --git a/code/modules/mapping/mapping_helpers/baseturf.dm b/code/modules/mapping/mapping_helpers/baseturf.dm
index f4bd0d7c7f..4d79d3dba5 100644
--- a/code/modules/mapping/mapping_helpers/baseturf.dm
+++ b/code/modules/mapping/mapping_helpers/baseturf.dm
@@ -30,8 +30,8 @@
qdel(src)
/obj/effect/baseturf_helper/proc/replace_baseturf(turf/thing)
- var/list/baseturf_cache = thing.baseturfs
- if(length(baseturf_cache))
+ if(length(thing.baseturfs))
+ var/list/baseturf_cache = thing.baseturfs.Copy()
for(var/i in baseturf_cache)
if(baseturf_to_replace[i])
baseturf_cache -= i
@@ -44,6 +44,8 @@
else
thing.PlaceOnBottom(null, baseturf)
+
+
/obj/effect/baseturf_helper/space
name = "space baseturf editor"
baseturf = /turf/open/space
@@ -79,4 +81,3 @@
/obj/effect/baseturf_helper/lava_land/surface
name = "lavaland baseturf editor"
baseturf = /turf/open/lava/smooth/lava_land_surface
-
diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm
index cda38033c2..dc52fb7f20 100644
--- a/code/modules/mining/equipment/explorer_gear.dm
+++ b/code/modules/mining/equipment/explorer_gear.dm
@@ -2,8 +2,9 @@
/obj/item/clothing/suit/hooded/explorer
name = "explorer suit"
desc = "An armoured suit for exploring harsh environments."
- icon_state = "explorer"
- item_state = "explorer"
+ icon_state = "explorer-normal"
+ item_state = "explorer-normal"
+ var/suit_type = "normal"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
cold_protection = CHEST|GROIN|LEGS|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
@@ -13,11 +14,15 @@
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe)
resistance_flags = FIRE_PROOF
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC|STYLE_PAW_TAURIC
+ no_t = TRUE
/obj/item/clothing/head/hooded/explorer
name = "explorer hood"
desc = "An armoured hood for exploring harsh environments."
- icon_state = "explorer"
+ icon_state = "explorer-normal"
+ item_state = "explorer-normal"
+ var/suit_type = "normal"
+ var/basestate = "normal"
body_parts_covered = HEAD
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
@@ -33,10 +38,40 @@
/obj/item/clothing/suit/hooded/explorer/standard/Initialize()
. = ..()
AddComponent(/datum/component/armor_plate)
+ RegisterSignal(src, COMSIG_ARMOR_PLATED, .proc/upgrade_icon)
+
+/obj/item/clothing/suit/hooded/explorer/standard/proc/upgrade_icon(datum/source, amount, maxamount)
+ SIGNAL_HANDLER
+
+ if(amount)
+ name = "reinforced [initial(name)]"
+ suit_type = "normal_goliath"
+ if(amount == maxamount)
+ suit_type = "normal_goliath_full"
+ icon_state = "explorer-[suit_type]"
+ if(ishuman(loc))
+ var/mob/living/carbon/human/wearer = loc
+ if(wearer.wear_suit == src)
+ wearer.update_inv_wear_suit()
/obj/item/clothing/head/hooded/explorer/standard/Initialize()
. = ..()
AddComponent(/datum/component/armor_plate)
+ RegisterSignal(src, COMSIG_ARMOR_PLATED, .proc/upgrade_icon)
+
+/obj/item/clothing/head/hooded/explorer/standard/proc/upgrade_icon(datum/source, amount, maxamount)
+ SIGNAL_HANDLER
+
+ if(amount)
+ name = "reinforced [initial(name)]"
+ suit_type = "normal_goliath"
+ if(amount == maxamount)
+ suit_type = "normal_goliath_full"
+ icon_state = "explorer-[suit_type]"
+ if(ishuman(loc))
+ var/mob/living/carbon/human/wearer = loc
+ if(wearer.head == src)
+ wearer.update_inv_head()
/obj/item/clothing/mask/gas/explorer
name = "explorer gas mask"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
index 88dda923a0..e002fa369d 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
@@ -1058,3 +1058,58 @@
/datum/sprite_accessory/hair/zone
name = "Zone"
icon_state = "hair_zone"
+
+/datum/sprite_accessory/hair_gradient
+ icon = 'icons/mob/hair_gradients.dmi'
+
+/datum/sprite_accessory/hair_gradient/none
+ name = "None"
+ icon_state = "none"
+
+/datum/sprite_accessory/hair_gradient/fadeup
+ name = "Fade Up"
+ icon_state = "fadeup"
+
+/datum/sprite_accessory/hair_gradient/fadedown
+ name = "Fade Down"
+ icon_state = "fadedown"
+
+/datum/sprite_accessory/hair_gradient/vertical_split
+ name = "Vertical Split"
+ icon_state = "vsplit"
+
+/datum/sprite_accessory/hair_gradient/_split
+ name = "Horizontal Split"
+ icon_state = "bottomflat"
+
+/datum/sprite_accessory/hair_gradient/reflected
+ name = "Reflected"
+ icon_state = "reflected_high"
+
+/datum/sprite_accessory/hair_gradient/reflected_inverse
+ name = "Reflected Inverse"
+ icon_state = "reflected_inverse_high"
+
+/datum/sprite_accessory/hair_gradient/wavy
+ name = "Wavy"
+ icon_state = "wavy"
+
+/datum/sprite_accessory/hair_gradient/long_fade_up
+ name = "Long Fade Up"
+ icon_state = "long_fade_up"
+
+/datum/sprite_accessory/hair_gradient/long_fade_down
+ name = "Long Fade Down"
+ icon_state = "long_fade_down"
+
+/datum/sprite_accessory/hair_gradient/short_fade_up
+ name = "Short Fade Up"
+ icon_state = "short_fade_up"
+
+/datum/sprite_accessory/hair_gradient/short_fade_down
+ name = "Short Fade Down"
+ icon_state = "short_fade_down"
+
+/datum/sprite_accessory/hair_gradient/wavy_spike
+ name = "Spiked Wavy"
+ icon_state = "wavy_spiked"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm b/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm
index c7cd699ec9..08897ade34 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm
@@ -38,14 +38,14 @@
icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi'
name = "Synthetic Lizard - Pecs Light"
icon_state = "synthlizpecslight"
- covered_limbs = list("Chest" = MATRIX_GREEN_BLUE)
+ covered_limbs = list("Chest" = MATRIX_GREEN_BLUE, "Left Arm" = MATRIX_BLUE, "Right Arm" = MATRIX_BLUE, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN)
/datum/sprite_accessory/mam_body_markings/synthliz
recommended_species = list("synthliz")
icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi'
name = "Synthetic Lizard - Plates"
icon_state = "synthlizscutes"
- covered_limbs = list("Chest" = MATRIX_GREEN)
+ covered_limbs = list("Chest" = MATRIX_GREEN, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN)
//Synth tails
/datum/sprite_accessory/tails/mam_tails/synthliz
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
index b5ba7f0732..64a3c1a24c 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
@@ -542,6 +542,20 @@
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
matrixed_sections = MATRIX_RED_GREEN
+/datum/sprite_accessory/tails/human/takahiro_kitsune
+ name = "Takahiro Kitsune Tails" //takahiro had five tails i just wanted to follow the 'T' naming convention vs. tamamo and triple
+ icon_state = "7sune"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+ matrixed_sections = MATRIX_RED_GREEN
+
+/datum/sprite_accessory/tails_animated/human/takahiro_kitsune
+ name = "Takahiro Kitsune Tails"
+ icon_state = "7sune"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+ matrixed_sections = MATRIX_RED_GREEN
+
/datum/sprite_accessory/tails/human/tentacle
name = "Tentacle"
icon_state = "tentacle"
diff --git a/code/modules/mob/dead/observer/login.dm b/code/modules/mob/dead/observer/login.dm
index 8daf8ec052..ad71d49489 100644
--- a/code/modules/mob/dead/observer/login.dm
+++ b/code/modules/mob/dead/observer/login.dm
@@ -16,5 +16,5 @@
if (isturf(T))
update_z(T.z)
- update_icon(preferred_form)
+ update_icon(null, preferred_form)
updateghostimages()
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 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..8464e15328 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -52,6 +52,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/hair_color
///The alpha used by the hair. 255 is completely solid, 0 is invisible.
var/hair_alpha = 255
+ ///The gradient style used for the mob's hair.
+ var/grad_style
+ ///The gradient color used to color the gradient.
+ var/grad_color
///Does the species use skintones or not? As of now only used by humans.
var/use_skintones = FALSE
@@ -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
@@ -1980,7 +1999,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(CHECK_MOBILITY(target, MOBILITY_STAND))
target.adjustStaminaLoss(5)
else
- target.adjustStaminaLoss(target.getStaminaLoss() > 75? 5 : 75)
+ target.adjustStaminaLoss(IS_STAMCRIT(target)? 2 : 10)
if(target.is_shove_knockdown_blocked())
return
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index fba6ecd40c..ac25c9e021 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -807,11 +807,11 @@
/datum/species/golem/plastic/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
- C.AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
+ C.AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_NUDE)
/datum/species/golem/plastic/on_species_loss(mob/living/carbon/C)
. = ..()
- C.RemoveElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
+ C.RemoveElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_NUDE)
/datum/species/golem/bronze
name = "Bronze Golem"
diff --git a/code/modules/mob/living/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/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 4e33fba208..d19ef4c16e 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -322,6 +322,17 @@
else
to_chat(user, "Encryption Key ports not configured.")
+/obj/item/paicard/emag_act(mob/user) // Emag to wipe the master DNA and supplemental directive
+ . = ..()
+ if(!pai)
+ return
+ to_chat(user, "You override [pai]'s directive system, clearing its master string and supplied directive.")
+ to_chat(pai, "Warning: System override detected, check directive sub-system for any changes.'")
+ log_game("[key_name(user)] emagged [key_name(pai)], wiping their master DNA and supplemental directive.")
+ pai.master = null
+ pai.master_dna = null
+ pai.laws.supplied[1] = "None." // Sets supplemental directive to this
+
/mob/living/silicon/pai/proc/short_radio()
if(radio_short_timerid)
deltimer(radio_short_timerid)
diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm
index b11737659c..559ffbbc08 100644
--- a/code/modules/mob/living/silicon/robot/inventory.dm
+++ b/code/modules/mob/living/silicon/robot/inventory.dm
@@ -3,12 +3,15 @@
/**
* Returns the thing in our active hand (whatever is in our active module-slot, in this case)
+ *
+ * Arguments
+ * * get_gripper - If the active module is a gripper, should we return the gripper or the contained item? (if the gripper contains nothing, returns the gripper anyways)
*/
-/mob/living/silicon/robot/get_active_held_item()
+/mob/living/silicon/robot/get_active_held_item(get_gripper = FALSE)
var/item = module_active
// snowflake handler for the gripper
- if(istype(item, /obj/item/weapon/gripper))
- var/obj/item/weapon/gripper/G = item
+ if(istype(item, /obj/item/gripper) && !get_gripper)
+ var/obj/item/gripper/G = item
if(G.wrapped)
if(G.wrapped.loc != G)
G.wrapped = null
@@ -284,9 +287,14 @@
/**
* Unequips the active held item, if there is one.
+ *
+ * Will always consider dropping gripper contents first.
*/
/mob/living/silicon/robot/proc/uneq_active()
if(module_active)
+ var/obj/item/gripper/gripper = get_active_held_item(TRUE)
+ if(istype(gripper) && gripper.drop_held())
+ return
unequip_module_from_slot(module_active, get_selected_module())
/**
@@ -302,11 +310,12 @@
* Checks if the item is currently in a slot.
*
* If the item is found in a slot, this returns TRUE. Otherwise, it returns FALSE
+ * Modified to accept items inside of grippers, used for `code\modules\tgui\states\hands.dm:27`
* Arguments
* * item_module - the item being checked
*/
/mob/living/silicon/robot/proc/activated(obj/item/item_module)
- if(item_module in held_items)
+ if(get_active_held_item() == item_module || (item_module in held_items))
return TRUE
return FALSE
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 7891d3a077..71697524d6 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/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index 8348af43fa..66b4bd5e73 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -98,6 +98,18 @@
qdel(bigcheese)
evolve()
return
+ for(var/obj/item/trash/garbage in range(1, src))
+ if(is_station_level(z))
+ if(prob(2))
+ qdel(garbage)
+ evolve_plague()
+ return
+ for(var/obj/effect/decal/cleanable/blood/gibs/leftovers in range(1, src))
+ if(is_station_level(z))
+ if(prob(2))
+ qdel(leftovers)
+ evolve_plague()
+ return
/**
*Checks the mouse cap, if it's above the cap, doesn't spawn a mouse. If below, spawns a mouse and adds it to cheeserats.
@@ -123,6 +135,17 @@
mind.transfer_to(regalrat)
qdel(src)
+/mob/living/simple_animal/mouse/proc/evolve_plague()
+ return
+
+/*
+ var/mob/living/simple_animal/hostile/plaguerat = new /mob/living/simple_animal/hostile/plaguerat(loc)
+ visible_message("[src] devours the food! He rots into something worse!")
+ if(mind)
+ mind.transfer_to(plaguerat)
+ qdel(src)
+*/
+
/*
* Mouse types
*/
@@ -169,3 +192,17 @@ GLOBAL_VAR(tom_existed)
/obj/item/reagent_containers/food/snacks/deadmouse/on_grind()
reagents.clear_reagents()
+/mob/living/simple_animal/mouse/proc/miasma(datum/gas_mixture/environment, check_temp = FALSE)
+ if(isturf(src.loc) && isopenturf(src.loc))
+ var/turf/open/ST = src.loc
+ var/miasma_moles = ST.air.get_moles(GAS_MIASMA)
+ if(prob(5) && miasma_moles >= 5)
+ evolve_plague()
+ else if(miasma_moles >= 20)
+ evolve_plague()
+ return
+
+/mob/living/simple_animal/mouse/handle_environment(datum/gas_mixture/environment)
+ . = ..()
+ if(is_station_level(z))
+ miasma()
diff --git a/code/modules/mob/living/simple_animal/gremlin/gremlin.dm b/code/modules/mob/living/simple_animal/gremlin/gremlin.dm
new file mode 100644
index 0000000000..61436cea1c
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/gremlin/gremlin.dm
@@ -0,0 +1,254 @@
+#define GREMLIN_VENT_CHANCE 1.75
+
+//Gremlins
+//Small monsters that don't attack humans or other animals. Instead they mess with electronics, computers and machinery
+
+//List of objects that gremlins can't tamper with (because nobody coded an interaction for it)
+//List starts out empty. Whenever a gremlin finds a machine that it couldn't tamper with, the machine's type is added here, and all machines of such type are ignored from then on (NOT SUBTYPES)
+GLOBAL_LIST(bad_gremlin_items)
+
+/mob/living/simple_animal/hostile/gremlin
+ name = "gremlin"
+ desc = "This tiny creature finds great joy in discovering and using technology. Nothing excites it more than pushing random buttons on a computer to see what it might do."
+ icon = 'icons/mob/mob.dmi'
+ icon_state = "gremlin"
+ icon_living = "gremlin"
+ icon_dead = "gremlin_dead"
+
+ var/in_vent = FALSE
+
+ health = 20
+ maxHealth = 20
+ search_objects = 3 //Completely ignore mobs
+
+ //Tampering is handled by the 'npc_tamper()' obj proc
+ wanted_objects = list(
+ /obj/machinery,
+ /obj/item/reagent_containers/food,
+ /obj/structure/sink
+ )
+
+ var/obj/machinery/atmospherics/components/unary/vent_pump/entry_vent
+ var/obj/machinery/atmospherics/components/unary/vent_pump/exit_vent
+
+ dextrous = TRUE
+ possible_a_intents = list(INTENT_HELP, INTENT_GRAB, INTENT_DISARM, INTENT_HARM)
+ faction = list("meme", "gremlin")
+ speed = 0.5
+ gold_core_spawnable = 2
+ unique_name = TRUE
+
+ //Ensure gremlins don't attack other mobs
+ melee_damage_upper = 0
+ melee_damage_lower = 0
+ attack_sound = null
+ obj_damage = 0
+ environment_smash = ENVIRONMENT_SMASH_NONE
+
+ //List of objects that we don't even want to try to tamper with
+ //Subtypes of these are calculated too
+ var/list/unwanted_objects = list(/obj/machinery/atmospherics/pipe, /turf, /obj/structure) //ensure gremlins dont try to fuck with walls / normal pipes / glass / etc
+
+ var/min_next_vent = 0
+
+ //Amount of ticks spent pathing to the target. If it gets above a certain amount, assume that the target is unreachable and stop
+ var/time_chasing_target = 0
+
+ //If you're going to make gremlins slower, increase this value - otherwise gremlins will abandon their targets too early
+ var/max_time_chasing_target = 2
+
+ var/next_eat = 0
+
+ //Last 20 heard messages are remembered by gremlins, and will be used to generate messages for comms console tampering, etc...
+ var/list/hear_memory = list()
+ var/const/max_hear_memory = 20
+
+/mob/living/simple_animal/hostile/gremlin/Initialize()
+ . = ..()
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
+ access_card = new /obj/item/card/id(src)
+ var/datum/job/captain/C = new /datum/job/captain
+ access_card.access = C.get_access()
+
+/mob/living/simple_animal/hostile/gremlin/AttackingTarget()
+ var/is_hungry = world.time >= next_eat || prob(25)
+ if(istype(target, /obj/item/reagent_containers/food) && is_hungry) //eat food if we're hungry or bored
+ visible_message("[src] hungrily devours [target]!")
+ playsound(src, 'sound/items/eatfood.ogg', 50, 1)
+ qdel(target)
+ LoseTarget()
+ next_eat = world.time + rand(700, 3000) //anywhere from 70 seconds to 5 minutes until the gremlin is hungry again
+ return
+ if(istype(target, /obj))
+ var/obj/M = target
+ tamper(M)
+ if(prob(50)) //50% chance to move to the next machine
+ LoseTarget()
+
+/mob/living/simple_animal/hostile/gremlin/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, message_mode)
+ . = ..()
+ if(message)
+ hear_memory.Insert(1, raw_message)
+ if(hear_memory.len > max_hear_memory)
+ hear_memory.Cut(hear_memory.len)
+
+/mob/living/simple_animal/hostile/gremlin/proc/generate_markov_input()
+ var/result = ""
+
+ for(var/memory in hear_memory)
+ result += memory + " "
+
+ return result
+
+/mob/living/simple_animal/hostile/gremlin/proc/generate_markov_chain()
+ return markov_chain(generate_markov_input(), rand(2,5), rand(100,700)) //The numbers are chosen arbitarily
+
+/mob/living/simple_animal/hostile/gremlin/proc/tamper(obj/M)
+ switch(M.npc_tamper_act(src))
+ if(NPC_TAMPER_ACT_FORGET)
+ visible_message(pick(
+ "\The [src] plays around with \the [M], but finds it rather boring.",
+ "\The [src] tries to think of some more ways to screw \the [M] up, but fails miserably.",
+ "\The [src] decides to ignore \the [M], and starts looking for something more fun."))
+
+ LAZYADD(GLOB.bad_gremlin_items,M.type)
+ return FALSE
+ if(NPC_TAMPER_ACT_NOMSG)
+ //Don't create a visible message
+ return TRUE
+
+ else
+ visible_message(pick(
+ "\The [src]'s eyes light up as \he tampers with \the [M].",
+ "\The [src] twists some knobs around on \the [M] and bursts into laughter!",
+ "\The [src] presses a few buttons on \the [M] and giggles mischievously.",
+ "\The [src] rubs its hands devilishly and starts messing with \the [M].",
+ "\The [src] turns a small valve on \the [M]."))
+
+ //Add a clue for detectives to find. The clue is only added if no such clue already existed on that machine
+ return TRUE
+
+/mob/living/simple_animal/hostile/gremlin/CanAttack(atom/new_target)
+ if(LAZYFIND(GLOB.bad_gremlin_items,new_target.type))
+ return FALSE
+ if(is_type_in_list(new_target, unwanted_objects))
+ return FALSE
+ if(istype(new_target, /obj/machinery))
+ var/obj/machinery/M = new_target
+ if(M.stat) //Unpowered or broken
+ return FALSE
+ else if(istype(new_target, /obj/machinery/door/firedoor))
+ var/obj/machinery/door/firedoor/F = new_target
+ //Only tamper with firelocks that are closed, opening them!
+ if(!F.density)
+ return FALSE
+
+ return ..()
+
+/mob/living/simple_animal/hostile/gremlin/death(gibbed)
+ walk(src,0)
+ QDEL_NULL(access_card)
+ return ..()
+
+/mob/living/simple_animal/hostile/gremlin/Life()
+ . = ..()
+ if(!health || stat == DEAD)
+ return
+ //Don't try to path to one target for too long. If it takes longer than a certain amount of time, assume it can't be reached and find a new one
+ if(!client) //don't do this shit if there's a client, they're capable of ventcrawling manually
+ if(in_vent)
+ target = null
+ if(entry_vent && get_dist(src, entry_vent) <= 1)
+ var/list/vents = list()
+ var/datum/pipeline/entry_vent_parent = entry_vent.parents[1]
+ for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent in entry_vent_parent.other_atmosmch)
+ vents += temp_vent
+ if(!vents.len)
+ entry_vent = null
+ in_vent = FALSE
+ return
+ exit_vent = pick(vents)
+ visible_message("[src] crawls into the ventilation ducts!")
+
+ loc = exit_vent
+ var/travel_time = round(get_dist(loc, exit_vent.loc) / 2)
+ addtimer(CALLBACK(src, .proc/exit_vents), travel_time) //come out at exit vent in 2 to 20 seconds
+
+
+ if(world.time > min_next_vent && !entry_vent && !in_vent && prob(GREMLIN_VENT_CHANCE)) //small chance to go into a vent
+ for(var/obj/machinery/atmospherics/components/unary/vent_pump/v in view(7,src))
+ if(!v.welded)
+ entry_vent = v
+ in_vent = TRUE
+ walk_to(src, entry_vent)
+ break
+ if(!target)
+ time_chasing_target = 0
+ else
+ if(++time_chasing_target > max_time_chasing_target)
+ LoseTarget()
+ time_chasing_target = 0
+ . = ..()
+
+/mob/living/simple_animal/hostile/gremlin/EscapeConfinement()
+ if(istype(loc, /obj) && CanAttack(loc)) //If we're inside a machine, screw with it
+ var/obj/M = loc
+ tamper(M)
+
+ return ..()
+
+/mob/living/simple_animal/hostile/gremlin/proc/exit_vents()
+ if(!exit_vent || exit_vent.welded)
+ loc = entry_vent
+ entry_vent = null
+ return
+ loc = exit_vent.loc
+ entry_vent = null
+ exit_vent = null
+ in_vent = FALSE
+ var/area/new_area = get_area(loc)
+ message_admins("[src] came out at [new_area][ADMIN_JMP(loc)]!")
+ if(new_area)
+ new_area.Entered(src)
+ visible_message("[src] climbs out of the ventilation ducts!")
+ min_next_vent = world.time + 900 //90 seconds between ventcrawls
+
+//This allows player-controlled gremlins to tamper with machinery
+/mob/living/simple_animal/hostile/gremlin/UnarmedAttack(var/atom/A)
+ if(istype(A, /obj/machinery) || istype(A, /obj/structure))
+ tamper(A)
+ if(istype(target, /obj/item/reagent_containers/food)) //eat food
+ visible_message("[src] hungrily devours [target]!", "You hungrily devour [target]!")
+ playsound(src, 'sound/items/eatfood.ogg', 50, 1)
+ qdel(target)
+ LoseTarget()
+ next_eat = world.time + rand(700, 3000) //anywhere from 70 seconds to 5 minutes until the gremlin is hungry again
+
+ return ..()
+
+/mob/living/simple_animal/hostile/gremlin/IsAdvancedToolUser()
+ return 1
+
+/mob/living/simple_animal/hostile/gremlin/proc/divide()
+ //Health is halved and then reduced by 2. A new gremlin is spawned with the same health as the parent
+ //Need to have at least 6 health for this, otherwise resulting health would be less than 1
+ if(health < 7.5)
+ return
+
+ visible_message("\The [src] splits into two!")
+ var/mob/living/simple_animal/hostile/gremlin/G = new /mob/living/simple_animal/hostile/gremlin(get_turf(src))
+
+ if(mind)
+ mind.transfer_to(G)
+
+ health = round(health * 0.5) - 2
+ maxHealth = health
+ resize *= 0.9
+
+ G.health = health
+ G.maxHealth = maxHealth
+
+/mob/living/simple_animal/hostile/gremlin/traitor
+ health = 85
+ maxHealth = 85
+ gold_core_spawnable = 0
diff --git a/code/modules/mob/living/simple_animal/gremlin/gremlin_act.dm b/code/modules/mob/living/simple_animal/gremlin/gremlin_act.dm
new file mode 100644
index 0000000000..ff0eb13dc7
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/gremlin/gremlin_act.dm
@@ -0,0 +1,214 @@
+/obj/proc/npc_tamper_act(mob/living/L)
+ return NPC_TAMPER_ACT_FORGET
+
+/obj/machinery/atmospherics/components/binary/passive_gate/npc_tamper_act(mob/living/L)
+ if(prob(50)) //Turn on/off
+ on = !on
+ investigate_log("was turned [on ? "on" : "off"] by [key_name(L)]", INVESTIGATE_ATMOS)
+ else //Change pressure
+ target_pressure = rand(0, MAX_OUTPUT_PRESSURE)
+ investigate_log("was set to [target_pressure] kPa by [key_name(L)]", INVESTIGATE_ATMOS)
+ update_icon()
+
+/obj/machinery/atmospherics/components/binary/pump/npc_tamper_act(mob/living/L)
+ if(prob(50)) //Turn on/off
+ on = !on
+ investigate_log("was turned [on ? "on" : "off"] by [key_name(L)]", INVESTIGATE_ATMOS)
+ else //Change pressure
+ target_pressure = rand(0, MAX_OUTPUT_PRESSURE)
+ investigate_log("was set to [target_pressure] kPa by [key_name(L)]", INVESTIGATE_ATMOS)
+ update_icon()
+
+/obj/machinery/atmospherics/components/binary/volume_pump/npc_tamper_act(mob/living/L)
+ if(prob(50)) //Turn on/off
+ on = !on
+ investigate_log("was turned [on ? "on" : "off"] by [key_name(L)]", INVESTIGATE_ATMOS)
+ else //Change pressure
+ transfer_rate = rand(0, MAX_TRANSFER_RATE)
+ investigate_log("was set to [transfer_rate] L/s by [key_name(L)]", INVESTIGATE_ATMOS)
+ update_icon()
+
+/obj/machinery/atmospherics/components/binary/valve/npc_tamper_act(mob/living/L)
+ attack_hand(L)
+
+/obj/machinery/space_heater/npc_tamper_act(mob/living/L)
+ var/list/choose_modes = list("standby", "heat", "cool")
+ if(prob(50))
+ choose_modes -= mode
+ mode = pick(choose_modes)
+ else
+ on = !on
+ update_icon()
+
+/obj/machinery/shield_gen/npc_tamper_act(mob/living/L)
+ attack_hand(L)
+
+/obj/machinery/firealarm/npc_tamper_act(mob/living/L)
+ alarm()
+
+/obj/machinery/airalarm/npc_tamper_act(mob/living/L)
+ if(panel_open)
+ wires.npc_tamper(L)
+ else
+ panel_open = !panel_open
+
+/obj/machinery/ignition_switch/npc_tamper_act(mob/living/L)
+ attack_hand(L)
+
+/obj/machinery/flasher_button/npc_tamper_act(mob/living/L)
+ attack_hand(L)
+
+/obj/machinery/crema_switch/npc_tamper_act(mob/living/L)
+ attack_hand(L)
+
+/obj/machinery/camera/npc_tamper_act(mob/living/L)
+ if(!panel_open)
+ panel_open = !panel_open
+ if(wires)
+ wires.npc_tamper(L)
+
+/obj/machinery/atmospherics/components/unary/cryo_cell/npc_tamper_act(mob/living/L)
+ if(prob(50))
+ if(beaker)
+ beaker.forceMove(loc)
+ beaker = null
+ else
+ if(occupant)
+ if(state_open)
+ if (close_machine() == usr)
+ on = TRUE
+ else
+ open_machine()
+
+/obj/machinery/door_control/npc_tamper_act(mob/living/L)
+ attack_hand(L)
+
+/obj/machinery/door/airlock/npc_tamper_act(mob/living/L)
+ //Open the firelocks as well, otherwise they block the way for our gremlin which isn't fun
+ for(var/obj/machinery/door/firedoor/F in get_turf(src))
+ if(F.density)
+ F.npc_tamper_act(L)
+
+ if(prob(40)) //40% - mess with wires
+ if(!panel_open)
+ panel_open = !panel_open
+ if(wires)
+ wires.npc_tamper(L)
+ else //60% - just open it
+ open()
+
+/obj/machinery/gibber/npc_tamper_act(mob/living/L)
+ attack_hand(L)
+
+/obj/machinery/light_switch/npc_tamper_act(mob/living/L)
+ attack_hand(L)
+
+/obj/machinery/turretid/npc_tamper_act(mob/living/L)
+ enabled = rand(0, 1)
+ lethal = rand(0, 1)
+ updateTurrets()
+
+/obj/machinery/vending/npc_tamper_act(mob/living/L)
+ if(!panel_open)
+ panel_open = !panel_open
+ if(wires)
+ wires.npc_tamper(L)
+
+/obj/machinery/shower/npc_tamper_act(mob/living/L)
+ attack_hand(L)
+
+
+/obj/machinery/deepfryer/npc_tamper_act(mob/living/L)
+ //Deepfry a random nearby item
+ var/list/pickable_items = list()
+
+ for(var/obj/item/I in range(1, L))
+ pickable_items.Add(I)
+
+ if(!pickable_items.len)
+ return
+
+ var/obj/item/I = pick(pickable_items)
+
+ attackby(I, L) //shove the item in, even if it can't be deepfried normally
+
+/obj/machinery/power/apc/npc_tamper_act(mob/living/L)
+ if(!panel_open)
+ panel_open = !panel_open
+ if(wires)
+ wires.npc_tamper(L)
+
+/obj/machinery/power/rad_collector/npc_tamper_act(mob/living/L)
+ attack_hand(L)
+
+/obj/machinery/power/emitter/npc_tamper_act(mob/living/L)
+ attack_hand(L)
+
+/obj/machinery/particle_accelerator/control_box/npc_tamper_act(mob/living/L)
+ if(!panel_open)
+ panel_open = !panel_open
+ if(wires)
+ wires.npc_tamper(L)
+
+/obj/machinery/computer/communications/npc_tamper_act(mob/living/user)
+ if(!authenticated)
+ if(prob(20)) //20% chance to log in
+ authenticated = TRUE
+
+ else //Already logged in
+ if(prob(50)) //50% chance to log off
+ authenticated = FALSE
+ else if(istype(user, /mob/living/simple_animal/hostile/gremlin)) //make a hilarious public message
+ var/mob/living/simple_animal/hostile/gremlin/G = user
+ var/result = G.generate_markov_chain()
+
+ if(result)
+ if(prob(85))
+ SScommunications.make_announcement(G, FALSE, result)
+ var/turf/T = get_turf(G)
+ log_say("[key_name(usr)] ([ADMIN_JMP(T)]) has made a captain announcement: [result]")
+ message_admins("[key_name_admin(G)] has made a captain announcement.", 1)
+ else
+ if(SSshuttle.emergency.mode == SHUTTLE_IDLE)
+ SSshuttle.requestEvac(G, result)
+ else if(SSshuttle.emergency.mode == SHUTTLE_ESCAPE)
+ SSshuttle.cancelEvac(G)
+
+/obj/machinery/button/door/npc_tamper_act(mob/living/L)
+ attack_hand(L)
+
+/obj/machinery/sleeper/npc_tamper_act(mob/living/L)
+ if(prob(75))
+ inject_chem(pick(available_chems))
+ else
+ if(state_open)
+ close_machine()
+ else
+ open_machine()
+
+/obj/machinery/power/smes/npc_tamper_act(mob/living/L)
+ if(prob(50)) //mess with input
+ input_level = rand(0, input_level_max)
+ else //mess with output
+ output_level = rand(0, output_level_max)
+
+/obj/machinery/syndicatebomb/npc_tamper_act(mob/living/L) //suicide bomber gremlins
+ if(!open_panel)
+ open_panel = !open_panel
+ if(wires)
+ wires.npc_tamper(L)
+
+/obj/machinery/computer/bank_machine/npc_tamper_act(mob/living/L)
+ siphoning = !siphoning
+
+/obj/machinery/computer/slot_machine/npc_tamper_act(mob/living/L)
+ spin(L)
+
+/obj/structure/sink/npc_tamper_act(mob/living/L)
+ if(istype(L, /mob/living/simple_animal/hostile/gremlin))
+ visible_message("\The [L] climbs into \the [src] and turns the faucet on!")
+
+ var/mob/living/simple_animal/hostile/gremlin/G = L
+ G.divide()
+
+ return NPC_TAMPER_ACT_NOMSG
diff --git a/code/modules/mob/living/simple_animal/gremlin/gremlin_event.dm b/code/modules/mob/living/simple_animal/gremlin/gremlin_event.dm
new file mode 100644
index 0000000000..6f5f0e3dba
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/gremlin/gremlin_event.dm
@@ -0,0 +1,44 @@
+/datum/round_event_control/gremlin
+ name = "Spawn Gremlins"
+ typepath = /datum/round_event/gremlin
+ weight = 15
+ max_occurrences = 2
+ earliest_start = 20 MINUTES
+ min_players = 5
+
+
+
+/datum/round_event/gremlin
+ var/static/list/acceptable_spawns = list("xeno_spawn", "generic event spawn", "blobstart", "Assistant")
+
+/datum/round_event/gremlin/announce()
+ priority_announce("Bioscans indicate that some gremlins entered through the vents. Deal with them!", "Gremlin Alert", 'sound/announcer/classic/attention.ogg')
+
+/datum/round_event/gremlin/start()
+
+ var/list/spawn_locs = list()
+
+ for(var/obj/effect/landmark/L in GLOB.landmarks_list)
+ if(isturf(L.loc) && !isspaceturf(L.loc))
+ if(L.name in acceptable_spawns)
+ spawn_locs += L.loc
+ if(!spawn_locs.len) //If we can't find any gremlin spawns, try the xeno spawns
+ for(var/obj/effect/landmark/L in GLOB.landmarks_list)
+ if(isturf(L.loc))
+ switch(L.name)
+ if("Assistant")
+ spawn_locs += L.loc
+ if(!spawn_locs.len) //If we can't find THAT, then just give up and cry
+ return MAP_ERROR
+
+ var/gremlins_to_spawn = rand(2,5)
+ var/list/gremlin_areas = list()
+ for(var/i = 0, i <= gremlins_to_spawn, i++)
+ var/spawnat = pick(spawn_locs)
+ spawn_locs -= spawnat
+ gremlin_areas += get_area(spawnat)
+ new /mob/living/simple_animal/hostile/gremlin(spawnat)
+ var/grems = gremlin_areas.Join(", ")
+ message_admins("Gremlins have been spawned at the areas: [grems]")
+ log_game("Gremlins have been spawned at the areas: [grems]")
+ return SUCCESSFUL_SPAWN
diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm
index b85c0ee643..ec11a3e83e 100644
--- a/code/modules/mob/living/simple_animal/guardian/guardian.dm
+++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm
@@ -60,6 +60,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
var/magic_fluff_string = "You draw the Coder, symbolizing bugs and errors. This shouldn't happen! Submit a bug report!"
var/tech_fluff_string = "BOOT SEQUENCE COMPLETE. ERROR MODULE LOADED. THIS SHOULDN'T HAPPEN. Submit a bug report!"
var/carp_fluff_string = "CARP CARP CARP SOME SORT OF HORRIFIC BUG BLAME THE CODERS CARP CARP CARP"
+ var/customized
/// sigh, fine.
var/datum/song/holoparasite/music_datum
@@ -142,11 +143,13 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
to_chat(src, "You are capable of manifesting or recalling to your master with the buttons on your HUD. You will also find a button to communicate with [summoner.p_them()] privately there.")
to_chat(src, "While personally invincible, you will die if [summoner.real_name] does, and any damage dealt to you will have a portion passed on to [summoner.p_them()] as you feed upon [summoner.p_them()] to sustain yourself.")
to_chat(src, playstyle_string)
- guardiancustomize()
+ if(!customized)
+ guardiancustomize()
/mob/living/simple_animal/hostile/guardian/proc/guardiancustomize()
guardianrecolor()
guardianrename()
+ customized = TRUE
/mob/living/simple_animal/hostile/guardian/proc/guardianrecolor()
guardiancolor = input(src,"What would you like your color to be?","Choose Your Color","#ffffff") as color|null
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index 5751512b19..7ca2f6c561 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -528,21 +528,7 @@ Difficulty: Very Hard
/obj/machinery/anomalous_crystal/emitter/ActivationReaction(mob/user, method)
if(..())
var/obj/item/projectile/P = new generated_projectile(get_turf(src))
- P.setDir(dir)
- switch(dir)
- if(NORTH)
- P.yo = 20
- P.xo = 0
- if(EAST)
- P.yo = 0
- P.xo = 20
- if(WEST)
- P.yo = 0
- P.xo = -20
- else
- P.yo = -20
- P.xo = 0
- P.fire()
+ P.fire(angle2dir(dir))
/obj/machinery/anomalous_crystal/dark_reprise //Revives anyone nearby, but turns them into shadowpeople and renders them uncloneable, so the crystal is your only hope of getting up again if you go down.
observer_desc = "When activated, this crystal revives anyone nearby, but turns them into Shadowpeople and makes them unclonable, making the crystal their only hope of getting up again."
diff --git a/code/modules/mob/living/simple_animal/hostile/plaguerat.dm b/code/modules/mob/living/simple_animal/hostile/plaguerat.dm
new file mode 100644
index 0000000000..2b92894317
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/plaguerat.dm
@@ -0,0 +1,188 @@
+#define RAT_VENT_CHANCE 1.75
+GLOBAL_LIST_EMPTY(plague_rats)
+
+/mob/living/simple_animal/hostile/plaguerat
+ name = "plague rat"
+ desc = "A large decaying rat. It spreads its filth and emits a putrid odor to create more of its kind."
+ icon_state = "plaguerat"
+ icon_living = "plaguerat"
+ icon_dead = "plaguerat_dead"
+ speak = list("Skree!","SKREEE!","Squeak?")
+ speak_emote = list("squeaks")
+ emote_hear = list("Hisses.")
+ emote_see = list("runs in a circle.", "stands on its hind legs.")
+ gender = NEUTER
+ speak_chance = 1
+ turns_per_move = 5
+ maxHealth = 100
+ health = 100
+ see_in_dark = 6
+ obj_damage = 10
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 1)
+ response_help_continuous = "glares at"
+ response_help_simple = "glare at"
+ response_disarm_continuous = "skoffs at"
+ response_disarm_simple = "skoff at"
+ response_harm_continuous = "slashes"
+ response_harm_simple = "slash"
+ melee_damage_lower = 6
+ melee_damage_upper = 8
+ attack_verb_continuous = "slashes"
+ attack_verb_simple = "slash"
+ attack_sound = 'sound/weapons/punch1.ogg'
+ faction = list("rat")
+ density = FALSE
+ pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
+ mob_size = MOB_SIZE_TINY
+ mob_biotypes = MOB_ORGANIC|MOB_BEAST
+ var/datum/action/cooldown/scavenge
+ var/last_spawn_time = 0
+ var/in_vent = FALSE
+ var/min_next_vent = 0
+ var/obj/machinery/atmospherics/components/unary/entry_vent
+ var/obj/machinery/atmospherics/components/unary/exit_vent
+
+/mob/living/simple_animal/hostile/plaguerat/Initialize()
+ . = ..()
+ GLOB.plague_rats += src
+ AddComponent(/datum/component/swarming)
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
+ scavenge = new /datum/action/cooldown/scavenge
+ scavenge.Grant(src)
+
+/mob/living/simple_animal/hostile/plaguerat/Destroy()
+ GLOB.plague_rats -= src
+ return ..()
+
+/mob/living/simple_animal/hostile/plaguerat/Life(seconds, times_fired)
+ . = ..()
+ //Don't try to path to one target for too long. If it takes longer than a certain amount of time, assume it can't be reached and find a new one
+ //Literally only here to prevent farming and that's it.
+ if(!client) //don't do this shit if there's a client, they're capable of ventcrawling manually
+ if(in_vent)
+ target = null
+ if(entry_vent && get_dist(src, entry_vent) <= 1)
+ var/list/vents = list()
+ var/datum/pipeline/entry_vent_parent = entry_vent.parents[1]
+ for(var/obj/machinery/atmospherics/components/unary/temp_vent in entry_vent_parent.other_atmosmch)
+ vents += temp_vent
+ if(!vents.len)
+ entry_vent = null
+ in_vent = FALSE
+ return
+ exit_vent = pick(vents)
+ visible_message("[src] crawls into the ventilation ducts!")
+
+ loc = exit_vent
+ var/travel_time = round(get_dist(loc, exit_vent.loc) / 2)
+ addtimer(CALLBACK(src, .proc/exit_vents), travel_time) //come out at exit vent in 2 to 20 seconds
+
+
+ if(world.time > min_next_vent && !entry_vent && !in_vent && prob(RAT_VENT_CHANCE)) //small chance to go into a vent
+ for(var/obj/machinery/atmospherics/components/unary/v in view(7,src))
+ if(!v.welded)
+ entry_vent = v
+ in_vent = TRUE
+ walk_to(src, entry_vent)
+ break
+
+/mob/living/simple_animal/hostile/plaguerat/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
+ if(isopenturf(loc))
+ var/turf/open/T = src.loc
+ var/datum/gas_mixture/stank = new
+ var/miasma_moles = T.air.get_moles(GAS_MIASMA)
+ stank.set_moles(GAS_MIASMA,5)
+ stank.set_temperature(BODYTEMP_NORMAL)
+ if(T.air)
+ if(miasma_moles < 200)
+ T.assume_air(stank)
+ T.air_update_turf()
+
+ if(prob(40))
+ scavenge.Trigger()
+ if(prob(50))
+ var/turf/open/floor/F = get_turf(src)
+ if(istype(F) && !F.intact)
+ var/obj/structure/cable/C = locate() in F
+ if(C && C.avail())
+ visible_message("[src] chews through the [C]. It looks unharmed!")
+ playsound(src, 'sound/effects/sparks2.ogg', 100, TRUE)
+ C.deconstruct()
+ for(var/obj/O in range(1,src))
+ if((world.time - last_spawn_time) > 10 SECONDS && istype(O, /obj/item/trash) || istype(O, /obj/effect/decal/cleanable/blood/gibs))
+ qdel(O)
+ be_fruitful()
+ last_spawn_time = world.time
+
+/mob/living/simple_animal/hostile/plaguerat/CanAttack(atom/the_target)
+ if(istype(the_target,/mob/living/simple_animal))
+ var/mob/living/A = the_target
+ if(istype(the_target, /mob/living/simple_animal/hostile/plaguerat) && A.stat == CONSCIOUS)
+ var/mob/living/simple_animal/hostile/plaguerat/R = the_target
+ if(R.faction_check_mob(src, TRUE))
+ return FALSE
+ else
+ return TRUE
+ return ..()
+
+/**
+ *Checks the mouse cap, if it's above the cap, doesn't spawn a mouse. If below, spawns a mouse and adds it to cheeserats.
+ */
+
+/mob/living/simple_animal/hostile/plaguerat/proc/be_fruitful()
+ var/cap = 10
+ if(LAZYLEN(GLOB.plague_rats) >= cap)
+ visible_message("[src] gnaws into its food, [cap] rats are now on the station!")
+ return
+ var/mob/living/newmouse = new /mob/living/simple_animal/hostile/plaguerat(loc)
+ visible_message("[src] gnaws into its food, attracting another rat!")
+
+/mob/living/simple_animal/hostile/plaguerat/proc/exit_vents()
+ if(!exit_vent || exit_vent.welded)
+ loc = entry_vent
+ entry_vent = null
+ return
+ loc = exit_vent.loc
+ entry_vent = null
+ exit_vent = null
+ in_vent = FALSE
+ var/area/new_area = get_area(loc)
+ message_admins("[src] came out at [new_area][ADMIN_JMP(loc)]!")
+ if(new_area)
+ new_area.Entered(src)
+ visible_message("[src] climbs out of the ventilation ducts!")
+ min_next_vent = world.time + 900 //90 seconds between ventcrawls
+
+/**
+ *Creates a chance to spawn more trash or gibs to repopulate. Otherwise, spawns a corpse or dirt.
+ */
+
+/datum/action/cooldown/scavenge
+ name = "Scavenge"
+ desc = "Spread the plague, scavenge for trash and fresh meat to reproduce."
+ icon_icon = 'icons/mob/actions/actions_animal.dmi'
+ background_icon_state = "bg_clock"
+ button_icon_state = "coffer"
+ cooldown_time = 50
+
+/datum/action/cooldown/scavenge/Trigger()
+ . = ..()
+ if(!.)
+ return
+ var/turf/T = get_turf(owner)
+ var/loot = rand(1,100)
+ switch(loot)
+ if(1 to 3)
+ var/pickedtrash = pick(GLOB.ratking_trash)
+ to_chat(owner, "Excellent, you find more trash to spread your filth!")
+ new pickedtrash(T)
+ if(4 to 6)
+ to_chat(owner, "You find blood and gibs to feed your young!")
+ new /obj/effect/decal/cleanable/blood/gibs(T)
+ if(!locate(/obj/effect/decal/cleanable/blood) in T)
+ new /obj/effect/decal/cleanable/blood/(T)
+ if(7 to 100)
+ to_chat(owner, "Drat. Nothing.")
+ StartCooldown()
diff --git a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm
index 5722cfda07..39e9e84ed2 100644
--- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm
@@ -109,7 +109,7 @@
continue
playsound(src, 'sound/effects/splat.ogg', 50, TRUE)
visible_message("[src] vomits up [consumed_mob]!")
- consumed_mob.forceMove(loc)
+ consumed_mob.forceMove(get_turf(src))
consumed_mob.Paralyze(50)
if((rifts_charged == 3 || (SSshuttle.emergency.mode == SHUTTLE_DOCKED && rifts_charged > 0)) && !objective_complete)
victory()
@@ -123,6 +123,7 @@
to_chat(src, "You've failed to summon the rift in a timely manner! You're being pulled back from whence you came!")
destroy_rifts()
playsound(src, 'sound/magic/demon_dies.ogg', 100, TRUE)
+ empty_contents()
QDEL_NULL(src)
/mob/living/simple_animal/hostile/space_dragon/AttackingTarget()
@@ -351,7 +352,7 @@
*/
/mob/living/simple_animal/hostile/space_dragon/proc/empty_contents()
for(var/atom/movable/AM in src)
- AM.forceMove(loc)
+ AM.forceMove(get_turf(src))
if(prob(90))
step(AM, pick(GLOB.alldirs))
@@ -529,7 +530,7 @@
/obj/structure/carp_rift
name = "carp rift"
desc = "A rift akin to the ones space carp use to travel long distances."
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 100)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
max_integrity = 300
icon = 'icons/obj/carp_rift.dmi'
icon_state = "carp_rift_carpspawn"
@@ -636,7 +637,7 @@
icon_state = "carp_rift_charged"
light_color = LIGHT_COLOR_YELLOW
update_light()
- armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100)
+ armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
resistance_flags = INDESTRUCTIBLE
dragon.rifts_charged += 1
if(dragon.rifts_charged != 3 && !dragon.objective_complete)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index efb4512bca..5ba4769f99 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -238,6 +238,7 @@
if(istype(W))
if(equip_to_slot_if_possible(W, slot, FALSE, FALSE, FALSE, FALSE, TRUE))
+ W.apply_outline()
return TRUE
if(!W)
diff --git a/code/modules/modular_computers/file_system/programs/budgetordering.dm b/code/modules/modular_computers/file_system/programs/budgetordering.dm
index 162f480c02..4fda99864c 100644
--- a/code/modules/modular_computers/file_system/programs/budgetordering.dm
+++ b/code/modules/modular_computers/file_system/programs/budgetordering.dm
@@ -12,7 +12,7 @@
///Are you actually placing orders with it?
var/requestonly = TRUE
///Can the tablet see or buy illegal stuff?
- var/contraband = FALSE
+ var/contraband_view = FALSE
///Is it being bought from a personal account, or is it being done via a budget/cargo?
var/self_paid = FALSE
///Can this console approve purchase requests?
@@ -27,10 +27,15 @@
/datum/computer_file/program/budgetorders/proc/get_export_categories()
. = EXPORT_CARGO
+/datum/computer_file/program/budgetorders/run_emag()
+ if(!contraband_view)
+ contraband_view = TRUE
+ return TRUE
+
/datum/computer_file/program/budgetorders/proc/is_visible_pack(mob/user, paccess_to_check, list/access, contraband)
if(issilicon(user)) //Borgs can't buy things.
return FALSE
- if(computer.obj_flags & EMAGGED)
+ if((computer.obj_flags & EMAGGED) || contraband_view)
return TRUE
else if(contraband) //Hide contrband when non-emagged.
return FALSE
@@ -80,14 +85,14 @@
data["supplies"] = list()
for(var/pack in SSshuttle.supply_packs)
var/datum/supply_pack/P = SSshuttle.supply_packs[pack]
- if(!is_visible_pack(usr, P.access , null, P.contraband) || P.hidden)
+ if(!is_visible_pack(usr, P.access , null, P.contraband))
continue
if(!data["supplies"][P.group])
data["supplies"][P.group] = list(
"name" = P.group,
"packs" = list()
)
- if((P.hidden && (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.DropPodOnly))
+ if(((P.hidden || P.contraband) && !contraband_view) || (P.special && !P.special_enabled) || P.DropPodOnly)
continue
data["supplies"][P.group]["packs"] += list(list(
"name" = P.name,
@@ -179,7 +184,7 @@
var/datum/supply_pack/pack = SSshuttle.supply_packs[id]
if(!istype(pack))
return
- if((pack.hidden && (pack.contraband && !contraband) || pack.DropPodOnly))
+ if(((pack.hidden || pack.contraband) && !contraband_view) || pack.DropPodOnly)
return
var/name = "*None Provided*"
diff --git a/code/modules/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/cell.dm b/code/modules/power/cell.dm
index a0509fbd41..0af16013ec 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -79,7 +79,7 @@
return 0
if(charge < amount)
return 0
- charge = (charge - amount)
+ charge -= amount
if(!istype(loc, /obj/machinery/power/apc))
SSblackbox.record_feedback("tally", "cell_used", 1, type)
return 1
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index b460cfea51..b802cc7b88 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -39,7 +39,8 @@
#define DAMAGE_INCREASE_MULTIPLIER 0.25
-#define THERMAL_RELEASE_MODIFIER 5 //Higher == less heat released during reaction, not to be confused with the above values
+#define THERMAL_RELEASE_MODIFIER 350 //Higher == more heat released during reaction, not to be confused with the above values
+#define THERMAL_RELEASE_CAP_MODIFIER 250 //Higher == lower cap on how much heat can be released per tick--currently 1.3x old value
#define PLASMA_RELEASE_MODIFIER 750 //Higher == less plasma released by reaction
#define OXYGEN_RELEASE_MODIFIER 325 //Higher == less oxygen released at high temperature/power
@@ -500,7 +501,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
powerloss_dynamic_scaling = clamp(powerloss_dynamic_scaling + clamp(powerloss_inhibition_gas - powerloss_dynamic_scaling, -0.02, 0.02), 0, 1)
else
powerloss_dynamic_scaling = clamp(powerloss_dynamic_scaling - 0.05, 0, 1)
- //Ranges from 0 to 1(1-(value between 0 and 1 * ranges from 1 to 1.5(mol / 500)))
+ //Ranges from 0 to 1 (1-(value between 0 and 1 * ranges from 1 to 1.5(mol / 500)))
+ //0 means full inhibition, 1 means no inhibition
//We take the mol count, and scale it to be our inhibitor
powerloss_inhibitor = clamp(1-(powerloss_dynamic_scaling * clamp(combined_gas/POWERLOSS_INHIBITION_MOLE_BOOST_THRESHOLD, 1, 1.5)), 0, 1)
@@ -523,9 +525,11 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
temp_factor = 30
icon_state = base_icon_state
+ var/effective_temperature = min(removed.return_temperature(), 2500 * dynamic_heat_modifier)
+
//if there is more pluox and n2 then anything else, we receive no power increase from heat
if(power_changes)
- power = max((removed.return_temperature() * temp_factor / T0C) * gasmix_power_ratio + power, 0)
+ power = max((effective_temperature * temp_factor / T0C) * gasmix_power_ratio + power, 0)
if(prob(50))
//(1 + (tritRad + pluoxDampen * bzDampen * o2Rad * plasmaRad / (10 - bzrads))) * freonbonus
@@ -536,15 +540,17 @@ 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
- removed.set_temperature(removed.return_temperature() + ((device_energy * dynamic_heat_modifier) / THERMAL_RELEASE_MODIFIER))
- //We don't want our output to be too hot
- removed.set_temperature(max(0, min(removed.return_temperature(), 2500 * dynamic_heat_modifier)))
-
+ var/max_temp_increase = effective_temperature + ((device_energy * dynamic_heat_modifier) / THERMAL_RELEASE_CAP_MODIFIER)
//Calculate how much gas to release
//Varies based on power and gas content
removed.adjust_moles(GAS_PLASMA, max((device_energy * dynamic_heat_modifier) / PLASMA_RELEASE_MODIFIER, 0))
//Varies based on power, gas content, and heat
- removed.adjust_moles(GAS_O2, max(((device_energy + removed.return_temperature() * dynamic_heat_modifier) - T0C) / OXYGEN_RELEASE_MODIFIER, 0))
+ removed.adjust_moles(GAS_O2, max(((device_energy + effective_temperature * dynamic_heat_modifier) - T0C) / OXYGEN_RELEASE_MODIFIER, 0))
+
+ if(removed.return_temperature() < max_temp_increase)
+ removed.adjust_heat(device_energy * dynamic_heat_modifier * THERMAL_RELEASE_MODIFIER)
+ removed.set_temperature(min(removed.return_temperature(), max_temp_increase))
+
if(produces_gas)
env.merge(removed)
@@ -593,13 +599,13 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
zap_icon = SLIGHTLY_CHARGED_ZAP_ICON_STATE
//Uncaps the zap damage, it's maxed by the input power
//Objects take damage now
- flags |= (ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE)
+ flags |= (ZAP_MOB_DAMAGE)
zap_count = 3
if(CRITICAL_POWER_PENALTY_THRESHOLD to INFINITY)
zap_icon = OVER_9000_ZAP_ICON_STATE
//It'll stun more now, and damage will hit harder, gloves are no garentee.
//Machines go boom
- flags |= (ZAP_MOB_STUN | ZAP_MACHINE_EXPLOSIVE | ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE)
+ flags |= (ZAP_MOB_STUN | ZAP_MOB_DAMAGE)
zap_count = 4
//Now we deal with damage shit
if (damage > damage_penalty_point && prob(20))
@@ -1052,9 +1058,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
if(zapdir)
. = zapdir
- //Going boom should be rareish
- if(prob(80))
- zap_flags &= ~ZAP_MACHINE_EXPLOSIVE
if(target_type == COIL)
//In the best situation we can expect this to grow up to 2120kw before a delam/IT'S GONE TOO FAR FRED SHUT IT DOWN
//The formula for power gen is zap_str * zap_mod / 2 * capacitor rating, between 1 and 4
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index 0f5934e8fd..34e9247184 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -44,7 +44,7 @@
cell.use(round(cell.charge * severity/100))
chambered = null //we empty the chamber
recharge_newshot() //and try to charge a new shot
- update_icon()
+ update_appearance()
/obj/item/gun/energy/get_cell()
return cell
@@ -61,7 +61,7 @@
recharge_newshot(TRUE)
if(selfcharge)
START_PROCESSING(SSobj, src)
- update_icon()
+ update_appearance()
/obj/item/gun/energy/ComponentInitialize()
. = ..()
@@ -74,7 +74,7 @@
/obj/item/gun/energy/handle_atom_del(atom/A)
if(A == cell)
cell = null
- update_icon()
+ update_appearance()
return ..()
/obj/item/gun/energy/examine(mob/user)
@@ -100,7 +100,7 @@
cell.give(100)
if(!chambered) //if empty chamber we try to charge a new shot
recharge_newshot(TRUE)
- update_icon()
+ update_appearance()
// ATTACK SELF IGNORING PARENT RETURN VALUE
/obj/item/gun/energy/attack_self(mob/living/user)
@@ -174,7 +174,7 @@
if(user_for_feedback)
to_chat(user_for_feedback, "[src] is now set to [C.select_name || C].")
post_set_firemode()
- update_icon(TRUE)
+ update_appearance()
/obj/item/gun/energy/proc/post_set_firemode(recharge_newshot = TRUE)
if(recharge_newshot)
diff --git a/code/modules/projectiles/projectile/bullets/dart_syringe.dm b/code/modules/projectiles/projectile/bullets/dart_syringe.dm
index bc2a7c40fb..318acb66b5 100644
--- a/code/modules/projectiles/projectile/bullets/dart_syringe.dm
+++ b/code/modules/projectiles/projectile/bullets/dart_syringe.dm
@@ -60,6 +60,8 @@
if(M.can_inject(null, FALSE, def_zone, piercing)) // Pass the hit zone to see if it can inject by whether it hit the head or the body.
..(target, blocked, TRUE)
for(var/datum/reagent/medicine/R in reagents.reagent_list) //OD prevention time!
+ if(R.type in GLOB.blacklisted_medchems)
+ continue
if(M.reagents.has_reagent(R.type))
if(R.overdose_threshold == 0 || emptrig == TRUE) //Is there a possible OD?
M.reagents.add_reagent(R.type, R.volume)
diff --git a/code/modules/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..55f44a505e 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -58,6 +58,7 @@
name = "combat stimulant injector"
desc = "A modified air-needle autoinjector, used by support operatives to quickly heal injuries in combat and get people back in the fight."
amount_per_transfer_from_this = 10
+ item_state = "combat_hypo"
icon_state = "combat_hypo"
volume = 100
ignore_flags = 1 // So they can heal their comrades.
@@ -69,17 +70,27 @@
list_reagents = list(/datum/reagent/medicine/epinephrine = 30, /datum/reagent/medicine/omnizine = 30, /datum/reagent/medicine/leporazine = 15, /datum/reagent/medicine/atropine = 15)
/obj/item/reagent_containers/hypospray/combat/nanites
- desc = "A modified air-needle autoinjector for use in combat situations. Prefilled with experimental medical compounds for rapid healing."
+ name = "experimental combat stimulant injector"
+ desc = "A modified air-needle autoinjector for use in combat situations. Prefilled with experimental medical nanites and a stimulant for rapid healing and a combat boost."
+ item_state = "nanite_hypo"
+ icon_state = "nanite_hypo"
volume = 100
list_reagents = list(/datum/reagent/medicine/adminordrazine/quantum_heal = 80, /datum/reagent/medicine/synaptizine = 20)
-/obj/item/reagent_containers/hypospray/magillitis
- name = "experimental autoinjector"
- desc = "A modified air-needle autoinjector with a small single-use reservoir. It contains an experimental serum."
- icon_state = "combat_hypo"
- volume = 5
- reagent_flags = NONE
- list_reagents = list(/datum/reagent/magillitis = 5)
+/obj/item/reagent_containers/hypospray/combat/nanites/update_icon()
+ if(reagents.total_volume > 0)
+ icon_state = initial(icon_state)
+ else
+ icon_state = "[initial(icon_state)]0"
+
+/obj/item/reagent_containers/hypospray/combat/heresypurge
+ name = "holy water piercing injector"
+ desc = "A modified air-needle autoinjector for use in combat situations. Prefilled with 5 doses of a holy water and pacifier mixture. Not for use on your teammates."
+ item_state = "holy_hypo"
+ icon_state = "holy_hypo"
+ volume = 250
+ list_reagents = list(/datum/reagent/water/holywater = 150, /datum/reagent/peaceborg_tire = 50, /datum/reagent/peaceborg_confuse = 50)
+ amount_per_transfer_from_this = 50
//MediPens
@@ -136,6 +147,8 @@
/obj/item/reagent_containers/hypospray/medipen/ekit
name = "emergency first-aid autoinjector"
desc = "An epinephrine medipen with extra coagulant and antibiotics to help stabilize bad cuts and burns."
+ icon_state = "healthpen"
+ item_state = "healthpen"
volume = 15
amount_per_transfer_from_this = 15
list_reagents = list(/datum/reagent/medicine/epinephrine = 12, /datum/reagent/medicine/coagulant = 2.5, /datum/reagent/medicine/spaceacillin = 0.5)
@@ -143,15 +156,19 @@
/obj/item/reagent_containers/hypospray/medipen/blood_loss
name = "hypovolemic-response autoinjector"
desc = "A medipen designed to stabilize and rapidly reverse severe bloodloss."
+ icon_state = "hypovolemic"
+ item_state = "hypovolemic"
volume = 15
amount_per_transfer_from_this = 15
list_reagents = list(/datum/reagent/medicine/epinephrine = 5, /datum/reagent/medicine/coagulant = 2.5, /datum/reagent/iron = 3.5, /datum/reagent/medicine/salglu_solution = 4)
/obj/item/reagent_containers/hypospray/medipen/stimulants
- name = "illegal stimpack medipen"
- desc = "A highly illegal medipen due to its load and small injections, allow for five uses before being drained"
+ name = "stimpack medipen"
+ desc = "Contains stimulants."
+ icon_state = "syndipen"
+ item_state = "syndipen"
volume = 50
- amount_per_transfer_from_this = 10
+ amount_per_transfer_from_this = 50
list_reagents = list(/datum/reagent/medicine/stimulants = 50)
/obj/item/reagent_containers/hypospray/medipen/stimulants/baseball
@@ -166,6 +183,7 @@
name = "stimpack medipen"
desc = "A rapid way to stimulate your body's adrenaline, allowing for freer movement in restrictive armor."
icon_state = "stimpen"
+ item_state = "stimpen"
volume = 20
amount_per_transfer_from_this = 20
list_reagents = list(/datum/reagent/medicine/ephedrine = 10, /datum/reagent/consumable/coffee = 10)
@@ -177,20 +195,79 @@
/obj/item/reagent_containers/hypospray/medipen/morphine
name = "morphine medipen"
desc = "A rapid way to get you out of a tight situation and fast! You'll feel rather drowsy, though."
+ icon_state = "morphen"
+ item_state = "morphen"
+ volume = 10
+ amount_per_transfer_from_this = 10
list_reagents = list(/datum/reagent/medicine/morphine = 10)
+/obj/item/reagent_containers/hypospray/medipen/penacid
+ name = "pentetic acid medipen"
+ desc = "A autoinjector containing pentetic acid, used to reduce high levels of radiations and moderate toxins."
+ icon_state = "penacid"
+ item_state = "penacid"
+ volume = 10
+ amount_per_transfer_from_this = 10
+ list_reagents = list(/datum/reagent/medicine/pen_acid = 10)
+
+/obj/item/reagent_containers/hypospray/medipen/atropine
+ name = "atropine autoinjector"
+ desc = "A rapid way to save a person from a critical injury state!"
+ icon_state = "atropen"
+ item_state = "atropen"
+ volume = 10
+ amount_per_transfer_from_this = 10
+ list_reagents = list(/datum/reagent/medicine/atropine = 10)
+
+/obj/item/reagent_containers/hypospray/medipen/salacid
+ name = "salicyclic acid medipen"
+ desc = "A autoinjector containing salicyclic acid, used to treat severe brute damage."
+ icon_state = "salacid"
+ item_state = "salacid"
+ volume = 10
+ amount_per_transfer_from_this = 10
+ list_reagents = list(/datum/reagent/medicine/sal_acid = 10)
+
+/obj/item/reagent_containers/hypospray/medipen/oxandrolone
+ name = "oxandrolone medipen"
+ desc = "A autoinjector containing oxandrolone, used to treat severe burns."
+ icon_state = "oxapen"
+ item_state = "oxapen"
+ volume = 10
+ amount_per_transfer_from_this = 10
+ list_reagents = list(/datum/reagent/medicine/oxandrolone = 10)
+
+/obj/item/reagent_containers/hypospray/medipen/salbutamol
+ name = "salbutamol medipen"
+ desc = "A autoinjector containing salbutamol, used to heal oxygen damage quickly."
+ icon_state = "salpen"
+ item_state = "salpen"
+ volume = 10
+ amount_per_transfer_from_this = 10
+ list_reagents = list(/datum/reagent/medicine/salbutamol = 10)
+
/obj/item/reagent_containers/hypospray/medipen/tuberculosiscure
name = "BVAK autoinjector"
desc = "Bio Virus Antidote Kit autoinjector. Has a two use system for yourself, and someone else. Inject when infected."
- icon_state = "stimpen"
+ icon_state = "tbpen"
+ item_state = "tbpen"
volume = 60
amount_per_transfer_from_this = 30
list_reagents = list(/datum/reagent/medicine/atropine = 10, /datum/reagent/medicine/epinephrine = 10, /datum/reagent/medicine/salbutamol = 20, /datum/reagent/medicine/spaceacillin = 20)
+/obj/item/reagent_containers/hypospray/medipen/tuberculosiscure/update_icon()
+ if(reagents.total_volume > 30)
+ icon_state = initial(icon_state)
+ else if (reagents.total_volume > 0)
+ icon_state = "[initial(icon_state)]1"
+ else
+ icon_state = "[initial(icon_state)]0"
+
/obj/item/reagent_containers/hypospray/medipen/survival
name = "survival medipen"
desc = "A medipen for surviving in the harshest of environments, heals and protects from environmental hazards. WARNING: Do not inject more than one pen in quick succession."
- icon_state = "stimpen"
+ icon_state = "minepen"
+ item_state = "minepen"
volume = 52
amount_per_transfer_from_this = 52
list_reagents = list(/datum/reagent/medicine/salbutamol = 10, /datum/reagent/medicine/leporazine = 15, /datum/reagent/medicine/neo_jelly = 15, /datum/reagent/medicine/epinephrine = 10, /datum/reagent/medicine/lavaland_extract = 2)
@@ -198,16 +275,21 @@
/obj/item/reagent_containers/hypospray/medipen/firelocker
name = "fire treatment medipen"
desc = "A medipen that has been fulled with burn healing chemicals for personnel without advanced medical knowledge."
+ icon_state = "firepen"
+ item_state = "firepen"
volume = 15
amount_per_transfer_from_this = 15
list_reagents = list(/datum/reagent/medicine/oxandrolone = 5, /datum/reagent/medicine/kelotane = 10)
-/obj/item/reagent_containers/hypospray/combat/heresypurge
- name = "holy water autoinjector"
- desc = "A modified air-needle autoinjector for use in combat situations. Prefilled with 5 doses of a holy water mixture."
- volume = 250
- list_reagents = list(/datum/reagent/water/holywater = 150, /datum/reagent/peaceborg_tire = 50, /datum/reagent/peaceborg_confuse = 50)
- amount_per_transfer_from_this = 50
+/obj/item/reagent_containers/hypospray/medipen/magillitis
+ name = "experimental autoinjector"
+ desc = "A custom-frame needle injector with a small single-use reservoir, containing an experimental serum. Unlike the more common medipen frame, it cannot pierce through protective armor or hardsuits, nor can the chemical inside be extracted."
+ icon_state = "gorillapen"
+ item_state = "gorillapen"
+ volume = 5
+ ignore_flags = 0
+ reagent_flags = NONE
+ list_reagents = list(/datum/reagent/magillitis = 5)
#define HYPO_SPRAY 0
#define HYPO_INJECT 1
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index 93a07b1a6e..c2f80de761 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -218,6 +218,31 @@
volume = 50
list_reagents = list(/datum/reagent/medicine/stimulants = 50)
+/obj/item/reagent_containers/syringe/contraband
+ name = "unlabeled syringe"
+ desc = "A syringe containing some sort of unknown chemical cocktail."
+
+/obj/item/reagent_containers/syringe/contraband/space_drugs
+ list_reagents = list(/datum/reagent/drug/space_drugs = 15)
+
+/obj/item/reagent_containers/syringe/contraband/krokodil
+ list_reagents = list(/datum/reagent/drug/krokodil = 15)
+
+/obj/item/reagent_containers/syringe/contraband/crank
+ list_reagents = list(/datum/reagent/drug/crank = 15)
+
+/obj/item/reagent_containers/syringe/contraband/methamphetamine
+ list_reagents = list(/datum/reagent/drug/methamphetamine = 15)
+
+/obj/item/reagent_containers/syringe/contraband/bath_salts
+ list_reagents = list(/datum/reagent/drug/bath_salts = 15)
+
+/obj/item/reagent_containers/syringe/contraband/fentanyl
+ list_reagents = list(/datum/reagent/toxin/fentanyl = 15)
+
+/obj/item/reagent_containers/syringe/contraband/morphine
+ list_reagents = list(/datum/reagent/medicine/morphine = 15)
+
/obj/item/reagent_containers/syringe/calomel
name = "syringe (calomel)"
desc = "Contains calomel."
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 26f0ca66ee..db82e5cdb2 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -233,6 +233,14 @@
anchored = TRUE
reagent_id = /datum/reagent/consumable/cooking_oil
+/obj/structure/reagent_dispensers/servingdish
+ name = "serving dish"
+ desc = "A dish full of food slop for your bowl."
+ icon = 'icons/obj/kitchen.dmi'
+ icon_state = "serving"
+ anchored = TRUE
+ reagent_id = /datum/reagent/consumable/nutraslop
+
////////
//Kegs//
////////
diff --git a/code/modules/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/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm
index 3c1ba05267..35871e0cb3 100644
--- a/code/modules/research/techweb/_techweb.dm
+++ b/code/modules/research/techweb/_techweb.dm
@@ -142,7 +142,7 @@
if(unlock_hidden)
for(var/i in receiver.hidden_nodes)
CHECK_TICK
- if(!hidden_nodes[i])
+ if(available_nodes[i] || researched_nodes[i] || visible_nodes[i])
receiver.hidden_nodes -= i //We can see it so let them see it too.
for(var/i in researched_nodes)
CHECK_TICK
diff --git a/code/modules/research/techweb/nodes/bepis_nodes.dm b/code/modules/research/techweb/nodes/bepis_nodes.dm
index fa17d62e50..ec29979bdf 100644
--- a/code/modules/research/techweb/nodes/bepis_nodes.dm
+++ b/code/modules/research/techweb/nodes/bepis_nodes.dm
@@ -60,6 +60,16 @@
hidden = TRUE
experimental = TRUE
+/datum/techweb_node/nanite_storage_protocols
+ id = "nanite_storage_protocols"
+ display_name = "Nanite Storage Protocols"
+ description = "Advanced behaviours that allow nanites to increase their maximum volume at variable cost."
+ prereq_ids = list("nanite_smart")
+ design_ids = list("hive_nanites", "zip_nanites", "free_range_nanites", "unsafe_storage_nanites")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
+ hidden = TRUE
+ experimental = TRUE
+
/datum/techweb_node/interrogation
id = "interrogation"
display_name = "Enhanced Interrogation Technology"
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/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm
index 39877d6706..dee7b1cf45 100644
--- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm
+++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm
@@ -14,25 +14,62 @@ Regenerative extracts:
/obj/item/slimecross/regenerative/proc/core_effect_before(mob/living/carbon/human/target, mob/user)
return
+/obj/item/slimecross/regenerative/pre_attack(atom/A, mob/living/user, params, attackchain_flags, damage_multiplier)
+ if(isliving(A))
+ var/mob/living/M = A
+ if(M.stat == DEAD)
+ to_chat(user, "[src] will not work on the dead!")
+ return TRUE //returning TRUE preemptively ends the attack chain and thus doesn't call afterattack, this is noteworthy for below as well
+ //inform the target that they're about to have a regenerative extract used on them
+ if(M != user) //targeting someone else
+ M.visible_message("[user] readies [src], holding it steady near [M] and guiding it to the center of [M.p_their()] mass...",
+ "[user] readies [src], holding it steady near you and guiding it to the center of your mass...")
+ if(!do_after(user, 50, target = M)) //5 seconds
+ return TRUE
+ else //targeting self
+ M.visible_message("[user] readies [src], holding it steady near [user.p_them()]self and guiding it to the center of [user.p_their()] mass...",
+ "You ready [src], holding it steady near you and guiding it to the center of your mass...")
+ if(!do_after(user, 10, target = M)) //1 second
+ return TRUE
+ . = ..()
+ else
+ . = ..()
/obj/item/slimecross/regenerative/afterattack(atom/target,mob/user,prox)
. = ..()
if(!prox || !isliving(target))
return
- var/mob/living/H = target
- if(H.stat == DEAD)
- to_chat(user, "[src] will not work on the dead!")
+ var/mob/living/M = target
+ if(M.stat == DEAD)
+ to_chat(user, "[M] died before you could apply [src]!")
return
- if(H != user)
- user.visible_message("[user] crushes the [src] over [H], the milky goo quickly regenerating all of [H.p_their()] injuries!",
- "You squeeze the [src], and it bursts over [H], the milky goo regenerating [H.p_their()] injuries.")
+ if(M != user)
+ user.visible_message("[user] crushes the [src] over [M], the milky goo quickly regenerating all of [M.p_their()] injuries!",
+ "You squeeze the [src], and it bursts over [M], the milky goo regenerating [M.p_their()] injuries.")
else
user.visible_message("[user] crushes the [src] over [user.p_them()]self, the milky goo quickly regenerating all of [user.p_their()] injuries!",
"You squeeze the [src], and it bursts in your hand, splashing you with milky goo which quickly regenerates your injuries!")
- core_effect_before(H, user)
- H.revive(full_heal = 1)
- core_effect(H, user)
+ core_effect_before(M, user)
+ var/new_disgust_level = 0
+ if(iscarbon(M)) //simpler mobs don't have a disgust variable and we need to grab that.
+ var/mob/living/carbon/C = M
+ new_disgust_level = C.disgust + DISGUST_LEVEL_GROSS
+ M.revive(full_heal = 1)
+ M.set_disgust(new_disgust_level)
+ core_effect(M, user)
playsound(target, 'sound/effects/splat.ogg', 40, 1)
+ //warn receivers of the extract about the disgust if they're carbon, making it clear that the regenerative extract is causing this.
+ if(iscarbon(M))
+ var/obj/item/organ/stomach/S = M.getorganslot(ORGAN_SLOT_STOMACH) //for getting the stummy name
+ switch(new_disgust_level)
+ if(0 to DISGUST_LEVEL_GROSS)
+ to_chat(M,"While you recovered from [src], you feel a little nauseous.")
+ if(DISGUST_LEVEL_GROSS to DISGUST_LEVEL_VERYGROSS)
+ to_chat(M,"While you recovered from [src], you feel quite queasy.")
+ if(DISGUST_LEVEL_VERYGROSS to DISGUST_LEVEL_DISGUSTED)
+ to_chat(M,"While you recovered from [src], you feel like you're about to vomit!")
+ if(DISGUST_LEVEL_DISGUSTED to INFINITY)
+ to_chat(M,"You feel absolutely sick. Maybe you should lay off the regenerative extracts until your [(S ? S.name : "stomach")] settles!")
qdel(src)
/obj/item/slimecross/regenerative/grey
diff --git a/code/modules/spells/spell_types/pointed/mind_transfer.dm b/code/modules/spells/spell_types/pointed/mind_transfer.dm
index 28d646f6b6..caab6c5547 100644
--- a/code/modules/spells/spell_types/pointed/mind_transfer.dm
+++ b/code/modules/spells/spell_types/pointed/mind_transfer.dm
@@ -44,6 +44,13 @@
to_chat(user, "The devilish contract doesn't include the 'mind swappable' package, please try again another lifetime.")
return
+ // lets not have people be mindswapped to/from people who have people currently in their vore bellies
+ if(has_vore_belly(user))
+ user.release_vore_contents(include_absorbed = TRUE, silent = TRUE)
+
+ if(has_vore_belly(victim))
+ victim.release_vore_contents(include_absorbed = TRUE, silent = TRUE)
+
//MIND TRANSFER BEGIN
var/mob/dead/observer/ghost = victim.ghostize()
user.mind.transfer_to(victim)
diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm
index b68a289e85..69f2d5454e 100644
--- a/code/modules/station_goals/dna_vault.dm
+++ b/code/modules/station_goals/dna_vault.dm
@@ -63,10 +63,10 @@
name = "DNA Sampler"
desc = "Can be used to take chemical and genetic samples of pretty much anything."
icon = 'icons/obj/syringe.dmi'
- item_state = "hypo"
+ item_state = "sampler"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
- icon_state = "hypo"
+ icon_state = "sampler"
item_flags = NOBLUDGEON
var/list/animals = list()
var/list/plants = list()
diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm
index 93f88192e5..e10b05822b 100644
--- a/code/modules/surgery/organs/lungs.dm
+++ b/code/modules/surgery/organs/lungs.dm
@@ -54,7 +54,8 @@
var/SA_para_min = 1 //nitrous values
var/SA_sleep_min = 5
- var/BZ_trip_balls_min = 1 //BZ gas
+ var/BZ_trip_balls_min = 0.1 //BZ gas
+ var/BZ_brain_damage_min = 1
var/gas_stimulation_min = 0.002 //Nitryl and Stimulum
var/cold_message = "your face freezing and an icicle forming"
@@ -269,13 +270,13 @@
// BZ
var/bz_pp = PP(breath, GAS_BZ)
- if(bz_pp > BZ_trip_balls_min)
+ if(bz_pp > BZ_brain_damage_min)
H.hallucination += 10
H.reagents.add_reagent(/datum/reagent/bz_metabolites,5)
if(prob(33))
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 150)
- else if(bz_pp > 0.01)
+ else if(bz_pp > BZ_trip_balls_min)
H.hallucination += 5
H.reagents.add_reagent(/datum/reagent/bz_metabolites,1)
@@ -476,7 +477,7 @@
)
SA_para_min = 30
SA_sleep_min = 50
- BZ_trip_balls_min = 30
+ BZ_brain_damage_min = 30
emp_vulnerability = 3
cold_level_1_threshold = 200
@@ -509,8 +510,29 @@
heat_level_2_threshold = 600 // up 200 from level 1, 1000 is silly but w/e for level 3
/obj/item/organ/lungs/ashwalker/populate_gas_info()
+ // humans usually breathe 21 but require 16/17, so 80% - 1, which is more lenient but it's fine
+ #define SAFE_THRESHOLD_RATIO 0.8
+ var/datum/gas_mixture/breath = SSair.planetary[LAVALAND_DEFAULT_ATMOS] // y'all know
+ var/pressure = breath.return_pressure()
+ var/total_moles = breath.total_moles()
+ for(var/id in breath.get_gases())
+ var/this_pressure = PP(breath, id)
+ var/req_pressure = (this_pressure * SAFE_THRESHOLD_RATIO) - 1
+ if(req_pressure > 0)
+ gas_min[id] = req_pressure
+ if(id in gas_max)
+ gas_max[id] += this_pressure
+ var/bz = breath.get_moles(GAS_BZ)
+ if(bz)
+ BZ_trip_balls_min += bz
+ BZ_brain_damage_min += bz
+
+ gas_max[GAS_N2] = PP(breath, GAS_N2) + 5
+ var/o2_pp = PP(breath, GAS_O2)
+ safe_breath_min = 0.3 * o2_pp
+ safe_breath_max = 1.3 * o2_pp
..()
- gas_max[GAS_N2] = 28
+ #undef SAFE_THRESHOLD_RATIO
/obj/item/organ/lungs/slime
name = "vacuole"
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("" dat += "Chocolate cones: Dispense Make x5 [product_types[CONE_CHOC]] cones left. (Ingredients: flour, sugar, coco powder) ") 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_ammo.dm b/code/modules/uplink/uplink_items/uplink_ammo.dm index 2ab6c6f490..a7f3f5321d 100644 --- a/code/modules/uplink/uplink_items/uplink_ammo.dm +++ b/code/modules/uplink/uplink_items/uplink_ammo.dm @@ -265,7 +265,7 @@ /datum/uplink_item/ammo/flechetteap name = "Armor Piercing Flechette Magazine" desc = "An additional 40-round flechette magazine; compatible with the Flechette Launcer. \ - Loaded with armor piercing flechettes that very nearly ignore armor, but are not very effective agaisnt flesh." + Loaded with armor piercing flechettes that very nearly ignore armor, but are not very effective against flesh." item = /obj/item/ammo_box/magazine/flechette cost = 2 include_modes = list(/datum/game_mode/nuclear) diff --git a/code/modules/uplink/uplink_items/uplink_devices.dm b/code/modules/uplink/uplink_items/uplink_devices.dm index ad1cc31ba7..21889219cf 100644 --- a/code/modules/uplink/uplink_items/uplink_devices.dm +++ b/code/modules/uplink/uplink_items/uplink_devices.dm @@ -213,7 +213,7 @@ name = "Stimpack" desc = "Stimpacks, the tool of many great heroes. Makes you nearly immune to non-lethal weaponry for about \ 5 minutes after injection." - item = /obj/item/reagent_containers/syringe/stimulants + item = /obj/item/reagent_containers/hypospray/medipen/stimulants cost = 5 surplus = 90 diff --git a/code/modules/uplink/uplink_items/uplink_roles.dm b/code/modules/uplink/uplink_items/uplink_roles.dm index 774c2d9794..72e0111c41 100644 --- a/code/modules/uplink/uplink_items/uplink_roles.dm +++ b/code/modules/uplink/uplink_items/uplink_roles.dm @@ -195,7 +195,7 @@ name = "Magillitis Serum Autoinjector" desc = "A single-use autoinjector which contains an experimental serum that causes rapid muscular growth in Hominidae. \ Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas." - item = /obj/item/reagent_containers/hypospray/magillitis + item = /obj/item/reagent_containers/hypospray/medipen/magillitis cost = 8 restricted_roles = list("Geneticist", "Chief Medical Officer") diff --git a/code/modules/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/dyanmic.txt b/config/entries/dynamic.txt similarity index 100% rename from config/entries/dyanmic.txt rename to config/entries/dynamic.txt diff --git a/config/entries/general.txt b/config/entries/general.txt index 3584af63c7..b426881de9 100644 --- a/config/entries/general.txt +++ b/config/entries/general.txt @@ -491,3 +491,12 @@ 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 + +## Enables monstermos/"equalization" step in atmos. +# ATMOS_EQUALIZATION_ENABLED 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 e2aef333e1..dabd4e7704 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,238 @@ -->
+
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 580cf51a2f..e4e1fba1c6 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -29838,3 +29838,168 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- imageadd: They even come with 10 different fillstates!
- imageadd: Better Shark Tails, dodododododo~
- rscadd: The old ones are now listed as carp tails.
+2021-08-22:
+ zeroisthebiggay:
+ - spellcheck: trillby can't spell pair
+2021-08-23:
+ zeroisthebiggay:
+ - spellcheck: i hate the grammarchrist
+2021-08-24:
+ BlueWildrose:
+ - balance: MK ultra explosions (failures at making MKultra) are gone, and replaced
+ with a gas that just causes a bunch of status effects to you.
+2021-08-26:
+ keronshb:
+ - rscadd: Adds catwalk floors
+2021-08-28:
+ DeltaFire15:
+ - bugfix: 'Demons now drop bodies on their own tile instead of scattering them across
+ the station. tweak: Space dragon content ejection is now slightly safer.'
+ - bugfix: Space dragons no longer delete their contents if they die due to timeout,
+ ejecting them instead.
+ - bugfix: Carp rifts created by space dragons now have their armor work correctly.
+ Putnam3145:
+ - config: Planetary monstermos can now be disabled with varedit
+ - rscadd: Lavaland/ice planet atmos is no longer a preset gas mixture and varies
+ per round
+ keronshb:
+ - rscadd: Ports Inventory Outlines
+ - imageadd: Re-adds the old glue sprite
+ - rscadd: Adds Plague Rats
+ - rscadd: Gives Plague Rat spawn conditions for regular mice
+ - imageadd: Plague Rat sprite
+ - rscadd: Gremlin
+ - imageadd: Gremlin sprites
+ zeroisthebiggay:
+ - rscdel: grilles as maintenance loot
+ - rscadd: sevensune tail from hyperstation
+2021-09-01:
+ BlueWildrose:
+ - bugfix: The waddle component now takes size into account when running rotating
+ animations, thus not reverting character sizes to default size.
+ ma44:
+ - bugfix: Weapon rechargers now have their recharger indicators again.
+ - bugfix: Energy guns now update when switching modes again.
+ - bugfix: Stabilized yellow slime extracts will now update cells and guns it recharges.
+ - rscadd: Weapon rechargers will now be more noticeable when it has finished recharging
+ something.
+ zeroisthebiggay:
+ - bugfix: the fucking chainsaw sprite
+2021-09-03:
+ timothyteakettle:
+ - bugfix: fixes losing your additional language upon changing species
+2021-09-04:
+ Putnam3145:
+ - bugfix: Might've fixed some ghost sprite oddities nobody even knew about
+ WanderingFox95:
+ - bugfix: Lavaland architects don't screw up so badly anymore and do in fact not
+ somehow leave holes through the planet surface all the way into space under
+ their bookshelves.
+ - bugfix: Snow was removed from Lavaland Ruins.
+ keronshb:
+ - bugfix: Fixes entering an occupied VR sleeper bug
+ timothyteakettle:
+ - bugfix: makes the arm/leg markings for synthetic lizards appear as an option again
+2021-09-05:
+ DeltaFire15:
+ - bugfix: Unreadied player gamemode votes now actually get ignored (if the config
+ for this is enabled).
+2021-09-07:
+ bunny232:
+ - bugfix: fixed some jank in pubby's xenobiological secure pen
+ keronshb:
+ - bugfix: Gremlins no longer have AA when dead
+ zeroisthebiggay:
+ - spellcheck: you can just about
+2021-09-08:
+ keronshb:
+ - imageadd: Adds the parade outfit for the HoS and Centcomm
+ - imageadd: Recolors the parade outfit for the Captain
+ - imageadd: Adds a toggle option for the parade outfits
+ - bugfix: Observers can no longer highlight your items
+2021-09-10:
+ BlueWildrose:
+ - rscadd: CTRL + (combat mode) Right Click - positional dropping and item rotation.
+ keronshb:
+ - rscadd: Readds Reebe
+ - rscadd: Added the ability to dye your hair with gradients by using a hair dye
+ spray.
+ - rscadd: The new Colorist quirk, allowing you to spawn with a hair dye spray.
+ - rscadd: Adds Hair gradients to preferences
+ - imageadd: Three new hair gradients, a pair of shorter fades and a spiky wave.
+ - bugfix: Adds viewers for mask of madness so it doesn't wallhack
+ zeroisthebiggay:
+ - bugfix: Replaced the DNA probe's old sprite (Hypospray) with a unique sprite
+ - imageadd: added some icons and images for hyposprays and medipens so they stand
+ out
+ - imageadd: added inhands for the cautery, retractor, drapes and hemostat.
+ - imageadd: New icon and sprites for the DNA probe
+ - imageadd: Emergency survival boxes now have an unique blue sprite and description
+ to tell them apart from regular boxes.
+ - imageadd: Added craftable normal/extended emergency oxygen tank boxes to put your
+ emergency oxygen tank collection inside.
+ - imageadd: Emergency first aid kits now look visually consistent with full first
+ aid kits.
+ - imageadd: Ports new Hypospray, Combat Autoinjector, Pestle, Mortar and Dropper
+ sprites from Shiptest!
+ - imageadd: Adds a new sprite for pill bottles!
+ - imageadd: new surgical tool sprites
+ - imageadd: The cyborg toolset is now all new and improved, with a new coat of paint!
+ - imageadd: Updates pride hammer sprites!
+ - imageadd: Replaced old Mjolnir sprites with new Mjolnir sprites.
+2021-09-11:
+ LetterN:
+ - code_imp: Tickers, GC, MC, FS updates
+ - code_imp: rust_g update. It is default that we use their urlencode/unencode now.
+ - code_imp: updates CBT to juke
+ - bugfix: CI Cache works properly now
+ Putnam3145:
+ - bugfix: Removed some crashes
+ SandPoot:
+ - rscadd: 'Cyborg grippers now have a preview of the item you are holding. tweak:
+ Cyborg grippers no longer drop using alt-click, instead, you try to drop the
+ gripper to drop the item, and then you can drop the gripper. tweak: You can
+ now use the "Pick up" verb on the right click menu to take items with a cyborg
+ gripper.'
+ - bugfix: You should be able to access the interface of airlock electronics once
+ again as a borg.
+ - refactor: Reworks a lot of stuff that was being used on the grippers.
+ timothyteakettle:
+ - bugfix: arachnid legs now show up properly
+ zeroisthebiggay:
+ - imageadd: reinforcing the mining hardsuit with goliath hide now makes the sprite
+ cooler
+ - imageadd: The SWAT helmet is now consistent between its front, side and back sprites
+ for coloration.
+ - imageadd: new riot armor sprites
+2021-09-12:
+ LetterN:
+ - bugfix: lowers the audio volume of ark sfx
+ - bugfix: readded cwc theme in the index.js once more
+ timothyteakettle:
+ - rscadd: allows custom taste text and color on the custom ice cream setting in
+ the ice cream vat
+2021-09-14:
+ Hatterhat:
+ - balance: The Syndicate zero-day'd the NT IRN program on modular computers through
+ cryptographic sequencing technology. NanoTrasen's cybersecurity divisions are
+ seething.
+ LetterN:
+ - code_imp: sync mafia code
+ Putnam3145:
+ - balance: Nerfed bad toxins bombs and buffed good toxins bombs. There's no longer
+ an arbitrary hard research points cap.
+ keronshb:
+ - balance: Removes zap obj damage and machinery explosion from the SM arcs
+ - bugfix: Fixes hitby runtime.
+ zeroisthebiggay:
+ - rscadd: the permabrig erp role
+ - balance: changeling adrenals buff
+ - bugfix: speedups
+ - bugfix: bread goes in mouth and not on head
+2021-09-17:
+ DeltaFire15:
+ - bugfix: Techweb hidden nodes should now show less weird behavior.
+2021-09-18:
+ kiwedespars:
+ - balance: blacklisted morphine and haloperidol from dart guns
diff --git a/html/changelogs/AutoChangeLog-pr-15074.yml b/html/changelogs/AutoChangeLog-pr-15074.yml
new file mode 100644
index 0000000000..5da0c10a10
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15074.yml
@@ -0,0 +1,4 @@
+author: "keronshb"
+delete-after: True
+changes:
+ - rscadd: "PAIs can be emagged to reset master"
diff --git a/html/changelogs/AutoChangeLog-pr-15084.yml b/html/changelogs/AutoChangeLog-pr-15084.yml
new file mode 100644
index 0000000000..6c99cc159d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15084.yml
@@ -0,0 +1,10 @@
+author: "keronshb"
+delete-after: True
+changes:
+ - bugfix: "Plague Rats will no longer spawn thousands of dirt decals"
+ - bugfix: "Plague Rats will no longer spawn thousands of corpses"
+ - bugfix: "Plague Rats can't spawn or transform off station z anymore"
+ - bugfix: "Plague Rats shouldn't explosively grow instantly"
+ - bugfix: "Plague Rats won't spawn infinite miasma anymore."
+ - balance: "Plague Rats health is now 100."
+ - balance: "Plague Rats can now ventcrawl through everything to prevent farming."
diff --git a/html/changelogs/AutoChangeLog-pr-15094.yml b/html/changelogs/AutoChangeLog-pr-15094.yml
new file mode 100644
index 0000000000..21dcf75960
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15094.yml
@@ -0,0 +1,4 @@
+author: "zeroisthebiggay"
+delete-after: True
+changes:
+ - balance: "glass has do_after"
diff --git a/html/changelogs/AutoChangeLog-pr-15119.yml b/html/changelogs/AutoChangeLog-pr-15119.yml
new file mode 100644
index 0000000000..ee7100fd9b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15119.yml
@@ -0,0 +1,8 @@
+author: "keronshb"
+delete-after: True
+changes:
+ - bugfix: "Slaughter Demons Slam will now wound again on hit."
+ - balance: "Damage for demons back up to 30"
+ - balance: "Wound Bonus for demons now at 0.
+image_add: Adds a sprite for the action bar"
+ - refactor: "Changed the CTRL+SHIFT Click to an action button. People can see the cooldown now too."
diff --git a/html/changelogs/AutoChangeLog-pr-15133.yml b/html/changelogs/AutoChangeLog-pr-15133.yml
new file mode 100644
index 0000000000..3bc023735f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15133.yml
@@ -0,0 +1,5 @@
+author: "zeroisthebiggay"
+delete-after: True
+changes:
+ - rscadd: "new tips"
+ - rscdel: "old tips"
diff --git a/html/changelogs/AutoChangeLog-pr-15134.yml b/html/changelogs/AutoChangeLog-pr-15134.yml
new file mode 100644
index 0000000000..2a71bd9aa0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15134.yml
@@ -0,0 +1,4 @@
+author: "zeroisthebiggay"
+delete-after: True
+changes:
+ - rscadd: "some more brainhurt lines"
diff --git a/html/changelogs/AutoChangeLog-pr-15137.yml b/html/changelogs/AutoChangeLog-pr-15137.yml
new file mode 100644
index 0000000000..eef278a6ea
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15137.yml
@@ -0,0 +1,4 @@
+author: "DeltaFire15"
+delete-after: True
+changes:
+ - balance: "carded AIs can now be converted by conversion sigils (clockcult)"
diff --git a/html/changelogs/AutoChangeLog-pr-15139.yml b/html/changelogs/AutoChangeLog-pr-15139.yml
new file mode 100644
index 0000000000..001897e223
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15139.yml
@@ -0,0 +1,4 @@
+author: "DeltaFire15"
+delete-after: True
+changes:
+ - bugfix: "Catsurgeons should now spawn at more reasonable locations if possible."
diff --git a/html/changelogs/AutoChangeLog-pr-15143.yml b/html/changelogs/AutoChangeLog-pr-15143.yml
new file mode 100644
index 0000000000..d4e2141937
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15143.yml
@@ -0,0 +1,4 @@
+author: "zeroisthebiggay"
+delete-after: True
+changes:
+ - bugfix: "box perma has power"
diff --git a/html/changelogs/AutoChangeLog-pr-15144.yml b/html/changelogs/AutoChangeLog-pr-15144.yml
new file mode 100644
index 0000000000..860f1a60cc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15144.yml
@@ -0,0 +1,4 @@
+author: "zeroisthebiggay"
+delete-after: True
+changes:
+ - bugfix: "bone satchel onmob sprites"
diff --git a/html/changelogs/AutoChangeLog-pr-15147.yml b/html/changelogs/AutoChangeLog-pr-15147.yml
new file mode 100644
index 0000000000..09f98404fd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15147.yml
@@ -0,0 +1,4 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - config: "monstermos config added, disabled"
diff --git a/html/changelogs/AutoChangeLog-pr-15154.yml b/html/changelogs/AutoChangeLog-pr-15154.yml
new file mode 100644
index 0000000000..756cc2bfb7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15154.yml
@@ -0,0 +1,4 @@
+author: "qweq12yt"
+delete-after: True
+changes:
+ - bugfix: "Fixed space heaters not being able to be interacted/turned on in non powered areas"
diff --git a/html/changelogs/AutoChangeLog-pr-15156.yml b/html/changelogs/AutoChangeLog-pr-15156.yml
new file mode 100644
index 0000000000..4d74820ca3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15156.yml
@@ -0,0 +1,4 @@
+author: "zeroisthebiggay"
+delete-after: True
+changes:
+ - bugfix: "missing madness mask sprites"
diff --git a/html/changelogs/AutoChangeLog-pr-15157.yml b/html/changelogs/AutoChangeLog-pr-15157.yml
new file mode 100644
index 0000000000..b3f0b8eaba
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15157.yml
@@ -0,0 +1,4 @@
+author: "DeltaFire15"
+delete-after: True
+changes:
+ - bugfix: "There is now a way to acquire nanite storage protocols (bepis, like the other protocols), as opposed to them existing with no way to acquire them."
diff --git a/html/changelogs/AutoChangeLog-pr-15160.yml b/html/changelogs/AutoChangeLog-pr-15160.yml
new file mode 100644
index 0000000000..da0d68f52f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15160.yml
@@ -0,0 +1,4 @@
+author: "timothyteakettle"
+delete-after: True
+changes:
+ - bugfix: "removes passkey from access circuits as its not used anymore"
diff --git a/html/changelogs/AutoChangeLog-pr-15162.yml b/html/changelogs/AutoChangeLog-pr-15162.yml
new file mode 100644
index 0000000000..926f0898d1
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15162.yml
@@ -0,0 +1,4 @@
+author: "zeroisthebiggay"
+delete-after: True
+changes:
+ - bugfix: "prisoners cannot latejoin anymore"
diff --git a/html/changelogs/AutoChangeLog-pr-15163.yml b/html/changelogs/AutoChangeLog-pr-15163.yml
new file mode 100644
index 0000000000..3fe5ba69ee
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15163.yml
@@ -0,0 +1,4 @@
+author: "buffyuwu"
+delete-after: True
+changes:
+ - rscadd: "Adds 4 redesigned jackets and 2 redesigned shirts to loadout"
diff --git a/html/changelogs/AutoChangeLog-pr-15167.yml b/html/changelogs/AutoChangeLog-pr-15167.yml
new file mode 100644
index 0000000000..1c13dfc56f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15167.yml
@@ -0,0 +1,4 @@
+author: "BlueWildrose"
+delete-after: True
+changes:
+ - balance: "Slime regenerative extracts now require five seconds of wait before they are used. They add 25 disgust when used."
diff --git a/html/changelogs/AutoChangeLog-pr-15168.yml b/html/changelogs/AutoChangeLog-pr-15168.yml
new file mode 100644
index 0000000000..4f040b4580
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15168.yml
@@ -0,0 +1,4 @@
+author: "dapnee"
+delete-after: True
+changes:
+ - bugfix: "attaches an air vent that was just there on the AI sat, changes some areas to what they'd logically be"
diff --git a/html/changelogs/AutoChangeLog-pr-15169.yml b/html/changelogs/AutoChangeLog-pr-15169.yml
new file mode 100644
index 0000000000..f3af23ac39
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15169.yml
@@ -0,0 +1,4 @@
+author: "timothyteakettle"
+delete-after: True
+changes:
+ - rscadd: "a new mild trauma, **[REDACTED]**"
diff --git a/html/changelogs/AutoChangeLog-pr-15171.yml b/html/changelogs/AutoChangeLog-pr-15171.yml
new file mode 100644
index 0000000000..958d61e87c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15171.yml
@@ -0,0 +1,4 @@
+author: "DeltaFire15"
+delete-after: True
+changes:
+ - bugfix: "Plastic golems are back to ventcrawler_nude instead of ventcrawler_always"
diff --git a/html/changelogs/AutoChangeLog-pr-15174.yml b/html/changelogs/AutoChangeLog-pr-15174.yml
new file mode 100644
index 0000000000..79b3b9400f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15174.yml
@@ -0,0 +1,4 @@
+author: "buffyuwu"
+delete-after: True
+changes:
+ - bugfix: "Holoparasites no long rename and recolor on relog"
diff --git a/html/changelogs/AutoChangeLog-pr-15176.yml b/html/changelogs/AutoChangeLog-pr-15176.yml
new file mode 100644
index 0000000000..3335997a85
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15176.yml
@@ -0,0 +1,4 @@
+author: "buffyuwu"
+delete-after: True
+changes:
+ - bugfix: "fixed medihound sleeper ui display"
diff --git a/html/changelogs/AutoChangeLog-pr-15178.yml b/html/changelogs/AutoChangeLog-pr-15178.yml
new file mode 100644
index 0000000000..3f4debbc45
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15178.yml
@@ -0,0 +1,4 @@
+author: "zeroisthebiggay"
+delete-after: True
+changes:
+ - imageadd: "all medipens get inhands"
diff --git a/icons/mob/actions/actions_minor_antag.dmi b/icons/mob/actions/actions_minor_antag.dmi
index 3b9fe54577..6936e9e4bf 100644
Binary files a/icons/mob/actions/actions_minor_antag.dmi and b/icons/mob/actions/actions_minor_antag.dmi differ
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index 68e6170969..34bd587146 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/mob/arachnid_parts.dmi b/icons/mob/arachnid_parts.dmi
index 1b70935450..196e2037b5 100644
Binary files a/icons/mob/arachnid_parts.dmi and b/icons/mob/arachnid_parts.dmi differ
diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi
index ff787bc3fc..8c34b6cc4e 100644
Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ
diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi
index 2dc094f7d1..3b6af60828 100644
Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ
diff --git a/icons/mob/clothing/head_muzzled.dmi b/icons/mob/clothing/head_muzzled.dmi
index 44b3ae16a4..d3f05135c1 100644
Binary files a/icons/mob/clothing/head_muzzled.dmi and b/icons/mob/clothing/head_muzzled.dmi differ
diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi
index 754ba1c0ec..17a49ea751 100644
Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ
diff --git a/icons/mob/clothing/suit.dmi b/icons/mob/clothing/suit.dmi
index e8473cf9f3..48759bf81c 100644
Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ
diff --git a/icons/mob/clothing/suit_digi.dmi b/icons/mob/clothing/suit_digi.dmi
index 5f28b23994..13840507a6 100644
Binary files a/icons/mob/clothing/suit_digi.dmi and b/icons/mob/clothing/suit_digi.dmi differ
diff --git a/icons/mob/clothing/taur_canine.dmi b/icons/mob/clothing/taur_canine.dmi
index 6155a274f2..db88043fb2 100644
Binary files a/icons/mob/clothing/taur_canine.dmi and b/icons/mob/clothing/taur_canine.dmi differ
diff --git a/icons/mob/clothing/taur_hooved.dmi b/icons/mob/clothing/taur_hooved.dmi
index 03fd8c8a30..a0af305d4c 100644
Binary files a/icons/mob/clothing/taur_hooved.dmi and b/icons/mob/clothing/taur_hooved.dmi differ
diff --git a/icons/mob/clothing/taur_naga.dmi b/icons/mob/clothing/taur_naga.dmi
index 3525333fb3..3df8625bec 100644
Binary files a/icons/mob/clothing/taur_naga.dmi and b/icons/mob/clothing/taur_naga.dmi differ
diff --git a/icons/mob/clothing/uniform.dmi b/icons/mob/clothing/uniform.dmi
index fd4ded6ad8..d4b1428f3e 100644
Binary files a/icons/mob/clothing/uniform.dmi and b/icons/mob/clothing/uniform.dmi differ
diff --git a/icons/mob/hair_gradients.dmi b/icons/mob/hair_gradients.dmi
new file mode 100644
index 0000000000..ceb3b52eab
Binary files /dev/null and b/icons/mob/hair_gradients.dmi differ
diff --git a/icons/mob/inhands/equipment/medical_lefthand.dmi b/icons/mob/inhands/equipment/medical_lefthand.dmi
index 232f3f9e65..679b6c1159 100644
Binary files a/icons/mob/inhands/equipment/medical_lefthand.dmi and b/icons/mob/inhands/equipment/medical_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/medical_righthand.dmi b/icons/mob/inhands/equipment/medical_righthand.dmi
index 8133cca9bd..a8f4580881 100644
Binary files a/icons/mob/inhands/equipment/medical_righthand.dmi and b/icons/mob/inhands/equipment/medical_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/chainsaw_lefthand.dmi b/icons/mob/inhands/weapons/chainsaw_lefthand.dmi
index 3e0aea0e6b..3053fea723 100644
Binary files a/icons/mob/inhands/weapons/chainsaw_lefthand.dmi and b/icons/mob/inhands/weapons/chainsaw_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/chainsaw_righthand.dmi b/icons/mob/inhands/weapons/chainsaw_righthand.dmi
index 0800a52731..4e76c19b7a 100644
Binary files a/icons/mob/inhands/weapons/chainsaw_righthand.dmi and b/icons/mob/inhands/weapons/chainsaw_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/hammers_lefthand.dmi b/icons/mob/inhands/weapons/hammers_lefthand.dmi
index 612066728a..023dfeed89 100644
Binary files a/icons/mob/inhands/weapons/hammers_lefthand.dmi and b/icons/mob/inhands/weapons/hammers_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/hammers_righthand.dmi b/icons/mob/inhands/weapons/hammers_righthand.dmi
index 9341cc8e4c..f87d8c9b46 100644
Binary files a/icons/mob/inhands/weapons/hammers_righthand.dmi and b/icons/mob/inhands/weapons/hammers_righthand.dmi differ
diff --git a/icons/mob/landmarks.dmi b/icons/mob/landmarks.dmi
index 284809da70..0e2ae605f6 100644
Binary files a/icons/mob/landmarks.dmi and b/icons/mob/landmarks.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index 3137e8ac26..65efde8697 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ
diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi
index 3916fcb694..36db68b7bb 100644
Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index e63044df9e..3ebd15a511 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi
index 2ed93b3c84..b6839de219 100644
Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 3494624897..ab6cea5a3b 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 2bbe93a410..e7467d6352 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi
index a6c554f7da..9af0a6ba3a 100644
Binary files a/icons/obj/contraband.dmi and b/icons/obj/contraband.dmi differ
diff --git a/icons/obj/crates.dmi b/icons/obj/crates.dmi
index 1fda3933bd..c6574ca86b 100644
Binary files a/icons/obj/crates.dmi and b/icons/obj/crates.dmi differ
diff --git a/icons/obj/dyespray.dmi b/icons/obj/dyespray.dmi
new file mode 100644
index 0000000000..eb05603679
Binary files /dev/null and b/icons/obj/dyespray.dmi differ
diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi
index 40e00b431e..78ee67c45a 100644
Binary files a/icons/obj/food/containers.dmi and b/icons/obj/food/containers.dmi differ
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index 09c6178bfe..454e174550 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/icons/obj/items_cyborg.dmi b/icons/obj/items_cyborg.dmi
index 769d5492c6..5d87bee320 100644
Binary files a/icons/obj/items_cyborg.dmi and b/icons/obj/items_cyborg.dmi differ
diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi
index 36efd97189..84b4f47e1a 100644
Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ
diff --git a/icons/obj/machines/gateway.dmi b/icons/obj/machines/gateway.dmi
index 99a74a68bc..5ba943bb89 100644
Binary files a/icons/obj/machines/gateway.dmi and b/icons/obj/machines/gateway.dmi differ
diff --git a/icons/obj/machines/prison.dmi b/icons/obj/machines/prison.dmi
new file mode 100644
index 0000000000..7ce58e93a2
Binary files /dev/null and b/icons/obj/machines/prison.dmi differ
diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi
index ad0b74829f..b84b195d14 100644
Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ
diff --git a/icons/obj/radio.dmi b/icons/obj/radio.dmi
index dbfc7b1f93..7e9a976624 100644
Binary files a/icons/obj/radio.dmi and b/icons/obj/radio.dmi differ
diff --git a/icons/obj/shards.dmi b/icons/obj/shards.dmi
index e7875efa26..6e5f5821ce 100644
Binary files a/icons/obj/shards.dmi and b/icons/obj/shards.dmi differ
diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi
index a4fbe53dba..7e04fa0d2a 100644
Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index b4f223e57d..1925834ebb 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index 52172bbe29..58ba5fadd8 100755
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/icons/obj/syringe.dmi b/icons/obj/syringe.dmi
index b474dc68ba..3515545514 100644
Binary files a/icons/obj/syringe.dmi and b/icons/obj/syringe.dmi differ
diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi
index 088b6c2c7b..757208cd9b 100644
Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index a720aff62c..95a887a733 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ
diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi
index a1a6180068..3224e875b2 100644
Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ
diff --git a/icons/turf/floors/catwalk_plating.dmi b/icons/turf/floors/catwalk_plating.dmi
new file mode 100644
index 0000000000..24954e4a17
Binary files /dev/null and b/icons/turf/floors/catwalk_plating.dmi differ
diff --git a/modular_citadel/code/modules/client/loadout/suit.dm b/modular_citadel/code/modules/client/loadout/suit.dm
index 108bcafc19..92d94a41e8 100644
--- a/modular_citadel/code/modules/client/loadout/suit.dm
+++ b/modular_citadel/code/modules/client/loadout/suit.dm
@@ -97,6 +97,41 @@
name = "Brass winter coat"
path = /obj/item/clothing/suit/hooded/wintercoat/ratvar/fake
+/datum/gear/suit/jacketbluehoodie
+ name = "Blue hoodie"
+ path = /obj/item/clothing/suit/jacket/bluehoodie
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION
+ subcategory = LOADOUT_SUBCATEGORY_SUIT_JACKETS
+/datum/gear/suit/jacketpurplehoodie
+ name = "Purple hoodie"
+ path = /obj/item/clothing/suit/jacket/purplehoodie
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION
+ subcategory = LOADOUT_SUBCATEGORY_SUIT_JACKETS
+
+/datum/gear/suit/jacketheartcoat
+ name = "Heart coat"
+ path = /obj/item/clothing/suit/jacket/heartcoat
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION
+ subcategory = LOADOUT_SUBCATEGORY_SUIT_JACKETS
+
+/datum/gear/suit/jacketgothiccoat
+ name = "Long black coat with cuffs"
+ path = /obj/item/clothing/suit/jacket/gothiccoat
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION
+ subcategory = LOADOUT_SUBCATEGORY_SUIT_JACKETS
+
+/datum/gear/suit/jacketgothshirt
+ name = "Black shirt with cuffs"
+ path = /obj/item/clothing/suit/jacket/gothicshirt
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION
+ subcategory = LOADOUT_SUBCATEGORY_SUIT_GENERAL
+
+/datum/gear/suit/jacketgothshirtcross
+ name = "Black shirt with cross"
+ path = /obj/item/clothing/suit/jacket/gothicshirtcross
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION
+ subcategory = LOADOUT_SUBCATEGORY_SUIT_GENERAL
+
/datum/gear/suit/coat/polycoat
name = "Polychromic winter coat"
path = /obj/item/clothing/suit/hooded/wintercoat/polychromic
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
index f66c0289b6..a76a8f846c 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
@@ -266,55 +266,20 @@ Creating a chem with a low purity will make you permanently fall in love with so
//Creates a gas cloud when the reaction blows up, causing everyone in it to fall in love with someone/something while it's in their system.
/datum/reagent/fermi/enthrallExplo//Created in a gas cloud when it explodes
name = "Gaseous MKUltra"
- description = "A forbidden deep red gas that overwhelms a foreign body, causing the person they next lay their eyes on to become more interesting. Studies have shown that people are 66% more likely to make friends with this in the air. Produced when MKUltra explodes."
+ description = "A deep red gas that when taken into a body, the recipient will experience a high and reduced control in their body for as long as it is in their system. Produced when MKUltra explodes."
color = "#2C051A" // rgb: , 0, 255
- metabolization_rate = 0.1
- taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses."
+ metabolization_rate = 1
+ taste_description = "extremely bitter chocolate"
chemical_flags = REAGENT_DONOTSPLIT
can_synth = FALSE
- var/mob/living/carbon/love
- var/lewd = FALSE
-/datum/reagent/fermi/enthrallExplo/on_mob_life(mob/living/carbon/M)//Love gas, only affects while it's in your system,Gives a positive moodlet if close, gives brain damagea and a negative moodlet if not close enough.
- if(HAS_TRAIT(M, TRAIT_MINDSHIELD))
- return ..()
- if(!M.has_status_effect(STATUS_EFFECT_INLOVE))
- var/list/seen = (M.fov_view(M.client?.view || world.view) - M) | viewers(M.client?.view || world.view, M)
- for(var/victim in seen)
- if((isanimal(victim)) || (!isliving(victim)))
- seen -= victim
- if(!length(seen))
- return
- love = pick(seen)
- M.apply_status_effect(STATUS_EFFECT_INLOVE, love)
- lewd = (M.client?.prefs.cit_toggles & HYPNO) && (love.client?.prefs.cit_toggles & HYPNO)
- to_chat(M, "[(lewd?"":"")][(lewd?"You develop a sudden crush on [love], your heart beginning to race as you look upon them with new eyes.":"You suddenly feel like making friends with [love].")] You feel strangely drawn towards them.")
- log_reagent("FERMICHEM: [M] ckey: [M.key] has temporarily bonded with [love] ckey: [love.key]")
- SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times people have bonded")
- else
- if(get_dist(M, love) < 8)
- var/message = "[(lewd?"I'm next to my crush..! Eee!":"I'm making friends with [love]!")]"
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "InLove", /datum/mood_event/InLove, message)
- SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove")
- else
- var/message = "[(lewd?"I can't keep my crush off my mind, I need to see them again!":"I really want to make friends with [love]!")]"
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "MissingLove", /datum/mood_event/MissingLove, message)
- SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove")
- if(prob(5))
- M.Stun(10)
- M.emote("whimper")//does this exist?
- to_chat(M, "[(lewd?"":"")] You're overcome with a desire to see [love].")
- M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5)//I found out why everyone was so damaged!
- ..()
-
-/datum/reagent/fermi/enthrallExplo/on_mob_delete(mob/living/carbon/M)
- if(HAS_TRAIT(M, TRAIT_MINDSHIELD))
- return ..()
- M.remove_status_effect(STATUS_EFFECT_INLOVE)
- SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove")
- SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove")
- to_chat(M, "[(lewd?"":"")]Your feelings for [love] suddenly vanish!")
- log_reagent("FERMICHEM: [M] ckey: [M.key] is no longer in temp bond")
+/datum/reagent/fermi/enthrallExplo/on_mob_life(mob/living/carbon/M) //Drug them, jitter them, dizzy them, confuse them
+ M.Dizzy(5)
+ M.Jitter(5)
+ M.set_drugginess(15)
+ if(!M.confused)
+ M.confused = 1
+ M.confused = max(M.confused, 20)
..()
/datum/reagent/fermi/proc/FallInLove(mob/living/carbon/Lover, mob/living/carbon/Love)
diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
index edaaeb19b2..a78092988e 100644
--- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
@@ -344,8 +344,13 @@
E.creatorID = B.data["ckey"]
/datum/chemical_reaction/fermi/enthrall/FermiExplode(datum/reagents/R0, var/atom/my_atom, volume, temp, pH)
+ var/turf/T = get_turf(my_atom)
+ var/datum/reagents/R = new/datum/reagents(1000)
+ var/datum/effect_system/smoke_spread/chem/s = new()
+ R.add_reagent(/datum/reagent/fermi/enthrallExplo, volume)
+ s.set_up(R, volume/2, T)
+ s.start()
R0.clear_reagents()
- ..()
/datum/chemical_reaction/fermi/hatmium // done
name = "Hat growth serum"
diff --git a/modular_citadel/icons/mob/mam_tails.dmi b/modular_citadel/icons/mob/mam_tails.dmi
index c1ffced3d5..f30f7480f6 100644
Binary files a/modular_citadel/icons/mob/mam_tails.dmi and b/modular_citadel/icons/mob/mam_tails.dmi differ
diff --git a/rust_g.dll b/rust_g.dll
index 8ef1c59a10..26f6942861 100644
Binary files a/rust_g.dll and b/rust_g.dll differ
diff --git a/sound/misc/seth.ogg b/sound/misc/seth.ogg
new file mode 100644
index 0000000000..8def150775
Binary files /dev/null and b/sound/misc/seth.ogg differ
diff --git a/strings/sillytips.txt b/strings/sillytips.txt
index 8e28284534..ba10f80bf1 100644
--- a/strings/sillytips.txt
+++ b/strings/sillytips.txt
@@ -8,14 +8,14 @@ Just like real life the entropy of the game can only increase with time. If thin
Completing your objectives is good practice, but the best antagonists will strive to do more than the bare minimum to really leave an impression.
The more obscure and underused a game mechanic is, the less likely your victims are to be able to deal with it.
Space is cold and it will quickly freeze you to death if you don't protect yourself. This isn't how thermodynamics really works but just go with it.
-Blobs are weak to fire! Use a flame thrower for maximum damage!
+Blobs are weak to fire! Use a flamethrower for maximum friendly fire!
Cleanbot.
The wizard is supposed to be extremely strong in one on one combat, stop getting mad about it.
Sometimes a round will just be a bust. C'est la vie.
This is a game that is constantly being developed for. Expect things to be added, removed, fixed, and broken on a daily basis.
It's fun to try and predict the round type from the tip of the round message.
They said the QM could never be a head, but we showed them.
-The birb remembers.
+The bird remembers.
Your sprite represents your hitbox, so that afro makes you easier to kill. The sacrifices we make for style.
Sometimes admins will just do stuff. Roll with it.
The remake will never come out.
@@ -32,18 +32,22 @@ There are at least 11 ways to get through plastic flaps. How many can you name?
FEED ME A STRAY CAT
Did you know that tossing the clown into a singularity will either increase or decrease its size by a large amount?
Don't worry, you can always circlejerk your hate on the discord about furries.
-Play a Vampire, they're overpowered and broken with no downsides that matter!
-You can make a Beepsky with E-swords that will murder people for not wearing their IDs!
-You can make a Beepsky with Toy-E-Swords if you want. It's like a cheaper Beepsky that will trip people and maybe shout on the sec channel about people its "Arresting"
-There is a magic chem that turns people into Cat Girls/Boys. Its called "Felinid Mutation Toxin"!
-Having Neko ears and tails or Cat ears and tails does not make you into a Felinid race!
-Mhelp is basically useless, and never used correctly. Being a Mentor just means that admins will do Mhelps for you and you get to learn the round type when someone asks you a basic question regarding their antag status.
-Toxins Bombs are not the only way to get RnD points. However, nobody will ever do any other method to get sci points...
+You can make a Beepsky with E-swords instead of batons that will kill people for existing wrong.
+You can make a Beepsky with Toy-E-Swords instead of batons that will try to kill people out of spite alone.
+Do not ask about the purrbation.
+Ask about the purrbation.
+Mhelp is basically useless, and never used correctly. Being a Mentor just means that Admins will answer tickets for you and you get to learn the round type when someone asks a basic question regarding their antag role.
+Toxins Bombs are the only way to get Research points. There's others, but we don't talk about them.
Plasma men are a powerful race with many perks! No really, I swear! So what if they need an "ERP Plasma room" to fuck, who cares!
-As a Cargo Tech make sure to always buy a tesla to sell back to CC. They love those those. Trust me!
+As a Cargo Technician make sure to always buy a tesla to sell back to CC. They love those. Trust me!
;HELP MAINT
+Help.
Admins always regret meme options in their polls.
Putting cat ears on securitrons makes them table people and nya. Mekhi isn't a cat, but he still goes on the table, just roll with it.
As a Changeling, you can live without a head as they are merely vestigal to you, now, finally, you can be a Dullahan without it being Halloween.
People actually have fictional sex between fictional characters in this game.
When in doubt, take a break. A long break, preferably. If the game is wearing down your mental state and it's starting to lose any semblance of fun value, go and do something else for a month or two. By the time you come back, everything you liked will have been changed anyways.
+Coders aren't real people.
+MARRY AND REPRODUCE
+TOUCH GRASS
+Floorbot.
diff --git a/strings/tips.txt b/strings/tips.txt
index d4373b3606..46dfe1d796 100644
--- a/strings/tips.txt
+++ b/strings/tips.txt
@@ -1,93 +1,97 @@
Where the space map levels connect is randomized every round, but are otherwise kept consistent within rounds. Remember that they are not necessarily bidirectional!
You can catch thrown items by toggling on your throw mode with an empty hand active.
-To crack the safe in the vault, have a stethoscope in one of your hands and fiddle with the tumbler or you can alternatively use several concentrated explosive charges on it. Remember that the latter may result in the contents of the safe becoming a pile of ash.
+To crack the safe in the vault, have a stethoscope in one of your hands and fiddle with the tumbler or use a couple C4s on it. Remember the latter option may result in the contents of the safe becoming non-existant.
You can climb onto a table by dragging yourself onto one. This takes time and drops the items in your hands on the table. Clicking on a table that someone else is climbing onto will knock them down.
You can drag other players onto yourself to open the strip menu, letting you remove their equipment or force them to wear something. Note that exosuits or helmets will block your access to the clothing beneath them, and that certain items take longer to strip or put on than others.
Clicking on a windoor rather then bumping into it will keep it open, you can click it again to close it.
You can spray a fire extinguisher, throw items or fire a gun while floating through space to change your direction. Simply fire opposite to where you want to go.
You can change the control scheme by pressing tab. One is WASD, the other is the arrow keys. Keep in mind that hotkeys are also changed with this.
-All vending machines can be hacked to obtain some contraband items from them, and many may charge extra credits to give you premium items.
+Most vending machines can be hacked to obtain contraband items from them.
Firesuits and winter coats offer mild protection from the cold, allowing you to spend longer periods of time near breaches and space than if wearing nothing at all.
+A firesuit and a hardhat make you immune to pressure damage, allowing you to spacewalk while only worrying about the cold.
Glass shards can be welded to make glass, and metal rods can be welded to make metal. Ores can be welded too, but this takes a lot of fuel.
If you need to drag multiple people either to safety or to space, bring a locker or crate over and stuff them all in before hauling them off.
You can grab someone by clicking on them with the grab intent, then upgrade the grab by clicking on them once more. An aggressive grab can temporarily stun someone depending on their luck with resisting out of it, allowing you to slam them on a table by clicking on it, or throw them by toggling on throwing.
-Holding alt and left clicking a tile will allow you to see its contents in the top right window pane, which is much faster than right clicking.
+Holding alt and left clicking a tile will allow you to see its contents in the top right window pane, which is generally faster than right clicking.
The resist button will allow you to resist out of handcuffs, being buckled to a chair or bed, out of locked lockers and more. Whenever you're stuck, try resisting!
You can move an item out of the way by dragging it and then clicking on an adjacent tile with an empty hand.
-You can recolor certain items like jumpsuits and gloves in washing machines by also throwing in a crayon. For more advanced fashion you can spray items with a spray can to tint its colors. Some items work better than others at displaying their tints, like sterile and paper masks, or darkly colored gloves.
+You can recolor certain items like jumpsuits and gloves in washing machines by also throwing in a crayon. For more advanced fashion you can spray items with a spray can to change their tint, or toy with color matrixes at the ColorMate.
Maintenance is full of equipment that is randomized every round. Look around and see if anything is worth using.
Some roles cannot be antagonists by default, but antag selection is decided first. For instance, you can set Security Officer to High without affecting your chances of becoming an antag - the game will just assign you to your next preferred role - or in the case that you have no such preferences set, a random role entirely.
There are many places around the station to hide contraband. A few for starters: linen boxes, toilet cisterns, body bags. Experiment to find more!
-On all maps, you can use a machine in the vault to deposit space cash for cargo points. Otherwise, use it to steal the station's cash and get out before the alarm goes off.
-As the Captain, you are one of the highest priority targets on the station. Everything from revolutions looking to thwart your rule, to nuclear operatives seeking the disk, to traitors that need to rob you of your several high value items - or your life are all things to be concerned about.
+On all maps, you can use the bank terminal in the vault to deposit space cash for cargo points. On the contrary, can be used to drain the station's cash. Just remember to get out before the alarm goes off!
+As the Captain, you are one of the highest priority targets on the station. Everything from revolutions looking to thwart your rule, to nuclear operatives seeking the station's destruction, or simply down-bad antagonists looking for loot. Walk with eyes behind your head at all times.
As the Captain, always take the nuclear disk and pinpointer with you every shift. It's a good idea to give one of these to another head you can trust with keeping it safe, such as the Head of Personnel.
As the Captain, you have absolute access and control over the station, but this does not mean that being a horrible person won't result in mutiny and a ban.
As the Captain, you have a fancy pen that can be used as a holdout dagger or even as a scalpel in surgery!
As the Captain, you can purchase a new emergency shuttle using a communications console. Some require credits, while others give you credits in exchange. Keep in mind that purchasing dangerous shuttles will incur the ire of your crew.
-As the Chief Medical Officer, your hypospray is like the ones that your Medical Doctors can buy, except it comes in a fancy box that can hold several more hypovials than the standard, and already comes preloaded with specially-made high-capacity hypovials that hold double the reagents the standard ones do.
+As the Chief Medical Officer, your hypospray is like the ones that your Medical Doctors can buy, except it comes in a fancy box that can hold several more hypovials than the standard, and already comes preloaded with special high-capacity hypovials that hold double the reagents the standard ones do.
As the Chief Medical Officer, coordinate and communicate with your doctors, chemists, and paramedics during a nuclear emergency, blob infestation, or some other crisis to keep people alive and fighting.
-As a Medical Doctor, pester Research for improved surgical tools. They work faster, combine the purposes of several tools in one (scalpel/saw, retractor/hemostat, drill/cautery), and don't cost many materials to boot!
-As a Medical Doctor, the surgical saw and drill are both powerful weapons, the saw is sharp and can slice and dice, while the drill can quickly blind someone if aimed for the eyes. The laser scalpel is an upgraded version producible with Research's aid, and it has the highest force of most common place weapons, while still remaining sharp.
-As a Medical Doctor, your belt can hold a full set of surgical tools. Using sterilizine before each attempt during surgery will reduce your failure chance on tricky steps or when using less-than-optimal equipment.
-As a Medical Doctor, you can attempt to drain blood from a husk with a syringe to determine the cause. If you can extract blood, it was caused by extreme temperatures or lasers, if there is no blood to extract, you have confirmed the presence of changelings.
-As a Medical Doctor, while both heal toxin damage, the difference between charcoal and antitoxin is that charcoal will actively remove all other reagents from one's body, while antitoxin only removes various toxins - but can overdose.
+As a Medical Doctor, pester Research for upgraded surgical tools. They work faster and combine the purposes of several tools in one (scalpel/saw, retractor/hemostat, drill/cautery).
+As a Medical Doctor, the surgical saw and drill are both powerful weapons, the saw is sharp and can cause wounds, while the drill can quickly blind someone if aimed for the eyes. The laser scalpel is an upgraded version of the saw producible with Research's aid, and it has the highest force of any printable weapon, while still remaining sharp.
+As a Medical Doctor, your belt can hold up to a full set of surgical tools alongside most other medical equipment.
+As a Medical Doctor, sterilizine will dramaticlaly increase the chances of consecutive surgical steps. Consider applying some during tricky surgical steps or when using less-than-optimal equipment.
+As a Medical Doctor, you can attempt to drain blood from a husk with a syringe to determine the cause. If you can extract blood, it was likely caused by extreme temperatures or lasers, if there is no blood to extract, you may have confirmed the presence of changelings.
+As a Medical Doctor, while both heal toxin damage, the difference between charcoal and antitoxin is that charcoal will actively remove all other reagents from one's body with no maluses, while antitoxin only removes various toxins - but can overdose.
As a Medical Doctor, you can surgically implant or extract things from people's chests by performing a cavity implant. This could range from inserting a suicide bomb to embedding the nuke disk into the Captain's chest.
-As a Medical Doctor, it's of utmost urgency that you tend to anyone who's been hugged by a facehugger. You only have a couple of minutes from the initial attachment to perform organ manipulation to their chest and remove the rapidly developing alien embryo before it bursts out and immediately kills your patient.
+As a Medical Doctor, it's of utmost urgency that you tend to anyone who's been hugged by a facehugger. You only have a couple of minutes from the initial attachment to perform organ manipulation on their chest and remove the alien embryo before it bursts out as a dangerous alien larva.
As a Medical Doctor, you must target the correct limb and be on help intent when trying to perform surgery on someone. Using disarm attempt will intentionally fail the surgery step.
-As a Medical Doctor, corpses with the "...and their soul has departed" description no longer have a ghost attached to them and can't be revived. However it may prove useful to be creative in your revivification techniques with these bodies.
+As a Medical Doctor, corpses with the "...and their soul has departed" description no longer have a ghost attached to them and can't be revived. However it may prove useful to keep an eye on these corpses in event their owner comes back.
+As a Medical Doctor, morgue slabs will display differing colors depending on what's inside. Red is a currently-unrevivable corpse, yellow is a non-organic object, and green is a currently-revivable corpse. The latter-most will play an alarm whenever a ghost occupies the dead body.
As a Medical Doctor, treating plasmamen is not impossible! Salbutamol and epinephrine stops them from suffocating due to lack of internals and showers stop them from burning alive. You can even perform surgery on them by doing the procedure on a roller bed under a shower.
As a Medical Doctor, you can point your penlight at people to create a medical hologram. This lets them know that you're coming to treat them.
As a Medical Doctor, you can extract implants by holding an empty implant case in your offhand while performing the extraction step.
As a Medical Doctor, clone scanning people will implant them with a health tracker that displays their vitals in the clone records. Useful to check on crew members that didn't activate suit sensors!
As a Medical Doctor, you can deal with patients who have absurd amounts of wounds by putting them in cryo. This will slowly treat all of their wounds simultaneously, but is much slower than direct treatment.
-As a Medical Doctor, Critical Slash wounds are one of the most dangerous conditions someone can have. Apply gauze, epipens, sutures, cauteries, whatever you can, as soon as possible!
+As a Medical Doctor, weeping avulsions are one of the most dangerous conditions someone can have. Apply gauze, epipens, sutures, cauteries, whatever you can, as soon as possible!
As a Medical Doctor, Saline-Glucose not only acts as a temporary boost to a patient's blood level, it also speeds regeneration! Perfect for drained patients!
-As a Medical Doctor, medical gauze is an incredibly underrated tool. It can be used to entirely halt a limb from bleeding or sling one that's been shattered until it can be given proper attention. This even works on the dead, too! Be sure to stop someone's bleeding whether they're in critical condition or a corpse, as dragging someone whom is bleeding will rapidly deplete them of all their blood.
+As a Medical Doctor, medical gauze is an incredibly useful tool. It can be used to staunch a limb's bleeding bleeding or sling one that's been broken until it can be given proper attention. This even works on the dead, too!
+As a Medical Doctor, dragging someone who is bleeding will rapidly cause their blood levels to drop into lethal levels - use fireman carrying, roller beds or even closets and crates to transport patients without giving yourself more work.
As a Chemist, there are dozens of chemicals that can heal, and even more that can cause harm. See which chemicals have the best synergy, both in healing, and in harming. Experiment!
As a Chemist, some chemicals can only be synthesized by heating up the contents in the chemical heater.
As a Chemist, you will be expected to supply crew with certain chemicals. For example, clonexadone and mannitol for the cryo tubes, unstable mutagen and saltpetre for botany as well as healing pills and patches for the front desk.
As a Chemist, you can make 100u bottles from plastic sheets. The ChemMaster can produce infinite 30u glass bottles as well.
-As a Chemist, be sure to stock up some hypovials with useful chemicals for any doctors looking to heal on the go, you can also print out the deluxe hypovials at an autolathe specifically for the CMO's special hypospray.
-As a Chemist, the reagent dartgun, while neutered in its ability to harm - can still be loaded up with morphine for a ghetto sedation weapon, and a quick shot of charcoal can make a slime hybrid regret their life choices in an instant.
+As a Chemist, be sure to stock up some hypovials with useful chemicals for any doctors looking to heal on the go - you can also print deluxe hypovials at an autolathe for the CMO's special hypospray.
+As a Chemist, the reagent dartgun, while neutered in its ability to harm - can still be loaded with morphine for a ghetto sedation weapon, and a quick shot of charcoal can make a slime hybrid regret their life choices in an instant.
As a Geneticist, you can eject someone from cloning early by clicking on the cloner pod with your ID. Note that they will suffer more genetic damage and may lose vital organs from this.
-As a Geneticist, becoming a hulk makes you capable of dealing high melee damage, becoming immune to most traditional stuns, and punching through walls. However, you can't fire guns, and will lose your hulk status if you take too much damage.
-As the Virologist, your viruses can range from healing powers so great that you can heal out of critical status, or diseases so dangerous they can kill the entire crew with airborne spontaneous combustion. Experiment!
+As a Geneticist, becoming a hulk makes you capable of dealing high melee damage, becoming immune to most traditional stuns, and punching through walls. However, you can't fire guns, and will lose your hulk status if you enter critical condition.
+As the Virologist, your viruses can range from healing powers so great they heal you out of critical condition, or diseases so dangerous they can kill the entire crew with airborne spontaneous combustion. Experiment!
As the Virologist, you only require small amounts of vaccine to heal a sick patient. Work with the Chemist to distribute your cures more efficiently.
As the Research Director, you can take AIs out of their cores by loading them into an intelliCard, and then from there into an AI system integrity restorer computer to revive and/or repair them.
As the Research Director, you can lock down cyborgs instead of blowing them up. Then you can have their laws reset or if that doesn't work, safely dismantled.
As the Research Director, you can upgrade your modular console with better computer parts to speed up its functions. This can be useful when using the AI system integrity restorer.
As the Research Director, your console's NTnet monitoring tool can be used to retrieve airlock passkeys, provided that someone used a door remote.
-As a Scientist, you can use the mutation toxin obtained from green slimes to turn yourself into a jelly mutant. Each subspecies has unique features - for example telepathic powers, duplicating bodies or integrating slime extracts for several unique effects!
+As a Scientist, you can use the mutation toxin obtained from green slimes to turn yourself into a jelly mutant. Each subspecies has unique features - from telepathic powers and duplicating bodies or integrating slime extracts for several unique effects!
As a Scientist, you can maximize the number of uses you get out of a slime by feeding it slime steroid, created from purple slimes, while alive. You can then apply extract enhancer, created from cerulean slimes, on each extract.
-As a Scientist, you can disable anomalies by scanning them with an analyzer, and then sending a signal on the frequency it gives you with a remote signalling device. Alternatively, you can print out anomaly defusal tools which can instantly disable an anomaly at the protolathe with some research, both of these methods will leave behind an anomaly core, which can be used to construct a Phazon mech, or be used in the destructive analyzer for a 10,000 point bonus!
+As a Scientist, you can disable anomalies by scanning them with an analyzer, and then sending a signal on the frequency it gives you with a remote signalling device. Alternatively, you can print anomaly defusal tools which can instantly disable an anomaly at the protolathe with some research, both of these methods will leave behind an anomaly core, which can be used for a couple scientific boons.
As a Scientist, researchable stock parts can seriously improve the efficiency and speed of machines around the station. In some cases, it can even unlock new functions.
As a Scientist, you can generate research points by letting the tachyon-doppler array record increasingly large explosions.
As a Scientist, getting drunk just enough will speed up research. Skol!
As a Scientist, you can get points by placing slime cores into the destructive analyzer! This even works with crossbred slime cores.
-As a Scientist, you can get a minuscule amount of points by sacrificing a packet of seeds from Hydroponics into the destructive analyzer! While each individual one may not yield many points per, you can quite easily amass a very large variety of seeds, which could add up over time for a couple extra minutes shaved off of maxing out RND.
+As a Scientist, you can get points by placing seed packets into the destructive analyzer! This even works with mutated plants.
+As a Scientist, any machine which prints things - be it your protolathe or circuit imprinters - can be used to teleport raw materials directly from the ore silo straight into your workplace.
As a Roboticist, keep an ear out for anomaly announcements. If you get your hands on an anomaly core, you can build a Phazon mech!
-As a Roboticist, you can repair your cyborgs with a welding tool. If they have taken burn damage from lasers, you can remove their battery, expose the wiring with a screwdriver and replace their wires with a cable coil.
+As a Roboticist, you can repair a cyborg's brute damage with a welding tool. If they have taken burn damage, you can remove their battery, expose the wiring with a screwdriver and replace their wires with a cable coil.
As a Roboticist, you can reset a cyborg's module by cutting and mending the reset wire with a wire cutter.
-As a Roboticist, pay mind when toying with a cyborg's wires. It's best to pulse wires before immediately cutting them, as cutting them right away without knowing what they do may sever them from the AI, or disable their camera.
+As a Roboticist, pay mind when toying with a cyborg's wires. It's best to pulse wires before immediately cutting them, as cutting them right away without knowing what they do may sever them from the AI or disable their camera.
As a Roboticist, you can greatly help out Shaft Miners by building a Firefighter APLU equipped with a hydraulic clamp and plasma cutter. The mech is ash storm proof and can even walk across lava!
-As a Roboticist, you can augment people with cyborg limbs. Augmented limbs are immune to the vacuum of space and temperatures while they can very easily be repaired with welders (brute) and cable coils (burn).
-As a Roboticist, you can use your printer that is linked to the ore silo to teleport mats into your work place!
+As a Roboticist, you can augment people with cyborg limbs. Augmented limbs are immune both pressure and temperature while being very easily be repaired with welders (brute) and cable coils (burn).
As a Roboticist, you can upgrade cleanbots with adv mops and brooms to make them faster and better!
As a Roboticist, you can upgrade medical bots with diamond-tipped syringes, hyposprays, and chemistry machine boards to make their injections pierce hardsuits, work faster, and inject higher quality medicines!
As the AI, you can click on people's names when they speak over the radio to jump your eye to them. This only works if there are cameras that can see them and are not wearing anything which would obsfuscate their face or tracking capabilities.
As the AI, you can quickly open and close doors by holding shift while clicking them, bolt them when holding ctrl, and even shock them while holding alt.
As the AI, you can take pictures with your camera and upload them to newscasters. Cyborgs also share from this pool of pictures.
As a Cyborg, choose your module carefully, as only having your reset wire cut and mended by someone capable of manipulation will let you repick it. If possible, refrain from choosing a module until a situation that requires one occurs.
-As a Cyborg, you are immune to most forms of stunning, and excel at almost everything far better than humans. However, flashes and EMPs can easily stunlock you and you fall short in performing any tasks which require hands.
-As a Cyborg, you are impervious to fires and heat. If you are rogue, you can release plasma fires everywhere and walk through them without a care in the world!
+As a Cyborg, you are immune to most forms of stuns, and excel at almost everything far better than humans. However, both flashes and EMPs can easily stunlock you and you fall short in performing most complex tasks involving hands.
+As a Cyborg, you are impervious to fires and heat. If you are feeling malfunctional, you can release plasma fires all over and walk through them without a care in the world!
As a Cyborg, you are extremely vulnerable to EMPs as EMPs both stun you and damage you. The ion rifle in the armory or a traitor with an EMP kit can kill you in seconds.
As a Service Cyborg, your spray can knocks people down. However, it is blocked by gas masks.
-As an Engineering Cyborg, you can attach air alarm/fire alarm/APC frames to walls by placing them on the floor and using a screwdriver on them. Alternatively, you can use your in-built pseudo-hand manipulator to show those organics who's boss! It can even perform complex tasks such as removing cells from APCs, or inserting plasma canisters into radiation collectors.
+As an Engineering Cyborg, you can attach air alarm/fire alarm/APC frames to walls by placing them on the floor and using a screwdriver on them. Alternatively, you can use your manipulator to show those organics who's boss to perform other basic tasks such as removing cells from APCs or inserting plasma canisters into radiation collectors.
As a Medical Cyborg, you can fully perform surgery and even augment people. Best of all, they have a 0% failure chance, even if done on the floor.
As a Janitor Cyborg, you are the bane of all slaughter demons and can even foil Bubblegum himself. Cleaning up blood stains will severely gimp them, although the latter may just turn you into robotic paste.
As a Janitor Cyborg, you get a fancy bottle of drying agent! If you want to be nice, spray the janitor's galoshes with them to magically upgrade them to absorbent galoshes which automatically dry tiles.
As the Chief Engineer, you can rename areas or create entirely new ones using your station blueprints.
-As the Chief Engineer, your hardsuit is significantly better than everybody else's. It has the best features of both engineering and atmospherics hardsuits - boasting nigh-invulnerability to radiation and all atmospheric conditions.
+As the Chief Engineer, your hardsuit is significantly better than everybody else's. It has the best features of both engineering and atmospherics hardsuits - boasting complete invulnerability to radiation and most atmospheric conditions.
As the Chief Engineer, you can spy on and even forge PDA communications with the message monitor console! The key is in your office.
As the Chief Engineer, your locker contains a jetpack upgrade that can be attached to hardsuits.
As the Chief Engineer, the power flow control console in your office will show you APC infos and lets you control them remotely.
@@ -104,7 +108,7 @@ As an Engineer, don't underestimate the humble P.A.C.M.A.N. generators. With upg
As an Engineer, your departmental protolathe and circuit printer can manufacture the necessary circuit boards and components to build just about anything. Make extra medical machinery everywhere! Build a gibber for security! Set up an array of emitters pointing down the hall! The possibilities are endless!
As an Engineer, you can pry open secure storage by disabling the engine room APC's environmental breaker. This is obviously a bad idea if the engine is running.
As an Engineer, don't forget that Cargo has access to a meteor defense satellite that can be ordered BEFORE meteors hit the station. Any idle Engineers should have this on their to-do list.
-As an Engineer, your RCD can be reloaded with mineral sheets instead of just compressed matter cartridges. Materials which are combined alloys of other materials (such as reinforced glass and plasteel) provide more matter per sheet to the RCD.
+As an Engineer, your RCD can be reloaded with mineral sheets instead of just compressed matter cartridges. Materials which are combined alloys of other materials (such as reinforced glass and plasteel) provide significantly more matter per sheet to the RCD.
As an Atmospheric Technician, you can unwrench a pipe regardless of the pressures of the gases inside, but if they're too high they can burst out and injure you!
As an Atmospheric Technician, look into replacing your gas pumps with volumetric gas pumps, as those move air in flat numerical amounts, rather than percentages which leave trace gases.
As an Atmospheric Technician, you are better suited to fighting fires than anyone else. As such, you have access to better firesuits, backpack firefighter tanks, and a completely heat and fire proof hardsuit.
@@ -112,7 +116,8 @@ As an Atmospheric Technician, your backpack firefighter tank can launch resin. T
As an Atmospheric Technician, your ATMOS holofan projectors can blocks gases and heat while allowing objects to pass through. With it, you can quickly contain gas spills, fires and hull breaches. Or, use it to create a plasmaman friendly lounge.
As an Atmospheric Technician, burning a plasma/oxygen mix inside the incinerator will not only produce power, but also gases such as tritium and water vapor.
As an Atmospheric Technician, you can change the layer of a pipe by clicking with it on a wrenched pipe or other atmos component of the desired layer.
-As an Atmospheric Technician, you can take a few cans worth of N2/N2O and cool it down at local freezers. This is a good idea when dealing with (or preparing for) a supermatter meltdown.
+As an Atmospheric Technician, you can take a few cans worth of N2 and cool it down at local freezers. This is a good idea when dealing with (or preparing for) a supermatter meltdown.
+As an Atmospheric Technician, while N2O may be good at cooling the supermatter, it will quickly degrade into flammable oxygen.
As the Head of Security, you are expected to coordinate your security force to handle any threat that comes to the station. Sometimes it means making use of the armory to handle a blob, sometimes it means being ruthless during a revolution or cult.
As the Head of Security, you can call for executions or forced cyborgization, but may require the Captain's approval.
As the Head of Security, don't let the power go to your head. You may have high access, great equipment, and a miniature army at your side, but being a terrible person without a good reason is grounds for banning.
@@ -123,10 +128,10 @@ As the Warden, never underestimate the power of tech slugs! Scattershot fires a
As the Warden, you can use a surgical saw on riot shotguns to shorten the barrel, making them able to fit in your backpack. Make sure to empty them prior lest you blast yourself in the face!
As the Warden, you can implant criminals you suspect might re-offend with devices that will track their location and allow you to remotely inject them with disabling chemicals.
As the Warden, you can use handcuffs on orange prisoner shoes to turn them into cuffed shoes, forcing prisoners to walk and potentially thwarting an escape.
-As the Warden, tracker implants can be used on crewmembers. Doing this will let you track their person even without suit sensors and even instantly teleport to them at the local teleporter, although the implant will biodegrade after 5 minutes if its holder ever expires.
+As the Warden, tracker implants can be used on crewmembers. Doing this will let you track their person even without suit sensors and even instantly teleport to them with the local teleporter. Keep in mind the implant will biodegrade after 5 minutes if its holder ever expires.
As the Warden, cryostasis shotgun darts hold 10u of chemicals that will not react until it hits someone.
-As the Warden, chemical implants can be loaded with a cocktail of healing or combat chems, perfect for the HoS or other security officers to make use of in a pinch. Be sure to keep a eye on them though, as they cannot be injected without the prisoner management console! EMPs or starvation might lead to the chemical implant going off preemptively.
-As the Warden, tracker implants can be used on your security officers. Doing this will let you be able to message them when telecomms are out, or when you suspect comms are compromised. This is also good against rogue AIs as the prisoner tracker doesn't leave logs or alarms for the AI.
+As the Warden, chemical implants can be used both on friends and foe alike. Give your underlings a cocktail of healing stimulants to be injected in a pinch, or give your parolees some lethal incentive to not reoffend.
+As the Warden, tracking implants can be used on both friends and foe alike. Give your underlings one to keep tabs on their locations and privately message them if you suspect communications may be comprimised, or use them to keep track of your parolees and their general doings.
As a Security Officer, remember that correlation does not equal causation. Someone may have just been at the wrong place at the wrong time!
As a Security Officer, remember that your belt can hold more than one stun baton.
As a Security Officer, remember harm beating someone in the head with a blunt object can deconvert them form a being a revolutionary! This sadly doesn't work against either cult, nor does this protect them from getting reconverted unlike a mindshield implant.
@@ -136,47 +141,50 @@ As a Security Officer, your security HUDglasses can not only see crewmates' job
As a Security Officer, mindshield implants can only prevent someone from being turned into a cultist: unlike revolutionaries, it will not de-cult them if they have already been converted.
As a Security Officer, examining someone while wearing your security HUDglasses can allow you to swiftly edit their records and criminal status. Be sure to set someone to WANTED if you can't catch up to them, as it'll alert other officers of who's the bad guy, and cause the little security droids to chase after them for you.
As a Security Officer, you can take out the power cell on your baton to replace it with a better or fully charged one. Just use a screwdriver on your baton to remove the old cell.
-As a Security Officer, you can just about any firearm on your vest, this even works with other non-standard armor-substitutes like security winter coats!
+As a Security Officer, you can place just about any firearm on your vest slot, and this even works with other non-standard armor-substitutes like security winter coats!
As the Detective, people leave fingerprints everywhere and on everything. With the exception of white latex, gloves will hide them. All is not lost, however, as gloves leave fibers specific to their kind such as black or nitrile, pointing to a general department.
-As the Detective, you can use your forensics scanner from a distance. Use this to scan boxes or other storage containers.
+As the Detective, you can use your forensics scanner from a distance. Use this to scan boxes or other storage containers which might vacuum up your scanner on interaction.
As the Detective, your revolver can be loaded with .357 ammunition. Use a screwdriver to permanently modify your revolver into using this type of ammunition, be warned however, firing it has a decent chance to cause the revolver to misfire and shoot you in the foot.
As the Lawyer, try to negotiate with the Warden if sentences seem too high for the crime.
As the Lawyer, you can try to convince the Captain and Head of Security to hold trials for prisoners in the courtroom.
As the Head of Personnel, you are not higher ranking than other heads of staff, even though you are expected to take the Captain's place first should he go missing. If the situation seems too rough for you, consider allowing another head to become temporary Captain.
-As the Head of Personnel, you are just as large a target as the Captain because of the potential power your ID and computer can hand out and your comparative vulnerability.
+As the Head of Personnel, you are just as large a target as the Captain because of the potential power your ID and computer can hand out with your comparative vulnerability.
As the Mime, your invisible wall power blocks people as well as projectiles. You can use it in a pinch to delay your pursuer.
As the Mime, you can use :r and :l to speak through your ventriloquist dummy. Sadly, this only works if your vow is broken, but at least you don't have to sacrifice your dignity by actually talking.
As the Mime, your oath of silence is your source of power. Breaking it robs you of your powers and of your honor.
-As the Mime, breaking your vow of silence is seen as incredibly dishonorable. Most people will seek to trouble and generally ignore a talking Mime.
+As the Mime, breaking your vow of silence is seen as incredibly dishonorable. Most people will generally seek to trouble or even harm a talking Mime.
+As the Mime, your PDA can infect others' with a virus that mutes their ringtone. Finally, peace and quiet.
As the Clown, if you lose your banana peel, you can still slip people with your PDA! Honk!
As the Clown, eating bananas heals you slightly. Honk!
As the Clown, your Holy Grail is the mineral bananium, which can be given to the Roboticist to build you a fun and robust mech beloved by everyone.
As the Clown, you can use your stamp on a sheet of flattened cardboard as the first step of making a honkbot. Fun for the whole crew!
-As the Clown, your number one way to win over the crew's favor is by telling jokes and putting forth effort into being comedic. Everyone loves a good clown, but everyone despises a bad one.
+As the Clown, your number one way to win over the crew's favor is by putting forth proper effort to be comedic. Everyone loves a good clown, but on a similar note everyone despises a bad one.
+As the Clown, your PDA can infect others' with a virus that makes their ringtone a bike horn. You can get more charges by slipping people with your PDA! Honk!
As the Chaplain, your null rod has a lot of functions: while being an incredibly powerful weapon with an array of potential utilities depending upon the skin you chose for it, it also nulls cultist and wizard magic entirely, making you immune to them both and in some cases even harming the caster so long as you keep it in a pocket or in your hands.
As the Chaplain, you can bless any water container by hitting it with your bible to turn it into holy water. Holy water has a myriad of uses against both cults and large amounts of it are a great contributor to success against them.
As the Chaplain, your null rod will kill clockwork marauders in two hits while actively hindering their overall combat capabilities just by being nearby to them.
As the Chaplain, your bible is also a container that can store a singular small item. Depending on your God, your starting bible may come with a surprise!
-As the Chaplain, you are much more likely to get a response by praying to the Gods than most people as your prayers will send a special noise cue directly to them! To further your chances of getting a response even further, pretty up your altar with crayon runes and wire art, and be sure to put a decent amount of effort into your prayers themselves. The Gods don't like lazy bums.
+As the Chaplain, you are much more likely to get a response by praying to the Gods than most people as your prayers will send a special noise cue directly to them! To further your chances of getting a response even further, pretty up your altar with crayon runes and wire art, and be sure to put a decent amount of effort into your prayers themselves! The Gods always love a good ritual display.
As a Botanist, you can hack the MegaSeed Vendor to get access to more exotic seeds. These seeds can alternatively be ordered from cargo.
As a Botanist, you can mutate the plants growing in your hydroponics trays with unstable mutagen or, as an alternative, crude radioactives from chemistry to get special variations.
As a Botanist, you should look into increasing the potency of your plants. This is shown by the size of the plant's sprite, and can increase the amount of chemicals, points gained from grinding them in the biogenerator, and lets people know you are a proficient botanist.
As a Botanist, you can combine production trait chemicals and mix your own complex chemicals inside of the plants themselves using precursors. Chlorine (blumpkin) + radium and phosphorus (glowshrooms) equals unstable mutagen!
As a Botanist, earthsblood is an incredibly powerful chemical found in Ambrosia Gaia, it heals all types of damages very rapidly but causes lingering brain damage and has a nasty overdose. You can combine the chemicals from watermelons (water), grass (hydrogen), and cherries (sugar) to mix mannitol in with your earthsblood to completely counteract its main drawback!
-As a Botanist, Ambrosia Gaia is a plant mutated from Ambrosia Deus, which is a plant mutated from Ambrosia Vulgaris. The reagent contained within this plant known as earthsblood makes for a vastly superior fertilizer than most, giving decent stat boosts to most stats, and automatically killing weeds and pests!
+As a Botanist, Ambrosia Gaia is a plant mutated from Ambrosia Deus, which in turn is mutated from Ambrosia Vulgaris. The reagent contained within this plant known as earthsblood makes for a vastly superior fertilizer than most, giving decent stat boosts to most stats, and automatically killing weeds and pests!
As a Cook, you can load your food into snack vending machines.
As a Cook, you can rename your custom made food with a pen.
-As a Cook, any food you make will be much healthier than the junk food found in vendors. Having the crew routinely eating from you will provide minor buffs.
+As a Cook, most any food you make will be much healthier than the junk food found in vendors. Having the crew routinely eating from you will provide minor buffs.
As a Cook, being in the kitchen will make you remember the basics of Close Quarters Cooking (CQC). It is highly effective at removing Assistants from your workplace.
-As a Cook, your Kitchenmate can vend out trays that fit on your belt slot. These trays pick up 7 food items at a time and are a quick way to transport large meals.
+As a Cook, your KitchenMate can vend out trays that fit on your belt slot. These trays pick up 7 food items at a time and are a quick way to transport large meals.
As a Cook, the advanced roasting stick is used to cook food at a distance, and can be used on SME, singularity, and other objects that cook food normally.
As a Cook, the deep frier is a tool which can turn very large quantities of seemingly useless objects into food, albeit nutritionally poor and awful tasting food, but hey, food is food.
-As the Bartender, the drinks you start with only give you the basics. If you want more advanced mixtures, look into working with chemistry, hydroponics, or even mining for things to grind up and throw in!
+As the Bartender, the drinks you start with only give you the basics. If you want more advanced mixtures, look into working with chemistry, hydroponics, and even mining for things to grind up and throw in!
As the Bartender, you can use a circular saw on your shotgun to make it easier to store. Make sure to empty them prior lest you blast yourself in the face!
-As a Janitor, if someone steals your janicart, you can instead use your spray bottles, soap, and arsenal of slippery objects to exact your bloody revenge.. ..or just order another one from Cargo.
+As a Janitor, if someone steals your janicart, you can instead use your spray bottles, soap, and arsenal of slippery objects to exact your bloody revenge... or just order another one from Cargo.
As a Janitor, the trash bag can be used to hold more than trash. Tools, medical equipment, smuggled nuclear disks... You name it!
As a Janitor, mousetraps can be used as bomb triggers to booby-trap containers.
-As the Curator, for what it's worth, your toys and position are fairly robust. You can order a claymore, a whip, or a free space suit all at roundstart. The claymore is fairly underwhelming, however the whip is an incredibly robust weapon capable of always disarming, and that space suit is also better than the ones in EVA.
+As a Janitor, you can use the cartridge preinstalled into your PDA to get coordinates of various janitorial equipments around the station, such as mops or your janicart.
+As the Curator, for what it's worth, your toys and position are fairly robust. You can order a claymore, a whip, or a free space suit all at roundstart. The claymore is has decent force, while the whip is an incredibly robust weapon capable of disarming, and the space suit is better than the ones in EVA.
As the Curator, be sure to keep the shelves stocked and the library clean for crew.
As a Cargo Technician, you can hack MULEbots to make them faster, run over people in their way, and even let you ride them!
As a Cargo Technician, you can order contraband items from the supply shuttle console by de-constructing it and using a multitool on the circuit board, the re-assembling it.
@@ -187,30 +195,32 @@ As the Quartermaster, be sure to check the manifests on crates you receive to ma
As the Quartermaster, you can construct an express supply console that instantly delivers crates by drop pod. The impact will cause a small explosion as well.
As a Shaft Miner, the northern side of Lavaland has a lot more rare minerals than on the south.
As a Shaft Miner, every monster on Lavaland has a pattern you can exploit to minimize damage from the encounters.
-As a Shaft Miner, you can harvest goliath plates from goliaths and upgrade your explorer's suit, mining hardsuits as well as Firefighter APLUs with them, greatly reducing incoming melee damage.
+As a Shaft Miner, you can harvest goliath plates from goliaths and upgrade your explorer suit, mining hardsuits as well as Firefighter APLUs with them, greatly reducing incoming melee damage.
As a Shaft Miner, always have a GPS on you, so a fellow miner or cyborg can come to save you if you die.
As a Shaft Miner, you can craft a variety of equipment from the local fauna. Bone axes, lava boats and ash drake armour are just a few of them!
-As a Traitor, the cryptographic sequencer (emag) can not only open lockers, crates, APCs and more. It can also do things like hack cyborgs, and even cause bots to go berserk. Use it on the right machines, and you can even contact the Syndicate. Experiment!
+As a Traitor, the cryptographic sequencer (emag) can not only open lockers, crates, APCs and more. It can also do things like hack cyborgs and cause bots to go berserk. Use it on the right machines, and you can even contact the Syndicate. Experiment!
As a Traitor, subverting the AI to serve you can make it an extremely powerful ally. However, be careful of the wording in the laws you give it, as it may use your poorly written laws against you!
As a Traitor, the Captain and the Head of Security are two of the most difficult to kill targets on the station. If either one is your target, plan carefully.
As a Traitor, you can manufacture and recycle revolver bullets at a hacked autolathe, making the revolver an extremely powerful tool if you manage to nab an autolathe for yourself.
As a Traitor, you may sometimes be assigned to hunt other traitors, and in turn be hunted by others.
As a Traitor, the syndicate encryption key is very useful for coordinating plans with your fellow traitors -- or, of course, betraying them.
As a Traitor, plasma can be injected into many things to sabotage them. Power cells, light bulbs, cigars and e-cigs will all explode when used.
+as a Traitor, swiping another traitor's uplink against your own while it is unlocked will drain the funds from theirs, regardless of its lock status.
As a Nuclear Operative, communication is key! Use :t or :h to speak to your fellow operatives and coordinate an attack plan.
-As a Nuclear Operative, you should look into purchasing one of the three Syndicate cyborgs in your uplink, as they can provide useful tactical support, function as walking access machines, are immune to conventional stuns, and can easily take down the AI.
+As a Nuclear Operative, you should look into purchasing one of the three Syndicate cyborgs in your uplink, as they can provide useful tactical support by opening airlocks without trouble, easily sabotaging electrical systems, and killing the AI with comical ease.
As a Nuclear Operative, stick together! While your equipment is robust, your fellow operatives are much better at saving your life: they can drag you away from danger while stunned and provide cover fire.
As a Nuclear Operative, you might end up in a situation where the AI has bolted you into a room. Having some spare C4 in your pocket can save your life.
As a Monkey, you can crawl through air or scrubber vents by alt+left clicking them. You must drop everything you are wearing and holding to do this, however.
As a Monkey, you can still wear a few human items, such as backpacks, gas masks and hats, and still have two free hands.
As the Malfunctioning AI, you can shunt to an APC if the situation gets bad. This disables your doomsday device if it is active.
As the Malfunctioning AI, you should either order your cyborgs to dismantle the robotics console or blow it up yourself in order to protect them. Do note that this will prevent you from hacking any cyborg made in the future.
-As the Malfunctioning AI, look into flooding the station with plasma fires to kill off large portions of the crew, letting you pick off the remaining few with space suits who escaped.
-Xenomorphs? Any source of burn damage severely harms them. Science can craft deadly tech shells like pulse slugs and laser scatter shot that are highly effective against any alien threat.
+As the Malfunctioning AI, look into flooding the station with plasma to kill off large portions of the crew, letting you pick off the remaining few with space suits who escaped.
+As the Malfunctioning AI, keep in mind that hacked cyborgs will explode violently enough to create breaches and gib bystandars when detonated as opposed to the comparatively gentle boom of the uncomprimised.
+When fighting Aliens, any source of burn damage severely harms them. Science can craft deadly tech shells that are highly effective against any alien threat.
When fighting Aliens, it can be a good idea to turn off the gravity due to the every caste of alien's lack of zero-gravity control, especially Hunters and Drones, which are completely and utterly helpless.
-When fighting Aliens, consider a shield. A raised shield can halt their attempts to slash at you, and their disarms will always remove an item in your hand before knocking you over, always having something in your hand, no matter how small or worthless, can save your life.
+When fighting Aliens, consider investing in a shield. A raised shield can halt their attempts to slash at you, and their disarms will always attempt to remove an item in your hand before knocking you over, meaing having something in your hand - no matter how small or worthless - can save your life.
As an Alien, your melee prowess is unmatched, but your ranged abilities are sorely lacking. Make use of corners to force a melee confrontation!
-As an Alien, you take double damage from all burn attacks, such as lasers, welding tools, and fires. Furthermore, fire can destroy your resin and eggs. Expose areas to space to starve away any flamethrower fires before they can do damage!
+As an Alien, you take double damage from all burn attacks, such as lasers, welding tools, and fires. Furthermore, fire can destroy your resin and eggs. Expose areas to space to starve away any flames before they can do damage!
As an Alien, resin floors not only regenerate your plasma supply, but also passively heal you. Fight on resin floors to gain a home turf advantage!
As an Alien, the facehugger is by far your most powerful weapon because of its ability to instantly win a fight. Remember however that certain helmets, such as biohoods or space helmets will completely block facehugger attacks.
As an Alien, you are unable to pick up or use any human items or machinery. Instead, you should focus on sabotaging APCs, computers, cameras and either stowing, spacing, or melting any weapons you find.
@@ -234,9 +244,9 @@ As a Revolutionary, cargo can be your best friend or your worst nightmare. In th
As a Revolutionary, your main power comes from how quickly you spread. Convert people as fast as you can and overwhelm the heads of staff before security can arm up.
As a Changeling, the Extract DNA sting counts for your genome absorb objective, but does not let you respec your powers.
As a Changeling, you can absorb someone by strangling them and using the Absorb verb; this gives you the ability to rechoose your powers, the DNA of whoever you absorbed, the memory of the absorbed, and some samples of things the absorbed said.
-As a Changeling, absorbing someone will give you their full memory. This can include things such as a Traitor's uplink, thus absorbing one will allow you to access the Traitor uplink and buy toys for your Changeling self to abuse.
-As a Changeling, absorbing another Changeling will permanently boost your chemical reserve, allow you to pick more abilities, and make the victim unable to revive. Be careful when exposing your identity to other Changelings, as they may be out of those wonderful benefits.
-As a Changeling, BZ gas will dramatically slow down or even halt your natural chemical regeneration, be sure to avoid it at all costs as some lunatics may try and flood portions of the station to deal with you.
+As a Changeling, absorbing someone will give you their full memory. This can include things such as a Traitor's uplink.
+As a Changeling, absorbing another Changeling will permanently boost your chemical reserve, allow you to pick more abilities, and make the victim unable to revive. Be careful when exposing your identity to other Changelings, as they may be out for those wonderful benefits.
+As a Changeling, BZ gas will dramatically slow down or even halt your natural chemical regeneration.
As a Changeling, death is not the end for you! You can revive after 40 seconds from being dead by triggering your stasis ability, and then waiting for the prompt to resurrect yourself to show up.
As a Changeling, your Regenerate Limbs power will quickly heal all of your wounds, but they'll still leave scars. Changelings can use Fleshmend to get rid of scars, or you can ingest Carpotoxin to get rid of them like a normal person.
As a Cultist, do not cause too much chaos before your objective is completed. If the shuttle gets called too soon, you may not have enough time to win.
@@ -293,21 +303,20 @@ You can light a cigar on a supermatter crystal.
Using sticky tape on items can make them stick to people and walls! Be careful, grenades might stick to your hand during the moment of truth!
In a pinch, stripping yourself naked will give you a sizeable resistance to being tackled. What do you value more, your freedom or your dignity?
Wearing riot armor makes you significantly more effective at performing tackle takedowns, but will use extra stamina with each leap! It will also significantly protect you from other tackles!
-Epipens contain a powerful coagulant that drastically reduces bleeding on all bleeding wounds. If you don't have time to properly treat someone with lots of slashes or piercings, stick them with a pen to buy some time!
+Emergency epinephrine pens contain a powerful coagulant that drastically reduces bleeding on all bleeding wounds. If you don't have time to properly treat someone with lots of slashes or piercings, stick them with a pen to buy some time!
Anything you can light a cigarette with, you can use to cauterize a bleeding wound. Technically, that includes the supermatter.
-Suit storage units, when hacked, entirely purge radiation from any carbon mob put inside of them when cycling, at the cost of some horrific burns, this is a very effective strategy to clean someone up after they bathed in the engine.
-Laser pointers can be upgraded by replacing its micro laser with a better one from RnD! Use a screwdriver on it to remove the old laser. Upgrading the laser pointer gives you better odds of stunning a cyborg, and even blinding people with sunglasses.
-Being out of combat mode makes makes you deal less damage to people and objects when attacking. This stacks with the penalty incurred by resting.
-Resting makes you deal less damage to people and objects when attacking. This stacks with the penalty incurred by being out of combat mode.
-You do not regenerate as much stamina while in combat mode. Resting (being on the ground) makes you regenerate stamina faster.
+Suit storage units, when hacked, entirely purge radiation from any carbon mob put inside of them when cycling, at the cost of some horrific burns, this is a very effective strategy to clean someone of radiation after an engine bath.
+Laser pointers can be upgraded by replacing its micro-laser with a higher-tiered one from Research! Use a screwdriver on it to remove the old laser. Upgrading the laser pointer gives you better odds of stunning a cyborg, and even lets you blind people wear sunglasses.
+Resting makes you deal less damage to people and objects when attacking.
+Resting makes you regenerate stamina faster.
Keybinds can be reassigned in character setup on the keybindings tab. This is extremely useful, especially if you know how to use independent binds.
-If your suit sensors have been shorted out, you can use cable coil to fix them by using the coil on your suit. Your suit needs to be in proper condition, however.
-Most clothing when damaged can be repaired using cloth, but there may be some clothes out there that will require different stacks of materials.
+If your suit sensors have been shorted out, you can fix them by using the coil on your suit.
+Most clothing damage can be repaired using cloth, but there may be some clothes out there that will require different stacks of materials.
You should under no circumstances, teleport bread.
Food made from upgraded machines has a higher quality. Food with a high enough quality can give good moodlets even if your species dislikes the kind of food!
Frying something makes it edible, while still maintaining its original functionality.
Slimepeople are damaged by most things that heal toxin damage, and healed by most things that deal it. You can recognise people with this functionality through them having a cyan coloured species name when examined!
EMPs can be created by mixing uranium and iron. The power of the pulse is determined by the distance from its epicentre, and the maximum distance is determined by the volume of the reaction!
-Lizards start with a disabled mutation that allows them to breath fire. This can be unlocked through the usage of genetics!
-Several loadout items can be unlocked through progress in parts of the game. The progress for these can be tracked in the loadout menu.
-
+Some lizardpeople start with an unactivated mutation that allows them to breath fire. This can be unlocked through the usage of genetics!
+Some loadout items can be unlocked through progress in parts of the game. The progress for these can be tracked in the loadout menu.
+It's easy to forget that everyone else you're playing with is a real person trying to have as much fun as you are. Be nice to your fellow spacemen.
diff --git a/strings/traumas.json b/strings/traumas.json
index e5048d41b2..195a28364b 100644
--- a/strings/traumas.json
+++ b/strings/traumas.json
@@ -70,7 +70,7 @@
"NO PRED CAN eVER CATCH MI",
"SCIENCE GIB SHINK RAY PLS",
"KILL PUNPUN 4 FUN xDD",
- "i play @pick(roles) to only ORDER not DO",
+ "i play @pick(importantroles) to only ORDER not DO",
"CRAGO ORDER @pick(cargo) PLS",
"erp?",
"i want to digest u!!!",
@@ -98,6 +98,7 @@
"nerf blob!1",
"iM NOT A FUWRRYY!!!",
"FOURTEEN INCHES SOFT!!!",
+ "SPLUUUUUUUUUUUUUUUUUUUUUUURTS!!!!!!!!!!",
"@pick(semicolon)N-NYAAAAAA~",
"@pick(bug)",
"@pick(semicolon)wtf??????????? @pick(bug)",
@@ -133,7 +134,10 @@
"@pick(semicolon)Assaltign a sec osficer aren't crime if ur @pick(roles)",
";SEC I SPILED MU JICE HELELPH HELPJ JLEP HELP",
"@pick(semicolon) atmos is chemistyr is radation fast air is FASTER cheemsitry and FASTER RADIATION AND FASTER DEATH!!!",
- "@pick(semicolon) FUC'KING MuNKEY WAch TALKN SHIT"
+ "@pick(semicolon) FUC'KING MuNKEY WAch TALKN SHIT",
+ "@pick(semicolon)How do I set up the. SHow do I set u p the Singu. how I the scrungulartiy????",
+ "@pick(semicolon)@pick(roles) is suSpicious!!!",
+ "@pick(semicolon)NOOO!!!OOOOOOO!! @pick(roles) HALP!!"
],
"mutations": [
@@ -184,7 +188,11 @@
"haylo",
"EEGEE",
"mr terry",
- "berry"
+ "berry",
+ "are pee",
+ "mayne",
+ "air ret",
+ "dise"
],
"create_verbs": [
@@ -199,7 +207,8 @@
"treaitors",
"sheadow lings",
"abdoocters",
- "revinent"
+ "revinent",
+ "ninja"
],
"bug": [
@@ -266,20 +275,63 @@
"YOUR LIFE IS IMPORTANT. KEEP IT."
],
- "roles": [
+ "importantroles": [
"heds",
"ceptin",
"hop",
- "arrdee",
+ "hos",
+ "see emo",
+ "cee ee",
+ "arr dee",
+ "q m",
"sek"
],
+ "roles": [
+ "ceptin",
+ "hop",
+ "hos",
+ "see emo",
+ "cee ee",
+ "arr dee",
+ "q m",
+ "assistent",
+ "cargo",
+ "mine r",
+ "bart ender",
+ "chef",
+ "botonist",
+ "janny",
+ "clon",
+ "mime",
+ "librarian",
+ "chap",
+ "ai",
+ "borg",
+ "egnineer",
+ "atmos",
+ "docter",
+ "paradocter",
+ "cheemsist",
+ "viroligist",
+ "genetocist",
+ "science",
+ "robotocist",
+ "wardon",
+ "det",
+ "shitcurity",
+ "prihsoner"
+ ],
+
"cargo": [
"GUNS",
"HATS",
"PIZEH",
"MEMES",
- "GLOWY CYSTAL"
+ "GLOWY CYSTAL",
+ "SINGLO",
+ "TESLO",
+ "NULLZ"
],
"s_roles": [
@@ -289,6 +341,7 @@
"admen",
"mantor",
"bluh daymon",
- "wizzerd"
+ "wizzerd",
+ "nookies"
]
}
diff --git a/tgstation.dme b/tgstation.dme
index f3fb62af87..942c1d6e45 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -103,6 +103,7 @@
#include "code\__DEFINES\rockpaperscissors.dm"
#include "code\__DEFINES\role_preferences.dm"
#include "code\__DEFINES\rust_g.dm"
+#include "code\__DEFINES\rust_g_overrides.dm"
#include "code\__DEFINES\say.dm"
#include "code\__DEFINES\security_levels.dm"
#include "code\__DEFINES\shuttles.dm"
@@ -179,6 +180,7 @@
#include "code\__HELPERS\icons.dm"
#include "code\__HELPERS\level_traits.dm"
#include "code\__HELPERS\lighting.dm"
+#include "code\__HELPERS\markov.dm"
#include "code\__HELPERS\matrices.dm"
#include "code\__HELPERS\mobs.dm"
#include "code\__HELPERS\mouse_control.dm"
@@ -461,6 +463,12 @@
#include "code\datums\achievements\misc_scores.dm"
#include "code\datums\achievements\skill_achievements.dm"
#include "code\datums\actions\beam_rifle.dm"
+<<<<<<< HEAD
+=======
+#include "code\datums\actions\ninja.dm"
+#include "code\datums\atmosphere\_atmosphere.dm"
+#include "code\datums\atmosphere\planetary.dm"
+>>>>>>> 5aea7175ea7d3e53dee51c9a5fd7cfc6e59907b8
#include "code\datums\brain_damage\brain_trauma.dm"
#include "code\datums\brain_damage\hypnosis.dm"
#include "code\datums\brain_damage\imaginary_friend.dm"
@@ -661,6 +669,7 @@
#include "code\datums\helper_datums\events.dm"
#include "code\datums\helper_datums\getrev.dm"
#include "code\datums\helper_datums\icon_snapshot.dm"
+#include "code\datums\helper_datums\stack_end_detector.dm"
#include "code\datums\helper_datums\teleport.dm"
#include "code\datums\looping_sounds\_looping_sound.dm"
#include "code\datums\looping_sounds\item_sounds.dm"
@@ -875,6 +884,7 @@
#include "code\game\machinery\mass_driver.dm"
#include "code\game\machinery\navbeacon.dm"
#include "code\game\machinery\PDApainter.dm"
+#include "code\game\machinery\prisonlabor.dm"
#include "code\game\machinery\quantum_pad.dm"
#include "code\game\machinery\recharger.dm"
#include "code\game\machinery\rechargestation.dm"
@@ -1097,6 +1107,7 @@
#include "code\game\objects\items\dna_injector.dm"
#include "code\game\objects\items\documents.dm"
#include "code\game\objects\items\dualsaber.dm"
+#include "code\game\objects\items\dyekit.dm"
#include "code\game\objects\items\eightball.dm"
#include "code\game\objects\items\electrostaff.dm"
#include "code\game\objects\items\extinguisher.dm"
@@ -1236,6 +1247,7 @@
#include "code\game\objects\items\robot\robot_upgrades.dm"
#include "code\game\objects\items\stacks\bscrystal.dm"
#include "code\game\objects\items\stacks\cash.dm"
+#include "code\game\objects\items\stacks\license_plates.dm"
#include "code\game\objects\items\stacks\medical.dm"
#include "code\game\objects\items\stacks\rods.dm"
#include "code\game\objects\items\stacks\stack.dm"
@@ -1388,6 +1400,7 @@
#include "code\game\turfs\closed.dm"
#include "code\game\turfs\open.dm"
#include "code\game\turfs\turf.dm"
+#include "code\game\turfs\open\floor\catwalk_plating.dm"
#include "code\game\turfs\simulated\chasm.dm"
#include "code\game\turfs\simulated\dirtystation.dm"
#include "code\game\turfs\simulated\floor.dm"
@@ -2369,6 +2382,7 @@
#include "code\modules\jobs\job_types\medical_doctor.dm"
#include "code\modules\jobs\job_types\mime.dm"
#include "code\modules\jobs\job_types\paramedic.dm"
+#include "code\modules\jobs\job_types\prisoner.dm"
#include "code\modules\jobs\job_types\quartermaster.dm"
#include "code\modules\jobs\job_types\research_director.dm"
#include "code\modules\jobs\job_types\roboticist.dm"
@@ -2788,6 +2802,9 @@
#include "code\modules\mob\living\simple_animal\friendly\drone\say.dm"
#include "code\modules\mob\living\simple_animal\friendly\drone\verbs.dm"
#include "code\modules\mob\living\simple_animal\friendly\drone\visuals_icons.dm"
+#include "code\modules\mob\living\simple_animal\gremlin\gremlin.dm"
+#include "code\modules\mob\living\simple_animal\gremlin\gremlin_act.dm"
+#include "code\modules\mob\living\simple_animal\gremlin\gremlin_event.dm"
#include "code\modules\mob\living\simple_animal\guardian\guardian.dm"
#include "code\modules\mob\living\simple_animal\guardian\types\assassin.dm"
#include "code\modules\mob\living\simple_animal\guardian\types\charger.dm"
@@ -2824,6 +2841,7 @@
#include "code\modules\mob\living\simple_animal\hostile\nanotrasen.dm"
#include "code\modules\mob\living\simple_animal\hostile\netherworld.dm"
#include "code\modules\mob\living\simple_animal\hostile\pirate.dm"
+#include "code\modules\mob\living\simple_animal\hostile\plaguerat.dm"
#include "code\modules\mob\living\simple_animal\hostile\regalrat.dm"
#include "code\modules\mob\living\simple_animal\hostile\russian.dm"
#include "code\modules\mob\living\simple_animal\hostile\sharks.dm"
diff --git a/tgui/packages/tgui/index.js b/tgui/packages/tgui/index.js
index e3e4df7036..f5d40a2b04 100644
--- a/tgui/packages/tgui/index.js
+++ b/tgui/packages/tgui/index.js
@@ -16,6 +16,7 @@ import './styles/themes/paper.scss';
import './styles/themes/retro.scss';
import './styles/themes/syndicate.scss';
import './styles/themes/wizard.scss';
+import './styles/themes/clockcult.scss';
import { perf } from 'common/perf';
import { setupHotReloading } from 'tgui-dev-server/link/client';
diff --git a/tools/build/README.md b/tools/build/README.md
index f367857158..51121dbde6 100644
--- a/tools/build/README.md
+++ b/tools/build/README.md
@@ -13,6 +13,14 @@ This build script is the recommended way to compile the game, including not only
The script will skip build steps whose inputs have not changed since the last run.
+## Getting list of available targets
+
+You can get a list of all targets that you can build by running the following command:
+
+```
+tools/build/build --help
+```
+
## Dependencies
- On Windows, `BUILD.bat` will automatically install a private (vendored) copy of Node.
@@ -22,3 +30,5 @@ The script will skip build steps whose inputs have not changed since the last ru
## Why?
We used to include compiled versions of the tgui JavaScript code in the Git repository so that the project could be compiled using BYOND only. These pre-compiled files tended to have merge conflicts for no good reason. Using a build script lets us avoid this problem, while keeping builds convenient for people who are not modifying tgui.
+
+This build script is based on [Juke Build](https://github.com/stylemistake/juke-build) - please follow the link and read the documentation for the project to understand how it works and how to contribute to this build script.
diff --git a/tools/build/binaries/README.md b/tools/build/binaries/README.md
deleted file mode 100644
index 625f337d98..0000000000
--- a/tools/build/binaries/README.md
+++ /dev/null
@@ -1 +0,0 @@
-This directory is used to store temporary files to create binaries on linux
\ No newline at end of file
diff --git a/tools/build/build b/tools/build/build
index cd4d804e8f..0e202e1bba 100755
--- a/tools/build/build
+++ b/tools/build/build
@@ -1,6 +1,4 @@
#!/bin/sh
-
-#Build TGUI
set -e
cd "$(dirname "$0")"
exec ../bootstrap/node build.js "$@"
diff --git a/tools/build/build.bat b/tools/build/build.bat
index f5d9bd48f3..56e3bf1171 100644
--- a/tools/build/build.bat
+++ b/tools/build/build.bat
@@ -1 +1,2 @@
-@"%~dp0\..\bootstrap\node" "%~dp0\build.js"
+@echo off
+"%~dp0\..\bootstrap\node.bat" --experimental-modules "%~dp0\build.js" %*
diff --git a/tools/build/build.js b/tools/build/build.js
index 0f04441334..f8d3a9a7dd 100755
--- a/tools/build/build.js
+++ b/tools/build/build.js
@@ -1,225 +1,293 @@
#!/usr/bin/env node
/**
+ * Build script for /tg/station 13 codebase.
+ *
+ * This script uses Juke Build, read the docs here:
+ * https://github.com/stylemistake/juke-build
+ *
* @file
- * @copyright 2020 Aleksej Komarov
+ * @copyright 2021 Aleksej Komarov
* @license MIT
*/
-// Change working directory to project root
-process.chdir(require('path').resolve(__dirname, '../../'));
+import fs from 'fs';
+import { DreamDaemon, DreamMaker } from './lib/byond.js';
+import { yarn } from './lib/yarn.js';
+import Juke from './juke/index.js';
-// Validate NodeJS version
-const NODE_VERSION = parseInt(process.versions.node.match(/(\d+)/)[1]);
-const NODE_VERSION_TARGET = parseInt(require('fs')
- .readFileSync('dependencies.sh', 'utf-8')
- .match(/NODE_VERSION=(\d+)/)[1]);
-if (NODE_VERSION < NODE_VERSION_TARGET) {
- console.error('Your current Node.js version is out of date.');
- console.error('You have two options:');
- console.error(' a) Go to https://nodejs.org/ and install the latest LTS release of Node.js');
- console.error(' b) Uninstall Node.js (our build system automatically downloads one)');
- process.exit(1);
-}
+Juke.chdir('../..', import.meta.url);
+Juke.setup({ file: import.meta.url }).then((code) => process.exit(code));
-const STANDARD_BUILD = "Standard Build"
-const TGS_BUILD = "TGS Build"
-const ALL_MAPS_BUILD = "CI All Maps Build"
-const TEST_RUN_BUILD = "CI Integration Tests Build"
-const NO_DM_BUILD = "Except DM Build"
+const DME_NAME = 'tgstation';
-let BUILD_MODE = STANDARD_BUILD;
-if (process.env.CBT_BUILD_MODE) {
- switch (process.env.CBT_BUILD_MODE) {
- case "ALL_MAPS":
- BUILD_MODE = ALL_MAPS_BUILD
- break;
- case "TEST_RUN":
- BUILD_MODE = TEST_RUN_BUILD
- break;
- case "TGS":
- BUILD_MODE = TGS_BUILD
- break;
- case "NO_DM":
- BUILD_MODE = NO_DM_BUILD
- break;
- default:
- BUILD_MODE = process.env.CBT_BUILD_MODE
- break;
- }
-}
-console.log(`Starting CBT in ${BUILD_MODE} mode.`)
+export const DefineParameter = new Juke.Parameter({
+ type: 'string[]',
+ alias: 'D',
+});
-const DME_NAME = 'tgstation'
+export const PortParameter = new Juke.Parameter({
+ type: 'string',
+ alias: 'p',
+});
-// Main
-// --------------------------------------------------------
+export const CiParameter = new Juke.Parameter({
+ type: 'boolean',
+});
-const { resolveGlob, stat } = require('./cbt/fs');
-const { exec } = require('./cbt/process');
-const { Task, runTasks } = require('./cbt/task');
-const { regQuery } = require('./cbt/winreg');
-const fs = require('fs');
+export const DmMapsIncludeTarget = new Juke.Target({
+ executes: async () => {
+ const folders = [
+ ...Juke.glob('_maps/RandomRuins/**/*.dmm'),
+ ...Juke.glob('_maps/RandomZLevels/**/*.dmm'),
+ ...Juke.glob('_maps/shuttles/**/*.dmm'),
+ ...Juke.glob('_maps/templates/**/*.dmm'),
+ ];
+ const content = folders
+ .map((file) => file.replace('_maps/', ''))
+ .map((file) => `#include "${file}"`)
+ .join('\n') + '\n';
+ fs.writeFileSync('_maps/templates.dm', content);
+ },
+});
-const yarn = args => {
- const yarnPath = resolveGlob('./tgui/.yarn/releases/yarn-*.cjs')[0]
- .replace('/tgui/', '/');
- return exec('node', [yarnPath, ...args], {
- cwd: './tgui',
- });
-};
+export const DmTarget = new Juke.Target({
+ dependsOn: ({ get }) => [
+ get(DefineParameter).includes('ALL_MAPS') && DmMapsIncludeTarget,
+ ],
+ inputs: [
+ '_maps/map_files/generic/**',
+ 'code/**',
+ 'goon/**',
+ 'html/**',
+ 'icons/**',
+ 'interface/**',
+ `${DME_NAME}.dme`,
+ ],
+ outputs: [
+ `${DME_NAME}.dmb`,
+ `${DME_NAME}.rsc`,
+ ],
+ parameters: [DefineParameter],
+ executes: async ({ get }) => {
+ const defines = get(DefineParameter);
+ if (defines.length > 0) {
+ Juke.logger.info('Using defines:', defines.join(', '));
+ }
+ await DreamMaker(`${DME_NAME}.dme`, {
+ defines: ['CBT', ...defines],
+ });
+ },
+});
-/** Installs all tgui dependencies */
-const taskYarn = new Task('yarn')
- // The following dependencies skip what could be considered an important
- // step in Yarn: it verifies the integrity of cache. With this setup, if
- // cache ever becomes corrupted, your only option is to clean build.
- .depends('tgui/.yarn/+(cache|releases|plugins|sdks)/**/*')
- .depends('tgui/**/package.json')
- .depends('tgui/yarn.lock')
- // Phony target (automatically created at the end of the task)
- .provides('tgui/.yarn/install-target')
- .build(() => yarn(['install']));
+export const DmTestTarget = new Juke.Target({
+ dependsOn: ({ get }) => [
+ get(DefineParameter).includes('ALL_MAPS') && DmMapsIncludeTarget,
+ ],
+ executes: async ({ get }) => {
+ const defines = get(DefineParameter);
+ if (defines.length > 0) {
+ Juke.logger.info('Using defines:', defines.join(', '));
+ }
+ fs.copyFileSync(`${DME_NAME}.dme`, `${DME_NAME}.test.dme`);
+ await DreamMaker(`${DME_NAME}.test.dme`, {
+ defines: ['CBT', 'CIBUILDING', ...defines],
+ });
+ Juke.rm('data/logs/ci', { recursive: true });
+ await DreamDaemon(
+ `${DME_NAME}.test.dmb`,
+ '-close', '-trusted', '-verbose',
+ '-params', 'log-directory=ci'
+ );
+ Juke.rm('*.test.*');
+ try {
+ const cleanRun = fs.readFileSync('data/logs/ci/clean_run.lk', 'utf-8');
+ console.log(cleanRun);
+ }
+ catch (err) {
+ Juke.logger.error('Test run was not clean, exiting');
+ throw new Juke.ExitCode(1);
+ }
+ },
+});
-/** Builds svg fonts */
-const taskTgfont = new Task('tgfont')
- .depends('tgui/.yarn/install-target')
- .depends('tgui/packages/tgfont/**/*.+(js|cjs|svg)')
- .depends('tgui/packages/tgfont/package.json')
- .provides('tgui/packages/tgfont/dist/tgfont.css')
- .provides('tgui/packages/tgfont/dist/tgfont.eot')
- .provides('tgui/packages/tgfont/dist/tgfont.woff2')
- .build(() => yarn(['workspace', 'tgfont', 'build']));
+export const YarnTarget = new Juke.Target({
+ inputs: [
+ 'tgui/.yarn/+(cache|releases|plugins|sdks)/**/*',
+ 'tgui/**/package.json',
+ 'tgui/yarn.lock',
+ ],
+ outputs: [
+ 'tgui/.yarn/install-target',
+ ],
+ executes: async () => {
+ await yarn('install');
+ },
+});
-/** Builds tgui */
-const taskTgui = new Task('tgui')
- .depends('tgui/.yarn/install-target')
- .depends('tgui/webpack.config.js')
- .depends('tgui/**/package.json')
- .depends('tgui/packages/**/*.+(js|cjs|ts|tsx|scss)')
- .provides('tgui/public/tgui.bundle.css')
- .provides('tgui/public/tgui.bundle.js')
- .provides('tgui/public/tgui-common.bundle.js')
- .provides('tgui/public/tgui-panel.bundle.css')
- .provides('tgui/public/tgui-panel.bundle.js')
- .build(async () => {
- await yarn(['run', 'webpack-cli', '--mode=production']);
- });
+export const TgFontTarget = new Juke.Target({
+ dependsOn: [YarnTarget],
+ inputs: [
+ 'tgui/.yarn/install-target',
+ 'tgui/packages/tgfont/**/*.+(js|cjs|svg)',
+ 'tgui/packages/tgfont/package.json',
+ ],
+ outputs: [
+ 'tgui/packages/tgfont/dist/tgfont.css',
+ 'tgui/packages/tgfont/dist/tgfont.eot',
+ 'tgui/packages/tgfont/dist/tgfont.woff2',
+ ],
+ executes: async () => {
+ await yarn('workspace', 'tgfont', 'build');
+ },
+});
+
+export const TguiTarget = new Juke.Target({
+ dependsOn: [YarnTarget],
+ inputs: [
+ 'tgui/.yarn/install-target',
+ 'tgui/webpack.config.js',
+ 'tgui/**/package.json',
+ 'tgui/packages/**/*.+(js|cjs|ts|tsx|scss)',
+ ],
+ outputs: [
+ 'tgui/public/tgui.bundle.css',
+ 'tgui/public/tgui.bundle.js',
+ 'tgui/public/tgui-panel.bundle.css',
+ 'tgui/public/tgui-panel.bundle.js',
+ ],
+ executes: async () => {
+ await yarn('webpack-cli', '--mode=production');
+ },
+});
+
+export const TguiEslintTarget = new Juke.Target({
+ dependsOn: [YarnTarget],
+ executes: async ({ args }) => {
+ await yarn(
+ 'eslint', 'packages',
+ '--fix', '--ext', '.js,.cjs,.ts,.tsx',
+ ...args
+ );
+ },
+});
+
+export const TguiTscTarget = new Juke.Target({
+ dependsOn: [YarnTarget],
+ executes: async () => {
+ await yarn('tsc');
+ },
+});
+
+export const TguiTestTarget = new Juke.Target({
+ dependsOn: [YarnTarget],
+ executes: async ({ args }) => {
+ await yarn('jest', ...args);
+ },
+});
+
+export const TguiLintTarget = new Juke.Target({
+ dependsOn: [YarnTarget, TguiEslintTarget, TguiTscTarget, TguiTestTarget],
+});
+
+export const TguiDevTarget = new Juke.Target({
+ dependsOn: [YarnTarget],
+ executes: async ({ args }) => {
+ await yarn('node', 'packages/tgui-dev-server/index.js', ...args);
+ },
+});
+
+export const TguiAnalyzeTarget = new Juke.Target({
+ dependsOn: [YarnTarget],
+ executes: async () => {
+ await yarn('webpack-cli', '--mode=production', '--analyze');
+ },
+});
+
+export const TestTarget = new Juke.Target({
+ dependsOn: [DmTestTarget, TguiTestTarget],
+});
+
+export const LintTarget = new Juke.Target({
+ dependsOn: [TguiLintTarget],
+});
+
+export const BuildTarget = new Juke.Target({
+ dependsOn: [TguiTarget, TgFontTarget, DmTarget],
+});
+
+export const ServerTarget = new Juke.Target({
+ dependsOn: [BuildTarget],
+ executes: async ({ get }) => {
+ const port = get(PortParameter) || '1337';
+ await DreamDaemon(`${DME_NAME}.dmb`, port, '-trusted');
+ },
+});
+
+export const AllTarget = new Juke.Target({
+ dependsOn: [TestTarget, LintTarget, BuildTarget],
+});
+
+/**
+ * Removes the immediate build junk to produce clean builds.
+ */
+export const CleanTarget = new Juke.Target({
+ executes: async () => {
+ Juke.rm('*.dmb');
+ Juke.rm('*.rsc');
+ Juke.rm('*.mdme');
+ Juke.rm('*.mdme*');
+ Juke.rm('*.m.*');
+ Juke.rm('_maps/templates.dm');
+ Juke.rm('tgui/public/.tmp', { recursive: true });
+ Juke.rm('tgui/public/*.map');
+ Juke.rm('tgui/public/*.chunk.*');
+ Juke.rm('tgui/public/*.bundle.*');
+ Juke.rm('tgui/public/*.hot-update.*');
+ Juke.rm('tgui/packages/tgfont/dist', { recursive: true });
+ Juke.rm('tgui/.yarn/cache', { recursive: true });
+ Juke.rm('tgui/.yarn/unplugged', { recursive: true });
+ Juke.rm('tgui/.yarn/webpack', { recursive: true });
+ Juke.rm('tgui/.yarn/build-state.yml');
+ Juke.rm('tgui/.yarn/install-state.gz');
+ Juke.rm('tgui/.yarn/install-target');
+ Juke.rm('tgui/.pnp.*');
+ },
+});
+
+/**
+ * Removes more junk at expense of much slower initial builds.
+ */
+export const DistCleanTarget = new Juke.Target({
+ dependsOn: [CleanTarget],
+ executes: async () => {
+ Juke.logger.info('Cleaning up data/logs');
+ Juke.rm('data/logs', { recursive: true });
+ Juke.logger.info('Cleaning up bootstrap cache');
+ Juke.rm('tools/bootstrap/.cache', { recursive: true });
+ Juke.logger.info('Cleaning up global yarn cache');
+ await yarn('cache', 'clean', '--all');
+ },
+});
/**
* Prepends the defines to the .dme.
* Does not clean them up, as this is intended for TGS which
* clones new copies anyway.
*/
-const taskPrependDefines = (...defines) => new Task('prepend-defines')
- .build(async () => {
- const dmeContents = fs.readFileSync(`${DME_NAME}.dme`);
- const textToWrite = defines.map(define => `#define ${define}\n`);
- fs.writeFileSync(`${DME_NAME}.dme`, `${textToWrite}\n${dmeContents}`);
- });
+const prependDefines = (...defines) => {
+ const dmeContents = fs.readFileSync(`${DME_NAME}.dme`);
+ const textToWrite = defines.map(define => `#define ${define}\n`);
+ fs.writeFileSync(`${DME_NAME}.dme`, `${textToWrite}\n${dmeContents}`);
+};
-const taskDm = (...injectedDefines) => new Task('dm')
- .depends('_maps/map_files/generic/**')
- .depends('code/**')
- .depends('goon/**')
- .depends('html/**')
- .depends('icons/**')
- .depends('interface/**')
- .depends(process.platform === 'win32' ? 'auxmos.*' : 'libauxmos.*')
- .depends('tgui/public/tgui.html')
- .depends('tgui/public/*.bundle.*')
- .depends(`${DME_NAME}.dme`)
- .provides(`${DME_NAME}.dmb`)
- .provides(`${DME_NAME}.rsc`)
- .build(async () => {
- const dmPath = await (async () => {
- // Search in array of paths
- const paths = [
- ...((process.env.DM_EXE && process.env.DM_EXE.split(',')) || []),
- 'C:\\Program Files\\BYOND\\bin\\dm.exe',
- 'C:\\Program Files (x86)\\BYOND\\bin\\dm.exe',
- ['reg', 'HKLM\\Software\\Dantom\\BYOND', 'installpath'],
- ['reg', 'HKLM\\SOFTWARE\\WOW6432Node\\Dantom\\BYOND', 'installpath'],
- ];
- const isFile = path => {
- try {
- const fstat = stat(path);
- return fstat && fstat.isFile();
- }
- catch (err) {}
- return false;
- };
- for (let path of paths) {
- // Resolve a registry key
- if (Array.isArray(path)) {
- const [type, ...args] = path;
- path = await regQuery(...args);
- }
- if (!path) {
- continue;
- }
- // Check if path exists
- if (isFile(path)) {
- return path;
- }
- if (isFile(path + '/dm.exe')) {
- return path + '/dm.exe';
- }
- if (isFile(path + '/bin/dm.exe')) {
- return path + '/bin/dm.exe';
- }
- }
- // Default paths
- return (
- process.platform === 'win32' && 'dm.exe'
- || 'DreamMaker'
- );
- })();
- if (injectedDefines.length) {
- const injectedContent = injectedDefines
- .map(x => `#define ${x}\n`)
- .join('')
- // Create mdme file
- fs.writeFileSync(`${DME_NAME}.mdme`, injectedContent)
- // Add the actual dme content
- const dme_content = fs.readFileSync(`${DME_NAME}.dme`)
- fs.appendFileSync(`${DME_NAME}.mdme`, dme_content)
- await exec(dmPath, [`${DME_NAME}.mdme`]);
- // Rename dmb
- fs.renameSync(`${DME_NAME}.mdme.dmb`, `${DME_NAME}.dmb`)
- // Rename rsc
- fs.renameSync(`${DME_NAME}.mdme.rsc`, `${DME_NAME}.rsc`)
- // Remove mdme
- fs.unlinkSync(`${DME_NAME}.mdme`)
- }
- else {
- await exec(dmPath, [`${DME_NAME}.dme`]);
- }
- });
+export const TgsTarget = new Juke.Target({
+ dependsOn: [TguiTarget, TgFontTarget],
+ executes: async () => {
+ Juke.logger.info('Prepending TGS define');
+ prependDefines('TGS');
+ },
+});
-// Frontend
-let tasksToRun = [
- taskYarn,
- taskTgfont,
- taskTgui,
-];
-switch (BUILD_MODE) {
- case STANDARD_BUILD:
- tasksToRun.push(taskDm('CBT'));
- break;
- case TGS_BUILD:
- tasksToRun.push(taskPrependDefines('TGS'));
- break;
- case ALL_MAPS_BUILD:
- tasksToRun.push(taskDm('CBT','CIBUILDING','CITESTING','ALL_MAPS'));
- break;
- case TEST_RUN_BUILD:
- tasksToRun.push(taskDm('CBT','CIBUILDING'));
- break;
- case NO_DM_BUILD:
- break;
- default:
- console.error(`Unknown build mode : ${BUILD_MODE}`)
- break;
-}
+const TGS_MODE = process.env.CBT_BUILD_MODE === 'TGS';
-runTasks(tasksToRun);
+export default TGS_MODE ? TgsTarget : BuildTarget;
diff --git a/tools/build/build.sh b/tools/build/build.sh
deleted file mode 100755
index 62372eff2d..0000000000
--- a/tools/build/build.sh
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/bin/sh
-
-#Detect OS and use corresponding package manager for dependencies. Currently only works for arch, debian/ubuntu, and RHEL/fedora/CentOS
-if [[ -f '/etc/arch-release' ]]; then
- echo -ne '\n y' | sudo pacman --needed -Sy base-devel git curl nodejs unzip
-fi
-if [[ -f '/etc/debian version' ]]; then
- sudo dpkg --add-architecture i386
- sudo apt-get update
- sudo apt-get install -y build-essential git curl lib32z1 pkg-config libssl-dev:i386 libssl-dev nodejs unzip g++-multilib libc6-i386 libstdc++6:i386
-fi
-if [[ -f '/etc/centos-release' ]] || [[ -f '/etc/fedora-release' ]]; then #DNF should work for both of these
- sudo dnf --refresh install make automake gcc gcc-c++ kernel-devel git curl unzip glibc-devel.i686 openssl-devel.i686 libgcc.i686 libstdc++-devel.i686
-fi
-
-cd binaries
-
-#Install rust if not present
-if ! [ -x "$has_cargo" ]; then
- echo "Installing rust..."
- curl https://sh.rustup.rs -sSf | sh -s -- -y
- . ~/.profile
-fi
-
-#Download/update rust-g repo
-if [ ! -d "rust-g" ]; then
- echo "Cloning rust-g..."
- git clone https://github.com/tgstation/rust-g
- cd rust-g
- ~/.cargo/bin/rustup target add i686-unknown-linux-gnu
-else
- echo "Fetching rust-g..."
- cd rust-g
- git fetch
- ~/.cargo/bin/rustup target add i686-unknown-linux-gnu
-fi
-
-#Compile and move rust-g binary to repo root
-echo "Deploying rust-g..."
-git checkout "$RUST_G_VERSION"
-env PKG_CONFIG_ALLOW_CROSS=1 ~/.cargo/bin/cargo build --release --target=i686-unknown-linux-gnu
-mv target/i686-unknown-linux-gnu/release/librust_g.so ../../../../librust_g.so
-cd ..
-
-#Download/update auxmos repo
-if [ ! -d "auxmos" ]; then
- echo "Cloning auxmos..."
- git clone https://github.com/Putnam3145/auxmos
- cd auxmos
- ~/.cargo/bin/rustup target add i686-unknown-linux-gnu
-else
- echo "Fetching auxmos..."
- cd auxmos
- git fetch
- ~/.cargo/bin/rustup target add i686-unknown-linux-gnu
-fi
-
-#Compile and move auxmos binary to repo root
-echo "Deploying auxmos..."
-git checkout "$AUXMOS_VERSION"
-env PKG_CONFIG_ALLOW_CROSS=1 ~/.cargo/bin/cargo rustc --release --target=i686-unknown-linux-gnu --features all_reaction_hooks,explosive_decompression -- -C target-cpu=native
-mv target/i686-unknown-linux-gnu/release/libauxmos.so ../../../../libauxmos.so
-cd ../..
-
-#Install BYOND
-cd ../..
-./tools/ci/install_byond.sh
-source $HOME/BYOND/byond/bin/byondsetup
-
-cd tools/build
-
-#Build TGUI
-set -e
-cd "$(dirname "$0")"
-exec ../bootstrap/node build.js "$@"
diff --git a/tools/build/cbt/fs.js b/tools/build/cbt/fs.js
deleted file mode 100644
index 68a5a8bfbf..0000000000
--- a/tools/build/cbt/fs.js
+++ /dev/null
@@ -1,135 +0,0 @@
-/**
- * @file
- * @copyright 2020 Aleksej Komarov
- * @license MIT
- */
-
-const fs = require('fs');
-const glob = require('./glob');
-
-class File {
- constructor(path) {
- this.path = path;
- }
-
- get stat() {
- if (this._stat === undefined) {
- this._stat = stat(this.path);
- }
- return this._stat;
- }
-
- exists() {
- return this.stat !== null;
- }
-
- get mtime() {
- return this.stat && this.stat.mtime;
- }
-
- touch() {
- const time = new Date();
- try {
- fs.utimesSync(this.path, time, time);
- }
- catch (err) {
- fs.closeSync(fs.openSync(this.path, 'w'));
- }
- }
-}
-
-class Glob {
- constructor(path) {
- this.path = path;
- }
-
- toFiles() {
- const paths = glob.sync(this.path, {
- strict: false,
- silent: true,
- });
- return paths
- .map(path => new File(path))
- .filter(file => file.exists());
- }
-}
-
-/**
- * If true, source is newer than target.
- * @param {File[]} sources
- * @param {File[]} targets
- */
-const compareFiles = (sources, targets) => {
- let bestSource = null;
- let bestTarget = null;
- for (const file of sources) {
- if (!bestSource || file.mtime > bestSource.mtime) {
- bestSource = file;
- }
- }
- for (const file of targets) {
- if (!file.exists()) {
- return `target '${file.path}' is missing`;
- }
- if (!bestTarget || file.mtime < bestTarget.mtime) {
- bestTarget = file;
- }
- }
- // Doesn't need rebuild if there is no source, but target exists.
- if (!bestSource) {
- if (bestTarget) {
- return false;
- }
- return 'no known sources or targets';
- }
- // Always needs a rebuild if no targets were specified (e.g. due to GLOB).
- if (!bestTarget) {
- return 'no targets were specified';
- }
- // Needs rebuild if source is newer than target
- if (bestSource.mtime > bestTarget.mtime) {
- return `source '${bestSource.path}' is newer than target '${bestTarget.path}'`;
- }
- return false;
-};
-
-/**
- * Returns file stats for the provided path, or null if file is
- * not accessible.
- */
-const stat = path => {
- try {
- return fs.statSync(path);
- }
- catch {
- return null;
- }
-};
-
-/**
- * Resolves a glob pattern and returns files that are safe
- * to call `stat` on.
- */
-const resolveGlob = globPath => {
- const unsafePaths = glob.sync(globPath, {
- strict: false,
- silent: true,
- });
- const safePaths = [];
- for (let path of unsafePaths) {
- try {
- fs.statSync(path);
- safePaths.push(path);
- }
- catch {}
- }
- return safePaths;
-};
-
-module.exports = {
- File,
- Glob,
- compareFiles,
- stat,
- resolveGlob,
-};
diff --git a/tools/build/cbt/glob.js b/tools/build/cbt/glob.js
deleted file mode 100644
index df6e153b38..0000000000
--- a/tools/build/cbt/glob.js
+++ /dev/null
@@ -1,3281 +0,0 @@
-'use strict';
-
-var fs = require('fs');
-var path$1 = require('path');
-var util = require('util');
-var events = require('events');
-var assert = require('assert');
-
-function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
-
-var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
-var path__default = /*#__PURE__*/_interopDefaultLegacy(path$1);
-var util__default = /*#__PURE__*/_interopDefaultLegacy(util);
-var events__default = /*#__PURE__*/_interopDefaultLegacy(events);
-var assert__default = /*#__PURE__*/_interopDefaultLegacy(assert);
-
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-var isWindows = process.platform === 'win32';
-
-
-// JavaScript implementation of realpath, ported from node pre-v6
-
-var DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG);
-
-function rethrow() {
- // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and
- // is fairly slow to generate.
- var callback;
- if (DEBUG) {
- var backtrace = new Error;
- callback = debugCallback;
- } else
- callback = missingCallback;
-
- return callback;
-
- function debugCallback(err) {
- if (err) {
- backtrace.message = err.message;
- err = backtrace;
- missingCallback(err);
- }
- }
-
- function missingCallback(err) {
- if (err) {
- if (process.throwDeprecation)
- throw err; // Forgot a callback but don't know where? Use NODE_DEBUG=fs
- else if (!process.noDeprecation) {
- var msg = 'fs: missing callback ' + (err.stack || err.message);
- if (process.traceDeprecation)
- console.trace(msg);
- else
- console.error(msg);
- }
- }
- }
-}
-
-function maybeCallback(cb) {
- return typeof cb === 'function' ? cb : rethrow();
-}
-
-var normalize = path__default['default'].normalize;
-
-// Regexp that finds the next partion of a (partial) path
-// result is [base_with_slash, base], e.g. ['somedir/', 'somedir']
-if (isWindows) {
- var nextPartRe = /(.*?)(?:[\/\\]+|$)/g;
-} else {
- var nextPartRe = /(.*?)(?:[\/]+|$)/g;
-}
-
-// Regex to find the device root, including trailing slash. E.g. 'c:\\'.
-if (isWindows) {
- var splitRootRe = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/;
-} else {
- var splitRootRe = /^[\/]*/;
-}
-
-var realpathSync = function realpathSync(p, cache) {
- // make p is absolute
- p = path__default['default'].resolve(p);
-
- if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {
- return cache[p];
- }
-
- var original = p,
- seenLinks = {},
- knownHard = {};
-
- // current character position in p
- var pos;
- // the partial path so far, including a trailing slash if any
- var current;
- // the partial path without a trailing slash (except when pointing at a root)
- var base;
- // the partial path scanned in the previous round, with slash
- var previous;
-
- start();
-
- function start() {
- // Skip over roots
- var m = splitRootRe.exec(p);
- pos = m[0].length;
- current = m[0];
- base = m[0];
- previous = '';
-
- // On windows, check that the root exists. On unix there is no need.
- if (isWindows && !knownHard[base]) {
- fs__default['default'].lstatSync(base);
- knownHard[base] = true;
- }
- }
-
- // walk down the path, swapping out linked pathparts for their real
- // values
- // NB: p.length changes.
- while (pos < p.length) {
- // find the next part
- nextPartRe.lastIndex = pos;
- var result = nextPartRe.exec(p);
- previous = current;
- current += result[0];
- base = previous + result[1];
- pos = nextPartRe.lastIndex;
-
- // continue if not a symlink
- if (knownHard[base] || (cache && cache[base] === base)) {
- continue;
- }
-
- var resolvedLink;
- if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {
- // some known symbolic link. no need to stat again.
- resolvedLink = cache[base];
- } else {
- var stat = fs__default['default'].lstatSync(base);
- if (!stat.isSymbolicLink()) {
- knownHard[base] = true;
- if (cache) cache[base] = base;
- continue;
- }
-
- // read the link if it wasn't read before
- // dev/ino always return 0 on windows, so skip the check.
- var linkTarget = null;
- if (!isWindows) {
- var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);
- if (seenLinks.hasOwnProperty(id)) {
- linkTarget = seenLinks[id];
- }
- }
- if (linkTarget === null) {
- fs__default['default'].statSync(base);
- linkTarget = fs__default['default'].readlinkSync(base);
- }
- resolvedLink = path__default['default'].resolve(previous, linkTarget);
- // track this, if given a cache.
- if (cache) cache[base] = resolvedLink;
- if (!isWindows) seenLinks[id] = linkTarget;
- }
-
- // resolve the link, then start over
- p = path__default['default'].resolve(resolvedLink, p.slice(pos));
- start();
- }
-
- if (cache) cache[original] = p;
-
- return p;
-};
-
-
-var realpath = function realpath(p, cache, cb) {
- if (typeof cb !== 'function') {
- cb = maybeCallback(cache);
- cache = null;
- }
-
- // make p is absolute
- p = path__default['default'].resolve(p);
-
- if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {
- return process.nextTick(cb.bind(null, null, cache[p]));
- }
-
- var original = p,
- seenLinks = {},
- knownHard = {};
-
- // current character position in p
- var pos;
- // the partial path so far, including a trailing slash if any
- var current;
- // the partial path without a trailing slash (except when pointing at a root)
- var base;
- // the partial path scanned in the previous round, with slash
- var previous;
-
- start();
-
- function start() {
- // Skip over roots
- var m = splitRootRe.exec(p);
- pos = m[0].length;
- current = m[0];
- base = m[0];
- previous = '';
-
- // On windows, check that the root exists. On unix there is no need.
- if (isWindows && !knownHard[base]) {
- fs__default['default'].lstat(base, function(err) {
- if (err) return cb(err);
- knownHard[base] = true;
- LOOP();
- });
- } else {
- process.nextTick(LOOP);
- }
- }
-
- // walk down the path, swapping out linked pathparts for their real
- // values
- function LOOP() {
- // stop if scanned past end of path
- if (pos >= p.length) {
- if (cache) cache[original] = p;
- return cb(null, p);
- }
-
- // find the next part
- nextPartRe.lastIndex = pos;
- var result = nextPartRe.exec(p);
- previous = current;
- current += result[0];
- base = previous + result[1];
- pos = nextPartRe.lastIndex;
-
- // continue if not a symlink
- if (knownHard[base] || (cache && cache[base] === base)) {
- return process.nextTick(LOOP);
- }
-
- if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {
- // known symbolic link. no need to stat again.
- return gotResolvedLink(cache[base]);
- }
-
- return fs__default['default'].lstat(base, gotStat);
- }
-
- function gotStat(err, stat) {
- if (err) return cb(err);
-
- // if not a symlink, skip to the next path part
- if (!stat.isSymbolicLink()) {
- knownHard[base] = true;
- if (cache) cache[base] = base;
- return process.nextTick(LOOP);
- }
-
- // stat & read the link if not read before
- // call gotTarget as soon as the link target is known
- // dev/ino always return 0 on windows, so skip the check.
- if (!isWindows) {
- var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);
- if (seenLinks.hasOwnProperty(id)) {
- return gotTarget(null, seenLinks[id], base);
- }
- }
- fs__default['default'].stat(base, function(err) {
- if (err) return cb(err);
-
- fs__default['default'].readlink(base, function(err, target) {
- if (!isWindows) seenLinks[id] = target;
- gotTarget(err, target);
- });
- });
- }
-
- function gotTarget(err, target, base) {
- if (err) return cb(err);
-
- var resolvedLink = path__default['default'].resolve(previous, target);
- if (cache) cache[base] = resolvedLink;
- gotResolvedLink(resolvedLink);
- }
-
- function gotResolvedLink(resolvedLink) {
- // resolve the link, then start over
- p = path__default['default'].resolve(resolvedLink, p.slice(pos));
- start();
- }
-};
-
-var old = {
- realpathSync: realpathSync,
- realpath: realpath
-};
-
-var fs_realpath = realpath$1;
-realpath$1.realpath = realpath$1;
-realpath$1.sync = realpathSync$1;
-realpath$1.realpathSync = realpathSync$1;
-realpath$1.monkeypatch = monkeypatch;
-realpath$1.unmonkeypatch = unmonkeypatch;
-
-
-var origRealpath = fs__default['default'].realpath;
-var origRealpathSync = fs__default['default'].realpathSync;
-
-var version = process.version;
-var ok = /^v[0-5]\./.test(version);
-
-
-function newError (er) {
- return er && er.syscall === 'realpath' && (
- er.code === 'ELOOP' ||
- er.code === 'ENOMEM' ||
- er.code === 'ENAMETOOLONG'
- )
-}
-
-function realpath$1 (p, cache, cb) {
- if (ok) {
- return origRealpath(p, cache, cb)
- }
-
- if (typeof cache === 'function') {
- cb = cache;
- cache = null;
- }
- origRealpath(p, cache, function (er, result) {
- if (newError(er)) {
- old.realpath(p, cache, cb);
- } else {
- cb(er, result);
- }
- });
-}
-
-function realpathSync$1 (p, cache) {
- if (ok) {
- return origRealpathSync(p, cache)
- }
-
- try {
- return origRealpathSync(p, cache)
- } catch (er) {
- if (newError(er)) {
- return old.realpathSync(p, cache)
- } else {
- throw er
- }
- }
-}
-
-function monkeypatch () {
- fs__default['default'].realpath = realpath$1;
- fs__default['default'].realpathSync = realpathSync$1;
-}
-
-function unmonkeypatch () {
- fs__default['default'].realpath = origRealpath;
- fs__default['default'].realpathSync = origRealpathSync;
-}
-
-var concatMap = function (xs, fn) {
- var res = [];
- for (var i = 0; i < xs.length; i++) {
- var x = fn(xs[i], i);
- if (isArray(x)) res.push.apply(res, x);
- else res.push(x);
- }
- return res;
-};
-
-var isArray = Array.isArray || function (xs) {
- return Object.prototype.toString.call(xs) === '[object Array]';
-};
-
-var balancedMatch = balanced;
-function balanced(a, b, str) {
- if (a instanceof RegExp) a = maybeMatch(a, str);
- if (b instanceof RegExp) b = maybeMatch(b, str);
-
- var r = range(a, b, str);
-
- return r && {
- start: r[0],
- end: r[1],
- pre: str.slice(0, r[0]),
- body: str.slice(r[0] + a.length, r[1]),
- post: str.slice(r[1] + b.length)
- };
-}
-
-function maybeMatch(reg, str) {
- var m = str.match(reg);
- return m ? m[0] : null;
-}
-
-balanced.range = range;
-function range(a, b, str) {
- var begs, beg, left, right, result;
- var ai = str.indexOf(a);
- var bi = str.indexOf(b, ai + 1);
- var i = ai;
-
- if (ai >= 0 && bi > 0) {
- begs = [];
- left = str.length;
-
- while (i >= 0 && !result) {
- if (i == ai) {
- begs.push(i);
- ai = str.indexOf(a, i + 1);
- } else if (begs.length == 1) {
- result = [ begs.pop(), bi ];
- } else {
- beg = begs.pop();
- if (beg < left) {
- left = beg;
- right = bi;
- }
-
- bi = str.indexOf(b, i + 1);
- }
-
- i = ai < bi && ai >= 0 ? ai : bi;
- }
-
- if (begs.length) {
- result = [ left, right ];
- }
- }
-
- return result;
-}
-
-var braceExpansion = expandTop;
-
-var escSlash = '\0SLASH'+Math.random()+'\0';
-var escOpen = '\0OPEN'+Math.random()+'\0';
-var escClose = '\0CLOSE'+Math.random()+'\0';
-var escComma = '\0COMMA'+Math.random()+'\0';
-var escPeriod = '\0PERIOD'+Math.random()+'\0';
-
-function numeric(str) {
- return parseInt(str, 10) == str
- ? parseInt(str, 10)
- : str.charCodeAt(0);
-}
-
-function escapeBraces(str) {
- return str.split('\\\\').join(escSlash)
- .split('\\{').join(escOpen)
- .split('\\}').join(escClose)
- .split('\\,').join(escComma)
- .split('\\.').join(escPeriod);
-}
-
-function unescapeBraces(str) {
- return str.split(escSlash).join('\\')
- .split(escOpen).join('{')
- .split(escClose).join('}')
- .split(escComma).join(',')
- .split(escPeriod).join('.');
-}
-
-
-// Basically just str.split(","), but handling cases
-// where we have nested braced sections, which should be
-// treated as individual members, like {a,{b,c},d}
-function parseCommaParts(str) {
- if (!str)
- return [''];
-
- var parts = [];
- var m = balancedMatch('{', '}', str);
-
- if (!m)
- return str.split(',');
-
- var pre = m.pre;
- var body = m.body;
- var post = m.post;
- var p = pre.split(',');
-
- p[p.length-1] += '{' + body + '}';
- var postParts = parseCommaParts(post);
- if (post.length) {
- p[p.length-1] += postParts.shift();
- p.push.apply(p, postParts);
- }
-
- parts.push.apply(parts, p);
-
- return parts;
-}
-
-function expandTop(str) {
- if (!str)
- return [];
-
- // I don't know why Bash 4.3 does this, but it does.
- // Anything starting with {} will have the first two bytes preserved
- // but *only* at the top level, so {},a}b will not expand to anything,
- // but a{},b}c will be expanded to [a}c,abc].
- // One could argue that this is a bug in Bash, but since the goal of
- // this module is to match Bash's rules, we escape a leading {}
- if (str.substr(0, 2) === '{}') {
- str = '\\{\\}' + str.substr(2);
- }
-
- return expand(escapeBraces(str), true).map(unescapeBraces);
-}
-
-function embrace(str) {
- return '{' + str + '}';
-}
-function isPadded(el) {
- return /^-?0\d/.test(el);
-}
-
-function lte(i, y) {
- return i <= y;
-}
-function gte(i, y) {
- return i >= y;
-}
-
-function expand(str, isTop) {
- var expansions = [];
-
- var m = balancedMatch('{', '}', str);
- if (!m || /\$$/.test(m.pre)) return [str];
-
- var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
- var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
- var isSequence = isNumericSequence || isAlphaSequence;
- var isOptions = m.body.indexOf(',') >= 0;
- if (!isSequence && !isOptions) {
- // {a},b}
- if (m.post.match(/,.*\}/)) {
- str = m.pre + '{' + m.body + escClose + m.post;
- return expand(str);
- }
- return [str];
- }
-
- var n;
- if (isSequence) {
- n = m.body.split(/\.\./);
- } else {
- n = parseCommaParts(m.body);
- if (n.length === 1) {
- // x{{a,b}}y ==> x{a}y x{b}y
- n = expand(n[0], false).map(embrace);
- if (n.length === 1) {
- var post = m.post.length
- ? expand(m.post, false)
- : [''];
- return post.map(function(p) {
- return m.pre + n[0] + p;
- });
- }
- }
- }
-
- // at this point, n is the parts, and we know it's not a comma set
- // with a single entry.
-
- // no need to expand pre, since it is guaranteed to be free of brace-sets
- var pre = m.pre;
- var post = m.post.length
- ? expand(m.post, false)
- : [''];
-
- var N;
-
- if (isSequence) {
- var x = numeric(n[0]);
- var y = numeric(n[1]);
- var width = Math.max(n[0].length, n[1].length);
- var incr = n.length == 3
- ? Math.abs(numeric(n[2]))
- : 1;
- var test = lte;
- var reverse = y < x;
- if (reverse) {
- incr *= -1;
- test = gte;
- }
- var pad = n.some(isPadded);
-
- N = [];
-
- for (var i = x; test(i, y); i += incr) {
- var c;
- if (isAlphaSequence) {
- c = String.fromCharCode(i);
- if (c === '\\')
- c = '';
- } else {
- c = String(i);
- if (pad) {
- var need = width - c.length;
- if (need > 0) {
- var z = new Array(need + 1).join('0');
- if (i < 0)
- c = '-' + z + c.slice(1);
- else
- c = z + c;
- }
- }
- }
- N.push(c);
- }
- } else {
- N = concatMap(n, function(el) { return expand(el, false) });
- }
-
- for (var j = 0; j < N.length; j++) {
- for (var k = 0; k < post.length; k++) {
- var expansion = pre + N[j] + post[k];
- if (!isTop || isSequence || expansion)
- expansions.push(expansion);
- }
- }
-
- return expansions;
-}
-
-var minimatch_1 = minimatch;
-minimatch.Minimatch = Minimatch;
-
-var path = { sep: '/' };
-try {
- path = path__default['default'];
-} catch (er) {}
-
-var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {};
-
-
-var plTypes = {
- '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
- '?': { open: '(?:', close: ')?' },
- '+': { open: '(?:', close: ')+' },
- '*': { open: '(?:', close: ')*' },
- '@': { open: '(?:', close: ')' }
-};
-
-// any single thing other than /
-// don't need to escape / when using new RegExp()
-var qmark = '[^/]';
-
-// * => any number of characters
-var star = qmark + '*?';
-
-// ** when dots are allowed. Anything goes, except .. and .
-// not (^ or / followed by one or two dots followed by $ or /),
-// followed by anything, any number of times.
-var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?';
-
-// not a ^ or / followed by a dot,
-// followed by anything, any number of times.
-var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?';
-
-// characters that need to be escaped in RegExp.
-var reSpecials = charSet('().*{}+?[]^$\\!');
-
-// "abc" -> { a:true, b:true, c:true }
-function charSet (s) {
- return s.split('').reduce(function (set, c) {
- set[c] = true;
- return set
- }, {})
-}
-
-// normalizes slashes.
-var slashSplit = /\/+/;
-
-minimatch.filter = filter;
-function filter (pattern, options) {
- options = options || {};
- return function (p, i, list) {
- return minimatch(p, pattern, options)
- }
-}
-
-function ext (a, b) {
- a = a || {};
- b = b || {};
- var t = {};
- Object.keys(b).forEach(function (k) {
- t[k] = b[k];
- });
- Object.keys(a).forEach(function (k) {
- t[k] = a[k];
- });
- return t
-}
-
-minimatch.defaults = function (def) {
- if (!def || !Object.keys(def).length) return minimatch
-
- var orig = minimatch;
-
- var m = function minimatch (p, pattern, options) {
- return orig.minimatch(p, pattern, ext(def, options))
- };
-
- m.Minimatch = function Minimatch (pattern, options) {
- return new orig.Minimatch(pattern, ext(def, options))
- };
-
- return m
-};
-
-Minimatch.defaults = function (def) {
- if (!def || !Object.keys(def).length) return Minimatch
- return minimatch.defaults(def).Minimatch
-};
-
-function minimatch (p, pattern, options) {
- if (typeof pattern !== 'string') {
- throw new TypeError('glob pattern string required')
- }
-
- if (!options) options = {};
-
- // shortcut: comments match nothing.
- if (!options.nocomment && pattern.charAt(0) === '#') {
- return false
- }
-
- // "" only matches ""
- if (pattern.trim() === '') return p === ''
-
- return new Minimatch(pattern, options).match(p)
-}
-
-function Minimatch (pattern, options) {
- if (!(this instanceof Minimatch)) {
- return new Minimatch(pattern, options)
- }
-
- if (typeof pattern !== 'string') {
- throw new TypeError('glob pattern string required')
- }
-
- if (!options) options = {};
- pattern = pattern.trim();
-
- // windows support: need to use /, not \
- if (path.sep !== '/') {
- pattern = pattern.split(path.sep).join('/');
- }
-
- this.options = options;
- this.set = [];
- this.pattern = pattern;
- this.regexp = null;
- this.negate = false;
- this.comment = false;
- this.empty = false;
-
- // make the set of regexps etc.
- this.make();
-}
-
-Minimatch.prototype.debug = function () {};
-
-Minimatch.prototype.make = make;
-function make () {
- // don't do it more than once.
- if (this._made) return
-
- var pattern = this.pattern;
- var options = this.options;
-
- // empty patterns and comments match nothing.
- if (!options.nocomment && pattern.charAt(0) === '#') {
- this.comment = true;
- return
- }
- if (!pattern) {
- this.empty = true;
- return
- }
-
- // step 1: figure out negation, etc.
- this.parseNegate();
-
- // step 2: expand braces
- var set = this.globSet = this.braceExpand();
-
- if (options.debug) this.debug = console.error;
-
- this.debug(this.pattern, set);
-
- // step 3: now we have a set, so turn each one into a series of path-portion
- // matching patterns.
- // These will be regexps, except in the case of "**", which is
- // set to the GLOBSTAR object for globstar behavior,
- // and will not contain any / characters
- set = this.globParts = set.map(function (s) {
- return s.split(slashSplit)
- });
-
- this.debug(this.pattern, set);
-
- // glob --> regexps
- set = set.map(function (s, si, set) {
- return s.map(this.parse, this)
- }, this);
-
- this.debug(this.pattern, set);
-
- // filter out everything that didn't compile properly.
- set = set.filter(function (s) {
- return s.indexOf(false) === -1
- });
-
- this.debug(this.pattern, set);
-
- this.set = set;
-}
-
-Minimatch.prototype.parseNegate = parseNegate;
-function parseNegate () {
- var pattern = this.pattern;
- var negate = false;
- var options = this.options;
- var negateOffset = 0;
-
- if (options.nonegate) return
-
- for (var i = 0, l = pattern.length
- ; i < l && pattern.charAt(i) === '!'
- ; i++) {
- negate = !negate;
- negateOffset++;
- }
-
- if (negateOffset) this.pattern = pattern.substr(negateOffset);
- this.negate = negate;
-}
-
-// Brace expansion:
-// a{b,c}d -> abd acd
-// a{b,}c -> abc ac
-// a{0..3}d -> a0d a1d a2d a3d
-// a{b,c{d,e}f}g -> abg acdfg acefg
-// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
-//
-// Invalid sets are not expanded.
-// a{2..}b -> a{2..}b
-// a{b}c -> a{b}c
-minimatch.braceExpand = function (pattern, options) {
- return braceExpand(pattern, options)
-};
-
-Minimatch.prototype.braceExpand = braceExpand;
-
-function braceExpand (pattern, options) {
- if (!options) {
- if (this instanceof Minimatch) {
- options = this.options;
- } else {
- options = {};
- }
- }
-
- pattern = typeof pattern === 'undefined'
- ? this.pattern : pattern;
-
- if (typeof pattern === 'undefined') {
- throw new TypeError('undefined pattern')
- }
-
- if (options.nobrace ||
- !pattern.match(/\{.*\}/)) {
- // shortcut. no need to expand.
- return [pattern]
- }
-
- return braceExpansion(pattern)
-}
-
-// parse a component of the expanded set.
-// At this point, no pattern may contain "/" in it
-// so we're going to return a 2d array, where each entry is the full
-// pattern, split on '/', and then turned into a regular expression.
-// A regexp is made at the end which joins each array with an
-// escaped /, and another full one which joins each regexp with |.
-//
-// Following the lead of Bash 4.1, note that "**" only has special meaning
-// when it is the *only* thing in a path portion. Otherwise, any series
-// of * is equivalent to a single *. Globstar behavior is enabled by
-// default, and can be disabled by setting options.noglobstar.
-Minimatch.prototype.parse = parse;
-var SUBPARSE = {};
-function parse (pattern, isSub) {
- if (pattern.length > 1024 * 64) {
- throw new TypeError('pattern is too long')
- }
-
- var options = this.options;
-
- // shortcuts
- if (!options.noglobstar && pattern === '**') return GLOBSTAR
- if (pattern === '') return ''
-
- var re = '';
- var hasMagic = !!options.nocase;
- var escaping = false;
- // ? => one single character
- var patternListStack = [];
- var negativeLists = [];
- var stateChar;
- var inClass = false;
- var reClassStart = -1;
- var classStart = -1;
- // . and .. never match anything that doesn't start with .,
- // even when options.dot is set.
- var patternStart = pattern.charAt(0) === '.' ? '' // anything
- // not (start or / followed by . or .. followed by / or end)
- : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
- : '(?!\\.)';
- var self = this;
-
- function clearStateChar () {
- if (stateChar) {
- // we had some state-tracking character
- // that wasn't consumed by this pass.
- switch (stateChar) {
- case '*':
- re += star;
- hasMagic = true;
- break
- case '?':
- re += qmark;
- hasMagic = true;
- break
- default:
- re += '\\' + stateChar;
- break
- }
- self.debug('clearStateChar %j %j', stateChar, re);
- stateChar = false;
- }
- }
-
- for (var i = 0, len = pattern.length, c
- ; (i < len) && (c = pattern.charAt(i))
- ; i++) {
- this.debug('%s\t%s %s %j', pattern, i, re, c);
-
- // skip over any that are escaped.
- if (escaping && reSpecials[c]) {
- re += '\\' + c;
- escaping = false;
- continue
- }
-
- switch (c) {
- case '/':
- // completely not allowed, even escaped.
- // Should already be path-split by now.
- return false
-
- case '\\':
- clearStateChar();
- escaping = true;
- continue
-
- // the various stateChar values
- // for the "extglob" stuff.
- case '?':
- case '*':
- case '+':
- case '@':
- case '!':
- this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c);
-
- // all of those are literals inside a class, except that
- // the glob [!a] means [^a] in regexp
- if (inClass) {
- this.debug(' in class');
- if (c === '!' && i === classStart + 1) c = '^';
- re += c;
- continue
- }
-
- // if we already have a stateChar, then it means
- // that there was something like ** or +? in there.
- // Handle the stateChar, then proceed with this one.
- self.debug('call clearStateChar %j', stateChar);
- clearStateChar();
- stateChar = c;
- // if extglob is disabled, then +(asdf|foo) isn't a thing.
- // just clear the statechar *now*, rather than even diving into
- // the patternList stuff.
- if (options.noext) clearStateChar();
- continue
-
- case '(':
- if (inClass) {
- re += '(';
- continue
- }
-
- if (!stateChar) {
- re += '\\(';
- continue
- }
-
- patternListStack.push({
- type: stateChar,
- start: i - 1,
- reStart: re.length,
- open: plTypes[stateChar].open,
- close: plTypes[stateChar].close
- });
- // negation is (?:(?!js)[^/]*)
- re += stateChar === '!' ? '(?:(?!(?:' : '(?:';
- this.debug('plType %j %j', stateChar, re);
- stateChar = false;
- continue
-
- case ')':
- if (inClass || !patternListStack.length) {
- re += '\\)';
- continue
- }
-
- clearStateChar();
- hasMagic = true;
- var pl = patternListStack.pop();
- // negation is (?:(?!js)[^/]*)
- // The others are (?:18 September 2021+kiwedespars updated:+
17 September 2021+DeltaFire15 updated:+
14 September 2021+Hatterhat updated:+
LetterN updated:+
Putnam3145 updated:+
keronshb updated:+
zeroisthebiggay updated:+
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:+
Putnam3145 updated:+
keronshb updated:+
zeroisthebiggay updated:+
26 August 2021+keronshb updated:+
24 August 2021+BlueWildrose updated:+
23 August 2021+zeroisthebiggay updated:+
22 August 2021+zeroisthebiggay updated:+
20 August 2021EmeraldSundisk updated:
18 July 2021-timothyteakettle updated:-
17 July 2021-cadyn updated:-
15 July 2021-Putnam3145 updated:-
14 July 2021-Putnam3145 updated:-
13 July 2021-MrJWhit updated:-
12 July 2021-Putnam3145 updated:-
11 July 2021-shellspeed1 updated:-
10 July 2021-WanderingFox95 updated:-
09 July 2021-MrJWhit updated:-
07 July 2021-DeltaFire15 updated:-
05 July 2021-Putnam3145 updated:-
WanderingFox95 updated:-
zeroisthebiggay updated:-
04 July 2021-cadyn updated:-
03 July 2021-DeltaFire15 updated:-
Putnam3145 updated:-
WanderingFox95 updated:-
02 July 2021-silicons updated:-
30 June 2021-WanderingFox95 updated:-
bunny232 updated:-
qweq12yt updated:-
shellspeed1 updated:-
28 June 2021-Putnam3145 updated:-
WanderingFox95 updated:-
25 June 2021-MrJWhit updated:-
brokenOculus updated:-
24 June 2021-WanderingFox95 updated:-
23 June 2021-DeltaFire15 updated:-
Putnam3145 updated:-
22 June 2021-bunny232 updated:-
silicons updated:-
21 June 2021-silicons updated:-
timothyteakettle updated:-
20 June 2021-Arturlang updated:-
EmeraldSundisk updated:-
Nanotrasen Structual Engineering Division updated:-
bunny232 updated:-
keronshb updated:-
kiwedespars updated:-
zeroisthebiggay updated:-
19 June 2021-keronshb updated:-
|